From 77bbe5baec7610d8b19fa3dbc63a07479992cb36 Mon Sep 17 00:00:00 2001 From: DrKLO Date: Thu, 28 Jan 2021 17:15:51 +0300 Subject: [PATCH] Update to 7.4.0 (2221) --- TMessagesProj/build.gradle | 6 +- .../org_telegram_messenger_voip_Instance.cpp | 22 + .../jni/voip/tgcalls/MediaManager.cpp | 99 +- TMessagesProj/jni/voip/tgcalls/MediaManager.h | 2 + .../voip/tgcalls/group/GroupInstanceImpl.cpp | 52 +- .../voip/tgcalls/group/GroupInstanceImpl.h | 2 + .../tgcalls/legacy/InstanceImplLegacy.cpp | 4 +- TMessagesProj/src/main/AndroidManifest.xml | 43 + .../widget/LinearLayoutManager.java | 3 - .../com/google/zxing/qrcode/QRCodeWriter.java | 16 +- .../telegram/messenger/AndroidUtilities.java | 28 + .../org/telegram/messenger/BuildVars.java | 4 +- .../org/telegram/messenger/ChatObject.java | 54 +- .../messenger/FeedWidgetProvider.java | 59 + .../telegram/messenger/FeedWidgetService.java | 169 ++ .../telegram/messenger/FileLoadOperation.java | 2 + .../org/telegram/messenger/FileLoader.java | 19 +- .../messenger/FileUploadOperation.java | 10 +- .../org/telegram/messenger/ImageLoader.java | 28 +- .../telegram/messenger/ImportingService.java | 90 + .../telegram/messenger/LocaleController.java | 11 + .../messenger/LocationController.java | 2 +- .../telegram/messenger/MediaController.java | 146 +- .../messenger/MediaDataController.java | 4 + .../org/telegram/messenger/MessageObject.java | 6 +- .../messenger/MessagesController.java | 373 +++-- .../telegram/messenger/MessagesStorage.java | 215 ++- .../messenger/NotificationCenter.java | 3 + .../messenger/NotificationsController.java | 348 ++-- .../telegram/messenger/SecretChatHelper.java | 16 +- .../messenger/SendMessagesHelper.java | 304 +++- .../messenger/ShortcutWidgetProvider.java | 62 + .../messenger/ShortcutWidgetService.java | 353 ++++ .../org/telegram/messenger/voip/Instance.java | 4 +- .../messenger/voip/NativeInstance.java | 6 +- .../messenger/voip/VoIPBaseService.java | 29 +- .../telegram/messenger/voip/VoIPService.java | 31 +- .../main/java/org/telegram/tgnet/TLRPC.java | 1252 +++++++++++++- .../telegram/ui/ActionBar/ActionBarMenu.java | 8 +- .../ui/ActionBar/ActionBarMenuItem.java | 23 +- .../ui/ActionBar/ActionBarMenuSubItem.java | 42 +- .../telegram/ui/ActionBar/BottomSheet.java | 18 +- .../ui/ActionBar/DrawerLayoutContainer.java | 6 +- .../java/org/telegram/ui/ActionBar/Theme.java | 7 +- .../ui/ActionBar/ThemeDescription.java | 36 + .../telegram/ui/Adapters/DialogsAdapter.java | 304 +++- .../ui/Adapters/DialogsSearchAdapter.java | 17 +- .../ui/Adapters/MessagesSearchAdapter.java | 2 +- .../telegram/ui/Adapters/StickersAdapter.java | 112 +- .../ui/Adapters/StickersSearchAdapter.java | 43 +- .../java/org/telegram/ui/ArticleViewer.java | 8 +- .../java/org/telegram/ui/BubbleActivity.java | 4 + .../java/org/telegram/ui/CallLogActivity.java | 371 ++++- .../telegram/ui/Cells/AudioPlayerCell.java | 21 +- .../telegram/ui/Cells/ChatMessageCell.java | 194 ++- .../org/telegram/ui/Cells/DialogCell.java | 66 +- .../ui/Cells/FeaturedStickerSetInfoCell.java | 26 +- .../telegram/ui/Cells/GroupCallUserCell.java | 193 ++- .../org/telegram/ui/Cells/HintDialogCell.java | 65 +- .../telegram/ui/Cells/SharedAudioCell.java | 21 +- .../telegram/ui/Cells/SharedDocumentCell.java | 100 +- .../java/org/telegram/ui/Cells/TextCell.java | 7 +- .../ui/Cells/TextInfoPrivacyCell.java | 13 +- .../java/org/telegram/ui/Cells/UserCell.java | 5 + .../telegram/ui/ChannelCreateActivity.java | 105 +- .../java/org/telegram/ui/ChatActivity.java | 376 ++++- .../org/telegram/ui/ChatEditActivity.java | 55 +- .../org/telegram/ui/ChatEditTypeActivity.java | 171 +- .../org/telegram/ui/ChatUsersActivity.java | 614 +++++-- .../telegram/ui/Components/AlertsCreator.java | 351 +++- .../ui/Components/AudioPlayerAlert.java | 407 ++++- .../ui/Components/AvatarsImageView.java | 33 +- .../org/telegram/ui/Components/Bulletin.java | 129 +- .../ui/Components/BulletinFactory.java | 20 + .../ui/Components/ChatActivityEnterView.java | 52 +- .../ChatAttachAlertLocationLayout.java | 18 +- .../ChatAttachAlertPhotoLayout.java | 10 +- .../ui/Components/ChatAvatarContainer.java | 8 +- .../ui/Components/ChatGreetingsView.java | 31 +- .../ui/Components/ChecksHintView.java | 209 +++ .../telegram/ui/Components/CounterView.java | 311 ++++ .../ui/Components/CrossOutDrawable.java | 132 ++ .../ui/Components/DotDividerSpan.java | 35 + .../ui/Components/EditTextBoldCursor.java | 32 +- .../telegram/ui/Components/EditTextEmoji.java | 5 - .../ui/Components/EmbedBottomSheet.java | 9 + .../ui/Components/EmptyTextProgressView.java | 25 +- .../ui/Components/FilterTabsView.java | 1 + .../ui/Components/FlickerLoadingView.java | 167 +- .../ForegroundColorSpanThemable.java | 1 - .../ui/Components/FragmentContextView.java | 499 ++++-- .../FragmentContextViewWavesDrawable.java | 17 +- .../ui/Components/GroupVoipInviteAlert.java | 539 +----- .../ui/Components/GroupedPhotosListView.java | 2 +- .../telegram/ui/Components/ImageUpdater.java | 11 +- .../ui/Components/ImportingAlert.java | 255 +++ .../ui/Components/InstantCameraView.java | 2 +- .../ui/Components/InviteLinkBottomSheet.java | 710 ++++++++ .../Components/InviteMembersBottomSheet.java | 1229 ++++++++++++++ .../ui/Components/LineProgressView.java | 11 +- .../ui/Components/LinkActionView.java | 513 ++++++ .../ui/Components/LoadingStickerDrawable.java | 21 +- .../Components/PermanentLinkBottomSheet.java | 165 ++ .../ui/Components/QRCodeBottomSheet.java | 123 ++ .../ui/Components/RLottieDrawable.java | 2 +- .../telegram/ui/Components/ScamDrawable.java | 17 +- .../Components/ScrollSlidingTextTabStrip.java | 17 +- .../ui/Components/SearchViewPager.java | 17 + .../telegram/ui/Components/ShareAlert.java | 5 + .../ui/Components/SharedMediaLayout.java | 44 +- .../ui/Components/SlideChooseView.java | 5 +- .../Components/SubstringLayoutAnimator.java | 144 ++ .../org/telegram/ui/Components/UndoView.java | 115 +- .../ui/Components/UsersAlertBase.java | 624 +++++++ .../ui/Components/ViewPagerFixed.java | 10 +- .../ui/Components/voip/AcceptDeclineView.java | 16 + .../ui/Components/voip/VoIPToggleButton.java | 12 +- .../org/telegram/ui/ContactsActivity.java | 19 +- .../org/telegram/ui/DataSettingsActivity.java | 2 +- .../java/org/telegram/ui/DialogsActivity.java | 478 ++++-- .../telegram/ui/ExternalActionActivity.java | 15 +- .../telegram/ui/FeedWidgetConfigActivity.java | 72 + .../org/telegram/ui/FilteredSearchView.java | 8 +- .../org/telegram/ui/GroupCallActivity.java | 560 ++++++- .../org/telegram/ui/GroupCreateActivity.java | 35 +- .../telegram/ui/GroupCreateFinalActivity.java | 63 +- .../org/telegram/ui/GroupInviteActivity.java | 6 +- .../java/org/telegram/ui/LaunchActivity.java | 526 ++++-- .../org/telegram/ui/LinkEditActivity.java | 545 +++++++ .../java/org/telegram/ui/LoginActivity.java | 69 +- .../org/telegram/ui/ManageLinksActivity.java | 1448 +++++++++++++++++ .../java/org/telegram/ui/MediaActivity.java | 8 +- .../org/telegram/ui/PeopleNearbyActivity.java | 2 +- .../java/org/telegram/ui/PhotoViewer.java | 290 +++- .../java/org/telegram/ui/ProfileActivity.java | 300 ++-- .../org/telegram/ui/SecretMediaViewer.java | 6 +- .../org/telegram/ui/SessionsActivity.java | 2 +- .../ui/ShortcutWidgetConfigActivity.java | 70 + .../java/org/telegram/ui/ThemeActivity.java | 31 +- .../org/telegram/ui/ThemePreviewActivity.java | 12 +- .../java/org/telegram/ui/VoIPFragment.java | 22 +- .../webrtc/voiceengine/WebRtcAudioTrack.java | 1 - .../main/res/drawable-hdpi/actions_link.png | Bin 0 -> 983 bytes .../main/res/drawable-hdpi/arrow_newchat.png | Bin 0 -> 368 bytes .../main/res/drawable-hdpi/msg_background.png | Bin 0 -> 869 bytes .../res/drawable-hdpi/msg_copy_filled.png | Bin 0 -> 521 bytes .../res/drawable-hdpi/msg_delete_filled.png | Bin 0 -> 676 bytes .../src/main/res/drawable-hdpi/msg_link_1.png | Bin 0 -> 699 bytes .../src/main/res/drawable-hdpi/msg_link_2.png | Bin 0 -> 765 bytes .../main/res/drawable-hdpi/msg_maxvideo.png | Bin 0 -> 1480 bytes .../main/res/drawable-hdpi/msg_minvideo.png | Bin 0 -> 513 bytes .../src/main/res/drawable-hdpi/msg_qrcode.png | Bin 0 -> 878 bytes .../res/drawable-hdpi/msg_share_filled.png | Bin 0 -> 543 bytes .../main/res/drawable-hdpi/msg_voicechat2.png | Bin 0 -> 648 bytes .../res/drawable-hdpi/voice_volume_mini.png | Bin 0 -> 649 bytes .../res/drawable-hdpi/voice_volume_muted.png | Bin 0 -> 831 bytes .../drawable-hdpi/voice_volume_speaker.png | Bin 0 -> 679 bytes .../main/res/drawable-mdpi/actions_link.png | Bin 0 -> 719 bytes .../main/res/drawable-mdpi/arrow_newchat.png | Bin 0 -> 292 bytes .../main/res/drawable-mdpi/msg_background.png | Bin 0 -> 636 bytes .../res/drawable-mdpi/msg_copy_filled.png | Bin 0 -> 417 bytes .../res/drawable-mdpi/msg_delete_filled.png | Bin 0 -> 501 bytes .../src/main/res/drawable-mdpi/msg_link_1.png | Bin 0 -> 479 bytes .../src/main/res/drawable-mdpi/msg_link_2.png | Bin 0 -> 547 bytes .../main/res/drawable-mdpi/msg_maxvideo.png | Bin 0 -> 884 bytes .../main/res/drawable-mdpi/msg_minvideo.png | Bin 0 -> 348 bytes .../src/main/res/drawable-mdpi/msg_qrcode.png | Bin 0 -> 551 bytes .../res/drawable-mdpi/msg_share_filled.png | Bin 0 -> 427 bytes .../main/res/drawable-mdpi/msg_voicechat2.png | Bin 0 -> 484 bytes .../res/drawable-mdpi/voice_volume_mini.png | Bin 0 -> 450 bytes .../res/drawable-mdpi/voice_volume_muted.png | Bin 0 -> 595 bytes .../drawable-mdpi/voice_volume_speaker.png | Bin 0 -> 497 bytes .../main/res/drawable-xhdpi/actions_link.png | Bin 0 -> 1301 bytes .../main/res/drawable-xhdpi/arrow_newchat.png | Bin 0 -> 446 bytes .../res/drawable-xhdpi/msg_background.png | Bin 0 -> 1194 bytes .../res/drawable-xhdpi/msg_copy_filled.png | Bin 0 -> 638 bytes .../res/drawable-xhdpi/msg_delete_filled.png | Bin 0 -> 882 bytes .../main/res/drawable-xhdpi/msg_link_1.png | Bin 0 -> 893 bytes .../main/res/drawable-xhdpi/msg_link_2.png | Bin 0 -> 1030 bytes .../main/res/drawable-xhdpi/msg_maxvideo.png | Bin 0 -> 1884 bytes .../main/res/drawable-xhdpi/msg_minvideo.png | Bin 0 -> 582 bytes .../main/res/drawable-xhdpi/msg_qrcode.png | Bin 0 -> 1029 bytes .../res/drawable-xhdpi/msg_share_filled.png | Bin 0 -> 764 bytes .../res/drawable-xhdpi/msg_voicechat2.png | Bin 0 -> 842 bytes .../res/drawable-xhdpi/voice_volume_mini.png | Bin 0 -> 859 bytes .../res/drawable-xhdpi/voice_volume_muted.png | Bin 0 -> 1009 bytes .../drawable-xhdpi/voice_volume_speaker.png | Bin 0 -> 849 bytes .../main/res/drawable-xxhdpi/actions_link.png | Bin 0 -> 1968 bytes .../res/drawable-xxhdpi/arrow_newchat.png | Bin 0 -> 779 bytes .../res/drawable-xxhdpi/msg_background.png | Bin 0 -> 1647 bytes .../res/drawable-xxhdpi/msg_copy_filled.png | Bin 0 -> 926 bytes .../res/drawable-xxhdpi/msg_delete_filled.png | Bin 0 -> 1186 bytes .../main/res/drawable-xxhdpi/msg_link_1.png | Bin 0 -> 1361 bytes .../main/res/drawable-xxhdpi/msg_link_2.png | Bin 0 -> 1532 bytes .../main/res/drawable-xxhdpi/msg_maxvideo.png | Bin 0 -> 2951 bytes .../main/res/drawable-xxhdpi/msg_minvideo.png | Bin 0 -> 782 bytes .../main/res/drawable-xxhdpi/msg_qrcode.png | Bin 0 -> 1205 bytes .../res/drawable-xxhdpi/msg_share_filled.png | Bin 0 -> 1043 bytes .../res/drawable-xxhdpi/msg_voicechat2.png | Bin 0 -> 1116 bytes .../res/drawable-xxhdpi/voice_volume_mini.png | Bin 0 -> 1288 bytes .../drawable-xxhdpi/voice_volume_muted.png | Bin 0 -> 1472 bytes .../drawable-xxhdpi/voice_volume_speaker.png | Bin 0 -> 1190 bytes .../main/res/drawable/shortcut_preview.png | Bin 0 -> 165366 bytes .../src/main/res/layout/feed_widget_item.xml | 29 + .../main/res/layout/feed_widget_layout.xml | 25 + .../main/res/layout/shortcut_widget_item.xml | 88 + .../res/layout/shortcut_widget_layout.xml | 25 + .../src/main/res/raw/audio_speed.json | 1 + .../src/main/res/raw/audio_stop_speed.json | 1 + TMessagesProj/src/main/res/raw/camera.json | 1 + TMessagesProj/src/main/res/raw/copy.json | 1 + .../src/main/res/raw/download_arrow.json | 1 + TMessagesProj/src/main/res/raw/error.json | 1 + TMessagesProj/src/main/res/raw/forward.json | 1 + .../src/main/res/raw/import_check.json | 1 + .../src/main/res/raw/import_finish.tgs | 1 + .../src/main/res/raw/import_loop.tgs | 1 + .../src/main/res/raw/import_progress.json | 1 + TMessagesProj/src/main/res/raw/imported.json | 1 + .../src/main/res/raw/passcode_lock_close.json | 1 + .../src/main/res/raw/passcode_lock_open.json | 1 + TMessagesProj/src/main/res/raw/qr_logo.svg | 8 + .../src/main/res/raw/saved_messages.json | 1 + .../src/main/res/raw/shared_link_enter.json | 1 + .../src/main/res/raw/silent_mute.json | 1 + .../src/main/res/raw/silent_unmute.json | 1 + TMessagesProj/src/main/res/raw/speaker.json | 1 + .../src/main/res/raw/ticks_double.json | 1 + .../src/main/res/raw/ticks_single.json | 1 + TMessagesProj/src/main/res/values/strings.xml | 110 +- .../src/main/res/xml/feed_widget_info.xml | 12 + .../src/main/res/xml/shortcut_widget_info.xml | 13 + 232 files changed, 16265 insertions(+), 2677 deletions(-) create mode 100644 TMessagesProj/src/main/java/org/telegram/messenger/FeedWidgetProvider.java create mode 100644 TMessagesProj/src/main/java/org/telegram/messenger/FeedWidgetService.java create mode 100644 TMessagesProj/src/main/java/org/telegram/messenger/ImportingService.java create mode 100644 TMessagesProj/src/main/java/org/telegram/messenger/ShortcutWidgetProvider.java create mode 100644 TMessagesProj/src/main/java/org/telegram/messenger/ShortcutWidgetService.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Components/ChecksHintView.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Components/CounterView.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Components/CrossOutDrawable.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Components/DotDividerSpan.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Components/ImportingAlert.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Components/InviteLinkBottomSheet.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Components/InviteMembersBottomSheet.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Components/LinkActionView.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Components/PermanentLinkBottomSheet.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Components/QRCodeBottomSheet.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Components/SubstringLayoutAnimator.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Components/UsersAlertBase.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/FeedWidgetConfigActivity.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/LinkEditActivity.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/ManageLinksActivity.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/ShortcutWidgetConfigActivity.java create mode 100644 TMessagesProj/src/main/res/drawable-hdpi/actions_link.png create mode 100644 TMessagesProj/src/main/res/drawable-hdpi/arrow_newchat.png create mode 100644 TMessagesProj/src/main/res/drawable-hdpi/msg_background.png create mode 100644 TMessagesProj/src/main/res/drawable-hdpi/msg_copy_filled.png create mode 100644 TMessagesProj/src/main/res/drawable-hdpi/msg_delete_filled.png create mode 100644 TMessagesProj/src/main/res/drawable-hdpi/msg_link_1.png create mode 100644 TMessagesProj/src/main/res/drawable-hdpi/msg_link_2.png create mode 100644 TMessagesProj/src/main/res/drawable-hdpi/msg_maxvideo.png create mode 100644 TMessagesProj/src/main/res/drawable-hdpi/msg_minvideo.png create mode 100644 TMessagesProj/src/main/res/drawable-hdpi/msg_qrcode.png create mode 100644 TMessagesProj/src/main/res/drawable-hdpi/msg_share_filled.png create mode 100644 TMessagesProj/src/main/res/drawable-hdpi/msg_voicechat2.png create mode 100644 TMessagesProj/src/main/res/drawable-hdpi/voice_volume_mini.png create mode 100644 TMessagesProj/src/main/res/drawable-hdpi/voice_volume_muted.png create mode 100644 TMessagesProj/src/main/res/drawable-hdpi/voice_volume_speaker.png create mode 100644 TMessagesProj/src/main/res/drawable-mdpi/actions_link.png create mode 100644 TMessagesProj/src/main/res/drawable-mdpi/arrow_newchat.png create mode 100644 TMessagesProj/src/main/res/drawable-mdpi/msg_background.png create mode 100644 TMessagesProj/src/main/res/drawable-mdpi/msg_copy_filled.png create mode 100644 TMessagesProj/src/main/res/drawable-mdpi/msg_delete_filled.png create mode 100644 TMessagesProj/src/main/res/drawable-mdpi/msg_link_1.png create mode 100644 TMessagesProj/src/main/res/drawable-mdpi/msg_link_2.png create mode 100644 TMessagesProj/src/main/res/drawable-mdpi/msg_maxvideo.png create mode 100644 TMessagesProj/src/main/res/drawable-mdpi/msg_minvideo.png create mode 100644 TMessagesProj/src/main/res/drawable-mdpi/msg_qrcode.png create mode 100644 TMessagesProj/src/main/res/drawable-mdpi/msg_share_filled.png create mode 100644 TMessagesProj/src/main/res/drawable-mdpi/msg_voicechat2.png create mode 100644 TMessagesProj/src/main/res/drawable-mdpi/voice_volume_mini.png create mode 100644 TMessagesProj/src/main/res/drawable-mdpi/voice_volume_muted.png create mode 100644 TMessagesProj/src/main/res/drawable-mdpi/voice_volume_speaker.png create mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/actions_link.png create mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/arrow_newchat.png create mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/msg_background.png create mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/msg_copy_filled.png create mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/msg_delete_filled.png create mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/msg_link_1.png create mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/msg_link_2.png create mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/msg_maxvideo.png create mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/msg_minvideo.png create mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/msg_qrcode.png create mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/msg_share_filled.png create mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/msg_voicechat2.png create mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/voice_volume_mini.png create mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/voice_volume_muted.png create mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/voice_volume_speaker.png create mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/actions_link.png create mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/arrow_newchat.png create mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/msg_background.png create mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/msg_copy_filled.png create mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/msg_delete_filled.png create mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/msg_link_1.png create mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/msg_link_2.png create mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/msg_maxvideo.png create mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/msg_minvideo.png create mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/msg_qrcode.png create mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/msg_share_filled.png create mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/msg_voicechat2.png create mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/voice_volume_mini.png create mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/voice_volume_muted.png create mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/voice_volume_speaker.png create mode 100644 TMessagesProj/src/main/res/drawable/shortcut_preview.png create mode 100644 TMessagesProj/src/main/res/layout/feed_widget_item.xml create mode 100644 TMessagesProj/src/main/res/layout/feed_widget_layout.xml create mode 100644 TMessagesProj/src/main/res/layout/shortcut_widget_item.xml create mode 100644 TMessagesProj/src/main/res/layout/shortcut_widget_layout.xml create mode 100644 TMessagesProj/src/main/res/raw/audio_speed.json create mode 100644 TMessagesProj/src/main/res/raw/audio_stop_speed.json create mode 100644 TMessagesProj/src/main/res/raw/camera.json create mode 100644 TMessagesProj/src/main/res/raw/copy.json create mode 100644 TMessagesProj/src/main/res/raw/download_arrow.json create mode 100644 TMessagesProj/src/main/res/raw/error.json create mode 100644 TMessagesProj/src/main/res/raw/forward.json create mode 100644 TMessagesProj/src/main/res/raw/import_check.json create mode 100644 TMessagesProj/src/main/res/raw/import_finish.tgs create mode 100644 TMessagesProj/src/main/res/raw/import_loop.tgs create mode 100644 TMessagesProj/src/main/res/raw/import_progress.json create mode 100644 TMessagesProj/src/main/res/raw/imported.json create mode 100644 TMessagesProj/src/main/res/raw/passcode_lock_close.json create mode 100644 TMessagesProj/src/main/res/raw/passcode_lock_open.json create mode 100644 TMessagesProj/src/main/res/raw/qr_logo.svg create mode 100644 TMessagesProj/src/main/res/raw/saved_messages.json create mode 100644 TMessagesProj/src/main/res/raw/shared_link_enter.json create mode 100644 TMessagesProj/src/main/res/raw/silent_mute.json create mode 100644 TMessagesProj/src/main/res/raw/silent_unmute.json create mode 100644 TMessagesProj/src/main/res/raw/speaker.json create mode 100644 TMessagesProj/src/main/res/raw/ticks_double.json create mode 100644 TMessagesProj/src/main/res/raw/ticks_single.json create mode 100644 TMessagesProj/src/main/res/xml/feed_widget_info.xml create mode 100644 TMessagesProj/src/main/res/xml/shortcut_widget_info.xml diff --git a/TMessagesProj/build.gradle b/TMessagesProj/build.gradle index 59494161773..480718c3e24 100644 --- a/TMessagesProj/build.gradle +++ b/TMessagesProj/build.gradle @@ -21,7 +21,7 @@ dependencies { implementation 'androidx.exifinterface:exifinterface:1.3.2' implementation 'androidx.dynamicanimation:dynamicanimation:1.0.0' implementation 'androidx.multidex:multidex:2.0.1' - implementation "androidx.sharetarget:sharetarget:1.0.0" + implementation "androidx.sharetarget:sharetarget:1.1.0" compileOnly 'org.checkerframework:checker-qual:2.5.2' compileOnly 'org.checkerframework:checker-compat-qual:2.5.0' @@ -290,7 +290,7 @@ android { } } - defaultConfig.versionCode = 2206 + defaultConfig.versionCode = 2221 applicationVariants.all { variant -> variant.outputs.all { output -> @@ -309,7 +309,7 @@ android { defaultConfig { minSdkVersion 16 targetSdkVersion 29 - versionName "7.3.1" + versionName "7.4.0" vectorDrawables.generatedDensities = ['mdpi', 'hdpi', 'xhdpi', 'xxhdpi'] diff --git a/TMessagesProj/jni/voip/org_telegram_messenger_voip_Instance.cpp b/TMessagesProj/jni/voip/org_telegram_messenger_voip_Instance.cpp index f68cc0450b8..5a4f0aa3f37 100644 --- a/TMessagesProj/jni/voip/org_telegram_messenger_voip_Instance.cpp +++ b/TMessagesProj/jni/voip/org_telegram_messenger_voip_Instance.cpp @@ -426,6 +426,21 @@ JNIEXPORT jlong JNICALL Java_org_telegram_messenger_voip_NativeInstance_makeNati env->CallVoidMethod(globalRef, env->GetMethodID(NativeInstanceClass, "onSignalBarsUpdated", "(I)V"), count); }); }, + .audioLevelUpdated = [platformContext](float level) { + tgvoip::jni::DoWithJNI([platformContext, level](JNIEnv *env) { + jintArray intArray = nullptr; + jfloatArray floatArray = env->NewFloatArray(1); + jbooleanArray boolArray = nullptr; + + jfloat floatFill[1]; + floatFill[0] = level; + env->SetFloatArrayRegion(floatArray, 0, 1, floatFill); + + jobject globalRef = ((AndroidContext *) platformContext.get())->getJavaInstance(); + env->CallVoidMethod(globalRef, env->GetMethodID(NativeInstanceClass, "onAudioLevelsUpdated", "([I[F[Z)V"), intArray, floatArray, boolArray); + env->DeleteLocalRef(floatArray); + }); + }, .remoteMediaStateUpdated = [platformContext](AudioState audioState, VideoState videoState) { jobject globalRef = ((AndroidContext *) platformContext.get())->getJavaInstance(); tgvoip::jni::DoWithJNI([globalRef, audioState, videoState](JNIEnv *env) { @@ -521,6 +536,13 @@ JNIEXPORT void JNICALL Java_org_telegram_messenger_voip_NativeInstance_setMuteMi } } +JNIEXPORT void JNICALL Java_org_telegram_messenger_voip_NativeInstance_setVolume(JNIEnv *env, jobject obj, jint ssrc, jdouble volume) { + InstanceHolder *instance = getInstanceHolder(env, obj); + if (instance->groupNativeInstance != nullptr) { + instance->groupNativeInstance->setVolume(ssrc, volume); + } +} + JNIEXPORT void JNICALL Java_org_telegram_messenger_voip_NativeInstance_setAudioOutputGainControlEnabled(JNIEnv *env, jobject obj, jboolean enabled) { InstanceHolder *instance = getInstanceHolder(env, obj); if (instance->nativeInstance == nullptr) { diff --git a/TMessagesProj/jni/voip/tgcalls/MediaManager.cpp b/TMessagesProj/jni/voip/tgcalls/MediaManager.cpp index 64377fcbbdb..e0e540ec8c5 100644 --- a/TMessagesProj/jni/voip/tgcalls/MediaManager.cpp +++ b/TMessagesProj/jni/voip/tgcalls/MediaManager.cpp @@ -19,6 +19,7 @@ #include "modules/rtp_rtcp/source/rtp_utility.h" #include "api/call/audio_sink.h" #include "modules/audio_processing/audio_buffer.h" +#include "modules/audio_device/include/audio_device_factory.h" namespace tgcalls { namespace { @@ -45,6 +46,31 @@ VideoCaptureInterfaceObject *GetVideoCaptureAssumingSameThread(VideoCaptureInter : nullptr; } +class AudioCaptureAnalyzer : public webrtc::CustomAudioAnalyzer { +private: + void Initialize(int sample_rate_hz, int num_channels) override { + + } + // Analyzes the given capture or render signal. + void Analyze(const webrtc::AudioBuffer* audio) override { + _analyze(audio); + } + // Returns a string representation of the module state. + std::string ToString() const override { + return "analyzing"; + } + + std::function _analyze; + +public: + AudioCaptureAnalyzer(std::function analyze) : + _analyze(analyze) { + } + + virtual ~AudioCaptureAnalyzer() = default; +}; + + } // namespace class VideoSinkInterfaceProxyImpl : public rtc::VideoSinkInterface { @@ -87,7 +113,7 @@ class VideoSinkInterfaceProxyImpl : public rtc::VideoSinkInterface _update; - + int _peakCount = 0; uint16_t _peak = 0; @@ -103,7 +129,7 @@ class AudioTrackSinkInterfaceImpl: public webrtc::AudioSinkInterface { if (audio.channels == 1) { int16_t *samples = (int16_t *)audio.data; int numberOfSamplesInFrame = (int)audio.samples_per_channel; - + for (int i = 0; i < numberOfSamplesInFrame; i++) { int16_t sample = samples[i]; if (sample < 0) { @@ -114,7 +140,7 @@ class AudioTrackSinkInterfaceImpl: public webrtc::AudioSinkInterface { } _peakCount += 1; } - + if (_peakCount >= 1200) { float level = ((float)(_peak)) / 4000.0f; _peak = 0; @@ -206,7 +232,49 @@ _platformContext(platformContext) { preferredCodecs, _platformContext); - mediaDeps.audio_processing = webrtc::AudioProcessingBuilder().Create(); + // [this] should outlive the analyzer + auto analyzer = new AudioCaptureAnalyzer([this](const webrtc::AudioBuffer* buffer) { + if (!buffer) { + return; + } + if (buffer->num_channels() != 1) { + return; + } + + float peak = 0; + int peakCount = 0; + const float *samples = buffer->channels_const()[0]; + for (int i = 0; i < buffer->num_frames(); i++) { + float sample = samples[i]; + if (sample < 0) { + sample = -sample; + } + if (peak < sample) { + peak = sample; + } + peakCount += 1; + } + + this->_thread->PostTask(RTC_FROM_HERE, [this, peak, peakCount](){ + auto strong = this; + + strong->_myAudioLevelPeakCount += peakCount; + if (strong->_myAudioLevelPeak < peak) { + strong->_myAudioLevelPeak = peak; + } + if (strong->_myAudioLevelPeakCount >= 1200) { + float level = strong->_myAudioLevelPeak / 4000.0f; + strong->_myAudioLevelPeak = 0; + strong->_myAudioLevelPeakCount = 0; + strong->_currentMyAudioLevel = level; + } + }); + }); + + webrtc::AudioProcessingBuilder builder; + builder.SetCaptureAnalyzer(std::unique_ptr(analyzer)); + + mediaDeps.audio_processing = builder.Create(); /*_audioDeviceModule = createAudioDeviceModule(); if (!_audioDeviceModule) { @@ -298,6 +366,13 @@ rtc::scoped_refptr MediaManager::createAudioDeviceMod _taskQueueFactory.get()); return (result && (result->Init() == 0)) ? result : nullptr; }; +#ifdef WEBRTC_WIN + if (auto result = webrtc::CreateWindowsCoreAudioAudioDeviceModule(_taskQueueFactory.get())) { + if (result->Init() == 0) { + return result; + } + } +#endif // WEBRTC_WIN if (auto result = check(webrtc::AudioDeviceModule::kPlatformDefaultAudio)) { return result; #ifdef WEBRTC_LINUX @@ -310,7 +385,7 @@ rtc::scoped_refptr MediaManager::createAudioDeviceMod void MediaManager::start() { const auto weak = std::weak_ptr(shared_from_this()); - + // Here we hope that thread outlives the sink rtc::Thread *thread = _thread; std::unique_ptr incomingSink(new AudioTrackSinkInterfaceImpl([weak, thread](float level) { @@ -320,24 +395,16 @@ void MediaManager::start() { } }); })); - std::unique_ptr outgoingSink(new AudioTrackSinkInterfaceImpl([weak, thread](float level) { - thread->PostTask(RTC_FROM_HERE, [weak, level] { - if (const auto strong = weak.lock()) { - strong->_currentMyAudioLevel = level; - } - }); - })); _audioChannel->SetRawAudioSink(_ssrcAudio.incoming, std::move(incomingSink)); - _audioChannel->SetRawAudioSink(_ssrcAudio.outgoing, std::move(outgoingSink)); - - _sendSignalingMessage({ _myVideoFormats }); + + _sendSignalingMessage({ _myVideoFormats }); if (_videoCapture != nullptr) { setSendVideo(_videoCapture); } beginStatsTimer(3000); - if (_audioLevelUpdated != nullptr) { + if (_audioLevelUpdated != nullptr) { beginLevelsTimer(50); } } diff --git a/TMessagesProj/jni/voip/tgcalls/MediaManager.h b/TMessagesProj/jni/voip/tgcalls/MediaManager.h index 154a7f2cf06..7080e02724b 100644 --- a/TMessagesProj/jni/voip/tgcalls/MediaManager.h +++ b/TMessagesProj/jni/voip/tgcalls/MediaManager.h @@ -164,6 +164,8 @@ class MediaManager : public sigslot::has_slots<>, public std::enable_shared_from float _currentAudioLevel = 0.0f; float _currentMyAudioLevel = 0.0f; + int _myAudioLevelPeakCount = 0; + int _myAudioLevelPeak = 0; std::unique_ptr _audioNetworkInterface; std::unique_ptr _videoNetworkInterface; diff --git a/TMessagesProj/jni/voip/tgcalls/group/GroupInstanceImpl.cpp b/TMessagesProj/jni/voip/tgcalls/group/GroupInstanceImpl.cpp index fcd5be934c4..82529174be3 100644 --- a/TMessagesProj/jni/voip/tgcalls/group/GroupInstanceImpl.cpp +++ b/TMessagesProj/jni/voip/tgcalls/group/GroupInstanceImpl.cpp @@ -19,6 +19,7 @@ #include "system_wrappers/include/field_trial.h" #include "api/stats/rtcstats_objects.h" #include "modules/audio_processing/audio_buffer.h" +#include "modules/audio_device/include/audio_device_factory.h" #include "common_audio/include/audio_util.h" #include "common_audio/vad/include/webrtc_vad.h" #include "modules/audio_processing/agc2/vad_with_level.h" @@ -1091,6 +1092,14 @@ class GroupInstanceManager : public std::enable_shared_from_thisInit() == 0)) ? result : nullptr; }; +#ifdef WEBRTC_WIN + if (auto result = webrtc::CreateWindowsCoreAudioAudioDeviceModule(dependencies.task_queue_factory.get())) { + if (result->Init() == 0) { + _adm_use_withAudioDeviceModule = new rtc::RefCountedObject(result); + return; + } + } +#endif // WEBRTC_WIN if (auto result = check(webrtc::AudioDeviceModule::kPlatformDefaultAudio)) { _adm_use_withAudioDeviceModule = new rtc::RefCountedObject(result); #ifdef WEBRTC_LINUX @@ -1326,7 +1335,7 @@ class GroupInstanceManager : public std::enable_shared_from_thisEnableBuiltInAEC(false); #endif // WEBRTC_WIN - if (adm->InitPlayout()) { + if (adm->InitPlayout() == 0) { adm->StartPlayout(); } else { getMediaThread()->PostDelayedTask(RTC_FROM_HERE, [weak](){ @@ -1335,7 +1344,7 @@ class GroupInstanceManager : public std::enable_shared_from_thiswithAudioDeviceModule([](webrtc::AudioDeviceModule *adm) { - if (adm->InitPlayout()) { + if (adm->InitPlayout() == 0) { adm->StartPlayout(); } }); @@ -1443,6 +1452,27 @@ class GroupInstanceManager : public std::enable_shared_from_thissecond - volume) > 0.001) { + updated = true; + } + } else { + if (volume < 1.0 - 0.001) { + updated = true; + } + } + if (updated) { + _audioTrackVolumes[ssrc] = volume; + auto track = _audioTracks.find(ssrc); + if (track != _audioTracks.end()) { + track->second->GetSource()->SetVolume(volume); + } + } + } void updateIsConnected(bool isConnected) { _isConnected = isConnected; @@ -1792,7 +1822,14 @@ class GroupInstanceManager : public std::enable_shared_from_this> ssrc; - auto remoteAudioTrack = static_cast(transceiver->receiver()->track().get()); + rtc::scoped_refptr remoteAudioTrack(static_cast(transceiver->receiver()->track().get())); + if (_audioTracks.find(ssrc) == _audioTracks.end()) { + _audioTracks.insert(std::make_pair(ssrc, remoteAudioTrack)); + } + auto currentVolume = _audioTrackVolumes.find(ssrc); + if (currentVolume != _audioTrackVolumes.end()) { + remoteAudioTrack->GetSource()->SetVolume(currentVolume->second); + } if (_audioTrackSinks.find(ssrc) == _audioTrackSinks.end()) { const auto weak = std::weak_ptr(shared_from_this()); std::shared_ptr sink(new AudioTrackSinkInterfaceImpl([weak, ssrc](float level, bool hasSpeech) { @@ -1821,6 +1858,7 @@ class GroupInstanceManager : public std::enable_shared_from_thisAddSink(sink.get()); + //remoteAudioTrack->GetSource()->SetVolume(0.01); } } } @@ -2048,8 +2086,10 @@ class GroupInstanceManager : public std::enable_shared_from_this _adm_use_withAudioDeviceModule; + std::map> _audioTracks; std::map> _audioTrackSinks; std::map _audioLevels; + std::map _audioTrackVolumes; std::shared_ptr _platformContext; }; @@ -2122,4 +2162,10 @@ void GroupInstanceImpl::setAudioOutputDevice(std::string id) { }); } +void GroupInstanceImpl::setVolume(uint32_t ssrc, double volume) { + _manager->perform(RTC_FROM_HERE, [ssrc, volume](GroupInstanceManager *manager) { + manager->setVolume(ssrc, volume); + }); +} + } // namespace tgcalls diff --git a/TMessagesProj/jni/voip/tgcalls/group/GroupInstanceImpl.h b/TMessagesProj/jni/voip/tgcalls/group/GroupInstanceImpl.h index 8a8ed96ae79..2dc25982e03 100644 --- a/TMessagesProj/jni/voip/tgcalls/group/GroupInstanceImpl.h +++ b/TMessagesProj/jni/voip/tgcalls/group/GroupInstanceImpl.h @@ -102,6 +102,8 @@ class GroupInstanceImpl final { void setIsMuted(bool isMuted); void setAudioOutputDevice(std::string id); void setAudioInputDevice(std::string id); + + void setVolume(uint32_t ssrc, double volume); struct AudioDevice { enum class Type {Input, Output}; diff --git a/TMessagesProj/jni/voip/tgcalls/legacy/InstanceImplLegacy.cpp b/TMessagesProj/jni/voip/tgcalls/legacy/InstanceImplLegacy.cpp index ef66e29bad0..99108f69a79 100644 --- a/TMessagesProj/jni/voip/tgcalls/legacy/InstanceImplLegacy.cpp +++ b/TMessagesProj/jni/voip/tgcalls/legacy/InstanceImplLegacy.cpp @@ -240,9 +240,9 @@ void InstanceImplLegacy::setOutputVolume(float level) { } void InstanceImplLegacy::setAudioOutputDuckingEnabled(bool enabled) { -#if defined(__APPLE__) && defined(TARGET_OS_OSX) +#if defined(__APPLE__) && TARGET_OS_OSX controller_->SetAudioOutputDuckingEnabled(enabled); -#endif +#endif // TARGET_OS_OSX } void InstanceImplLegacy::setIsLowBatteryLevel(bool isLowBatteryLevel) { diff --git a/TMessagesProj/src/main/AndroidManifest.xml b/TMessagesProj/src/main/AndroidManifest.xml index 6ce638f812e..ba8f1e605d6 100644 --- a/TMessagesProj/src/main/AndroidManifest.xml +++ b/TMessagesProj/src/main/AndroidManifest.xml @@ -199,6 +199,24 @@ + + + + + + + + + + + + + + + + + + + @@ -396,6 +415,30 @@ android:name=".voip.CallNotificationSoundProvider" android:exported="true"/> + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TMessagesProj/src/main/java/androidx/recyclerview/widget/LinearLayoutManager.java b/TMessagesProj/src/main/java/androidx/recyclerview/widget/LinearLayoutManager.java index 1a46787e810..73c2c59cec9 100644 --- a/TMessagesProj/src/main/java/androidx/recyclerview/widget/LinearLayoutManager.java +++ b/TMessagesProj/src/main/java/androidx/recyclerview/widget/LinearLayoutManager.java @@ -1397,9 +1397,6 @@ int scrollBy(int delta, RecyclerView.Recycler recycler, RecyclerView.State state } final int scrolled = absDelta > consumed ? layoutDirection * consumed : delta; mOrientationHelper.offsetChildren(-scrolled); - if (DEBUG) { - Log.d(TAG, "scroll req: " + delta + " scrolled: " + scrolled); - } mLayoutState.mLastScrollDelta = scrolled; return scrolled; } diff --git a/TMessagesProj/src/main/java/com/google/zxing/qrcode/QRCodeWriter.java b/TMessagesProj/src/main/java/com/google/zxing/qrcode/QRCodeWriter.java index 0a9983a3a4e..1f584c04c16 100755 --- a/TMessagesProj/src/main/java/com/google/zxing/qrcode/QRCodeWriter.java +++ b/TMessagesProj/src/main/java/com/google/zxing/qrcode/QRCodeWriter.java @@ -32,6 +32,9 @@ import com.google.zxing.qrcode.encoder.QRCode; import org.telegram.messenger.R; +import org.telegram.messenger.SvgHelper; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.RLottieDrawable; import java.util.Arrays; import java.util.Map; @@ -115,7 +118,7 @@ public Bitmap encode(String contents, BarcodeFormat format, int width, int heigh imageBloks++; } imageBlockX = (inputWidth - imageBloks) / 2; - int imageSize = imageBloks * multiple; + int imageSize = imageBloks * multiple - 24; int imageX = (size - imageSize) / 2; for (int a = 0; a < 3; a++) { @@ -206,9 +209,14 @@ public Bitmap encode(String contents, BarcodeFormat format, int width, int heigh } } - Drawable drawable = context.getResources().getDrawable(R.drawable.gem_l).mutate(); - drawable.setBounds(imageX, imageX, imageX + imageSize, imageX + imageSize); - drawable.draw(canvas); + String svg = RLottieDrawable.readRes(null, R.raw.qr_logo); + Bitmap icon = SvgHelper.getBitmap(svg, imageSize, imageSize, false); + +// Drawable drawable = context.getResources().getDrawable(R.drawable.ic_launcher_dr).mutate(); +// drawable.setBounds(imageX, imageX, imageX + imageSize, imageX + imageSize); +// drawable.draw(canvas); + canvas.drawBitmap(icon, imageX, imageX, null); + icon.recycle(); canvas.setBitmap(null); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java b/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java index 8b9e3ad237c..220f7fdf034 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java @@ -50,6 +50,7 @@ import androidx.core.content.FileProvider; import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import androidx.viewpager.widget.ViewPager; import android.telephony.TelephonyManager; @@ -65,6 +66,10 @@ import android.text.method.LinkMovementMethod; import android.text.style.URLSpan; import android.text.util.Linkify; +import android.transition.ChangeBounds; +import android.transition.TransitionSet; +import android.transition.TransitionValues; +import android.transition.Visibility; import android.util.DisplayMetrics; import android.util.StateSet; import android.util.TypedValue; @@ -107,12 +112,14 @@ import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.ActionBarLayout; +import org.telegram.ui.ActionBar.ActionBarMenuItem; import org.telegram.ui.ActionBar.AlertDialog; import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.BottomSheet; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Cells.TextDetailSettingsCell; import org.telegram.ui.Components.BackgroundGradientDrawable; +import org.telegram.ui.Components.CubicBezierInterpolator; import org.telegram.ui.Components.ForegroundColorSpanThemable; import org.telegram.ui.Components.ForegroundDetector; import org.telegram.ui.Components.LayoutHelper; @@ -3624,4 +3631,25 @@ public static boolean checkInlinePermissions(Context context) { } return false; } + + public static void updateVisibleRows(RecyclerListView listView) { + if (listView == null) { + return; + } + RecyclerView.Adapter adapter = listView.getAdapter(); + if (adapter == null) { + return; + } + for (int i = 0; i < listView.getChildCount(); i++) { + View child = listView.getChildAt(i); + int p = listView.getChildAdapterPosition(child); + if (p >= 0) { + RecyclerView.ViewHolder holder = listView.getChildViewHolder(child); + if (holder == null || holder.shouldIgnore()) { + continue; + } + adapter.onBindViewHolder(holder, p); + } + } + } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java b/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java index 23221774de2..9409e4c75f1 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java @@ -18,8 +18,8 @@ public class BuildVars { public static boolean LOGS_ENABLED = false; public static boolean USE_CLOUD_STRINGS = true; public static boolean CHECK_UPDATES = true; - public static int BUILD_VERSION = 2206; - public static String BUILD_VERSION_STRING = "7.3.0"; + public static int BUILD_VERSION = 2221; + public static String BUILD_VERSION_STRING = "7.4.0"; public static int APP_ID = 4; public static String APP_HASH = "014b35b6184100b085b0d0572f9b5103"; public static String APPCENTER_HASH = "a5b5c4f5-51da-dedc-9918-d9766a22ca7c"; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ChatObject.java b/TMessagesProj/src/main/java/org/telegram/messenger/ChatObject.java index 909c99a5b74..4d8a534eec8 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ChatObject.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ChatObject.java @@ -143,17 +143,27 @@ public void loadMembers(boolean fromBegin) { call.version = groupParticipants.version; call.participants_count = groupParticipants.count; } + long time = SystemClock.elapsedRealtime(); + currentAccount.getNotificationCenter().postNotificationName(NotificationCenter.applyGroupCallVisibleParticipants, time); for (int a = 0, N = groupParticipants.participants.size(); a < N; a++) { TLRPC.TL_groupCallParticipant participant = groupParticipants.participants.get(a); TLRPC.TL_groupCallParticipant oldParticipant = participants.get(participant.user_id); if (oldParticipant != null) { sortedParticipants.remove(oldParticipant); participantsBySources.remove(oldParticipant.source); - participant.active_date = Math.max(participant.active_date, oldParticipant.active_date); + participant.lastTypingDate = Math.max(participant.active_date, oldParticipant.active_date); + if (time != participant.lastVisibleDate) { + participant.active_date = participant.lastTypingDate; + } } else if (old != null) { oldParticipant = old.get(participant.user_id); if (oldParticipant != null) { - participant.active_date = Math.max(participant.active_date, oldParticipant.active_date); + participant.lastTypingDate = Math.max(participant.active_date, oldParticipant.active_date); + if (time != participant.lastVisibleDate) { + participant.active_date = participant.lastTypingDate; + } else { + participant.active_date = oldParticipant.active_date; + } } } participants.put(participant.user_id, participant); @@ -180,12 +190,19 @@ public void addInvitedUser(int uid) { public void processTypingsUpdate(AccountInstance accountInstance, ArrayList uids, int date) { boolean updated = false; ArrayList participantsToLoad = null; + long time = SystemClock.elapsedRealtime(); + currentAccount.getNotificationCenter().postNotificationName(NotificationCenter.applyGroupCallVisibleParticipants, time); for (int a = 0, N = uids.size(); a < N; a++) { Integer id = uids.get(a); TLRPC.TL_groupCallParticipant participant = participants.get(id); if (participant != null) { - participant.active_date = date; - updated = true; + if (date - participant.lastTypingDate > 10) { + if (participant.lastVisibleDate != date) { + participant.active_date = date; + } + participant.lastTypingDate = date; + updated = true; + } } else { if (participantsToLoad == null) { participantsToLoad = new ArrayList<>(); @@ -252,6 +269,8 @@ public void processVoiceLevelsUpdate(int[] ssrc, float[] levels, boolean[] voice boolean updated = false; int currentTime = currentAccount.getConnectionsManager().getCurrentTime(); ArrayList participantsToLoad = null; + long time = SystemClock.elapsedRealtime(); + currentAccount.getNotificationCenter().postNotificationName(NotificationCenter.applyGroupCallVisibleParticipants, time); for (int a = 0; a < ssrc.length; a++) { TLRPC.TL_groupCallParticipant participant; if (ssrc[a] == 0) { @@ -262,8 +281,11 @@ public void processVoiceLevelsUpdate(int[] ssrc, float[] levels, boolean[] voice if (participant != null) { participant.hasVoice = voice[a]; if (levels[a] > 0.1f) { - if (voice[a] && participant.active_date + 1 < currentTime) { - participant.active_date = currentTime; + if (voice[a] && participant.lastTypingDate + 1 < currentTime) { + if (time != participant.lastVisibleDate) { + participant.active_date = currentTime; + } + participant.lastTypingDate = currentTime; updated = true; } participant.lastSpeakTime = SystemClock.uptimeMillis(); @@ -388,6 +410,8 @@ public void processParticipantsUpdate(TLRPC.TL_updateGroupCallParticipants updat boolean updated = false; boolean selfUpdated = false; int selfId = currentAccount.getUserConfig().getClientUserId(); + long time = SystemClock.elapsedRealtime(); + currentAccount.getNotificationCenter().postNotificationName(NotificationCenter.applyGroupCallVisibleParticipants, time); for (int a = 0, N = update.participants.size(); a < N; a++) { TLRPC.TL_groupCallParticipant participant = update.participants.get(a); TLRPC.TL_groupCallParticipant oldParticipant = participants.get(participant.user_id); @@ -414,9 +438,14 @@ public void processParticipantsUpdate(TLRPC.TL_updateGroupCallParticipants updat if (oldParticipant != null) { oldParticipant.flags = participant.flags; oldParticipant.muted = participant.muted; + oldParticipant.muted_by_you = participant.muted_by_you; + oldParticipant.volume = participant.volume; oldParticipant.can_self_unmute = participant.can_self_unmute; oldParticipant.date = participant.date; - oldParticipant.active_date = Math.max(oldParticipant.active_date, participant.active_date); + oldParticipant.lastTypingDate = Math.max(oldParticipant.active_date, participant.active_date); + if (time != oldParticipant.lastVisibleDate) { + oldParticipant.active_date = oldParticipant.lastTypingDate; + } if (oldParticipant.source != participant.source) { participantsBySources.remove(oldParticipant.source); oldParticipant.source = participant.source; @@ -484,6 +513,13 @@ private void sortParticipants() { checkOnlineParticipants(); } + public void saveActiveDates() { + for (int a = 0, N = sortedParticipants.size(); a < N; a++) { + TLRPC.TL_groupCallParticipant p = sortedParticipants.get(a); + p.lastActiveDate = p.active_date; + } + } + private void checkOnlineParticipants() { if (typingUpdateRunnableScheduled) { AndroidUtilities.cancelRunOnUIThread(typingUpdateRunnable); @@ -510,6 +546,10 @@ private void checkOnlineParticipants() { } } + public static int getParticipantVolume(TLRPC.TL_groupCallParticipant participant) { + return ((participant.flags & 128) != 0 ? participant.volume : 10000); + } + private static boolean isBannableAction(int action) { switch (action) { case ACTION_PIN: diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FeedWidgetProvider.java b/TMessagesProj/src/main/java/org/telegram/messenger/FeedWidgetProvider.java new file mode 100644 index 00000000000..1769fb873a1 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FeedWidgetProvider.java @@ -0,0 +1,59 @@ +package org.telegram.messenger; + +import android.app.Activity; +import android.app.PendingIntent; +import android.appwidget.AppWidgetManager; +import android.appwidget.AppWidgetProvider; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.net.Uri; +import android.widget.RemoteViews; + +import org.telegram.ui.FeedWidgetConfigActivity; +import org.telegram.ui.LaunchActivity; + +public class FeedWidgetProvider extends AppWidgetProvider { + + @Override + public void onReceive(Context context, Intent intent) { + super.onReceive(context, intent); + } + + @Override + public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + super.onUpdate(context, appWidgetManager, appWidgetIds); + for (int i = 0; i < appWidgetIds.length; i++) { + int appWidgetId = appWidgetIds[i]; + updateWidget(context, appWidgetManager, appWidgetId); + } + } + + @Override + public void onDeleted(Context context, int[] appWidgetIds) { + super.onDeleted(context, appWidgetIds); + for (int a = 0; a < appWidgetIds.length; a++) { + SharedPreferences preferences = context.getSharedPreferences("feed_widget", Activity.MODE_PRIVATE); + preferences.edit().remove("account" + appWidgetIds[a]).remove("dialogId" + appWidgetIds[a]).commit(); + } + } + + public static void updateWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) { + Intent intent2 = new Intent(context, FeedWidgetService.class); + intent2.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); + intent2.setData(Uri.parse(intent2.toUri(Intent.URI_INTENT_SCHEME))); + RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.feed_widget_layout); + rv.setRemoteAdapter(appWidgetId, R.id.list_view, intent2); + rv.setEmptyView(R.id.list_view, R.id.empty_view); + + Intent intent = new Intent(ApplicationLoader.applicationContext, LaunchActivity.class); + intent.setAction("com.tmessages.openchat" + Math.random() + Integer.MAX_VALUE); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); + intent.addCategory(Intent.CATEGORY_LAUNCHER); + PendingIntent contentIntent = PendingIntent.getActivity(ApplicationLoader.applicationContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); + + rv.setPendingIntentTemplate(R.id.list_view, contentIntent); + + appWidgetManager.updateAppWidget(appWidgetId, rv); + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FeedWidgetService.java b/TMessagesProj/src/main/java/org/telegram/messenger/FeedWidgetService.java new file mode 100644 index 00000000000..ceb21c7c801 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FeedWidgetService.java @@ -0,0 +1,169 @@ +package org.telegram.messenger; + +import android.app.Activity; +import android.appwidget.AppWidgetManager; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.net.Uri; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.RemoteViews; +import android.widget.RemoteViewsService; + +import org.telegram.tgnet.ConnectionsManager; +import org.telegram.tgnet.TLRPC; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CountDownLatch; + +import androidx.core.content.FileProvider; + +public class FeedWidgetService extends RemoteViewsService { + @Override + public RemoteViewsFactory onGetViewFactory(Intent intent) { + return new FeedRemoteViewsFactory(getApplicationContext(), intent); + } +} + +class FeedRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory, NotificationCenter.NotificationCenterDelegate { + + private ArrayList messages = new ArrayList<>(); + private Context mContext; + private int appWidgetId; + private long dialogId; + private int classGuid; + private AccountInstance accountInstance; + private CountDownLatch countDownLatch = new CountDownLatch(1); + + public FeedRemoteViewsFactory(Context context, Intent intent) { + mContext = context; + appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); + SharedPreferences preferences = context.getSharedPreferences("feed_widget", Activity.MODE_PRIVATE); + int accountId = preferences.getInt("account" + appWidgetId, -1); + if (accountId >= 0) { + dialogId = preferences.getLong("dialogId" + appWidgetId, 0); + accountInstance = AccountInstance.getInstance(accountId); + } + } + + public void onCreate() { + ApplicationLoader.postInitApplication(); + } + + public void onDestroy() { + + } + + public int getCount() { + return messages.size(); + } + + protected void grantUriAccessToWidget(Context context, Uri uri) { + Intent intent= new Intent(Intent.ACTION_MAIN); + intent.addCategory(Intent.CATEGORY_HOME); + List resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); + for (ResolveInfo resolveInfo : resInfoList) { + String packageName = resolveInfo.activityInfo.packageName; + context.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION); + } + } + + public RemoteViews getViewAt(int position) { + MessageObject messageObject = messages.get(position); + String name; + + RemoteViews rv = new RemoteViews(mContext.getPackageName(), R.layout.feed_widget_item); + if (messageObject.type == 0) { + rv.setTextViewText(R.id.feed_widget_item_text, messageObject.messageText); + rv.setViewVisibility(R.id.feed_widget_item_text, View.VISIBLE); + } else { + if (TextUtils.isEmpty(messageObject.caption)) { + rv.setViewVisibility(R.id.feed_widget_item_text, View.GONE); + } else { + rv.setTextViewText(R.id.feed_widget_item_text, messageObject.caption); + rv.setViewVisibility(R.id.feed_widget_item_text, View.VISIBLE); + } + } + + if (messageObject.photoThumbs == null || messageObject.photoThumbs.isEmpty()) { + rv.setViewVisibility(R.id.feed_widget_item_image, View.GONE); + } else { + TLRPC.PhotoSize size = FileLoader.getClosestPhotoSizeWithSize(messageObject.photoThumbs, AndroidUtilities.getPhotoSize()); + File f = FileLoader.getPathToAttach(size); + if (f.exists()) { + rv.setViewVisibility(R.id.feed_widget_item_image, View.VISIBLE); + Uri uri = FileProvider.getUriForFile(mContext, BuildConfig.APPLICATION_ID + ".provider", f); + grantUriAccessToWidget(mContext, uri); + rv.setImageViewUri(R.id.feed_widget_item_image, uri); + } else { + rv.setViewVisibility(R.id.feed_widget_item_image, View.GONE); + } + } + + Bundle extras = new Bundle(); + extras.putInt("chatId", (int) -messageObject.getDialogId()); + extras.putInt("message_id", messageObject.getId()); + extras.putInt("currentAccount", accountInstance.getCurrentAccount()); + + Intent fillInIntent = new Intent(); + fillInIntent.putExtras(extras); + rv.setOnClickFillInIntent(R.id.shortcut_widget_item, fillInIntent); + + return rv; + } + + public RemoteViews getLoadingView() { + return null; + } + + public int getViewTypeCount() { + return 1; + } + + public long getItemId(int position) { + return position; + } + + public boolean hasStableIds() { + return true; + } + + public void onDataSetChanged() { + if (accountInstance == null || !accountInstance.getUserConfig().isClientActivated()) { + messages.clear(); + return; + } + AndroidUtilities.runOnUIThread(() -> { + accountInstance.getNotificationCenter().addObserver(FeedRemoteViewsFactory.this, NotificationCenter.messagesDidLoad); + if (classGuid == 0) { + classGuid = ConnectionsManager.generateClassGuid(); + } + accountInstance.getMessagesController().loadMessages(dialogId, 0, false, 20, 0, 0, true, 0, classGuid, 0, 0, true, 0, 0, 0, 1); + }); + try { + countDownLatch.await(); + } catch (Exception e) { + FileLog.e(e); + } + } + + @SuppressWarnings("unchecked") + @Override + public void didReceivedNotification(int id, int account, Object... args) { + if (id == NotificationCenter.messagesDidLoad) { + int guid = (Integer) args[10]; + if (guid == classGuid) { + messages.clear(); + ArrayList messArr = (ArrayList) args[2]; + messages.addAll(messArr); + countDownLatch.countDown(); + } + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java index d32ee370613..f2740580e3f 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java @@ -97,6 +97,8 @@ private PreloadRange(int o, int l) { private boolean nextPartWasPreloaded; + protected long lastProgressUpdateTime; + private ArrayList notLoadedBytesRanges; private volatile ArrayList notLoadedBytesRangesCopy; private ArrayList notRequestedBytesRanges; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java index b1ff398c67e..28c78c086e9 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java @@ -28,12 +28,12 @@ public class FileLoader extends BaseController { public interface FileLoaderDelegate { - void fileUploadProgressChanged(String location, long uploadedSize, long totalSize, boolean isEncrypted); + void fileUploadProgressChanged(FileUploadOperation operation, String location, long uploadedSize, long totalSize, boolean isEncrypted); void fileDidUploaded(String location, TLRPC.InputFile inputFile, TLRPC.InputEncryptedFile inputEncryptedFile, byte[] key, byte[] iv, long totalFileSize); void fileDidFailedUpload(String location, boolean isEncrypted); void fileDidLoaded(String location, File finalFile, int type); void fileDidFailedLoad(String location, int state); - void fileLoadProgressChanged(String location, long uploadedSize, long totalSize); + void fileLoadProgressChanged(FileLoadOperation operation, String location, long uploadedSize, long totalSize); } public static final int MEDIA_DIR_IMAGE = 0; @@ -237,10 +237,10 @@ public void onNetworkChanged(final boolean slow) { } public void uploadFile(final String location, final boolean encrypted, final boolean small, final int type) { - uploadFile(location, encrypted, small, 0, type); + uploadFile(location, encrypted, small, 0, type, false); } - public void uploadFile(final String location, final boolean encrypted, final boolean small, final int estimatedSize, final int type) { + public void uploadFile(final String location, final boolean encrypted, final boolean small, final int estimatedSize, final int type, boolean forceSmallFile) { if (location == null) { return; } @@ -262,15 +262,18 @@ public void uploadFile(final String location, final boolean encrypted, final boo uploadSizes.remove(location); } } + FileUploadOperation operation = new FileUploadOperation(currentAccount, location, encrypted, esimated, type); if (delegate != null && estimatedSize != 0) { - delegate.fileUploadProgressChanged(location, 0, estimatedSize, encrypted); + delegate.fileUploadProgressChanged(operation, location, 0, estimatedSize, encrypted); } - FileUploadOperation operation = new FileUploadOperation(currentAccount, location, encrypted, esimated, type); if (encrypted) { uploadOperationPathsEnc.put(location, operation); } else { uploadOperationPaths.put(location, operation); } + if (forceSmallFile) { + operation.setForceSmallFile(); + } operation.setDelegate(new FileUploadOperation.FileUploadOperationDelegate() { @Override public void didFinishUploadingFile(final FileUploadOperation operation, final TLRPC.InputFile inputFile, final TLRPC.InputEncryptedFile inputEncryptedFile, final byte[] key, final byte[] iv) { @@ -341,7 +344,7 @@ public void didFailedUploadingFile(final FileUploadOperation operation) { @Override public void didChangedUploadProgress(FileUploadOperation operation, long uploadedSize, long totalSize) { if (delegate != null) { - delegate.fileUploadProgressChanged(location, uploadedSize, totalSize, encrypted); + delegate.fileUploadProgressChanged(operation, location, uploadedSize, totalSize, encrypted); } } }); @@ -715,7 +718,7 @@ public void didFailedLoadingFile(FileLoadOperation operation, int reason) { @Override public void didChangedLoadProgress(FileLoadOperation operation, long uploadedSize, long totalSize) { if (delegate != null) { - delegate.fileLoadProgressChanged(fileName, uploadedSize, totalSize); + delegate.fileLoadProgressChanged(operation, fileName, uploadedSize, totalSize); } } }; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FileUploadOperation.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileUploadOperation.java index db713257446..ae5a78371bd 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FileUploadOperation.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileUploadOperation.java @@ -67,6 +67,7 @@ private static class UploadCachedResult { private boolean isEncrypted; private int fingerprint; private boolean isBigFile; + private boolean forceSmallFile; private String fileKey; private int estimatedSize; private int uploadStartTime; @@ -79,6 +80,7 @@ private static class UploadCachedResult { private long availableSize; private boolean uploadFirstPartLater; private SparseArray cachedResults = new SparseArray<>(); + protected long lastProgressUpdateTime; public interface FileUploadOperationDelegate { void didFinishUploadingFile(FileUploadOperation operation, TLRPC.InputFile inputFile, TLRPC.InputEncryptedFile inputEncryptedFile, byte[] key, byte[] iv); @@ -236,6 +238,10 @@ private void calcTotalPartsCount() { } } + public void setForceSmallFile() { + forceSmallFile = true; + } + private void startUploadRequest() { if (state != 1) { return; @@ -272,7 +278,7 @@ private void startUploadRequest() { } else { totalFileSize = cacheFile.length(); } - if (totalFileSize > 10 * 1024 * 1024) { + if (!forceSmallFile && totalFileSize > 10 * 1024 * 1024) { isBigFile = true; } @@ -628,7 +634,7 @@ private void startUploadRequest() { if (currentUploadRequetsCount < maxRequestsCount) { startUploadRequest(); } - }), 0, ConnectionsManager.DEFAULT_DATACENTER_ID, connectionType, true); + }), forceSmallFile ? ConnectionsManager.RequestFlagCanCompress : 0, ConnectionsManager.DEFAULT_DATACENTER_ID, connectionType, true); requestTokens.put(requestNumFinal, requestToken); } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ImageLoader.java b/TMessagesProj/src/main/java/org/telegram/messenger/ImageLoader.java index 816e8ef1751..6c54fc8342a 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ImageLoader.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ImageLoader.java @@ -24,6 +24,7 @@ import android.os.AsyncTask; import android.os.Build; import android.os.Environment; +import android.os.SystemClock; import android.provider.MediaStore; import android.text.TextUtils; import android.util.SparseArray; @@ -104,7 +105,6 @@ public class ImageLoader { private volatile long lastCacheOutTime = 0; private int lastImageNum = 0; - private long lastProgressUpdateTime = 0; private File telegramPath = null; @@ -143,7 +143,7 @@ public HttpFileTask(String url, File tempFile, String ext, int currentAccount) { } private void reportProgress(long uploadedSize, long totalSize) { - long currentTime = System.currentTimeMillis(); + long currentTime = SystemClock.elapsedRealtime(); if (uploadedSize == totalSize || lastProgressTime == 0 || lastProgressTime < currentTime - 100) { lastProgressTime = currentTime; Utilities.stageQueue.postRunnable(() -> { @@ -441,7 +441,7 @@ public HttpImageTask(CacheImage cacheImage, int size, String url) { } private void reportProgress(long uploadedSize, long totalSize) { - long currentTime = System.currentTimeMillis(); + long currentTime = SystemClock.elapsedRealtime(); if (uploadedSize == totalSize || lastProgressTime == 0 || lastProgressTime < currentTime - 100) { lastProgressTime = currentTime; Utilities.stageQueue.postRunnable(() -> { @@ -1074,7 +1074,7 @@ public void run() { if (cacheImage.type == ImageReceiver.TYPE_THUMB) { try { - lastCacheOutTime = System.currentTimeMillis(); + lastCacheOutTime = SystemClock.elapsedRealtime(); synchronized (sync) { if (isCancelled) { return; @@ -1179,10 +1179,10 @@ public void run() { if (mediaId != null) { delay = 0; } - if (delay != 0 && lastCacheOutTime != 0 && lastCacheOutTime > System.currentTimeMillis() - delay && Build.VERSION.SDK_INT < 21) { + if (delay != 0 && lastCacheOutTime != 0 && lastCacheOutTime > SystemClock.elapsedRealtime() - delay && Build.VERSION.SDK_INT < 21) { Thread.sleep(delay); } - lastCacheOutTime = System.currentTimeMillis(); + lastCacheOutTime = SystemClock.elapsedRealtime(); synchronized (sync) { if (isCancelled) { return; @@ -1674,11 +1674,11 @@ protected void entryRemoved(boolean evicted, String key, final RLottieDrawable o final int currentAccount = a; FileLoader.getInstance(a).setDelegate(new FileLoader.FileLoaderDelegate() { @Override - public void fileUploadProgressChanged(final String location, long uploadedSize, long totalSize, final boolean isEncrypted) { + public void fileUploadProgressChanged(FileUploadOperation operation, final String location, long uploadedSize, long totalSize, final boolean isEncrypted) { fileProgresses.put(location, new long[]{uploadedSize, totalSize}); - long currentTime = System.currentTimeMillis(); - if (lastProgressUpdateTime == 0 || lastProgressUpdateTime < currentTime - 500) { - lastProgressUpdateTime = currentTime; + long currentTime = SystemClock.elapsedRealtime(); + if (operation.lastProgressUpdateTime == 0 || operation.lastProgressUpdateTime < currentTime - 100 || uploadedSize == totalSize) { + operation.lastProgressUpdateTime = currentTime; AndroidUtilities.runOnUIThread(() -> NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.FileUploadProgressChanged, location, uploadedSize, totalSize, isEncrypted)); } @@ -1724,11 +1724,11 @@ public void fileDidFailedLoad(final String location, final int canceled) { } @Override - public void fileLoadProgressChanged(final String location, long uploadedSize, long totalSize) { + public void fileLoadProgressChanged(FileLoadOperation operation, final String location, long uploadedSize, long totalSize) { fileProgresses.put(location, new long[]{uploadedSize, totalSize}); - long currentTime = System.currentTimeMillis(); - if (lastProgressUpdateTime == 0 || lastProgressUpdateTime < currentTime - 500 || uploadedSize == 0) { - lastProgressUpdateTime = currentTime; + long currentTime = SystemClock.elapsedRealtime(); + if (operation.lastProgressUpdateTime == 0 || operation.lastProgressUpdateTime < currentTime - 500 || uploadedSize == 0) { + operation.lastProgressUpdateTime = currentTime; AndroidUtilities.runOnUIThread(() -> NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.FileLoadProgressChanged, location, uploadedSize, totalSize)); } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ImportingService.java b/TMessagesProj/src/main/java/org/telegram/messenger/ImportingService.java new file mode 100644 index 00000000000..1e1c9d3a2ed --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ImportingService.java @@ -0,0 +1,90 @@ +/* + * This is the source code of Telegram for Android v. 5.x.x. + * It is licensed under GNU GPL v. 2 or later. + * You should have received a copy of the license in this archive (see LICENSE). + * + * Copyright Nikolai Kudashov, 2013-2018. + */ + +package org.telegram.messenger; + +import android.app.Service; +import android.content.Intent; +import android.os.IBinder; + +import androidx.core.app.NotificationCompat; +import androidx.core.app.NotificationManagerCompat; + +public class ImportingService extends Service implements NotificationCenter.NotificationCenterDelegate { + + private NotificationCompat.Builder builder; + + public ImportingService() { + super(); + for (int a = 0; a < UserConfig.MAX_ACCOUNT_COUNT; a++) { + NotificationCenter.getInstance(a).addObserver(this, NotificationCenter.historyImportProgressChanged); + } + } + + public IBinder onBind(Intent arg2) { + return null; + } + + public void onDestroy() { + super.onDestroy(); + try { + stopForeground(true); + } catch (Throwable ignore) { + + } + NotificationManagerCompat.from(ApplicationLoader.applicationContext).cancel(5); + for (int a = 0; a < UserConfig.MAX_ACCOUNT_COUNT; a++) { + NotificationCenter.getInstance(a).removeObserver(this, NotificationCenter.historyImportProgressChanged); + } + if (BuildVars.LOGS_ENABLED) { + FileLog.d("destroy import service"); + } + } + + @Override + public void didReceivedNotification(int id, int account, Object... args) { + if (id == NotificationCenter.historyImportProgressChanged) { + if (!hasImports()) { + stopSelf(); + } + } + } + + private boolean hasImports() { + for (int a = 0; a < UserConfig.MAX_ACCOUNT_COUNT; a++) { + if (SendMessagesHelper.getInstance(a).isImportingHistory()) { + return true; + } + } + return false; + } + + public int onStartCommand(Intent intent, int flags, int startId) { + if (!hasImports()) { + stopSelf(); + return Service.START_NOT_STICKY; + } + if (BuildVars.LOGS_ENABLED) { + FileLog.d("start import service"); + } + if (builder == null) { + NotificationsController.checkOtherNotificationsChannel(); + builder = new NotificationCompat.Builder(ApplicationLoader.applicationContext); + builder.setSmallIcon(android.R.drawable.stat_sys_upload); + builder.setWhen(System.currentTimeMillis()); + builder.setChannelId(NotificationsController.OTHER_NOTIFICATIONS_CHANNEL); + builder.setContentTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setTicker(LocaleController.getString("ImporImportingService", R.string.ImporImportingService)); + builder.setContentText(LocaleController.getString("ImporImportingService", R.string.ImporImportingService)); + } + builder.setProgress(100, 0, true); + startForeground(5, builder.build()); + NotificationManagerCompat.from(ApplicationLoader.applicationContext).notify(5, builder.build()); + return Service.START_NOT_STICKY; + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/LocaleController.java b/TMessagesProj/src/main/java/org/telegram/messenger/LocaleController.java index 0628e9bbd89..3add96e88d3 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/LocaleController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/LocaleController.java @@ -1694,6 +1694,17 @@ public static String formatJoined(long date) { return "LOC_ERR"; } + public static String formatImportedDate(long date) { + try { + date *= 1000; + Date dt = new Date(date); + return String.format("%1$s, %2$s", getInstance().formatterYear.format(dt), getInstance().formatterDay.format(dt)); + } catch (Exception e) { + FileLog.e(e); + } + return "LOC_ERR"; + } + public static String formatUserStatus(int currentAccount, TLRPC.User user, boolean[] isOnline) { if (user != null && user.status != null && user.status.expires == 0) { if (user.status instanceof TLRPC.TL_userStatusRecently) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/LocationController.java b/TMessagesProj/src/main/java/org/telegram/messenger/LocationController.java index 3bfdc41e63b..f685122e695 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/LocationController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/LocationController.java @@ -1064,7 +1064,7 @@ public static void fetchLocationAddress(Location location, LocationFetchCallback arg = address.getThoroughfare(); if (!TextUtils.isEmpty(arg)) { if (nameBuilder.length() > 0) { - nameBuilder.append(", "); + nameBuilder.append(" "); } nameBuilder.append(arg); hasAny = true; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java index bd1c14d2181..dde8e79233a 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java @@ -9,6 +9,9 @@ package org.telegram.messenger; import android.Manifest; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ValueAnimator; import android.annotation.SuppressLint; import android.app.Activity; import android.app.DownloadManager; @@ -103,6 +106,13 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener, public native byte[] getWaveform(String path); public native byte[] getWaveform2(short[] array, int length); + public boolean isBuffering() { + if (audioPlayer != null) { + return audioPlayer.isBuffering(); + } + return false; + } + private static class AudioBuffer { public AudioBuffer(int capacity) { buffer = ByteBuffer.allocateDirect(capacity); @@ -647,6 +657,16 @@ public void run() { } }; + private float audioVolume; + private ValueAnimator audioVolumeAnimator; + private final ValueAnimator.AnimatorUpdateListener audioVolumeUpdateListener = new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator valueAnimator) { + audioVolume = (float) valueAnimator.getAnimatedValue(); + setPlayerVolume(); + } + }; + private class InternalObserver extends ContentObserver { public InternalObserver() { super(null); @@ -992,7 +1012,7 @@ private void setPlayerVolume() { volume = VOLUME_DUCK; } if (audioPlayer != null) { - audioPlayer.setVolume(volume); + audioPlayer.setVolume(volume * audioVolume); } else if (videoPlayer != null) { videoPlayer.setVolume(volume); } @@ -1769,10 +1789,41 @@ public void cleanupPlayer(boolean notify, boolean stopService) { public void cleanupPlayer(boolean notify, boolean stopService, boolean byVoiceEnd, boolean transferPlayerToPhotoViewer) { if (audioPlayer != null) { - try { - audioPlayer.releasePlayer(true); - } catch (Exception e) { - FileLog.e(e); + if (audioVolumeAnimator != null) { + audioVolumeAnimator.removeAllUpdateListeners(); + audioVolumeAnimator.cancel(); + } + + if (audioPlayer.isPlaying() && playingMessageObject != null && !playingMessageObject.isVoice()) { + VideoPlayer playerFinal = audioPlayer; + ValueAnimator valueAnimator = ValueAnimator.ofFloat(audioVolume, 0); + valueAnimator.addUpdateListener(valueAnimator1 -> { + float volume; + if (audioFocus != AUDIO_NO_FOCUS_CAN_DUCK) { + volume = VOLUME_NORMAL; + } else { + volume = VOLUME_DUCK; + } + playerFinal.setVolume(volume * (float) valueAnimator1.getAnimatedValue()); + }); + valueAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + try { + playerFinal.releasePlayer(true); + } catch (Exception e) { + FileLog.e(e); + } + } + }); + valueAnimator.setDuration(300); + valueAnimator.start(); + } else { + try { + audioPlayer.releasePlayer(true); + } catch (Exception e) { + FileLog.e(e); + } } audioPlayer = null; Theme.unrefAudioVisualizeDrawable(playingMessageObject); @@ -1910,6 +1961,12 @@ public boolean seekToProgress(MessageObject messageObject, float progress) { return true; } + public long getDuration() { + if (audioPlayer == null) { + return 0; + } + return audioPlayer.getDuration(); + } public MessageObject getPlayingMessageObject() { return playingMessageObject; } @@ -2431,6 +2488,19 @@ public void setFeedbackView(View view, boolean set) { public void setPlaybackSpeed(boolean music, float speed) { if (music) { + if (currentMusicPlaybackSpeed >= 6 && speed == 1f && playingMessageObject != null) { + audioPlayer.pause(); + float p = playingMessageObject.audioProgress; + final MessageObject currentMessage = playingMessageObject; + AndroidUtilities.runOnUIThread(() -> { + if (audioPlayer != null && playingMessageObject != null && !isPaused) { + if (isSamePlayingMessage(currentMessage )) { + seekToProgress(playingMessageObject, p); + } + audioPlayer.play(); + } + }, 50); + } currentMusicPlaybackSpeed = speed; } else { currentPlaybackSpeed = speed; @@ -3058,6 +3128,19 @@ public boolean needUpdate() { } audioPlayer.setStreamType(useFrontSpeaker ? AudioManager.STREAM_VOICE_CALL : AudioManager.STREAM_MUSIC); audioPlayer.play(); + if (!messageObject.isVoice()) { + if (audioVolumeAnimator != null) { + audioVolumeAnimator.removeAllListeners(); + audioVolumeAnimator.cancel(); + } + audioVolumeAnimator = ValueAnimator.ofFloat(audioVolume, 1f); + audioVolumeAnimator.addUpdateListener(audioVolumeUpdateListener); + audioVolumeAnimator.setDuration(300); + audioVolumeAnimator.start(); + } else { + audioVolume = 1f; + setPlayerVolume(); + } } catch (Exception e) { FileLog.e(e); NotificationCenter.getInstance(messageObject.currentAccount).postNotificationName(NotificationCenter.messagePlayingPlayStateChanged, playingMessageObject != null ? playingMessageObject.getId() : 0); @@ -3181,7 +3264,26 @@ public boolean pauseMessage(MessageObject messageObject) { stopProgressTimer(); try { if (audioPlayer != null) { - audioPlayer.pause(); + if (!playingMessageObject.isVoice()) { + if (audioVolumeAnimator != null) { + audioVolumeAnimator.removeAllUpdateListeners(); + audioVolumeAnimator.cancel(); + } + audioVolumeAnimator = ValueAnimator.ofFloat(1f, 0); + audioVolumeAnimator.addUpdateListener(audioVolumeUpdateListener); + audioVolumeAnimator.setDuration(300); + audioVolumeAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + if (audioPlayer != null) { + audioPlayer.pause(); + } + } + }); + audioVolumeAnimator.start(); + } else { + audioPlayer.pause(); + } } else if (videoPlayer != null) { videoPlayer.pause(); } @@ -3202,6 +3304,19 @@ private boolean resumeAudio(MessageObject messageObject) { try { startProgressTimer(playingMessageObject); + if (audioVolumeAnimator != null) { + audioVolumeAnimator.removeAllListeners(); + audioVolumeAnimator.cancel(); + } + if (!messageObject.isVoice()) { + audioVolumeAnimator = ValueAnimator.ofFloat(audioVolume, 1f); + audioVolumeAnimator.addUpdateListener(audioVolumeUpdateListener); + audioVolumeAnimator.setDuration(300); + audioVolumeAnimator.start(); + } else { + audioVolume = 1f; + setPlayerVolume(); + } if (audioPlayer != null) { audioPlayer.play(); } else if (videoPlayer != null) { @@ -4400,6 +4515,25 @@ private void didWriteData(final VideoConvertMessage message, final File file, fi }); } + public void pauseByRewind() { + if (audioPlayer != null) { + audioPlayer.pause(); + } + } + + public void resumeByRewind() { + if (audioPlayer != null && playingMessageObject != null && !isPaused) { + if (audioPlayer.isBuffering()) { + MessageObject currentMessageObject = playingMessageObject; + cleanupPlayer(false, false); + playMessage(currentMessageObject); + } else { + audioPlayer.play(); + } + } + } + + private static class VideoConvertRunnable implements Runnable { private VideoConvertMessage convertMessage; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java index 4a5019f028d..db4d74a45f6 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MediaDataController.java @@ -2153,6 +2153,10 @@ private void searchMessagesInChat(String query, final long dialogId, final long messagesSearchEndReached[1] = res.messages.isEmpty(); messagesSearchCount[1] = res instanceof TLRPC.TL_messages_messagesSlice ? res.count : res.messages.size(); searchMessagesInChat(req.q, dialogId, mergeDialogId, guid, direction, replyMessageId, true, user, chat, jumpToMessage); + } else { + messagesSearchEndReached[1] = true; + messagesSearchCount[1] = 0; + searchMessagesInChat(req.q, dialogId, mergeDialogId, guid, direction, replyMessageId, true, user, chat, jumpToMessage); } } }), ConnectionsManager.RequestFlagFailOnServerErrors); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java index 4d0e86e0373..d7ffb535a8e 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java @@ -5315,7 +5315,7 @@ public boolean isForwarded() { } public boolean needDrawForwarded() { - return (messageOwner.flags & TLRPC.MESSAGE_FLAG_FWD) != 0 && messageOwner.fwd_from != null && (messageOwner.fwd_from.saved_from_peer == null || messageOwner.fwd_from.from_id instanceof TLRPC.TL_peerChannel && messageOwner.fwd_from.saved_from_peer.channel_id != messageOwner.fwd_from.from_id.channel_id) && UserConfig.getInstance(currentAccount).getClientUserId() != getDialogId(); + return (messageOwner.flags & TLRPC.MESSAGE_FLAG_FWD) != 0 && messageOwner.fwd_from != null && !messageOwner.fwd_from.imported && (messageOwner.fwd_from.saved_from_peer == null || messageOwner.fwd_from.from_id instanceof TLRPC.TL_peerChannel && messageOwner.fwd_from.saved_from_peer.channel_id != messageOwner.fwd_from.from_id.channel_id) && UserConfig.getInstance(currentAccount).getClientUserId() != getDialogId(); } public static boolean isForwardedMessage(TLRPC.Message message) { @@ -5551,6 +5551,10 @@ public boolean isPrivateForward() { return messageOwner.fwd_from != null && !TextUtils.isEmpty(messageOwner.fwd_from.from_name); } + public boolean isImportedForward() { + return messageOwner.fwd_from != null && messageOwner.fwd_from.imported; + } + public int getSenderId() { if (messageOwner.fwd_from != null && messageOwner.fwd_from.saved_from_peer != null) { if (messageOwner.fwd_from.saved_from_peer.user_id != 0) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java index 178262995aa..ecb39d48347 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java @@ -65,7 +65,7 @@ public class MessagesController extends BaseController implements NotificationCe private ArrayList joiningToChannels = new ArrayList<>(); - private SparseArray exportedChats = new SparseArray<>(); + private SparseArray exportedChats = new SparseArray<>(); public ArrayList hintDialogs = new ArrayList<>(); private SparseArray> dialogsByFolder = new SparseArray<>(); @@ -287,7 +287,11 @@ public class MessagesController extends BaseController implements NotificationCe public boolean saveGifsWithStickers; private String installReferer; public Set pendingSuggestions; + public Set exportUri; + public Set exportGroupUri; + public Set exportPrivateUri; public boolean autoarchiveAvailable; + public boolean suggestStickersApiOnly; public ArrayList gifSearchEmojies = new ArrayList<>(); public HashSet diceEmojies; public HashMap diceSuccess = new HashMap<>(); @@ -717,6 +721,8 @@ public MessagesController(int num) { filtersEnabled = mainPreferences.getBoolean("filtersEnabled", false); showFiltersTooltip = mainPreferences.getBoolean("showFiltersTooltip", false); autoarchiveAvailable = mainPreferences.getBoolean("autoarchiveAvailable", false); + suggestStickersApiOnly = mainPreferences.getBoolean("suggestStickersApiOnly", false); + pendingSuggestions = mainPreferences.getStringSet("pendingSuggestions", null); if (pendingSuggestions != null) { pendingSuggestions = new HashSet<>(pendingSuggestions); @@ -724,6 +730,30 @@ public MessagesController(int num) { pendingSuggestions = new HashSet<>(); } + exportUri = mainPreferences.getStringSet("exportUri", null); + if (exportUri != null) { + exportUri = new HashSet<>(exportUri); + } else { + exportUri = new HashSet<>(); + exportUri.add("content://com.whatsapp.provider.media/export_chat/"); + } + + exportGroupUri = mainPreferences.getStringSet("exportGroupUri", null); + if (exportGroupUri != null) { + exportGroupUri = new HashSet<>(exportGroupUri); + } else { + exportGroupUri = new HashSet<>(); + exportGroupUri.add("@g.us/"); + } + + exportPrivateUri = mainPreferences.getStringSet("exportPrivateUri", null); + if (exportPrivateUri != null) { + exportPrivateUri = new HashSet<>(exportPrivateUri); + } else { + exportPrivateUri = new HashSet<>(); + exportPrivateUri.add("@s.whatsapp.net/"); + } + Set emojies = mainPreferences.getStringSet("diceEmojies", null); if (emojies == null) { diceEmojies = new HashSet<>(); @@ -1452,6 +1482,74 @@ private void loadAppConfig() { } break; } + case "stickers_emoji_suggest_only_api": { + if (value.value instanceof TLRPC.TL_jsonBool) { + TLRPC.TL_jsonBool bool = (TLRPC.TL_jsonBool) value.value; + if (bool.value != suggestStickersApiOnly) { + suggestStickersApiOnly = bool.value; + editor.putBoolean("suggestStickersApiOnly", suggestStickersApiOnly); + changed = true; + } + } + break; + } + case "export_urls": { + HashSet newExport = new HashSet<>(); + if (value.value instanceof TLRPC.TL_jsonArray) { + TLRPC.TL_jsonArray array = (TLRPC.TL_jsonArray) value.value; + for (int b = 0, N2 = array.value.size(); b < N2; b++) { + TLRPC.JSONValue val = array.value.get(b); + if (val instanceof TLRPC.TL_jsonString) { + TLRPC.TL_jsonString string = (TLRPC.TL_jsonString) val; + newExport.add(string.value); + } + } + } + if (!exportUri.equals(newExport)) { + exportUri = newExport; + editor.putStringSet("exportUri", exportUri); + changed = true; + } + break; + } + case "export_group_urls": { + HashSet newExport = new HashSet<>(); + if (value.value instanceof TLRPC.TL_jsonArray) { + TLRPC.TL_jsonArray array = (TLRPC.TL_jsonArray) value.value; + for (int b = 0, N2 = array.value.size(); b < N2; b++) { + TLRPC.JSONValue val = array.value.get(b); + if (val instanceof TLRPC.TL_jsonString) { + TLRPC.TL_jsonString string = (TLRPC.TL_jsonString) val; + newExport.add(string.value); + } + } + } + if (!exportGroupUri.equals(newExport)) { + exportGroupUri = newExport; + editor.putStringSet("exportGroupUri", exportGroupUri); + changed = true; + } + break; + } + case "export_private_urls": { + HashSet newExport = new HashSet<>(); + if (value.value instanceof TLRPC.TL_jsonArray) { + TLRPC.TL_jsonArray array = (TLRPC.TL_jsonArray) value.value; + for (int b = 0, N2 = array.value.size(); b < N2; b++) { + TLRPC.JSONValue val = array.value.get(b); + if (val instanceof TLRPC.TL_jsonString) { + TLRPC.TL_jsonString string = (TLRPC.TL_jsonString) val; + newExport.add(string.value); + } + } + } + if (!exportPrivateUri.equals(newExport)) { + exportPrivateUri = newExport; + editor.putStringSet("exportPrivateUri", exportPrivateUri); + changed = true; + } + break; + } case "pending_suggestions": { HashSet newSuggestions = new HashSet<>(); if (value.value instanceof TLRPC.TL_jsonArray) { @@ -2430,7 +2528,7 @@ public void setLastCreatedDialogId(final long dialogId, boolean scheduled, final }); } - public TLRPC.ExportedChatInvite getExportedInvite(int chat_id) { + public TLRPC.TL_chatInviteExported getExportedInvite(int chat_id) { return exportedChats.get(chat_id); } @@ -2461,12 +2559,14 @@ public boolean putUser(TLRPC.User user, boolean fromCache) { oldUser.username = null; } } - if (user.photo != null) { - oldUser.photo = user.photo; - oldUser.flags |= 32; - } else { - oldUser.flags = oldUser.flags &~ 32; - oldUser.photo = null; + if (user.apply_min_photo) { + if (user.photo != null) { + oldUser.photo = user.photo; + oldUser.flags |= 32; + } else { + oldUser.flags = oldUser.flags & ~32; + oldUser.photo = null; + } } } } else { @@ -2485,7 +2585,6 @@ public boolean putUser(TLRPC.User user, boolean fromCache) { } else if (oldUser == null) { users.put(user.id, user); } else if (oldUser.min) { - user.min = false; if (oldUser.bot) { if (oldUser.username != null) { user.username = oldUser.username; @@ -2495,12 +2594,14 @@ public boolean putUser(TLRPC.User user, boolean fromCache) { user.username = null; } } - if (oldUser.photo != null) { - user.photo = oldUser.photo; - user.flags |= 32; - } else { - user.flags = user.flags &~ 32; - user.photo = null; + if (oldUser.apply_min_photo) { + if (oldUser.photo != null) { + user.photo = oldUser.photo; + user.flags |= 32; + } else { + user.flags = user.flags & ~32; + user.photo = null; + } } users.put(user.id, user); } @@ -2616,7 +2717,6 @@ public void putChat(final TLRPC.Chat chat, boolean fromCache) { } else if (oldChat == null) { chats.put(chat.id, chat); } else if (oldChat.min) { - chat.min = false; chat.title = oldChat.title; chat.photo = oldChat.photo; chat.broadcast = oldChat.broadcast; @@ -2786,12 +2886,6 @@ private void reloadDialogsReadValue(ArrayList dialogs, long did) { ArrayList arrayList = new ArrayList<>(); for (int a = 0; a < res.dialogs.size(); a++) { TLRPC.Dialog dialog = res.dialogs.get(a); - if (dialog.read_inbox_max_id == 0) { - dialog.read_inbox_max_id = 1; - } - if (dialog.read_outbox_max_id == 0) { - dialog.read_outbox_max_id = 1; - } DialogObject.initDialog(dialog); Integer value = dialogs_read_inbox_max.get(dialog.id); @@ -3066,7 +3160,7 @@ public void loadFullUser(final TLRPC.User user, final int classGuid, boolean for users.add(userFull.user); putUsers(users, false); getMessagesStorage().putUsersAndChats(users, null, false, true); - if (names != null && !names.equals(userFull.user.first_name + userFull.user.last_name + userFull.user.username)) { + if (!names.equals(userFull.user.first_name + userFull.user.last_name + userFull.user.username)) { getNotificationCenter().postNotificationName(NotificationCenter.updateInterfaces, UPDATE_MASK_NAME); } if (userFull.bot_info instanceof TLRPC.TL_botInfo) { @@ -3200,12 +3294,13 @@ public void hidePeerSettingsBar(final long dialogId, TLRPC.User currentUser, TLR } SharedPreferences.Editor editor = notificationsPreferences.edit(); editor.putInt("dialog_bar_vis3" + dialogId, 3); + editor.remove("dialog_bar_invite" + dialogId); editor.commit(); if ((int) dialogId != 0) { TLRPC.TL_messages_hidePeerSettingsBar req = new TLRPC.TL_messages_hidePeerSettingsBar(); if (currentUser != null) { req.peer = getInputPeer(currentUser.id); - } else if (currentChat != null) { + } else { req.peer = getInputPeer(-currentChat.id); } getConnectionsManager().sendRequest(req, (response, error) -> { @@ -3263,9 +3358,9 @@ private void savePeerSettings(long dialogId, TLRPC.TL_peerSettings settings, boo return; } SharedPreferences.Editor editor = notificationsPreferences.edit(); - boolean bar_hidden = !settings.report_spam && !settings.add_contact && !settings.block_contact && !settings.share_contact && !settings.report_geo; + boolean bar_hidden = !settings.report_spam && !settings.add_contact && !settings.block_contact && !settings.share_contact && !settings.report_geo && !settings.invite_members; if (BuildVars.LOGS_ENABLED) { - FileLog.d("peer settings loaded for " + dialogId + " add = " + settings.add_contact + " block = " + settings.block_contact + " spam = " + settings.report_spam + " share = " + settings.share_contact + " geo = " + settings.report_geo + " hide = " + bar_hidden + " distance = " + settings.geo_distance); + FileLog.d("peer settings loaded for " + dialogId + " add = " + settings.add_contact + " block = " + settings.block_contact + " spam = " + settings.report_spam + " share = " + settings.share_contact + " geo = " + settings.report_geo + " hide = " + bar_hidden + " distance = " + settings.geo_distance + " invite = " + settings.invite_members); } editor.putInt("dialog_bar_vis3" + dialogId, bar_hidden ? 1 : 2); editor.putBoolean("dialog_bar_share" + dialogId, settings.share_contact); @@ -3275,6 +3370,7 @@ private void savePeerSettings(long dialogId, TLRPC.TL_peerSettings settings, boo editor.putBoolean("dialog_bar_exception" + dialogId, settings.need_contacts_exception); editor.putBoolean("dialog_bar_location" + dialogId, settings.report_geo); editor.putBoolean("dialog_bar_archived" + dialogId, settings.autoarchived); + editor.putBoolean("dialog_bar_invite" + dialogId, settings.invite_members); if (notificationsPreferences.getInt("dialog_bar_distance" + dialogId, -1) != -2) { if ((settings.flags & 64) != 0) { editor.putInt("dialog_bar_distance" + dialogId, settings.geo_distance); @@ -3313,7 +3409,7 @@ public void loadPeerSettings(TLRPC.User currentUser, TLRPC.Chat currentChat) { TLRPC.TL_messages_getPeerSettings req = new TLRPC.TL_messages_getPeerSettings(); if (currentUser != null) { req.peer = getInputPeer(currentUser.id); - } else if (currentChat != null) { + } else { req.peer = getInputPeer(-currentChat.id); } getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { @@ -3368,7 +3464,7 @@ protected void processNewChannelDifferenceParams(int pts, int pts_count, int cha } } - protected void processNewDifferenceParams(int seq, int pts, int date, int pts_count) { + public void processNewDifferenceParams(int seq, int pts, int date, int pts_count) { if (BuildVars.LOGS_ENABLED) { FileLog.d("processNewDifferenceParams seq = " + seq + " pts = " + pts + " date = " + date + " pts_count = " + pts_count); } @@ -4338,7 +4434,10 @@ protected void deleteDialog(long did, int first, int onlyHistory, int max_id, bo } if (first == 1 && max_id == 0) { TLRPC.InputPeer peerFinal = peer; - getMessagesStorage().getDialogMaxMessageId(did, (param) -> deleteDialog(did, 2, onlyHistory, Math.max(0, param), revoke, peerFinal, taskId)); + getMessagesStorage().getDialogMaxMessageId(did, (param) -> { + deleteDialog(did, 2, onlyHistory, Math.max(0, param), revoke, peerFinal, taskId); + checkIfFolderEmpty(1); + }); return; } if (onlyHistory == 0 || onlyHistory == 3) { @@ -4351,6 +4450,7 @@ protected void deleteDialog(long did, int first, int onlyHistory, int max_id, bo if (first != 0) { boolean isPromoDialog = false; getMessagesStorage().deleteDialog(did, onlyHistory); + getNotificationCenter().postNotificationName(NotificationCenter.dialogDeleted, did); TLRPC.Dialog dialog = dialogs_dict.get(did); if (onlyHistory == 0 || onlyHistory == 3) { getNotificationsController().deleteNotificationChannel(did); @@ -4545,7 +4645,7 @@ protected void deleteDialog(long did, int first, int onlyHistory, int max_id, bo if (onlyHistory == 1) { getSecretChatHelper().sendClearHistoryMessage(getEncryptedChat(high_id), null); } else { - getSecretChatHelper().declineSecretChat(high_id); + getSecretChatHelper().declineSecretChat(high_id, revoke); } } } @@ -7097,7 +7197,7 @@ public void processLoadedDialogs(final TLRPC.messages_Dialogs dialogsRes, final channelsPts.put(-(int) d.id, d.pts); } else if ((int) d.id < 0) { TLRPC.Chat chat = chatsDict.get(-(int) d.id); - if (chat != null && chat.migrated_to != null) { + if (chat != null && (chat.migrated_to != null || ChatObject.isNotInChat(chat))) { continue; } } @@ -7676,7 +7776,7 @@ public void processDialogsUpdate(final TLRPC.messages_Dialogs dialogsRes, ArrayL } } else if (message.peer_id.chat_id != 0) { TLRPC.Chat chat = chatsDict.get(message.peer_id.chat_id); - if (chat != null && chat.migrated_to != null) { + if (chat != null && (chat.migrated_to != null || ChatObject.isNotInChat(chat))) { continue; } } @@ -7695,7 +7795,7 @@ public void processDialogsUpdate(final TLRPC.messages_Dialogs dialogsRes, ArrayL } } else if ((int) d.id < 0) { TLRPC.Chat chat = chatsDict.get(-(int) d.id); - if (chat != null && chat.migrated_to != null) { + if (chat != null && (chat.migrated_to != null || ChatObject.isNotInChat(chat))) { continue; } } @@ -8315,8 +8415,8 @@ public void markDialogAsRead(long dialogId, int maxPositiveId, int maxNegativeId } } - public int createChat(String title, ArrayList selectedContacts, final String about, int type, Location location, String locationAddress, final BaseFragment fragment) { - if (type == ChatObject.CHAT_TYPE_CHAT) { + public int createChat(String title, ArrayList selectedContacts, final String about, int type, boolean forImport, Location location, String locationAddress, final BaseFragment fragment) { + if (type == ChatObject.CHAT_TYPE_CHAT && !forImport) { final TLRPC.TL_messages_createChat req = new TLRPC.TL_messages_createChat(); req.title = title; for (int a = 0; a < selectedContacts.size(); a++) { @@ -8346,11 +8446,12 @@ public int createChat(String title, ArrayList selectedContacts, final S } }); }, ConnectionsManager.RequestFlagFailOnServerErrors); - } else if (type == ChatObject.CHAT_TYPE_CHANNEL || type == ChatObject.CHAT_TYPE_MEGAGROUP) { + } else if (forImport || type == ChatObject.CHAT_TYPE_CHANNEL || type == ChatObject.CHAT_TYPE_MEGAGROUP) { final TLRPC.TL_channels_createChannel req = new TLRPC.TL_channels_createChannel(); req.title = title; req.about = about != null ? about : ""; - if (type == ChatObject.CHAT_TYPE_MEGAGROUP) { + req.for_import = forImport; + if (forImport || type == ChatObject.CHAT_TYPE_MEGAGROUP) { req.megagroup = true; } else { req.broadcast = true; @@ -8389,18 +8490,20 @@ public int createChat(String title, ArrayList selectedContacts, final S public void convertToMegaGroup(final Context context, int chat_id, BaseFragment fragment, MessagesStorage.IntCallback convertRunnable) { TLRPC.TL_messages_migrateChat req = new TLRPC.TL_messages_migrateChat(); req.chat_id = chat_id; - final AlertDialog progressDialog = new AlertDialog(context, 3); + final AlertDialog progressDialog = context != null ? new AlertDialog(context, 3) : null; final int reqId = getConnectionsManager().sendRequest(req, (response, error) -> { if (error == null) { - AndroidUtilities.runOnUIThread(() -> { - if (!((Activity) context).isFinishing()) { - try { - progressDialog.dismiss(); - } catch (Exception e) { - FileLog.e(e); + if (context != null) { + AndroidUtilities.runOnUIThread(() -> { + if (!((Activity) context).isFinishing()) { + try { + progressDialog.dismiss(); + } catch (Exception e) { + FileLog.e(e); + } } - } - }); + }); + } TLRPC.Updates updates = (TLRPC.Updates) response; processUpdates((TLRPC.Updates) response, false); AndroidUtilities.runOnUIThread(() -> { @@ -8419,22 +8522,26 @@ public void convertToMegaGroup(final Context context, int chat_id, BaseFragment if (convertRunnable != null) { convertRunnable.run(0); } - if (!((Activity) context).isFinishing()) { - try { - progressDialog.dismiss(); - } catch (Exception e) { - FileLog.e(e); + if (context != null) { + if (!((Activity) context).isFinishing()) { + try { + progressDialog.dismiss(); + } catch (Exception e) { + FileLog.e(e); + } + AlertsCreator.processError(currentAccount, error, fragment, req, false); } - AlertsCreator.processError(currentAccount, error, fragment, req, false); } }); } }); - progressDialog.setOnCancelListener(dialog -> getConnectionsManager().cancelRequest(reqId, true)); - try { - progressDialog.show(); - } catch (Exception e) { - //don't promt + if (progressDialog != null) { + progressDialog.setOnCancelListener(dialog -> getConnectionsManager().cancelRequest(reqId, true)); + try { + progressDialog.show(); + } catch (Exception e) { + //don't promt + } } } @@ -8635,84 +8742,68 @@ public void deleteUserFromChat(final int chat_id, final TLRPC.User user, final T if (user == null) { return; } - if (chat_id > 0) { - final TLRPC.InputUser inputUser = getInputUser(user); - TLObject request; - TLRPC.Chat chat = getChat(chat_id); - final boolean isChannel = ChatObject.isChannel(chat); - if (isChannel) { - if (inputUser instanceof TLRPC.TL_inputUserSelf) { - if (chat.creator && forceDelete) { - TLRPC.TL_channels_deleteChannel req = new TLRPC.TL_channels_deleteChannel(); - req.channel = getInputChannel(chat); - request = req; - } else { - TLRPC.TL_channels_leaveChannel req = new TLRPC.TL_channels_leaveChannel(); - req.channel = getInputChannel(chat); - request = req; - } + final TLRPC.InputUser inputUser = getInputUser(user); + TLObject request; + TLRPC.Chat chat = getChat(chat_id); + final boolean isChannel = ChatObject.isChannel(chat); + if (isChannel) { + if (inputUser instanceof TLRPC.TL_inputUserSelf) { + if (chat.creator && forceDelete) { + TLRPC.TL_channels_deleteChannel req = new TLRPC.TL_channels_deleteChannel(); + req.channel = getInputChannel(chat); + request = req; } else { - TLRPC.TL_channels_editBanned req = new TLRPC.TL_channels_editBanned(); + TLRPC.TL_channels_leaveChannel req = new TLRPC.TL_channels_leaveChannel(); req.channel = getInputChannel(chat); - req.user_id = inputUser; - req.banned_rights = new TLRPC.TL_chatBannedRights(); - req.banned_rights.view_messages = true; - req.banned_rights.send_media = true; - req.banned_rights.send_messages = true; - req.banned_rights.send_stickers = true; - req.banned_rights.send_gifs = true; - req.banned_rights.send_games = true; - req.banned_rights.send_inline = true; - req.banned_rights.embed_links = true; - req.banned_rights.pin_messages = true; - req.banned_rights.send_polls = true; - req.banned_rights.invite_users = true; - req.banned_rights.change_info = true; request = req; } } else { - TLRPC.TL_messages_deleteChatUser req = new TLRPC.TL_messages_deleteChatUser(); - req.chat_id = chat_id; - req.user_id = getInputUser(user); + TLRPC.TL_channels_editBanned req = new TLRPC.TL_channels_editBanned(); + req.channel = getInputChannel(chat); + req.user_id = inputUser; + req.banned_rights = new TLRPC.TL_chatBannedRights(); + req.banned_rights.view_messages = true; + req.banned_rights.send_media = true; + req.banned_rights.send_messages = true; + req.banned_rights.send_stickers = true; + req.banned_rights.send_gifs = true; + req.banned_rights.send_games = true; + req.banned_rights.send_inline = true; + req.banned_rights.embed_links = true; + req.banned_rights.pin_messages = true; + req.banned_rights.send_polls = true; + req.banned_rights.invite_users = true; + req.banned_rights.change_info = true; request = req; } - if (user.id == getUserConfig().getClientUserId()) { - deleteDialog(-chat_id, 0, revoke); - } - getConnectionsManager().sendRequest(request, (response, error) -> { - if (error != null) { - return; - } - final TLRPC.Updates updates = (TLRPC.Updates) response; - processUpdates(updates, false); - if (isChannel && !(inputUser instanceof TLRPC.TL_inputUserSelf)) { - AndroidUtilities.runOnUIThread(() -> loadFullChat(chat_id, 0, true), 1000); - } - }, ConnectionsManager.RequestFlagInvokeAfter); } else { - if (info instanceof TLRPC.TL_chatFull) { - TLRPC.Chat chat = getChat(chat_id); - chat.participants_count--; - ArrayList chatArrayList = new ArrayList<>(); - chatArrayList.add(chat); - getMessagesStorage().putUsersAndChats(null, chatArrayList, true, true); + if (forceDelete) { + TLRPC.TL_messages_deleteChat req = new TLRPC.TL_messages_deleteChat(); + req.chat_id = chat_id; + getConnectionsManager().sendRequest(req, (response, error) -> { - boolean changed = false; - for (int a = 0; a < info.participants.participants.size(); a++) { - TLRPC.ChatParticipant p = info.participants.participants.get(a); - if (p.user_id == user.id) { - info.participants.participants.remove(a); - changed = true; - break; - } - } - if (changed) { - getMessagesStorage().updateChatInfo(info, true); - getNotificationCenter().postNotificationName(NotificationCenter.chatInfoDidLoad, info, 0, false); - } - getNotificationCenter().postNotificationName(NotificationCenter.updateInterfaces, UPDATE_MASK_CHAT_MEMBERS); + }); + return; } + TLRPC.TL_messages_deleteChatUser req = new TLRPC.TL_messages_deleteChatUser(); + req.chat_id = chat_id; + req.user_id = getInputUser(user); + req.revoke_history = true; + request = req; + } + if (user.id == getUserConfig().getClientUserId()) { + deleteDialog(-chat_id, 0, revoke); } + getConnectionsManager().sendRequest(request, (response, error) -> { + if (error != null) { + return; + } + final TLRPC.Updates updates = (TLRPC.Updates) response; + processUpdates(updates, false); + if (isChannel && !(inputUser instanceof TLRPC.TL_inputUserSelf)) { + AndroidUtilities.runOnUIThread(() -> loadFullChat(chat_id, 0, true), 1000); + } + }, ConnectionsManager.RequestFlagInvokeAfter); } public void changeChatTitle(int chat_id, String title) { @@ -10987,6 +11078,7 @@ public boolean processUpdateArray(ArrayList updates, final ArrayLi SparseArray> deletedMessages = null; SparseArray> scheduledDeletedMessages = null; SparseArray> groupSpeakingActions = null; + LongSparseArray importingActions = null; SparseIntArray clearHistoryMessages = null; ArrayList chatInfoToUpdate = null; ArrayList updatesOnMainThread = null; @@ -11338,11 +11430,17 @@ public boolean processUpdateArray(ArrayList updates, final ArrayLi action = update.action; threadId = 0; } - if (userId != getUserConfig().getClientUserId()) { - long uid = -chatId; - if (uid == 0) { - uid = userId; + long uid = -chatId; + if (uid == 0) { + uid = userId; + } + if (action instanceof TLRPC.TL_sendMessageHistoryImportAction) { + if (importingActions == null) { + importingActions = new LongSparseArray<>(); } + TLRPC.TL_sendMessageHistoryImportAction importAction = (TLRPC.TL_sendMessageHistoryImportAction) action; + importingActions.put(uid, importAction.progress); + } else if (userId != getUserConfig().getClientUserId()) { if (action instanceof TLRPC.TL_speakingInGroupCallAction) { if (chatId != 0) { if (groupSpeakingActions == null) { @@ -12099,6 +12197,7 @@ public boolean processUpdateArray(ArrayList updates, final ArrayLi final ArrayList updateMessageThumbs = messageThumbs; final ArrayList folderUpdatesFinal = folderUpdates; final SparseArray> groupSpeakingActionsFinal = groupSpeakingActions; + final LongSparseArray importingActionsFinal = importingActions; AndroidUtilities.runOnUIThread(() -> { int updateMask = interfaceUpdateMaskFinal; @@ -12358,7 +12457,7 @@ public boolean processUpdateArray(ArrayList updates, final ArrayLi if (chat != null) { if (dialog == null && chat instanceof TLRPC.TL_channel && !chat.left) { Utilities.stageQueue.postRunnable(() -> getChannelDifference(update.channel_id, 1, 0, null)); - } else if (chat.left && dialog != null && (promoDialog == null || promoDialog.id != dialog.id)) { + } else if (ChatObject.isNotInChat(chat) && dialog != null && (promoDialog == null || promoDialog.id != dialog.id)) { deleteDialog(dialog.id, 0); } if (chat instanceof TLRPC.TL_channelForbidden || chat.kicked) { @@ -12394,6 +12493,10 @@ public boolean processUpdateArray(ArrayList updates, final ArrayLi VoIPService.getSharedInstance().onGroupCallUpdated(updateGroupCall.call); } } + TLRPC.Dialog dialog = dialogs_dict.get(-chat.id); + if (dialog != null) { + deleteDialog(dialog.id, 0); + } } updateMask |= UPDATE_MASK_CHAT; loadFullChat(update.chat_id, 0, true); @@ -12647,6 +12750,16 @@ public boolean processUpdateArray(ArrayList updates, final ArrayLi } } } + if (importingActionsFinal != null) { + for (int a = 0, N = importingActionsFinal.size(); a < N; a++) { + long did = importingActionsFinal.keyAt(a); + SendMessagesHelper.ImportingHistory importingHistory = getSendMessagesHelper().getImportingHistory(did); + if (importingHistory == null) { + continue; + } + importingHistory.setImportProgress(importingActionsFinal.valueAt(a)); + } + } if (webPagesFinal != null) { getNotificationCenter().postNotificationName(NotificationCenter.didReceivedWebpagesInUpdates, webPagesFinal); for (int i = 0; i < 2; i++) { @@ -13076,7 +13189,7 @@ protected boolean updateInterfaceWithMessages(final long uid, final ArrayList getNotificationCenter().postNotificationName(NotificationCenter.needReloadRecentDialogsSearch)); resetAllUnreadCounters(false); + updateWidgets(did); } catch (Exception e) { FileLog.e(e); } @@ -4506,6 +4523,7 @@ private void updateDialogsWithReadMessagesInternal(final ArrayList mess if (dialogsToUpdate.size() > 0 || dialogsToUpdateMentions.size() > 0) { database.beginTransaction(); if (dialogsToUpdate.size() > 0) { + ArrayList dids = new ArrayList<>(); SQLitePreparedStatement state = database.executeFast("UPDATE dialogs SET unread_count = ? WHERE did = ?"); for (int a = 0; a < dialogsToUpdate.size(); a++) { long did = dialogsToUpdate.keyAt(a); @@ -4526,8 +4544,10 @@ private void updateDialogsWithReadMessagesInternal(final ArrayList mess state.bindInteger(1, newCount); state.bindLong(2, did); state.step(); + dids.add(did); } state.dispose(); + updateWidgets(dids); } if (dialogsToUpdateMentions.size() > 0) { SQLitePreparedStatement state = database.executeFast("UPDATE dialogs SET unread_count_i = ? WHERE did = ?"); @@ -4868,15 +4888,32 @@ public void saveChatInviter(int chatId, int inviterId) { }); } + public void saveChatLinksCount(int chatId, int linksCount) { + storageQueue.postRunnable(() -> { + try { + SQLitePreparedStatement state = database.executeFast("UPDATE chat_settings_v2 SET links = ? WHERE uid = ?"); + state.requery(); + state.bindInteger(1, linksCount); + state.bindInteger(2, chatId); + state.step(); + state.dispose(); + } catch (Exception e) { + FileLog.e(e); + } + }); + } + public void updateChatInfo(final TLRPC.ChatFull info, final boolean ifExist) { storageQueue.postRunnable(() -> { try { int currentOnline = -1; int inviter = 0; - SQLiteCursor cursor = database.queryFinalized("SELECT online, inviter FROM chat_settings_v2 WHERE uid = " + info.id); + int links = 0; + SQLiteCursor cursor = database.queryFinalized("SELECT online, inviter, links FROM chat_settings_v2 WHERE uid = " + info.id); if (cursor.next()) { currentOnline = cursor.intValue(0); info.inviterId = cursor.intValue(1); + links = cursor.intValue(2); } cursor.dispose(); if (ifExist && currentOnline == -1) { @@ -4887,7 +4924,11 @@ public void updateChatInfo(final TLRPC.ChatFull info, final boolean ifExist) { info.online_count = currentOnline; } - SQLitePreparedStatement state = database.executeFast("REPLACE INTO chat_settings_v2 VALUES(?, ?, ?, ?, ?)"); + if (links >= 0) { + info.invitesCount = links; + } + + SQLitePreparedStatement state = database.executeFast("REPLACE INTO chat_settings_v2 VALUES(?, ?, ?, ?, ?, ?)"); NativeByteBuffer data = new NativeByteBuffer(info.getObjectSize()); info.serializeToStream(data); state.bindInteger(1, info.id); @@ -4895,6 +4936,7 @@ public void updateChatInfo(final TLRPC.ChatFull info, final boolean ifExist) { state.bindInteger(3, info.pinned_msg_id); state.bindInteger(4, info.online_count); state.bindInteger(5, info.inviterId); + state.bindInteger(6, info.invitesCount); state.step(); state.dispose(); data.reuse(); @@ -5231,7 +5273,7 @@ private TLRPC.ChatFull loadChatInfoInternal(final int chatId, boolean isChannel, boolean pinnedEndReached = false; try { - SQLiteCursor cursor = database.queryFinalized("SELECT info, pinned, online, inviter FROM chat_settings_v2 WHERE uid = " + chatId); + SQLiteCursor cursor = database.queryFinalized("SELECT info, pinned, online, inviter, links FROM chat_settings_v2 WHERE uid = " + chatId); if (cursor.next()) { NativeByteBuffer data = cursor.byteBufferValue(0); if (data != null) { @@ -5240,6 +5282,7 @@ private TLRPC.ChatFull loadChatInfoInternal(final int chatId, boolean isChannel, info.pinned_msg_id = cursor.intValue(1); info.online_count = cursor.intValue(2); info.inviterId = cursor.intValue(3); + info.invitesCount = cursor.intValue(4); } } cursor.dispose(); @@ -5465,6 +5508,7 @@ public void processPendingRead(final long dialog_id, final long maxPositiveId, f dialogsToUpdate.put(dialog_id, unreadCount); updateFiltersReadCounter(dialogsToUpdate, null, true); } + updateWidgets(dialog_id); } catch (Exception e) { FileLog.e(e); } @@ -6110,7 +6154,7 @@ public Runnable getMessagesInternal(long dialogId, long mergeDialogId, int count if (load_type == 3 && minDate == 0) { cursor = database.queryFinalized("SELECT inbox_max, unread_count, date, unread_count_i FROM dialogs WHERE did = " + dialogId); if (cursor.next()) { - min_unread_id = cursor.intValue(0) + 1; + min_unread_id = Math.max(1, cursor.intValue(0)) + 1; count_unread = cursor.intValue(1); max_unread_date = cursor.intValue(2); mentions_unread = cursor.intValue(3); @@ -6120,7 +6164,7 @@ public Runnable getMessagesInternal(long dialogId, long mergeDialogId, int count if (load_type == 2) { cursor = database.queryFinalized("SELECT inbox_max, unread_count, date, unread_count_i FROM dialogs WHERE did = " + dialogId); if (cursor.next()) { - messageMaxId = max_id_query = min_unread_id = cursor.intValue(0); + messageMaxId = max_id_query = min_unread_id = Math.max(1, cursor.intValue(0)); count_unread = cursor.intValue(1); max_unread_date = cursor.intValue(2); mentions_unread = cursor.intValue(3); @@ -6793,6 +6837,122 @@ public Object[] getSentFile(final String path, final int type) { return result[0] != null ? result : null; } + private void updateWidgets(long did) { + ArrayList dids = new ArrayList<>(); + dids.add(did); + updateWidgets(dids); + } + + private void updateWidgets(ArrayList dids) { + try { + AppWidgetManager appWidgetManager = null; + SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT DISTINCT id FROM shortcut_widget WHERE did IN(%s)", TextUtils.join(",", dids))); + while (cursor.next()) { + if (appWidgetManager == null) { + appWidgetManager = AppWidgetManager.getInstance(ApplicationLoader.applicationContext); + } + appWidgetManager.notifyAppWidgetViewDataChanged(cursor.intValue(0), R.id.list_view); + } + cursor.dispose(); + } catch (Exception e) { + FileLog.e(e); + } + } + + public void putWidgetDialogs(int widgetId, ArrayList dids) { + storageQueue.postRunnable(() -> { + try { + SQLitePreparedStatement state = database.executeFast("REPLACE INTO shortcut_widget VALUES(?, ?, ?)"); + for (int a = 0, N = dids.size(); a < N; a++) { + long did = dids.get(a); + state.requery(); + state.bindInteger(1, widgetId); + state.bindInteger(2, (int) did); + state.bindInteger(3, a); + state.step(); + } + state.dispose(); + } catch (Exception e) { + FileLog.e(e); + } + }); + } + + public void clearWidgetDialogs(int widgetId) { + storageQueue.postRunnable(() -> { + try { + database.executeFast("DELETE FROM shortcut_widget WHERE id = " + widgetId).stepThis().dispose(); + } catch (Exception e) { + FileLog.e(e); + } + }); + } + + public void getWidgetDialogs(int widgetId, ArrayList dids, LongSparseArray dialogs, LongSparseArray messages, ArrayList users, ArrayList chats) { + final CountDownLatch countDownLatch = new CountDownLatch(1); + storageQueue.postRunnable(() -> { + try { + ArrayList usersToLoad = new ArrayList<>(); + ArrayList chatsToLoad = new ArrayList<>(); + SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT did FROM shortcut_widget WHERE id = %d ORDER BY ord ASC", widgetId)); + while (cursor.next()) { + int id = cursor.intValue(0); + dids.add(id); + if (id > 0) { + usersToLoad.add(id); + } else { + chatsToLoad.add(-id); + } + } + cursor.dispose(); + cursor = database.queryFinalized(String.format(Locale.US, "SELECT d.did, d.last_mid, d.unread_count, d.date, m.data, m.read_state, m.mid, m.send_state, m.date FROM dialogs as d LEFT JOIN messages as m ON d.last_mid = m.mid WHERE d.did IN(%s)", TextUtils.join(",", dids))); + while (cursor.next()) { + long dialogId = cursor.longValue(0); + TLRPC.Dialog dialog = new TLRPC.TL_dialog(); + dialog.id = dialogId; + dialog.top_message = cursor.intValue(1); + dialog.unread_count = cursor.intValue(2); + dialog.last_message_date = cursor.intValue(3); + + dialogs.put(dialog.id, dialog); + + NativeByteBuffer data = cursor.byteBufferValue(4); + if (data != null) { + TLRPC.Message message = TLRPC.Message.TLdeserialize(data, data.readInt32(false), false); + message.readAttachPath(data, getUserConfig().clientUserId); + data.reuse(); + MessageObject.setUnreadFlags(message, cursor.intValue(5)); + message.id = cursor.intValue(6); + message.send_state = cursor.intValue(7); + int date = cursor.intValue(8); + if (date != 0) { + dialog.last_message_date = date; + } + message.dialog_id = dialog.id; + messages.put(dialog.id, message); + addUsersAndChatsFromMessage(message, usersToLoad, chatsToLoad); + } + } + cursor.dispose(); + if (!chatsToLoad.isEmpty()) { + getChatsInternal(TextUtils.join(",", chatsToLoad), chats); + } + if (!usersToLoad.isEmpty()) { + getUsersInternal(TextUtils.join(",", usersToLoad), users); + } + } catch (Exception e) { + FileLog.e(e); + } finally { + countDownLatch.countDown(); + } + }); + try { + countDownLatch.await(); + } catch (Exception e) { + FileLog.e(e); + } + } + public void putSentFile(final String path, final TLObject file, final int type, String parent) { if (path == null || file == null || parent == null) { return; @@ -7158,12 +7318,14 @@ private void putUsersInternal(ArrayList users) throws Exception { oldUser.username = null; oldUser.flags = oldUser.flags & ~8; } - if (user.photo != null) { - oldUser.photo = user.photo; - oldUser.flags |= 32; - } else { - oldUser.photo = null; - oldUser.flags = oldUser.flags & ~32; + if (user.apply_min_photo) { + if (user.photo != null) { + oldUser.photo = user.photo; + oldUser.flags |= 32; + } else { + oldUser.photo = null; + oldUser.flags = oldUser.flags & ~32; + } } user = oldUser; } @@ -8338,6 +8500,7 @@ private void putMessagesInternal(final ArrayList messages, final SQLitePreparedStatement state_dialogs_replace = database.executeFast("REPLACE INTO dialogs VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); SQLitePreparedStatement state_dialogs_update = database.executeFast("UPDATE dialogs SET date = ?, unread_count = ?, last_mid = ?, unread_count_i = ? WHERE did = ?"); + ArrayList dids = new ArrayList<>(); for (int a = 0; a < messagesMap.size(); a++) { long key = messagesMap.keyAt(a); if (key == 0) { @@ -8395,6 +8558,7 @@ private void putMessagesInternal(final ArrayList messages, final newMentionsCounts.put(key, mentions_count); } + dids.add(key); if (exists) { state_dialogs_update.requery(); state_dialogs_update.bindInteger(1, message != null && (!doNotUpdateDialogDate || dialog_date == 0) ? message.date : dialog_date); @@ -8465,6 +8629,7 @@ private void putMessagesInternal(final ArrayList messages, final final int downloadMediaMaskFinal = downloadMediaMask; AndroidUtilities.runOnUIThread(() -> getDownloadController().newDownloadObjectsAvailable(downloadMediaMaskFinal)); } + updateWidgets(dids); } } catch (Exception e) { FileLog.e(e); @@ -9164,6 +9329,7 @@ private ArrayList markMessagesAsDeletedInternal(final ArrayList m if (dialogsToUpdate.size() != 0) { resetAllUnreadCounters(false); } + updateWidgets(dialogsIds); } return dialogsIds; } catch (Exception e) { @@ -9440,6 +9606,7 @@ private ArrayList markMessagesAsDeletedInternal(final int channelId, final database.executeFast(String.format(Locale.US, "DELETE FROM messages WHERE uid = %d AND mid <= %d", -channelId, maxMessageId)).stepThis().dispose(); database.executeFast(String.format(Locale.US, "DELETE FROM media_v2 WHERE uid = %d AND mid <= %d", -channelId, maxMessageId)).stepThis().dispose(); database.executeFast(String.format(Locale.US, "UPDATE media_counts_v2 SET old = 1 WHERE uid = %d", -channelId)).stepThis().dispose(); + updateWidgets(dialogsIds); return dialogsIds; } catch (Exception e) { FileLog.e(e); @@ -10790,11 +10957,27 @@ public void setDialogsFolderId(final ArrayList peers, Array private void checkIfFolderEmptyInternal(int folderId) { try { SQLiteCursor cursor = database.queryFinalized("SELECT did FROM dialogs WHERE folder_id = ?", folderId); - if (!cursor.next()) { + boolean isEmpty = true; + while (cursor.next()) { + long did = cursor.longValue(0); + int lowerId = (int) did; + int highId = (int) (did >> 32); + if (lowerId > 0 || highId != 0 && lowerId == 0) { + isEmpty = false; + break; + } else { + TLRPC.Chat chat = getChat(-lowerId); + if (!ChatObject.isNotInChat(chat) && chat.migrated_to == null) { + isEmpty = false; + break; + } + } + } + cursor.dispose(); + if (isEmpty) { AndroidUtilities.runOnUIThread(() -> getMessagesController().onFolderEmpty(folderId)); database.executeFast("DELETE FROM dialogs WHERE did = " + DialogObject.makeFolderDialogId(folderId)).stepThis().dispose(); } - cursor.dispose(); } catch (Exception e) { FileLog.e(e); } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationCenter.java b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationCenter.java index 68baa2e16f8..f882b02a2ae 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationCenter.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationCenter.java @@ -113,6 +113,8 @@ public class NotificationCenter { public static final int newSuggestionsAvailable = totalEvents++; public static final int didLoadChatInviter = totalEvents++; public static final int didLoadChatAdmins = totalEvents++; + public static final int historyImportProgressChanged = totalEvents++; + public static final int dialogDeleted = totalEvents++; public static final int walletPendingTransactionsChanged = totalEvents++; public static final int walletSyncProgressChanged = totalEvents++; @@ -152,6 +154,7 @@ public class NotificationCenter { public static final int didStartedCall = totalEvents++; public static final int groupCallUpdated = totalEvents++; + public static final int applyGroupCallVisibleParticipants = totalEvents++; public static final int groupCallTypingsUpdated = totalEvents++; public static final int didEndCall = totalEvents++; public static final int closeInCallActivity = totalEvents++; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java index 713cf02a897..e0920d0c032 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java @@ -594,8 +594,6 @@ private int addToPopupMessages(final ArrayList popupArrayAdd, Mes if (lower_id != 0) { if (preferences.getBoolean("custom_" + dialog_id, false)) { popup = preferences.getInt("popup_" + dialog_id, 0); - } else { - popup = 0; } if (popup == 0) { if (isChannel) { @@ -2082,7 +2080,7 @@ private String getStringForMessage(MessageObject messageObject, boolean shortMes } else if (messageObject.messageOwner.action instanceof TLRPC.TL_messageActionScreenshotTaken) { msg = messageObject.messageText.toString(); } else if (messageObject.messageOwner.action instanceof TLRPC.TL_messageActionPinMessage) { - if (chat != null && (!ChatObject.isChannel(chat) || chat.megagroup)) { + if (!ChatObject.isChannel(chat) || chat.megagroup) { if (messageObject.replyMessageObject == null) { msg = LocaleController.formatString("NotificationActionPinnedNoText", R.string.NotificationActionPinnedNoText, name, chat.title); } else { @@ -2154,7 +2152,7 @@ private String getStringForMessage(MessageObject messageObject, boolean shortMes msg = LocaleController.formatString("NotificationActionPinnedNoText", R.string.NotificationActionPinnedNoText, name, chat.title); } } - } else if (chat != null) { + } else { if (messageObject.replyMessageObject == null) { msg = LocaleController.formatString("NotificationActionPinnedNoTextChannel", R.string.NotificationActionPinnedNoTextChannel, chat.title); } else { @@ -2226,78 +2224,6 @@ private String getStringForMessage(MessageObject messageObject, boolean shortMes msg = LocaleController.formatString("NotificationActionPinnedNoTextChannel", R.string.NotificationActionPinnedNoTextChannel, chat.title); } } - } else { - if (messageObject.replyMessageObject == null) { - msg = LocaleController.formatString("NotificationActionPinnedNoTextUser", R.string.NotificationActionPinnedNoTextUser, name); - } else { - MessageObject object = messageObject.replyMessageObject; - if (object.isMusic()) { - msg = LocaleController.formatString("NotificationActionPinnedMusicUser", R.string.NotificationActionPinnedMusicUser, name); - } else if (object.isVideo()) { - if (Build.VERSION.SDK_INT >= 19 && !TextUtils.isEmpty(object.messageOwner.message)) { - String message = "\uD83D\uDCF9 " + object.messageOwner.message; - msg = LocaleController.formatString("NotificationActionPinnedTextUser", R.string.NotificationActionPinnedTextUser, name, message); - } else { - msg = LocaleController.formatString("NotificationActionPinnedVideoUser", R.string.NotificationActionPinnedVideoUser, name); - } - } else if (object.isGif()) { - if (Build.VERSION.SDK_INT >= 19 && !TextUtils.isEmpty(object.messageOwner.message)) { - String message = "\uD83C\uDFAC " + object.messageOwner.message; - msg = LocaleController.formatString("NotificationActionPinnedTextUser", R.string.NotificationActionPinnedTextUser, name, message); - } else { - msg = LocaleController.formatString("NotificationActionPinnedGifUser", R.string.NotificationActionPinnedGifUser, name); - } - } else if (object.isVoice()) { - msg = LocaleController.formatString("NotificationActionPinnedVoiceUser", R.string.NotificationActionPinnedVoiceUser, name); - } else if (object.isRoundVideo()) { - msg = LocaleController.formatString("NotificationActionPinnedRoundUser", R.string.NotificationActionPinnedRoundUser, name); - } else if (object.isSticker() || object.isAnimatedSticker()) { - String emoji = object.getStickerEmoji(); - if (emoji != null) { - msg = LocaleController.formatString("NotificationActionPinnedStickerEmojiUser", R.string.NotificationActionPinnedStickerEmojiUser, name, emoji); - } else { - msg = LocaleController.formatString("NotificationActionPinnedStickerUser", R.string.NotificationActionPinnedStickerUser, name); - } - } else if (object.messageOwner.media instanceof TLRPC.TL_messageMediaDocument) { - if (Build.VERSION.SDK_INT >= 19 && !TextUtils.isEmpty(object.messageOwner.message)) { - String message = "\uD83D\uDCCE " + object.messageOwner.message; - msg = LocaleController.formatString("NotificationActionPinnedTextUser", R.string.NotificationActionPinnedTextUser, name, message); - } else { - msg = LocaleController.formatString("NotificationActionPinnedFileUser", R.string.NotificationActionPinnedFileUser, name); - } - } else if (object.messageOwner.media instanceof TLRPC.TL_messageMediaGeo || object.messageOwner.media instanceof TLRPC.TL_messageMediaVenue) { - msg = LocaleController.formatString("NotificationActionPinnedGeoUser", R.string.NotificationActionPinnedGeoUser, name); - } else if (object.messageOwner.media instanceof TLRPC.TL_messageMediaGeoLive) { - msg = LocaleController.formatString("NotificationActionPinnedGeoLiveUser", R.string.NotificationActionPinnedGeoLiveUser, name); - } else if (object.messageOwner.media instanceof TLRPC.TL_messageMediaContact) { - TLRPC.TL_messageMediaContact mediaContact = (TLRPC.TL_messageMediaContact) messageObject.messageOwner.media; - msg = LocaleController.formatString("NotificationActionPinnedContactUser", R.string.NotificationActionPinnedContactUser, name, ContactsController.formatName(mediaContact.first_name, mediaContact.last_name)); - } else if (object.messageOwner.media instanceof TLRPC.TL_messageMediaPoll) { - TLRPC.TL_messageMediaPoll mediaPoll = (TLRPC.TL_messageMediaPoll) object.messageOwner.media; - if (mediaPoll.poll.quiz) { - msg = LocaleController.formatString("NotificationActionPinnedQuizUser", R.string.NotificationActionPinnedQuizUser, name, mediaPoll.poll.question); - } else { - msg = LocaleController.formatString("NotificationActionPinnedPollUser", R.string.NotificationActionPinnedPollUser, name, mediaPoll.poll.question); - } - } else if (object.messageOwner.media instanceof TLRPC.TL_messageMediaPhoto) { - if (Build.VERSION.SDK_INT >= 19 && !TextUtils.isEmpty(object.messageOwner.message)) { - String message = "\uD83D\uDDBC " + object.messageOwner.message; - msg = LocaleController.formatString("NotificationActionPinnedTextUser", R.string.NotificationActionPinnedTextUser, name, message); - } else { - msg = LocaleController.formatString("NotificationActionPinnedPhotoUser", R.string.NotificationActionPinnedPhotoUser, name); - } - } else if (object.messageOwner.media instanceof TLRPC.TL_messageMediaGame) { - msg = LocaleController.formatString("NotificationActionPinnedGameUser", R.string.NotificationActionPinnedGameUser, name); - } else if (object.messageText != null && object.messageText.length() > 0) { - CharSequence message = object.messageText; - if (message.length() > 20) { - message = message.subSequence(0, 20) + "..."; - } - msg = LocaleController.formatString("NotificationActionPinnedTextUser", R.string.NotificationActionPinnedTextUser, name, message); - } else { - msg = LocaleController.formatString("NotificationActionPinnedNoTextUser", R.string.NotificationActionPinnedNoTextUser, name); - } - } } } else if (messageObject.messageOwner.action instanceof TLRPC.TL_messageActionGameScore) { msg = messageObject.messageText.toString(); @@ -2637,85 +2563,95 @@ public void deleteNotificationChannel(long dialogId) { deleteNotificationChannel(dialogId, -1); } - public void deleteNotificationChannel(long dialogId, int what) { + private void deleteNotificationChannelInternal(long dialogId, int what) { if (Build.VERSION.SDK_INT < 26) { return; } - notificationsQueue.postRunnable(() -> { - try { - SharedPreferences preferences = getAccountInstance().getNotificationsSettings(); - SharedPreferences.Editor editor = preferences.edit(); - if (what == 0 || what == -1) { - String key = "org.telegram.key" + dialogId; - String channelId = preferences.getString(key, null); - if (channelId != null) { - editor.remove(key).remove(key + "_s"); - systemNotificationManager.deleteNotificationChannel(channelId); - } + try { + SharedPreferences preferences = getAccountInstance().getNotificationsSettings(); + SharedPreferences.Editor editor = preferences.edit(); + if (what == 0 || what == -1) { + String key = "org.telegram.key" + dialogId; + String channelId = preferences.getString(key, null); + if (channelId != null) { + editor.remove(key).remove(key + "_s"); + systemNotificationManager.deleteNotificationChannel(channelId); } - if (what == 1 || what == -1) { - String key = "org.telegram.keyia" + dialogId; - String channelId = preferences.getString(key, null); - if (channelId != null) { - editor.remove(key).remove(key + "_s"); - systemNotificationManager.deleteNotificationChannel(channelId); - } + } + if (what == 1 || what == -1) { + String key = "org.telegram.keyia" + dialogId; + String channelId = preferences.getString(key, null); + if (channelId != null) { + editor.remove(key).remove(key + "_s"); + systemNotificationManager.deleteNotificationChannel(channelId); } - editor.commit(); - } catch (Exception e) { - FileLog.e(e); } - }); + editor.commit(); + } catch (Exception e) { + FileLog.e(e); + } + } + + public void deleteNotificationChannel(long dialogId, int what) { + if (Build.VERSION.SDK_INT < 26) { + return; + } + notificationsQueue.postRunnable(() -> deleteNotificationChannelInternal(dialogId, what)); } public void deleteNotificationChannelGlobal(int type) { deleteNotificationChannelGlobal(type, -1); } - public void deleteNotificationChannelGlobal(int type, int what) { + public void deleteNotificationChannelGlobalInternal(int type, int what) { if (Build.VERSION.SDK_INT < 26) { return; } - notificationsQueue.postRunnable(() -> { - try { - SharedPreferences preferences = getAccountInstance().getNotificationsSettings(); - SharedPreferences.Editor editor = preferences.edit(); - if (what == 0 || what == -1) { - String key; - if (type == TYPE_CHANNEL) { - key = "channels"; - } else if (type == TYPE_GROUP) { - key = "groups"; - } else { - key = "private"; - } - String channelId = preferences.getString(key, null); - if (channelId != null) { - editor.remove(key).remove(key + "_s"); - systemNotificationManager.deleteNotificationChannel(channelId); - } + try { + SharedPreferences preferences = getAccountInstance().getNotificationsSettings(); + SharedPreferences.Editor editor = preferences.edit(); + if (what == 0 || what == -1) { + String key; + if (type == TYPE_CHANNEL) { + key = "channels"; + } else if (type == TYPE_GROUP) { + key = "groups"; + } else { + key = "private"; } + String channelId = preferences.getString(key, null); + if (channelId != null) { + editor.remove(key).remove(key + "_s"); + systemNotificationManager.deleteNotificationChannel(channelId); + } + } - if (what == 1 || what == -1) { - String key; - if (type == TYPE_CHANNEL) { - key = "channels_ia"; - } else if (type == TYPE_GROUP) { - key = "groups_ia"; - } else { - key = "private_ia"; - } - String channelId = preferences.getString(key, null); - if (channelId != null) { - editor.remove(key).remove(key + "_s"); - systemNotificationManager.deleteNotificationChannel(channelId); - } + if (what == 1 || what == -1) { + String key; + if (type == TYPE_CHANNEL) { + key = "channels_ia"; + } else if (type == TYPE_GROUP) { + key = "groups_ia"; + } else { + key = "private_ia"; + } + String channelId = preferences.getString(key, null); + if (channelId != null) { + editor.remove(key).remove(key + "_s"); + systemNotificationManager.deleteNotificationChannel(channelId); } - editor.commit(); - } catch (Exception e) { - FileLog.e(e); } - }); + editor.commit(); + } catch (Exception e) { + FileLog.e(e); + } + } + + public void deleteNotificationChannelGlobal(int type, int what) { + if (Build.VERSION.SDK_INT < 26) { + return; + } + notificationsQueue.postRunnable(() -> deleteNotificationChannelGlobalInternal(type, what)); } public void deleteAllNotificationChannels() { @@ -2748,9 +2684,9 @@ private boolean unsupportedNotificationShortcut() { } @SuppressLint("RestrictedApi") - private void createNotificationShortcut(NotificationCompat.Builder builder, int did, String name, TLRPC.User user, TLRPC.Chat chat, Person person) { + private String createNotificationShortcut(NotificationCompat.Builder builder, int did, String name, TLRPC.User user, TLRPC.Chat chat, Person person) { if (unsupportedNotificationShortcut() || ChatObject.isChannel(chat) && !chat.megagroup) { - return; + return null; } try { String id = "ndid_" + did; @@ -2782,7 +2718,7 @@ private void createNotificationShortcut(NotificationCompat.Builder builder, int } intent.putExtra("currentAccount", currentAccount); bubbleBuilder.setIntent(PendingIntent.getActivity(ApplicationLoader.applicationContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)); - bubbleBuilder.setSuppressNotification(true); + bubbleBuilder.setSuppressNotification(opened_dialog_id == did); bubbleBuilder.setAutoExpandBubble(false); bubbleBuilder.setDesiredHeight(AndroidUtilities.dp(640)); if (avatar != null) { @@ -2795,9 +2731,11 @@ private void createNotificationShortcut(NotificationCompat.Builder builder, int } } builder.setBubbleMetadata(bubbleBuilder.build()); + return id; } catch (Exception e) { FileLog.e(e); } + return null; } @TargetApi(26) @@ -3650,10 +3588,7 @@ private void showOrUpdateNotification(boolean notifyAboutLast) { mBuilder.addAction(R.drawable.ic_ab_reply, LocaleController.getString("Reply", R.string.Reply), PendingIntent.getBroadcast(ApplicationLoader.applicationContext, 2, replyIntent, PendingIntent.FLAG_UPDATE_CURRENT)); } } - if (Build.VERSION.SDK_INT >= 26) { - mBuilder.setChannelId(validateChannelId(dialog_id, chatName, vibrationPattern, ledColor, sound, configImportance, isDefault, isInApp, notifyDisabled, chatType)); - } - showExtraNotifications(mBuilder, detailText); + showExtraNotifications(mBuilder, detailText, dialog_id, chatName, vibrationPattern, ledColor, sound, configImportance, isDefault, isInApp, notifyDisabled, chatType); scheduleNotificationRepeat(); } catch (Exception e) { FileLog.e(e); @@ -3669,8 +3604,47 @@ private void setNotificationChannel(Notification mainNotification, NotificationC } } + private void resetNotificationSound(NotificationCompat.Builder notificationBuilder, long dialogId, String chatName, long[] vibrationPattern, int ledColor, Uri sound, int importance, boolean isDefault, boolean isInApp, boolean isSilent, int chatType) { + Uri defaultSound = Settings.System.DEFAULT_RINGTONE_URI; + if (defaultSound != null && sound != null && !TextUtils.equals(defaultSound.toString(), sound.toString())) { + SharedPreferences preferences = getAccountInstance().getNotificationsSettings(); + SharedPreferences.Editor editor = preferences.edit(); + + String newSound = defaultSound.toString(); + String ringtoneName = LocaleController.getString("DefaultRingtone", R.string.DefaultRingtone); + if (isDefault) { + if (chatType == TYPE_CHANNEL) { + editor.putString("ChannelSound", ringtoneName); + } else if (chatType == TYPE_GROUP) { + editor.putString("GroupSound", ringtoneName); + } else { + editor.putString("GlobalSound", ringtoneName); + } + if (chatType == TYPE_CHANNEL) { + editor.putString("ChannelSoundPath", newSound); + } else if (chatType == TYPE_GROUP) { + editor.putString("GroupSoundPath", newSound); + } else { + editor.putString("GlobalSoundPath", newSound); + } + getNotificationsController().deleteNotificationChannelGlobalInternal(chatType, -1); + } else { + editor.putString("sound_" + dialogId, ringtoneName); + editor.putString("sound_path_" + dialogId, newSound); + deleteNotificationChannelInternal(dialogId, -1); + } + editor.commit(); + sound = Settings.System.DEFAULT_RINGTONE_URI; + notificationBuilder.setChannelId(validateChannelId(dialogId, chatName, vibrationPattern, ledColor, sound, importance, isDefault, isInApp, isSilent, chatType)); + notificationManager.notify(notificationId, notificationBuilder.build()); + } + } + @SuppressLint("InlinedApi") - private void showExtraNotifications(NotificationCompat.Builder notificationBuilder, String summary) { + private void showExtraNotifications(NotificationCompat.Builder notificationBuilder, String summary, long dialogId, String chatName, long[] vibrationPattern, int ledColor, Uri sound, int importance, boolean isDefault, boolean isInApp, boolean isSilent, int chatType) { + if (Build.VERSION.SDK_INT >= 26) { + notificationBuilder.setChannelId(validateChannelId(dialogId, chatName, vibrationPattern, ledColor, sound, importance, isDefault, isInApp, isSilent, chatType)); + } Notification mainNotification = notificationBuilder.build(); if (Build.VERSION.SDK_INT < 18) { notificationManager.notify(notificationId, mainNotification); @@ -3696,7 +3670,7 @@ private void showExtraNotifications(NotificationCompat.Builder notificationBuild if (arrayList == null) { arrayList = new ArrayList<>(); messagesByDialogs.put(dialog_id, arrayList); - sortedDialogs.add(0, dialog_id); + sortedDialogs.add(dialog_id); } arrayList.add(messageObject); } @@ -3706,18 +3680,31 @@ private void showExtraNotifications(NotificationCompat.Builder notificationBuild class NotificationHolder { int id; - Notification notification; + int lowerId; + String name; + TLRPC.User user; + TLRPC.Chat chat; + NotificationCompat.Builder notification; - NotificationHolder(int i, Notification n) { + NotificationHolder(int i, int li, String n, TLRPC.User u, TLRPC.Chat c, NotificationCompat.Builder builder) { id = i; - notification = n; + name = n; + user = u; + chat = c; + notification = builder; + lowerId = li; } void call() { if (BuildVars.LOGS_ENABLED) { FileLog.w("show dialog notification with id " + id); } - notificationManager.notify(id, notification); + try { + notificationManager.notify(id, notification.build()); + } catch (SecurityException e) { + FileLog.e(e); + resetNotificationSound(notification, dialogId, chatName, vibrationPattern, ledColor, sound, importance, isDefault, isInApp, isSilent, chatType); + } } } @@ -3727,7 +3714,7 @@ void call() { serializedNotifications = new JSONArray(); } - boolean useSummaryNotification = Build.VERSION.SDK_INT <= Build.VERSION_CODES.O_MR1 || Build.VERSION.SDK_INT > Build.VERSION_CODES.O_MR1 && sortedDialogs.size() > 1; + boolean useSummaryNotification = Build.VERSION.SDK_INT <= Build.VERSION_CODES.O_MR1 || sortedDialogs.size() > 1; if (useSummaryNotification && Build.VERSION.SDK_INT >= 26) { checkOtherNotificationsChannel(); } @@ -3735,12 +3722,8 @@ void call() { int selfUserId = getUserConfig().getClientUserId(); boolean waitingForPasscode = AndroidUtilities.needShowPasscode() || SharedConfig.isWaitingForPasscodeEnter; - int maxCount; - if (UserConfig.getActivatedAccountsCount() >= 3) { - maxCount = 7; - } else { - maxCount = 10; - } + int maxCount = 7; + LongSparseArray personCache = new LongSparseArray<>(); for (int b = 0, size = sortedDialogs.size(); b < size; b++) { if (holders.size() >= maxCount) { break; @@ -3782,7 +3765,6 @@ void call() { Bitmap avatarBitmap = null; File avatalFile = null; boolean canReply; - LongSparseArray personCache = new LongSparseArray<>(); if (lowerId != 0) { canReply = lowerId != 777000; @@ -4021,7 +4003,7 @@ void call() { File avatar = null; if (lowerId > 0 || isChannel) { avatar = avatalFile; - } else if (lowerId < 0) { + } else { int fromId = messageObject.getSenderId(); TLRPC.User sender = getMessagesController().getUser(fromId); if (sender == null) { @@ -4199,7 +4181,7 @@ void call() { .setStyle(messagingStyle) .setContentIntent(contentIntent) .extend(wearableExtender) - .setSortKey("" + (Long.MAX_VALUE - date)) + .setSortKey(String.valueOf(Long.MAX_VALUE - date)) .setCategory(NotificationCompat.CATEGORY_MESSAGE); Intent dismissIntent = new Intent(ApplicationLoader.applicationContext, NotificationDismissReceiver.class); @@ -4248,11 +4230,6 @@ void call() { } } } - if (Build.VERSION.SDK_INT >= 29) { - if (lowerId != 0) { - createNotificationShortcut(builder, lowerId, name, user, chat, personCache.get(lowerId)); - } - } } if (chat == null && user != null && user.phone != null && user.phone.length() > 0) { @@ -4262,7 +4239,7 @@ void call() { if (Build.VERSION.SDK_INT >= 26) { setNotificationChannel(mainNotification, builder, useSummaryNotification); } - holders.add(new NotificationHolder(internalId, builder.build())); + holders.add(new NotificationHolder(internalId, lowerId, name, user, chat, builder)); wearNotificationsIds.put(dialog_id, internalId); if (lowerId != 0) { @@ -4281,7 +4258,7 @@ void call() { } if (lowerId > 0) { serializedChat.put("type", "user"); - } else if (lowerId < 0) { + } else { if (isChannel || isSupergroup) { serializedChat.put("type", "channel"); } else { @@ -4299,27 +4276,17 @@ void call() { if (BuildVars.LOGS_ENABLED) { FileLog.d("show summary with id " + notificationId); } - notificationManager.notify(notificationId, mainNotification); + try { + notificationManager.notify(notificationId, mainNotification); + } catch (SecurityException e) { + FileLog.e(e); + resetNotificationSound(notificationBuilder, dialogId, chatName, vibrationPattern, ledColor, sound, importance, isDefault, isInApp, isSilent, chatType); + } } else { if (openedInBubbleDialogs.isEmpty()) { notificationManager.cancel(notificationId); } } - ArrayList ids = new ArrayList<>(holders.size()); - for (int a = 0, size = holders.size(); a < size; a++) { - NotificationHolder holder = holders.get(a); - holder.call(); - if (!unsupportedNotificationShortcut()) { - ids.add(holder.notification.getShortcutId()); - } - } - if (!unsupportedNotificationShortcut()) { - try { - ShortcutManagerCompat.removeDynamicShortcuts(ApplicationLoader.applicationContext, ids); - } catch (Exception e) { - FileLog.e(e); - } - } for (int a = 0; a < oldIdsWear.size(); a++) { long did = oldIdsWear.keyAt(a); @@ -4332,6 +4299,23 @@ void call() { } notificationManager.cancel(id); } + + ArrayList ids = new ArrayList<>(holders.size()); + for (int a = 0, size = holders.size(); a < size; a++) { + NotificationHolder holder = holders.get(a); + ids.clear(); + if (Build.VERSION.SDK_INT >= 29 && holder.lowerId != 0) { + String shortcutId = createNotificationShortcut(holder.notification, holder.lowerId, holder.name, holder.user, holder.chat, personCache.get(holder.lowerId)); + if (shortcutId != null) { + ids.add(shortcutId); + } + } + holder.call(); + if (!unsupportedNotificationShortcut() && !ids.isEmpty()) { + ShortcutManagerCompat.removeDynamicShortcuts(ApplicationLoader.applicationContext, ids); + } + } + if (serializedNotifications != null) { try { JSONObject s = new JSONObject(); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/SecretChatHelper.java b/TMessagesProj/src/main/java/org/telegram/messenger/SecretChatHelper.java index 4266e86603e..cbe092d018e 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/SecretChatHelper.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/SecretChatHelper.java @@ -244,6 +244,9 @@ protected void processUpdateEncryption(TLRPC.TL_updateEncryption update, Concurr getNotificationCenter().postNotificationName(NotificationCenter.encryptedChatUpdated, newChat); }); } + if (newChat instanceof TLRPC.TL_encryptedChatDiscarded && newChat.history_deleted) { + AndroidUtilities.runOnUIThread(() -> getMessagesController().deleteDialog(dialog_id, 0)); + } } public void sendMessagesDeleteMessage(TLRPC.EncryptedChat encryptedChat, ArrayList random_ids, TLRPC.Message resendMessage) { @@ -1659,7 +1662,7 @@ protected ArrayList decryptMessage(TLRPC.EncryptedMessage message getMessagesStorage().updateEncryptedChat(newChat); getNotificationCenter().postNotificationName(NotificationCenter.encryptedChatUpdated, newChat); }); - declineSecretChat(chat.id); + declineSecretChat(chat.id, false); return null; } @@ -1733,7 +1736,7 @@ public void processAcceptedSecretChat(final TLRPC.EncryptedChat encryptedChat) { BigInteger i_authKey = new BigInteger(1, encryptedChat.g_a_or_b); if (!Utilities.isGoodGaAndGb(i_authKey, p)) { - declineSecretChat(encryptedChat.id); + declineSecretChat(encryptedChat.id, false); return; } @@ -1789,13 +1792,14 @@ public void processAcceptedSecretChat(final TLRPC.EncryptedChat encryptedChat) { getMessagesController().putEncryptedChat(newChat, false); getNotificationCenter().postNotificationName(NotificationCenter.encryptedChatUpdated, newChat); }); - declineSecretChat(encryptedChat.id); + declineSecretChat(encryptedChat.id, false); } } - public void declineSecretChat(int chat_id) { + public void declineSecretChat(int chat_id, boolean revoke) { TLRPC.TL_messages_discardEncryption req = new TLRPC.TL_messages_discardEncryption(); req.chat_id = chat_id; + req.delete_history = revoke; getConnectionsManager().sendRequest(req, (response, error) -> { }); @@ -1815,7 +1819,7 @@ public void acceptSecretChat(final TLRPC.EncryptedChat encryptedChat) { if (response instanceof TLRPC.TL_messages_dhConfig) { if (!Utilities.isGoodPrime(res.p, res.g)) { acceptingChats.remove(encryptedChat.id); - declineSecretChat(encryptedChat.id); + declineSecretChat(encryptedChat.id, false); return; } @@ -1838,7 +1842,7 @@ public void acceptSecretChat(final TLRPC.EncryptedChat encryptedChat) { if (!Utilities.isGoodGaAndGb(g_a, p)) { acceptingChats.remove(encryptedChat.id); - declineSecretChat(encryptedChat.id); + declineSecretChat(encryptedChat.id, false); return; } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/SendMessagesHelper.java b/TMessagesProj/src/main/java/org/telegram/messenger/SendMessagesHelper.java index a28d3e87d27..aa6146ae98c 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/SendMessagesHelper.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/SendMessagesHelper.java @@ -10,6 +10,7 @@ import android.content.ClipDescription; import android.content.Context; +import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.PorterDuff; @@ -67,10 +68,12 @@ import java.io.FileOutputStream; import java.io.InputStream; import java.io.RandomAccessFile; +import java.lang.ref.WeakReference; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.Locale; import java.util.concurrent.CountDownLatch; import java.util.concurrent.LinkedBlockingQueue; @@ -90,6 +93,169 @@ public class SendMessagesHelper extends BaseController implements NotificationCe private HashMap waitingForCallback = new HashMap<>(); private HashMap waitingForVote = new HashMap<>(); private LongSparseArray voteSendTime = new LongSparseArray(); + private HashMap importingHistoryFiles = new HashMap<>(); + private LongSparseArray importingHistoryMap = new LongSparseArray<>(); + + public class ImportingHistory { + public String historyPath; + public ArrayList mediaPaths = new ArrayList<>(); + public HashMap uploadedMedias = new HashMap<>(); + public HashSet uploadSet = new HashSet<>(); + public HashMap uploadProgresses = new HashMap<>(); + public HashMap uploadSize = new HashMap<>(); + public ArrayList uploadMedia = new ArrayList<>(); + public TLRPC.InputPeer peer; + public long totalSize; + public long uploadedSize; + public long dialogId; + public long importId; + public int uploadProgress; + public double estimatedUploadSpeed; + private long lastUploadTime; + private long lastUploadSize; + public int timeUntilFinish = Integer.MAX_VALUE; + + private void initImport(TLRPC.InputFile inputFile) { + TLRPC.TL_messages_initHistoryImport req = new TLRPC.TL_messages_initHistoryImport(); + req.file = inputFile; + req.media_count = mediaPaths.size(); + req.peer = peer; + getConnectionsManager().sendRequest(req, new RequestDelegate() { + @Override + public void run(TLObject response, TLRPC.TL_error error) { + AndroidUtilities.runOnUIThread(() -> { + if (response instanceof TLRPC.TL_messages_historyImport) { + importId = ((TLRPC.TL_messages_historyImport) response).id; + uploadSet.remove(historyPath); + getNotificationCenter().postNotificationName(NotificationCenter.historyImportProgressChanged, dialogId); + if (uploadSet.isEmpty()) { + startImport(); + } + lastUploadTime = SystemClock.elapsedRealtime(); + for (int a = 0, N = uploadMedia.size(); a < N; a++) { + getFileLoader().uploadFile(uploadMedia.get(a), false, true, ConnectionsManager.FileTypeFile); + } + } else { + importingHistoryMap.remove(dialogId); + getNotificationCenter().postNotificationName(NotificationCenter.historyImportProgressChanged, dialogId, req, error); + } + }); + } + }); + } + + public long getUploadedCount() { + return uploadedSize; + } + + public long getTotalCount() { + return totalSize; + } + + private void addUploadProgress(String path, long sz, float progress) { + uploadProgresses.put(path, progress); + uploadSize.put(path, sz); + uploadedSize = 0; + for (HashMap.Entry entry : uploadSize.entrySet()) { + uploadedSize += entry.getValue(); + } + long newTime = SystemClock.elapsedRealtime(); + if (!path.equals(historyPath) && uploadedSize != lastUploadSize && newTime != lastUploadTime) { + double dt = (newTime - lastUploadTime) / 1000.0; + double uploadSpeed = (uploadedSize - lastUploadSize) / dt; + if (estimatedUploadSpeed == 0) { + estimatedUploadSpeed = uploadSpeed; + } else { + double coef = 0.01; + estimatedUploadSpeed = coef * uploadSpeed + (1 - coef) * estimatedUploadSpeed; + } + timeUntilFinish = (int) ((totalSize - uploadedSize) * 1000 / (double) estimatedUploadSpeed); + lastUploadSize = uploadedSize; + lastUploadTime = newTime; + } + float pr = getUploadedCount() / (float) getTotalCount(); + int newProgress = (int) (pr * 100); + if (uploadProgress != newProgress) { + uploadProgress = newProgress; + getNotificationCenter().postNotificationName(NotificationCenter.historyImportProgressChanged, dialogId); + } + } + + private void onMediaImport(String path, long size, TLRPC.InputFile inputFile) { + addUploadProgress(path, size, 1.0f); + uploadedMedias.put(path, inputFile); + TLRPC.TL_messages_uploadImportedMedia req = new TLRPC.TL_messages_uploadImportedMedia(); + req.peer = peer; + req.import_id = importId; + req.file_name = new File(path).getName(); + + MimeTypeMap myMime = MimeTypeMap.getSingleton(); + String ext = "txt"; + int idx = req.file_name.lastIndexOf('.'); + if (idx != -1) { + ext = req.file_name.substring(idx + 1).toLowerCase(); + } + String mimeType = myMime.getMimeTypeFromExtension(ext); + if (mimeType == null) { + if ("opus".equals(ext)) { + mimeType = "audio/opus"; + } else if ("webp".equals(ext)) { + mimeType = "image/webp"; + } else { + mimeType = "text/plain"; + } + } + if (mimeType.equals("image/jpg") || mimeType.equals("image/jpeg")) { + TLRPC.TL_inputMediaUploadedPhoto inputMediaUploadedPhoto = new TLRPC.TL_inputMediaUploadedPhoto(); + inputMediaUploadedPhoto.file = inputFile; + req.media = inputMediaUploadedPhoto; + } else { + TLRPC.TL_inputMediaUploadedDocument inputMediaDocument = new TLRPC.TL_inputMediaUploadedDocument(); + inputMediaDocument.file = inputFile; + inputMediaDocument.mime_type = mimeType; + req.media = inputMediaDocument; + } + + getConnectionsManager().sendRequest(req, new RequestDelegate() { + @Override + public void run(TLObject response, TLRPC.TL_error error) { + AndroidUtilities.runOnUIThread(() -> { + uploadSet.remove(path); + getNotificationCenter().postNotificationName(NotificationCenter.historyImportProgressChanged, dialogId); + if (uploadSet.isEmpty()) { + startImport(); + } + }); + } + }); + } + + private void startImport() { + TLRPC.TL_messages_startHistoryImport req = new TLRPC.TL_messages_startHistoryImport(); + req.peer = peer; + req.import_id = importId; + getConnectionsManager().sendRequest(req, new RequestDelegate() { + @Override + public void run(TLObject response, TLRPC.TL_error error) { + AndroidUtilities.runOnUIThread(() -> { + importingHistoryMap.remove(dialogId); + if (error == null) { + getNotificationCenter().postNotificationName(NotificationCenter.historyImportProgressChanged, dialogId); + } else { + getNotificationCenter().postNotificationName(NotificationCenter.historyImportProgressChanged, dialogId, req, error); + } + }); + } + }); + } + + public void setImportProgress(int value) { + if (value == 100) { + importingHistoryMap.remove(dialogId); + } + getNotificationCenter().postNotificationName(NotificationCenter.historyImportProgressChanged, dialogId); + } + } private static DispatchQueue mediaSendQueue = new DispatchQueue("mediaSendQueue"); private static ThreadPoolExecutor mediaSendThreadPool; @@ -421,6 +587,7 @@ public SendMessagesHelper(int instance) { AndroidUtilities.runOnUIThread(() -> { getNotificationCenter().addObserver(SendMessagesHelper.this, NotificationCenter.FileDidUpload); + getNotificationCenter().addObserver(SendMessagesHelper.this, NotificationCenter.FileUploadProgressChanged); getNotificationCenter().addObserver(SendMessagesHelper.this, NotificationCenter.FileDidFailUpload); getNotificationCenter().addObserver(SendMessagesHelper.this, NotificationCenter.filePreparingStarted); getNotificationCenter().addObserver(SendMessagesHelper.this, NotificationCenter.fileNewChunkAvailable); @@ -443,15 +610,35 @@ public void cleanup() { waitingForLocation.clear(); waitingForCallback.clear(); waitingForVote.clear(); + importingHistoryFiles.clear(); + importingHistoryMap.clear(); locationProvider.stop(); } @Override public void didReceivedNotification(int id, int account, final Object... args) { - if (id == NotificationCenter.FileDidUpload) { + if (id == NotificationCenter.FileUploadProgressChanged) { + String fileName = (String) args[0]; + ImportingHistory importingHistory = importingHistoryFiles.get(fileName); + if (importingHistory != null) { + Long loadedSize = (Long) args[1]; + Long totalSize = (Long) args[2]; + importingHistory.addUploadProgress(fileName, loadedSize, loadedSize / (float) totalSize); + } + } else if (id == NotificationCenter.FileDidUpload) { final String location = (String) args[0]; final TLRPC.InputFile file = (TLRPC.InputFile) args[1]; final TLRPC.InputEncryptedFile encryptedFile = (TLRPC.InputEncryptedFile) args[2]; + + ImportingHistory importingHistory = importingHistoryFiles.get(location); + if (importingHistory != null) { + if (location.equals(importingHistory.historyPath)) { + importingHistory.initImport(file); + } else { + importingHistory.onMediaImport(location, (Long) args[5], file); + } + } + ArrayList arr = delayedMessages.get(location); if (arr != null) { for (int a = 0; a < arr.size(); a++) { @@ -4007,7 +4194,7 @@ private void performSendDelayedMessage(final DelayedMessage message, int index) } putToDelayedMessages(location, message); if (message.obj.videoEditedInfo != null && message.obj.videoEditedInfo.needConvert()) { - getFileLoader().uploadFile(location, false, false, document.size, ConnectionsManager.FileTypeVideo); + getFileLoader().uploadFile(location, false, false, document.size, ConnectionsManager.FileTypeVideo, false); } else { getFileLoader().uploadFile(location, false, false, ConnectionsManager.FileTypeVideo); } @@ -4034,7 +4221,7 @@ private void performSendDelayedMessage(final DelayedMessage message, int index) } putToDelayedMessages(location, message); if (message.obj.videoEditedInfo != null && message.obj.videoEditedInfo.needConvert()) { - getFileLoader().uploadFile(location, true, false, document.size, ConnectionsManager.FileTypeVideo); + getFileLoader().uploadFile(location, true, false, document.size, ConnectionsManager.FileTypeVideo, false); } else { getFileLoader().uploadFile(location, true, false, ConnectionsManager.FileTypeVideo); } @@ -4126,7 +4313,7 @@ private void performSendDelayedMessage(final DelayedMessage message, int index) message.extraHashMap.put(documentLocation + "_t", message.photoSize); } if (messageObject.videoEditedInfo != null && messageObject.videoEditedInfo.needConvert()) { - getFileLoader().uploadFile(documentLocation, false, false, document.size, ConnectionsManager.FileTypeVideo); + getFileLoader().uploadFile(documentLocation, false, false, document.size, ConnectionsManager.FileTypeVideo, false); } else { getFileLoader().uploadFile(documentLocation, false, false, ConnectionsManager.FileTypeVideo); } @@ -4150,7 +4337,7 @@ private void performSendDelayedMessage(final DelayedMessage message, int index) message.extraHashMap.put(documentLocation + "_t", message.photoSize); } if (messageObject.videoEditedInfo != null && messageObject.videoEditedInfo.needConvert()) { - getFileLoader().uploadFile(documentLocation, true, false, document.size, ConnectionsManager.FileTypeVideo); + getFileLoader().uploadFile(documentLocation, true, false, document.size, ConnectionsManager.FileTypeVideo, false); } else { getFileLoader().uploadFile(documentLocation, true, false, ConnectionsManager.FileTypeVideo); } @@ -5231,6 +5418,95 @@ protected void processUnsentMessages(final ArrayList messages, fi }); } + public ImportingHistory getImportingHistory(long dialogId) { + return importingHistoryMap.get(dialogId); + } + + public boolean isImportingHistory() { + return importingHistoryMap.size() != 0; + } + + public void prepareImportHistory(long dialogId, Uri uri, ArrayList mediaUris, MessagesStorage.IntCallback onStartImport) { + if (importingHistoryMap.get(dialogId) != null) { + onStartImport.run(0); + return; + } + int lowerId = (int) dialogId; + if (lowerId < 0) { + TLRPC.Chat chat = getMessagesController().getChat(-lowerId); + if (chat != null && !chat.megagroup) { + getMessagesController().convertToMegaGroup(null, -lowerId, null, (chatId) -> { + if (chatId != 0) { + prepareImportHistory(-chatId, uri, mediaUris, onStartImport); + } else { + onStartImport.run(0); + } + }); + return; + } + } + new Thread(() -> { + ArrayList uris = mediaUris != null ? mediaUris : new ArrayList<>(); + ImportingHistory importingHistory = new ImportingHistory(); + importingHistory.mediaPaths = uris; + importingHistory.dialogId = dialogId; + importingHistory.peer = getMessagesController().getInputPeer((int) dialogId); + HashMap files = new HashMap<>(); + for (int a = 0, N = uris.size(); a < N + 1; a++) { + Uri mediaUri; + if (a == 0) { + mediaUri = uri; + } else { + mediaUri = uris.get(a - 1); + } + if (mediaUri == null || AndroidUtilities.isInternalUri(mediaUri)) { + if (a == 0) { + AndroidUtilities.runOnUIThread(() -> { + onStartImport.run(0); + }); + return; + } + continue; + } + + String path = MediaController.copyFileToCache(mediaUri, "txt"); + final File f = new File(path); + long size; + if (!f.exists() || (size = f.length()) == 0) { + if (a == 0) { + AndroidUtilities.runOnUIThread(() -> { + onStartImport.run(0); + }); + return; + } + continue; + } + importingHistory.totalSize += size; + if (a == 0) { + importingHistory.historyPath = path; + } else { + importingHistory.uploadMedia.add(path); + } + importingHistory.uploadSet.add(path); + files.put(path, importingHistory); + } + AndroidUtilities.runOnUIThread(() -> { + importingHistoryFiles.putAll(files); + importingHistoryMap.put(dialogId, importingHistory); + getFileLoader().uploadFile(importingHistory.historyPath, false, true, 0, ConnectionsManager.FileTypeFile, true); + getNotificationCenter().postNotificationName(NotificationCenter.historyImportProgressChanged, dialogId); + onStartImport.run((int) dialogId); + + Intent intent = new Intent(ApplicationLoader.applicationContext, ImportingService.class); + try { + ApplicationLoader.applicationContext.startService(intent); + } catch (Throwable e) { + FileLog.e(e); + } + }); + }).start(); + } + public TLRPC.TL_photo generatePhotoSizes(String path, Uri imageUri) { return generatePhotoSizes(null, path, imageUri); } @@ -5501,9 +5777,13 @@ private static boolean prepareSendingDocumentInternal(AccountInstance accountIns params.put("parentObject", parentFinal); } Integer prevType = 0; + boolean isSticker = false; if (docType != null) { prevType = docType[0]; - if (document.mime_type != null && (document.mime_type.toLowerCase().startsWith("image/") || document.mime_type.toLowerCase().startsWith("video/mp4")) || MessageObject.canPreviewDocument(document)) { + if (document.mime_type != null && document.mime_type.toLowerCase().startsWith("image/webp")) { + docType[0] = -1; + isSticker = true; + } else if (document.mime_type != null && (document.mime_type.toLowerCase().startsWith("image/") || document.mime_type.toLowerCase().startsWith("video/mp4")) || MessageObject.canPreviewDocument(document)) { docType[0] = 1; } else if (attributeAudio != null) { docType[0] = 2; @@ -5516,9 +5796,11 @@ private static boolean prepareSendingDocumentInternal(AccountInstance accountIns finishGroup(accountInstance, groupId[0], scheduleDate); groupId[0] = Utilities.random.nextLong(); } - params.put("groupId", "" + groupId[0]); - if (isGroupFinal) { - params.put("final", "1"); + if (!isSticker) { + params.put("groupId", "" + groupId[0]); + if (isGroupFinal) { + params.put("final", "1"); + } } } @@ -5685,7 +5967,7 @@ public static void prepareSendingDocuments(AccountInstance accountInstance, Arra if (!prepareSendingDocumentInternal(accountInstance, paths.get(a), originalPaths.get(a), null, mime, dialogId, replyToMsg, replyToTopMsg, captionFinal, null, editingMessageObject, groupId, mediaCount == 10 || a == count - 1, inputContent == null, notify, scheduleDate, docType)) { error = true; } - if (prevGroupId != groupId[0]) { + if (prevGroupId != groupId[0] || groupId[0] == -1) { mediaCount = 1; } } @@ -5708,7 +5990,7 @@ public static void prepareSendingDocuments(AccountInstance accountInstance, Arra if (!prepareSendingDocumentInternal(accountInstance, null, null, uris.get(a), mime, dialogId, replyToMsg, replyToTopMsg, captionFinal, null, editingMessageObject, groupId, mediaCount == 10 || a == count - 1, inputContent == null, notify, scheduleDate, docType)) { error = true; } - if (prevGroupId != groupId[0]) { + if (prevGroupId != groupId[0] || groupId[0] == -1) { mediaCount = 1; } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ShortcutWidgetProvider.java b/TMessagesProj/src/main/java/org/telegram/messenger/ShortcutWidgetProvider.java new file mode 100644 index 00000000000..5d1d69d5de2 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ShortcutWidgetProvider.java @@ -0,0 +1,62 @@ +package org.telegram.messenger; + +import android.app.Activity; +import android.app.PendingIntent; +import android.appwidget.AppWidgetManager; +import android.appwidget.AppWidgetProvider; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.net.Uri; +import android.widget.RemoteViews; + +import org.telegram.ui.LaunchActivity; + +public class ShortcutWidgetProvider extends AppWidgetProvider { + + @Override + public void onReceive(Context context, Intent intent) { + super.onReceive(context, intent); + } + + @Override + public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + super.onUpdate(context, appWidgetManager, appWidgetIds); + for (int i = 0; i < appWidgetIds.length; i++) { + int appWidgetId = appWidgetIds[i]; + updateWidget(context, appWidgetManager, appWidgetId); + } + } + + @Override + public void onDeleted(Context context, int[] appWidgetIds) { + super.onDeleted(context, appWidgetIds); + for (int a = 0; a < appWidgetIds.length; a++) { + SharedPreferences preferences = context.getSharedPreferences("shortcut_widget", Activity.MODE_PRIVATE); + int accountId = preferences.getInt("account" + appWidgetIds[a], -1); + if (accountId >= 0) { + AccountInstance accountInstance = AccountInstance.getInstance(accountId); + accountInstance.getMessagesStorage().clearWidgetDialogs(appWidgetIds[a]); + } + } + } + + public static void updateWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) { + Intent intent2 = new Intent(context, ShortcutWidgetService.class); + intent2.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); + intent2.setData(Uri.parse(intent2.toUri(Intent.URI_INTENT_SCHEME))); + RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.shortcut_widget_layout); + rv.setRemoteAdapter(appWidgetId, R.id.list_view, intent2); + rv.setEmptyView(R.id.list_view, R.id.empty_view); + + Intent intent = new Intent(ApplicationLoader.applicationContext, LaunchActivity.class); + intent.setAction("com.tmessages.openchat" + Math.random() + Integer.MAX_VALUE); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); + intent.addCategory(Intent.CATEGORY_LAUNCHER); + PendingIntent contentIntent = PendingIntent.getActivity(ApplicationLoader.applicationContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); + + rv.setPendingIntentTemplate(R.id.list_view, contentIntent); + + appWidgetManager.updateAppWidget(appWidgetId, rv); + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ShortcutWidgetService.java b/TMessagesProj/src/main/java/org/telegram/messenger/ShortcutWidgetService.java new file mode 100644 index 00000000000..53c78031616 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ShortcutWidgetService.java @@ -0,0 +1,353 @@ +package org.telegram.messenger; + +import android.app.Activity; +import android.appwidget.AppWidgetManager; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.BitmapShader; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.RectF; +import android.graphics.Shader; +import android.os.Build; +import android.os.Bundle; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.util.LongSparseArray; +import android.util.SparseArray; +import android.view.View; +import android.widget.RemoteViews; +import android.widget.RemoteViewsService; + +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.AvatarDrawable; +import org.telegram.ui.Components.ForegroundColorSpanThemable; + +import java.io.File; +import java.util.ArrayList; + +public class ShortcutWidgetService extends RemoteViewsService { + @Override + public RemoteViewsFactory onGetViewFactory(Intent intent) { + return new ShortcutRemoteViewsFactory(getApplicationContext(), intent); + } +} + +class ShortcutRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory { + + private ArrayList dids = new ArrayList<>(); + private Context mContext; + private int appWidgetId; + private AccountInstance accountInstance; + private Paint roundPaint; + private RectF bitmapRect; + private LongSparseArray dialogs = new LongSparseArray<>(); + private LongSparseArray messageObjects = new LongSparseArray<>(); + + public ShortcutRemoteViewsFactory(Context context, Intent intent) { + mContext = context; + appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); + SharedPreferences preferences = context.getSharedPreferences("shortcut_widget", Activity.MODE_PRIVATE); + int accountId = preferences.getInt("account" + appWidgetId, -1); + if (accountId >= 0) { + accountInstance = AccountInstance.getInstance(accountId); + } + } + + public void onCreate() { + ApplicationLoader.postInitApplication(); + } + + public void onDestroy() { + + } + + public int getCount() { + return dids.size(); + } + + public RemoteViews getViewAt(int position) { + Integer id = dids.get(position); + String name; + + TLRPC.FileLocation photoPath = null; + TLRPC.User user = null; + TLRPC.Chat chat = null; + if (id > 0) { + user = accountInstance.getMessagesController().getUser(id); + if (UserObject.isUserSelf(user)) { + name = LocaleController.getString("SavedMessages", R.string.SavedMessages); + } else if (UserObject.isReplyUser(user)) { + name = LocaleController.getString("RepliesTitle", R.string.RepliesTitle); + } else { + name = ContactsController.formatName(user.first_name, user.last_name); + } + if (!UserObject.isReplyUser(user) && !UserObject.isUserSelf(user) && user.photo != null && user.photo.photo_small != null && user.photo.photo_small.volume_id != 0 && user.photo.photo_small.local_id != 0) { + photoPath = user.photo.photo_small; + } + } else { + chat = accountInstance.getMessagesController().getChat(-id); + name = chat.title; + if (chat.photo != null && chat.photo.photo_small != null && chat.photo.photo_small.volume_id != 0 && chat.photo.photo_small.local_id != 0) { + photoPath = chat.photo.photo_small; + } + } + RemoteViews rv = new RemoteViews(mContext.getPackageName(), R.layout.shortcut_widget_item); + rv.setTextViewText(R.id.shortcut_widget_item_text, name); + + try { + Bitmap bitmap = null; + if (photoPath != null) { + File path = FileLoader.getPathToAttach(photoPath, true); + bitmap = BitmapFactory.decodeFile(path.toString()); + } + + int size = AndroidUtilities.dp(48); + Bitmap result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); + result.eraseColor(Color.TRANSPARENT); + Canvas canvas = new Canvas(result); + if (bitmap == null) { + AvatarDrawable avatarDrawable; + if (user != null) { + avatarDrawable = new AvatarDrawable(user); + if (UserObject.isReplyUser(user)) { + avatarDrawable.setAvatarType(AvatarDrawable.AVATAR_TYPE_REPLIES); + } else if (UserObject.isUserSelf(user)) { + avatarDrawable.setAvatarType(AvatarDrawable.AVATAR_TYPE_SAVED); + } + } else { + avatarDrawable = new AvatarDrawable(chat); + } + avatarDrawable.setBounds(0, 0, size, size); + avatarDrawable.draw(canvas); + } else { + BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); + if (roundPaint == null) { + roundPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + bitmapRect = new RectF(); + } + float scale = size / (float) bitmap.getWidth(); + canvas.save(); + canvas.scale(scale, scale); + roundPaint.setShader(shader); + bitmapRect.set(0, 0, bitmap.getWidth(), bitmap.getHeight()); + canvas.drawRoundRect(bitmapRect, bitmap.getWidth(), bitmap.getHeight(), roundPaint); + canvas.restore(); + } + canvas.setBitmap(null); + rv.setImageViewBitmap(R.id.shortcut_widget_item_avatar, result); + } catch (Throwable e) { + FileLog.e(e); + } + + MessageObject message = messageObjects.get(id); + TLRPC.Dialog dialog = dialogs.get(id); + if (message != null) { + TLRPC.User fromUser = null; + TLRPC.Chat fromChat = null; + int fromId = message.getFromChatId(); + if (fromId > 0) { + fromUser = accountInstance.getMessagesController().getUser(fromId); + } else { + fromChat = accountInstance.getMessagesController().getChat(-fromId); + } + CharSequence messageString; + CharSequence messageNameString; + int textColor = 0xff212121; + if (message.messageOwner instanceof TLRPC.TL_messageService) { + if (ChatObject.isChannel(chat) && (message.messageOwner.action instanceof TLRPC.TL_messageActionHistoryClear || + message.messageOwner.action instanceof TLRPC.TL_messageActionChannelMigrateFrom)) { + messageString = ""; + } else { + messageString = message.messageText; + } + textColor = 0xff3c7eb0; + } else { + boolean needEmoji = true; + if (chat != null && chat.id > 0 && fromChat == null && (!ChatObject.isChannel(chat) || ChatObject.isMegagroup(chat))) { + if (message.isOutOwner()) { + messageNameString = LocaleController.getString("FromYou", R.string.FromYou); + } else if (fromUser != null) { + messageNameString = UserObject.getFirstName(fromUser).replace("\n", ""); + } else { + messageNameString = "DELETED"; + } + SpannableStringBuilder stringBuilder; + String messageFormat = "%2$s: \u2068%1$s\u2069"; + if (message.caption != null) { + String mess = message.caption.toString(); + if (mess.length() > 150) { + mess = mess.substring(0, 150); + } + String emoji; + if (message.isVideo()) { + emoji = "\uD83D\uDCF9 "; + } else if (message.isVoice()) { + emoji = "\uD83C\uDFA4 "; + } else if (message.isMusic()) { + emoji = "\uD83C\uDFA7 "; + } else if (message.isPhoto()) { + emoji = "\uD83D\uDDBC "; + } else { + emoji = "\uD83D\uDCCE "; + } + stringBuilder = SpannableStringBuilder.valueOf(String.format(messageFormat, emoji + mess.replace('\n', ' '), messageNameString)); + } else if (message.messageOwner.media != null && !message.isMediaEmpty()) { + textColor = 0xff3c7eb0; + String innerMessage; + if (message.messageOwner.media instanceof TLRPC.TL_messageMediaPoll) { + TLRPC.TL_messageMediaPoll mediaPoll = (TLRPC.TL_messageMediaPoll) message.messageOwner.media; + if (Build.VERSION.SDK_INT >= 18) { + innerMessage = String.format("\uD83D\uDCCA \u2068%s\u2069", mediaPoll.poll.question); + } else { + innerMessage = String.format("\uD83D\uDCCA %s", mediaPoll.poll.question); + } + } else if (message.messageOwner.media instanceof TLRPC.TL_messageMediaGame) { + if (Build.VERSION.SDK_INT >= 18) { + innerMessage = String.format("\uD83C\uDFAE \u2068%s\u2069", message.messageOwner.media.game.title); + } else { + innerMessage = String.format("\uD83C\uDFAE %s", message.messageOwner.media.game.title); + } + } else if (message.type == 14) { + if (Build.VERSION.SDK_INT >= 18) { + innerMessage = String.format("\uD83C\uDFA7 \u2068%s - %s\u2069", message.getMusicAuthor(), message.getMusicTitle()); + } else { + innerMessage = String.format("\uD83C\uDFA7 %s - %s", message.getMusicAuthor(), message.getMusicTitle()); + } + } else { + innerMessage = message.messageText.toString(); + } + innerMessage = innerMessage.replace('\n', ' '); + stringBuilder = SpannableStringBuilder.valueOf(String.format(messageFormat, innerMessage, messageNameString)); + try { + stringBuilder.setSpan(new ForegroundColorSpanThemable(Theme.key_chats_attachMessage), messageNameString.length() + 2, stringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } catch (Exception e) { + FileLog.e(e); + } + } else if (message.messageOwner.message != null) { + String mess = message.messageOwner.message; + if (mess.length() > 150) { + mess = mess.substring(0, 150); + } + mess = mess.replace('\n', ' ').trim(); + stringBuilder = SpannableStringBuilder.valueOf(String.format(messageFormat, mess, messageNameString)); + } else { + stringBuilder = SpannableStringBuilder.valueOf(""); + } + try { + stringBuilder.setSpan(new ForegroundColorSpanThemable(Theme.key_chats_nameMessage), 0, messageNameString.length() + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } catch (Exception e) { + FileLog.e(e); + } + messageString = stringBuilder;//Emoji.replaceEmoji(stringBuilder, Theme.dialogs_messagePaint[paintIndex].getFontMetricsInt(), AndroidUtilities.dp(20), false); + } else { + if (message.messageOwner.media instanceof TLRPC.TL_messageMediaPhoto && message.messageOwner.media.photo instanceof TLRPC.TL_photoEmpty && message.messageOwner.media.ttl_seconds != 0) { + messageString = LocaleController.getString("AttachPhotoExpired", R.string.AttachPhotoExpired); + } else if (message.messageOwner.media instanceof TLRPC.TL_messageMediaDocument && message.messageOwner.media.document instanceof TLRPC.TL_documentEmpty && message.messageOwner.media.ttl_seconds != 0) { + messageString = LocaleController.getString("AttachVideoExpired", R.string.AttachVideoExpired); + } else if (message.caption != null) { + String emoji; + if (message.isVideo()) { + emoji = "\uD83D\uDCF9 "; + } else if (message.isVoice()) { + emoji = "\uD83C\uDFA4 "; + } else if (message.isMusic()) { + emoji = "\uD83C\uDFA7 "; + } else if (message.isPhoto()) { + emoji = "\uD83D\uDDBC "; + } else { + emoji = "\uD83D\uDCCE "; + } + messageString = emoji + message.caption; + } else { + if (message.messageOwner.media instanceof TLRPC.TL_messageMediaPoll) { + TLRPC.TL_messageMediaPoll mediaPoll = (TLRPC.TL_messageMediaPoll) message.messageOwner.media; + messageString = "\uD83D\uDCCA " + mediaPoll.poll.question; + } else if (message.messageOwner.media instanceof TLRPC.TL_messageMediaGame) { + messageString = "\uD83C\uDFAE " + message.messageOwner.media.game.title; + } else if (message.type == 14) { + messageString = String.format("\uD83C\uDFA7 %s - %s", message.getMusicAuthor(), message.getMusicTitle()); + } else { + messageString = message.messageText; + AndroidUtilities.highlightText(messageString, message.highlightedWords); + } + if (message.messageOwner.media != null && !message.isMediaEmpty()) { + textColor = 0xff3c7eb0; + } + } + } + } + + rv.setTextViewText(R.id.shortcut_widget_item_time, LocaleController.stringForMessageListDate(message.messageOwner.date)); + rv.setTextViewText(R.id.shortcut_widget_item_message, messageString); + rv.setTextColor(R.id.shortcut_widget_item_message, textColor); + } else { + if (dialog != null) { + rv.setTextViewText(R.id.shortcut_widget_item_time, LocaleController.stringForMessageListDate(dialog.last_message_date)); + } + } + if (dialog != null && dialog.unread_count > 0) { + rv.setTextViewText(R.id.shortcut_widget_item_badge, String.format("%d", dialog.unread_count)); + rv.setViewVisibility(R.id.shortcut_widget_item_badge, View.VISIBLE); + } else { + rv.setViewVisibility(R.id.shortcut_widget_item_badge, View.GONE); + } + + Bundle extras = new Bundle(); + + if (id > 0) { + extras.putInt("userId", id); + } else { + extras.putInt("chatId", -id); + } + extras.putInt("currentAccount", accountInstance.getCurrentAccount()); + + Intent fillInIntent = new Intent(); + fillInIntent.putExtras(extras); + rv.setOnClickFillInIntent(R.id.shortcut_widget_item, fillInIntent); + + rv.setViewVisibility(R.id.shortcut_widget_item_divider, position == getCount() ? View.GONE : View.VISIBLE); + + return rv; + } + + public RemoteViews getLoadingView() { + return null; + } + + public int getViewTypeCount() { + return 1; + } + + public long getItemId(int position) { + return position; + } + + public boolean hasStableIds() { + return true; + } + + public void onDataSetChanged() { + dids.clear(); + messageObjects.clear(); + if (accountInstance == null || !accountInstance.getUserConfig().isClientActivated()) { + return; + } + ArrayList users = new ArrayList<>(); + ArrayList chats = new ArrayList<>(); + LongSparseArray messages = new LongSparseArray<>(); + accountInstance.getMessagesStorage().getWidgetDialogs(appWidgetId, dids, dialogs, messages, users, chats); + accountInstance.getMessagesController().putUsers(users, true); + accountInstance.getMessagesController().putChats(chats, true); + messageObjects.clear(); + for (int a = 0, N = messages.size(); a < N; a++) { + MessageObject messageObject = new MessageObject(accountInstance.getCurrentAccount(), messages.valueAt(a), (SparseArray) null, null, false, true); + messageObjects.put(messages.keyAt(a), messageObject); + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/voip/Instance.java b/TMessagesProj/src/main/java/org/telegram/messenger/voip/Instance.java index b1801d08bd6..c6caffca64c 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/voip/Instance.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/voip/Instance.java @@ -95,11 +95,11 @@ public static void destroyInstance() { instance = null; } - public static NativeInstance makeInstance(String version, Config config, String persistentStateFilePath, Endpoint[] endpoints, Proxy proxy, int networkType, EncryptionKey encryptionKey, VideoSink remoteSink, long videoCapturer) { + public static NativeInstance makeInstance(String version, Config config, String persistentStateFilePath, Endpoint[] endpoints, Proxy proxy, int networkType, EncryptionKey encryptionKey, VideoSink remoteSink, long videoCapturer, NativeInstance.AudioLevelsCallback audioLevelsCallback) { if (!"2.4.4".equals(version)) { ContextUtils.initialize(ApplicationLoader.applicationContext); } - instance = NativeInstance.make(version, config, persistentStateFilePath, endpoints, proxy, networkType, encryptionKey, remoteSink, videoCapturer); + instance = NativeInstance.make(version, config, persistentStateFilePath, endpoints, proxy, networkType, encryptionKey, remoteSink, videoCapturer, audioLevelsCallback); setGlobalServerConfig(globalServerConfig.jsonObject.toString()); setBufferSize(bufferSize); return instance; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/voip/NativeInstance.java b/TMessagesProj/src/main/java/org/telegram/messenger/voip/NativeInstance.java index e15ac62ceb7..e59b7270fcb 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/voip/NativeInstance.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/voip/NativeInstance.java @@ -35,12 +35,13 @@ public interface AudioLevelsCallback { void run(int[] uids, float[] levels, boolean[] voice); } - public static NativeInstance make(String version, Instance.Config config, String path, Instance.Endpoint[] endpoints, Instance.Proxy proxy, int networkType, Instance.EncryptionKey encryptionKey, VideoSink remoteSink, long videoCapturer) { + public static NativeInstance make(String version, Instance.Config config, String path, Instance.Endpoint[] endpoints, Instance.Proxy proxy, int networkType, Instance.EncryptionKey encryptionKey, VideoSink remoteSink, long videoCapturer, AudioLevelsCallback audioLevelsCallback) { if (BuildVars.LOGS_ENABLED) { FileLog.d("create new tgvoip instance, version " + version); } NativeInstance instance = new NativeInstance(); instance.persistentStateFilePath = path; + instance.audioLevelsCallback = audioLevelsCallback; float aspectRatio = Math.min(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y) / (float) Math.max(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y); instance.nativePtr = makeNativeInstance(version, instance, config, path, endpoints, proxy, networkType, encryptionKey, remoteSink, videoCapturer, aspectRatio); return instance; @@ -112,7 +113,7 @@ private void onNetworkStateUpdated(boolean connected) { } private void onAudioLevelsUpdated(int[] uids, float[] levels, boolean[] voice) { - if (uids.length == 0) { + if (isGroup && uids != null && uids.length == 0) { return; } AndroidUtilities.runOnUIThread(() -> audioLevelsCallback.run(uids, levels, voice)); @@ -178,6 +179,7 @@ public void stopGroup() { public native String getVersion(); public native void setNetworkType(int networkType); public native void setMuteMicrophone(boolean muteMicrophone); + public native void setVolume(int ssrc, double volume); public native void setAudioOutputGainControlEnabled(boolean enabled); public native void setEchoCancellationStrength(int strength); public native String getLastError(); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/voip/VoIPBaseService.java b/TMessagesProj/src/main/java/org/telegram/messenger/voip/VoIPBaseService.java index 4ea482992fc..212863243d2 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/voip/VoIPBaseService.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/voip/VoIPBaseService.java @@ -148,6 +148,7 @@ public abstract class VoIPBaseService extends Service implements SensorEventList protected PowerManager.WakeLock cpuWakelock; protected boolean isProximityNear; protected boolean isHeadsetPlugged; + protected int previousAudioOutput; protected ArrayList stateListeners = new ArrayList<>(); protected MediaPlayer ringtonePlayer; protected Vibrator vibrator; @@ -275,6 +276,22 @@ public void onReceive(Context context, Intent intent) { if (isHeadsetPlugged && proximityWakelock != null && proximityWakelock.isHeld()) { proximityWakelock.release(); } + if (isHeadsetPlugged) { + AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE); + if (am.isSpeakerphoneOn()) { + previousAudioOutput = 0; + } else if (am.isBluetoothScoOn()) { + previousAudioOutput = 2; + } else { + previousAudioOutput = 1; + } + setAudioOutput(1); + } else { + if (previousAudioOutput >= 0) { + setAudioOutput(previousAudioOutput); + previousAudioOutput = -1; + } + } isProximityNear = false; updateOutputGainControlState(); } else if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) { @@ -416,7 +433,7 @@ public void setMicMute(boolean mute, boolean hold, boolean send) { } } if (send) { - editCallMember(UserConfig.getInstance(currentAccount).getCurrentUser(), mute); + editCallMember(UserConfig.getInstance(currentAccount).getCurrentUser(), mute, -1); Utilities.globalQueue.postRunnable(updateNotificationRunnable = () -> { if (updateNotificationRunnable == null) { return; @@ -435,7 +452,7 @@ public void setMicMute(boolean mute, boolean hold, boolean send) { } } - public void editCallMember(TLObject object, boolean mute) { + public void editCallMember(TLObject object, boolean mute, int volume) { if (groupCall == null) { return; } @@ -452,6 +469,10 @@ public void editCallMember(TLObject object, boolean mute) { } } req.muted = mute; + if (volume >= 0) { + req.volume = volume; + req.flags |= 2; + } int account = currentAccount; AccountInstance.getInstance(account).getConnectionsManager().sendRequest(req, (response, error) -> { if (response != null) { @@ -1554,8 +1575,8 @@ protected void callEnded() { if (groupCall == null) { Utilities.globalQueue.postRunnable(() -> soundPool.play(spEndId, 1, 1, 0, 0, 1)); } else { - Utilities.globalQueue.postRunnable(() -> soundPool.play(spVoiceChatEndId, 1.0f, 1.0f, 0, 0, 1)); - delay = 400; + Utilities.globalQueue.postRunnable(() -> soundPool.play(spVoiceChatEndId, 1.0f, 1.0f, 0, 0, 1), 100); + delay = 500; } AndroidUtilities.runOnUIThread(afterSoundRunnable, delay); } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/voip/VoIPService.java b/TMessagesProj/src/main/java/org/telegram/messenger/voip/VoIPService.java index 7a69f5813c6..c1d0cf15e3d 100755 --- a/TMessagesProj/src/main/java/org/telegram/messenger/voip/VoIPService.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/voip/VoIPService.java @@ -1374,16 +1374,34 @@ private void createGroupInstance() { playedConnectedSound = true; } if (!wasConnected) { - if (!micMute) { - tgVoip.setMuteMicrophone(false); - } wasConnected = true; + NativeInstance instance = tgVoip; + if (instance != null) { + if (!micMute) { + tgVoip.setMuteMicrophone(false); + } + for (int a = 0, N = groupCall.participants.size(); a < N; a++) { + TLRPC.TL_groupCallParticipant participant = groupCall.participants.valueAt(a); + if (participant.source == 0) { + continue; + } + if (participant.muted_by_you) { + instance.setVolume(participant.source, 0); + } else { + instance.setVolume(participant.source, ChatObject.getParticipantVolume(participant) / 10000.0); + } + } + } } } }); dispatchStateChanged(STATE_WAIT_INIT); } + public void setParticipantVolume(int ssrc, int volume) { + tgVoip.setVolume(ssrc, volume / 10000.0); + } + private void initiateActualEncryptedCall() { if (timeoutRunnable != null) { AndroidUtilities.cancelRunOnUIThread(timeoutRunnable); @@ -1490,7 +1508,12 @@ private void initiateActualEncryptedCall() { videoState = Instance.VIDEO_STATE_INACTIVE; } // init - tgVoip = Instance.makeInstance(privateCall.protocol.library_versions.get(0), config, persistentStateFilePath, endpoints, proxy, getNetworkType(), encryptionKey, remoteSink, videoCapturer); + tgVoip = Instance.makeInstance(privateCall.protocol.library_versions.get(0), config, persistentStateFilePath, endpoints, proxy, getNetworkType(), encryptionKey, remoteSink, videoCapturer, (uids, levels, voice) -> { + if (sharedInstance == null || privateCall == null) { + return; + } + NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.webRtcMicAmplitudeEvent, levels[0]); + }); tgVoip.setOnStateUpdatedListener(this::onConnectionStateChanged); tgVoip.setOnSignalBarsUpdatedListener(this::onSignalBarCountChanged); tgVoip.setOnSignalDataListener(this::onSignalingData); diff --git a/TMessagesProj/src/main/java/org/telegram/tgnet/TLRPC.java b/TMessagesProj/src/main/java/org/telegram/tgnet/TLRPC.java index c7eaba301d7..184df9a2447 100644 --- a/TMessagesProj/src/main/java/org/telegram/tgnet/TLRPC.java +++ b/TMessagesProj/src/main/java/org/telegram/tgnet/TLRPC.java @@ -62,7 +62,7 @@ public class TLRPC { public static final int MESSAGE_FLAG_HAS_BOT_ID = 0x00000800; public static final int MESSAGE_FLAG_EDITED = 0x00008000; - public static final int LAYER = 122; + public static final int LAYER = 123; public static class TL_stats_megagroupStats extends TLObject { public static int constructor = 0xef7ff916; @@ -2322,6 +2322,47 @@ public void serializeToStream(AbstractSerializedData stream) { } } + public static class TL_messages_historyImportParsed extends TLObject { + public static int constructor = 0x5e0fb7b9; + + public int flags; + public boolean pm; + public boolean group; + public String title; + + public static TL_messages_historyImportParsed TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_messages_historyImportParsed.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_messages_historyImportParsed", constructor)); + } else { + return null; + } + } + TL_messages_historyImportParsed result = new TL_messages_historyImportParsed(); + result.readParams(stream, exception); + return result; + } + + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + pm = (flags & 1) != 0; + group = (flags & 2) != 0; + if ((flags & 4) != 0) { + title = stream.readString(exception); + } + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + flags = pm ? (flags | 1) : (flags &~ 1); + flags = group ? (flags | 2) : (flags &~ 2); + stream.writeInt32(flags); + if ((flags & 4) != 0) { + stream.writeString(title); + } + } + } + public static class TL_folder extends TLObject { public static int constructor = 0xff544e65; @@ -3059,6 +3100,78 @@ public void serializeToStream(AbstractSerializedData stream) { } } + public static class TL_messages_exportedChatInvites extends TLObject { + public static int constructor = 0xbdc62dcc; + + public int count; + public ArrayList invites = new ArrayList<>(); + public ArrayList users = new ArrayList<>(); + + public static TL_messages_exportedChatInvites TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_messages_exportedChatInvites.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_messages_exportedChatInvites", constructor)); + } else { + return null; + } + } + TL_messages_exportedChatInvites result = new TL_messages_exportedChatInvites(); + result.readParams(stream, exception); + return result; + } + + public void readParams(AbstractSerializedData stream, boolean exception) { + count = stream.readInt32(exception); + int magic = stream.readInt32(exception); + if (magic != 0x1cb5c415) { + if (exception) { + throw new RuntimeException(String.format("wrong Vector magic, got %x", magic)); + } + return; + } + int count = stream.readInt32(exception); + for (int a = 0; a < count; a++) { + ExportedChatInvite object = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + invites.add(object); + } + magic = stream.readInt32(exception); + if (magic != 0x1cb5c415) { + if (exception) { + throw new RuntimeException(String.format("wrong Vector magic, got %x", magic)); + } + return; + } + count = stream.readInt32(exception); + for (int a = 0; a < count; a++) { + User object = User.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + users.add(object); + } + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(count); + stream.writeInt32(0x1cb5c415); + int count = invites.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + invites.get(a).serializeToStream(stream); + } + stream.writeInt32(0x1cb5c415); + count = users.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + users.get(a).serializeToStream(stream); + } + } + } + public static class TL_langPackDifference extends TLObject { public static int constructor = 0xf385c1f6; @@ -3624,6 +3737,78 @@ public void serializeToStream(AbstractSerializedData stream) { } } + public static class TL_messages_chatInviteImporters extends TLObject { + public static int constructor = 0x81b6b00a; + + public int count; + public ArrayList importers = new ArrayList<>(); + public ArrayList users = new ArrayList<>(); + + public static TL_messages_chatInviteImporters TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_messages_chatInviteImporters.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_messages_chatInviteImporters", constructor)); + } else { + return null; + } + } + TL_messages_chatInviteImporters result = new TL_messages_chatInviteImporters(); + result.readParams(stream, exception); + return result; + } + + public void readParams(AbstractSerializedData stream, boolean exception) { + count = stream.readInt32(exception); + int magic = stream.readInt32(exception); + if (magic != 0x1cb5c415) { + if (exception) { + throw new RuntimeException(String.format("wrong Vector magic, got %x", magic)); + } + return; + } + int count = stream.readInt32(exception); + for (int a = 0; a < count; a++) { + TL_chatInviteImporter object = TL_chatInviteImporter.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + importers.add(object); + } + magic = stream.readInt32(exception); + if (magic != 0x1cb5c415) { + if (exception) { + throw new RuntimeException(String.format("wrong Vector magic, got %x", magic)); + } + return; + } + count = stream.readInt32(exception); + for (int a = 0; a < count; a++) { + User object = User.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + users.add(object); + } + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(count); + stream.writeInt32(0x1cb5c415); + int count = importers.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + importers.get(a).serializeToStream(stream); + } + stream.writeInt32(0x1cb5c415); + count = users.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + users.get(a).serializeToStream(stream); + } + } + } + public static class TL_pollAnswerVoters extends TLObject { public static int constructor = 0x3b6ddad2; @@ -4757,6 +4942,58 @@ public void serializeToStream(AbstractSerializedData stream) { } } + public static class TL_messages_affectedFoundMessages extends TLObject { + public static int constructor = 0xef8d3e6c; + + public int pts; + public int pts_count; + public int offset; + public ArrayList messages = new ArrayList<>(); + + public static TL_messages_affectedFoundMessages TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_messages_affectedFoundMessages.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_messages_affectedFoundMessages", constructor)); + } else { + return null; + } + } + TL_messages_affectedFoundMessages result = new TL_messages_affectedFoundMessages(); + result.readParams(stream, exception); + return result; + } + + public void readParams(AbstractSerializedData stream, boolean exception) { + pts = stream.readInt32(exception); + pts_count = stream.readInt32(exception); + offset = stream.readInt32(exception); + int magic = stream.readInt32(exception); + if (magic != 0x1cb5c415) { + if (exception) { + throw new RuntimeException(String.format("wrong Vector magic, got %x", magic)); + } + return; + } + int count = stream.readInt32(exception); + for (int a = 0; a < count; a++) { + messages.add(stream.readInt32(exception)); + } + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(pts); + stream.writeInt32(pts_count); + stream.writeInt32(offset); + stream.writeInt32(0x1cb5c415); + int count = messages.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + stream.writeInt32(messages.get(a)); + } + } + } + public static class TL_channelAdminLogEvent extends TLObject { public static int constructor = 0x3b5a3e40; @@ -4946,6 +5183,37 @@ public void serializeToStream(AbstractSerializedData stream) { } } + public static class TL_chatInviteImporter extends TLObject { + public static int constructor = 0x1e3e6680; + + public int user_id; + public int date; + + public static TL_chatInviteImporter TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_chatInviteImporter.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_chatInviteImporter", constructor)); + } else { + return null; + } + } + TL_chatInviteImporter result = new TL_chatInviteImporter(); + result.readParams(stream, exception); + return result; + } + + public void readParams(AbstractSerializedData stream, boolean exception) { + user_id = stream.readInt32(exception); + date = stream.readInt32(exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(user_id); + stream.writeInt32(date); + } + } + public static abstract class SendMessageAction extends TLObject { public int progress; @@ -4994,6 +5262,9 @@ public static SendMessageAction TLdeserialize(AbstractSerializedData stream, int case 0x16bf744e: result = new TL_sendMessageTypingAction(); break; + case 0xdbda9246: + result = new TL_sendMessageHistoryImportAction(); + break; case 0x990a3c1a: result = new TL_sendMessageUploadPhotoAction_old(); break; @@ -5172,6 +5443,21 @@ public void serializeToStream(AbstractSerializedData stream) { } } + public static class TL_sendMessageHistoryImportAction extends SendMessageAction { + public static int constructor = 0xdbda9246; + + public int progress; + + public void readParams(AbstractSerializedData stream, boolean exception) { + progress = stream.readInt32(exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(progress); + } + } + public static class TL_sendMessageUploadPhotoAction_old extends TL_sendMessageUploadPhotoAction { public static int constructor = 0x990a3c1a; @@ -5378,6 +5664,7 @@ public static class TL_peerSettings extends TLObject { public boolean need_contacts_exception; public boolean report_geo; public boolean autoarchived; + public boolean invite_members; public int geo_distance; public static TL_peerSettings TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { @@ -5402,6 +5689,7 @@ public void readParams(AbstractSerializedData stream, boolean exception) { need_contacts_exception = (flags & 16) != 0; report_geo = (flags & 32) != 0; autoarchived = (flags & 128) != 0; + invite_members = (flags & 256) != 0; if ((flags & 64) != 0) { geo_distance = stream.readInt32(exception); } @@ -5416,6 +5704,7 @@ public void serializeToStream(AbstractSerializedData stream) { flags = need_contacts_exception ? (flags | 16) : (flags &~ 16); flags = report_geo ? (flags | 32) : (flags &~ 32); flags = autoarchived ? (flags | 128) : (flags &~ 128); + flags = invite_members ? (flags | 256) : (flags &~ 256); stream.writeInt32(flags); if ((flags & 64) != 0) { stream.writeInt32(geo_distance); @@ -7996,6 +8285,34 @@ public void serializeToStream(AbstractSerializedData stream) { } } + public static class TL_messages_historyImport extends TLObject { + public static int constructor = 0x1662af0b; + + public long id; + + public static TL_messages_historyImport TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_messages_historyImport.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_messages_historyImport", constructor)); + } else { + return null; + } + } + TL_messages_historyImport result = new TL_messages_historyImport(); + result.readParams(stream, exception); + return result; + } + + public void readParams(AbstractSerializedData stream, boolean exception) { + id = stream.readInt64(exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt64(id); + } + } + public static abstract class BotInfo extends TLObject { public int user_id; public String description; @@ -8790,6 +9107,56 @@ public void serializeToStream(AbstractSerializedData stream) { } } + public static class TL_messages_exportedChatInvite extends TLObject { + public static int constructor = 0x1871be50; + + public ExportedChatInvite invite; + public ArrayList users = new ArrayList<>(); + + public static TL_messages_exportedChatInvite TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + if (TL_messages_exportedChatInvite.constructor != constructor) { + if (exception) { + throw new RuntimeException(String.format("can't parse magic %x in TL_messages_exportedChatInvite", constructor)); + } else { + return null; + } + } + TL_messages_exportedChatInvite result = new TL_messages_exportedChatInvite(); + result.readParams(stream, exception); + return result; + } + + public void readParams(AbstractSerializedData stream, boolean exception) { + invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + int magic = stream.readInt32(exception); + if (magic != 0x1cb5c415) { + if (exception) { + throw new RuntimeException(String.format("wrong Vector magic, got %x", magic)); + } + return; + } + int count = stream.readInt32(exception); + for (int a = 0; a < count; a++) { + User object = User.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + users.add(object); + } + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + invite.serializeToStream(stream); + stream.writeInt32(0x1cb5c415); + int count = users.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + users.get(a).serializeToStream(stream); + } + } + } + public static abstract class InputTheme extends TLObject { public static InputTheme TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { @@ -8985,7 +9352,7 @@ public static abstract class ChatFull extends TLObject { public ChatParticipants participants; public Photo chat_photo; public PeerNotifySettings notify_settings; - public ExportedChatInvite exported_invite; + public TL_chatInviteExported exported_invite; public ArrayList bot_info = new ArrayList<>(); public int flags; public boolean can_view_participants; @@ -9021,6 +9388,7 @@ public static abstract class ChatFull extends TLObject { public int pts; public TL_inputGroupCall call; public int inviterId; + public int invitesCount; //custom public static ChatFull TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { ChatFull result = null; @@ -9035,7 +9403,7 @@ public static ChatFull TLdeserialize(AbstractSerializedData stream, int construc result = new TL_chatFull_layer87(); break; case 0xef3a6acd: - result = new TL_channelFull(); + result = new TL_channelFull_layer122(); break; case 0xf0e6672a: result = new TL_channelFull_layer121(); @@ -9065,8 +9433,14 @@ public static ChatFull TLdeserialize(AbstractSerializedData stream, int construc result = new TL_channelFull_layer48(); break; case 0xdc8c181: + result = new TL_chatFull_layer122(); + break; + case 0xf3474af6: result = new TL_chatFull(); break; + case 0x7a7de4f7: + result = new TL_channelFull(); + break; case 0x1b7c9db3: result = new TL_chatFull_layer121(); break; @@ -9131,7 +9505,10 @@ public void readParams(AbstractSerializedData stream, boolean exception) { unread_count = stream.readInt32(exception); chat_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); notify_settings = PeerNotifySettings.TLdeserialize(stream, stream.readInt32(exception), exception); - exported_invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + ExportedChatInvite invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + if (invite instanceof TL_chatInviteExported) { + exported_invite = (TL_chatInviteExported) invite; + } int magic = stream.readInt32(exception); if (magic != 0x1cb5c415) { if (exception) { @@ -9253,7 +9630,263 @@ public void serializeToStream(AbstractSerializedData stream) { } } + public static class TL_chatFull extends ChatFull { + public static int constructor = 0xf3474af6; + + + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + can_set_username = (flags & 128) != 0; + has_scheduled = (flags & 256) != 0; + id = stream.readInt32(exception); + about = stream.readString(exception); + participants = ChatParticipants.TLdeserialize(stream, stream.readInt32(exception), exception); + if ((flags & 4) != 0) { + chat_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); + } + notify_settings = PeerNotifySettings.TLdeserialize(stream, stream.readInt32(exception), exception); + if ((flags & 8192) != 0) { + exported_invite = (TL_chatInviteExported) ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 8) != 0) { + int magic = stream.readInt32(exception); + if (magic != 0x1cb5c415) { + if (exception) { + throw new RuntimeException(String.format("wrong Vector magic, got %x", magic)); + } + return; + } + int count = stream.readInt32(exception); + for (int a = 0; a < count; a++) { + BotInfo object = BotInfo.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + bot_info.add(object); + } + } + if ((flags & 64) != 0) { + pinned_msg_id = stream.readInt32(exception); + } + if ((flags & 2048) != 0) { + folder_id = stream.readInt32(exception); + } + if ((flags & 4096) != 0) { + call = TL_inputGroupCall.TLdeserialize(stream, stream.readInt32(exception), exception); + } + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + flags = can_set_username ? (flags | 128) : (flags &~ 128); + flags = has_scheduled ? (flags | 256) : (flags &~ 256); + stream.writeInt32(flags); + stream.writeInt32(id); + stream.writeString(about); + participants.serializeToStream(stream); + if ((flags & 4) != 0) { + chat_photo.serializeToStream(stream); + } + notify_settings.serializeToStream(stream); + if ((flags & 8192) != 0) { + exported_invite.serializeToStream(stream); + } + if ((flags & 8) != 0) { + stream.writeInt32(0x1cb5c415); + int count = bot_info.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + bot_info.get(a).serializeToStream(stream); + } + } + if ((flags & 64) != 0) { + stream.writeInt32(pinned_msg_id); + } + if ((flags & 2048) != 0) { + stream.writeInt32(folder_id); + } + if ((flags & 4096) != 0) { + call.serializeToStream(stream); + } + } + } + public static class TL_channelFull extends ChatFull { + public static int constructor = 0x7a7de4f7; + + + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + can_view_participants = (flags & 8) != 0; + can_set_username = (flags & 64) != 0; + can_set_stickers = (flags & 128) != 0; + hidden_prehistory = (flags & 1024) != 0; + can_set_location = (flags & 65536) != 0; + has_scheduled = (flags & 524288) != 0; + can_view_stats = (flags & 1048576) != 0; + blocked = (flags & 4194304) != 0; + id = stream.readInt32(exception); + about = stream.readString(exception); + if ((flags & 1) != 0) { + participants_count = stream.readInt32(exception); + } + if ((flags & 2) != 0) { + admins_count = stream.readInt32(exception); + } + if ((flags & 4) != 0) { + kicked_count = stream.readInt32(exception); + } + if ((flags & 4) != 0) { + banned_count = stream.readInt32(exception); + } + if ((flags & 8192) != 0) { + online_count = stream.readInt32(exception); + } + read_inbox_max_id = stream.readInt32(exception); + read_outbox_max_id = stream.readInt32(exception); + unread_count = stream.readInt32(exception); + chat_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); + notify_settings = PeerNotifySettings.TLdeserialize(stream, stream.readInt32(exception), exception); + if ((flags & 8388608) != 0) { + exported_invite = (TL_chatInviteExported) ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + } + int magic = stream.readInt32(exception); + if (magic != 0x1cb5c415) { + if (exception) { + throw new RuntimeException(String.format("wrong Vector magic, got %x", magic)); + } + return; + } + int count = stream.readInt32(exception); + for (int a = 0; a < count; a++) { + BotInfo object = BotInfo.TLdeserialize(stream, stream.readInt32(exception), exception); + if (object == null) { + return; + } + bot_info.add(object); + } + if ((flags & 16) != 0) { + migrated_from_chat_id = stream.readInt32(exception); + } + if ((flags & 16) != 0) { + migrated_from_max_id = stream.readInt32(exception); + } + if ((flags & 32) != 0) { + pinned_msg_id = stream.readInt32(exception); + } + if ((flags & 256) != 0) { + stickerset = StickerSet.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 512) != 0) { + available_min_id = stream.readInt32(exception); + } + if ((flags & 2048) != 0) { + folder_id = stream.readInt32(exception); + } + if ((flags & 16384) != 0) { + linked_chat_id = stream.readInt32(exception); + } + if ((flags & 32768) != 0) { + location = ChannelLocation.TLdeserialize(stream, stream.readInt32(exception), exception); + } + if ((flags & 131072) != 0) { + slowmode_seconds = stream.readInt32(exception); + } + if ((flags & 262144) != 0) { + slowmode_next_send_date = stream.readInt32(exception); + } + if ((flags & 4096) != 0) { + stats_dc = stream.readInt32(exception); + } + pts = stream.readInt32(exception); + if ((flags & 2097152) != 0) { + call = TL_inputGroupCall.TLdeserialize(stream, stream.readInt32(exception), exception); + } + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + flags = can_view_participants ? (flags | 8) : (flags &~ 8); + flags = can_set_username ? (flags | 64) : (flags &~ 64); + flags = can_set_stickers ? (flags | 128) : (flags &~ 128); + flags = hidden_prehistory ? (flags | 1024) : (flags &~ 1024); + flags = can_set_location ? (flags | 65536) : (flags &~ 65536); + flags = has_scheduled ? (flags | 524288) : (flags &~ 524288); + flags = can_view_stats ? (flags | 1048576) : (flags &~ 1048576); + flags = blocked ? (flags | 4194304) : (flags &~ 4194304); + stream.writeInt32(flags); + stream.writeInt32(id); + stream.writeString(about); + if ((flags & 1) != 0) { + stream.writeInt32(participants_count); + } + if ((flags & 2) != 0) { + stream.writeInt32(admins_count); + } + if ((flags & 4) != 0) { + stream.writeInt32(kicked_count); + } + if ((flags & 4) != 0) { + stream.writeInt32(banned_count); + } + if ((flags & 8192) != 0) { + stream.writeInt32(online_count); + } + stream.writeInt32(read_inbox_max_id); + stream.writeInt32(read_outbox_max_id); + stream.writeInt32(unread_count); + chat_photo.serializeToStream(stream); + notify_settings.serializeToStream(stream); + if ((flags & 8388608) != 0) { + exported_invite.serializeToStream(stream); + } + stream.writeInt32(0x1cb5c415); + int count = bot_info.size(); + stream.writeInt32(count); + for (int a = 0; a < count; a++) { + bot_info.get(a).serializeToStream(stream); + } + if ((flags & 16) != 0) { + stream.writeInt32(migrated_from_chat_id); + } + if ((flags & 16) != 0) { + stream.writeInt32(migrated_from_max_id); + } + if ((flags & 32) != 0) { + stream.writeInt32(pinned_msg_id); + } + if ((flags & 256) != 0) { + stickerset.serializeToStream(stream); + } + if ((flags & 512) != 0) { + stream.writeInt32(available_min_id); + } + if ((flags & 2048) != 0) { + stream.writeInt32(folder_id); + } + if ((flags & 16384) != 0) { + stream.writeInt32(linked_chat_id); + } + if ((flags & 32768) != 0) { + location.serializeToStream(stream); + } + if ((flags & 131072) != 0) { + stream.writeInt32(slowmode_seconds); + } + if ((flags & 262144) != 0) { + stream.writeInt32(slowmode_next_send_date); + } + if ((flags & 4096) != 0) { + stream.writeInt32(stats_dc); + } + stream.writeInt32(pts); + if ((flags & 2097152) != 0) { + call.serializeToStream(stream); + } + } + } + + public static class TL_channelFull_layer122 extends TL_channelFull { public static int constructor = 0xef3a6acd; @@ -9289,7 +9922,10 @@ public void readParams(AbstractSerializedData stream, boolean exception) { unread_count = stream.readInt32(exception); chat_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); notify_settings = PeerNotifySettings.TLdeserialize(stream, stream.readInt32(exception), exception); - exported_invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + ExportedChatInvite invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + if (invite instanceof TL_chatInviteExported) { + exported_invite = (TL_chatInviteExported) invite; + } int magic = stream.readInt32(exception); if (magic != 0x1cb5c415) { if (exception) { @@ -9377,7 +10013,11 @@ public void serializeToStream(AbstractSerializedData stream) { stream.writeInt32(unread_count); chat_photo.serializeToStream(stream); notify_settings.serializeToStream(stream); - exported_invite.serializeToStream(stream); + if (exported_invite != null) { + exported_invite.serializeToStream(stream); + } else { + new TLRPC.TL_chatInviteEmpty_layer122().serializeToStream(stream); + } stream.writeInt32(0x1cb5c415); int count = bot_info.size(); stream.writeInt32(count); @@ -9460,7 +10100,10 @@ public void readParams(AbstractSerializedData stream, boolean exception) { unread_count = stream.readInt32(exception); chat_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); notify_settings = PeerNotifySettings.TLdeserialize(stream, stream.readInt32(exception), exception); - exported_invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + ExportedChatInvite invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + if (invite instanceof TL_chatInviteExported) { + exported_invite = (TL_chatInviteExported) invite; + } int magic = stream.readInt32(exception); if (magic != 0x1cb5c415) { if (exception) { @@ -9623,7 +10266,10 @@ public void readParams(AbstractSerializedData stream, boolean exception) { unread_count = stream.readInt32(exception); chat_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); notify_settings = PeerNotifySettings.TLdeserialize(stream, stream.readInt32(exception), exception); - exported_invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + ExportedChatInvite invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + if (invite instanceof TL_chatInviteExported) { + exported_invite = (TL_chatInviteExported) invite; + } int magic = stream.readInt32(exception); if (magic != 0x1cb5c415) { if (exception) { @@ -9765,7 +10411,10 @@ public void readParams(AbstractSerializedData stream, boolean exception) { unread_count = stream.readInt32(exception); chat_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); notify_settings = PeerNotifySettings.TLdeserialize(stream, stream.readInt32(exception), exception); - exported_invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + ExportedChatInvite invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + if (invite instanceof TL_chatInviteExported) { + exported_invite = (TL_chatInviteExported) invite; + } int magic = stream.readInt32(exception); if (magic != 0x1cb5c415) { if (exception) { @@ -9900,7 +10549,10 @@ public void readParams(AbstractSerializedData stream, boolean exception) { unread_count = stream.readInt32(exception); chat_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); notify_settings = PeerNotifySettings.TLdeserialize(stream, stream.readInt32(exception), exception); - exported_invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + ExportedChatInvite invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + if (invite instanceof TL_chatInviteExported) { + exported_invite = (TL_chatInviteExported) invite; + } int magic = stream.readInt32(exception); if (magic != 0x1cb5c415) { if (exception) { @@ -10029,7 +10681,10 @@ public void readParams(AbstractSerializedData stream, boolean exception) { unread_count = stream.readInt32(exception); chat_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); notify_settings = PeerNotifySettings.TLdeserialize(stream, stream.readInt32(exception), exception); - exported_invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + ExportedChatInvite invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + if (invite instanceof TL_chatInviteExported) { + exported_invite = (TL_chatInviteExported) invite; + } int magic = stream.readInt32(exception); if (magic != 0x1cb5c415) { if (exception) { @@ -10126,7 +10781,10 @@ public void readParams(AbstractSerializedData stream, boolean exception) { participants = ChatParticipants.TLdeserialize(stream, stream.readInt32(exception), exception); chat_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); notify_settings = PeerNotifySettings.TLdeserialize(stream, stream.readInt32(exception), exception); - exported_invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + ExportedChatInvite invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + if (invite instanceof TL_chatInviteExported) { + exported_invite = (TL_chatInviteExported) invite; + } int magic = stream.readInt32(exception); if (magic != 0x1cb5c415) { if (exception) { @@ -10189,7 +10847,10 @@ public void readParams(AbstractSerializedData stream, boolean exception) { unread_count = stream.readInt32(exception); chat_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); notify_settings = PeerNotifySettings.TLdeserialize(stream, stream.readInt32(exception), exception); - exported_invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + ExportedChatInvite invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + if (invite instanceof TL_chatInviteExported) { + exported_invite = (TL_chatInviteExported) invite; + } int magic = stream.readInt32(exception); if (magic != 0x1cb5c415) { if (exception) { @@ -10308,7 +10969,10 @@ public void readParams(AbstractSerializedData stream, boolean exception) { unread_count = stream.readInt32(exception); chat_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); notify_settings = PeerNotifySettings.TLdeserialize(stream, stream.readInt32(exception), exception); - exported_invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + ExportedChatInvite invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + if (invite instanceof TL_chatInviteExported) { + exported_invite = (TL_chatInviteExported) invite; + } int magic = stream.readInt32(exception); if (magic != 0x1cb5c415) { if (exception) { @@ -10420,7 +11084,10 @@ public void readParams(AbstractSerializedData stream, boolean exception) { unread_count = stream.readInt32(exception); chat_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); notify_settings = PeerNotifySettings.TLdeserialize(stream, stream.readInt32(exception), exception); - exported_invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + ExportedChatInvite invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + if (invite instanceof TL_chatInviteExported) { + exported_invite = (TL_chatInviteExported) invite; + } int magic = stream.readInt32(exception); if (magic != 0x1cb5c415) { if (exception) { @@ -10497,7 +11164,7 @@ public void serializeToStream(AbstractSerializedData stream) { } } - public static class TL_chatFull extends ChatFull { + public static class TL_chatFull_layer122 extends TL_chatFull { public static int constructor = 0xdc8c181; @@ -10512,7 +11179,10 @@ public void readParams(AbstractSerializedData stream, boolean exception) { chat_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); } notify_settings = PeerNotifySettings.TLdeserialize(stream, stream.readInt32(exception), exception); - exported_invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + ExportedChatInvite invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + if (invite instanceof TL_chatInviteExported) { + exported_invite = (TL_chatInviteExported) invite; + } if ((flags & 8) != 0) { int magic = stream.readInt32(exception); if (magic != 0x1cb5c415) { @@ -10589,7 +11259,10 @@ public void readParams(AbstractSerializedData stream, boolean exception) { chat_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); } notify_settings = PeerNotifySettings.TLdeserialize(stream, stream.readInt32(exception), exception); - exported_invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + ExportedChatInvite invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + if (invite instanceof TL_chatInviteExported) { + exported_invite = (TL_chatInviteExported) invite; + } if ((flags & 8) != 0) { int magic = stream.readInt32(exception); if (magic != 0x1cb5c415) { @@ -10659,7 +11332,10 @@ public void readParams(AbstractSerializedData stream, boolean exception) { chat_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); } notify_settings = PeerNotifySettings.TLdeserialize(stream, stream.readInt32(exception), exception); - exported_invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + ExportedChatInvite invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + if (invite instanceof TL_chatInviteExported) { + exported_invite = (TL_chatInviteExported) invite; + } if ((flags & 8) != 0) { int magic = stream.readInt32(exception); if (magic != 0x1cb5c415) { @@ -10720,7 +11396,10 @@ public void readParams(AbstractSerializedData stream, boolean exception) { chat_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); } notify_settings = PeerNotifySettings.TLdeserialize(stream, stream.readInt32(exception), exception); - exported_invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + ExportedChatInvite invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + if (invite instanceof TL_chatInviteExported) { + exported_invite = (TL_chatInviteExported) invite; + } if ((flags & 8) != 0) { int magic = stream.readInt32(exception); if (magic != 0x1cb5c415) { @@ -10794,7 +11473,10 @@ public void readParams(AbstractSerializedData stream, boolean exception) { unread_count = stream.readInt32(exception); chat_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); notify_settings = PeerNotifySettings.TLdeserialize(stream, stream.readInt32(exception), exception); - exported_invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + ExportedChatInvite invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + if (invite instanceof TL_chatInviteExported) { + exported_invite = (TL_chatInviteExported) invite; + } int magic = stream.readInt32(exception); if (magic != 0x1cb5c415) { if (exception) { @@ -10888,7 +11570,10 @@ public void readParams(AbstractSerializedData stream, boolean exception) { unread_important_count = stream.readInt32(exception); chat_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); notify_settings = PeerNotifySettings.TLdeserialize(stream, stream.readInt32(exception), exception); - exported_invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + ExportedChatInvite invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + if (invite instanceof TL_chatInviteExported) { + exported_invite = (TL_chatInviteExported) invite; + } int magic = stream.readInt32(exception); if (magic != 0x1cb5c415) { if (exception) { @@ -10979,7 +11664,10 @@ public void readParams(AbstractSerializedData stream, boolean exception) { unread_count = stream.readInt32(exception); chat_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); notify_settings = PeerNotifySettings.TLdeserialize(stream, stream.readInt32(exception), exception); - exported_invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + ExportedChatInvite invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + if (invite instanceof TL_chatInviteExported) { + exported_invite = (TL_chatInviteExported) invite; + } int magic = stream.readInt32(exception); if (magic != 0x1cb5c415) { if (exception) { @@ -11069,7 +11757,10 @@ public void readParams(AbstractSerializedData stream, boolean exception) { unread_important_count = stream.readInt32(exception); chat_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); notify_settings = PeerNotifySettings.TLdeserialize(stream, stream.readInt32(exception), exception); - exported_invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + ExportedChatInvite invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + if (invite instanceof TL_chatInviteExported) { + exported_invite = (TL_chatInviteExported) invite; + } int magic = stream.readInt32(exception); if (magic != 0x1cb5c415) { if (exception) { @@ -11152,7 +11843,10 @@ public void readParams(AbstractSerializedData stream, boolean exception) { unread_important_count = stream.readInt32(exception); chat_photo = Photo.TLdeserialize(stream, stream.readInt32(exception), exception); notify_settings = PeerNotifySettings.TLdeserialize(stream, stream.readInt32(exception), exception); - exported_invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + ExportedChatInvite invite = ExportedChatInvite.TLdeserialize(stream, stream.readInt32(exception), exception); + if (invite instanceof TL_chatInviteExported) { + exported_invite = (TL_chatInviteExported) invite; + } } public void serializeToStream(AbstractSerializedData stream) { @@ -15362,6 +16056,7 @@ public static abstract class User extends TLObject { public boolean support; public boolean scam; public boolean apply_min_photo; + public boolean fake; public int bot_info_version; public String bot_inline_placeholder; public String lang_code; @@ -15505,6 +16200,7 @@ public void readParams(AbstractSerializedData stream, boolean exception) { support = (flags & 8388608) != 0; scam = (flags & 16777216) != 0; apply_min_photo = (flags & 33554432) != 0; + fake = (flags & 67108864) != 0; id = stream.readInt32(exception); if ((flags & 1) != 0) { access_hash = stream.readInt64(exception); @@ -15570,6 +16266,8 @@ public void serializeToStream(AbstractSerializedData stream) { flags = bot_inline_geo ? (flags | 2097152) : (flags &~ 2097152); flags = support ? (flags | 8388608) : (flags &~ 8388608); flags = scam ? (flags | 16777216) : (flags &~ 16777216); + flags = apply_min_photo ? (flags | 33554432) : (flags &~ 33554432); + flags = fake ? (flags | 67108864) : (flags &~ 67108864); stream.writeInt32(flags); stream.writeInt32(id); if ((flags & 1) != 0) { @@ -17283,6 +17981,9 @@ public static ReportReason TLdeserialize(AbstractSerializedData stream, int cons case 0xe1746d0a: result = new TL_inputReportReasonOther(); break; + case 0xf5ddd6e7: + result = new TL_inputReportReasonFake(); + break; case 0x9b89f93a: result = new TL_inputReportReasonCopyright(); break; @@ -17333,6 +18034,15 @@ public void serializeToStream(AbstractSerializedData stream) { } } + public static class TL_inputReportReasonFake extends ReportReason { + public static int constructor = 0xf5ddd6e7; + + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + } + } + public static class TL_inputReportReasonCopyright extends ReportReason { public static int constructor = 0x9b89f93a; @@ -26101,7 +26811,7 @@ public void serializeToStream(AbstractSerializedData stream) { } } - public static class TL_encryptedChatDiscarded extends EncryptedChat { + public static class TL_encryptedChatDiscarded_layer122 extends TL_encryptedChatDiscarded { public static int constructor = 0x13d6dd27; @@ -26115,6 +26825,24 @@ public void serializeToStream(AbstractSerializedData stream) { } } + public static class TL_encryptedChatDiscarded extends EncryptedChat { + public static int constructor = 0x1e1c7c45; + + + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + history_deleted = (flags & 1) != 0; + id = stream.readInt32(exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + flags = history_deleted ? (flags | 1) : (flags &~ 1); + stream.writeInt32(flags); + stream.writeInt32(id); + } + } + public static abstract class messages_FoundStickerSets extends TLObject { public static messages_FoundStickerSets TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { @@ -31375,6 +32103,7 @@ public static abstract class Chat extends TLObject { public boolean explicit_content; public boolean call_active; public boolean call_not_empty; + public boolean fake; public ArrayList restriction_reason = new ArrayList<>(); public TL_channelAdminRights_layer92 admin_rights_layer92; public TL_channelBannedRights_layer92 banned_rights_layer92; @@ -31891,6 +32620,7 @@ public void readParams(AbstractSerializedData stream, boolean exception) { slowmode_enabled = (flags & 4194304) != 0; call_active = (flags & 8388608) != 0; call_not_empty = (flags & 16777216) != 0; + fake = (flags & 33554432) != 0; id = stream.readInt32(exception); if ((flags & 8192) != 0) { access_hash = stream.readInt64(exception); @@ -31949,6 +32679,7 @@ public void serializeToStream(AbstractSerializedData stream) { flags = slowmode_enabled ? (flags | 4194304) : (flags &~ 4194304); flags = call_active ? (flags | 8388608) : (flags &~ 8388608); flags = call_not_empty ? (flags | 16777216) : (flags &~ 16777216); + flags = fake ? (flags | 33554432) : (flags &~ 33554432); stream.writeInt32(flags); stream.writeInt32(id); if ((flags & 8192) != 0) { @@ -33356,6 +34087,7 @@ public void serializeToStream(AbstractSerializedData stream) { public static abstract class MessageFwdHeader extends TLObject { public int flags; + public boolean imported; public Peer from_id; public String from_name; public int date; @@ -33439,6 +34171,7 @@ public static class TL_messageFwdHeader extends MessageFwdHeader { public void readParams(AbstractSerializedData stream, boolean exception) { flags = stream.readInt32(exception); + imported = (flags & 128) != 0; if ((flags & 1) != 0) { from_id = Peer.TLdeserialize(stream, stream.readInt32(exception), exception); } @@ -33465,6 +34198,7 @@ public void readParams(AbstractSerializedData stream, boolean exception) { public void serializeToStream(AbstractSerializedData stream) { stream.writeInt32(constructor); + flags = imported ? (flags | 128) : (flags &~ 128); stream.writeInt32(flags); if ((flags & 1) != 0) { from_id.serializeToStream(stream); @@ -34105,51 +34839,113 @@ public void serializeToStream(AbstractSerializedData stream) { } } - public static abstract class ExportedChatInvite extends TLObject { - public String link; + public static abstract class ExportedChatInvite extends TLObject { - public static ExportedChatInvite TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { - ExportedChatInvite result = null; - switch (constructor) { - case 0xfc2e05bc: - result = new TL_chatInviteExported(); - break; - case 0x69df3769: - result = new TL_chatInviteEmpty(); - break; - } - if (result == null && exception) { - throw new RuntimeException(String.format("can't parse magic %x in ExportedChatInvite", constructor)); - } - if (result != null) { - result.readParams(stream, exception); - } - return result; - } - } + public static ExportedChatInvite TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { + ExportedChatInvite result = null; + switch (constructor) { + case 0x69df3769: + result = new TL_chatInviteEmpty_layer122(); + break; + case 0x6e24fc9d: + result = new TL_chatInviteExported(); + break; + case 0xfc2e05bc: + result = new TL_chatInviteExported_layer122(); + break; + } + if (result == null && exception) { + throw new RuntimeException(String.format("can't parse magic %x in ExportedChatInvite", constructor)); + } + if (result != null) { + result.readParams(stream, exception); + } + return result; + } + } + + public static class TL_chatInviteEmpty_layer122 extends ExportedChatInvite { + public static int constructor = 0x69df3769; + + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + } + } public static class TL_chatInviteExported extends ExportedChatInvite { - public static int constructor = 0xfc2e05bc; + public static int constructor = 0x6e24fc9d; + public int flags; + public boolean revoked; + public boolean permanent; + public String link; + public int admin_id; + public int date; + public int start_date; + public int expire_date; + public int usage_limit; + public int usage; + public ArrayList importers; //custom + public boolean expired; //custom - public void readParams(AbstractSerializedData stream, boolean exception) { - link = stream.readString(exception); - } + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + revoked = (flags & 1) != 0; + permanent = (flags & 32) != 0; + link = stream.readString(exception); + admin_id = stream.readInt32(exception); + date = stream.readInt32(exception); + if ((flags & 16) != 0) { + start_date = stream.readInt32(exception); + } + if ((flags & 2) != 0) { + expire_date = stream.readInt32(exception); + } + if ((flags & 4) != 0) { + usage_limit = stream.readInt32(exception); + } + if ((flags & 8) != 0) { + usage = stream.readInt32(exception); + } + } - public void serializeToStream(AbstractSerializedData stream) { - stream.writeInt32(constructor); - stream.writeString(link); - } - } + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + flags = revoked ? (flags | 1) : (flags &~ 1); + flags = permanent ? (flags | 32) : (flags &~ 32); + stream.writeInt32(flags); + stream.writeString(link); + stream.writeInt32(admin_id); + stream.writeInt32(date); + if ((flags & 16) != 0) { + stream.writeInt32(start_date); + } + if ((flags & 2) != 0) { + stream.writeInt32(expire_date); + } + if ((flags & 4) != 0) { + stream.writeInt32(usage_limit); + } + if ((flags & 8) != 0) { + stream.writeInt32(usage); + } + } + } - public static class TL_chatInviteEmpty extends ExportedChatInvite { - public static int constructor = 0x69df3769; + public static class TL_chatInviteExported_layer122 extends TL_chatInviteExported { + public static int constructor = 0xfc2e05bc; + public void readParams(AbstractSerializedData stream, boolean exception) { + link = stream.readString(exception); + } + public void serializeToStream(AbstractSerializedData stream) { - stream.writeInt32(constructor); - } - } + stream.writeInt32(constructor); + stream.writeString(link); + } + } public static abstract class InputFile extends TLObject { public long id; @@ -36167,7 +36963,7 @@ public void serializeToStream(AbstractSerializedData stream) { } public static class TL_groupCallParticipant extends TLObject { - public static int constructor = 0x56b087c9; + public static int constructor = 0x64c62a15; public int flags; public boolean muted; @@ -36175,13 +36971,18 @@ public static class TL_groupCallParticipant extends TLObject { public boolean can_self_unmute; public boolean just_joined; public boolean versioned; + public boolean muted_by_you; public int user_id; public int date; public int active_date; public int source; + public int volume; public long lastSpeakTime; //custom; public float amplitude; //custom; public boolean hasVoice; //custom; + public long lastActiveDate; //custom + public long lastVisibleDate; //custom + public int lastTypingDate; //custom public static TL_groupCallParticipant TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) { if (TL_groupCallParticipant.constructor != constructor) { @@ -36203,12 +37004,16 @@ public void readParams(AbstractSerializedData stream, boolean exception) { can_self_unmute = (flags & 4) != 0; just_joined = (flags & 16) != 0; versioned = (flags & 32) != 0; + muted_by_you = (flags & 512) != 0; user_id = stream.readInt32(exception); date = stream.readInt32(exception); if ((flags & 8) != 0) { active_date = stream.readInt32(exception); } source = stream.readInt32(exception); + if ((flags & 128) != 0) { + volume = stream.readInt32(exception); + } } public void serializeToStream(AbstractSerializedData stream) { @@ -36218,6 +37023,7 @@ public void serializeToStream(AbstractSerializedData stream) { flags = can_self_unmute ? (flags | 4) : (flags &~ 4); flags = just_joined ? (flags | 16) : (flags &~ 16); flags = versioned ? (flags | 32) : (flags &~ 32); + flags = muted_by_you ? (flags | 512) : (flags &~ 512); stream.writeInt32(flags); stream.writeInt32(user_id); stream.writeInt32(date); @@ -36225,6 +37031,9 @@ public void serializeToStream(AbstractSerializedData stream) { stream.writeInt32(active_date); } stream.writeInt32(source); + if ((flags & 128) != 0) { + stream.writeInt32(volume); + } } } @@ -38296,8 +39105,10 @@ public void serializeToStream(AbstractSerializedData stream) { } public static class TL_messages_deleteChatUser extends TLObject { - public static int constructor = 0xe0611f16; + public static int constructor = 0xc534459a; + public int flags; + public boolean revoke_history; public int chat_id; public InputUser user_id; @@ -38307,6 +39118,8 @@ public TLObject deserializeResponse(AbstractSerializedData stream, int construct public void serializeToStream(AbstractSerializedData stream) { stream.writeInt32(constructor); + flags = revoke_history ? (flags | 1) : (flags &~ 1); + stream.writeInt32(flags); stream.writeInt32(chat_id); user_id.serializeToStream(stream); } @@ -38671,20 +39484,24 @@ public void serializeToStream(AbstractSerializedData stream) { } } - public static class TL_messages_discardEncryption extends TLObject { - public static int constructor = 0xedd923c5; + public static class TL_messages_discardEncryption extends TLObject { + public static int constructor = 0xf393aea0; - public int chat_id; + public int flags; + public boolean delete_history; + public int chat_id; - public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { - return Bool.TLdeserialize(stream, constructor, exception); - } + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return Bool.TLdeserialize(stream, constructor, exception); + } public void serializeToStream(AbstractSerializedData stream) { - stream.writeInt32(constructor); - stream.writeInt32(chat_id); - } - } + stream.writeInt32(constructor); + flags = delete_history ? (flags | 1) : (flags &~ 1); + stream.writeInt32(flags); + stream.writeInt32(chat_id); + } + } public static class TL_messages_setEncryptedTyping extends TLObject { public static int constructor = 0x791451ed; @@ -39965,6 +40782,33 @@ public void serializeToStream(AbstractSerializedData stream) { } } + public static class TL_messages_exportChatInvite_layer124 extends TLObject { + public static int constructor = 0x14b9bcd7; + + public int flags; + public boolean legacy_revoke_permanent; + public InputPeer peer; + public int expire_date; + public int usage_limit; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return ExportedChatInvite.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + flags = legacy_revoke_permanent ? (flags | 4) : (flags &~ 4); + stream.writeInt32(flags); + peer.serializeToStream(stream); + if ((flags & 1) != 0) { + stream.writeInt32(expire_date); + } + if ((flags & 2) != 0) { + stream.writeInt32(usage_limit); + } + } + } + public static class TL_messages_checkChatInvite extends TLObject { public static int constructor = 0x3eadb1bb; @@ -41607,6 +42451,227 @@ public void serializeToStream(AbstractSerializedData stream) { } } + public static class TL_messages_getExportedChatInvites extends TLObject { + public static int constructor = 0x6a72ac6c; + + public int flags; + public boolean revoked; + public InputPeer peer; + public InputUser admin_id; + public int offset_date; + public String offset_link; + public int limit; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return TL_messages_exportedChatInvites.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + flags = revoked ? (flags | 8) : (flags &~ 8); + stream.writeInt32(flags); + peer.serializeToStream(stream); + if ((flags & 1) != 0) { + admin_id.serializeToStream(stream); + } + if ((flags & 4) != 0) { + stream.writeInt32(offset_date); + } + if ((flags & 4) != 0) { + stream.writeString(offset_link); + } + stream.writeInt32(limit); + } + } + + public static class TL_messages_editExportedChatInvite extends TLObject { + public static int constructor = 0x2e4ffbe; + + public int flags; + public boolean revoked; + public InputPeer peer; + public String link; + public int expire_date; + public int usage_limit; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return TL_messages_exportedChatInvite.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + flags = revoked ? (flags | 4) : (flags &~ 4); + stream.writeInt32(flags); + peer.serializeToStream(stream); + stream.writeString(link); + if ((flags & 1) != 0) { + stream.writeInt32(expire_date); + } + if ((flags & 2) != 0) { + stream.writeInt32(usage_limit); + } + } + } + + public static class TL_messages_deleteRevokedExportedChatInvites extends TLObject { + public static int constructor = 0x52041463; + + public InputPeer peer; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return Bool.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + peer.serializeToStream(stream); + } + } + + public static class TL_messages_deleteExportedChatInvite extends TLObject { + public static int constructor = 0xd464a42b; + + public InputPeer peer; + public String link; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return Bool.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + peer.serializeToStream(stream); + stream.writeString(link); + } + } + + public static class TL_messages_getChatInviteImporters extends TLObject { + public static int constructor = 0x26fb7289; + + public InputPeer peer; + public String link; + public int offset_date; + public InputUser offset_user; + public int limit; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return TL_messages_chatInviteImporters.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + peer.serializeToStream(stream); + stream.writeString(link); + stream.writeInt32(offset_date); + offset_user.serializeToStream(stream); + stream.writeInt32(limit); + } + } + + public static class TL_messages_deleteChat extends TLObject { + public static int constructor = 0x83247d11; + + public int chat_id; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return Bool.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(chat_id); + } + } + + public static class TL_messages_deletePhoneCallHistory extends TLObject { + public static int constructor = 0xf9cbe409; + + public int flags; + public boolean revoke; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return TL_messages_affectedFoundMessages.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + flags = revoke ? (flags | 1) : (flags &~ 1); + stream.writeInt32(flags); + } + } + + public static class TL_messages_checkHistoryImport extends TLObject { + public static int constructor = 0x43fe19f3; + + public String import_head; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return TL_messages_historyImportParsed.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeString(import_head); + } + } + + public static class TL_messages_initHistoryImport extends TLObject { + public static int constructor = 0x34090c3b; + + public InputPeer peer; + public InputFile file; + public int media_count; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return TL_messages_historyImport.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + peer.serializeToStream(stream); + file.serializeToStream(stream); + stream.writeInt32(media_count); + } + } + + public static class TL_messages_uploadImportedMedia extends TLObject { + public static int constructor = 0x2a862092; + + public InputPeer peer; + public long import_id; + public String file_name; + public InputMedia media; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return MessageMedia.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + peer.serializeToStream(stream); + stream.writeInt64(import_id); + stream.writeString(file_name); + media.serializeToStream(stream); + } + } + + public static class TL_messages_startHistoryImport extends TLObject { + public static int constructor = 0xb43df344; + + public InputPeer peer; + public long import_id; + + public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { + return Bool.TLdeserialize(stream, constructor, exception); + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + peer.serializeToStream(stream); + stream.writeInt64(import_id); + } + } + public static class TL_help_getAppChangelog extends TLObject { public static int constructor = 0x9010ef6f; @@ -42030,6 +43095,7 @@ public static class TL_channels_createChannel extends TLObject { public int flags; public boolean broadcast; public boolean megagroup; + public boolean for_import; public String title; public String about; public InputGeoPoint geo_point; @@ -42043,6 +43109,7 @@ public void serializeToStream(AbstractSerializedData stream) { stream.writeInt32(constructor); flags = broadcast ? (flags | 1) : (flags &~ 1); flags = megagroup ? (flags | 2) : (flags &~ 2); + flags = for_import ? (flags | 8) : (flags &~ 8); stream.writeInt32(flags); stream.writeString(title); stream.writeString(about); @@ -42667,12 +43734,13 @@ public void serializeToStream(AbstractSerializedData stream) { } public static class TL_phone_editGroupCallMember extends TLObject { - public static int constructor = 0x63146ae4; + public static int constructor = 0xa5e76cd8; public int flags; public boolean muted; public TL_inputGroupCall call; public InputUser user_id; + public int volume; public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) { return Updates.TLdeserialize(stream, constructor, exception); @@ -42684,6 +43752,9 @@ public void serializeToStream(AbstractSerializedData stream) { stream.writeInt32(flags); call.serializeToStream(stream); user_id.serializeToStream(stream); + if ((flags & 2) != 0) { + stream.writeInt32(volume); + } } } @@ -43851,6 +44922,7 @@ public static abstract class EncryptedChat extends TLObject { public byte[] nonce; public byte[] g_a_or_b; public long key_fingerprint; + public boolean history_deleted; public byte[] a_or_b; //custom public byte[] auth_key; //custom public int user_id; //custom @@ -43893,6 +44965,9 @@ public static EncryptedChat TLdeserialize(AbstractSerializedData stream, int con result = new TL_encryptedChatWaiting(); break; case 0x13d6dd27: + result = new TL_encryptedChatDiscarded_layer122(); + break; + case 0x1e1c7c45: result = new TL_encryptedChatDiscarded(); break; } @@ -43994,7 +45069,7 @@ public static Message TLdeserialize(AbstractSerializedData stream, int construct result = new TL_messageService_layer48(); break; case 0x83e5de54: - result = new TL_messageEmpty(); + result = new TL_messageEmpty_layer122(); break; case 0x2bebfa86: result = new TL_message_old6(); @@ -44002,6 +45077,9 @@ public static Message TLdeserialize(AbstractSerializedData stream, int construct case 0x44f9b43d: result = new TL_message_layer104(); break; + case 0x90a6ca84: + result = new TL_messageEmpty(); + break; case 0x1c9b1027: result = new TL_message_layer104_2(); break; @@ -44141,7 +45219,7 @@ protected void writeAttachPath(AbstractSerializedData stream) { } } - public static class TL_messageEmpty extends Message { + public static class TL_messageEmpty_layer122 extends TL_messageEmpty { public static int constructor = 0x83e5de54; @@ -44156,6 +45234,28 @@ public void serializeToStream(AbstractSerializedData stream) { } } + public static class TL_messageEmpty extends Message { + public static int constructor = 0x90a6ca84; + + + public void readParams(AbstractSerializedData stream, boolean exception) { + flags = stream.readInt32(exception); + id = stream.readInt32(exception); + if ((flags & 1) != 0) { + peer_id = Peer.TLdeserialize(stream, stream.readInt32(exception), exception); + } + } + + public void serializeToStream(AbstractSerializedData stream) { + stream.writeInt32(constructor); + stream.writeInt32(flags); + stream.writeInt32(id); + if ((flags & 1) != 0) { + peer_id.serializeToStream(stream); + } + } + } + public static class TL_messageService_old2 extends TL_messageService { public static int constructor = 0x1d86f70e; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenu.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenu.java index e862aaa377e..7c3383dd031 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenu.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenu.java @@ -16,6 +16,8 @@ import org.telegram.messenger.AndroidUtilities; import org.telegram.ui.Adapters.FiltersView; +import org.telegram.ui.Components.RLottieDrawable; +import org.telegram.ui.Components.RLottieImageView; public class ActionBarMenu extends LinearLayout { @@ -86,7 +88,11 @@ public ActionBarMenuItem addItem(int id, int icon, CharSequence text, int backgr addView(menuItem, layoutParams); } else { if (drawable != null) { - menuItem.iconView.setImageDrawable(drawable); + if (drawable instanceof RLottieDrawable) { + menuItem.iconView.setAnimation((RLottieDrawable) drawable); + } else { + menuItem.iconView.setImageDrawable(drawable); + } } else if (icon != 0) { menuItem.iconView.setImageResource(icon); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenuItem.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenuItem.java index fcd32b718df..eb3ca6981ee 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenuItem.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenuItem.java @@ -51,7 +51,6 @@ import android.widget.TextView; import androidx.core.graphics.ColorUtils; -import androidx.core.view.ViewCompat; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ImageLocation; @@ -67,6 +66,8 @@ import org.telegram.ui.Components.CubicBezierInterpolator; import org.telegram.ui.Components.EditTextBoldCursor; import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.RLottieDrawable; +import org.telegram.ui.Components.RLottieImageView; import java.util.ArrayList; @@ -133,7 +134,7 @@ public interface ActionBarMenuItemDelegate { private ArrayList searchFilterViews = new ArrayList<>(); private TextView searchFieldCaption; private ImageView clearButton; - protected ImageView iconView; + protected RLottieImageView iconView; protected TextView textView; private FrameLayout searchContainer; private boolean isSearchField; @@ -188,7 +189,7 @@ public ActionBarMenuItem(Context context, ActionBarMenu menu, int backgroundColo } addView(textView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.MATCH_PARENT)); } else { - iconView = new ImageView(context); + iconView = new RLottieImageView(context); iconView.setScaleType(ImageView.ScaleType.CENTER); iconView.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO); addView(iconView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); @@ -426,14 +427,18 @@ public TextView addSubItem(int id, CharSequence text) { } public ActionBarMenuSubItem addSubItem(int id, int icon, CharSequence text) { - return addSubItem(id, icon, text, false); + return addSubItem(id, icon, null, text, false); } public ActionBarMenuSubItem addSubItem(int id, int icon, CharSequence text, boolean needCheck) { + return addSubItem(id, icon, null, text, needCheck); + } + + public ActionBarMenuSubItem addSubItem(int id, int icon, Drawable iconDrawable, CharSequence text, boolean needCheck) { createPopupLayout(); ActionBarMenuSubItem cell = new ActionBarMenuSubItem(getContext(), needCheck, false, false); - cell.setTextAndIcon(text, icon); + cell.setTextAndIcon(text, icon, iconDrawable); cell.setMinimumWidth(AndroidUtilities.dp(196)); cell.setTag(id); popupLayout.addView(cell); @@ -839,10 +844,14 @@ public void setIcon(Drawable drawable) { if (iconView == null) { return; } - iconView.setImageDrawable(drawable); + if (drawable instanceof RLottieDrawable) { + iconView.setAnimation((RLottieDrawable) drawable); + } else { + iconView.setImageDrawable(drawable); + } } - public ImageView getIconView() { + public RLottieImageView getIconView() { return iconView; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenuSubItem.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenuSubItem.java index d957101080a..d31ea552f4a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenuSubItem.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenuSubItem.java @@ -3,6 +3,7 @@ import android.content.Context; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; +import android.graphics.drawable.Drawable; import android.text.TextUtils; import android.util.TypedValue; import android.view.Gravity; @@ -19,6 +20,7 @@ public class ActionBarMenuSubItem extends FrameLayout { private TextView textView; + private TextView subtextView; private ImageView imageView; private ImageView checkView; @@ -82,9 +84,17 @@ public void setCheckColor(int color) { } public void setTextAndIcon(CharSequence text, int icon) { + setTextAndIcon(text, icon, null); + } + + public void setTextAndIcon(CharSequence text, int icon, Drawable iconDrawable) { textView.setText(text); - if (icon != 0 || checkView != null) { - imageView.setImageResource(icon); + if (icon != 0 || iconDrawable != null || checkView != null) { + if (iconDrawable != null) { + imageView.setImageDrawable(iconDrawable); + } else { + imageView.setImageResource(icon); + } imageView.setVisibility(VISIBLE); textView.setPadding(LocaleController.isRTL ? 0 : AndroidUtilities.dp(43), 0, LocaleController.isRTL ? AndroidUtilities.dp(43) : 0, 0); } else { @@ -118,10 +128,38 @@ public void setText(String text) { textView.setText(text); } + public void setSubtext(String text) { + if (subtextView == null) { + subtextView = new TextView(getContext()); + subtextView.setLines(1); + subtextView.setSingleLine(true); + subtextView.setGravity(Gravity.LEFT); + subtextView.setEllipsize(TextUtils.TruncateAt.END); + subtextView.setTextColor(0xff7C8286); + subtextView.setVisibility(GONE); + subtextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); + subtextView.setPadding(LocaleController.isRTL ? 0 : AndroidUtilities.dp(43), 0, LocaleController.isRTL ? AndroidUtilities.dp(43) : 0, 0); + addView(subtextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL, 0, 10, 0, 0)); + } + boolean visible = !TextUtils.isEmpty(text); + boolean oldVisible = subtextView.getVisibility() == VISIBLE; + if (visible != oldVisible) { + subtextView.setVisibility(visible ? VISIBLE : GONE); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) textView.getLayoutParams(); + layoutParams.bottomMargin = visible ? AndroidUtilities.dp(10) : 0; + textView.setLayoutParams(layoutParams); + } + subtextView.setText(text); + } + public TextView getTextView() { return textView; } + public ImageView getImageView() { + return imageView; + } + public void setSelectorColor(int selectorColor) { if (this.selectorColor != selectorColor) { this.selectorColor = selectorColor; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BottomSheet.java index cec521da72b..96064d4f00b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BottomSheet.java @@ -143,6 +143,8 @@ public class BottomSheet extends Dialog { protected String navBarColorKey = Theme.key_windowBackgroundGray; protected int navBarColor; + private OnDismissListener onHideListener; + public void setDisableScroll(boolean b) { disableScroll = b; } @@ -725,7 +727,11 @@ public boolean drawChild(Canvas canvas, View child, long drawingTime) { container.setOnApplyWindowInsetsListener((v, insets) -> { lastInsets = insets; v.requestLayout(); - return insets.consumeSystemWindowInsets(); + if (Build.VERSION.SDK_INT >= 30) { + return WindowInsets.CONSUMED; + } else { + return insets.consumeSystemWindowInsets(); + } }); container.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); } @@ -738,6 +744,9 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Window window = getWindow(); + /*if (Build.VERSION.SDK_INT >= 30) { + window.setDecorFitsSystemWindows(true); + }*/ window.setWindowAnimations(R.style.DialogNoAnimation); setContentView(container, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); @@ -998,6 +1007,10 @@ private void cancelSheetAnimation() { } } + public void setOnHideListener(OnDismissListener listener) { + onHideListener = listener; + } + private void startOpenAnimation() { if (dismissed) { return; @@ -1173,6 +1186,9 @@ public void dismiss() { return; } dismissed = true; + if (onHideListener != null) { + onHideListener.onDismiss(this); + } cancelSheetAnimation(); if (!allowCustomAnimation || !onCustomCloseAnimation()) { currentSheetAnimationType = 2; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/DrawerLayoutContainer.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/DrawerLayoutContainer.java index 57019a0657d..faa29d4fc68 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/DrawerLayoutContainer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/DrawerLayoutContainer.java @@ -119,7 +119,11 @@ public DrawerLayoutContainer(Context context) { hasCutout = cutout != null && cutout.getBoundingRects().size() != 0; } invalidate(); - return insets.consumeSystemWindowInsets(); + if (Build.VERSION.SDK_INT >= 30) { + return WindowInsets.CONSUMED; + } else { + return insets.consumeSystemWindowInsets(); + } }); setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/Theme.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/Theme.java index 7ac2e24f416..dfcd66ce117 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/Theme.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/Theme.java @@ -2019,6 +2019,7 @@ public void run() { public static Drawable dialogs_muteDrawable; public static Drawable dialogs_verifiedDrawable; public static ScamDrawable dialogs_scamDrawable; + public static ScamDrawable dialogs_fakeDrawable; public static Drawable dialogs_verifiedCheckDrawable; public static Drawable dialogs_pinnedDrawable; public static Drawable dialogs_mentionDrawable; @@ -5886,7 +5887,7 @@ public static void checkAutoNightThemeConditions(boolean force) { } } - private static void applyDayNightThemeMaybe(boolean night) { + public static void applyDayNightThemeMaybe(boolean night) { if (previousTheme != null) { return; } @@ -6907,7 +6908,8 @@ public static void createDialogsResources(Context context) { dialogs_broadcastDrawable = resources.getDrawable(R.drawable.list_broadcast); dialogs_muteDrawable = resources.getDrawable(R.drawable.list_mute).mutate(); dialogs_verifiedDrawable = resources.getDrawable(R.drawable.verified_area); - dialogs_scamDrawable = new ScamDrawable(11); + dialogs_scamDrawable = new ScamDrawable(11, 0); + dialogs_fakeDrawable = new ScamDrawable(11, 1); dialogs_verifiedCheckDrawable = resources.getDrawable(R.drawable.verified_check); dialogs_mentionDrawable = resources.getDrawable(R.drawable.mentionchatslist); dialogs_botDrawable = resources.getDrawable(R.drawable.list_bot); @@ -6969,6 +6971,7 @@ public static void applyDialogsTheme() { setDrawableColorByKey(dialogs_verifiedCheckDrawable, key_chats_verifiedCheck); setDrawableColorByKey(dialogs_holidayDrawable, key_actionBarDefaultTitle); setDrawableColorByKey(dialogs_scamDrawable, key_chats_draft); + setDrawableColorByKey(dialogs_fakeDrawable, key_chats_draft); } public static void destroyResources() { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ThemeDescription.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ThemeDescription.java index 77db4b4435d..7eac8fb76fd 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ThemeDescription.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ThemeDescription.java @@ -30,6 +30,7 @@ import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.FileLog; +import org.telegram.ui.Components.AudioPlayerAlert; import org.telegram.ui.Components.AvatarDrawable; import org.telegram.ui.Components.BackupImageView; import org.telegram.ui.Components.ChatBigEmptyView; @@ -62,6 +63,8 @@ import androidx.viewpager.widget.ViewPager; +import com.google.android.exoplayer2.util.Log; + public class ThemeDescription { public static int FLAG_BACKGROUND = 0x00000001; @@ -533,6 +536,13 @@ private void processViewColor(View child, int color) { } else if ((changeFlags & FLAG_TEXTCOLOR) != 0) { if (child instanceof TextView) { ((TextView) child).setTextColor(color); + } else if (child instanceof AudioPlayerAlert.ClippingTextViewSwitcher) { + for (int i = 0; i < 2; i++) { + TextView textView = i == 0 ? ((AudioPlayerAlert.ClippingTextViewSwitcher) child).getTextView() : ((AudioPlayerAlert.ClippingTextViewSwitcher) child).getNextTextView(); + if (textView != null) { + textView.setTextColor(color); + } + } } } else if ((changeFlags & FLAG_SERVICEBACKGROUND) != 0) { Drawable background = child.getBackground(); @@ -710,6 +720,32 @@ private void processViewColor(View child, int color) { } else { ((SeekBarView) object).setInnerColor(color); } + } else if (object instanceof AudioPlayerAlert.ClippingTextViewSwitcher) { + if ((changeFlags & FLAG_FASTSCROLL) != 0) { + for (int k = 0; k < 2; k++) { + TextView textView = k == 0 ? ((AudioPlayerAlert.ClippingTextViewSwitcher) object).getTextView() : ((AudioPlayerAlert.ClippingTextViewSwitcher) object).getNextTextView(); + if (textView != null) { + CharSequence text = textView.getText(); + if (text instanceof SpannedString) { + TypefaceSpan[] spans = ((SpannedString) text).getSpans(0, text.length(), TypefaceSpan.class); + if (spans != null && spans.length > 0) { + for (int i = 0; i < spans.length; i++) { + spans[i].setColor(color); + } + } + } + } + } + } else if ((changeFlags & FLAG_TEXTCOLOR) != 0) { + if ((changeFlags & FLAG_CHECKTAG) == 0 || checkTag(currentKey, (View) object)) { + for (int i = 0; i < 2; i++) { + TextView textView = i == 0 ? ((AudioPlayerAlert.ClippingTextViewSwitcher) object).getTextView() : ((AudioPlayerAlert.ClippingTextViewSwitcher) object).getNextTextView(); + if (textView != null) { + textView.setTextColor(color); + } + } + } + } } } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DialogsAdapter.java b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DialogsAdapter.java index 1e0ba3e1b13..90cb3734bdc 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DialogsAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DialogsAdapter.java @@ -10,6 +10,9 @@ import android.content.Context; import android.content.SharedPreferences; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; +import android.graphics.Rect; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Build; @@ -27,13 +30,16 @@ import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ContactsController; import org.telegram.messenger.DialogObject; -import org.telegram.messenger.DownloadController; +import org.telegram.messenger.Emoji; +import org.telegram.messenger.FileLoader; import org.telegram.messenger.FileLog; +import org.telegram.messenger.ImageLocation; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MessagesController; import org.telegram.messenger.R; import org.telegram.messenger.SharedConfig; import org.telegram.messenger.UserConfig; +import org.telegram.messenger.Utilities; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; @@ -44,10 +50,12 @@ import org.telegram.ui.Cells.DialogMeUrlCell; import org.telegram.ui.Cells.DialogsEmptyCell; import org.telegram.ui.Cells.HeaderCell; -import org.telegram.ui.Cells.LoadingCell; import org.telegram.ui.Cells.ShadowSectionCell; +import org.telegram.ui.Cells.TextCell; +import org.telegram.ui.Cells.TextInfoPrivacyCell; import org.telegram.ui.Cells.UserCell; import org.telegram.ui.Components.CombinedDrawable; +import org.telegram.ui.Components.FlickerLoadingView; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.PullForegroundDrawable; import org.telegram.ui.Components.RecyclerListView; @@ -62,7 +70,9 @@ public class DialogsAdapter extends RecyclerListView.SelectionAdapter { private Context mContext; private ArchiveHintCell archiveHintCell; private ArrayList onlineContacts; + private int dialogsCount; private int prevContactsCount; + private int prevDialogsCount; private int dialogsType; private int folderId; private long openedDialogId; @@ -77,10 +87,19 @@ public class DialogsAdapter extends RecyclerListView.SelectionAdapter { private long lastSortTime; private PullForegroundDrawable pullForegroundDrawable; + private Drawable arrowDrawable; + + private ArrayList preloadedStickers = new ArrayList<>(); + private boolean preloadingSticker; + private DialogsPreloader preloader; + private boolean forceShowEmptyCell; - public DialogsAdapter(Context context, int type, int folder, boolean onlySelect, ArrayList selected, int account) { + private DialogsActivity parentFragment; + + public DialogsAdapter(DialogsActivity fragment, Context context, int type, int folder, boolean onlySelect, ArrayList selected, int account) { mContext = context; + parentFragment = fragment; dialogsType = type; folderId = folder; isOnlySelect = onlySelect; @@ -114,6 +133,10 @@ public int fixPosition(int position) { } if (showArchiveHint) { position -= 2; + } else if (dialogsType == 11 || dialogsType == 13) { + position -= 2; + } else if (dialogsType == 12) { + position -= 1; } return position; } @@ -128,11 +151,37 @@ public void setDialogsType(int type) { notifyDataSetChanged(); } + private void preloadGreetingsSticker() { + if (preloadingSticker) { + return; + } + preloadingSticker = true; + TLRPC.TL_messages_getStickers req = new TLRPC.TL_messages_getStickers(); + req.emoticon = "\uD83D\uDC4B" + Emoji.fixEmoji("⭐"); + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> { + if (response instanceof TLRPC.TL_messages_stickers) { + ArrayList list = ((TLRPC.TL_messages_stickers) response).stickers; + if (!list.isEmpty()) { + for (int a = 0; a < 5; a++) { + TLRPC.Document sticker = list.get(Math.abs(Utilities.random.nextInt() % list.size())); + AndroidUtilities.runOnUIThread(() -> FileLoader.getInstance(currentAccount).loadFile(ImageLocation.getForDocument(sticker), sticker, null, 0, 1)); + preloadedStickers.add(sticker); + } + } + } + }); + } + + public TLRPC.Document getPreloadedSticker() { + return onlineContacts != null && !preloadedStickers.isEmpty() ? preloadedStickers.get(Utilities.random.nextInt(preloadedStickers.size())) : null; + } + @Override public int getItemCount() { - ArrayList array = DialogsActivity.getDialogsArray(currentAccount, dialogsType, folderId, dialogsListFrozen); - int dialogsCount = array.size(); - if (dialogsType != 7 && dialogsType != 8 && dialogsCount == 0 && (folderId != 0 || MessagesController.getInstance(currentAccount).isLoadingDialogs(folderId) || !MessagesController.getInstance(currentAccount).isDialogsEndReached(folderId))) { + MessagesController messagesController = MessagesController.getInstance(currentAccount); + ArrayList array = parentFragment.getDialogsArray(currentAccount, dialogsType, folderId, dialogsListFrozen); + dialogsCount = array.size(); + if (!forceShowEmptyCell && dialogsType != 7 && dialogsType != 8 && dialogsType != 11 && dialogsCount == 0 && (folderId != 0 || messagesController.isLoadingDialogs(folderId) || !MessagesController.getInstance(currentAccount).isDialogsEndReached(folderId))) { onlineContacts = null; if (folderId == 1 && showArchiveHint) { return (currentCount = 2); @@ -145,52 +194,76 @@ public int getItemCount() { count++; } } else { - if (!MessagesController.getInstance(currentAccount).isDialogsEndReached(folderId) || dialogsCount == 0) { + if (!messagesController.isDialogsEndReached(folderId) || dialogsCount == 0) { count++; } } boolean hasContacts = false; if (hasHints) { - count += 2 + MessagesController.getInstance(currentAccount).hintDialogs.size(); - } else if (dialogsType == 0 && dialogsCount == 0 && folderId == 0) { + count += 2 + messagesController.hintDialogs.size(); + } else if (dialogsType == 0 && dialogsCount <= 10 && folderId == 0 && messagesController.isDialogsEndReached(folderId)) { if (ContactsController.getInstance(currentAccount).contacts.isEmpty() && ContactsController.getInstance(currentAccount).isLoadingContacts()) { onlineContacts = null; return (currentCount = 0); } if (!ContactsController.getInstance(currentAccount).contacts.isEmpty()) { - if (onlineContacts == null || prevContactsCount != ContactsController.getInstance(currentAccount).contacts.size()) { + if (onlineContacts == null || prevDialogsCount != messagesController.dialogs_dict.size() || prevContactsCount != ContactsController.getInstance(currentAccount).contacts.size()) { onlineContacts = new ArrayList<>(ContactsController.getInstance(currentAccount).contacts); prevContactsCount = onlineContacts.size(); + prevDialogsCount = messagesController.dialogs_dict.size(); int selfId = UserConfig.getInstance(currentAccount).clientUserId; for (int a = 0, N = onlineContacts.size(); a < N; a++) { - if (onlineContacts.get(a).user_id == selfId) { + int userId = onlineContacts.get(a).user_id; + if (userId == selfId || messagesController.dialogs_dict.get(userId) != null) { onlineContacts.remove(a); - break; + a--; + N--; } } + if (onlineContacts.isEmpty()) { + onlineContacts = null; + } sortOnlineContacts(false); } - count += onlineContacts.size() + 2; - hasContacts = true; + if (onlineContacts != null) { + count += onlineContacts.size() + 2; + hasContacts = true; + } } } - if (!hasContacts && onlineContacts != null) { - onlineContacts = null; + if (folderId == 0 && onlineContacts != null) { + if (!hasContacts) { + onlineContacts = null; + } else { + preloadGreetingsSticker(); + } } if (folderId == 1 && showArchiveHint) { count += 2; } if (folderId == 0 && dialogsCount != 0) { count++; + if (dialogsCount > 10 && dialogsType == 0) { + count++; + } + } + if (dialogsType == 11 || dialogsType == 13) { + count += 2; + } else if (dialogsType == 12) { + count += 1; } currentCount = count; return count; } public TLObject getItem(int i) { - if (onlineContacts != null) { - i -= 3; + if (onlineContacts != null && (dialogsCount == 0 || i >= dialogsCount)) { + if (dialogsCount == 0) { + i -= 3; + } else { + i -= dialogsCount + 2; + } if (i < 0 || i >= onlineContacts.size()) { return null; } @@ -198,8 +271,12 @@ public TLObject getItem(int i) { } if (showArchiveHint) { i -= 2; + } else if (dialogsType == 11 || dialogsType == 13) { + i -= 2; + } else if (dialogsType == 12) { + i -= 1; } - ArrayList arrayList = DialogsActivity.getDialogsArray(currentAccount, dialogsType, folderId, dialogsListFrozen); + ArrayList arrayList = parentFragment.getDialogsArray(currentAccount, dialogsType, folderId, dialogsListFrozen); if (hasHints) { int count = MessagesController.getInstance(currentAccount).hintDialogs.size(); if (i < 2 + count) { @@ -257,7 +334,7 @@ public void sortOnlineContacts(boolean notify) { return 0; } else if (status1 < 0 && status2 > 0 || status1 == 0 && status2 != 0) { return -1; - } else if (status2 < 0 && status1 > 0 || status2 == 0 && status1 != 0) { + } else if (status2 < 0 || status1 != 0) { return 1; } return 0; @@ -299,7 +376,7 @@ public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) { @Override public boolean isEnabled(RecyclerView.ViewHolder holder) { int viewType = holder.getItemViewType(); - return viewType != 1 && viewType != 5 && viewType != 3 && viewType != 8 && viewType != 7 && viewType != 9 && viewType != 10; + return viewType != 1 && viewType != 5 && viewType != 3 && viewType != 8 && viewType != 7 && viewType != 9 && viewType != 10 && viewType != 11; } @Override @@ -307,13 +384,16 @@ public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewT View view; switch (viewType) { case 0: - DialogCell dialogCell = new DialogCell(mContext, true, false, currentAccount); + DialogCell dialogCell = new DialogCell(parentFragment, mContext, true, false, currentAccount); dialogCell.setArchivedPullAnimation(pullForegroundDrawable); dialogCell.setPreloader(preloader); view = dialogCell; break; case 1: - view = new LoadingCell(mContext); + FlickerLoadingView flickerLoadingView = new FlickerLoadingView(mContext); + flickerLoadingView.setIsSingleCell(true); + flickerLoadingView.setViewType(FlickerLoadingView.DIALOG_CELL_TYPE); + view = flickerLoadingView; break; case 2: { HeaderCell headerCell = new HeaderCell(mContext); @@ -359,17 +439,16 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { view = new UserCell(mContext, 8, 0, false); break; case 7: - HeaderCell headerCell = new HeaderCell(mContext); - headerCell.setText(LocaleController.getString("YourContacts", R.string.YourContacts)); - view = headerCell; + view = new HeaderCell(mContext); break; - case 8: + case 8: { view = new ShadowSectionCell(mContext); Drawable drawable = Theme.getThemedDrawable(mContext, R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow); CombinedDrawable combinedDrawable = new CombinedDrawable(new ColorDrawable(Theme.getColor(Theme.key_windowBackgroundGray)), drawable); combinedDrawable.setFullsize(true); view.setBackgroundDrawable(combinedDrawable); break; + } case 9: view = archiveHintCell; if (archiveHintCell.getParent() != null) { @@ -377,12 +456,11 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { parent.removeView(archiveHintCell); } break; - case 10: - default: { + case 10: { view = new View(mContext) { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - int size = DialogsActivity.getDialogsArray(currentAccount, dialogsType, folderId, dialogsListFrozen).size(); + int size = parentFragment.getDialogsArray(currentAccount, dialogsType, folderId, dialogsListFrozen).size(); boolean hasArchive = dialogsType == 0 && MessagesController.getInstance(currentAccount).dialogs_dict.get(DialogObject.makeFolderDialogId(1)) != null; View parent = (View) getParent(); int height; @@ -399,6 +477,9 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { } int cellHeight = AndroidUtilities.dp(SharedConfig.useThreeLinesLayout ? 78 : 72); int dialogsHeight = size * cellHeight + (size - 1); + if (onlineContacts != null) { + dialogsHeight += onlineContacts.size() * AndroidUtilities.dp(58) + (onlineContacts.size() - 1) + AndroidUtilities.dp(52); + } int archiveHeight = (hasArchive ? cellHeight + 1 : 0); if (dialogsHeight < height) { height = height - dialogsHeight + archiveHeight; @@ -423,6 +504,65 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), height); } }; + break; + } + case 11: { + view = new TextInfoPrivacyCell(mContext) { + + private int movement; + private float moveProgress; + private long lastUpdateTime; + private int x; + private int y; + + @Override + protected void onTextDraw() { + if (arrowDrawable != null) { + Rect bounds = arrowDrawable.getBounds(); + int dx = (int) (moveProgress * AndroidUtilities.dp(3)); + arrowDrawable.setBounds(x + dx, y + AndroidUtilities.dp(1), x + dx + bounds.width(), y + AndroidUtilities.dp(1) + bounds.height()); + + long newUpdateTime = SystemClock.elapsedRealtime(); + long dt = newUpdateTime - lastUpdateTime; + if (dt > 17) { + dt = 17; + } + lastUpdateTime = newUpdateTime; + if (movement == 0) { + moveProgress += dt / 664.0f; + if (moveProgress >= 1.0f) { + movement = 1; + moveProgress = 1.0f; + } + } else { + moveProgress -= dt / 664.0f; + if (moveProgress <= 0.0f) { + movement = 0; + moveProgress = 0.0f; + } + } + getTextView().invalidate(); + } + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + if (arrowDrawable != null) { + x = arrowDrawable.getBounds().left; + y = arrowDrawable.getBounds().top; + } + } + }; + Drawable drawable = Theme.getThemedDrawable(mContext, R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow); + CombinedDrawable combinedDrawable = new CombinedDrawable(new ColorDrawable(Theme.getColor(Theme.key_windowBackgroundGray)), drawable); + combinedDrawable.setFullsize(true); + view.setBackgroundDrawable(combinedDrawable); + break; + } + case 12: + default: { + view = new TextCell(mContext); } } view.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, viewType == 5 ? RecyclerView.LayoutParams.MATCH_PARENT : RecyclerView.LayoutParams.WRAP_CONTENT)); @@ -436,11 +576,7 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, int i) { DialogCell cell = (DialogCell) holder.itemView; TLRPC.Dialog dialog = (TLRPC.Dialog) getItem(i); TLRPC.Dialog nextDialog = (TLRPC.Dialog) getItem(i + 1); - if (folderId == 0) { - cell.useSeparator = (i != getItemCount() - 2); - } else { - cell.useSeparator = (i != getItemCount() - 1); - } + cell.useSeparator = nextDialog != null; cell.fullSeparator = dialog.pinned && nextDialog != null && !nextDialog.pinned; if (dialogsType == 0) { if (AndroidUtilities.isTablet()) { @@ -474,25 +610,76 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, int i) { } case 6: { UserCell cell = (UserCell) holder.itemView; - TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(onlineContacts.get(i - 3).user_id); + int position; + if (dialogsCount == 0) { + position = i - 3; + } else { + position = i - dialogsCount - 2; + } + TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(onlineContacts.get(position).user_id); cell.setData(user, null, null, 0); break; } + case 7: { + HeaderCell cell = (HeaderCell) holder.itemView; + if (dialogsType == 11 || dialogsType == 12 || dialogsType == 13) { + if (i == 0) { + cell.setText(LocaleController.getString("ImportHeader", R.string.ImportHeader)); + } else { + cell.setText(LocaleController.getString("ImportHeaderContacts", R.string.ImportHeaderContacts)); + } + } else { + cell.setText(LocaleController.getString("YourContacts", R.string.YourContacts)); + } + break; + } + case 11: { + TextInfoPrivacyCell cell = (TextInfoPrivacyCell) holder.itemView; + cell.setText(LocaleController.getString("TapOnThePencil", R.string.TapOnThePencil)); + if (arrowDrawable == null) { + arrowDrawable = mContext.getResources().getDrawable(R.drawable.arrow_newchat); + arrowDrawable.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText4), PorterDuff.Mode.MULTIPLY)); + } + TextView textView = cell.getTextView(); + textView.setCompoundDrawablePadding(AndroidUtilities.dp(4)); + textView.setCompoundDrawablesWithIntrinsicBounds(null, null, arrowDrawable, null); + textView.getLayoutParams().width = LayoutHelper.WRAP_CONTENT; + break; + } + case 12: { + TextCell cell = (TextCell) holder.itemView; + cell.setColors(Theme.key_windowBackgroundWhiteBlueText4, Theme.key_windowBackgroundWhiteBlueText4); + cell.setTextAndIcon(LocaleController.getString("CreateGroupForImport", R.string.CreateGroupForImport), R.drawable.groups_create, dialogsCount != 0); + cell.setIsInDialogs(); + cell.setOffsetFromImage(75); + break; + } } } @Override public int getItemViewType(int i) { if (onlineContacts != null) { - if (i == 0) { - return 5; - } else if (i == 1) { - return 8; - } else if (i == 2) { - return 7; + if (dialogsCount == 0) { + if (i == 0) { + return 5; + } else if (i == 1) { + return 8; + } else if (i == 2) { + return 7; + } } else { - return 6; + if (i < dialogsCount) { + return 0; + } else if (i == dialogsCount) { + return 8; + } else if (i == dialogsCount + 1) { + return 7; + } else if (i == currentCount - 1) { + return 10; + } } + return 6; } else if (hasHints) { int count = MessagesController.getInstance(currentAccount).hintDialogs.size(); if (i < 2 + count) { @@ -513,10 +700,27 @@ public int getItemViewType(int i) { } else { i -= 2; } + } else if (dialogsType == 11 || dialogsType == 13) { + if (i == 0) { + return 7; + } else if (i == 1) { + return 12; + } else { + i -= 2; + } + } else if (dialogsType == 12) { + if (i == 0) { + return 7; + } else { + i -= 1; + } + } + if (folderId == 0 && dialogsCount > 10 && i == currentCount - 2 && dialogsType == 0) { + return 11; } - int size = DialogsActivity.getDialogsArray(currentAccount, dialogsType, folderId, dialogsListFrozen).size(); + int size = parentFragment.getDialogsArray(currentAccount, dialogsType, folderId, dialogsListFrozen).size(); if (i == size) { - if (dialogsType != 7 && dialogsType != 8 && !MessagesController.getInstance(currentAccount).isDialogsEndReached(folderId)) { + if (!forceShowEmptyCell && dialogsType != 7 && dialogsType != 8 && !MessagesController.getInstance(currentAccount).isDialogsEndReached(folderId)) { return 1; } else if (size == 0) { return 5; @@ -531,7 +735,7 @@ public int getItemViewType(int i) { @Override public void notifyItemMoved(int fromPosition, int toPosition) { - ArrayList dialogs = DialogsActivity.getDialogsArray(currentAccount, dialogsType, folderId, false); + ArrayList dialogs = parentFragment.getDialogsArray(currentAccount, dialogsType, folderId, false); int fromIndex = fixPosition(fromPosition); int toIndex = fixPosition(toPosition); TLRPC.Dialog fromDialog = dialogs.get(fromIndex); @@ -682,4 +886,12 @@ public void pause() { resumed = false; } } + + public int getCurrentCount() { + return currentCount; + } + + public void setForceShowEmptyCell(boolean forceShowEmptyCell) { + this.forceShowEmptyCell = forceShowEmptyCell; + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DialogsSearchAdapter.java b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DialogsSearchAdapter.java index 4787bdf9301..06639ace908 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DialogsSearchAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DialogsSearchAdapter.java @@ -93,6 +93,7 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { private ArrayList localTipDates = new ArrayList<>(); private FilteredSearchView.Delegate filtersDelegate; private int folderId; + private int currentItemCount; public boolean isSearching() { return waitingResponseCount > 0; @@ -358,11 +359,11 @@ private void searchMessagesInternal(final String query, int searchId) { } public boolean hasRecentSearch() { - return dialogsType != 2 && dialogsType != 4 && dialogsType != 5 && dialogsType != 6 && (!recentSearchObjects.isEmpty() || !MediaDataController.getInstance(currentAccount).hints.isEmpty()); + return dialogsType != 2 && dialogsType != 4 && dialogsType != 5 && dialogsType != 6 && dialogsType != 11 && (!recentSearchObjects.isEmpty() || !MediaDataController.getInstance(currentAccount).hints.isEmpty()); } public boolean isRecentSearchDisplayed() { - return needMessagesSearch != 2 && !searchWas && (!recentSearchObjects.isEmpty() || !MediaDataController.getInstance(currentAccount).hints.isEmpty()) && dialogsType != 2 && dialogsType != 4 && dialogsType != 5 && dialogsType != 6; + return needMessagesSearch != 2 && !searchWas && (!recentSearchObjects.isEmpty() || !MediaDataController.getInstance(currentAccount).hints.isEmpty()) && dialogsType != 2 && dialogsType != 4 && dialogsType != 5 && dialogsType != 6 && dialogsType != 11; } public void loadRecentSearch() { @@ -646,7 +647,7 @@ public void searchDialogs(String text) { searchResultNames.clear(); searchResultHashtags.clear(); searchAdapterHelper.mergeResults(null); - searchAdapterHelper.queryServerSearch(null, true, true, true, true, dialogsType == 2, 0, dialogsType == 0, 0, 0); + searchAdapterHelper.queryServerSearch(null, true, true, dialogsType != 11, dialogsType != 11, dialogsType == 2 || dialogsType == 11, 0, dialogsType == 0, 0, 0); searchWas = false; lastSearchId = 0; waitingResponseCount = 0; @@ -695,7 +696,7 @@ public void searchDialogs(String text) { return; } if (needMessagesSearch != 2) { - searchAdapterHelper.queryServerSearch(query, true, dialogsType != 4, true, dialogsType != 4, dialogsType == 2, 0, dialogsType == 0, 0, searchId); + searchAdapterHelper.queryServerSearch(query, true, dialogsType != 4, true, dialogsType != 4 && dialogsType != 11, dialogsType == 2 || dialogsType == 1, 0, dialogsType == 0, 0, searchId); } else { waitingResponseCount -= 2; } @@ -737,7 +738,7 @@ public int getItemCount() { if (messagesCount != 0) { count += messagesCount + 1 + (messagesSearchEndReached ? 0 : 1); } - return count; + return currentItemCount = count; } public Object getItem(int i) { @@ -865,7 +866,7 @@ public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType view = new GraySectionCell(mContext); break; case 2: - view = new DialogCell(mContext, false, true); + view = new DialogCell(null, mContext, false, true); break; case 3: FlickerLoadingView flickerLoadingView = new FlickerLoadingView(mContext); @@ -1181,4 +1182,8 @@ public void setFiltersDelegate(FilteredSearchView.Delegate filtersDelegate, bool filtersDelegate.updateFiltersView(false, null, localTipDates); } } + + public int getCurrentItemCount() { + return currentItemCount; + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/MessagesSearchAdapter.java b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/MessagesSearchAdapter.java index 383aa5d45f3..6ec6b1a3c9c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/MessagesSearchAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/MessagesSearchAdapter.java @@ -67,7 +67,7 @@ public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType View view = null; switch (viewType) { case 0: - view = new DialogCell(mContext, false, true); + view = new DialogCell(null, mContext, false, true); break; case 1: view = new LoadingCell(mContext); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/StickersAdapter.java b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/StickersAdapter.java index 10522610ef0..9a6806bd2ff 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/StickersAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/StickersAdapter.java @@ -18,6 +18,7 @@ import org.telegram.messenger.Emoji; import org.telegram.messenger.ImageLocation; import org.telegram.messenger.MessageObject; +import org.telegram.messenger.MessagesController; import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.SharedConfig; import org.telegram.messenger.UserConfig; @@ -90,7 +91,7 @@ public void didReceivedNotification(int id, int account, final Object... args) { String fileName = (String) args[0]; stickersToLoad.remove(fileName); if (stickersToLoad.isEmpty()) { - boolean show = stickers != null && !stickers.isEmpty() && stickersToLoad.isEmpty(); + boolean show = stickers != null && !stickers.isEmpty(); if (show) { keywordResults = null; } @@ -269,73 +270,76 @@ public void loadStikersForEmoji(CharSequence emoji, boolean emojiOnly) { ConnectionsManager.getInstance(currentAccount).cancelRequest(lastReqId, true); lastReqId = 0; } + boolean serverStickersOnly = MessagesController.getInstance(currentAccount).suggestStickersApiOnly; delayLocalResults = false; - final ArrayList recentStickers = MediaDataController.getInstance(currentAccount).getRecentStickersNoCopy(MediaDataController.TYPE_IMAGE); - final ArrayList favsStickers = MediaDataController.getInstance(currentAccount).getRecentStickersNoCopy(MediaDataController.TYPE_FAVE); - int recentsAdded = 0; - for (int a = 0, size = Math.min(20, recentStickers.size()); a < size; a++) { - TLRPC.Document document = recentStickers.get(a); - if (isValidSticker(document, lastSticker)) { - addStickerToResult(document, "recent"); - recentsAdded++; - if (recentsAdded >= 5) { - break; + if (!serverStickersOnly) { + final ArrayList recentStickers = MediaDataController.getInstance(currentAccount).getRecentStickersNoCopy(MediaDataController.TYPE_IMAGE); + final ArrayList favsStickers = MediaDataController.getInstance(currentAccount).getRecentStickersNoCopy(MediaDataController.TYPE_FAVE); + int recentsAdded = 0; + for (int a = 0, size = Math.min(20, recentStickers.size()); a < size; a++) { + TLRPC.Document document = recentStickers.get(a); + if (isValidSticker(document, lastSticker)) { + addStickerToResult(document, "recent"); + recentsAdded++; + if (recentsAdded >= 5) { + break; + } } } - } - for (int a = 0, size = favsStickers.size(); a < size; a++) { - TLRPC.Document document = favsStickers.get(a); - if (isValidSticker(document, lastSticker)) { - addStickerToResult(document, "fav"); + for (int a = 0, size = favsStickers.size(); a < size; a++) { + TLRPC.Document document = favsStickers.get(a); + if (isValidSticker(document, lastSticker)) { + addStickerToResult(document, "fav"); + } } - } - HashMap> allStickers = MediaDataController.getInstance(currentAccount).getAllStickers(); - ArrayList newStickers = allStickers != null ? allStickers.get(lastSticker) : null; - if (newStickers != null && !newStickers.isEmpty()) { - addStickersToResult(newStickers, null); - } - if (stickers != null) { - Collections.sort(stickers, new Comparator() { - private int getIndex(StickerResult result) { - for (int a = 0; a < favsStickers.size(); a++) { - if (favsStickers.get(a).id == result.sticker.id) { - return a + 2000000; + HashMap> allStickers = MediaDataController.getInstance(currentAccount).getAllStickers(); + ArrayList newStickers = allStickers != null ? allStickers.get(lastSticker) : null; + if (newStickers != null && !newStickers.isEmpty()) { + addStickersToResult(newStickers, null); + } + if (stickers != null) { + Collections.sort(stickers, new Comparator() { + private int getIndex(StickerResult result) { + for (int a = 0; a < favsStickers.size(); a++) { + if (favsStickers.get(a).id == result.sticker.id) { + return a + 2000000; + } } - } - for (int a = 0; a < Math.min(20, recentStickers.size()); a++) { - if (recentStickers.get(a).id == result.sticker.id) { - return recentStickers.size() - a + 1000000; + for (int a = 0; a < Math.min(20, recentStickers.size()); a++) { + if (recentStickers.get(a).id == result.sticker.id) { + return recentStickers.size() - a + 1000000; + } } + return -1; } - return -1; - } - @Override - public int compare(StickerResult lhs, StickerResult rhs) { - boolean isAnimated1 = MessageObject.isAnimatedStickerDocument(lhs.sticker, true); - boolean isAnimated2 = MessageObject.isAnimatedStickerDocument(rhs.sticker, true); - if (isAnimated1 == isAnimated2) { - int idx1 = getIndex(lhs); - int idx2 = getIndex(rhs); - if (idx1 > idx2) { - return -1; - } else if (idx1 < idx2) { - return 1; - } - return 0; - } else { - if (isAnimated1 && !isAnimated2) { - return -1; + @Override + public int compare(StickerResult lhs, StickerResult rhs) { + boolean isAnimated1 = MessageObject.isAnimatedStickerDocument(lhs.sticker, true); + boolean isAnimated2 = MessageObject.isAnimatedStickerDocument(rhs.sticker, true); + if (isAnimated1 == isAnimated2) { + int idx1 = getIndex(lhs); + int idx2 = getIndex(rhs); + if (idx1 > idx2) { + return -1; + } else if (idx1 < idx2) { + return 1; + } + return 0; } else { - return 1; + if (isAnimated1) { + return -1; + } else { + return 1; + } } } - } - }); + }); + } } - if (SharedConfig.suggestStickers == 0) { + if (SharedConfig.suggestStickers == 0 || serverStickersOnly) { searchServerStickers(lastSticker, originalEmoji); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/StickersSearchAdapter.java b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/StickersSearchAdapter.java index 71b620a3a34..725c286841e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/StickersSearchAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/StickersSearchAdapter.java @@ -155,28 +155,25 @@ public void run() { MediaDataController.getInstance(currentAccount).fetchNewEmojiKeywords(newLanguage); } delegate.setLastSearchKeyboardLanguage(newLanguage); - MediaDataController.getInstance(currentAccount).getEmojiSuggestions(delegate.getLastSearchKeyboardLanguage(), searchQuery, false, new MediaDataController.KeywordResultCallback() { - @Override - public void run(ArrayList param, String alias) { - if (lastId != emojiSearchId) { - return; - } - boolean added = false; - for (int a = 0, size = param.size(); a < size; a++) { - String emoji = param.get(a).emoji; - ArrayList newStickers = allStickers != null ? allStickers.get(emoji) : null; - if (newStickers != null && !newStickers.isEmpty()) { - clear(); - if (!emojiStickers.containsKey(newStickers)) { - emojiStickers.put(newStickers, emoji); - emojiArrays.add(newStickers); - added = true; - } + MediaDataController.getInstance(currentAccount).getEmojiSuggestions(delegate.getLastSearchKeyboardLanguage(), searchQuery, false, (param, alias) -> { + if (lastId != emojiSearchId) { + return; + } + boolean added = false; + for (int a = 0, size = param.size(); a < size; a++) { + String emoji = param.get(a).emoji; + ArrayList newStickers = allStickers != null ? allStickers.get(emoji) : null; + if (newStickers != null && !newStickers.isEmpty()) { + clear(); + if (!emojiStickers.containsKey(newStickers)) { + emojiStickers.put(newStickers, emoji); + emojiArrays.add(newStickers); + added = true; } } - if (added) { - notifyDataSetChanged(); - } + } + if (added) { + notifyDataSetChanged(); } }); } @@ -400,7 +397,6 @@ public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { return new RecyclerListView.Holder(view); } - @SuppressWarnings("unchecked") @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { switch (holder.getItemViewType()) { @@ -449,8 +445,6 @@ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi if (holder.getItemViewType() == 3) { bindFeaturedStickerSetInfoCell((FeaturedStickerSetInfoCell) holder.itemView, position, true); } - } else { - super.onBindViewHolder(holder, position, payloads); } } @@ -545,7 +539,6 @@ private void bindFeaturedStickerSetInfoCell(FeaturedStickerSetInfoCell cell, int installing = false; } else if (removing && !cell.isInstalled()) { removingStickerSets.remove(stickerSetCovered.set.id); - removing = false; } } cell.setAddDrawProgress(!forceInstalled && installing, animated); @@ -601,7 +594,7 @@ public void notifyDataSetChanged() { } } int count = (int) Math.ceil(documentsCount / (float) delegate.getStickersPerRow()); - for (int b = 0, N = count; b < N; b++) { + for (int b = 0; b < count; b++) { rowStartPack.put(startRow + b, documentsCount); } totalItems += count * delegate.getStickersPerRow(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ArticleViewer.java b/TMessagesProj/src/main/java/org/telegram/ui/ArticleViewer.java index 60255e006f4..0061df281ce 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ArticleViewer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ArticleViewer.java @@ -3033,7 +3033,13 @@ protected boolean drawChild(Canvas canvas, View child, long drawingTime) { //containerView.setFitsSystemWindows(true); if (Build.VERSION.SDK_INT >= 21) { windowView.setFitsSystemWindows(true); - containerView.setOnApplyWindowInsetsListener((v, insets) -> insets.consumeSystemWindowInsets()); + containerView.setOnApplyWindowInsetsListener((v, insets) -> { + if (Build.VERSION.SDK_INT >= 30) { + return WindowInsets.CONSUMED; + } else { + return insets.consumeSystemWindowInsets(); + } + }); } fullscreenVideoContainer = new FrameLayout(activity); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/BubbleActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/BubbleActivity.java index 9374ed9f212..819a0692aa9 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/BubbleActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/BubbleActivity.java @@ -299,6 +299,10 @@ public void onConfigurationChanged(android.content.res.Configuration newConfig) @Override public void onBackPressed() { + if (mainFragmentsStack.size() == 1) { + super.onBackPressed(); + return; + } if (passcodeView.getVisibility() == View.VISIBLE) { finish(); return; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/CallLogActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/CallLogActivity.java index 43269892fe2..0b73977664e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/CallLogActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/CallLogActivity.java @@ -1,9 +1,13 @@ package org.telegram.ui; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.StateListAnimator; import android.annotation.SuppressLint; import android.content.Context; +import android.content.DialogInterface; import android.content.pm.PackageManager; import android.graphics.Outline; import android.graphics.Paint; @@ -19,9 +23,11 @@ import android.view.View; import android.view.ViewGroup; import android.view.ViewOutlineProvider; +import android.view.ViewTreeObserver; import android.view.animation.AccelerateDecelerateInterpolator; import android.widget.FrameLayout; import android.widget.ImageView; +import android.widget.TextView; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.LocaleController; @@ -33,23 +39,29 @@ import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.ActionBar; +import org.telegram.ui.ActionBar.ActionBarMenu; +import org.telegram.ui.ActionBar.ActionBarMenuItem; import org.telegram.ui.ActionBar.AlertDialog; +import org.telegram.ui.ActionBar.BackDrawable; import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ActionBar.ThemeDescription; +import org.telegram.ui.Cells.CheckBoxCell; import org.telegram.ui.Cells.LoadingCell; import org.telegram.ui.Cells.LocationCell; import org.telegram.ui.Cells.ProfileSearchCell; import org.telegram.ui.Cells.TextInfoPrivacyCell; +import org.telegram.ui.Components.CheckBox2; import org.telegram.ui.Components.CombinedDrawable; import org.telegram.ui.Components.EmptyTextProgressView; +import org.telegram.ui.Components.FlickerLoadingView; import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.NumberTextView; import org.telegram.ui.Components.RecyclerListView; import org.telegram.ui.Components.voip.VoIPHelper; import java.util.ArrayList; import java.util.Iterator; -import java.util.List; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -61,12 +73,20 @@ public class CallLogActivity extends BaseFragment implements NotificationCenter. private LinearLayoutManager layoutManager; private RecyclerListView listView; private ImageView floatingButton; + private FlickerLoadingView flickerLoadingView; + + private NumberTextView selectedDialogsCountTextView; + private ArrayList actionModeViews = new ArrayList<>(); + + private ActionBarMenuItem otherItem; private ArrayList calls = new ArrayList<>(); private boolean loading; private boolean firstLoaded; private boolean endReached; + private ArrayList selectedIds = new ArrayList<>(); + private int prevPosition; private int prevTop; private boolean scrollUpdated; @@ -79,10 +99,15 @@ public class CallLogActivity extends BaseFragment implements NotificationCenter. private ImageSpan iconOut, iconIn, iconMissed; private TLRPC.User lastCallUser; + private boolean openTransitionStarted; + private static final int TYPE_OUT = 0; private static final int TYPE_IN = 1; private static final int TYPE_MISSED = 2; + private static final int delete_all_calls = 1; + private static final int delete = 2; + @Override @SuppressWarnings("unchecked") public void didReceivedNotification(int id, int account, Object... args) { @@ -119,6 +144,9 @@ public void didReceivedNotification(int id, int account, Object... args) { listViewAdapter.notifyItemInserted(0); } } + if (otherItem != null) { + otherItem.setVisibility(calls.isEmpty() ? View.GONE : View.VISIBLE); + } } else if (id == NotificationCenter.messagesDeleted && firstLoaded) { boolean scheduled = (Boolean) args[2]; if (scheduled) { @@ -140,8 +168,9 @@ public void didReceivedNotification(int id, int account, Object... args) { if (row.calls.size() == 0) itrtr.remove(); } - if (didChange && listViewAdapter != null) + if (didChange && listViewAdapter != null) { listViewAdapter.notifyDataSetChanged(); + } } } @@ -149,6 +178,7 @@ private class CustomCell extends FrameLayout { private ImageView imageView; private ProfileSearchCell profileSearchCell; + private CheckBox2 checkBox; public CustomCell(Context context) { super(context); @@ -168,6 +198,19 @@ public CustomCell(Context context) { imageView.setOnClickListener(callBtnClickListener); imageView.setContentDescription(LocaleController.getString("Call", R.string.Call)); addView(imageView, LayoutHelper.createFrame(48, 48, (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.CENTER_VERTICAL, 8, 0, 8, 0)); + + checkBox = new CheckBox2(context, 21); + checkBox.setColor(null, Theme.key_windowBackgroundWhite, Theme.key_checkboxCheck); + checkBox.setDrawUnchecked(false); + checkBox.setDrawBackgroundAsArc(3); + addView(checkBox, LayoutHelper.createFrame(24, 24, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, 42, 32, 42, 0)); + } + + public void setChecked(boolean checked, boolean animated) { + if (checkBox == null) { + return; + } + checkBox.setChecked(checked, animated); } } @@ -213,23 +256,40 @@ public View createView(Context context) { redDrawable.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_calls_callReceivedRedIcon), PorterDuff.Mode.MULTIPLY)); iconMissed = new ImageSpan(redDrawable, ImageSpan.ALIGN_BOTTOM); - actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setBackButtonDrawable(new BackDrawable(false)); actionBar.setAllowOverlayTitle(true); actionBar.setTitle(LocaleController.getString("Calls", R.string.Calls)); actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { @Override public void onItemClick(int id) { if (id == -1) { - finishFragment(); + if (actionBar.isActionModeShowed()) { + hideActionMode(true); + } else { + finishFragment(); + } + } else if (id == delete_all_calls) { + showDeleteAlert(true); + } else if (id == delete) { + showDeleteAlert(false); } } }); + ActionBarMenu menu = actionBar.createMenu(); + otherItem = menu.addItem(10, R.drawable.ic_ab_other); + otherItem.setContentDescription(LocaleController.getString("AccDescrMoreOptions", R.string.AccDescrMoreOptions)); + otherItem.addSubItem(delete_all_calls, R.drawable.msg_delete, LocaleController.getString("DeleteAllCalls", R.string.DeleteAllCalls)); + fragmentView = new FrameLayout(context); fragmentView.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundGray)); FrameLayout frameLayout = (FrameLayout) fragmentView; - emptyView = new EmptyTextProgressView(context); + flickerLoadingView = new FlickerLoadingView(context); + flickerLoadingView.setViewType(FlickerLoadingView.CALL_LOG_TYPE); + flickerLoadingView.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); + flickerLoadingView.showDate(false); + emptyView = new EmptyTextProgressView(context, flickerLoadingView); emptyView.setText(LocaleController.getString("NoCallLog", R.string.NoCallLog)); frameLayout.addView(emptyView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); @@ -245,35 +305,21 @@ public void onItemClick(int id) { return; } CallLogRow row = calls.get(position); - Bundle args = new Bundle(); - args.putInt("user_id", row.user.id); - args.putInt("message_id", row.calls.get(0).id); - NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.closeChats); - presentFragment(new ChatActivity(args), true); + if (actionBar.isActionModeShowed()) { + addOrRemoveSelectedDialog(row.calls, (CustomCell) view); + } else { + Bundle args = new Bundle(); + args.putInt("user_id", row.user.id); + args.putInt("message_id", row.calls.get(0).id); + NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.closeChats); + presentFragment(new ChatActivity(args), true); + } }); listView.setOnItemLongClickListener((view, position) -> { if (position < 0 || position >= calls.size()) { return false; } - final CallLogRow row = calls.get(position); - ArrayList items = new ArrayList<>(); - items.add(LocaleController.getString("Delete", R.string.Delete)); - if (VoIPHelper.canRateCall((TLRPC.TL_messageActionPhoneCall) row.calls.get(0).action)) { - items.add(LocaleController.getString("CallMessageReportProblem", R.string.CallMessageReportProblem)); - } - new AlertDialog.Builder(getParentActivity()) - .setTitle(LocaleController.getString("Calls", R.string.Calls)) - .setItems(items.toArray(new String[0]), (dialog, which) -> { - switch (which) { - case 0: - confirmAndDelete(row); - break; - case 1: - VoIPHelper.showRateAlert(getParentActivity(), (TLRPC.TL_messageActionPhoneCall) row.calls.get(0).action); - break; - } - }) - .show(); + addOrRemoveSelectedDialog(calls.get(position).calls, (CustomCell) view); return true; }); listView.setOnScrollListener(new RecyclerView.OnScrollListener() { @@ -320,7 +366,6 @@ public void onScrolled(RecyclerView recyclerView, int dx, int dy) { emptyView.showTextView(); } - floatingButton = new ImageView(context); floatingButton.setVisibility(View.VISIBLE); floatingButton.setScaleType(ImageView.ScaleType.CENTER); @@ -368,6 +413,156 @@ public void getOutline(View view, Outline outline) { return fragmentView; } + private void showDeleteAlert(boolean all) { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + + if (all) { + builder.setTitle(LocaleController.getString("DeleteAllCalls", R.string.DeleteAllCalls)); + builder.setMessage(LocaleController.getString("DeleteAllCallsText", R.string.DeleteAllCallsText)); + } else { + builder.setTitle(LocaleController.getString("DeleteCalls", R.string.DeleteCalls)); + builder.setMessage(LocaleController.getString("DeleteSelectedCallsText", R.string.DeleteSelectedCallsText)); + } + final boolean[] checks = new boolean[]{false}; + FrameLayout frameLayout = new FrameLayout(getParentActivity()); + CheckBoxCell cell = new CheckBoxCell(getParentActivity(), 1); + cell.setBackgroundDrawable(Theme.getSelectorDrawable(false)); + cell.setText(LocaleController.getString("DeleteCallsForEveryone", R.string.DeleteCallsForEveryone), "", false, false); + cell.setPadding(LocaleController.isRTL ? AndroidUtilities.dp(8) : 0, 0, LocaleController.isRTL ? 0 : AndroidUtilities.dp(8), 0); + frameLayout.addView(cell, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.TOP | Gravity.LEFT, 8, 0, 8, 0)); + cell.setOnClickListener(v -> { + CheckBoxCell cell1 = (CheckBoxCell) v; + checks[0] = !checks[0]; + cell1.setChecked(checks[0], true); + }); + builder.setView(frameLayout); + builder.setPositiveButton(LocaleController.getString("Delete", R.string.Delete), (dialogInterface, i) -> { + if (all) { + deleteAllMessages(checks[0]); + calls.clear(); + loading = false; + endReached = true; + otherItem.setVisibility(View.GONE); + listViewAdapter.notifyDataSetChanged(); + } else { + getMessagesController().deleteMessages(new ArrayList<>(selectedIds), null, null, 0, 0, checks[0], false); + } + hideActionMode(false); + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + AlertDialog alertDialog = builder.create(); + showDialog(alertDialog); + TextView button = (TextView) alertDialog.getButton(DialogInterface.BUTTON_POSITIVE); + if (button != null) { + button.setTextColor(Theme.getColor(Theme.key_dialogTextRed2)); + } + } + + private void deleteAllMessages(boolean revoke) { + TLRPC.TL_messages_deletePhoneCallHistory req = new TLRPC.TL_messages_deletePhoneCallHistory(); + req.revoke = revoke; + getConnectionsManager().sendRequest(req, (response, error) -> { + if (response != null) { + TLRPC.TL_messages_affectedFoundMessages res = (TLRPC.TL_messages_affectedFoundMessages) response; + TLRPC.TL_updateDeleteMessages updateDeleteMessages = new TLRPC.TL_updateDeleteMessages(); + updateDeleteMessages.messages = res.messages; + updateDeleteMessages.pts = res.pts; + updateDeleteMessages.pts_count = res.pts_count; + final TLRPC.TL_updates updates = new TLRPC.TL_updates(); + updates.updates.add(updateDeleteMessages); + getMessagesController().processUpdates(updates, false); + if (res.offset != 0) { + deleteAllMessages(revoke); + } + } + }); + } + + private void hideActionMode(boolean animated) { + actionBar.hideActionMode(); + selectedIds.clear(); + for (int a = 0, N = listView.getChildCount(); a < N; a++) { + CustomCell cell = (CustomCell) listView.getChildAt(a); + cell.setChecked(false, animated); + } + } + + private boolean isSelected(ArrayList messages) { + for (int a = 0, N = messages.size(); a < N; a++) { + if (selectedIds.contains(messages.get(a).id)) { + return true; + } + } + return false; + } + + private void createActionMode() { + if (actionBar.actionModeIsExist(null)) { + return; + } + final ActionBarMenu actionMode = actionBar.createActionMode(); + + selectedDialogsCountTextView = new NumberTextView(actionMode.getContext()); + selectedDialogsCountTextView.setTextSize(18); + selectedDialogsCountTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + selectedDialogsCountTextView.setTextColor(Theme.getColor(Theme.key_actionBarActionModeDefaultIcon)); + actionMode.addView(selectedDialogsCountTextView, LayoutHelper.createLinear(0, LayoutHelper.MATCH_PARENT, 1.0f, 72, 0, 0, 0)); + selectedDialogsCountTextView.setOnTouchListener((v, event) -> true); + + actionModeViews.add(actionMode.addItemWithWidth(delete, R.drawable.msg_delete, AndroidUtilities.dp(54), LocaleController.getString("Delete", R.string.Delete))); + } + + private boolean addOrRemoveSelectedDialog(ArrayList messages, CustomCell cell) { + if (messages.isEmpty()) { + return false; + } + if (isSelected(messages)) { + for (int a = 0, N = messages.size(); a < N; a++) { + selectedIds.remove((Integer) messages.get(a).id); + } + cell.setChecked(false, true); + showOrUpdateActionMode(); + return false; + } else { + for (int a = 0, N = messages.size(); a < N; a++) { + Integer id = messages.get(a).id; + if (!selectedIds.contains(id)) { + selectedIds.add(id); + } + } + cell.setChecked(true, true); + showOrUpdateActionMode(); + return true; + } + } + + private void showOrUpdateActionMode() { + boolean updateAnimated = false; + if (actionBar.isActionModeShowed()) { + if (selectedIds.isEmpty()) { + hideActionMode(true); + return; + } + updateAnimated = true; + } else { + createActionMode(); + actionBar.showActionMode(); + + AnimatorSet animatorSet = new AnimatorSet(); + ArrayList animators = new ArrayList<>(); + for (int a = 0; a < actionModeViews.size(); a++) { + View view = actionModeViews.get(a); + view.setPivotY(ActionBar.getCurrentActionBarHeight() / 2); + AndroidUtilities.clearDrawableAnimation(view); + animators.add(ObjectAnimator.ofFloat(view, View.SCALE_Y, 0.1f, 1.0f)); + } + animatorSet.playTogether(animators); + animatorSet.setDuration(200); + animatorSet.start(); + } + selectedDialogsCountTextView.setNumber(selectedIds.size(), updateAnimated); + } + private void hideFloatingButton(boolean hide) { if (floatingHidden == hide) { return; @@ -397,6 +592,7 @@ private void getCalls(int max_id, final int count) { req.q = ""; req.offset_id = max_id; int reqId = ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { + int oldCount = calls.size(); if (error == null) { SparseArray users = new SparseArray<>(); TLRPC.messages_Messages msgs = (TLRPC.messages_Messages) response; @@ -438,7 +634,12 @@ private void getCalls(int max_id, final int count) { endReached = true; } loading = false; + showItemsAnimated(oldCount); + if (!firstLoaded) { + resumeDelayedFragmentAnimation(); + } firstLoaded = true; + otherItem.setVisibility(calls.isEmpty() ? View.GONE : View.VISIBLE); if (emptyView != null) { emptyView.showTextView(); } @@ -449,25 +650,6 @@ private void getCalls(int max_id, final int count) { ConnectionsManager.getInstance(currentAccount).bindRequestToGuid(reqId, classGuid); } - private void confirmAndDelete(final CallLogRow row) { - if (getParentActivity() == null) { - return; - } - new AlertDialog.Builder(getParentActivity()) - .setTitle(LocaleController.getString("AppName", R.string.AppName)) - .setMessage(LocaleController.getString("ConfirmDeleteCallLog", R.string.ConfirmDeleteCallLog)) - .setPositiveButton(LocaleController.getString("Delete", R.string.Delete), (dialog, which) -> { - ArrayList ids = new ArrayList<>(); - for (TLRPC.Message msg : row.calls) { - ids.add(msg.id); - } - MessagesController.getInstance(currentAccount).deleteMessages(ids, null, null, 0, 0, false, false); - }) - .setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null) - .show() - .setCanceledOnTouchOutside(true); - } - @Override public void onResume() { super.onResume(); @@ -529,7 +711,12 @@ public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType view.setTag(new ViewItem(cell.imageView, cell.profileSearchCell)); break; case 1: - view = new LoadingCell(mContext); + FlickerLoadingView flickerLoadingView = new FlickerLoadingView(mContext); + flickerLoadingView.setIsSingleCell(true); + flickerLoadingView.setViewType(FlickerLoadingView.CALL_LOG_TYPE); + flickerLoadingView.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); + flickerLoadingView.showDate(false); + view = flickerLoadingView; break; case 2: default: @@ -540,6 +727,14 @@ public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType return new RecyclerListView.Holder(view); } + @Override + public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) { + if (holder.itemView instanceof CustomCell) { + CallLogRow row = calls.get(holder.getAdapterPosition()); + ((CustomCell) holder.itemView).setChecked(isSelected(row.calls), false); + } + } + @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (holder.getItemViewType() == 0) { @@ -599,7 +794,7 @@ public ViewItem(ImageView button, ProfileSearchCell cell) { private static class CallLogRow { public TLRPC.User user; - public List calls; + public ArrayList calls; public int type; public boolean video; } @@ -665,7 +860,81 @@ public ArrayList getThemeDescriptions() { themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{View.class}, null, new Drawable[]{greenDrawable, greenDrawable2, Theme.calllog_msgCallUpRedDrawable, Theme.calllog_msgCallDownRedDrawable}, null, Theme.key_calls_callReceivedGreenIcon)); themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{View.class}, null, new Drawable[]{redDrawable, Theme.calllog_msgCallUpGreenDrawable, Theme.calllog_msgCallDownGreenDrawable}, null, Theme.key_calls_callReceivedRedIcon)); + themeDescriptions.add(new ThemeDescription(flickerLoadingView, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_windowBackgroundWhite)); return themeDescriptions; } + + @Override + protected void onTransitionAnimationStart(boolean isOpen, boolean backward) { + super.onTransitionAnimationStart(isOpen, backward); + if (isOpen) { + openTransitionStarted = true; + } + } + + @Override + public boolean needDelayOpenAnimation() { + return true; + } + + private void showItemsAnimated(int from) { + if (isPaused || !openTransitionStarted) { + return; + } + View progressView = null; + for (int i = 0; i < listView.getChildCount(); i++) { + View child = listView.getChildAt(i); + if (child instanceof FlickerLoadingView) { + progressView = child; + } + } + final View finalProgressView = progressView; + if (progressView != null) { + listView.removeView(progressView); + } + + listView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + listView.getViewTreeObserver().removeOnPreDrawListener(this); + int n = listView.getChildCount(); + AnimatorSet animatorSet = new AnimatorSet(); + for (int i = 0; i < n; i++) { + View child = listView.getChildAt(i); + if (child == finalProgressView || listView.getChildAdapterPosition(child) < from) { + continue; + } + child.setAlpha(0); + int s = Math.min(listView.getMeasuredHeight(), Math.max(0, child.getTop())); + int delay = (int) ((s / (float) listView.getMeasuredHeight()) * 100); + ObjectAnimator a = ObjectAnimator.ofFloat(child, View.ALPHA, 0, 1f); + a.setStartDelay(delay); + a.setDuration(200); + animatorSet.playTogether(a); + } + + if (finalProgressView != null && finalProgressView.getParent() == null) { + listView.addView(finalProgressView); + RecyclerView.LayoutManager layoutManager = listView.getLayoutManager(); + if (layoutManager != null) { + layoutManager.ignoreView(finalProgressView); + Animator animator = ObjectAnimator.ofFloat(finalProgressView, View.ALPHA, finalProgressView.getAlpha(), 0); + animator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + finalProgressView.setAlpha(1f); + layoutManager.stopIgnoringView(finalProgressView); + listView.removeView(finalProgressView); + } + }); + animator.start(); + } + } + + animatorSet.start(); + return true; + } + }); + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/AudioPlayerCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/AudioPlayerCell.java index 87427d0678c..9b465f83e66 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/AudioPlayerCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/AudioPlayerCell.java @@ -39,6 +39,7 @@ import org.telegram.messenger.UserConfig; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Components.DotDividerSpan; import org.telegram.ui.Components.MediaActionDrawable; import org.telegram.ui.Components.RadialProgress2; import org.telegram.ui.FilteredSearchView; @@ -85,25 +86,7 @@ public AudioPlayerCell(Context context, int viewType) { if (viewType == VIEW_TYPE_GLOBAL_SEARCH) { dotSpan = new SpannableStringBuilder("."); - dotSpan.setSpan(new ReplacementSpan() { - - Paint p = new Paint(Paint.ANTI_ALIAS_FLAG); - int color; - - @Override - public int getSize(@NonNull Paint paint, CharSequence charSequence, int i, int i1, @Nullable Paint.FontMetricsInt fontMetricsInt) { - return AndroidUtilities.dp(3); - } - - @Override - public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) { - if (color != paint.getColor()) { - p.setColor(paint.getColor()); - } - float radius = AndroidUtilities.dpf2(3) / 2f; - canvas.drawCircle(x + radius, (bottom - top) / 2, radius, p); - } - }, 0, 1, 0); + dotSpan.setSpan(new DotDividerSpan(), 0, 1, 0); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java index c05de6e3c35..34cafafce5f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java @@ -182,6 +182,9 @@ default void didPressSideButton(ChatMessageCell cell) { default void didPressOther(ChatMessageCell cell, float otherX, float otherY) { } + default void didPressTime(ChatMessageCell cell) { + } + default void didPressBotButton(ChatMessageCell cell, TLRPC.KeyboardButton button) { } @@ -458,6 +461,8 @@ public static class PollButton { private String currentPhotoFilter; private String currentPhotoFilterThumb; + private boolean timePressed; + private float timeAlpha = 1.0f; private float controlsAlpha = 1.0f; private long lastControlsAlphaChangeTime; @@ -673,6 +678,8 @@ public static class PollButton { private int forwardNameY; private float[] forwardNameOffsetX = new float[2]; + private float drawTimeX; + private float drawTimeY; private StaticLayout timeLayout; private int timeWidth; private int timeTextWidth; @@ -739,6 +746,7 @@ public void run() { private ValueAnimator statusDrawableAnimator; private int overideShouldDrawTimeOnMedia; + private float toSeekBarProgress; private Runnable invalidateRunnable = new Runnable() { @Override @@ -1638,6 +1646,34 @@ private boolean checkOtherButtonMotionEvent(MotionEvent event) { return result; } + private boolean checkDateMotionEvent(MotionEvent event) { + if (!currentMessageObject.isImportedForward()) { + return false; + } + int x = (int) event.getX(); + int y = (int) event.getY(); + + boolean result = false; + if (event.getAction() == MotionEvent.ACTION_DOWN) { + if (x >= drawTimeX && x <= drawTimeX + timeWidth && y >= drawTimeY && y <= drawTimeY + AndroidUtilities.dp(20)) { + timePressed = true; + result = true; + invalidate(); + } + } else { + if (event.getAction() == MotionEvent.ACTION_UP) { + if (timePressed) { + timePressed = false; + playSoundEffect(SoundEffectConstants.CLICK); + delegate.didPressTime(this); + invalidate(); + result = true; + } + } + } + return result; + } + private boolean checkPhotoImageMotionEvent(MotionEvent event) { if (!drawPhotoImage && documentAttachType != DOCUMENT_ATTACH_TYPE_DOCUMENT || currentMessageObject.isSending() && buttonState != 1) { return false; @@ -1884,6 +1920,9 @@ public boolean onTouchEvent(MotionEvent event) { boolean result = checkTextBlockMotionEvent(event); + if (!result) { + result = checkDateMotionEvent(event); + } if (!result) { result = checkTextSelection(event); } @@ -1929,6 +1968,7 @@ public boolean onTouchEvent(MotionEvent event) { otherPressed = false; sideButtonPressed = false; imagePressed = false; + timePressed = false; gamePreviewPressed = false; instantPressed = instantButtonPressed = commentButtonPressed = false; if (Build.VERSION.SDK_INT >= 21) { @@ -2666,6 +2706,18 @@ public int getForwardNameCenterX() { return (int) (forwardNameX + forwardNameCenterX); } + public int getChecksX() { + return layoutWidth - AndroidUtilities.dp(SharedConfig.bubbleRadius >= 10 ? 27.3f : 25.3f); + } + + public int getChecksY() { + if (currentMessageObject.shouldDrawWithoutBackground()) { + return (int) (drawTimeY - Theme.chat_msgStickerCheckDrawable.getIntrinsicHeight()); + } else { + return (int) (drawTimeY - Theme.chat_msgMediaCheckDrawable.getIntrinsicHeight()); + } + } + public TLRPC.User getCurrentUser() { return currentUser; } @@ -2798,6 +2850,11 @@ protected void onAttachedToWindow() { if (getDelegate().getTextSelectionHelper() != null) { getDelegate().getTextSelectionHelper().onChatMessageCellAttached(this); } + + if (documentAttachType == DOCUMENT_ATTACH_TYPE_MUSIC) { + boolean showSeekbar = MediaController.getInstance().isPlayingMessage(currentMessageObject); + toSeekBarProgress = showSeekbar ? 1f : 0f; + } } private void setMessageContent(MessageObject messageObject, MessageObject.GroupedMessages groupedMessages, boolean bottomNear, boolean topNear) { @@ -3151,7 +3208,7 @@ private void setMessageContent(MessageObject messageObject, MessageObject.Groupe } else { maxWidth = Math.min(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y) - AndroidUtilities.dp(80); } - drawName = isPinnedChat || messageObject.messageOwner.peer_id.channel_id != 0 && (!messageObject.isOutOwner() || messageObject.isSupergroup()); + drawName = isPinnedChat || messageObject.messageOwner.peer_id.channel_id != 0 && (!messageObject.isOutOwner() || messageObject.isSupergroup()) || messageObject.isImportedForward() && messageObject.messageOwner.fwd_from.from_id == null; } availableTimeWidth = maxWidth; @@ -4098,7 +4155,7 @@ private void setMessageContent(MessageObject messageObject, MessageObject.Groupe namesOffset -= AndroidUtilities.dp(1); } } else if (messageObject.type == 12) { - drawName = messageObject.isFromGroup() && messageObject.isSupergroup(); + drawName = messageObject.isFromGroup() && messageObject.isSupergroup() || messageObject.isImportedForward() && messageObject.messageOwner.fwd_from.from_id == null; drawForwardedName = !isRepliesChat; drawPhotoImage = true; photoImage.setRoundRadius(AndroidUtilities.dp(22)); @@ -4181,7 +4238,7 @@ private void setMessageContent(MessageObject messageObject, MessageObject.Groupe } } else if (messageObject.type == 2) { drawForwardedName = !isRepliesChat; - drawName = messageObject.isFromGroup() && messageObject.isSupergroup(); + drawName = messageObject.isFromGroup() && messageObject.isSupergroup() || messageObject.isImportedForward() && messageObject.messageOwner.fwd_from.from_id == null; if (AndroidUtilities.isTablet()) { backgroundWidth = Math.min(AndroidUtilities.getMinTabletSide() - AndroidUtilities.dp(drawAvatar ? 102 : 50), AndroidUtilities.dp(270)); } else { @@ -4196,7 +4253,7 @@ private void setMessageContent(MessageObject messageObject, MessageObject.Groupe namesOffset -= AndroidUtilities.dp(1); } } else if (messageObject.type == 14) { - drawName = messageObject.isFromGroup() && messageObject.isSupergroup() && (currentPosition == null || (currentPosition.flags & MessageObject.POSITION_FLAG_TOP) != 0); + drawName = (messageObject.isFromGroup() && messageObject.isSupergroup() || messageObject.isImportedForward() && messageObject.messageOwner.fwd_from.from_id == null) && (currentPosition == null || (currentPosition.flags & MessageObject.POSITION_FLAG_TOP) != 0); if (AndroidUtilities.isTablet()) { backgroundWidth = Math.min(AndroidUtilities.getMinTabletSide() - AndroidUtilities.dp(drawAvatar ? 102 : 50), AndroidUtilities.dp(270)); } else { @@ -4492,7 +4549,7 @@ private void setMessageContent(MessageObject messageObject, MessageObject.Groupe } else { drawForwardedName = messageObject.messageOwner.fwd_from != null && !messageObject.isAnyKindOfSticker(); if (!messageObject.isAnyKindOfSticker() && messageObject.type != MessageObject.TYPE_ROUND_VIDEO) { - drawName = messageObject.isFromGroup() && messageObject.isSupergroup() && (currentPosition == null || (currentPosition.flags & MessageObject.POSITION_FLAG_TOP) != 0); + drawName = (messageObject.isFromGroup() && messageObject.isSupergroup() || messageObject.isImportedForward() && messageObject.messageOwner.fwd_from.from_id == null) && (currentPosition == null || (currentPosition.flags & MessageObject.POSITION_FLAG_TOP) != 0); } mediaBackground = isMedia = messageObject.type != 9; drawImageButton = true; @@ -5747,6 +5804,11 @@ private void setMessageContent(MessageObject messageObject, MessageObject.Groupe } transitionParams.lastStatusDrawableParams = -1; statusDrawableAnimationInProgress = false; + + if (documentAttachType == DOCUMENT_ATTACH_TYPE_MUSIC) { + boolean showSeekbar = MediaController.getInstance().isPlayingMessage(currentMessageObject); + toSeekBarProgress = showSeekbar ? 1f : 0f; + } } updateWaveform(); updateButtonState(false, dataChanged && !messageObject.cancelEditing, true); @@ -5813,6 +5875,7 @@ protected void onLongPress() { linkPreviewPressed = false; sideButtonPressed = false; imagePressed = false; + timePressed = false; gamePreviewPressed = false; if (pressedVoteButton != -1 || pollHintPressed || psaHintPressed || instantPressed || otherPressed || commentButtonPressed) { @@ -6006,6 +6069,17 @@ public void onSeekBarDrag(float progress) { } currentMessageObject.audioProgress = progress; MediaController.getInstance().seekToProgress(currentMessageObject, progress); + updatePlayingMessageProgress(); + } + + @Override + public void onSeekBarContinuousDrag(float progress) { + if (currentMessageObject == null) { + return; + } + currentMessageObject.audioProgress = progress; + currentMessageObject.audioProgressSec = (int) (currentMessageObject.getDuration() * progress); + updatePlayingMessageProgress(); } public boolean isAnimatingPollAnswer() { @@ -7348,16 +7422,47 @@ private void drawContent(Canvas canvas) { canvas.translate(timeAudioX + songX, AndroidUtilities.dp(13) + namesOffset + mediaOffsetY); songLayout.draw(canvas); canvas.restore(); - - canvas.save(); - if (MediaController.getInstance().isPlayingMessage(currentMessageObject)) { + + boolean showSeekbar = MediaController.getInstance().isPlayingMessage(currentMessageObject); + if (showSeekbar && toSeekBarProgress != 1f) { + toSeekBarProgress += 16f / 100f; + if (toSeekBarProgress > 1f) { + toSeekBarProgress = 1f; + } + invalidate(); + } else if (!showSeekbar && toSeekBarProgress != 0){ + toSeekBarProgress -= 16f / 100f; + if (toSeekBarProgress < 0) { + toSeekBarProgress = 0; + } + invalidate(); + } + if (toSeekBarProgress > 0) { + if (toSeekBarProgress != 1f) { + canvas.saveLayerAlpha(seekBarX, seekBarY, seekBarX + seekBar.getWidth() + AndroidUtilities.dp(24), seekBarY + AndroidUtilities.dp(24), (int) (255 * (toSeekBarProgress)), Canvas.ALL_SAVE_FLAG); + } else { + canvas.save(); + } canvas.translate(seekBarX, seekBarY); seekBar.draw(canvas); - } else { - canvas.translate(timeAudioX + performerX, AndroidUtilities.dp(35) + namesOffset + mediaOffsetY); + canvas.restore(); + } + if (toSeekBarProgress < 1f) { + float x = timeAudioX + performerX; + float y = AndroidUtilities.dp(35) + namesOffset + mediaOffsetY; + if (toSeekBarProgress != 0) { + canvas.saveLayerAlpha(x, y, x + performerLayout.getWidth(), y + performerLayout.getHeight(), (int) (255 * (1f - toSeekBarProgress)), Canvas.ALL_SAVE_FLAG); + } else { + canvas.save(); + } + if (toSeekBarProgress != 0) { + float s = 0.7f + 0.3f * (1f - toSeekBarProgress); + canvas.scale(s, s, x, y + performerLayout.getHeight() / 2f); + } + canvas.translate(x, y); performerLayout.draw(canvas); + canvas.restore(); } - canvas.restore(); canvas.save(); canvas.translate(timeAudioX, AndroidUtilities.dp(57) + namesOffset + mediaOffsetY); @@ -7971,7 +8076,7 @@ public void updateButtonState(boolean ifSame, boolean animated, boolean fromSet) hasMiniProgress = fileExists ? 1 : 2; fileExists = true; } - if (currentMessageObject.isSendError() || TextUtils.isEmpty(fileName) && !currentMessageObject.isSending() && !currentMessageObject.isEditing()) { + if (currentMessageObject.isSendError() || TextUtils.isEmpty(fileName) && (currentMessageObject.isAnyKindOfSticker() || !currentMessageObject.isSending() && !currentMessageObject.isEditing())) { radialProgress.setIcon(MediaActionDrawable.ICON_NONE, ifSame, false); radialProgress.setMiniIcon(MediaActionDrawable.ICON_NONE, ifSame, false); videoRadialProgress.setIcon(MediaActionDrawable.ICON_NONE, ifSame, false); @@ -8817,6 +8922,8 @@ private void measureTime(MessageObject messageObject) { } } else if (messageObject.messageOwner.fwd_from != null && messageObject.messageOwner.fwd_from.post_author != null) { signString = messageObject.messageOwner.fwd_from.post_author.replace("\n", ""); + } else if (messageObject.messageOwner.fwd_from != null && messageObject.messageOwner.fwd_from.imported) { + signString = LocaleController.formatImportedDate(messageObject.messageOwner.fwd_from.date) + " " + LocaleController.getString("ImportedMessage", R.string.ImportedMessage); } else if (!messageObject.isOutOwner() && fromId > 0 && messageObject.messageOwner.post) { TLRPC.User signUser = MessagesController.getInstance(currentAccount).getUser(fromId); if (signUser != null) { @@ -8856,7 +8963,11 @@ private void measureTime(MessageObject messageObject) { timeString = LocaleController.getInstance().formatterDay.format((long) (messageObject.messageOwner.date) * 1000); } if (signString != null) { - currentTimeString = ", " + timeString; + if (messageObject.messageOwner.fwd_from != null && messageObject.messageOwner.fwd_from.imported) { + currentTimeString = " " + timeString; + } else { + currentTimeString = ", " + timeString; + } } else { currentTimeString = timeString; } @@ -8964,9 +9075,9 @@ private void updateCurrentUserAndChat() { currentChat = messagesController.getChat(fwd_from.saved_from_peer.chat_id); } } - } else if (fwd_from != null && fwd_from.from_id instanceof TLRPC.TL_peerUser && currentMessageObject.getDialogId() == currentUserId) { + } else if (fwd_from != null && fwd_from.from_id instanceof TLRPC.TL_peerUser && (fwd_from.imported || currentMessageObject.getDialogId() == currentUserId)) { currentUser = messagesController.getUser(fwd_from.from_id.user_id); - } else if (fwd_from != null && !TextUtils.isEmpty(fwd_from.from_name) && currentMessageObject.getDialogId() == currentUserId) { + } else if (fwd_from != null && !TextUtils.isEmpty(fwd_from.from_name) && (fwd_from.imported || currentMessageObject.getDialogId() == currentUserId)) { currentUser = new TLRPC.TL_user(); currentUser.first_name = fwd_from.from_name; } else { @@ -9026,13 +9137,13 @@ private void setMessageObjectInternal(MessageObject messageObject) { CharSequence viaString = null; if (messageObject.messageOwner.via_bot_id != 0) { TLRPC.User botUser = MessagesController.getInstance(currentAccount).getUser(messageObject.messageOwner.via_bot_id); - if (botUser != null && botUser.username != null && botUser.username.length() > 0) { + if (botUser != null && !TextUtils.isEmpty(botUser.username)) { viaUsername = "@" + botUser.username; viaString = AndroidUtilities.replaceTags(String.format(" %s %s", LocaleController.getString("ViaBot", R.string.ViaBot), viaUsername)); viaWidth = (int) Math.ceil(Theme.chat_replyNamePaint.measureText(viaString, 0, viaString.length())); currentViaBotUser = botUser; } - } else if (messageObject.messageOwner.via_bot_name != null && messageObject.messageOwner.via_bot_name.length() > 0) { + } else if (!TextUtils.isEmpty(messageObject.messageOwner.via_bot_name)) { viaUsername = "@" + messageObject.messageOwner.via_bot_name; viaString = AndroidUtilities.replaceTags(String.format(" %s %s", LocaleController.getString("ViaBot", R.string.ViaBot), viaUsername)); viaWidth = (int) Math.ceil(Theme.chat_replyNamePaint.measureText(viaString, 0, viaString.length())); @@ -9074,7 +9185,7 @@ private void setMessageObjectInternal(MessageObject messageObject) { } else { currentNameString = ""; } - CharSequence nameStringFinal = TextUtils.ellipsize(currentNameString.replace('\n', ' '), Theme.chat_namePaint, nameWidth - (viaBot ? viaWidth : 0), TextUtils.TruncateAt.END); + CharSequence nameStringFinal = TextUtils.ellipsize(currentNameString.replace('\n', ' ').replace('\u200F', ' '), Theme.chat_namePaint, nameWidth - (viaBot ? viaWidth : 0), TextUtils.TruncateAt.END); if (viaBot) { viaNameWidth = (int) Math.ceil(Theme.chat_namePaint.measureText(nameStringFinal, 0, nameStringFinal.length())); if (viaNameWidth != 0) { @@ -9414,7 +9525,7 @@ private void setMessageObjectInternal(MessageObject messageObject) { } private boolean isNeedAuthorName() { - return isPinnedChat && currentMessageObject.type == 0 || (!pinnedTop || ChatObject.isChannel(currentChat) && !currentChat.megagroup) && drawName && isChat && (!currentMessageObject.isOutOwner() || currentMessageObject.isSupergroup() && currentMessageObject.isFromGroup()); + return isPinnedChat && currentMessageObject.type == 0 || (!pinnedTop || ChatObject.isChannel(currentChat) && !currentChat.megagroup) && drawName && isChat && (!currentMessageObject.isOutOwner() || currentMessageObject.isSupergroup() && currentMessageObject.isFromGroup()) || currentMessageObject.isImportedForward() && currentMessageObject.messageOwner.fwd_from.from_id == null; } private String getAuthorName() { @@ -10871,7 +10982,7 @@ private boolean shouldDrawTimeOnMedia() { if (overideShouldDrawTimeOnMedia != 0) { return overideShouldDrawTimeOnMedia == 1; } - return mediaBackground && captionLayout == null || isMedia && drawCommentButton && !isRepliesChat; + return mediaBackground && captionLayout == null/* || isMedia && drawCommentButton && !isRepliesChat*/; } public void drawTime(Canvas canvas, float alpha, boolean fromParent) { @@ -11027,7 +11138,7 @@ private void drawTimeInternal(Canvas canvas, float alpha, boolean fromParent, fl } canvas.save(); - canvas.translate(timeTitleTimeX + additionalX, timeY - AndroidUtilities.dp(7.3f) - timeLayout.getHeight()); + canvas.translate(drawTimeX = timeTitleTimeX + additionalX, drawTimeY = timeY - AndroidUtilities.dp(7.3f) - timeLayout.getHeight()); timeLayout.draw(canvas); canvas.restore(); Theme.chat_timePaint.setAlpha(255); @@ -11086,7 +11197,7 @@ private void drawTimeInternal(Canvas canvas, float alpha, boolean fromParent, fl Theme.chat_timePaint.setAlpha(oldAlpha); } } else { - canvas.translate(timeTitleTimeX + additionalX, layoutHeight - AndroidUtilities.dp(pinnedBottom || pinnedTop ? 7.5f : 6.5f) - timeLayout.getHeight() + timeYOffset); + canvas.translate(drawTimeX = timeTitleTimeX + additionalX, drawTimeY = layoutHeight - AndroidUtilities.dp(pinnedBottom || pinnedTop ? 7.5f : 6.5f) - timeLayout.getHeight() + timeYOffset); timeLayout.draw(canvas); } canvas.restore(); @@ -12729,6 +12840,10 @@ public void setTranslationX(float translationX) { super.setTranslationX(translationX); } + public SeekBar getSeekBar() { + return seekBar; + } + private class MessageAccessibilityNodeProvider extends AccessibilityNodeProvider { private final int LINK_IDS_START = 2000; @@ -12738,6 +12853,7 @@ private class MessageAccessibilityNodeProvider extends AccessibilityNodeProvider private final int SHARE = 498; private final int REPLY = 497; private final int COMMENT = 496; + private final int POLL_HINT = 495; private Path linkPath = new Path(); private RectF rectF = new RectF(); private Rect rect = new Rect(); @@ -12900,6 +13016,9 @@ public AccessibilityNodeInfo createAccessibilityNodeInfo(int virtualViewId) { info.addChild(ChatMessageCell.this, BOT_BUTTONS_START + i); i++; } + if (hintButtonVisible && pollHintX != -1 && currentMessageObject.isPoll()) { + info.addChild(ChatMessageCell.this, POLL_HINT); + } i = 0; for (PollButton button : pollButtons) { info.addChild(ChatMessageCell.this, POLL_BUTTONS_START + i); @@ -12991,17 +13110,23 @@ public AccessibilityNodeInfo createAccessibilityNodeInfo(int virtualViewId) { return null; } PollButton button = pollButtons.get(buttonIndex); - info.setText(button.title.getText()); + StringBuilder sb = new StringBuilder(button.title.getText()); if (!pollVoted) { info.setClassName("android.widget.Button"); } else { - info.setText(info.getText() + ", " + button.percent + "%"); + info.setSelected(button.chosen); + sb.append(", ").append(button.percent).append("%"); + if (lastPoll != null && lastPoll.quiz && button.correct) { + sb.append(", ").append(LocaleController.getString("AccDescrQuizCorrectAnswer", R.string.AccDescrQuizCorrectAnswer)); + } } + info.setText(sb); info.setEnabled(true); info.addAction(AccessibilityNodeInfo.ACTION_CLICK); - int width = backgroundWidth - AndroidUtilities.dp(76); - rect.set(button.x, button.y, button.x + width, button.y + button.height); + final int y = button.y + namesOffset; + final int w = backgroundWidth - AndroidUtilities.dp(76); + rect.set(button.x, y, button.x + w, y + button.height); info.setBoundsInParent(rect); if (accessibilityVirtualViewBounds.get(virtualViewId) == null) { accessibilityVirtualViewBounds.put(virtualViewId, new Rect(rect)); @@ -13009,6 +13134,19 @@ public AccessibilityNodeInfo createAccessibilityNodeInfo(int virtualViewId) { rect.offset(pos[0], pos[1]); info.setBoundsInScreen(rect); + info.setClickable(true); + } else if (virtualViewId == POLL_HINT) { + info.setClassName("android.widget.Button"); + info.setEnabled(true); + info.setText(LocaleController.getString("AccDescrQuizExplanation", R.string.AccDescrQuizExplanation)); + info.addAction(AccessibilityNodeInfo.ACTION_CLICK); + rect.set(pollHintX - AndroidUtilities.dp(8), pollHintY - AndroidUtilities.dp(8), pollHintX + AndroidUtilities.dp(32), pollHintY + AndroidUtilities.dp(32)); + info.setBoundsInParent(rect); + if (accessibilityVirtualViewBounds.get(virtualViewId) == null || !accessibilityVirtualViewBounds.get(virtualViewId).equals(rect)) { + accessibilityVirtualViewBounds.put(virtualViewId, new Rect(rect)); + } + rect.offset(pos[0], pos[1]); + info.setBoundsInScreen(rect); info.setClickable(true); } else if (virtualViewId == INSTANT_VIEW) { info.setClassName("android.widget.Button"); @@ -13128,6 +13266,10 @@ public boolean performAction(int virtualViewId, int action, Bundle arguments) { delegate.didPressVoteButtons(ChatMessageCell.this, answers, -1, 0, 0); } sendAccessibilityEventForVirtualView(virtualViewId, AccessibilityEvent.TYPE_VIEW_CLICKED); + } else if (virtualViewId == POLL_HINT) { + if (delegate != null) { + delegate.didPressHint(ChatMessageCell.this, 0); + } } else if (virtualViewId == INSTANT_VIEW) { if (delegate != null) { delegate.didPressInstantButton(ChatMessageCell.this, drawInstantViewType); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java index f17f02e6024..8499c40f5ba 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java @@ -253,7 +253,7 @@ public static class CustomDialog { private boolean drawVerified; - private boolean drawScam; + private int drawScam; private boolean isSelected; @@ -269,6 +269,8 @@ public static class CustomDialog { long lastDialogChangedTime; private int statusDrawableLeft; + private DialogsActivity parentFragment; + public static class BounceInterpolator implements Interpolator { public float getInterpolation(float t) { @@ -286,13 +288,13 @@ public float getInterpolation(float t) { } } - public DialogCell(Context context, boolean needCheck, boolean forceThreeLines) { - this(context, needCheck, forceThreeLines, UserConfig.selectedAccount); + public DialogCell(DialogsActivity fragment, Context context, boolean needCheck, boolean forceThreeLines) { + this(fragment, context, needCheck, forceThreeLines, UserConfig.selectedAccount); } - public DialogCell(Context context, boolean needCheck, boolean forceThreeLines, int account) { + public DialogCell(DialogsActivity fragment, Context context, boolean needCheck, boolean forceThreeLines, int account) { super(context); - + parentFragment = fragment; Theme.createDialogsResources(context); avatarImage.setRoundRadius(AndroidUtilities.dp(28)); thumbImage.setRoundRadius(AndroidUtilities.dp(2)); @@ -564,7 +566,7 @@ public void buildLayout() { drawNameLock = false; drawNameBot = false; drawVerified = false; - drawScam = false; + drawScam = 0; drawPinBackground = false; hasMessageThumb = false; int offsetName = 0; @@ -744,8 +746,11 @@ public void buildLayout() { if (currentDialogFolderId == 0) { if (chat != null) { if (chat.scam) { - drawScam = true; + drawScam = 1; Theme.dialogs_scamDrawable.checkText(); + } else if (chat.fake) { + drawScam = 2; + Theme.dialogs_fakeDrawable.checkText(); } else { drawVerified = chat.verified; } @@ -786,8 +791,11 @@ public void buildLayout() { } } else if (user != null) { if (user.scam) { - drawScam = true; + drawScam = 1; Theme.dialogs_scamDrawable.checkText(); + } else if (user.fake) { + drawScam = 2; + Theme.dialogs_fakeDrawable.checkText(); } else { drawVerified = user.verified; } @@ -957,6 +965,8 @@ public void buildLayout() { if (chat != null && chat.id > 0 && fromChat == null && (!ChatObject.isChannel(chat) || ChatObject.isMegagroup(chat))) { if (message.isOutOwner()) { messageNameString = LocaleController.getString("FromYou", R.string.FromYou); + } else if (message != null && message.messageOwner.fwd_from != null && message.messageOwner.fwd_from.from_name != null) { + messageNameString = message.messageOwner.fwd_from.from_name; } else if (fromUser != null) { if (useForceThreeLines || SharedConfig.useThreeLinesLayout) { if (UserObject.isDeleted(fromUser)) { @@ -1368,7 +1378,7 @@ public void buildLayout() { } } - if (dialogMuted && !drawVerified && !drawScam) { + if (dialogMuted && !drawVerified && drawScam == 0) { int w = AndroidUtilities.dp(6) + Theme.dialogs_muteDrawable.getIntrinsicWidth(); nameWidth -= w; if (LocaleController.isRTL) { @@ -1380,8 +1390,8 @@ public void buildLayout() { if (LocaleController.isRTL) { nameLeft += w; } - } else if (drawScam) { - int w = AndroidUtilities.dp(6) + Theme.dialogs_scamDrawable.getIntrinsicWidth(); + } else if (drawScam != 0) { + int w = AndroidUtilities.dp(6) + (drawScam == 0 ? Theme.dialogs_scamDrawable : Theme.dialogs_fakeDrawable).getIntrinsicWidth(); nameWidth -= w; if (LocaleController.isRTL) { nameLeft += w; @@ -1595,12 +1605,12 @@ public void buildLayout() { if (nameLayout != null && nameLayout.getLineCount() > 0) { left = nameLayout.getLineLeft(0); widthpx = Math.ceil(nameLayout.getLineWidth(0)); - if (dialogMuted && !drawVerified && !drawScam) { + if (dialogMuted && !drawVerified && drawScam == 0) { nameMuteLeft = (int) (nameLeft + (nameWidth - widthpx) - AndroidUtilities.dp(6) - Theme.dialogs_muteDrawable.getIntrinsicWidth()); } else if (drawVerified) { nameMuteLeft = (int) (nameLeft + (nameWidth - widthpx) - AndroidUtilities.dp(6) - Theme.dialogs_verifiedDrawable.getIntrinsicWidth()); - } else if (drawScam) { - nameMuteLeft = (int) (nameLeft + (nameWidth - widthpx) - AndroidUtilities.dp(6) - Theme.dialogs_scamDrawable.getIntrinsicWidth()); + } else if (drawScam != 0) { + nameMuteLeft = (int) (nameLeft + (nameWidth - widthpx) - AndroidUtilities.dp(6) - (drawScam == 0 ? Theme.dialogs_scamDrawable : Theme.dialogs_fakeDrawable).getIntrinsicWidth()); } if (left == 0) { if (widthpx < nameWidth) { @@ -1645,7 +1655,7 @@ public void buildLayout() { nameLeft -= (nameWidth - widthpx); } } - if (dialogMuted || drawVerified || drawScam) { + if (dialogMuted || drawVerified || drawScam != 0) { nameMuteLeft = (int) (nameLeft + left + AndroidUtilities.dp(6)); } } @@ -1775,7 +1785,10 @@ public void setDialogSelected(boolean value) { } public void checkCurrentDialogIndex(boolean frozen) { - ArrayList dialogsArray = DialogsActivity.getDialogsArray(currentAccount, dialogsType, folderId, frozen); + if (parentFragment == null) { + return; + } + ArrayList dialogsArray = parentFragment.getDialogsArray(currentAccount, dialogsType, folderId, frozen); if (index < dialogsArray.size()) { TLRPC.Dialog dialog = dialogsArray.get(index); TLRPC.Dialog nextDialog = index + 1 < dialogsArray.size() ? dialogsArray.get(index + 1) : null; @@ -1849,7 +1862,10 @@ public void setChecked(boolean checked, boolean animated) { } private MessageObject findFolderTopMessage() { - ArrayList dialogs = DialogsActivity.getDialogsArray(currentAccount, dialogsType, currentDialogFolderId, false); + if (parentFragment == null) { + return null; + } + ArrayList dialogs = parentFragment.getDialogsArray(currentAccount, dialogsType, currentDialogFolderId, false); MessageObject maxMessage = null; if (!dialogs.isEmpty()) { for (int a = 0, N = dialogs.size(); a < N; a++) { @@ -2165,7 +2181,7 @@ public void setTranslationX(float value) { } if (isSliding) { boolean prevValue = drawRevealBackground; - drawRevealBackground = Math.abs(translationX) >= getMeasuredWidth() * 0.3f; + drawRevealBackground = Math.abs(translationX) >= getMeasuredWidth() * 0.45f; if (prevValue != drawRevealBackground && archiveHidden == SharedConfig.archiveHidden) { try { performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); @@ -2483,7 +2499,7 @@ protected void onDraw(Canvas canvas) { lastStatusDrawableParams = (this.drawClock ? 1 : 0) + (this.drawCheck1 ? 2 : 0) + (this.drawCheck2 ? 4 : 0); } - if (dialogMuted && !drawVerified && !drawScam) { + if (dialogMuted && !drawVerified && drawScam == 0) { setDrawableBounds(Theme.dialogs_muteDrawable, nameMuteLeft - AndroidUtilities.dp(useForceThreeLines || SharedConfig.useThreeLinesLayout ? 0 : 1), AndroidUtilities.dp(SharedConfig.useThreeLinesLayout ? 13.5f : 17.5f)); Theme.dialogs_muteDrawable.draw(canvas); } else if (drawVerified) { @@ -2491,9 +2507,9 @@ protected void onDraw(Canvas canvas) { setDrawableBounds(Theme.dialogs_verifiedCheckDrawable, nameMuteLeft, AndroidUtilities.dp(useForceThreeLines || SharedConfig.useThreeLinesLayout ? 12.5f : 16.5f)); Theme.dialogs_verifiedDrawable.draw(canvas); Theme.dialogs_verifiedCheckDrawable.draw(canvas); - } else if (drawScam) { - setDrawableBounds(Theme.dialogs_scamDrawable, nameMuteLeft, AndroidUtilities.dp(useForceThreeLines || SharedConfig.useThreeLinesLayout ? 12 : 15)); - Theme.dialogs_scamDrawable.draw(canvas); + } else if (drawScam != 0) { + setDrawableBounds((drawScam == 0 ? Theme.dialogs_scamDrawable : Theme.dialogs_fakeDrawable), nameMuteLeft, AndroidUtilities.dp(useForceThreeLines || SharedConfig.useThreeLinesLayout ? 12 : 15)); + (drawScam == 0 ? Theme.dialogs_scamDrawable : Theme.dialogs_fakeDrawable).draw(canvas); } if (drawReorder || reorderIconProgress != 0) { @@ -2970,7 +2986,7 @@ public boolean hasOverlappingRendering() { @Override public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(info); - if (currentDialogFolderId != 0 && archiveHidden) { + if (isFolderCell() && archivedChatsDrawable != null && archivedChatsDrawable.pullProgress == 0.0f) { info.setVisibleToUser(false); } else { info.addAction(AccessibilityNodeInfo.ACTION_CLICK); @@ -3075,6 +3091,10 @@ public void setArchivedPullAnimation(PullForegroundDrawable drawable) { archivedChatsDrawable = drawable; } + public int getCurrentDialogFolderId() { + return currentDialogFolderId; + } + public MessageObject getMessage() { return message; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/FeaturedStickerSetInfoCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/FeaturedStickerSetInfoCell.java index d7e18ab280a..2eaf3fcd8e0 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/FeaturedStickerSetInfoCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/FeaturedStickerSetInfoCell.java @@ -67,6 +67,8 @@ public class FeaturedStickerSetInfoCell extends FrameLayout { private CharSequence url; private int urlSearchLength; + float unreadProgress; + public FeaturedStickerSetInfoCell(Context context, int left) { this(context, left, false); } @@ -184,6 +186,11 @@ public void setStickerSet(TLRPC.StickerSetCovered stickerSet, boolean unread, bo animatorSet.cancel(); animatorSet = null; } + if (set != stickerSet) { + unreadProgress = unread ? 1f : 0; + invalidate(); + } + set = stickerSet; stickerSetNameSearchIndex = index; stickerSetNameSearchLength = searchLength; @@ -299,9 +306,24 @@ public void setNeedDivider(boolean needDivider) { @Override protected void onDraw(Canvas canvas) { - if (isUnread) { + if (isUnread || unreadProgress != 0f) { + if (isUnread && unreadProgress != 1f) { + unreadProgress += 16f / 100f; + if (unreadProgress > 1f) { + unreadProgress = 1f; + } else { + invalidate(); + } + } else if (!isUnread && unreadProgress != 0) { + unreadProgress -= 16f / 100f; + if (unreadProgress < 0) { + unreadProgress = 0; + } else { + invalidate(); + } + } paint.setColor(Theme.getColor(Theme.key_featuredStickers_unread)); - canvas.drawCircle(nameTextView.getRight() + AndroidUtilities.dp(12), AndroidUtilities.dp(20), AndroidUtilities.dp(4), paint); + canvas.drawCircle(nameTextView.getRight() + AndroidUtilities.dp(12), AndroidUtilities.dp(20), AndroidUtilities.dp(4) * unreadProgress, paint); } if (needDivider) { canvas.drawLine(0, 0, getWidth(), 0, Theme.dividerPaint); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/GroupCallUserCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/GroupCallUserCell.java index fbdd14e8e2d..4855de0b80d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/GroupCallUserCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/GroupCallUserCell.java @@ -10,11 +10,11 @@ import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; +import android.graphics.drawable.Drawable; import android.graphics.drawable.RippleDrawable; import android.os.Build; import android.os.SystemClock; import android.view.Gravity; -import android.view.MotionEvent; import android.view.View; import android.view.accessibility.AccessibilityNodeInfo; import android.widget.FrameLayout; @@ -50,7 +50,7 @@ public class GroupCallUserCell extends FrameLayout { private BackupImageView avatarImageView; private SimpleTextView nameTextView; - private SimpleTextView[] statusTextView = new SimpleTextView[2]; + private SimpleTextView[] statusTextView = new SimpleTextView[3]; private RLottieImageView muteButton; private RLottieDrawable muteDrawable; @@ -69,6 +69,7 @@ public class GroupCallUserCell extends FrameLayout { private boolean needDivider; private boolean currentIconGray; + private int currentStatus; private String grayIconColor = Theme.key_voipgroup_mutedIcon; @@ -81,6 +82,8 @@ public class GroupCallUserCell extends FrameLayout { private boolean updateRunnableScheduled; private boolean isSpeaking; + private Drawable speakingDrawable; + private AnimatorSet animatorSet; public GroupCallUserCell(Context context) { @@ -102,32 +105,30 @@ public GroupCallUserCell(Context context) { nameTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP); addView(nameTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 20, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, LocaleController.isRTL ? 54 : 67, 10, LocaleController.isRTL ? 67 : 54, 0)); - for (int a = 0; a < 2; a++) { + speakingDrawable = context.getResources().getDrawable(R.drawable.voice_volume_mini); + speakingDrawable.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_voipgroup_speakingText), PorterDuff.Mode.MULTIPLY)); + + for (int a = 0; a < 3; a++) { statusTextView[a] = new SimpleTextView(context); statusTextView[a].setTextSize(15); statusTextView[a].setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP); if (a == 0) { statusTextView[a].setTextColor(Theme.getColor(Theme.key_voipgroup_listeningText)); statusTextView[a].setText(LocaleController.getString("Listening", R.string.Listening)); - } else { + } else if (a == 1) { statusTextView[a].setTextColor(Theme.getColor(Theme.key_voipgroup_speakingText)); statusTextView[a].setText(LocaleController.getString("Speaking", R.string.Speaking)); + statusTextView[a].setDrawablePadding(AndroidUtilities.dp(2)); + } else { + statusTextView[a].setTextColor(Theme.getColor(Theme.key_voipgroup_mutedByAdminIcon)); + statusTextView[a].setText(LocaleController.getString("VoipGroupMutedForMe", R.string.VoipGroupMutedForMe)); } addView(statusTextView[a], LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 20, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, LocaleController.isRTL ? 54 : 67, 32, LocaleController.isRTL ? 67 : 54, 0)); } muteDrawable = new RLottieDrawable(R.raw.voice_outlined, "" + R.raw.voice_outlined, AndroidUtilities.dp(19), AndroidUtilities.dp(24), true, null); - muteButton = new RLottieImageView(context) { - @Override - public boolean dispatchTouchEvent(MotionEvent event) { - TLRPC.Chat chat = accountInstance.getMessagesController().getChat(currentCall.chatId); - if (!ChatObject.canManageCalls(chat)) { - return false; - } - return super.dispatchTouchEvent(event); - } - }; + muteButton = new RLottieImageView(context); muteButton.setScaleType(ImageView.ScaleType.CENTER); muteButton.setAnimation(muteDrawable); if (Build.VERSION.SDK_INT >= 21) { @@ -251,28 +252,7 @@ public void setGrayIconColor(String key, int value) { private void applyParticipantChanges(boolean animated, boolean internal) { TLRPC.Chat chat = accountInstance.getMessagesController().getChat(currentCall.chatId); - boolean canMute = ChatObject.canManageCalls(chat) && !isSelfUser(); - if (canMute) { - boolean isAdmin = false; - if (chat.megagroup) { - isAdmin = accountInstance.getMessagesController().getAdminRank(currentCall.chatId, participant.user_id) != null; - } else { - TLRPC.ChatFull chatFull = accountInstance.getMessagesController().getChatFull(currentCall.chatId); - if (chatFull != null) { - for (int a = 0, N = chatFull.participants.participants.size(); a < N; a++) { - TLRPC.ChatParticipant chatParticipant = chatFull.participants.participants.get(a); - if (chatParticipant.user_id == participant.user_id) { - isAdmin = chatParticipant instanceof TLRPC.TL_chatParticipantAdmin || chatParticipant instanceof TLRPC.TL_chatParticipantCreator; - break; - } - } - } - } - if (isAdmin && participant.muted) { - canMute = false; - } - } - muteButton.setEnabled(canMute); + muteButton.setEnabled(!isSelfUser()); if (!internal) { long diff = SystemClock.uptimeMillis() - participant.lastSpeakTime; @@ -299,44 +279,44 @@ private void applyParticipantChanges(boolean animated, boolean internal) { ArrayList animators = null; boolean newMuted; + boolean myted_by_me = participant.muted_by_you && !isSelfUser(); if (isSelfUser()) { newMuted = VoIPService.getSharedInstance() != null && VoIPService.getSharedInstance().isMicMute() && (!isSpeaking || !participant.hasVoice); } else { - newMuted = participant.muted && (!isSpeaking || !participant.hasVoice); + newMuted = participant.muted && (!isSpeaking || !participant.hasVoice) || myted_by_me; } boolean newMutedByAdmin = newMuted && !participant.can_self_unmute; int newMuteColor; - Object newTag; - Object oldTag = statusTextView[0].getTag(); + int newStatus; currentIconGray = false; - if (participant.muted && !isSpeaking) { - if (!participant.can_self_unmute) { + if (participant.muted && !isSpeaking || myted_by_me) { + if (!participant.can_self_unmute || myted_by_me) { newMuteColor = Theme.getColor(Theme.key_voipgroup_mutedByAdminIcon); } else { newMuteColor = Theme.getColor(grayIconColor); currentIconGray = true; } - newTag = null; + newStatus = myted_by_me ? 2 : 0; } else { if (isSpeaking && participant.hasVoice) { newMuteColor = Theme.getColor(Theme.key_voipgroup_speakingText); - newTag = 1; + newStatus = 1; } else { newMuteColor = Theme.getColor(grayIconColor); - newTag = null; + newStatus = 0; currentIconGray = true; } } boolean somethingChanged = false; if (animatorSet != null) { - if (newTag == null && oldTag != null || newTag != null && oldTag == null || - lastMuteColor != newMuteColor) { + if (newStatus != currentStatus || lastMuteColor != newMuteColor) { somethingChanged = true; } } if (!animated || somethingChanged) { if (animatorSet != null) { animatorSet.cancel(); + animatorSet = null; } } if (!animated || lastMuteColor != newMuteColor || somethingChanged) { @@ -359,64 +339,63 @@ private void applyParticipantChanges(boolean animated, boolean internal) { Theme.setSelectorDrawableColor(muteButton.getDrawable(), newMuteColor & 0x24ffffff, true); } } - if (!animated || newTag == null && oldTag != null || newTag != null && oldTag == null || somethingChanged) { + if (newStatus == 1) { + int vol = ChatObject.getParticipantVolume(participant); + int volume = vol / 100; + if (volume != 100) { + statusTextView[1].setLeftDrawable(speakingDrawable); + statusTextView[1].setText((vol < 100 ? 1 : volume) + "% " + LocaleController.getString("Speaking", R.string.Speaking)); + } else { + statusTextView[1].setLeftDrawable(null); + statusTextView[1].setText(LocaleController.getString("Speaking", R.string.Speaking)); + } + } + if (!animated || newStatus != currentStatus || somethingChanged) { if (animated) { if (animators == null) { animators = new ArrayList<>(); } statusTextView[0].setVisibility(VISIBLE); statusTextView[1].setVisibility(VISIBLE); - if (newTag == null) { + statusTextView[2].setVisibility(VISIBLE); + if (newStatus == 0) { animators.add(ObjectAnimator.ofFloat(statusTextView[0], View.TRANSLATION_Y, 0)); animators.add(ObjectAnimator.ofFloat(statusTextView[0], View.ALPHA, 1.0f)); animators.add(ObjectAnimator.ofFloat(statusTextView[1], View.TRANSLATION_Y, -AndroidUtilities.dp(2))); animators.add(ObjectAnimator.ofFloat(statusTextView[1], View.ALPHA, 0.0f)); - } else { + animators.add(ObjectAnimator.ofFloat(statusTextView[2], View.TRANSLATION_Y, -AndroidUtilities.dp(2))); + animators.add(ObjectAnimator.ofFloat(statusTextView[2], View.ALPHA, 0.0f)); + } else if (newStatus == 1) { animators.add(ObjectAnimator.ofFloat(statusTextView[0], View.TRANSLATION_Y, AndroidUtilities.dp(2))); animators.add(ObjectAnimator.ofFloat(statusTextView[0], View.ALPHA, 0.0f)); animators.add(ObjectAnimator.ofFloat(statusTextView[1], View.TRANSLATION_Y, 0)); animators.add(ObjectAnimator.ofFloat(statusTextView[1], View.ALPHA, 1.0f)); - } - } else { - if (newTag == null) { - statusTextView[0].setVisibility(VISIBLE); - statusTextView[1].setVisibility(INVISIBLE); - statusTextView[0].setTranslationY(0); - statusTextView[0].setAlpha(1.0f); - statusTextView[1].setTranslationY(-AndroidUtilities.dp(2)); - statusTextView[1].setAlpha(0.0f); + animators.add(ObjectAnimator.ofFloat(statusTextView[2], View.TRANSLATION_Y, -AndroidUtilities.dp(2))); + animators.add(ObjectAnimator.ofFloat(statusTextView[2], View.ALPHA, 0.0f)); } else { - statusTextView[0].setVisibility(INVISIBLE); - statusTextView[1].setVisibility(VISIBLE); - statusTextView[0].setTranslationY(AndroidUtilities.dp(2)); - statusTextView[0].setAlpha(0.0f); - statusTextView[1].setTranslationY(0); - statusTextView[1].setAlpha(1.0f); + animators.add(ObjectAnimator.ofFloat(statusTextView[0], View.TRANSLATION_Y, AndroidUtilities.dp(2))); + animators.add(ObjectAnimator.ofFloat(statusTextView[0], View.ALPHA, 0.0f)); + animators.add(ObjectAnimator.ofFloat(statusTextView[1], View.TRANSLATION_Y, -AndroidUtilities.dp(2))); + animators.add(ObjectAnimator.ofFloat(statusTextView[1], View.ALPHA, 0.0f)); + animators.add(ObjectAnimator.ofFloat(statusTextView[2], View.TRANSLATION_Y, 0)); + animators.add(ObjectAnimator.ofFloat(statusTextView[2], View.ALPHA, 1.0f)); } + } else { + applyStatus(newStatus); } - statusTextView[0].setTag(newTag); + currentStatus = newStatus; } - avatarWavesDrawable.setMuted(newTag == null, animated); + avatarWavesDrawable.setMuted(newStatus, animated); if (animators != null) { + if (animatorSet != null) { + animatorSet.cancel(); + animatorSet = null; + } animatorSet = new AnimatorSet(); animatorSet.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { - if (newTag == null) { - statusTextView[0].setVisibility(VISIBLE); - statusTextView[1].setVisibility(INVISIBLE); - statusTextView[0].setTranslationY(0); - statusTextView[0].setAlpha(1.0f); - statusTextView[1].setTranslationY(-AndroidUtilities.dp(2)); - statusTextView[1].setAlpha(0.0f); - } else { - statusTextView[0].setVisibility(INVISIBLE); - statusTextView[1].setVisibility(VISIBLE); - statusTextView[0].setTranslationY(AndroidUtilities.dp(2)); - statusTextView[0].setAlpha(0.0f); - statusTextView[1].setTranslationY(0); - statusTextView[1].setAlpha(1.0f); - } + applyStatus(newStatus); animatorSet = null; } }); @@ -448,6 +427,40 @@ public void onAnimationEnd(Animator animation) { avatarWavesDrawable.setShowWaves(isSpeaking, this); } + private void applyStatus(int newStatus) { + if (newStatus == 0) { + statusTextView[0].setVisibility(VISIBLE); + statusTextView[0].setTranslationY(0); + statusTextView[0].setAlpha(1.0f); + statusTextView[1].setVisibility(INVISIBLE); + statusTextView[1].setTranslationY(-AndroidUtilities.dp(2)); + statusTextView[1].setAlpha(0.0f); + statusTextView[2].setVisibility(INVISIBLE); + statusTextView[2].setTranslationY(-AndroidUtilities.dp(2)); + statusTextView[2].setAlpha(0.0f); + } else if (newStatus == 1) { + statusTextView[0].setVisibility(INVISIBLE); + statusTextView[0].setTranslationY(AndroidUtilities.dp(2)); + statusTextView[0].setAlpha(0.0f); + statusTextView[1].setVisibility(VISIBLE); + statusTextView[1].setTranslationY(0); + statusTextView[1].setAlpha(1.0f); + statusTextView[2].setVisibility(INVISIBLE); + statusTextView[2].setTranslationY(-AndroidUtilities.dp(2)); + statusTextView[2].setAlpha(0.0f); + } else { + statusTextView[0].setVisibility(INVISIBLE); + statusTextView[0].setTranslationY(AndroidUtilities.dp(2)); + statusTextView[0].setAlpha(0.0f); + statusTextView[1].setVisibility(INVISIBLE); + statusTextView[1].setTranslationY(-AndroidUtilities.dp(2)); + statusTextView[1].setAlpha(0.0f); + statusTextView[2].setVisibility(VISIBLE); + statusTextView[2].setTranslationY(0); + statusTextView[2].setAlpha(1.0f); + } + } + @Override public boolean hasOverlappingRendering() { return false; @@ -481,7 +494,7 @@ public static class AvatarWavesDrawable { private BlobDrawable blobDrawable2; private boolean hasCustomColor; - private boolean isMuted; + private int isMuted; private float progressToMuted = 0; boolean invalidateColor = true; @@ -535,13 +548,13 @@ public void draw(Canvas canvas, float cx, float cy, View parentView) { canvas.scale(scaleBlob * wavesEnter, scaleBlob * wavesEnter, cx, cy); if (!hasCustomColor) { - if (isMuted && progressToMuted != 1f) { + if (isMuted != 1 && progressToMuted != 1f) { progressToMuted += 16 / 150f; if (progressToMuted > 1f) { progressToMuted = 1f; } invalidateColor = true; - } else if (!isMuted && progressToMuted != 0f) { + } else if (isMuted == 1 && progressToMuted != 0f) { progressToMuted -= 16 / 150f; if (progressToMuted < 0f) { progressToMuted = 0f; @@ -550,7 +563,7 @@ public void draw(Canvas canvas, float cx, float cy, View parentView) { } if (invalidateColor) { - int color = ColorUtils.blendARGB(Theme.getColor(Theme.key_voipgroup_speakingText), Theme.getColor(Theme.key_voipgroup_listeningText), progressToMuted); + int color = ColorUtils.blendARGB(Theme.getColor(Theme.key_voipgroup_speakingText), isMuted == 2 ? Theme.getColor(Theme.key_voipgroup_mutedByAdminIcon) : Theme.getColor(Theme.key_voipgroup_listeningText), progressToMuted); blobDrawable.paint.setColor(ColorUtils.setAlphaComponent(color, (int) (255 * WaveDrawable.CIRCLE_ALPHA_2))); } } @@ -575,9 +588,9 @@ public float getAvatarScale() { return scaleAvatar * wavesEnter + 1f * (1f - wavesEnter); } - public void setShowWaves(boolean show, View parenView) { + public void setShowWaves(boolean show, View parentView) { if (showWaves != show) { - parenView.invalidate(); + parentView.invalidate(); } showWaves = show; } @@ -601,10 +614,10 @@ public void setColor(int color) { blobDrawable.paint.setColor(color); } - public void setMuted(boolean isMuted, boolean animated) { - this.isMuted = isMuted; + public void setMuted(int status, boolean animated) { + this.isMuted = status; if (!animated) { - progressToMuted = isMuted ? 1f : 0f; + progressToMuted = isMuted != 1 ? 1f : 0f; } invalidateColor = true; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/HintDialogCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/HintDialogCell.java index c525455e500..801e0415656 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/HintDialogCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/HintDialogCell.java @@ -30,6 +30,7 @@ import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Components.AvatarDrawable; import org.telegram.ui.Components.BackupImageView; +import org.telegram.ui.Components.CounterView; import org.telegram.ui.Components.LayoutHelper; public class HintDialogCell extends FrameLayout { @@ -40,12 +41,14 @@ public class HintDialogCell extends FrameLayout { private RectF rect = new RectF(); private int lastUnreadCount; - private int countWidth; - private StaticLayout countLayout; private TLRPC.User currentUser; private long dialog_id; private int currentAccount = UserConfig.selectedAccount; + float showOnlineProgress; + boolean wasDraw; + + CounterView counterView; public HintDialogCell(Context context) { super(context); @@ -62,11 +65,17 @@ public HintDialogCell(Context context) { nameTextView.setLines(1); nameTextView.setEllipsize(TextUtils.TruncateAt.END); addView(nameTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 6, 64, 6, 0)); + + counterView = new CounterView(context); + addView(counterView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 28, Gravity.TOP,0 ,4,0,0)); + counterView.setColors(Theme.key_chats_unreadCounterText, Theme.key_chats_unreadCounter); + counterView.setGravity(Gravity.RIGHT); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(86), MeasureSpec.EXACTLY)); + counterView.horizontalPadding = AndroidUtilities.dp(13); } public void update(int mask) { @@ -84,19 +93,11 @@ public void update(int mask) { if (dialog != null && dialog.unread_count != 0) { if (lastUnreadCount != dialog.unread_count) { lastUnreadCount = dialog.unread_count; - String countString = String.format("%d", dialog.unread_count); - countWidth = Math.max(AndroidUtilities.dp(12), (int) Math.ceil(Theme.dialogs_countTextPaint.measureText(countString))); - countLayout = new StaticLayout(countString, Theme.dialogs_countTextPaint, countWidth, Layout.Alignment.ALIGN_CENTER, 1.0f, 0.0f, false); - if (mask != 0) { - invalidate(); - } - } - } else if (countLayout != null) { - if (mask != 0) { - invalidate(); + counterView.setCount(lastUnreadCount, wasDraw); } + } else { lastUnreadCount = 0; - countLayout = null; + counterView.setCount(0, wasDraw); } } @@ -114,6 +115,10 @@ public void update() { } public void setDialog(int uid, boolean counter, CharSequence name) { + if (dialog_id != uid) { + wasDraw = false; + invalidate(); + } dialog_id = uid; if (uid > 0) { currentUser = MessagesController.getInstance(currentAccount).getUser(uid); @@ -141,8 +146,6 @@ public void setDialog(int uid, boolean counter, CharSequence name) { } if (counter) { update(0); - } else { - countLayout = null; } } @@ -150,25 +153,35 @@ public void setDialog(int uid, boolean counter, CharSequence name) { protected boolean drawChild(Canvas canvas, View child, long drawingTime) { boolean result = super.drawChild(canvas, child, drawingTime); if (child == imageView) { - if (countLayout != null) { - int top = AndroidUtilities.dp(6); - int left = AndroidUtilities.dp(54); - int x = left - AndroidUtilities.dp(5.5f); - rect.set(x, top, x + countWidth + AndroidUtilities.dp(11), top + AndroidUtilities.dp(23)); - canvas.drawRoundRect(rect, 11.5f * AndroidUtilities.density, 11.5f * AndroidUtilities.density, MessagesController.getInstance(currentAccount).isDialogMuted(dialog_id) ? Theme.dialogs_countGrayPaint : Theme.dialogs_countPaint); - canvas.save(); - canvas.translate(left, top + AndroidUtilities.dp(4)); - countLayout.draw(canvas); - canvas.restore(); + boolean showOnline = currentUser != null && !currentUser.bot && (currentUser.status != null && currentUser.status.expires > ConnectionsManager.getInstance(currentAccount).getCurrentTime() || MessagesController.getInstance(currentAccount).onlinePrivacy.containsKey(currentUser.id)); + if (!wasDraw) { + showOnlineProgress = showOnline ? 1f : 0f; + } + if (showOnline && showOnlineProgress != 1f) { + showOnlineProgress += 16f / 150; + if (showOnlineProgress > 1) { + showOnlineProgress = 1f; + } + invalidate(); + } else if (!showOnline && showOnlineProgress != 0) { + showOnlineProgress -= 16f / 150; + if (showOnlineProgress < 0) { + showOnlineProgress = 0; + } + invalidate(); } - if (currentUser != null && !currentUser.bot && (currentUser.status != null && currentUser.status.expires > ConnectionsManager.getInstance(currentAccount).getCurrentTime() || MessagesController.getInstance(currentAccount).onlinePrivacy.containsKey(currentUser.id))) { + if (showOnlineProgress != 0) { int top = AndroidUtilities.dp(53); int left = AndroidUtilities.dp(59); + canvas.save(); + canvas.scale(showOnlineProgress, showOnlineProgress, left, top); Theme.dialogs_onlineCirclePaint.setColor(Theme.getColor(Theme.key_windowBackgroundWhite)); canvas.drawCircle(left, top, AndroidUtilities.dp(7), Theme.dialogs_onlineCirclePaint); Theme.dialogs_onlineCirclePaint.setColor(Theme.getColor(Theme.key_chats_onlineCircle)); canvas.drawCircle(left, top, AndroidUtilities.dp(5), Theme.dialogs_onlineCirclePaint); + canvas.restore(); } + wasDraw = true; } return result; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedAudioCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedAudioCell.java index df5757a3ebc..ee6679bdd99 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedAudioCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedAudioCell.java @@ -35,6 +35,7 @@ import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Components.CheckBox2; +import org.telegram.ui.Components.DotDividerSpan; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.MediaActionDrawable; import org.telegram.ui.Components.RadialProgress2; @@ -109,25 +110,7 @@ public SharedAudioCell(Context context, int viewType) { description2TextPaint.setTextSize(AndroidUtilities.dp(13)); dotSpan = new SpannableStringBuilder("."); - dotSpan.setSpan(new ReplacementSpan() { - - Paint p = new Paint(Paint.ANTI_ALIAS_FLAG); - int color; - - @Override - public int getSize(@NonNull Paint paint, CharSequence charSequence, int i, int i1, @Nullable Paint.FontMetricsInt fontMetricsInt) { - return AndroidUtilities.dp(3); - } - - @Override - public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) { - if (color != paint.getColor()) { - p.setColor(paint.getColor()); - } - float radius = AndroidUtilities.dpf2(3) / 2f; - canvas.drawCircle(x + radius, (bottom - top) / 2, radius, p); - } - }, 0, 1, 0); + dotSpan.setSpan(new DotDividerSpan(), 0, 1, 0); } captionTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedDocumentCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedDocumentCell.java index f0fd23955ba..6d4fc46a59e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedDocumentCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedDocumentCell.java @@ -8,18 +8,29 @@ package org.telegram.ui.Cells; +import android.animation.Animator; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; +import android.os.Build; import android.text.SpannableStringBuilder; import android.text.TextUtils; import android.text.style.ReplacementSpan; +import android.transition.ChangeBounds; +import android.transition.Fade; +import android.transition.TransitionManager; +import android.transition.TransitionSet; +import android.transition.TransitionValues; +import android.transition.Visibility; import android.util.TypedValue; import android.view.Gravity; import android.view.View; +import android.view.ViewGroup; import android.view.accessibility.AccessibilityNodeInfo; import android.widget.FrameLayout; import android.widget.ImageView; @@ -40,11 +51,16 @@ import org.telegram.messenger.R; import org.telegram.messenger.UserConfig; import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.ActionBarMenuItem; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.Components.BackupImageView; import org.telegram.ui.Components.CheckBox2; +import org.telegram.ui.Components.CubicBezierInterpolator; +import org.telegram.ui.Components.DotDividerSpan; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.LineProgressView; +import org.telegram.ui.Components.RLottieDrawable; +import org.telegram.ui.Components.RLottieImageView; import org.telegram.ui.FilteredSearchView; import java.io.File; @@ -58,7 +74,7 @@ public class SharedDocumentCell extends FrameLayout implements DownloadControlle private TextView nameTextView; private TextView extTextView; private TextView dateTextView; - private ImageView statusImageView; + private RLottieImageView statusImageView; private LineProgressView progressView; private CheckBox2 checkBox; private TextView rightDateTextView; @@ -81,6 +97,7 @@ public class SharedDocumentCell extends FrameLayout implements DownloadControlle private SpannableStringBuilder dotSpan; private CharSequence caption; + private RLottieDrawable statusDrawable; public SharedDocumentCell(Context context) { this(context, VIEW_TYPE_DEFAULT); @@ -181,13 +198,15 @@ protected void onDraw(Canvas canvas) { addView(nameTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, LocaleController.isRTL ? 8 : 72, 5, LocaleController.isRTL ? 72 : 8, 0)); } - statusImageView = new ImageView(context); + statusDrawable = new RLottieDrawable(R.raw.download_arrow, "download_arrow", AndroidUtilities.dp(14), AndroidUtilities.dp(14), true, null); + statusImageView = new RLottieImageView(context); + statusImageView.setAnimation(statusDrawable); statusImageView.setVisibility(INVISIBLE); statusImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_sharedMedia_startStopLoadIcon), PorterDuff.Mode.MULTIPLY)); if (viewType == VIEW_TYPE_PICKER) { - addView(statusImageView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, LocaleController.isRTL ? 8 : 72, 39, LocaleController.isRTL ? 72 : 8, 0)); + addView(statusImageView, LayoutHelper.createFrame(14, 14, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, LocaleController.isRTL ? 8 : 70, 37, LocaleController.isRTL ? 72 : 8, 0)); } else { - addView(statusImageView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, LocaleController.isRTL ? 8 : 72, 35, LocaleController.isRTL ? 72 : 8, 0)); + addView(statusImageView, LayoutHelper.createFrame(14, 14, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, LocaleController.isRTL ? 8 : 70, 33, LocaleController.isRTL ? 72 : 8, 0)); } dateTextView = new TextView(context); @@ -222,25 +241,7 @@ protected void onDraw(Canvas canvas) { if (viewType == VIEW_TYPE_GLOBAL_SEARCH) { dotSpan = new SpannableStringBuilder("."); - dotSpan.setSpan(new ReplacementSpan() { - - Paint p = new Paint(Paint.ANTI_ALIAS_FLAG); - int color; - - @Override - public int getSize(@NonNull Paint paint, CharSequence charSequence, int i, int i1, @Nullable Paint.FontMetricsInt fontMetricsInt) { - return AndroidUtilities.dp(3); - } - - @Override - public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) { - if (color != paint.getColor()) { - p.setColor(paint.getColor()); - } - float radius = AndroidUtilities.dpf2(3) / 2f; - canvas.drawCircle(x + radius, (bottom - top) / 2, radius, p); - } - }, 0, 1, 0); + dotSpan.setSpan(new DotDividerSpan(), 0, 1, 0); } } @@ -359,7 +360,7 @@ protected void onDetachedFromWindow() { protected void onAttachedToWindow() { super.onAttachedToWindow(); if (progressView.getVisibility() == VISIBLE) { - updateFileExistIcon(); + updateFileExistIcon(false); } } @@ -371,6 +372,7 @@ public void setChecked(boolean checked, boolean animated) { } public void setDocument(MessageObject messageObject, boolean divider) { + boolean animated = message != null && messageObject != null && message.getId() != messageObject.getId(); needDivider = divider; message = messageObject; loaded = false; @@ -463,16 +465,31 @@ public void setDocument(MessageObject messageObject, boolean divider) { setWillNotDraw(!needDivider); progressView.setProgress(0, false); - updateFileExistIcon(); + updateFileExistIcon(animated); } - public void updateFileExistIcon() { + public void updateFileExistIcon(boolean animated) { + if (animated && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + TransitionSet transition = new TransitionSet(); + ChangeBounds changeBounds = new ChangeBounds(); + changeBounds.setDuration(150); + transition.addTransition(new Fade().setDuration(150)).addTransition(changeBounds); + transition.setOrdering(TransitionSet.ORDERING_TOGETHER); + transition.setInterpolator(CubicBezierInterpolator.DEFAULT); + TransitionManager.beginDelayedTransition(this, transition); + } if (message != null && message.messageOwner.media != null) { loaded = false; if (message.attachPathExists || message.mediaExists) { statusImageView.setVisibility(INVISIBLE); progressView.setVisibility(INVISIBLE); - dateTextView.setPadding(0, 0, 0, 0); + + LayoutParams layoutParams = (LayoutParams) dateTextView.getLayoutParams(); + if (layoutParams != null) { + layoutParams.leftMargin = AndroidUtilities.dp(LocaleController.isRTL ? 8 : 72); + layoutParams.rightMargin = AndroidUtilities.dp(LocaleController.isRTL ? 72 : 8); + dateTextView.requestLayout(); + } loading = false; loaded = true; DownloadController.getInstance(currentAccount).removeLoadingFileObserver(this); @@ -481,8 +498,20 @@ public void updateFileExistIcon() { DownloadController.getInstance(currentAccount).addLoadingFileObserver(fileName, message, this); loading = FileLoader.getInstance(currentAccount).isLoadingFile(fileName); statusImageView.setVisibility(VISIBLE); - statusImageView.setImageResource(loading ? R.drawable.media_doc_pause : R.drawable.media_doc_load); - dateTextView.setPadding(LocaleController.isRTL ? 0 : AndroidUtilities.dp(14), 0, LocaleController.isRTL ? AndroidUtilities.dp(14) : 0, 0); + statusDrawable.setCustomEndFrame(loading ? 15 : 0); + statusDrawable.setPlayInDirectionOfCustomEndFrame(true); + if (animated) { + statusImageView.playAnimation(); + } else { + statusDrawable.setCurrentFrame(loading ? 15 : 0); + statusImageView.invalidate(); + } + LayoutParams layoutParams = (LayoutParams) dateTextView.getLayoutParams(); + if (layoutParams != null) { + layoutParams.leftMargin = AndroidUtilities.dp(LocaleController.isRTL ? 8 : (72 + 14)); + layoutParams.rightMargin = AndroidUtilities.dp(LocaleController.isRTL ? (72 + 14) : 8); + dateTextView.requestLayout(); + } if (loading) { progressView.setVisibility(VISIBLE); Float progress = ImageLoader.getInstance().getFileProgress(fileName); @@ -500,7 +529,12 @@ public void updateFileExistIcon() { progressView.setVisibility(INVISIBLE); progressView.setProgress(0, false); statusImageView.setVisibility(INVISIBLE); - dateTextView.setPadding(0, 0, 0, 0); + LayoutParams layoutParams = (LayoutParams) dateTextView.getLayoutParams(); + if (layoutParams != null) { + layoutParams.leftMargin = AndroidUtilities.dp(LocaleController.isRTL ? 8 : 72); + layoutParams.rightMargin = AndroidUtilities.dp(LocaleController.isRTL ? 72 : 8); + dateTextView.requestLayout(); + } DownloadController.getInstance(currentAccount).removeLoadingFileObserver(this); } } @@ -572,19 +606,19 @@ protected void onDraw(Canvas canvas) { @Override public void onFailedDownload(String name, boolean canceled) { - updateFileExistIcon(); + updateFileExistIcon(true); } @Override public void onSuccessDownload(String name) { progressView.setProgress(1, true); - updateFileExistIcon(); + updateFileExistIcon(true); } @Override public void onProgressDownload(String fileName, long downloadedSize, long totalSize) { if (progressView.getVisibility() != VISIBLE) { - updateFileExistIcon(); + updateFileExistIcon(true); } progressView.setProgress(Math.min(1f, downloadedSize / (float) totalSize), true); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextCell.java index 1d34c4f9d00..8f514383130 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextCell.java @@ -34,6 +34,7 @@ public class TextCell extends FrameLayout { private boolean needDivider; private int offsetFromImage = 71; private int imageLeft = 21; + private boolean inDialogs; public TextCell(Context context) { this(context, 23, false); @@ -70,6 +71,10 @@ public TextCell(Context context, int left, boolean dialog) { setFocusable(true); } + public void setIsInDialogs() { + inDialogs = true; + } + public SimpleTextView getTextView() { return textView; } @@ -219,7 +224,7 @@ public void setTextAndValueDrawable(String text, Drawable drawable, boolean divi @Override protected void onDraw(Canvas canvas) { if (needDivider) { - canvas.drawLine(LocaleController.isRTL ? 0 : AndroidUtilities.dp(imageView.getVisibility() == VISIBLE ? 68 : 20), getMeasuredHeight() - 1, getMeasuredWidth() - (LocaleController.isRTL ? AndroidUtilities.dp(imageView.getVisibility() == VISIBLE ? 68 : 20) : 0), getMeasuredHeight() - 1, Theme.dividerPaint); + canvas.drawLine(LocaleController.isRTL ? 0 : AndroidUtilities.dp(imageView.getVisibility() == VISIBLE ? (inDialogs ? 72 : 68) : 20), getMeasuredHeight() - 1, getMeasuredWidth() - (LocaleController.isRTL ? AndroidUtilities.dp(imageView.getVisibility() == VISIBLE ? (inDialogs ? 72 : 68) : 20) : 0), getMeasuredHeight() - 1, Theme.dividerPaint); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextInfoPrivacyCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextInfoPrivacyCell.java index 59dce36d01c..9e414af91c9 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextInfoPrivacyCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextInfoPrivacyCell.java @@ -11,6 +11,7 @@ import android.animation.Animator; import android.animation.ObjectAnimator; import android.content.Context; +import android.graphics.Canvas; import android.text.SpannableString; import android.text.TextUtils; import android.text.method.LinkMovementMethod; @@ -45,7 +46,13 @@ public TextInfoPrivacyCell(Context context) { public TextInfoPrivacyCell(Context context, int padding) { super(context); - textView = new TextView(context); + textView = new TextView(context) { + @Override + protected void onDraw(Canvas canvas) { + onTextDraw(); + super.onDraw(canvas); + } + }; textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); textView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); textView.setPadding(0, AndroidUtilities.dp(10), 0, AndroidUtilities.dp(17)); @@ -56,6 +63,10 @@ public TextInfoPrivacyCell(Context context, int padding) { addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, padding, 0, padding, 0)); } + protected void onTextDraw() { + + } + public void setLinkTextColorKey(String key) { linkTextColorKey = key; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/UserCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/UserCell.java index 8f7f6a70690..7fe3538c9a6 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/UserCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/UserCell.java @@ -499,6 +499,11 @@ public void update(int mask) { } else { avatarImageView.setImageDrawable(avatarDrawable); } + + nameTextView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); + if (adminTextView != null) { + adminTextView.setTextColor(Theme.getColor(Theme.key_profile_creatorIcon)); + } } public void setSelfAsSavedMessages(boolean value) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChannelCreateActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChannelCreateActivity.java index eb9c1b0dfdf..9858d69c730 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChannelCreateActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChannelCreateActivity.java @@ -22,6 +22,7 @@ import android.text.Editable; import android.text.InputFilter; import android.text.InputType; +import android.text.TextUtils; import android.text.TextWatcher; import android.util.TypedValue; import android.view.Gravity; @@ -35,7 +36,6 @@ import android.widget.TextView; import org.telegram.messenger.AndroidUtilities; -import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.ChatObject; import org.telegram.messenger.FileLog; import org.telegram.messenger.ImageLocation; @@ -59,12 +59,14 @@ import org.telegram.ui.Cells.TextBlockCell; import org.telegram.ui.Cells.TextInfoPrivacyCell; import org.telegram.ui.Components.AvatarDrawable; -import org.telegram.ui.Components.BulletinFactory; import org.telegram.ui.Components.EditTextEmoji; import org.telegram.ui.Components.ImageUpdater; import org.telegram.ui.Components.BackupImageView; import org.telegram.ui.Components.EditTextBoldCursor; import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.LinkActionView; +import org.telegram.ui.Components.RLottieDrawable; +import org.telegram.ui.Components.RLottieImageView; import org.telegram.ui.Components.RadialProgressView; import org.telegram.ui.Components.SizeNotifierFrameLayout; @@ -78,7 +80,7 @@ public class ChannelCreateActivity extends BaseFragment implements NotificationC private ShadowSectionCell sectionCell; private BackupImageView avatarImage; private View avatarOverlay; - private ImageView avatarEditor; + private RLottieImageView avatarEditor; private AnimatorSet avatarAnimation; private RadialProgressView avatarProgressView; private AvatarDrawable avatarDrawable; @@ -91,11 +93,14 @@ public class ChannelCreateActivity extends BaseFragment implements NotificationC private HeaderCell headerCell2; private EditTextBoldCursor editText; + private RLottieDrawable cameraDrawable; + private LinearLayout linearLayout; private LinearLayout adminnedChannelsLayout; private LinearLayout linkContainer; private LinearLayout publicContainer; - private TextBlockCell privateContainer; + private LinearLayout privateContainer; + private LinkActionView permanentLinkView; private RadioButtonCell radioButtonCell1; private RadioButtonCell radioButtonCell2; private TextInfoPrivacyCell typeInfoCell; @@ -108,7 +113,7 @@ public class ChannelCreateActivity extends BaseFragment implements NotificationC private boolean lastNameAvailable; private boolean isPrivate; private boolean loadingInvite; - private TLRPC.ExportedChatInvite invite; + private TLRPC.TL_chatInviteExported invite; private boolean loadingAdminedChannels; private TextInfoPrivacyCell adminedInfoCell; @@ -270,7 +275,7 @@ public void onItemClick(int id) { progressDialog.show(); return; } - final int reqId = MessagesController.getInstance(currentAccount).createChat(nameTextView.getText().toString(), new ArrayList<>(), descriptionTextView.getText().toString(), ChatObject.CHAT_TYPE_CHANNEL, null, null, ChannelCreateActivity.this); + final int reqId = MessagesController.getInstance(currentAccount).createChat(nameTextView.getText().toString(), new ArrayList<>(), descriptionTextView.getText().toString(), ChatObject.CHAT_TYPE_CHANNEL, false, null, null, ChannelCreateActivity.this); progressDialog = new AlertDialog(getParentActivity(), 3); progressDialog.setOnCancelListener(dialog -> { ConnectionsManager.getInstance(currentAccount).cancelRequest(reqId, true); @@ -481,18 +486,30 @@ protected void onDraw(Canvas canvas) { } }; frameLayout.addView(avatarOverlay, LayoutHelper.createFrame(64, 64, Gravity.TOP | (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT), LocaleController.isRTL ? 0 : 16, 12, LocaleController.isRTL ? 16 : 0, 12)); - avatarOverlay.setOnClickListener(view -> imageUpdater.openMenu(avatar != null, () -> { - avatar = null; - avatarBig = null; - inputPhoto = null; - inputVideo = null; - inputVideoPath = null; - videoTimestamp = 0; - showAvatarProgress(false, true); - avatarImage.setImage(null, null, avatarDrawable, null); - })); + avatarOverlay.setOnClickListener(view -> { + imageUpdater.openMenu(avatar != null, () -> { + avatar = null; + avatarBig = null; + inputPhoto = null; + inputVideo = null; + inputVideoPath = null; + videoTimestamp = 0; + showAvatarProgress(false, true); + avatarImage.setImage(null, null, avatarDrawable, null); + avatarEditor.setAnimation(cameraDrawable); + cameraDrawable.setCurrentFrame(0); + }, dialog -> { + cameraDrawable.setCustomEndFrame(86); + avatarEditor.playAnimation(); + }); + cameraDrawable.setCurrentFrame(0); + cameraDrawable.setCustomEndFrame(43); + avatarEditor.playAnimation(); + }); - avatarEditor = new ImageView(context) { + cameraDrawable = new RLottieDrawable(R.raw.camera, "" + R.raw.camera, AndroidUtilities.dp(60), AndroidUtilities.dp(60), false, null); + + avatarEditor = new RLottieImageView(context) { @Override public void invalidate(int l, int t, int r, int b) { super.invalidate(l, t, r, b); @@ -506,9 +523,10 @@ public void invalidate() { } }; avatarEditor.setScaleType(ImageView.ScaleType.CENTER); - avatarEditor.setImageResource(R.drawable.menu_camera_av); + avatarEditor.setAnimation(cameraDrawable); avatarEditor.setEnabled(false); avatarEditor.setClickable(false); + avatarEditor.setPadding(AndroidUtilities.dp(2), 0, 0, AndroidUtilities.dp(1)); frameLayout.addView(avatarEditor, LayoutHelper.createFrame(64, 64, Gravity.TOP | (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT), LocaleController.isRTL ? 0 : 16, 12, LocaleController.isRTL ? 16 : 0, 12)); avatarProgressView = new RadialProgressView(context); @@ -528,6 +546,15 @@ public void invalidate() { InputFilter[] inputFilters = new InputFilter[1]; inputFilters[0] = new InputFilter.LengthFilter(100); nameTextView.setFilters(inputFilters); + nameTextView.getEditText().setSingleLine(true); + nameTextView.getEditText().setImeOptions(EditorInfo.IME_ACTION_NEXT); + nameTextView.getEditText().setOnEditorActionListener((textView, i, keyEvent) -> { + if (i == EditorInfo.IME_ACTION_NEXT && !TextUtils.isEmpty(nameTextView.getEditText().getText())) { + descriptionTextView.requestFocus(); + return true; + } + return false; + }); frameLayout.addView(nameTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_VERTICAL, LocaleController.isRTL ? 5 : 96, 0, LocaleController.isRTL ? 96 : 5, 0)); descriptionTextView = new EditTextBoldCursor(context); @@ -687,24 +714,14 @@ public void afterTextChanged(Editable editable) { } }); - privateContainer = new TextBlockCell(context); - privateContainer.setBackgroundDrawable(Theme.getSelectorDrawable(false)); - linkContainer.addView(privateContainer); - privateContainer.setOnClickListener(v -> { - if (invite == null) { - return; - } - try { - android.content.ClipboardManager clipboard = (android.content.ClipboardManager) ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE); - android.content.ClipData clip = android.content.ClipData.newPlainText("label", invite.link); - clipboard.setPrimaryClip(clip); - if (BulletinFactory.canShowBulletin(ChannelCreateActivity.this)) { - BulletinFactory.createCopyLinkBulletin(ChannelCreateActivity.this).show(); - } - } catch (Exception e) { - FileLog.e(e); - } - }); + privateContainer = new LinearLayout(context); + privateContainer.setOrientation(LinearLayout.VERTICAL); + linkContainer.addView(privateContainer, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); + + permanentLinkView = new LinkActionView(context, this, null, chatId, true); + permanentLinkView.showOptions(false); + permanentLinkView.setUsers(0, null); + privateContainer.addView(permanentLinkView); checkTextView = new TextView(context); checkTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); @@ -739,14 +756,18 @@ private void generateLink() { return; } loadingInvite = true; - TLRPC.TL_messages_exportChatInvite req = new TLRPC.TL_messages_exportChatInvite(); - req.peer = MessagesController.getInstance(currentAccount).getInputPeer(-chatId); + TLRPC.TL_messages_getExportedChatInvites req = new TLRPC.TL_messages_getExportedChatInvites(); + req.peer = getMessagesController().getInputPeer(-chatId); + req.admin_id = getMessagesController().getInputUser(getUserConfig().getCurrentUser()); + req.limit = 1; + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { if (error == null) { - invite = (TLRPC.ExportedChatInvite) response; + TLRPC.TL_messages_exportedChatInvites invites = (TLRPC.TL_messages_exportedChatInvites) response; + invite = (TLRPC.TL_chatInviteExported) invites.invites.get(0); } loadingInvite = false; - privateContainer.setText(invite != null ? invite.link : LocaleController.getString("Loading", R.string.Loading), false); + permanentLinkView.setLink(invite != null ? invite.link : null); })); } @@ -785,7 +806,7 @@ private void updatePrivatePublic() { publicContainer.setVisibility(isPrivate ? View.GONE : View.VISIBLE); privateContainer.setVisibility(isPrivate ? View.VISIBLE : View.GONE); linkContainer.setPadding(0, 0, 0, isPrivate ? 0 : AndroidUtilities.dp(7)); - privateContainer.setText(invite != null ? invite.link : LocaleController.getString("Loading", R.string.Loading), false); + permanentLinkView.setLink(invite != null ? invite.link : null); checkTextView.setVisibility(!isPrivate && checkTextView.length() != 0 ? View.VISIBLE : View.GONE); } radioButtonCell1.setChecked(!isPrivate, true); @@ -917,7 +938,7 @@ public void saveSelfArgs(Bundle args) { } if (nameTextView != null) { String text = nameTextView.getText().toString(); - if (text != null && text.length() != 0) { + if (text.length() != 0) { args.putString("nameTextView", text); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index 8fedbb7dc5d..b85412381af 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -172,9 +172,11 @@ import org.telegram.ui.Components.ChatAvatarContainer; import org.telegram.ui.Components.ChatBigEmptyView; import org.telegram.ui.Components.ChatGreetingsView; +import org.telegram.ui.Components.ChecksHintView; import org.telegram.ui.Components.ClippingImageView; import org.telegram.ui.Components.CombinedDrawable; import org.telegram.ui.Components.CorrectlyMeasuringTextView; +import org.telegram.ui.Components.CounterView; import org.telegram.ui.Components.CubicBezierInterpolator; import org.telegram.ui.Components.EditTextBoldCursor; import org.telegram.ui.Components.EditTextCaption; @@ -184,7 +186,9 @@ import org.telegram.ui.Components.FireworksOverlay; import org.telegram.ui.Components.FragmentContextView; import org.telegram.ui.Components.HintView; +import org.telegram.ui.Components.ImportingAlert; import org.telegram.ui.Components.InstantCameraView; +import org.telegram.ui.Components.InviteMembersBottomSheet; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.MessageBackgroundDrawable; import org.telegram.ui.Components.NumberTextView; @@ -287,7 +291,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not private FrameLayout pagedownButton; private ImageView pagedownButtonImage; private boolean pagedownButtonShowedByScroll; - private SimpleTextView pagedownButtonCounter; + private CounterView pagedownButtonCounter; private FrameLayout mentiondownButton; private SimpleTextView mentiondownButtonCounter; private ImageView mentiondownButtonImage; @@ -326,6 +330,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not private TextView voiceHintTextView; private HintView noSoundHintView; private HintView forwardHintView; + private ChecksHintView checksHintView; private Runnable voiceHintHideRunnable; private AnimatorSet voiceHintAnimation; private View emojiButtonRed; @@ -636,6 +641,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not private int distanceToPeer; + private boolean openImport; + private float chatListViewPaddingTop; private int chatListViewPaddingVisibleOffset; @@ -645,7 +652,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not private float topChatPanelViewOffset; private float pinnedMessageEnterOffset; private float topViewOffset; - protected TLRPC.Document preloadedGreetingsSticker; + private TLRPC.Document preloadedGreetingsSticker; + private boolean forceHistoryEmpty; private float bottomPanelTranslationY; private boolean invalidateChatListViewTopPadding; private long activityResumeTime; @@ -667,7 +675,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not NotificationCenter.didUpdateConnectionState, NotificationCenter.updateInterfaces, NotificationCenter.closeChats, - NotificationCenter.contactsDidLoad, + // NotificationCenter.contactsDidLoad, NotificationCenter.chatInfoCantLoad, NotificationCenter.userInfoDidLoad, NotificationCenter.pinnedInfoDidLoad, @@ -700,7 +708,6 @@ public boolean needPostpone(int id, int currentAccount, Object[] args) { private int fixedKeyboardHeight = -1; private boolean invalidateMessagesVisiblePart; private boolean scrollByTouch; - private ChatActionCell infoTopView1; public float getChatListViewPadding() { return chatListViewPaddingTop; @@ -1290,6 +1297,7 @@ public boolean onFragmentCreate() { getNotificationCenter().addObserver(this, NotificationCenter.videoLoadingStateChanged); getNotificationCenter().addObserver(this, NotificationCenter.scheduledMessagesUpdated); getNotificationCenter().addObserver(this, NotificationCenter.diceStickersDidLoad); + getNotificationCenter().addObserver(this, NotificationCenter.dialogDeleted); super.onFragmentCreate(); @@ -1309,7 +1317,7 @@ public boolean onFragmentCreate() { int loadIndex = lastLoadIndex++; waitingForLoad.add(loadIndex); getNotificationCenter().postNotificationName(NotificationCenter.messagesDidLoad, dialog_id, messageObjects.size(), messageObjects, false, 0, last_message_id, 0, 0, 2, true, classGuid, loadIndex, pinnedMessageIds.get(0), 0, MODE_PINNED); - } else { + } else if (!forceHistoryEmpty) { loading = true; } if (isThreadChat()) { @@ -1363,7 +1371,12 @@ public boolean onFragmentCreate() { loadInfo = userInfo == null; } - if (chatMode != MODE_PINNED) { + if (forceHistoryEmpty) { + endReached[0] = endReached[1] = true; + forwardEndReached[0] = forwardEndReached[1] = true; + firstLoading = false; + } + if (chatMode != MODE_PINNED && !forceHistoryEmpty) { waitingForLoad.add(lastLoadIndex); if (startLoadFromMessageId != 0 && (!isThreadChat() || startLoadFromMessageId == highlightMessageId)) { startLoadFromMessageIdSaved = startLoadFromMessageId; @@ -1569,6 +1582,7 @@ public void onFragmentDestroy() { getNotificationCenter().removeObserver(this, NotificationCenter.videoLoadingStateChanged); getNotificationCenter().removeObserver(this, NotificationCenter.scheduledMessagesUpdated); getNotificationCenter().removeObserver(this, NotificationCenter.diceStickersDidLoad); + getNotificationCenter().removeObserver(this, NotificationCenter.dialogDeleted); if (currentEncryptedChat != null) { getNotificationCenter().removeObserver(this, NotificationCenter.didVerifyMessagesStickers); } @@ -1636,6 +1650,7 @@ public View createView(Context context) { mediaBanTooltip = null; noSoundHintView = null; forwardHintView = null; + checksHintView = null; textSelectionHint = null; emojiButtonRed = null; gifHintTextView = null; @@ -1756,7 +1771,7 @@ public void onItemClick(final int id) { } final boolean isChat = (int) dialog_id < 0 && (int) (dialog_id >> 32) != 1; - AlertsCreator.createClearOrDeleteDialogAlert(ChatActivity.this, id == clear_history, currentChat, currentUser, currentEncryptedChat != null, (param) -> { + AlertsCreator.createClearOrDeleteDialogAlert(ChatActivity.this, id == clear_history, currentChat, currentUser, currentEncryptedChat != null, true, (param) -> { if (id == clear_history && ChatObject.isChannel(currentChat) && (!currentChat.megagroup || !TextUtils.isEmpty(currentChat.username))) { getMessagesController().deleteDialog(dialog_id, 2, param); } else { @@ -2065,6 +2080,7 @@ public boolean forceShowClear() { } editTextItem = menu.addItem(0, R.drawable.ic_ab_other); + editTextItem.setContentDescription(LocaleController.getString("AccDescrMoreOptions", R.string.AccDescrMoreOptions)); editTextItem.setTag(null); editTextItem.setVisibility(View.GONE); @@ -2142,6 +2158,7 @@ public boolean forceShowClear() { if (chatMode == 0 && !isThreadChat()) { attachItem = menu.addItem(chat_menu_attach, R.drawable.ic_ab_other).setOverrideMenuClick(true).setAllowCloseAnimation(false); + attachItem.setContentDescription(LocaleController.getString("AccDescrAttachButton", R.string.AccDescrAttachButton)); attachItem.setVisibility(View.GONE); } @@ -2236,6 +2253,7 @@ protected void onPanTranslationUpdate(float y, float progress, boolean keyboardV } chatListView.setItemAnimator(null); chatListView.invalidate(); + updateBulletinLayout(); } @Override @@ -2338,7 +2356,7 @@ protected boolean drawChild(Canvas canvas, View child, long drawingTime) { if (scrimView != null && (child == pagedownButton || child == mentiondownButton || child == floatingDateView || child == fireworksOverlay)) { return false; } - if (child == fragmentContextView && fragmentContextView.getCurrentStyle() == 3) { + if (child == fragmentContextView && fragmentContextView.isCallStyle()) { return true; } if (getTag(BlurBehindDrawable.TAG_DRAWING_AS_BACKGROUND) != null ) { @@ -2440,7 +2458,7 @@ protected void dispatchDraw(Canvas canvas) { updateMessagesVisiblePart(false); } super.dispatchDraw(canvas); - if (fragmentContextView != null && fragmentContextView.getCurrentStyle() == 3) { + if (fragmentContextView != null && fragmentContextView.isCallStyle()) { canvas.save(); canvas.translate(fragmentContextView.getX(), fragmentContextView.getY()); fragmentContextView.setDrawOverlay(true); @@ -2764,6 +2782,8 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { AndroidUtilities.runOnUIThread(() -> chatLayoutManager.scrollToPositionWithOffset(scrollTo, scrollToOffsetOnRecreate)); scrollToPositionOnRecreate = -1; } + + updateBulletinLayout(); } @Override @@ -2843,7 +2863,7 @@ protected void onLayout(boolean changed, int l, int t, int r, int b) { if (child == blurredView) { childTop = 0; - } else if (child instanceof HintView) { + } else if (child instanceof HintView || child instanceof ChecksHintView) { childTop = 0; } else if (child == mentionContainer) { childTop -= chatActivityEnterView.getMeasuredHeight() - AndroidUtilities.dp(2); @@ -2942,7 +2962,7 @@ public void setPadding(int left, int top, int right, int bottom) { emptyViewContainer.setOnTouchListener((v, event) -> true); int distance = getArguments().getInt("nearby_distance", -1); - if (distance >= 0 && currentUser != null) { + if ((distance >= 0 || preloadedGreetingsSticker != null) && currentUser != null) { greetingsViewContainer = new ChatGreetingsView(context, currentUser, distance, preloadedGreetingsSticker); greetingsViewContainer.setListener((sticker) -> { animatingDocuments.put(sticker, 0); @@ -3040,7 +3060,11 @@ public void requestLayout() { public void setTranslationY(float translationY) { super.setTranslationY(translationY); if (emptyViewContainer != null) { - emptyViewContainer.setTranslationY(translationY / 1.7f); + if (chatActivityEnterView != null && chatActivityEnterView.pannelAniamationInProgress()) { + emptyViewContainer.setTranslationY(translationY / 2f); + } else { + emptyViewContainer.setTranslationY(translationY / 1.7f); + } } invalidateChatListViewTopPadding(); invalidateMessagesVisiblePart(); @@ -3263,7 +3287,7 @@ private void processTouchEvent(MotionEvent e) { @Override public boolean onTouchEvent(MotionEvent e) { textSelectionHelper.checkSelectionCancel(e); - if (e != null && e.getAction() == MotionEvent.ACTION_DOWN) { + if (e.getAction() == MotionEvent.ACTION_DOWN) { scrollByTouch = true; } if (isFastScrollAnimationRunning()) { @@ -4570,10 +4594,19 @@ protected boolean drawChild(Canvas canvas, View child, long drawingTime) { canvas.save(); canvas.clipRect(0, 0, getMeasuredWidth(), AndroidUtilities.dp(48)); } - boolean result = super.drawChild(canvas, child, drawingTime); - if (child == pinnedLineView) { + boolean result; + if (child == pinnedMessageTextView[0] || child == pinnedMessageTextView[1]) { + canvas.save(); + canvas.clipRect(0,0,getMeasuredWidth() - AndroidUtilities.dp(38),getMeasuredHeight()); + result = super.drawChild(canvas, child, drawingTime); canvas.restore(); + } else { + result = super.drawChild(canvas, child, drawingTime); + if (child == pinnedLineView) { + canvas.restore(); + } } + return result; } }; @@ -4778,6 +4811,7 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } + @Override public void requestLayout() { if (ignoreLayout) { @@ -4805,7 +4839,7 @@ public void requestLayout() { reportSpamButton.setSingleLine(true); reportSpamButton.setMaxLines(1); reportSpamButton.setGravity(Gravity.CENTER); - topChatPanelView.addView(reportSpamButton, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.LEFT | Gravity.TOP, 0, 0, 0, AndroidUtilities.dp(1))); + topChatPanelView.addView(reportSpamButton, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.LEFT | Gravity.TOP, 0, 0, 0, 1)); reportSpamButton.setOnClickListener(v2 -> AlertsCreator.showBlockReportSpamAlert(ChatActivity.this, dialog_id, currentUser, currentChat, currentEncryptedChat, reportSpamButton.getTag(R.id.object_tag) != null, chatInfo, param -> { if (param == 0) { updateTopPanel(true); @@ -4824,9 +4858,9 @@ public void requestLayout() { addToContactsButton.setPadding(AndroidUtilities.dp(4), 0, AndroidUtilities.dp(4), 0); addToContactsButton.setGravity(Gravity.CENTER); if (Build.VERSION.SDK_INT >= 21) { - addToContactsButton.setBackground(Theme.createSelectorDrawable(Theme.getColor(Theme.key_chat_addContact) & 0x19ffffff, 5)); + addToContactsButton.setBackground(Theme.createSelectorDrawable(Theme.getColor(Theme.key_chat_addContact) & 0x19ffffff, 2)); } - topChatPanelView.addView(addToContactsButton, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.LEFT | Gravity.TOP, 0, 0, 0, AndroidUtilities.dp(1))); + topChatPanelView.addView(addToContactsButton, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.LEFT | Gravity.TOP, 0, 0, 0, 1)); addToContactsButton.setOnClickListener(v -> { if (addToContactsButtonArchive) { getMessagesController().addDialogToFolder(dialog_id, 0, 0, 0); @@ -4839,6 +4873,25 @@ public void requestLayout() { editor.commit(); updateTopPanel(false); getNotificationsController().clearDialogNotificationsSettings(dialog_id); + } else if (addToContactsButton.getTag() != null && (Integer) addToContactsButton.getTag() == 4) { + if (chatInfo != null && chatInfo.participants != null) { + SparseArray users = new SparseArray<>(); + for (int a = 0; a < chatInfo.participants.participants.size(); a++) { + users.put(chatInfo.participants.participants.get(a).user_id, null); + } + int chatId = chatInfo.id; + InviteMembersBottomSheet bottomSheet = new InviteMembersBottomSheet(context, currentAccount, users, chatInfo.id, ChatActivity.this); + bottomSheet.setDelegate((users1, fwdCount) -> { + for (int a = 0, N = users1.size(); a < N; a++) { + TLRPC.User user = users1.get(a); + getMessagesController().addUserToChat(chatId, user, fwdCount, null, ChatActivity.this, null); + } + getMessagesController().hidePeerSettingsBar(dialog_id, currentUser, currentChat); + updateTopPanel(true); + updateInfoTopView(true); + }); + bottomSheet.show(); + } } else if (addToContactsButton.getTag() != null) { shareMyContact(1, null); } else { @@ -4867,6 +4920,7 @@ public void requestLayout() { } getMessagesController().hidePeerSettingsBar(did, currentUser, currentChat); updateTopPanel(true); + updateInfoTopView(true); }); alertView = new FrameLayout(context); @@ -4895,7 +4949,7 @@ public void requestLayout() { pagedownButton = new FrameLayout(context); pagedownButton.setVisibility(View.INVISIBLE); - contentView.addView(pagedownButton, LayoutHelper.createFrame(66, 59, Gravity.RIGHT | Gravity.BOTTOM, 0, 0, -3, 5)); + contentView.addView(pagedownButton, LayoutHelper.createFrame(66, 61, Gravity.RIGHT | Gravity.BOTTOM, 0, 0, -3, 5)); pagedownButton.setOnClickListener(view -> { wasManualScroll = true; textSelectionHelper.cancelTextSelectionRunnable(); @@ -4914,7 +4968,7 @@ public void requestLayout() { mentiondownButton = new FrameLayout(context); mentiondownButton.setVisibility(View.INVISIBLE); - contentView.addView(mentiondownButton, LayoutHelper.createFrame(46, 59, Gravity.RIGHT | Gravity.BOTTOM, 0, 0, 7, 5)); + contentView.addView(mentiondownButton, LayoutHelper.createFrame(46, 61, Gravity.RIGHT | Gravity.BOTTOM, 0, 0, 7, 5)); mentiondownButton.setOnClickListener(new View.OnClickListener() { private void loadLastUnreadMention() { @@ -5524,16 +5578,9 @@ public void getOutline(View view, Outline outline) { pagedownButton.addView(pagedownButtonImage, LayoutHelper.createFrame(46, 46, Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM)); pagedownButton.setContentDescription(LocaleController.getString("AccDescrPageDown", R.string.AccDescrPageDown)); - pagedownButtonCounter = new SimpleTextView(context); - pagedownButtonCounter.setVisibility(View.INVISIBLE); - pagedownButtonCounter.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); - pagedownButtonCounter.setTextSize(13); - pagedownButtonCounter.setTextColor(Theme.getColor(Theme.key_chat_goDownButtonCounter)); - pagedownButtonCounter.setGravity(Gravity.CENTER); - pagedownButtonCounter.setBackgroundDrawable(Theme.createRoundRectDrawable(AndroidUtilities.dp(11.5f), Theme.getColor(Theme.key_chat_goDownButtonCounterBackground))); - pagedownButtonCounter.setMinWidth(AndroidUtilities.dp(23)); - pagedownButtonCounter.setPadding(AndroidUtilities.dp(8), AndroidUtilities.dp(1), AndroidUtilities.dp(8), 0); - pagedownButton.addView(pagedownButtonCounter, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 23, Gravity.TOP | Gravity.LEFT)); + pagedownButtonCounter = new CounterView(context); + pagedownButtonCounter.setReverse(true); + pagedownButton.addView(pagedownButtonCounter, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 28, Gravity.TOP | Gravity.LEFT)); mentiondownButtonImage = new ImageView(context); mentiondownButtonImage.setImageResource(R.drawable.mentionbutton); @@ -5573,7 +5620,12 @@ public void getOutline(View view, Outline outline) { mentiondownButton.setContentDescription(LocaleController.getString("AccDescrMentionDown", R.string.AccDescrMentionDown)); contentView.addView(fragmentLocationContextView = new FragmentContextView(context, this, true), LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 38, Gravity.TOP | Gravity.LEFT, 0, -36, 0, 0)); - contentView.addView(fragmentContextView = new FragmentContextView(context, this, false), LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 38, Gravity.TOP | Gravity.LEFT, 0, -36, 0, 0)); + contentView.addView(fragmentContextView = new FragmentContextView(context, this, false) { + @Override + protected void playbackSpeedChanged(boolean enabled) { + undoView.showWithAction(0, enabled ? UndoView.ACTION_PLAYBACK_SPEED_ENABLED : UndoView.ACTION_PLAYBACK_SPEED_DISABLED, null); + } + }, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 38, Gravity.TOP | Gravity.LEFT, 0, -36, 0, 0)); fragmentContextView.setAdditionalContextView(fragmentLocationContextView); fragmentLocationContextView.setAdditionalContextView(fragmentContextView); @@ -6114,14 +6166,15 @@ public void bottomPanelTranslationYChanged(float translation) { if (pagedownButton != null) { pagedownButton.setTranslationY(translation); - } - if (mentiondownButton != null) { - mentiondownButton.setTranslationY(pagedownButton.getVisibility() != View.VISIBLE ? translation : translation - AndroidUtilities.dp(72)); + if (mentiondownButton != null) { + mentiondownButton.setTranslationY(pagedownButton.getVisibility() != View.VISIBLE ? translation : translation - AndroidUtilities.dp(72)); + } } invalidateChatListViewTopPadding(); invalidateMessagesVisiblePart(); updateTextureViewPosition(false); contentView.invalidate(); + updateBulletinLayout(); } @Override @@ -6237,7 +6290,7 @@ public void setVisibility(int visibility) { DialogsActivity fragment = new DialogsActivity(args); fragment.setDelegate(ChatActivity.this); presentFragment(fragment); - } else if (replyingMessageObject != null) { + } else if (replyingMessageObject != null && (!isThreadChat() || replyingMessageObject.getId() != threadMessageId)) { scrollToMessageId(replyingMessageObject.getId(), 0, true, 0, true, 0); } else if (editingMessageObject != null) { if (editingMessageObject.canEditMedia() && editingMessageObjectReqId == 0) { @@ -6645,7 +6698,7 @@ public void onDraw(Canvas canvas) { toggleMute(true); } } else { - AlertsCreator.createClearOrDeleteDialogAlert(ChatActivity.this, false, currentChat, currentUser, currentEncryptedChat != null, (param) -> { + AlertsCreator.createClearOrDeleteDialogAlert(ChatActivity.this, false, currentChat, currentUser, currentEncryptedChat != null, true, (param) -> { getNotificationCenter().removeObserver(ChatActivity.this, NotificationCenter.closeChats); getNotificationCenter().postNotificationName(NotificationCenter.closeChats); finishFragment(); @@ -6809,6 +6862,13 @@ public void onTextCopied() { return fragmentView; } + private void updateBulletinLayout() { + Bulletin bulletin = Bulletin.getVisibleBulletin(); + if (bulletin != null && bulletinDelegate != null) { + bulletin.updatePosition(); + } + } + private void searchUserMessages(TLRPC.User user, TLRPC.Chat chat) { searchingUserMessages = user; searchingChatMessages = chat; @@ -8153,6 +8213,9 @@ private void hideHints(boolean scroll) { if (pollHintView != null) { pollHintView.hide(); } + if (checksHintView != null) { + checksHintView.hide(); + } } private void showSlowModeHint(View view, boolean show, CharSequence time) { @@ -8296,6 +8359,47 @@ private void showNoSoundHint() { } } + private void checkChecksHint() { + if (getMessagesController().pendingSuggestions.contains("NEWCOMER_TICKS")) { + AndroidUtilities.runOnUIThread(this::showChecksHint, 1000); + } + } + + private void showChecksHint() { + if (scrollingChatListView || chatListView == null || getParentActivity() == null || fragmentView == null || checksHintView != null && checksHintView.getTag() != null) { + return; + } + + if (checksHintView == null) { + SizeNotifierFrameLayout frameLayout = (SizeNotifierFrameLayout) fragmentView; + int index = frameLayout.indexOfChild(chatActivityEnterView); + if (index == -1) { + return; + } + checksHintView = new ChecksHintView(getParentActivity()); + frameLayout.addView(checksHintView, index + 1, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 10, 0, 10, 0)); + checksHintView.setAlpha(0.0f); + checksHintView.setVisibility(View.INVISIBLE); + } + + int count = chatListView.getChildCount(); + for (int a = 0; a < count; a++) { + View child = chatListView.getChildAt(a); + if (!(child instanceof ChatMessageCell)) { + continue; + } + ChatMessageCell messageCell = (ChatMessageCell) child; + MessageObject messageObject = messageCell.getMessageObject(); + if (messageObject == null || !messageObject.isOutOwner() || !messageObject.isSent()) { + continue; + } + if (checksHintView.showForMessageCell(messageCell, true)) { + getMessagesController().removeSuggestion("NEWCOMER_TICKS"); + break; + } + } + } + private void showForwardHint(ChatMessageCell cell) { if (scrollingChatListView || chatListView == null || getParentActivity() == null || fragmentView == null) { return; @@ -8936,7 +9040,7 @@ public boolean dismissDialogOnPause(Dialog dialog) { } private void searchLinks(final CharSequence charSequence, final boolean force) { - if (currentEncryptedChat != null && (getMessagesController().secretWebpagePreview == 0 || AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) < 46)) { + if (currentEncryptedChat != null && (getMessagesController().secretWebpagePreview == 0 || AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) < 46) || editingMessageObject != null && !editingMessageObject.isWebpage()) { return; } if (force && foundWebPage != null) { @@ -9105,6 +9209,14 @@ private void forwardMessages(ArrayList arrayList, boolean fromMyN } } + public boolean shouldShowImport() { + return openImport; + } + + public void setOpenImport() { + openImport = true; + } + private void checkBotKeyboard() { if (chatActivityEnterView == null || botButtons == null || userBlocked) { return; @@ -10091,7 +10203,7 @@ public void updateMessagesVisiblePart(boolean inLayout) { floatingDateView.setTranslationY(chatListView.getTranslationY() + chatListViewPaddingTop + floatingDateViewOffset - AndroidUtilities.dp(4)); } invalidateChatListViewTopPadding(); - if (!firstLoading && !paused && !inPreviewMode && (fragmentOpened || inBubbleMode) && chatMode == 0 && !getMessagesController().ignoreSetOnline) { + if (!firstLoading && !paused && !inPreviewMode && chatMode == 0 && !getMessagesController().ignoreSetOnline) { int scheduledRead = 0; if ((maxPositiveUnreadId != Integer.MIN_VALUE || maxNegativeUnreadId != Integer.MAX_VALUE)) { int counterDecrement = 0; @@ -10155,26 +10267,14 @@ public void updateMessagesVisiblePart(boolean inLayout) { private void inlineUpdate1() { if (prevSetUnreadCount != newUnreadMessageCount) { prevSetUnreadCount = newUnreadMessageCount; - pagedownButtonCounter.setText(String.format("%d", newUnreadMessageCount)); - } - if (newUnreadMessageCount <= 0) { - if (pagedownButtonCounter.getVisibility() != View.INVISIBLE) { - pagedownButtonCounter.setVisibility(View.INVISIBLE); - } - } else { - if (pagedownButtonCounter.getVisibility() != View.VISIBLE) { - pagedownButtonCounter.setVisibility(View.VISIBLE); - } + pagedownButtonCounter.setCount(newUnreadMessageCount, openAnimationEnded); } } private void inlineUpdate2() { if (prevSetUnreadCount != newUnreadMessageCount) { prevSetUnreadCount = newUnreadMessageCount; - pagedownButtonCounter.setText(String.format("%d", newUnreadMessageCount)); - } - if (pagedownButtonCounter.getVisibility() != View.INVISIBLE) { - pagedownButtonCounter.setVisibility(View.INVISIBLE); + pagedownButtonCounter.setCount(newUnreadMessageCount, true); } } @@ -11239,7 +11339,7 @@ private void updateTitle() { } else if (chatMode == MODE_PINNED) { avatarContainer.setTitle(LocaleController.formatPluralString("PinnedMessagesCount", getPinnedMessagesCount())); } else if (currentChat != null) { - avatarContainer.setTitle(currentChat.title, currentChat.scam); + avatarContainer.setTitle(currentChat.title, currentChat.scam, currentChat.fake); } else if (currentUser != null) { if (currentUser.self) { avatarContainer.setTitle(LocaleController.getString("SavedMessages", R.string.SavedMessages)); @@ -11247,10 +11347,10 @@ private void updateTitle() { if (!TextUtils.isEmpty(currentUser.phone)) { avatarContainer.setTitle(PhoneFormat.getInstance().format("+" + currentUser.phone)); } else { - avatarContainer.setTitle(UserObject.getUserName(currentUser), currentUser.scam); + avatarContainer.setTitle(UserObject.getUserName(currentUser), currentUser.scam, currentUser.fake); } } else { - avatarContainer.setTitle(UserObject.getUserName(currentUser), currentUser.scam); + avatarContainer.setTitle(UserObject.getUserName(currentUser), currentUser.scam, currentUser.fake); } } setParentActivityTitle(avatarContainer.getTitleTextView().getText()); @@ -12362,9 +12462,8 @@ public void didReceivedNotification(int id, int account, final Object... args) { updatePagedownButtonVisibility(true); if (unread_to_load != 0) { if (pagedownButtonCounter != null) { - pagedownButtonCounter.setVisibility(View.VISIBLE); if (prevSetUnreadCount != newUnreadMessageCount) { - pagedownButtonCounter.setText(String.format("%d", newUnreadMessageCount = unread_to_load)); + pagedownButtonCounter.setCount(newUnreadMessageCount = unread_to_load, openAnimationEnded); prevSetUnreadCount = newUnreadMessageCount; } } @@ -12439,7 +12538,13 @@ public void didReceivedNotification(int id, int account, final Object... args) { if (first) { if (chatListView != null) { - chatListView.setEmptyView(emptyViewContainer); + if (!fragmentBeginToShow) { + chatListView.setAnimateEmptyView(false, 1); + chatListView.setEmptyView(emptyViewContainer); + chatListView.setAnimateEmptyView(true, 1); + } else { + chatListView.setEmptyView(emptyViewContainer); + } } } } else { @@ -12818,16 +12923,7 @@ public void didReceivedNotification(int id, int account, final Object... args) { if (pagedownButtonCounter != null) { if (prevSetUnreadCount != newUnreadMessageCount) { prevSetUnreadCount = newUnreadMessageCount; - pagedownButtonCounter.setText(String.format("%d", newUnreadMessageCount)); - } - if (newUnreadMessageCount <= 0) { - if (pagedownButtonCounter.getVisibility() != View.INVISIBLE) { - pagedownButtonCounter.setVisibility(View.INVISIBLE); - } - } else { - if (pagedownButtonCounter.getVisibility() != View.VISIBLE) { - pagedownButtonCounter.setVisibility(View.VISIBLE); - } + pagedownButtonCounter.setCount(newUnreadMessageCount, true); } } } @@ -12950,6 +13046,7 @@ public void didReceivedNotification(int id, int account, final Object... args) { } } if (obj != null) { + checkChecksHint(); if (obj.shouldRemoveVideoEditedInfo) { obj.videoEditedInfo = null; obj.shouldRemoveVideoEditedInfo = false; @@ -13462,7 +13559,7 @@ public void didReceivedNotification(int id, int account, final Object... args) { MessageObject playing = cell.getMessageObject(); if (playing != null && playing.getId() == mid) { MessageObject player = MediaController.getInstance().getPlayingMessageObject(); - if (player != null) { + if (player != null && !cell.getSeekBar().isDragging()) { playing.audioProgress = player.audioProgress; playing.audioProgressSec = player.audioProgressSec; playing.audioPlayerDuration = player.audioPlayerDuration; @@ -14210,6 +14307,15 @@ public void didReceivedNotification(int id, int account, final Object... args) { cell.setCurrentDiceValue(true); } } + } else if (id == NotificationCenter.dialogDeleted) { + long did = (Long) args[0]; + if (did == dialog_id) { + if (parentLayout != null && parentLayout.fragmentsStack.get(parentLayout.fragmentsStack.size() - 1) == this) { + finishFragment(); + } else { + removeSelfFromStack(); + } + } } } @@ -14611,7 +14717,7 @@ private void processNewMessages(ArrayList arr) { pagedownButtonCounter.setVisibility(View.VISIBLE); if (prevSetUnreadCount != newUnreadMessageCount) { prevSetUnreadCount = newUnreadMessageCount; - pagedownButtonCounter.setText(String.format("%d", newUnreadMessageCount)); + pagedownButtonCounter.setCount(newUnreadMessageCount, true); } } if (newMentionsCount != 0 && mentiondownButtonCounter != null) { @@ -14937,10 +15043,9 @@ private void processNewMessages(ArrayList arr) { } } else { if (newUnreadMessageCount != 0 && pagedownButtonCounter != null) { - pagedownButtonCounter.setVisibility(View.VISIBLE); if (prevSetUnreadCount != newUnreadMessageCount) { prevSetUnreadCount = newUnreadMessageCount; - pagedownButtonCounter.setText(String.format("%d", newUnreadMessageCount)); + pagedownButtonCounter.setCount(newUnreadMessageCount, true); } } canShowPagedownButton = true; @@ -15220,9 +15325,6 @@ private void processDeletedMessages(ArrayList markAsDeletedMessages, in createUnreadMessageAfterId = 0; removeMessageObject(unreadMessageObject); unreadMessageObject = null; - if (pagedownButtonCounter != null) { - pagedownButtonCounter.setVisibility(View.INVISIBLE); - } } if (updateScheduled) { updateScheduledInterface(true); @@ -16701,6 +16803,11 @@ private void updateTopPanel(boolean animated) { boolean showAdd = preferences.getBoolean("dialog_bar_add" + did, false); boolean showArchive = preferences.getBoolean("dialog_bar_archived" + dialog_id, false); boolean showGeo = preferences.getBoolean("dialog_bar_location" + did, false); + boolean showAddMembersToGroup = preferences.getBoolean("dialog_bar_invite" + did, false); + + if (showAddMembersToGroup) { + show = true; + } if (showReport || showBlock || showGeo) { reportSpamButton.setVisibility(View.VISIBLE); @@ -16710,7 +16817,20 @@ private void updateTopPanel(boolean animated) { addToContactsButtonArchive = false; TLRPC.User user = currentUser != null ? getMessagesController().getUser(currentUser.id) : null; - if (user != null) { + if (showAddMembersToGroup) { + String str = LocaleController.getString("GroupAddMembers", R.string.GroupAddMembers); + if (str != null) { + str = str.toUpperCase(); + } + addToContactsButton.setVisibility(View.VISIBLE); + addToContactsButton.setText(str); + addToContactsButton.setTag(4); + addToContactsButton.setTextColor(Theme.getColor(Theme.key_chat_addContact)); + if (Build.VERSION.SDK_INT >= 21) { + Theme.setSelectorDrawableColor(addToContactsButton.getBackground(), Theme.getColor(Theme.key_chat_addContact) & 0x19ffffff, true); + } + reportSpamButton.setTag(Theme.key_chat_addContact); + } else if (user != null) { if (UserObject.isReplyUser(user)) { addToContactsButton.setVisibility(View.GONE); } else if (!user.contact && !user.self && showAdd) { @@ -16974,6 +17094,8 @@ protected void setInPreviewMode(boolean value) { updateSecretStatus(); } + Bulletin.Delegate bulletinDelegate; + @Override public void onResume() { super.onResume(); @@ -16982,6 +17104,16 @@ public void onResume() { blurredView.setBackground(null); } activityResumeTime = System.currentTimeMillis(); + if (openImport && getSendMessagesHelper().getImportingHistory(dialog_id) != null) { + ImportingAlert alert = new ImportingAlert(getParentActivity(), this); + alert.setOnHideListener(dialog -> { + if (fragmentContextView != null) { + fragmentContextView.checkImport(false); + } + }); + showDialog(alert); + openImport = false; + } AndroidUtilities.requestAdjustResize(getParentActivity(), classGuid); MediaController.getInstance().startRaiseToEarSensors(this); @@ -16992,20 +17124,26 @@ public void onResume() { if (contentView != null) { contentView.onResume(); } + checkChecksHint(); - Bulletin.addDelegate(this, new Bulletin.Delegate() { + Bulletin.addDelegate(this, bulletinDelegate = new Bulletin.Delegate() { @Override public int getBottomOffset() { - final int height; + int height; if (chatActivityEnterView != null && chatActivityEnterView.getVisibility() == View.VISIBLE) { - final EmojiView emojiView = chatActivityEnterView.getEmojiView(); - if (emojiView != null && emojiView.getVisibility() == View.VISIBLE) { - return 0; + if (contentView.getKeyboardHeight() < AndroidUtilities.dp(20) && chatActivityEnterView.isPopupShowing() || chatActivityEnterView.pannelAniamationInProgress()) { + height = chatActivityEnterView.getHeight() + chatActivityEnterView.getEmojiPadding(); + } else { + height = chatActivityEnterView.getHeight(); } - height = chatActivityEnterView.getHeight(); } else { height = AndroidUtilities.dp(51); } + if (chatActivityEnterView.pannelAniamationInProgress()) { + float translationY = bottomPanelTranslationY - chatActivityEnterView.getEmojiPadding(); + height += translationY; + } + height += contentPanTranslation; return height - AndroidUtilities.dp(1.5f); } }); @@ -18180,6 +18318,9 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { return; } processSelectedOption(options.get(i)); + scrimView = null; + contentView.invalidate(); + chatListView.invalidate(); if (scrimPopupWindow != null) { scrimPopupWindow.dismiss(); } @@ -18582,6 +18723,7 @@ private void processSelectedOption(int option) { AndroidUtilities.addToClipboard(getMessageContent(selectedObject, 0, false)); } } + undoView.showWithAction(0, UndoView.ACTION_TEXT_COPIED, null); break; } case 4: { @@ -19166,6 +19308,11 @@ public void didSelectDialogs(DialogsActivity fragment, ArrayList dids, Cha getSendMessagesHelper().sendMessage(fmessages, did, true, 0); } fragment.finishFragment(); + if (dids.size() == 1) { + undoView.showWithAction(dids.get(0), UndoView.ACTION_FWD_MESSAGES, fmessages.size()); + } else { + undoView.showWithAction(0, UndoView.ACTION_FWD_MESSAGES, fmessages.size(), dids.size(), null, null); + } } else { long did = dids.get(0); if (did != dialog_id || chatMode == MODE_PINNED) { @@ -20439,6 +20586,15 @@ public void dismissInternal() { fragmentView.requestLayout(); } } + + @Override + protected void onSend(LongSparseArray dids, int count) { + if (dids.size() == 1) { + undoView.showWithAction(dids.valueAt(0).id, UndoView.ACTION_FWD_MESSAGES, count); + } else { + undoView.showWithAction(0, UndoView.ACTION_FWD_MESSAGES, count, dids.size(), null, null); + } + } }); AndroidUtilities.setAdjustResizeToNothing(getParentActivity(), classGuid); fragmentView.requestLayout(); @@ -20462,6 +20618,11 @@ public void videoTimerReached() { showNoSoundHint(); } + @Override + public void didPressTime(ChatMessageCell cell) { + undoView.showWithAction(dialog_id, UndoView.ACTION_IMPORT_INFO, null); + } + @Override public void didPressChannelAvatar(ChatMessageCell cell, TLRPC.Chat chat, int postId, float touchX, float touchY) { if (chat == null) { @@ -20476,6 +20637,10 @@ public void didPressChannelAvatar(ChatMessageCell cell, TLRPC.Chat chat, int pos @Override public void didPressHiddenForward(ChatMessageCell cell) { + if (cell.getMessageObject().isImportedForward()) { + didPressTime(cell); + return; + } showForwardHint(cell); } @@ -21120,7 +21285,23 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { MessageObject nextMessage = messages.get(nextPosition - messagesStartRow); pinnedBottom = nextMessage.isOutOwner() == message.isOutOwner() && Math.abs(nextMessage.messageOwner.date - message.messageOwner.date) <= 5 * 60; if (pinnedBottom) { - if (currentChat != null) { + if (message.isImportedForward() || nextMessage.isImportedForward()) { + if (message.isImportedForward() && nextMessage.isImportedForward()) { + if (Math.abs(nextMessage.messageOwner.fwd_from.date - message.messageOwner.fwd_from.date) <= 5 * 60) { + if (nextMessage.messageOwner.fwd_from.from_name != null && message.messageOwner.fwd_from.from_name != null) { + pinnedBottom = nextMessage.messageOwner.fwd_from.from_name.equals(message.messageOwner.fwd_from.from_name); + } else if (nextMessage.messageOwner.fwd_from.from_id != null && message.messageOwner.fwd_from.from_id != null) { + pinnedBottom = MessageObject.getPeerId(nextMessage.messageOwner.fwd_from.from_id) == MessageObject.getPeerId(message.messageOwner.fwd_from.from_id); + } else { + pinnedBottom = false; + } + } else { + pinnedBottom = false; + } + } else { + pinnedBottom = false; + } + } else if (currentChat != null) { int fromId = nextMessage.getFromChatId(); pinnedBottom = fromId == message.getFromChatId(); if (!pinnedBottomByGroup && pinnedBottom && fromId < 0 && currentChat.megagroup) { @@ -21139,9 +21320,25 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { MessageObject prevMessage = messages.get(prevPosition - messagesStartRow); pinnedTop = !prevMessage.hasReactions() && !(prevMessage.messageOwner.reply_markup instanceof TLRPC.TL_replyInlineMarkup) && prevMessage.isOutOwner() == message.isOutOwner() && Math.abs(prevMessage.messageOwner.date - message.messageOwner.date) <= 5 * 60; if (pinnedTop) { - if (currentChat != null) { + if (message.isImportedForward() || prevMessage.isImportedForward()) { + if (message.isImportedForward() && prevMessage.isImportedForward()) { + if (Math.abs(message.messageOwner.fwd_from.date - prevMessage.messageOwner.fwd_from.date) <= 5 * 60) { + if (prevMessage.messageOwner.fwd_from.from_name != null && message.messageOwner.fwd_from.from_name != null) { + pinnedTop = prevMessage.messageOwner.fwd_from.from_name.equals(message.messageOwner.fwd_from.from_name); + } else if (prevMessage.messageOwner.fwd_from.from_id != null && message.messageOwner.fwd_from.from_id != null) { + pinnedTop = MessageObject.getPeerId(prevMessage.messageOwner.fwd_from.from_id) == MessageObject.getPeerId(message.messageOwner.fwd_from.from_id); + } else { + pinnedTop = false; + } + } else { + pinnedTop = false; + } + } else { + pinnedTop = false; + } + } else if (currentChat != null) { int fromId = prevMessage.getFromChatId(); - pinnedTop = fromId == message.getFromChatId(); + pinnedTop = fromId == message.getFromChatId() && !message.isImportedForward() && !prevMessage.isImportedForward(); if (!pinnedTopByGroup && pinnedTop && fromId < 0 && currentChat.megagroup) { pinnedTop = false; } @@ -21718,8 +21915,9 @@ private boolean openLinkInternally(String urlFinal, int fromMessageId) { return false; } - public void setPreloadedSticker(TLRPC.Document preloadedSticker) { + public void setPreloadedSticker(TLRPC.Document preloadedSticker, boolean historyEmpty) { preloadedGreetingsSticker = preloadedSticker; + forceHistoryEmpty = historyEmpty; } public class ChatScrollCallback extends RecyclerAnimationScrollHelper.AnimationCallback { @@ -22067,6 +22265,8 @@ public ArrayList getThemeDescriptions() { themeDescriptions.add(new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_pollHintDrawable[1]}, null, Theme.key_chat_outPreviewInstantText)); themeDescriptions.add(new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_psaHelpDrawable[0]}, null, Theme.key_chat_inViews)); themeDescriptions.add(new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, new Drawable[]{Theme.chat_psaHelpDrawable[1]}, null, Theme.key_chat_outViews)); + themeDescriptions.add(new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_shareBackground)); + themeDescriptions.add(new ThemeDescription(chatListView, 0, new Class[]{ChatMessageCell.class}, null, null, null, Theme.key_chat_shareBackgroundSelected)); themeDescriptions.add(new ThemeDescription(messagesSearchListView, 0, new Class[]{DialogCell.class}, null, Theme.avatarDrawables, null, Theme.key_avatar_text)); themeDescriptions.add(new ThemeDescription(messagesSearchListView, 0, new Class[]{DialogCell.class}, Theme.dialogs_countPaint, null, null, Theme.key_chats_unreadCounter)); @@ -22074,7 +22274,7 @@ public ArrayList getThemeDescriptions() { themeDescriptions.add(new ThemeDescription(messagesSearchListView, 0, new Class[]{DialogCell.class}, null, new Paint[]{Theme.dialogs_nameEncryptedPaint[0], Theme.dialogs_nameEncryptedPaint[1], Theme.dialogs_searchNameEncryptedPaint}, null, null, Theme.key_chats_secretName)); themeDescriptions.add(new ThemeDescription(messagesSearchListView, 0, new Class[]{DialogCell.class}, null, new Drawable[]{Theme.dialogs_lockDrawable}, null, Theme.key_chats_secretIcon)); themeDescriptions.add(new ThemeDescription(messagesSearchListView, 0, new Class[]{DialogCell.class}, null, new Drawable[]{Theme.dialogs_groupDrawable, Theme.dialogs_broadcastDrawable, Theme.dialogs_botDrawable}, null, Theme.key_chats_nameIcon)); - themeDescriptions.add(new ThemeDescription(messagesSearchListView, 0, new Class[]{DialogCell.class}, null, new Drawable[]{Theme.dialogs_scamDrawable}, null, Theme.key_chats_draft)); + themeDescriptions.add(new ThemeDescription(messagesSearchListView, 0, new Class[]{DialogCell.class}, null, new Drawable[]{Theme.dialogs_scamDrawable, Theme.dialogs_fakeDrawable}, null, Theme.key_chats_draft)); themeDescriptions.add(new ThemeDescription(messagesSearchListView, 0, new Class[]{DialogCell.class}, Theme.dialogs_messagePaint[1], null, null, Theme.key_chats_message_threeLines)); themeDescriptions.add(new ThemeDescription(messagesSearchListView, 0, new Class[]{DialogCell.class}, Theme.dialogs_messageNamePaint, null, null, Theme.key_chats_nameMessage_threeLines)); themeDescriptions.add(new ThemeDescription(null, 0, null, null, null, selectedBackgroundDelegate, Theme.key_chats_nameMessage)); @@ -22186,7 +22386,7 @@ public ArrayList getThemeDescriptions() { themeDescriptions.add(new ThemeDescription(fragmentView, ThemeDescription.FLAG_BACKGROUND | ThemeDescription.FLAG_CHECKTAG, new Class[]{FragmentContextView.class}, new String[]{"frameLayout"}, null, null, null, Theme.key_inappPlayerBackground)); themeDescriptions.add(new ThemeDescription(fragmentView, ThemeDescription.FLAG_IMAGECOLOR, new Class[]{FragmentContextView.class}, new String[]{"playButton"}, null, null, null, Theme.key_inappPlayerPlayPause)); themeDescriptions.add(new ThemeDescription(fragmentView, ThemeDescription.FLAG_TEXTCOLOR | ThemeDescription.FLAG_CHECKTAG, new Class[]{FragmentContextView.class}, new String[]{"titleTextView"}, null, null, null, Theme.key_inappPlayerTitle)); - themeDescriptions.add(new ThemeDescription(fragmentView, ThemeDescription.FLAG_TEXTCOLOR | ThemeDescription.FLAG_FASTSCROLL, new Class[]{FragmentContextView.class}, new String[]{"titleTextView"}, null, null, null, Theme.key_inappPlayerPerformer)); + themeDescriptions.add(new ThemeDescription(fragmentView, ThemeDescription.FLAG_TEXTCOLOR | ThemeDescription.FLAG_CHECKTAG, new Class[]{FragmentContextView.class}, new String[]{"titleTextView"}, null, null, null, Theme.key_inappPlayerPerformer)); themeDescriptions.add(new ThemeDescription(fragmentView, ThemeDescription.FLAG_TEXTCOLOR | ThemeDescription.FLAG_FASTSCROLL, new Class[]{FragmentContextView.class}, new String[]{"subtitleTextView"}, null, null, null, Theme.key_inappPlayerClose)); themeDescriptions.add(new ThemeDescription(fragmentView, ThemeDescription.FLAG_IMAGECOLOR, new Class[]{FragmentContextView.class}, new String[]{"closeButton"}, null, null, null, Theme.key_inappPlayerClose)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatEditActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatEditActivity.java index 5932bf31d2c..6b4b59ea3b5 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatEditActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatEditActivity.java @@ -44,7 +44,6 @@ import org.telegram.messenger.MessagesStorage; import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; -import org.telegram.messenger.UserConfig; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.ActionBarMenu; @@ -108,6 +107,7 @@ public class ChatEditActivity extends BaseFragment implements ImageUpdater.Image private LinearLayout infoContainer; private TextCell membersCell; + private TextCell inviteLinksCell; private TextCell adminCell; private TextCell blockCell; private TextCell logCell; @@ -209,9 +209,28 @@ public boolean onFragmentCreate() { signMessages = currentChat.signatures; NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.chatInfoDidLoad); NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.updateInterfaces); + + if (info != null) { + loadLinksCount(); + } return super.onFragmentCreate(); } + private void loadLinksCount() { +// TLRPC.TL_messages_getExportedChatInvites req = new TLRPC.TL_messages_getExportedChatInvites(); +// req.peer = getMessagesController().getInputPeer(-chatId); +// req.admin_id = getMessagesController().getInputUser(getUserConfig().getCurrentUser()); +// req.limit = 0; +// getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { +// if (error == null) { +// TLRPC.TL_messages_exportedChatInvites invites = (TLRPC.TL_messages_exportedChatInvites) response; +// info.invitesCount = invites.count; +// getMessagesStorage().saveChatLinksCount(chatId, info.invitesCount); +// updateFields(false); +// } +// })); + } + @Override public void onFragmentDestroy() { super.onFragmentDestroy(); @@ -555,7 +574,7 @@ protected void onDraw(Canvas canvas) { MessagesController.getInstance(currentAccount).changeChatAvatar(chatId, null, null, null, 0, null, null, null); showAvatarProgress(false, true); avatarImage.setImage(null, null, avatarDrawable, currentChat); - })); + }, null)); settingsContainer.addView(setAvatarCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); } @@ -753,6 +772,14 @@ public void afterTextChanged(Editable editable) { presentFragment(fragment); }); +// inviteLinksCell = new TextCell(context); +// inviteLinksCell.setBackgroundDrawable(Theme.getSelectorDrawable(false)); +// inviteLinksCell.setOnClickListener(v -> { +// ManageLinksActivity fragment = new ManageLinksActivity(chatId); +// fragment.setInfo(info, info.exported_invite); +// presentFragment(fragment); +// }); + adminCell = new TextCell(context); adminCell.setBackgroundDrawable(Theme.getSelectorDrawable(false)); adminCell.setOnClickListener(v -> { @@ -785,6 +812,7 @@ public void afterTextChanged(Editable editable) { if (!isChannel) { infoContainer.addView(blockCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); } + // infoContainer.addView(inviteLinksCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); infoContainer.addView(adminCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); infoContainer.addView(membersCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); if (isChannel) { @@ -832,20 +860,18 @@ public void afterTextChanged(Editable editable) { deleteCell.setBackgroundDrawable(Theme.getSelectorDrawable(false)); if (isChannel) { deleteCell.setText(LocaleController.getString("ChannelDelete", R.string.ChannelDelete), false); - } else if (currentChat.megagroup) { - deleteCell.setText(LocaleController.getString("DeleteMega", R.string.DeleteMega), false); } else { deleteCell.setText(LocaleController.getString("DeleteAndExitButton", R.string.DeleteAndExitButton), false); } deleteContainer.addView(deleteCell, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); - deleteCell.setOnClickListener(v -> AlertsCreator.createClearOrDeleteDialogAlert(ChatEditActivity.this, false, true, false, currentChat, null, false, (param) -> { + deleteCell.setOnClickListener(v -> AlertsCreator.createClearOrDeleteDialogAlert(ChatEditActivity.this, false, true, false, currentChat, null, false, true, (param) -> { if (AndroidUtilities.isTablet()) { - NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.closeChats, -(long) chatId); + getNotificationCenter().postNotificationName(NotificationCenter.closeChats, -(long) chatId); } else { - NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.closeChats); + getNotificationCenter().postNotificationName(NotificationCenter.closeChats); } - MessagesController.getInstance(currentAccount).deleteUserFromChat(chatId, MessagesController.getInstance(currentAccount).getUser(UserConfig.getInstance(currentAccount).getClientUserId()), info, true, false); finishFragment(); + getNotificationCenter().postNotificationName(NotificationCenter.needDeleteDialog, (long) -currentChat.id, null, currentChat, param); })); deleteInfoCell = new ShadowSectionCell(context); @@ -917,9 +943,13 @@ public void didReceivedNotification(int id, int account, Object... args) { if (info == null && descriptionTextView != null) { descriptionTextView.setText(chatFull.about); } + boolean infoWasEmpty = info == null; info = chatFull; historyHidden = !ChatObject.isChannel(currentChat) || info.hidden_prehistory; updateFields(false); + if (infoWasEmpty) { + loadLinksCount(); + } } } else if (id == NotificationCenter.updateInterfaces) { int mask = (Integer) args[0]; @@ -1324,6 +1354,11 @@ private void updateFields(boolean updateChat) { } adminCell.setTextAndIcon(LocaleController.getString("ChannelAdministrators", R.string.ChannelAdministrators), R.drawable.actions_addadmin, true); } +// if (info != null && info.invitesCount >= 0) { +// inviteLinksCell.setTextAndValueAndIcon(LocaleController.getString("InviteLinks", R.string.InviteLinks), Integer.toString(info.invitesCount), R.drawable.actions_link, true); +// } else { +// inviteLinksCell.setTextAndIcon(LocaleController.getString("InviteLinks", R.string.InviteLinks), R.drawable.actions_link, true); +// } } if (stickersCell != null && info != null) { @@ -1361,6 +1396,10 @@ public ArrayList getThemeDescriptions() { themeDescriptions.add(new ThemeDescription(adminCell, ThemeDescription.FLAG_SELECTOR, null, null, null, null, Theme.key_listSelector)); themeDescriptions.add(new ThemeDescription(adminCell, ThemeDescription.FLAG_TEXTCOLOR, new Class[]{TextCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); themeDescriptions.add(new ThemeDescription(adminCell, 0, new Class[]{TextCell.class}, new String[]{"imageView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayIcon)); +// themeDescriptions.add(new ThemeDescription(inviteLinksCell, ThemeDescription.FLAG_SELECTOR, null, null, null, null, Theme.key_listSelector)); +// themeDescriptions.add(new ThemeDescription(inviteLinksCell, ThemeDescription.FLAG_TEXTCOLOR, new Class[]{TextCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); +// themeDescriptions.add(new ThemeDescription(inviteLinksCell, 0, new Class[]{TextCell.class}, new String[]{"imageView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayIcon)); + themeDescriptions.add(new ThemeDescription(blockCell, ThemeDescription.FLAG_SELECTOR, null, null, null, null, Theme.key_listSelector)); themeDescriptions.add(new ThemeDescription(blockCell, ThemeDescription.FLAG_TEXTCOLOR, new Class[]{TextCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); themeDescriptions.add(new ThemeDescription(blockCell, 0, new Class[]{TextCell.class}, new String[]{"imageView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayIcon)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatEditTypeActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatEditTypeActivity.java index 80330fbeba7..8fd1eb5fd8a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatEditTypeActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatEditTypeActivity.java @@ -9,7 +9,6 @@ package org.telegram.ui; import android.content.Context; -import android.content.Intent; import android.graphics.Rect; import android.os.Vibrator; import android.text.Editable; @@ -24,9 +23,7 @@ import android.widget.ScrollView; import org.telegram.messenger.AndroidUtilities; -import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.ChatObject; -import org.telegram.messenger.FileLog; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MessagesController; import org.telegram.messenger.NotificationCenter; @@ -44,14 +41,16 @@ import org.telegram.ui.Cells.LoadingCell; import org.telegram.ui.Cells.RadioButtonCell; import org.telegram.ui.Cells.ShadowSectionCell; -import org.telegram.ui.Cells.TextBlockCell; +import org.telegram.ui.Cells.TextCell; import org.telegram.ui.Cells.TextInfoPrivacyCell; import org.telegram.ui.Cells.TextSettingsCell; -import org.telegram.ui.Components.BulletinFactory; import org.telegram.ui.Components.EditTextBoldCursor; +import org.telegram.ui.Components.InviteLinkBottomSheet; import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.LinkActionView; import java.util.ArrayList; +import java.util.HashMap; import java.util.concurrent.CountDownLatch; public class ChatEditTypeActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate { @@ -72,10 +71,9 @@ public class ChatEditTypeActivity extends BaseFragment implements NotificationCe private LinearLayout linkContainer; private LinearLayout publicContainer; private LinearLayout privateContainer; - private TextBlockCell privateTextView; - private TextSettingsCell copyCell; - private TextSettingsCell revokeCell; - private TextSettingsCell shareCell; + private LinkActionView permanentLinkView; + // private TextCell manageLinksTextView; + // private TextInfoPrivacyCell manageLinksInfoCell; private ShadowSectionCell sectionCell2; private TextInfoPrivacyCell infoCell; private TextSettingsCell textCell; @@ -99,13 +97,15 @@ public class ChatEditTypeActivity extends BaseFragment implements NotificationCe private Runnable checkRunnable; private boolean lastNameAvailable; private boolean loadingInvite; - private TLRPC.ExportedChatInvite invite; + private TLRPC.TL_chatInviteExported invite; private boolean ignoreTextChanges; private boolean isForcePublic; + HashMap usersMap = new HashMap<>(); private final static int done_button = 1; + private InviteLinkBottomSheet inviteLinkBottomSheet; public ChatEditTypeActivity(int id, boolean forcePublic) { chatId = id; @@ -142,6 +142,9 @@ public boolean onFragmentCreate() { } })); } + if (isPrivate && info != null) { + getMessagesController().loadFullChat(chatId, classGuid, true); + } getNotificationCenter().addObserver(this, NotificationCenter.chatInfoDidLoad); return super.onFragmentCreate(); } @@ -164,6 +167,11 @@ public void onResume() { textCell2.setText(LocaleController.getString("GroupStickers", R.string.GroupStickers), false); } } + if (info != null) { + invite = info.exported_invite; + permanentLinkView.setLink(invite == null ? null : invite.link); + permanentLinkView.loadUsers(invite, chatId); + } } @Override @@ -340,71 +348,21 @@ public void afterTextChanged(Editable editable) { privateContainer.setOrientation(LinearLayout.VERTICAL); linkContainer.addView(privateContainer, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); - privateTextView = new TextBlockCell(context); - privateTextView.setBackgroundDrawable(Theme.getSelectorDrawable(false)); - privateContainer.addView(privateTextView); - privateTextView.setOnClickListener(v -> { - if (invite == null) { - return; - } - try { - android.content.ClipboardManager clipboard = (android.content.ClipboardManager) ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE); - android.content.ClipData clip = android.content.ClipData.newPlainText("label", invite.link); - clipboard.setPrimaryClip(clip); - BulletinFactory.createCopyLinkBulletin(this).show(); - } catch (Exception e) { - FileLog.e(e); - } - }); - - copyCell = new TextSettingsCell(context); - copyCell.setBackgroundDrawable(Theme.getSelectorDrawable(false)); - copyCell.setText(LocaleController.getString("CopyLink", R.string.CopyLink), true); - privateContainer.addView(copyCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); - copyCell.setOnClickListener(v -> { - if (invite == null) { - return; - } - try { - android.content.ClipboardManager clipboard = (android.content.ClipboardManager) ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE); - android.content.ClipData clip = android.content.ClipData.newPlainText("label", invite.link); - clipboard.setPrimaryClip(clip); - BulletinFactory.createCopyLinkBulletin(this).show(); - } catch (Exception e) { - FileLog.e(e); + permanentLinkView = new LinkActionView(context, this, null, chatId, true); + permanentLinkView.setDelegate(new LinkActionView.Delegate() { + @Override + public void revokeLink() { + ChatEditTypeActivity.this.generateLink(true); } - }); - revokeCell = new TextSettingsCell(context); - revokeCell.setBackgroundDrawable(Theme.getSelectorDrawable(false)); - revokeCell.setText(LocaleController.getString("RevokeLink", R.string.RevokeLink), true); - privateContainer.addView(revokeCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); - revokeCell.setOnClickListener(v -> { - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setMessage(LocaleController.getString("RevokeAlert", R.string.RevokeAlert)); - builder.setTitle(LocaleController.getString("RevokeLink", R.string.RevokeLink)); - builder.setPositiveButton(LocaleController.getString("RevokeButton", R.string.RevokeButton), (dialogInterface, i) -> generateLink(true)); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showDialog(builder.create()); - }); - - shareCell = new TextSettingsCell(context); - shareCell.setBackgroundDrawable(Theme.getSelectorDrawable(false)); - shareCell.setText(LocaleController.getString("ShareLink", R.string.ShareLink), false); - privateContainer.addView(shareCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); - shareCell.setOnClickListener(v -> { - if (invite == null) { - return; - } - try { - Intent intent = new Intent(Intent.ACTION_SEND); - intent.setType("text/plain"); - intent.putExtra(Intent.EXTRA_TEXT, invite.link); - getParentActivity().startActivityForResult(Intent.createChooser(intent, LocaleController.getString("InviteToGroupByLink", R.string.InviteToGroupByLink)), 500); - } catch (Exception e) { - FileLog.e(e); + @Override + public void showUsersForPermanentLink() { + inviteLinkBottomSheet = new InviteLinkBottomSheet(context, invite, info, usersMap, ChatEditTypeActivity.this, chatId, true); + inviteLinkBottomSheet.show(); } }); + permanentLinkView.setUsers(0, null); + privateContainer.addView(permanentLinkView); checkTextView = new TextInfoPrivacyCell(context); checkTextView.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow)); @@ -425,6 +383,25 @@ public void afterTextChanged(Editable editable) { adminedInfoCell = new ShadowSectionCell(context); linearLayout.addView(adminedInfoCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); + +// manageLinksTextView = new TextCell(context); +// manageLinksTextView.setBackgroundDrawable(Theme.getSelectorDrawable(true)); +// manageLinksTextView.setOnClickListener(v -> { +// if (invite == null) { +// return; +// } +// }); +// manageLinksTextView.setTextAndIcon(LocaleController.getString("ManageInviteLinks", R.string.ManageInviteLinks), R.drawable.actions_link, false); +// manageLinksTextView.setOnClickListener(v -> { +// ManageLinksActivity fragment = new ManageLinksActivity(chatId); +// fragment.setInfo(info, invite); +// presentFragment(fragment); +// }); +// linearLayout.addView(manageLinksTextView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); +// +// manageLinksInfoCell = new TextInfoPrivacyCell(context); +// linearLayout.addView(manageLinksInfoCell, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); + if (!isPrivate && currentChat.username != null) { ignoreTextChanges = true; usernameTextView.setText(currentChat.username); @@ -451,7 +428,7 @@ public void didReceivedNotification(int id, int account, Object... args) { public void setInfo(TLRPC.ChatFull chatFull) { info = chatFull; if (chatFull != null) { - if (chatFull.exported_invite instanceof TLRPC.TL_chatInviteExported) { + if (chatFull.exported_invite != null) { invite = chatFull.exported_invite; } else { generateLink(false); @@ -603,10 +580,19 @@ private void updatePrivatePublic() { } publicContainer.setVisibility(isPrivate ? View.GONE : View.VISIBLE); privateContainer.setVisibility(isPrivate ? View.VISIBLE : View.GONE); + //manageLinksTextView.setVisibility(isPrivate ? View.VISIBLE : View.GONE); + // manageLinksInfoCell.setVisibility(isPrivate ? View.VISIBLE : View.GONE); linkContainer.setPadding(0, 0, 0, isPrivate ? 0 : AndroidUtilities.dp(7)); - privateTextView.setText(invite != null ? invite.link : LocaleController.getString("Loading", R.string.Loading), true); + permanentLinkView.setLink(invite != null ? invite.link : null); + permanentLinkView.loadUsers(invite, chatId); checkTextView.setVisibility(!isPrivate && checkTextView.length() != 0 ? View.VISIBLE : View.GONE); - typeInfoCell.setBackgroundDrawable(checkTextView.getVisibility() == View.VISIBLE ? null : Theme.getThemedDrawable(typeInfoCell.getContext(), R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow)); + if (isPrivate) { + typeInfoCell.setBackgroundDrawable(Theme.getThemedDrawable(typeInfoCell.getContext(), R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow)); + // manageLinksInfoCell.setBackground(Theme.getThemedDrawable(typeInfoCell.getContext(), R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow)); + // manageLinksInfoCell.setText(LocaleController.getString("ManageLinksInfoHelp", R.string.ManageLinksInfoHelp)); + } else { + typeInfoCell.setBackgroundDrawable(checkTextView.getVisibility() == View.VISIBLE ? null : Theme.getThemedDrawable(typeInfoCell.getContext(), R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow)); + } } radioButtonCell1.setChecked(!isPrivate, true); radioButtonCell2.setChecked(isPrivate, true); @@ -702,10 +688,11 @@ private boolean checkUserName(final String name) { private void generateLink(final boolean newRequest) { loadingInvite = true; TLRPC.TL_messages_exportChatInvite req = new TLRPC.TL_messages_exportChatInvite(); + //req.legacy_revoke_permanent = true; TODO layer 124 req.peer = getMessagesController().getInputPeer(-chatId); final int reqId = getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { if (error == null) { - invite = (TLRPC.ExportedChatInvite) response; + invite = (TLRPC.TL_chatInviteExported) response; if (info != null) { info.exported_invite = invite; } @@ -721,8 +708,9 @@ private void generateLink(final boolean newRequest) { } } loadingInvite = false; - if (privateTextView != null) { - privateTextView.setText(invite != null ? invite.link : LocaleController.getString("Loading", R.string.Loading), true); + if (permanentLinkView != null) { + permanentLinkView.setLink(invite != null ? invite.link : null); + permanentLinkView.loadUsers(invite, chatId); } })); getConnectionsManager().bindRequestToGuid(reqId, classGuid); @@ -730,7 +718,8 @@ private void generateLink(final boolean newRequest) { @Override public ArrayList getThemeDescriptions() { - ArrayList themeDescriptions = new ArrayList<>();ThemeDescription.ThemeDescriptionDelegate cellDelegate = () -> { + ArrayList themeDescriptions = new ArrayList<>(); + ThemeDescription.ThemeDescriptionDelegate cellDelegate = () -> { if (adminnedChannelsLayout != null) { int count = adminnedChannelsLayout.getChildCount(); for (int a = 0; a < count; a++) { @@ -740,6 +729,12 @@ public ArrayList getThemeDescriptions() { } } } + + permanentLinkView.updateColors(); + // manageLinksTextView.setBackgroundDrawable(Theme.getSelectorDrawable(true)); + if (inviteLinkBottomSheet != null) { + inviteLinkBottomSheet.updateColors(); + } }; themeDescriptions.add(new ThemeDescription(fragmentView, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_windowBackgroundGray)); @@ -777,10 +772,12 @@ public ArrayList getThemeDescriptions() { themeDescriptions.add(new ThemeDescription(typeInfoCell, ThemeDescription.FLAG_CHECKTAG, new Class[]{TextInfoPrivacyCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText4)); themeDescriptions.add(new ThemeDescription(typeInfoCell, ThemeDescription.FLAG_CHECKTAG, new Class[]{TextInfoPrivacyCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteRedText4)); +// themeDescriptions.add(new ThemeDescription(manageLinksInfoCell, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{TextInfoPrivacyCell.class}, null, null, null, Theme.key_windowBackgroundGrayShadow)); +// themeDescriptions.add(new ThemeDescription(manageLinksInfoCell, ThemeDescription.FLAG_CHECKTAG, new Class[]{TextInfoPrivacyCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText4)); +// themeDescriptions.add(new ThemeDescription(manageLinksInfoCell, ThemeDescription.FLAG_CHECKTAG, new Class[]{TextInfoPrivacyCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteRedText4)); + themeDescriptions.add(new ThemeDescription(adminedInfoCell, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{TextInfoPrivacyCell.class}, null, null, null, Theme.key_windowBackgroundGrayShadow)); themeDescriptions.add(new ThemeDescription(adminnedChannelsLayout, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_windowBackgroundWhite)); - themeDescriptions.add(new ThemeDescription(privateTextView, ThemeDescription.FLAG_SELECTOR, null, null, null, null, Theme.key_listSelector)); - themeDescriptions.add(new ThemeDescription(privateTextView, 0, new Class[]{TextBlockCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); themeDescriptions.add(new ThemeDescription(loadingAdminedCell, 0, new Class[]{LoadingCell.class}, new String[]{"progressBar"}, null, null, null, Theme.key_progressCircle)); themeDescriptions.add(new ThemeDescription(radioButtonCell1, ThemeDescription.FLAG_SELECTOR, null, null, null, null, Theme.key_listSelector)); themeDescriptions.add(new ThemeDescription(radioButtonCell1, ThemeDescription.FLAG_CHECKBOX, new Class[]{RadioButtonCell.class}, new String[]{"radioButton"}, null, null, null, Theme.key_radioBackground)); @@ -793,15 +790,6 @@ public ArrayList getThemeDescriptions() { themeDescriptions.add(new ThemeDescription(radioButtonCell2, ThemeDescription.FLAG_TEXTCOLOR, new Class[]{RadioButtonCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); themeDescriptions.add(new ThemeDescription(radioButtonCell2, ThemeDescription.FLAG_TEXTCOLOR, new Class[]{RadioButtonCell.class}, new String[]{"valueTextView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText2)); - themeDescriptions.add(new ThemeDescription(copyCell, 0, new Class[]{TextSettingsCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); - themeDescriptions.add(new ThemeDescription(copyCell, ThemeDescription.FLAG_SELECTOR, null, null, null, null, Theme.key_listSelector)); - - themeDescriptions.add(new ThemeDescription(revokeCell, 0, new Class[]{TextSettingsCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); - themeDescriptions.add(new ThemeDescription(revokeCell, ThemeDescription.FLAG_SELECTOR, null, null, null, null, Theme.key_listSelector)); - - themeDescriptions.add(new ThemeDescription(shareCell, 0, new Class[]{TextSettingsCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); - themeDescriptions.add(new ThemeDescription(shareCell, ThemeDescription.FLAG_SELECTOR, null, null, null, null, Theme.key_listSelector)); - themeDescriptions.add(new ThemeDescription(adminnedChannelsLayout, ThemeDescription.FLAG_TEXTCOLOR, new Class[]{AdminedChannelCell.class}, new String[]{"nameTextView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); themeDescriptions.add(new ThemeDescription(adminnedChannelsLayout, ThemeDescription.FLAG_TEXTCOLOR, new Class[]{AdminedChannelCell.class}, new String[]{"statusTextView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText)); themeDescriptions.add(new ThemeDescription(adminnedChannelsLayout, ThemeDescription.FLAG_LINKCOLOR, new Class[]{AdminedChannelCell.class}, new String[]{"statusTextView"}, null, null, null, Theme.key_windowBackgroundWhiteLinkText)); @@ -815,6 +803,11 @@ public ArrayList getThemeDescriptions() { themeDescriptions.add(new ThemeDescription(null, 0, null, null, null, cellDelegate, Theme.key_avatar_backgroundBlue)); themeDescriptions.add(new ThemeDescription(null, 0, null, null, null, cellDelegate, Theme.key_avatar_backgroundPink)); +// themeDescriptions.add(new ThemeDescription(manageLinksTextView, ThemeDescription.FLAG_SELECTOR, null, null, null, null, Theme.key_listSelector)); +// themeDescriptions.add(new ThemeDescription(manageLinksTextView, ThemeDescription.FLAG_TEXTCOLOR, new Class[]{TextCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); +// themeDescriptions.add(new ThemeDescription(manageLinksTextView, 0, new Class[]{TextCell.class}, new String[]{"imageView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayIcon)); + + return themeDescriptions; } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatUsersActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatUsersActivity.java index f15777b3d06..fc8664d73dd 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatUsersActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatUsersActivity.java @@ -8,6 +8,8 @@ package org.telegram.ui; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.content.Context; @@ -22,6 +24,7 @@ import android.text.TextUtils; import android.text.style.ForegroundColorSpan; import android.util.SparseArray; +import android.util.SparseIntArray; import android.util.TypedValue; import android.view.Gravity; import android.view.MotionEvent; @@ -36,9 +39,10 @@ import android.widget.TextView; import android.widget.Toast; +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import androidx.recyclerview.widget.SimpleItemAnimator; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ChatObject; @@ -86,6 +90,7 @@ public class ChatUsersActivity extends BaseFragment implements NotificationCente private ListAdapter listViewAdapter; private StickerEmptyView emptyView; private RecyclerListView listView; + private LinearLayoutManager layoutManager; private SearchAdapter searchListViewAdapter; private ActionBarMenuItem searchItem; private ActionBarMenuItem doneItem; @@ -150,7 +155,8 @@ public class ChatUsersActivity extends BaseFragment implements NotificationCente private int blockedEmptyRow; private int rowCount; private int selectType; - private int lastEmptyViewRow; + private int loadingUserCellRow; + private int loadingHeaderRow; private int delayResults; @@ -170,7 +176,7 @@ public class ChatUsersActivity extends BaseFragment implements NotificationCente public final static int TYPE_ADMIN = 1; public final static int TYPE_USERS = 2; public final static int TYPE_KICKED = 3; - private boolean openTransitionEnded; + private boolean openTransitionStarted; private FlickerLoadingView flickerLoadingView; private View progressBar; @@ -186,6 +192,10 @@ default void didChangeOwner(TLRPC.User user) { default void didSelectUser(int uid) { } + + default void didUserKicked(int userId) { + + } } private class ChooseView extends View { @@ -454,7 +464,8 @@ private void updateRows() { slowmodeSelectRow = -1; slowmodeInfoRow = -1; loadingProgressRow = -1; - lastEmptyViewRow = -1; + loadingUserCellRow = -1; + loadingHeaderRow = -1; rowCount = 0; if (type == TYPE_KICKED) { @@ -486,9 +497,7 @@ private void updateRows() { addNewRow = rowCount++; } - if (loadingUsers && !firstLoaded) { - //loadingProgressRow = rowCount++; - } else { + if (!(loadingUsers && !firstLoaded)) { if (!participants.isEmpty()) { participantsStartRow = rowCount; rowCount += participants.size(); @@ -497,18 +506,19 @@ private void updateRows() { if (addNewRow != -1 || participantsStartRow != -1) { addNewSectionRow = rowCount++; } - lastEmptyViewRow = rowCount++; + } else if (!firstLoaded) { + if (info != null && info.banned_count > 0) { + loadingUserCellRow = rowCount++; + } } } else if (type == TYPE_BANNED) { if (ChatObject.canBlockUsers(currentChat)) { addNewRow = rowCount++; - if (!participants.isEmpty()) { + if (!participants.isEmpty() || (loadingUsers && !firstLoaded && (info != null && info.kicked_count > 0))) { participantsInfoRow = rowCount++; } } - if (loadingUsers && !firstLoaded) { - // loadingProgressRow = rowCount++; - } else { + if (!(loadingUsers && !firstLoaded)) { if (!participants.isEmpty()) { restricted1SectionRow = rowCount++; participantsStartRow = rowCount; @@ -518,14 +528,16 @@ private void updateRows() { if (participantsStartRow != -1) { if (participantsInfoRow == -1) { participantsInfoRow = rowCount++; - lastEmptyViewRow = rowCount++; } else { addNewSectionRow = rowCount++; } } else { + restricted1SectionRow = rowCount++; blockedEmptyRow = rowCount++; } - lastEmptyViewRow = rowCount++; + } else if (!firstLoaded) { + restricted1SectionRow = rowCount++; + loadingUserCellRow = rowCount++; } } else if (type == TYPE_ADMIN) { if (ChatObject.isChannel(currentChat) && currentChat.megagroup && (info == null || info.participants_count <= 200)) { @@ -536,28 +548,21 @@ private void updateRows() { if (ChatObject.canAddAdmins(currentChat)) { addNewRow = rowCount++; } - if (loadingUsers && !firstLoaded) { - // loadingProgressRow = rowCount++; - } else { + if (!(loadingUsers && !firstLoaded)) { if (!participants.isEmpty()) { participantsStartRow = rowCount; rowCount += participants.size(); participantsEndRow = rowCount; } participantsInfoRow = rowCount++; - lastEmptyViewRow = rowCount++; + } else if (!firstLoaded) { + loadingUserCellRow = rowCount++; } } else if (type == TYPE_USERS) { if (selectType == 0 && ChatObject.canAddUsers(currentChat)) { - /*if (ChatObject.canUserDoAdminAction(currentChat, ChatObject.ACTION_INVITE) && (!ChatObject.isChannel(currentChat) || currentChat.megagroup || TextUtils.isEmpty(currentChat.username))) { - addNew2Row = rowCount++; - addNewSectionRow = rowCount++; - }*/ addNewRow = rowCount++; } - if (loadingUsers && !firstLoaded) { - // loadingProgressRow = rowCount++; - } else { + if (!(loadingUsers && !firstLoaded)) { boolean hasAnyOther = false; if (!contacts.isEmpty()) { contactsHeaderRow = rowCount++; @@ -583,8 +588,12 @@ private void updateRows() { } if (rowCount != 0) { participantsInfoRow = rowCount++; - lastEmptyViewRow = rowCount++; } + } else if (!firstLoaded) { + if (selectType == 0) { + loadingHeaderRow = rowCount++; + } + loadingUserCellRow = rowCount++; } } } @@ -660,6 +669,7 @@ public void onSearchExpand() { public void onSearchCollapse() { searchListViewAdapter.searchUsers(null); searching = false; + listView.setAnimateEmptyView(false, 0); listView.setAdapter(listViewAdapter); listViewAdapter.notifyDataSetChanged(); listView.setFastScrollVisible(true); @@ -678,6 +688,7 @@ public void onTextChanged(EditText editText) { int oldItemsCount = listView.getAdapter() == null ? 0 : listView.getAdapter().getItemCount(); searchListViewAdapter.searchUsers(text); if (TextUtils.isEmpty(text) && listView != null && listView.getAdapter() != listViewAdapter) { + listView.setAnimateEmptyView(false, 0); listView.setAdapter(listViewAdapter); if (oldItemsCount == 0) { showItemsAnimated(0); @@ -698,8 +709,13 @@ public void onTextChanged(EditText editText) { } } - fragmentView = new FrameLayout(context); - fragmentView.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); + fragmentView = new FrameLayout(context) { + @Override + protected void dispatchDraw(Canvas canvas) { + canvas.drawColor(Theme.getColor(listView.getAdapter() == searchListViewAdapter ? Theme.key_windowBackgroundWhite : Theme.key_windowBackgroundGray)); + super.dispatchDraw(canvas); + } + }; FrameLayout frameLayout = (FrameLayout) fragmentView; FrameLayout progressLayout = new FrameLayout(context); @@ -711,24 +727,66 @@ public void onTextChanged(EditText editText) { progressBar = new RadialProgressView(context); progressLayout.addView(progressBar, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); - frameLayout.addView(progressLayout); - if (type == 3) { - flickerLoadingView.setVisibility(View.GONE); - } else { - progressBar.setVisibility(View.GONE); - } + flickerLoadingView.setVisibility(View.GONE); + progressBar.setVisibility(View.GONE); + emptyView = new StickerEmptyView(context, progressLayout, StickerEmptyView.STICKER_TYPE_SEARCH); emptyView.title.setText(LocaleController.getString("NoResult", R.string.NoResult)); emptyView.subtitle.setText(LocaleController.getString("SearchEmptyViewFilteredSubtitle2", R.string.SearchEmptyViewFilteredSubtitle2)); emptyView.setVisibility(View.GONE); emptyView.setAnimateLayoutChange(true); emptyView.showProgress(true, false); + frameLayout.addView(emptyView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); + emptyView.addView(progressLayout,0); - listView = new RecyclerListView(context); - listView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)); - ((SimpleItemAnimator) listView.getItemAnimator()).setSupportsChangeAnimations(false); + listView = new RecyclerListView(context) { + @Override + public void invalidate() { + super.invalidate(); + fragmentView.invalidate(); + } + }; + listView.setLayoutManager(layoutManager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) { + @Override + public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) { + if (!firstLoaded && type != TYPE_KICKED) { + return 0; + } + return super.scrollVerticallyBy(dy, recycler, state); + } + }); + DefaultItemAnimator itemAnimator = new DefaultItemAnimator() { + + @Override + protected long getAddAnimationDelay(long removeDuration, long moveDuration, long changeDuration) { + return 0; + } + + @Override + protected long getMoveAnimationDelay() { + return 0; + } + + @Override + public long getMoveDuration() { + return 220; + } + + @Override + public long getRemoveDuration() { + return 220; + } + + @Override + public long getAddDuration() { + return 220; + } + }; + listView.setItemAnimator(itemAnimator); + itemAnimator.setSupportsChangeAnimations(false); + listView.setAnimateEmptyView(true, 0); listView.setAdapter(listViewAdapter = new ListAdapter(context)); listView.setVerticalScrollbarPosition(LocaleController.isRTL ? RecyclerListView.SCROLLBAR_POSITION_LEFT : RecyclerListView.SCROLLBAR_POSITION_RIGHT); frameLayout.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); @@ -744,6 +802,35 @@ public void onTextChanged(EditText editText) { bundle.putInt("selectType", type == TYPE_BANNED ? 2 : 3); ChatUsersActivity fragment = new ChatUsersActivity(bundle); fragment.setInfo(info); + fragment.setDelegate(new ChatUsersActivityDelegate() { + + @Override + public void didAddParticipantToList(int uid, TLObject participant) { + if (participantsMap.get(uid) == null) { + DiffCallback diffCallback = saveState(); + participants.add(participant); + participantsMap.put(uid, participant); + sortUsers(participants); + updateListAnimated(diffCallback); + } + } + + @Override + public void didUserKicked(int uid) { + if (participantsMap.get(uid) == null) { + DiffCallback diffCallback = saveState(); + TLRPC.TL_channelParticipantBanned chatParticipant = new TLRPC.TL_channelParticipantBanned(); + chatParticipant.user_id = uid; + chatParticipant.date = getConnectionsManager().getCurrentTime(); + chatParticipant.kicked_by = getAccountInstance().getUserConfig().clientUserId; + info.kicked_count++; + participants.add(chatParticipant); + participantsMap.put(uid, chatParticipant); + sortUsers(participants); + updateListAnimated(diffCallback); + } + } + }); presentFragment(fragment); } else if (type == TYPE_ADMIN) { Bundle bundle = new Bundle(); @@ -755,21 +842,11 @@ public void onTextChanged(EditText editText) { @Override public void didAddParticipantToList(int uid, TLObject participant) { if (participant != null && participantsMap.get(uid) == null) { + DiffCallback diffCallback = saveState(); participants.add(participant); - Collections.sort(participants, (lhs, rhs) -> { - int type1 = getChannelAdminParticipantType(lhs); - int type2 = getChannelAdminParticipantType(rhs); - if (type1 > type2) { - return 1; - } else if (type1 < type2) { - return -1; - } - return 0; - }); - updateRows(); - if (listViewAdapter != null) { - listViewAdapter.notifyDataSetChanged(); - } + participantsMap.put(uid, participant); + sortAdmins(participants); + updateListAnimated(diffCallback); } } @@ -788,6 +865,20 @@ public void didSelectUser(int uid) { } }, 200); } + + + if (participantsMap.get(uid) == null) { + DiffCallback diffCallback = saveState(); + TLRPC.TL_channelParticipantAdmin chatParticipant = new TLRPC.TL_channelParticipantAdmin(); + chatParticipant.user_id = user.id; + chatParticipant.date = getConnectionsManager().getCurrentTime(); + chatParticipant.promoted_by = getAccountInstance().getUserConfig().clientUserId; + participants.add(chatParticipant); + participantsMap.put(user.id, chatParticipant); + + sortAdmins(participants); + updateListAnimated(diffCallback); + } } }); fragment.setInfo(info); @@ -802,10 +893,30 @@ public void didSelectUser(int uid) { fragment.setDelegate(new GroupCreateActivity.ContactsAddActivityDelegate() { @Override public void didSelectUsers(ArrayList users, int fwdCount) { + DiffCallback savedState = saveState(); + ArrayList array = contactsMap != null && contactsMap.size() != 0 ? contacts : participants; + SparseArray map = contactsMap != null && contactsMap.size() != 0 ? contactsMap : participantsMap; + int k = 0; for (int a = 0, N = users.size(); a < N; a++) { TLRPC.User user = users.get(a); getMessagesController().addUserToChat(chatId, user, fwdCount, null, ChatUsersActivity.this, null); + getMessagesController().putUser(user, false); + + if (map.get(user.id) == null) { + TLRPC.ChatParticipant participant = new TLRPC.TL_chatParticipant(); + participant.inviter_id = getUserConfig().getClientUserId(); + participant.user_id = user.id; + participant.date = getConnectionsManager().getCurrentTime(); + + array.add(k, participant); + k++; + map.put(user.id, participant); + } } + if (array == participants) { + sortAdmins(participants); + } + updateListAnimated(savedState); } @Override @@ -1081,7 +1192,7 @@ public void onScrolled(RecyclerView recyclerView, int dx, int dy) { updateRows(); listView.setEmptyView(emptyView); - listView.setAnimateEmptyView(true, 0); + listView.setAnimateEmptyView(false, 0); if (needOpenSearch) { searchItem.openSearch(false); @@ -1090,10 +1201,40 @@ public void onScrolled(RecyclerView recyclerView, int dx, int dy) { return fragmentView; } + private void sortAdmins(ArrayList participants) { + Collections.sort(participants, (lhs, rhs) -> { + int type1 = getChannelAdminParticipantType(lhs); + int type2 = getChannelAdminParticipantType(rhs); + if (type1 > type2) { + return 1; + } else if (type1 < type2) { + return -1; + } + if (lhs instanceof TLRPC.ChannelParticipant && rhs instanceof TLRPC.ChannelParticipant) { + return ((TLRPC.ChannelParticipant) lhs).user_id - ((TLRPC.ChannelParticipant) rhs).user_id; + } + return 0; + }); + } + private void showItemsAnimated(int from) { - if (isPaused || !openTransitionEnded) { + if (isPaused || !openTransitionStarted || (listView.getAdapter() == listViewAdapter && firstLoaded)) { return; } + View progressView = null; + for (int i = 0; i < listView.getChildCount(); i++) { + View child = listView.getChildAt(i); + if (child instanceof FlickerLoadingView) { + progressView = child; + } + } + final View finalProgressView = progressView; + if (progressView != null) { + listView.removeView(progressView); + from--; + } + int finalFrom = from; + listView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { @@ -1102,7 +1243,7 @@ public boolean onPreDraw() { AnimatorSet animatorSet = new AnimatorSet(); for (int i = 0; i < n; i++) { View child = listView.getChildAt(i); - if (listView.getChildAdapterPosition(child) < from) { + if (child == finalProgressView || listView.getChildAdapterPosition(child) < finalFrom) { continue; } child.setAlpha(0); @@ -1113,6 +1254,25 @@ public boolean onPreDraw() { a.setDuration(200); animatorSet.playTogether(a); } + + if (finalProgressView != null && finalProgressView.getParent() == null) { + listView.addView(finalProgressView); + RecyclerView.LayoutManager layoutManager = listView.getLayoutManager(); + if (layoutManager != null) { + layoutManager.ignoreView(finalProgressView); + Animator animator = ObjectAnimator.ofFloat(finalProgressView, View.ALPHA, finalProgressView.getAlpha(), 0); + animator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + finalProgressView.setAlpha(1f); + layoutManager.stopIgnoringView(finalProgressView); + listView.removeView(finalProgressView); + } + }); + animator.start(); + } + } + animatorSet.start(); return true; } @@ -1195,16 +1355,7 @@ private void onOwnerChaged(TLRPC.User user) { creator.user_id = user.id; participantsMap.put(user.id, creator); participants.add(creator); - Collections.sort(participants, (lhs, rhs) -> { - int type1 = getChannelAdminParticipantType(lhs); - int type2 = getChannelAdminParticipantType(rhs); - if (type1 > type2) { - return 1; - } else if (type1 < type2) { - return -1; - } - return 0; - }); + sortAdmins(participants); updateRows(); } listViewAdapter.notifyDataSetChanged(); @@ -1306,6 +1457,8 @@ public void didSetRights(int rights, TLRPC.TL_chatAdminRights rightsAdmin, TLRPC } if (delegate != null && rights == 1) { delegate.didSelectUser(user_id); + } else if (delegate != null) { + delegate.didAddParticipantToList(user_id, participant); } if (removeFragment) { removeSelfFromStack(); @@ -1326,11 +1479,13 @@ private void removeUser(int userId) { } TLRPC.User user = getMessagesController().getUser(userId); getMessagesController().deleteUserFromChat(chatId, user, null); + if (delegate != null) { + delegate.didUserKicked(userId); + } finishFragment(); } private TLObject getAnyParticipant(int userId) { - boolean updated = false; for (int a = 0; a < 3; a++) { SparseArray map; if (a == 0) { @@ -1360,6 +1515,7 @@ private void removeParticipants(TLObject object) { private void removeParticipants(int userId) { boolean updated = false; + DiffCallback savedState = saveState(); for (int a = 0; a < 3; a++) { SparseArray map; ArrayList arrayList; @@ -1378,11 +1534,13 @@ private void removeParticipants(int userId) { map.remove(userId); arrayList.remove(p); updated = true; + if (type == TYPE_BANNED) { + info.kicked_count--; + } } } if (updated) { - updateRows(); - listViewAdapter.notifyDataSetChanged(); + updateListAnimated(savedState); } if (listView.getAdapter() == searchListViewAdapter) { searchListViewAdapter.removeUserId(userId); @@ -1998,7 +2156,6 @@ private void loadChatParticipants(int offset, int count, boolean reset) { req.offset = offset; req.limit = count; int reqId = getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { - resumeDelayedFragmentAnimation(); if (error == null) { TLRPC.TL_channels_channelParticipants res = (TLRPC.TL_channels_channelParticipants) response; if (type == TYPE_ADMIN) { @@ -2060,82 +2217,80 @@ private void loadChatParticipants(int offset, int count, boolean reset) { } try { if ((type == TYPE_BANNED || type == TYPE_KICKED || type == TYPE_USERS) && currentChat != null && currentChat.megagroup && info instanceof TLRPC.TL_channelFull && info.participants_count <= 200) { - int currentTime = getConnectionsManager().getCurrentTime(); - Collections.sort(objects, (lhs, rhs) -> { - TLRPC.ChannelParticipant p1 = (TLRPC.ChannelParticipant) lhs; - TLRPC.ChannelParticipant p2 = (TLRPC.ChannelParticipant) rhs; - TLRPC.User user1 = getMessagesController().getUser(p1.user_id); - TLRPC.User user2 = getMessagesController().getUser(p2.user_id); - int status1 = 0; - int status2 = 0; - if (user1 != null && user1.status != null) { - if (user1.self) { - status1 = currentTime + 50000; - } else { - status1 = user1.status.expires; - } - } - if (user2 != null && user2.status != null) { - if (user2.self) { - status2 = currentTime + 50000; - } else { - status2 = user2.status.expires; - } - } - if (status1 > 0 && status2 > 0) { - if (status1 > status2) { - return 1; - } else if (status1 < status2) { - return -1; - } - return 0; - } else if (status1 < 0 && status2 < 0) { - if (status1 > status2) { - return 1; - } else if (status1 < status2) { - return -1; - } - return 0; - } else if (status1 < 0 && status2 > 0 || status1 == 0 && status2 != 0) { - return -1; - } else if (status2 < 0 && status1 > 0 || status2 == 0 && status1 != 0) { - return 1; - } - return 0; - }); + sortUsers(objects); } else if (type == TYPE_ADMIN) { - Collections.sort(participants, (lhs, rhs) -> { - int type1 = getChannelAdminParticipantType(lhs); - int type2 = getChannelAdminParticipantType(rhs); - if (type1 > type2) { - return 1; - } else if (type1 < type2) { - return -1; - } - return 0; - }); + sortAdmins(participants); } } catch (Exception e) { FileLog.e(e); } } if (type != TYPE_USERS || delayResults <= 0) { + showItemsAnimated(listViewAdapter != null ? listViewAdapter.getItemCount() : 0); loadingUsers = false; firstLoaded = true; - showItemsAnimated(listViewAdapter != null ? listViewAdapter.getItemCount() : 0); } updateRows(); if (listViewAdapter != null) { + listView.setAnimateEmptyView(openTransitionStarted, 0); listViewAdapter.notifyDataSetChanged(); + if (emptyView != null && listViewAdapter.getItemCount() == 0 && firstLoaded) { emptyView.showProgress(false, true); } } + resumeDelayedFragmentAnimation(); })); getConnectionsManager().bindRequestToGuid(reqId, classGuid); } } + private void sortUsers(ArrayList objects) { + int currentTime = getConnectionsManager().getCurrentTime(); + Collections.sort(objects, (lhs, rhs) -> { + TLRPC.ChannelParticipant p1 = (TLRPC.ChannelParticipant) lhs; + TLRPC.ChannelParticipant p2 = (TLRPC.ChannelParticipant) rhs; + TLRPC.User user1 = getMessagesController().getUser(p1.user_id); + TLRPC.User user2 = getMessagesController().getUser(p2.user_id); + int status1 = 0; + int status2 = 0; + if (user1 != null && user1.status != null) { + if (user1.self) { + status1 = currentTime + 50000; + } else { + status1 = user1.status.expires; + } + } + if (user2 != null && user2.status != null) { + if (user2.self) { + status2 = currentTime + 50000; + } else { + status2 = user2.status.expires; + } + } + if (status1 > 0 && status2 > 0) { + if (status1 > status2) { + return 1; + } else if (status1 < status2) { + return -1; + } + return 0; + } else if (status1 < 0 && status2 < 0) { + if (status1 > status2) { + return 1; + } else if (status1 < status2) { + return -1; + } + return 0; + } else if (status1 < 0 && status2 > 0 || status1 == 0 && status2 != 0) { + return -1; + } else if (status2 < 0 && status1 > 0 || status2 == 0 && status1 != 0) { + return 1; + } + return 0; + }); + } + @Override public void onResume() { super.onResume(); @@ -2167,10 +2322,18 @@ public int getSelectType() { return selectType; } +// @Override +// protected void onTransitionAnimationStart(boolean isOpen, boolean backward) { +// super.onTransitionAnimationStart(isOpen, backward); +// if (isOpen) { +// openTransitionStarted = true; +// } +// } + @Override protected void onTransitionAnimationEnd(boolean isOpen, boolean backward) { if (isOpen) { - openTransitionEnded = true; + openTransitionStarted = true; } if (isOpen && !backward && needOpenSearch) { searchItem.getSearchField().requestFocus(); @@ -2409,6 +2572,7 @@ public void notifyDataSetChanged() { globalStartRow = -1; } if (searching && listView != null && listView.getAdapter() != searchListViewAdapter) { + listView.setAnimateEmptyView(true, 0); listView.setAdapter(searchListViewAdapter); listView.setFastScrollVisible(false); listView.setVerticalScrollBarEnabled(true); @@ -2652,9 +2816,9 @@ public boolean isEnabled(RecyclerView.ViewHolder holder) { @Override public int getItemCount() { - if (type == TYPE_KICKED && loadingUsers && !firstLoaded) { + /* if (type == TYPE_KICKED && loadingUsers && !firstLoaded) { return 0; - } + }*/ return rowCount; } @@ -2672,27 +2836,14 @@ public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType view = manageChatUserCell; break; case 1: - view = new TextInfoPrivacyCell(mContext) { - @Override - protected void dispatchDraw(Canvas canvas) { - canvas.drawColor(Theme.getColor(Theme.key_windowBackgroundGray)); - super.dispatchDraw(canvas); - } - }; + view = new TextInfoPrivacyCell(mContext); break; case 2: view = new ManageChatTextCell(mContext); view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); break; case 3: - view = new ShadowSectionCell(mContext) { - @Override - protected void dispatchDraw(Canvas canvas) { - canvas.drawColor(Theme.getColor(Theme.key_windowBackgroundGray)); - super.dispatchDraw(canvas); - } - }; - view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundGray)); + view = new ShadowSectionCell(mContext); break; case 4: view = new FrameLayout(mContext) { @@ -2701,12 +2852,6 @@ protected void dispatchDraw(Canvas canvas) { protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(heightMeasureSpec) - AndroidUtilities.dp(56), MeasureSpec.EXACTLY)); } - - @Override - protected void dispatchDraw(Canvas canvas) { - canvas.drawColor(Theme.getColor(Theme.key_windowBackgroundGray)); - super.dispatchDraw(canvas); - } }; FrameLayout frameLayout = (FrameLayout) view; frameLayout.setBackgroundDrawable(Theme.getThemedDrawable(mContext, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow)); @@ -2758,28 +2903,20 @@ protected void dispatchDraw(Canvas canvas) { break; case 8: view = new GraySectionCell(mContext); + view.setBackground(null); break; case 10: view = new LoadingCell(mContext, AndroidUtilities.dp(40), AndroidUtilities.dp(120)); break; case 11: - view = new View(mContext) { - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - int h = 0; - for (int i = 0; i < listView.getChildCount(); i++) { - if (listView.getChildAt(i) != this) { - h += listView.getChildAt(i).getMeasuredHeight(); - } - } - setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), Math.max(0, listView.getMeasuredHeight() - h)); - } - - @Override - protected void onDraw(Canvas canvas) { - canvas.drawColor(Theme.getColor(Theme.key_windowBackgroundGray)); - } - }; + FlickerLoadingView flickerLoadingView = new FlickerLoadingView(mContext); + flickerLoadingView.setIsSingleCell(true); + flickerLoadingView.setViewType(FlickerLoadingView.USERS_TYPE); + flickerLoadingView.showDate(false); + flickerLoadingView.setPaddingLeft(AndroidUtilities.dp(5)); + flickerLoadingView.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); + flickerLoadingView.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); + view = flickerLoadingView; break; case 9: default: @@ -3031,6 +3168,16 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { } else { sectionCell.setText(LocaleController.getString("GroupContacts", R.string.GroupContacts)); } + } else if (position == loadingHeaderRow) { + sectionCell.setText(""); + } + break; + case 11: + FlickerLoadingView flickerLoadingView = (FlickerLoadingView) holder.itemView; + if (type == TYPE_BANNED) { + flickerLoadingView.setItemsCount(info == null ? 1 : info.kicked_count); + } else { + flickerLoadingView.setItemsCount(1); } break; } @@ -3064,13 +3211,13 @@ public int getItemViewType(int position) { } else if (position == changeInfoRow || position == addUsersRow || position == pinMessagesRow || position == sendMessagesRow || position == sendMediaRow || position == sendStickersRow || position == embedLinksRow || position == sendPollsRow) { return 7; - } else if (position == membersHeaderRow || position == contactsHeaderRow || position == botHeaderRow) { + } else if (position == membersHeaderRow || position == contactsHeaderRow || position == botHeaderRow || position == loadingHeaderRow) { return 8; } else if (position == slowmodeSelectRow) { return 9; } else if (position == loadingProgressRow) { return 10; - } else if (position == lastEmptyViewRow) { + } else if (position == loadingUserCellRow) { return 11; } return 0; @@ -3088,6 +3235,143 @@ public TLObject getItem(int position) { } } + public DiffCallback saveState() { + DiffCallback diffCallback = new DiffCallback(); + diffCallback.oldRowCount = rowCount; + + diffCallback.oldBotStartRow = botStartRow; + diffCallback.oldBotEndRow = botEndRow; + diffCallback.oldBots.clear(); + diffCallback.oldBots.addAll(bots); + + diffCallback.oldContactsEndRow = contactsEndRow; + diffCallback.oldContactsStartRow = contactsStartRow; + diffCallback.oldContacts.clear(); + diffCallback.oldContacts.addAll(contacts); + + diffCallback.oldParticipantsStartRow = participantsStartRow; + diffCallback.oldParticipantsEndRow = participantsEndRow; + diffCallback.oldParticipants.clear(); + diffCallback.oldParticipants.addAll(participants); + + diffCallback.fillPositions(diffCallback.oldPositionToItem); + return diffCallback; + } + + public void updateListAnimated(DiffCallback savedState) { + if (listViewAdapter == null) { + updateRows(); + return; + } + updateRows(); + savedState.fillPositions(savedState.newPositionToItem); + DiffUtil.calculateDiff(savedState).dispatchUpdatesTo(listViewAdapter); + if (listView != null && layoutManager != null && listView.getChildCount() > 0) { + View view = null; + int position = -1; + for (int i = 0; i < listView.getChildCount(); i++) { + position = listView.getChildAdapterPosition(listView.getChildAt(i)); + if (position != RecyclerListView.NO_POSITION) { + view = listView.getChildAt(i); + break; + } + } + if (view != null) { + layoutManager.scrollToPositionWithOffset(position, view.getTop() - listView.getPaddingTop()); + } + } + } + + private class DiffCallback extends DiffUtil.Callback { + + int oldRowCount; + SparseIntArray oldPositionToItem = new SparseIntArray(); + SparseIntArray newPositionToItem = new SparseIntArray(); + + int oldParticipantsStartRow; + int oldParticipantsEndRow; + int oldContactsStartRow; + int oldContactsEndRow; + int oldBotStartRow; + int oldBotEndRow; + + private ArrayList oldParticipants = new ArrayList<>(); + private ArrayList oldBots = new ArrayList<>(); + private ArrayList oldContacts = new ArrayList<>(); + + @Override + public int getOldListSize() { + return oldRowCount; + } + + @Override + public int getNewListSize() { + return rowCount; + } + + @Override + public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { + if (oldItemPosition >= oldBotStartRow && oldItemPosition < oldBotEndRow && newItemPosition >= botStartRow && newItemPosition < botEndRow) { + return oldBots.get(oldItemPosition - oldBotStartRow).equals(bots.get(newItemPosition - botStartRow)); + } else if (oldItemPosition >= oldContactsStartRow && oldItemPosition < oldContactsEndRow && newItemPosition >= contactsStartRow && newItemPosition < contactsEndRow) { + return oldContacts.get(oldItemPosition - oldContactsStartRow).equals(contacts.get(newItemPosition - contactsStartRow)); + } else if (oldItemPosition >= oldParticipantsStartRow && oldItemPosition < oldParticipantsEndRow && newItemPosition >= participantsStartRow && newItemPosition < participantsEndRow) { + return oldParticipants.get(oldItemPosition - oldParticipantsStartRow).equals(participants.get(newItemPosition - participantsStartRow)); + } + return oldPositionToItem.get(oldItemPosition) == newPositionToItem.get(newItemPosition); + } + + @Override + public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { + if (areItemsTheSame(oldItemPosition, newItemPosition)) { + if (restricted1SectionRow == newItemPosition) { + return false; + } + return true; + } + return false; + } + + public void fillPositions(SparseIntArray sparseIntArray) { + sparseIntArray.clear(); + int pointer = 0; + put(++pointer, recentActionsRow, sparseIntArray); + put(++pointer, addNewRow, sparseIntArray); + put(++pointer, addNew2Row, sparseIntArray); + put(++pointer, addNewSectionRow, sparseIntArray); + put(++pointer, restricted1SectionRow, sparseIntArray); + put(++pointer, participantsDividerRow, sparseIntArray); + put(++pointer, participantsDivider2Row, sparseIntArray); + put(++pointer, participantsInfoRow, sparseIntArray); + put(++pointer, blockedEmptyRow, sparseIntArray); + put(++pointer, permissionsSectionRow, sparseIntArray); + put(++pointer, sendMessagesRow, sparseIntArray); + put(++pointer, sendMediaRow, sparseIntArray); + put(++pointer, sendStickersRow, sparseIntArray); + put(++pointer, sendPollsRow, sparseIntArray); + put(++pointer, embedLinksRow, sparseIntArray); + put(++pointer, addUsersRow, sparseIntArray); + put(++pointer, pinMessagesRow, sparseIntArray); + put(++pointer, changeInfoRow, sparseIntArray); + put(++pointer, removedUsersRow, sparseIntArray); + put(++pointer, contactsHeaderRow, sparseIntArray); + put(++pointer, botHeaderRow, sparseIntArray); + put(++pointer, membersHeaderRow, sparseIntArray); + put(++pointer, slowmodeRow, sparseIntArray); + put(++pointer, slowmodeSelectRow, sparseIntArray); + put(++pointer, slowmodeInfoRow, sparseIntArray); + put(++pointer, loadingProgressRow, sparseIntArray); + put(++pointer, loadingUserCellRow, sparseIntArray); + put(++pointer, loadingHeaderRow, sparseIntArray); + } + + private void put(int id, int position, SparseIntArray sparseIntArray) { + if (position >= 0) { + sparseIntArray.put(position, id); + } + } + } + @Override public ArrayList getThemeDescriptions() { ArrayList themeDescriptions = new ArrayList<>(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AlertsCreator.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AlertsCreator.java index b8b270bd232..ffdd8cc6c57 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AlertsCreator.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AlertsCreator.java @@ -113,7 +113,35 @@ public static Dialog processError(int currentAccount, TLRPC.TL_error error, Base if (error.code == 406 || error.text == null) { return null; } - if (request instanceof TLRPC.TL_account_saveSecureValue || request instanceof TLRPC.TL_account_getAuthorizationForm) { + if (request instanceof TLRPC.TL_messages_initHistoryImport || request instanceof TLRPC.TL_messages_checkHistoryImport || request instanceof TLRPC.TL_messages_startHistoryImport) { + TLRPC.InputPeer peer; + if (request instanceof TLRPC.TL_messages_initHistoryImport) { + peer = ((TLRPC.TL_messages_initHistoryImport) request).peer; + } else if (request instanceof TLRPC.TL_messages_startHistoryImport) { + peer = ((TLRPC.TL_messages_startHistoryImport) request).peer; + } else { + peer = null; + } + if (error.text.contains("USER_IS_BLOCKED")) { + showSimpleAlert(fragment, LocaleController.getString("ImportErrorTitle", R.string.ImportErrorTitle), LocaleController.getString("ImportErrorUserBlocked", R.string.ImportErrorUserBlocked)); + } else if (error.text.contains("USER_NOT_MUTUAL_CONTACT")) { + showSimpleAlert(fragment, LocaleController.getString("ImportErrorTitle", R.string.ImportErrorTitle), LocaleController.getString("ImportMutualError", R.string.ImportMutualError)); + } else if (error.text.contains("IMPORT_PEER_TYPE_INVALID")) { + if (peer instanceof TLRPC.TL_inputPeerUser) { + showSimpleAlert(fragment, LocaleController.getString("ImportErrorTitle", R.string.ImportErrorTitle), LocaleController.getString("ImportErrorChatInvalidUser", R.string.ImportErrorChatInvalidUser)); + } else { + showSimpleAlert(fragment, LocaleController.getString("ImportErrorTitle", R.string.ImportErrorTitle), LocaleController.getString("ImportErrorChatInvalidGroup", R.string.ImportErrorChatInvalidGroup)); + } + } else if (error.text.contains("CHAT_ADMIN_REQUIRED")) { + showSimpleAlert(fragment, LocaleController.getString("ImportErrorTitle", R.string.ImportErrorTitle), LocaleController.getString("ImportErrorNotAdmin", R.string.ImportErrorNotAdmin)); + } else if (error.text.startsWith("IMPORT_FORMAT")) { + showSimpleAlert(fragment, LocaleController.getString("ImportErrorTitle", R.string.ImportErrorTitle), LocaleController.getString("ImportErrorFileFormatInvalid", R.string.ImportErrorFileFormatInvalid)); + } else if (error.text.contains("IMPORT_LANG_NOT_FOUND")) { + showSimpleAlert(fragment, LocaleController.getString("ImportErrorTitle", R.string.ImportErrorTitle), LocaleController.getString("ImportErrorFileLang", R.string.ImportErrorFileLang)); + } else { + showSimpleAlert(fragment, LocaleController.getString("ImportErrorTitle", R.string.ImportErrorTitle), LocaleController.getString("ErrorOccurred", R.string.ErrorOccurred) + "\n" + error.text); + } + } else if (request instanceof TLRPC.TL_account_saveSecureValue || request instanceof TLRPC.TL_account_getAuthorizationForm) { if (error.text.contains("PHONE_NUMBER_INVALID")) { showSimpleAlert(fragment, LocaleController.getString("InvalidPhoneNumber", R.string.InvalidPhoneNumber)); } else if (error.text.startsWith("FLOOD_WAIT")) { @@ -1044,11 +1072,97 @@ private static void performAskAQuestion(BaseFragment fragment) { } } + public static void createImportDialogAlert(BaseFragment fragment, String title, TLRPC.User user, TLRPC.Chat chat, Runnable onProcessRunnable) { + if (fragment == null || fragment.getParentActivity() == null || chat == null && user == null) { + return; + } + int account = fragment.getCurrentAccount(); + + Context context = fragment.getParentActivity(); + AlertDialog.Builder builder = new AlertDialog.Builder(context); + int selfUserId = UserConfig.getInstance(account).getClientUserId(); + + TextView messageTextView = new TextView(context); + messageTextView.setTextColor(Theme.getColor(Theme.key_dialogTextBlack)); + messageTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + messageTextView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP); + + FrameLayout frameLayout = new FrameLayout(context); + builder.setView(frameLayout); + + AvatarDrawable avatarDrawable = new AvatarDrawable(); + avatarDrawable.setTextSize(AndroidUtilities.dp(12)); + + BackupImageView imageView = new BackupImageView(context); + imageView.setRoundRadius(AndroidUtilities.dp(20)); + frameLayout.addView(imageView, LayoutHelper.createFrame(40, 40, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, 22, 5, 22, 0)); + + TextView textView = new TextView(context); + textView.setTextColor(Theme.getColor(Theme.key_actionBarDefaultSubmenuItem)); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); + textView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + textView.setLines(1); + textView.setMaxLines(1); + textView.setSingleLine(true); + textView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL); + textView.setEllipsize(TextUtils.TruncateAt.END); + textView.setText(LocaleController.formatString("ImportMessages", R.string.ImportMessages)); + + frameLayout.addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, (LocaleController.isRTL ? 21 : 76), 11, (LocaleController.isRTL ? 76 : 21), 0)); + frameLayout.addView(messageTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, 24, 57, 24, 9)); + + if (user != null) { + if (UserObject.isReplyUser(user)) { + avatarDrawable.setSmallSize(true); + avatarDrawable.setAvatarType(AvatarDrawable.AVATAR_TYPE_REPLIES); + imageView.setImage(null, null, avatarDrawable, user); + } else if (user.id == selfUserId) { + avatarDrawable.setSmallSize(true); + avatarDrawable.setAvatarType(AvatarDrawable.AVATAR_TYPE_SAVED); + imageView.setImage(null, null, avatarDrawable, user); + } else { + avatarDrawable.setSmallSize(false); + avatarDrawable.setInfo(user); + imageView.setImage(ImageLocation.getForUser(user, false), "50_50", avatarDrawable, user); + } + } else { + avatarDrawable.setInfo(chat); + imageView.setImage(ImageLocation.getForChat(chat, false), "50_50", avatarDrawable, chat); + } + + if (chat != null) { + if (TextUtils.isEmpty(title)) { + messageTextView.setText(AndroidUtilities.replaceTags(LocaleController.formatString("ImportToChatNoTitle", R.string.ImportToChatNoTitle, chat.title))); + } else { + messageTextView.setText(AndroidUtilities.replaceTags(LocaleController.formatString("ImportToChat", R.string.ImportToChat, title, chat.title))); + } + } else { + if (TextUtils.isEmpty(title)) { + messageTextView.setText(AndroidUtilities.replaceTags(LocaleController.formatString("ImportToUserNoTitle", R.string.ImportToUserNoTitle, ContactsController.formatName(user.first_name, user.last_name)))); + } else { + messageTextView.setText(AndroidUtilities.replaceTags(LocaleController.formatString("ImportToUser", R.string.ImportToUser, title, ContactsController.formatName(user.first_name, user.last_name)))); + } + } + + builder.setPositiveButton(LocaleController.getString("Import", R.string.Import), (dialogInterface, i) -> { + if (onProcessRunnable != null) { + onProcessRunnable.run(); + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + AlertDialog alertDialog = builder.create(); + fragment.showDialog(alertDialog); + } + public static void createClearOrDeleteDialogAlert(BaseFragment fragment, boolean clear, TLRPC.Chat chat, TLRPC.User user, boolean secret, MessagesStorage.BooleanCallback onProcessRunnable) { - createClearOrDeleteDialogAlert(fragment, clear, false, false, chat, user, secret, onProcessRunnable); + createClearOrDeleteDialogAlert(fragment, clear, false, false, chat, user, secret, false, onProcessRunnable); + } + + public static void createClearOrDeleteDialogAlert(BaseFragment fragment, boolean clear, TLRPC.Chat chat, TLRPC.User user, boolean secret, boolean checkDeleteForAll, MessagesStorage.BooleanCallback onProcessRunnable) { + createClearOrDeleteDialogAlert(fragment, clear, chat != null && chat.creator, false, chat, user, secret, checkDeleteForAll, onProcessRunnable); } - public static void createClearOrDeleteDialogAlert(BaseFragment fragment, boolean clear, boolean admin, boolean second, TLRPC.Chat chat, TLRPC.User user, boolean secret, MessagesStorage.BooleanCallback onProcessRunnable) { + public static void createClearOrDeleteDialogAlert(BaseFragment fragment, boolean clear, boolean admin, boolean second, TLRPC.Chat chat, TLRPC.User user, boolean secret, boolean checkDeleteForAll, MessagesStorage.BooleanCallback onProcessRunnable) { if (fragment == null || fragment.getParentActivity() == null || chat == null && user == null) { return; } @@ -1139,11 +1253,16 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { } boolean canDeleteInbox = !secret && user != null && canRevokeInbox && revokeTimeLimit == 0x7fffffff; final boolean[] deleteForAll = new boolean[1]; + boolean deleteGroupForAll = false; - if (!second && canDeleteInbox && !UserObject.isDeleted(user)) { + if (!second && (secret || canDeleteInbox) && !UserObject.isDeleted(user) || (deleteGroupForAll = checkDeleteForAll && !clear && chat != null && chat.creator && (!ChatObject.isChannel(chat) || chat.megagroup))) { cell[0] = new CheckBoxCell(context, 1); cell[0].setBackgroundDrawable(Theme.getSelectorDrawable(false)); - if (clear) { + if (secret) { + cell[0].setText(LocaleController.formatString("DeleteForUser", R.string.DeleteForUser, UserObject.getFirstName(user)), "", false, false); + } else if (deleteGroupForAll) { + cell[0].setText(LocaleController.getString("DeleteGroupForAll", R.string.DeleteGroupForAll), "", false, false); + } else if (clear) { cell[0].setText(LocaleController.formatString("ClearHistoryOptionAlso", R.string.ClearHistoryOptionAlso, UserObject.getFirstName(user)), "", false, false); } else { cell[0].setText(LocaleController.formatString("DeleteMessagesOptionAlso", R.string.DeleteMessagesOptionAlso, UserObject.getFirstName(user)), "", false, false); @@ -1207,7 +1326,7 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (admin) { if (ChatObject.isChannel(chat)) { if (chat.megagroup) { - messageTextView.setText(LocaleController.getString("MegaDeleteAlert", R.string.MegaDeleteAlert)); + messageTextView.setText(LocaleController.getString("AreYouSureDeleteAndExit", R.string.AreYouSureDeleteAndExit)); } else { messageTextView.setText(LocaleController.getString("ChannelDeleteAlert", R.string.ChannelDeleteAlert)); } @@ -1277,14 +1396,14 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { } } builder.setPositiveButton(actionText, (dialogInterface, i) -> { - if (!clearingCache && !second) { + if (!clearingCache && !second && !secret) { if (UserObject.isUserSelf(user)) { - createClearOrDeleteDialogAlert(fragment, clear, admin, true, chat, user, secret, onProcessRunnable); + createClearOrDeleteDialogAlert(fragment, clear, admin, true, chat, user, false, checkDeleteForAll, onProcessRunnable); return; } else if (user != null && deleteForAll[0]) { MessagesStorage.getInstance(fragment.getCurrentAccount()).getMessagesCount(user.id, (count) -> { if (count >= 50) { - createClearOrDeleteDialogAlert(fragment, clear, admin, true, chat, user, secret, onProcessRunnable); + createClearOrDeleteDialogAlert(fragment, clear, admin, true, chat, user, false, checkDeleteForAll, onProcessRunnable); } else { if (onProcessRunnable != null) { onProcessRunnable.run(deleteForAll[0]); @@ -1824,6 +1943,188 @@ public CharSequence getAccessibilityClassName() { return builder; } + + public static BottomSheet.Builder createDatePickerDialog(Context context, long currentDate, final ScheduleDatePickerDelegate datePickerDelegate) { + if (context == null) { + return null; + } + + ScheduleDatePickerColors datePickerColors = new ScheduleDatePickerColors(); + BottomSheet.Builder builder = new BottomSheet.Builder(context, false); + builder.setApplyBottomPadding(false); + + final NumberPicker dayPicker = new NumberPicker(context); + dayPicker.setTextColor(datePickerColors.textColor); + dayPicker.setTextOffset(AndroidUtilities.dp(10)); + dayPicker.setItemCount(5); + final NumberPicker hourPicker = new NumberPicker(context) { + @Override + protected CharSequence getContentDescription(int value) { + return LocaleController.formatPluralString("Hours", value); + } + }; + hourPicker.setItemCount(5); + hourPicker.setTextColor(datePickerColors.textColor); + hourPicker.setTextOffset(-AndroidUtilities.dp(10)); + final NumberPicker minutePicker = new NumberPicker(context) { + @Override + protected CharSequence getContentDescription(int value) { + return LocaleController.formatPluralString("Minutes", value); + } + }; + minutePicker.setItemCount(5); + minutePicker.setTextColor(datePickerColors.textColor); + minutePicker.setTextOffset(-AndroidUtilities.dp(34)); + + LinearLayout container = new LinearLayout(context) { + + boolean ignoreLayout = false; + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + ignoreLayout = true; + int count; + if (AndroidUtilities.displaySize.x > AndroidUtilities.displaySize.y) { + count = 3; + } else { + count = 5; + } + dayPicker.setItemCount(count); + hourPicker.setItemCount(count); + minutePicker.setItemCount(count); + dayPicker.getLayoutParams().height = AndroidUtilities.dp(54) * count; + hourPicker.getLayoutParams().height = AndroidUtilities.dp(54) * count; + minutePicker.getLayoutParams().height = AndroidUtilities.dp(54) * count; + ignoreLayout = false; + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + + @Override + public void requestLayout() { + if (ignoreLayout) { + return; + } + super.requestLayout(); + } + }; + container.setOrientation(LinearLayout.VERTICAL); + + FrameLayout titleLayout = new FrameLayout(context); + container.addView(titleLayout, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 22, 0, 0, 4)); + + TextView titleView = new TextView(context); + titleView.setText(LocaleController.getString("ExpireAfter", R.string.ExpireAfter)); + + titleView.setTextColor(datePickerColors.textColor); + titleView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); + titleView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + titleLayout.addView(titleView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 0, 12, 0, 0)); + titleView.setOnTouchListener((v, event) -> true); + + LinearLayout linearLayout = new LinearLayout(context); + linearLayout.setOrientation(LinearLayout.HORIZONTAL); + linearLayout.setWeightSum(1.0f); + container.addView(linearLayout, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); + + long currentTime = System.currentTimeMillis(); + Calendar calendar = Calendar.getInstance(); + calendar.setTimeInMillis(currentTime); + int currentYear = calendar.get(Calendar.YEAR); + + TextView buttonTextView = new TextView(context) { + @Override + public CharSequence getAccessibilityClassName() { + return Button.class.getName(); + } + }; + + linearLayout.addView(dayPicker, LayoutHelper.createLinear(0, 54 * 5, 0.5f)); + dayPicker.setMinValue(0); + dayPicker.setMaxValue(365); + dayPicker.setWrapSelectorWheel(false); + dayPicker.setFormatter(value -> { + if (value == 0) { + return LocaleController.getString("MessageScheduleToday", R.string.MessageScheduleToday); + } else { + long date = currentTime + (long) value * 86400000L; + calendar.setTimeInMillis(date); + int year = calendar.get(Calendar.YEAR); + if (year == currentYear) { + return LocaleController.getInstance().formatterScheduleDay.format(date); + } else { + return LocaleController.getInstance().formatterScheduleYear.format(date); + } + } + }); + final NumberPicker.OnValueChangeListener onValueChangeListener = (picker, oldVal, newVal) -> { + try { + container.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); + } catch (Exception ignore) { + + } + checkScheduleDate(null, false, dayPicker, hourPicker, minutePicker); + }; + dayPicker.setOnValueChangedListener(onValueChangeListener); + + hourPicker.setMinValue(0); + hourPicker.setMaxValue(23); + linearLayout.addView(hourPicker, LayoutHelper.createLinear(0, 54 * 5, 0.2f)); + hourPicker.setFormatter(value -> String.format("%02d", value)); + hourPicker.setOnValueChangedListener(onValueChangeListener); + + minutePicker.setMinValue(0); + minutePicker.setMaxValue(59); + minutePicker.setValue(0); + minutePicker.setFormatter(value -> String.format("%02d", value)); + linearLayout.addView(minutePicker, LayoutHelper.createLinear(0, 54 * 5, 0.3f)); + minutePicker.setOnValueChangedListener(onValueChangeListener); + + if (currentDate > 0 && currentDate != 0x7FFFFFFE) { + currentDate *= 1000; + calendar.setTimeInMillis(System.currentTimeMillis()); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + calendar.set(Calendar.HOUR_OF_DAY, 0); + int days = (int) ((currentDate - calendar.getTimeInMillis()) / (24 * 60 * 60 * 1000)); + calendar.setTimeInMillis(currentDate); + if (days >= 0) { + minutePicker.setValue(calendar.get(Calendar.MINUTE)); + hourPicker.setValue(calendar.get(Calendar.HOUR_OF_DAY)); + dayPicker.setValue(days); + } + } + final boolean[] canceled = {true}; + + checkScheduleDate(null, false, dayPicker, hourPicker, minutePicker); + + buttonTextView.setPadding(AndroidUtilities.dp(34), 0, AndroidUtilities.dp(34), 0); + buttonTextView.setGravity(Gravity.CENTER); + buttonTextView.setTextColor(datePickerColors.buttonTextColor); + buttonTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + buttonTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + buttonTextView.setBackgroundDrawable(Theme.createSimpleSelectorRoundRectDrawable(AndroidUtilities.dp(4), datePickerColors.buttonBackgroundColor, datePickerColors.buttonBackgroundPressedColor)); + buttonTextView.setText(LocaleController.getString("SetTimeLimit", R.string.SetTimeLimit)); + container.addView(buttonTextView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 48, Gravity.LEFT | Gravity.BOTTOM, 16, 15, 16, 16)); + buttonTextView.setOnClickListener(v -> { + canceled[0] = false; + boolean setSeconds = checkScheduleDate(null, false, dayPicker, hourPicker, minutePicker); + calendar.setTimeInMillis(System.currentTimeMillis() + (long) dayPicker.getValue() * 24 * 3600 * 1000); + calendar.set(Calendar.HOUR_OF_DAY, hourPicker.getValue()); + calendar.set(Calendar.MINUTE, minutePicker.getValue()); + if (setSeconds) { + calendar.set(Calendar.SECOND, 0); + } + datePickerDelegate.didSelectDate(true, (int) (calendar.getTimeInMillis() / 1000)); + builder.getDismissRunnable().run(); + }); + + builder.setCustomView(container); + BottomSheet bottomSheet = builder.show(); + bottomSheet.setBackgroundColor(datePickerColors.backgroundColor); + return builder; + } + private static void checkCalendarDate(long minDate, NumberPicker dayPicker, NumberPicker monthPicker, NumberPicker yearPicker) { int day = dayPicker.getValue(); int month = monthPicker.getValue(); @@ -2099,13 +2400,25 @@ public static void createReportAlert(final Context context, final long dialog_id BottomSheet.Builder builder = new BottomSheet.Builder(context); builder.setTitle(LocaleController.getString("ReportChat", R.string.ReportChat), true); - CharSequence[] items = new CharSequence[]{ - LocaleController.getString("ReportChatSpam", R.string.ReportChatSpam), - LocaleController.getString("ReportChatViolence", R.string.ReportChatViolence), - LocaleController.getString("ReportChatChild", R.string.ReportChatChild), - LocaleController.getString("ReportChatPornography", R.string.ReportChatPornography), - LocaleController.getString("ReportChatOther", R.string.ReportChatOther) - }; + CharSequence[] items; + if (messageId != 0) { + items = new CharSequence[]{ + LocaleController.getString("ReportChatSpam", R.string.ReportChatSpam), + LocaleController.getString("ReportChatViolence", R.string.ReportChatViolence), + LocaleController.getString("ReportChatChild", R.string.ReportChatChild), + LocaleController.getString("ReportChatPornography", R.string.ReportChatPornography), + LocaleController.getString("ReportChatOther", R.string.ReportChatOther) + }; + } else { + items = new CharSequence[]{ + LocaleController.getString("ReportChatSpam", R.string.ReportChatSpam), + LocaleController.getString("ReportChatFakeAccount", R.string.ReportChatFakeAccount), + LocaleController.getString("ReportChatViolence", R.string.ReportChatViolence), + LocaleController.getString("ReportChatChild", R.string.ReportChatChild), + LocaleController.getString("ReportChatPornography", R.string.ReportChatPornography), + LocaleController.getString("ReportChatOther", R.string.ReportChatOther) + }; + } builder.setItems(items, (dialogInterface, i) -> { if (i == 4) { Bundle args = new Bundle(); @@ -2136,10 +2449,12 @@ public static void createReportAlert(final Context context, final long dialog_id if (i == 0) { request.reason = new TLRPC.TL_inputReportReasonSpam(); } else if (i == 1) { - request.reason = new TLRPC.TL_inputReportReasonViolence(); + request.reason = new TLRPC.TL_inputReportReasonFake(); } else if (i == 2) { - request.reason = new TLRPC.TL_inputReportReasonChildAbuse(); + request.reason = new TLRPC.TL_inputReportReasonViolence(); } else if (i == 3) { + request.reason = new TLRPC.TL_inputReportReasonChildAbuse(); + } else if (i == 4) { request.reason = new TLRPC.TL_inputReportReasonPornography(); } req = request; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AudioPlayerAlert.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AudioPlayerAlert.java index 42857325ff4..346221506e7 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AudioPlayerAlert.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AudioPlayerAlert.java @@ -33,18 +33,13 @@ import android.net.Uri; import android.os.Build; import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.core.content.FileProvider; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - import android.os.SystemClock; import android.text.TextUtils; import android.util.TypedValue; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; +import android.view.ViewConfiguration; import android.view.ViewGroup; import android.widget.EditText; import android.widget.FrameLayout; @@ -52,6 +47,13 @@ import android.widget.LinearLayout; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.core.content.FileProvider; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.google.android.exoplayer2.C; + import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.BuildConfig; @@ -162,6 +164,58 @@ public class AudioPlayerAlert extends BottomSheet implements NotificationCenter. private int TAG; private LaunchActivity parentActivity; + int rewindingState; + float rewindingProgress = -1; + + int rewindingForwardPressedCount; + long lastRewindingTime; + long lastUpdateRewindingPlayerTime; + + private final Runnable forwardSeek = new Runnable() { + @Override + public void run() { + long duration = MediaController.getInstance().getDuration(); + if (duration == 0 || duration == C.TIME_UNSET) { + lastRewindingTime = System.currentTimeMillis(); + return; + } + float currentProgress = rewindingProgress; + + long t = System.currentTimeMillis(); + long dt = t - lastRewindingTime; + lastRewindingTime = t; + long updateDt = t - lastUpdateRewindingPlayerTime; + if (rewindingForwardPressedCount == 1) { + dt = dt * 3 - dt; + } else if (rewindingForwardPressedCount == 2) { + dt = dt * 6 - dt; + } else { + dt = dt * 12 - dt; + } + long currentTime = (long) (duration * currentProgress + dt); + currentProgress = currentTime / (float) duration; + if (currentProgress < 0) { + currentProgress = 0; + } + rewindingProgress = currentProgress; + MessageObject messageObject = MediaController.getInstance().getPlayingMessageObject(); + if (messageObject != null && messageObject.isMusic()) { + if (!MediaController.getInstance().isMessagePaused()) { + MediaController.getInstance().getPlayingMessageObject().audioProgress = rewindingProgress; + } + updateProgress(messageObject); + } + if (rewindingState == 1 && rewindingForwardPressedCount > 0 && MediaController.getInstance().isMessagePaused()) { + if (updateDt > 200 || rewindingProgress == 0) { + lastUpdateRewindingPlayerTime = t; + MediaController.getInstance().seekToProgress(MediaController.getInstance().getPlayingMessageObject(), currentProgress); + } + if (rewindingForwardPressedCount > 0 && rewindingProgress > 0) { + AndroidUtilities.runOnUIThread(forwardSeek, 16); + } + } + } + }; public AudioPlayerAlert(final Context context) { super(context, true); @@ -524,12 +578,43 @@ protected TextView createTextView() { textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); textView.setEllipsize(TextUtils.TruncateAt.END); textView.setSingleLine(true); + textView.setPadding(AndroidUtilities.dp(6), 0, AndroidUtilities.dp(6), AndroidUtilities.dp(1)); + textView.setBackground(Theme.createRadSelectorDrawable(Theme.getColor(Theme.key_listSelector), AndroidUtilities.dp(4), AndroidUtilities.dp(4))); + + textView.setOnClickListener(view -> { + int dialogsCount = MessagesController.getInstance(currentAccount).getTotalDialogsCount(); + if (dialogsCount <= 10) { + return; + } + String query = (String) textView.getText(); + if (parentActivity.getActionBarLayout().getLastFragment() instanceof DialogsActivity) { + DialogsActivity dialogsActivity = (DialogsActivity) parentActivity.getActionBarLayout().getLastFragment(); + if (!dialogsActivity.onlyDialogsAdapter()) { + dialogsActivity.setShowSearch(query, 4); + dismiss(); + return; + } + } + DialogsActivity fragment = new DialogsActivity(null); + fragment.setSearchString(query); + fragment.setInitialSearchType(4); + parentActivity.presentFragment(fragment, false, false); + dismiss(); + }); return textView; } }; - playerLayout.addView(authorTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.LEFT, 20, 47, 72, 0)); + playerLayout.addView(authorTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.LEFT, 14, 47, 72, 0)); - seekBarView = new SeekBarView(context); + seekBarView = new SeekBarView(context) { + @Override + boolean onTouch(MotionEvent ev) { + if (rewindingState != 0) { + return false; + } + return super.onTouch(ev); + } + }; seekBarView.setDelegate(new SeekBarView.SeekBarViewDelegate() { @Override public void onSeekBarDrag(boolean stop, float progress) { @@ -659,8 +744,135 @@ protected void onLayout(boolean changed, int left, int top, int right, int botto }); final int iconColor = Theme.getColor(Theme.key_player_button); + float touchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); + + buttons[1] = prevButton = new RLottieImageView(context) { + float startX; + float startY; + + int pressedCount = 0; + + long lastTime; + long lastUpdateTime; + + private final Runnable pressedRunnable = new Runnable() { + @Override + public void run() { + pressedCount++; + if (pressedCount == 1) { + rewindingState = -1; + rewindingProgress = MediaController.getInstance().getPlayingMessageObject().audioProgress; + lastTime = System.currentTimeMillis(); + AndroidUtilities.runOnUIThread(this, 2000); + AndroidUtilities.runOnUIThread(backSeek); + } else if (pressedCount == 2) { + AndroidUtilities.runOnUIThread(this, 2000); + } + } + }; - buttons[1] = prevButton = new RLottieImageView(context); + private final Runnable backSeek = new Runnable() { + @Override + public void run() { + long duration = MediaController.getInstance().getDuration(); + if (duration == 0 || duration == C.TIME_UNSET) { + lastTime = System.currentTimeMillis(); + return; + } + float currentProgress = rewindingProgress; + + long t = System.currentTimeMillis(); + long dt = t - lastTime; + lastTime = t; + long updateDt = t - lastUpdateTime; + if (pressedCount == 1) { + dt *= 3; + } else if (pressedCount == 2) { + dt *= 6; + } else { + dt *= 12; + } + long currentTime = (long) (duration * currentProgress - dt); + currentProgress = currentTime / (float) duration; + if (currentProgress < 0) { + currentProgress = 0; + } + rewindingProgress = currentProgress; + MessageObject messageObject = MediaController.getInstance().getPlayingMessageObject(); + if (messageObject != null && messageObject.isMusic()) { + updateProgress(messageObject); + } + if (rewindingState == -1 && pressedCount > 0) { + if (updateDt > 200 || rewindingProgress == 0) { + lastUpdateTime = t; + if (rewindingProgress == 0) { + MediaController.getInstance().seekToProgress(MediaController.getInstance().getPlayingMessageObject(), 0); + MediaController.getInstance().pauseByRewind(); + } else { + MediaController.getInstance().seekToProgress(MediaController.getInstance().getPlayingMessageObject(), currentProgress); + } + } + if (pressedCount > 0 && rewindingProgress > 0) { + AndroidUtilities.runOnUIThread(backSeek, 16); + } + } + } + }; + + long startTime; + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (seekBarView.isDragging() || rewindingState == 1) { + return false; + } + float x = event.getRawX(); + float y = event.getRawY(); + + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + startX = x; + startY = y; + startTime = System.currentTimeMillis(); + rewindingState = 0; + AndroidUtilities.runOnUIThread(pressedRunnable, 300); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && getBackground() != null) { + getBackground().setHotspot(startX, startY); + } + setPressed(true); + break; + case MotionEvent.ACTION_MOVE: + float dx = x - startX; + float dy = y - startY; + + if ((dx * dx + dy * dy) > touchSlop * touchSlop && rewindingState == 0) { + AndroidUtilities.cancelRunOnUIThread(pressedRunnable); + setPressed(false); + } + break; + case MotionEvent.ACTION_CANCEL: + case MotionEvent.ACTION_UP: + AndroidUtilities.cancelRunOnUIThread(pressedRunnable); + AndroidUtilities.cancelRunOnUIThread(backSeek); + if (rewindingState == 0 && event.getAction() == MotionEvent.ACTION_UP && (System.currentTimeMillis() - startTime < 300)) { + MediaController.getInstance().playPreviousMessage(); + prevButton.setProgress(0f); + prevButton.playAnimation(); + } + if (pressedCount > 0) { + lastUpdateTime = 0; + backSeek.run(); + MediaController.getInstance().resumeByRewind(); + } + rewindingProgress = -1; + setPressed(false); + rewindingState = 0; + pressedCount = 0; + break; + } + return true; + } + }; prevButton.setScaleType(ImageView.ScaleType.CENTER); prevButton.setAnimation(R.raw.player_prev, 20, 20); prevButton.setLayerColor("Triangle 3.**", iconColor); @@ -670,11 +882,6 @@ protected void onLayout(boolean changed, int left, int top, int right, int botto prevButton.setBackgroundDrawable(Theme.createSelectorDrawable(Theme.getColor(Theme.key_listSelector), 1, AndroidUtilities.dp(22))); } bottomView.addView(prevButton, LayoutHelper.createFrame(48, 48, Gravity.LEFT | Gravity.TOP)); - prevButton.setOnClickListener(v -> { - MediaController.getInstance().playPreviousMessage(); - prevButton.setProgress(0f); - prevButton.playAnimation(); - }); prevButton.setContentDescription(LocaleController.getString("AccDescrPrevious", R.string.AccDescrPrevious)); buttons[2] = playButton = new ImageView(context); @@ -697,7 +904,92 @@ protected void onLayout(boolean changed, int left, int top, int right, int botto } }); - buttons[3] = nextButton = new RLottieImageView(context); + buttons[3] = nextButton = new RLottieImageView(context) { + + float startX; + float startY; + boolean pressed; + + private final Runnable pressedRunnable = new Runnable() { + @Override + public void run() { + if (MediaController.getInstance().getPlayingMessageObject() == null) { + return; + } + rewindingForwardPressedCount++; + if (rewindingForwardPressedCount == 1) { + pressed = true; + rewindingState = 1; + if (MediaController.getInstance().isMessagePaused()) { + startForwardRewindingSeek(); + } else if (rewindingState == 1) { + AndroidUtilities.cancelRunOnUIThread(forwardSeek); + lastUpdateRewindingPlayerTime = 0; + } + MediaController.getInstance().setPlaybackSpeed(true, 4); + AndroidUtilities.runOnUIThread(this, 2000); + } else if (rewindingForwardPressedCount == 2) { + MediaController.getInstance().setPlaybackSpeed(true, 7); + AndroidUtilities.runOnUIThread(this, 2000); + } else { + MediaController.getInstance().setPlaybackSpeed(true, 13); + } + } + }; + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (seekBarView.isDragging() || rewindingState == -1) { + return false; + } + float x = event.getRawX(); + float y = event.getRawY(); + + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + pressed = false; + startX = x; + startY = y; + AndroidUtilities.runOnUIThread(pressedRunnable, 300); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && getBackground() != null) { + getBackground().setHotspot(startX, startY); + } + setPressed(true); + break; + case MotionEvent.ACTION_MOVE: + float dx = x - startX; + float dy = y - startY; + + if ((dx * dx + dy * dy) > touchSlop * touchSlop && !pressed) { + AndroidUtilities.cancelRunOnUIThread(pressedRunnable); + setPressed(false); + } + break; + case MotionEvent.ACTION_CANCEL: + case MotionEvent.ACTION_UP: + if (!pressed && event.getAction() == MotionEvent.ACTION_UP && isPressed()) { + MediaController.getInstance().playNextMessage(); + nextButton.setProgress(0f); + nextButton.playAnimation(); + } + AndroidUtilities.cancelRunOnUIThread(pressedRunnable); + if (rewindingForwardPressedCount > 0) { + MediaController.getInstance().setPlaybackSpeed(true, 1f); + if (MediaController.getInstance().isMessagePaused()) { + lastUpdateRewindingPlayerTime = 0; + forwardSeek.run(); + } + } + rewindingState = 0; + setPressed(false); + rewindingForwardPressedCount = 0; + rewindingProgress = -1; + break; + } + return true; + } + + }; nextButton.setScaleType(ImageView.ScaleType.CENTER); nextButton.setAnimation(R.raw.player_prev, 20, 20); nextButton.setLayerColor("Triangle 3.**", iconColor); @@ -708,11 +1000,6 @@ protected void onLayout(boolean changed, int left, int top, int right, int botto nextButton.setBackgroundDrawable(Theme.createSelectorDrawable(Theme.getColor(Theme.key_listSelector), 1, AndroidUtilities.dp(22))); } bottomView.addView(nextButton, LayoutHelper.createFrame(48, 48, Gravity.LEFT | Gravity.TOP)); - nextButton.setOnClickListener(v -> { - MediaController.getInstance().playNextMessage(); - nextButton.setProgress(0f); - nextButton.playAnimation(); - }); nextButton.setContentDescription(LocaleController.getString("Next", R.string.Next)); buttons[4] = optionsButton = new ActionBarMenuItem(context, null, 0, iconColor); @@ -888,6 +1175,15 @@ public boolean onTouchEvent(MotionEvent event) { updateEmptyView(); } + private void startForwardRewindingSeek() { + if (rewindingState == 1) { + lastRewindingTime = System.currentTimeMillis(); + rewindingProgress = MediaController.getInstance().getPlayingMessageObject().audioProgress; + AndroidUtilities.cancelRunOnUIThread(forwardSeek); + AndroidUtilities.runOnUIThread(forwardSeek); + } + } + private void updateEmptyViewPosition() { if (emptyView.getVisibility() != View.VISIBLE) { return; @@ -1201,6 +1497,18 @@ public void didReceivedNotification(int id, int account, Object... args) { } } } + if (id == NotificationCenter.messagePlayingPlayStateChanged) { + if (MediaController.getInstance().getPlayingMessageObject() != null) { + if (MediaController.getInstance().isMessagePaused()) { + startForwardRewindingSeek(); + } else if (rewindingState == 1 && rewindingProgress != -1f) { + AndroidUtilities.cancelRunOnUIThread(forwardSeek); + lastUpdateRewindingPlayerTime = 0; + forwardSeek.run(); + rewindingProgress = -1f; + } + } + } } else if (id == NotificationCenter.messagePlayingDidStart) { MessageObject messageObject = (MessageObject) args[0]; if (messageObject.eventId != 0) { @@ -1433,7 +1741,12 @@ private void updateProgress(MessageObject messageObject, boolean animated) { if (seekBarView.isDragging()) { newTime = (int) (messageObject.getDuration() * seekBarView.getProgress()); } else { - seekBarView.setProgress(messageObject.audioProgress, animated); + boolean updateRewinding = rewindingProgress >= 0 && (rewindingState == -1 || (rewindingState == 1 && MediaController.getInstance().isMessagePaused())); + if (updateRewinding) { + seekBarView.setProgress(rewindingProgress, animated); + } else { + seekBarView.setProgress(messageObject.audioProgress, animated); + } float bufferedProgress; if (currentAudioFinishedLoading) { @@ -1450,7 +1763,12 @@ private void updateProgress(MessageObject messageObject, boolean animated) { if (bufferedProgress != -1) { seekBarView.setBufferedProgress(bufferedProgress); } - newTime = messageObject.audioProgressSec; + if (updateRewinding) { + newTime = (int) (messageObject.getDuration() * seekBarView.getProgress()); + messageObject.audioProgressSec = newTime; + } else { + newTime = messageObject.audioProgressSec; + } } if (lastTime != newTime) { lastTime = newTime; @@ -1999,6 +2317,8 @@ public abstract static class ClippingTextViewSwitcher extends FrameLayout { private int activeIndex; private AnimatorSet animatorSet; private LinearGradient gradientShader; + private int stableOffest = -1; + private final RectF rectF = new RectF(); public ClippingTextViewSwitcher(@NonNull Context context) { super(context); @@ -2028,7 +2348,27 @@ protected void onSizeChanged(int w, int h, int oldw, int oldh) { protected boolean drawChild(Canvas canvas, View child, long drawingTime) { final int index = child == textViews[0] ? 0 : 1; final boolean result; - if (clipProgress[index] > 0f) { + boolean hasStableRect = false; + if (stableOffest > 0 && textViews[activeIndex].getAlpha() != 1f && textViews[activeIndex].getLayout() != null) { + float x1 = textViews[activeIndex].getLayout().getPrimaryHorizontal(0); + float x2 = textViews[activeIndex].getLayout().getPrimaryHorizontal(stableOffest); + hasStableRect = true; + if (x1 == x2) { + hasStableRect = false; + } else if (x2 > x1) { + rectF.set(x1, 0, x2, getMeasuredHeight()); + } else { + rectF.set(x2, 0, x1, getMeasuredHeight()); + } + + if (hasStableRect && index == activeIndex) { + canvas.save(); + canvas.clipRect(rectF); + textViews[0].draw(canvas); + canvas.restore(); + } + } + if (clipProgress[index] > 0f || hasStableRect) { final int width = child.getWidth(); final int height = child.getHeight(); final int saveCount = canvas.saveLayer(0, 0, width, height, null, Canvas.ALL_SAVE_FLAG); @@ -2041,6 +2381,9 @@ protected boolean drawChild(Canvas canvas, View child, long drawingTime) { if (width > gradientEnd) { canvas.drawRect(gradientEnd, 0, width, height, erasePaint); } + if (hasStableRect) { + canvas.drawRect(rectF, erasePaint); + } canvas.restoreToCount(saveCount); } else { result = super.drawChild(canvas, child, drawingTime); @@ -2049,15 +2392,31 @@ protected boolean drawChild(Canvas canvas, View child, long drawingTime) { } public void setText(CharSequence text) { + setText(text, true); + } + + public void setText(CharSequence text, boolean animated) { final CharSequence currentText = textViews[activeIndex].getText(); - if (TextUtils.isEmpty(currentText)) { + if (TextUtils.isEmpty(currentText) || !animated) { textViews[activeIndex].setText(text); return; } else if (TextUtils.equals(text, currentText)) { return; } + stableOffest = 0; + int n = Math.min(text.length(), currentText.length()); + for (int i = 0; i < n; i++) { + if (text.charAt(i) != currentText.charAt(i)) { + break; + } + stableOffest++; + } + if (stableOffest <= 3) { + stableOffest = -1; + } + final int index = activeIndex == 0 ? 1 : 0; final int prevIndex = activeIndex; activeIndex = index; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarsImageView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarsImageView.java index 1ecf1577997..ba71a4be4b1 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarsImageView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarsImageView.java @@ -242,6 +242,7 @@ public void setObject(int index, int account, TLObject object) { protected void onDraw(Canvas canvas) { wasDraw = true; + int size = AndroidUtilities.dp(currentStyle == 4 ? 32 : 24); int toAdd = AndroidUtilities.dp(currentStyle == 4 ? 24 : 20); int drawCount = 0; for (int i = 0; i < 3; i++) { @@ -249,7 +250,7 @@ protected void onDraw(Canvas canvas) { drawCount++; } } - int ax = centered ? (getMeasuredWidth() - drawCount * toAdd - AndroidUtilities.dp(currentStyle == 4 ? 8 : 4)) / 2 : AndroidUtilities.dp(10); + int ax = centered ? (getMeasuredWidth() - drawCount * toAdd - AndroidUtilities.dp(currentStyle == 4 ? 8 : 4)) / 2 : (currentStyle == 0 ? 0 : AndroidUtilities.dp(10)); boolean isMuted = VoIPService.getSharedInstance() != null && VoIPService.getSharedInstance().isMicMute(); if (currentStyle == 4) { paint.setColor(Theme.getColor(Theme.key_inappPlayerBackground)); @@ -263,7 +264,7 @@ protected void onDraw(Canvas canvas) { animateToDrawCount++; } } - boolean useAlphaLayer = currentStyle == 3 || currentStyle == 4 || currentStyle == 5; + boolean useAlphaLayer = currentStyle == 0 || currentStyle == 1 || currentStyle == 3 || currentStyle == 4 || currentStyle == 5; if (useAlphaLayer) { canvas.saveLayerAlpha(0, 0, getMeasuredWidth(), getMeasuredHeight(), 255, Canvas.ALL_SAVE_FLAG); } @@ -289,7 +290,11 @@ protected void onDraw(Canvas canvas) { imageReceiver.setImageX(ax + toAdd * a); } - imageReceiver.setImageY(AndroidUtilities.dp(currentStyle == 4 ? 8 : 6)); + if (currentStyle == 0) { + imageReceiver.setImageY((getMeasuredHeight() - size) / 2f); + } else { + imageReceiver.setImageY(AndroidUtilities.dp(currentStyle == 4 ? 8 : 6)); + } boolean needRestore = false; float alpha = 1f; @@ -319,7 +324,7 @@ protected void onDraw(Canvas canvas) { float avatarScale = 1f; if (a != states.length - 1) { - if (currentStyle == 3 || currentStyle == 5) { + if (currentStyle == 1 || currentStyle == 3 || currentStyle == 5) { canvas.drawCircle(imageReceiver.getCenterX(), imageReceiver.getCenterY(), AndroidUtilities.dp(13), xRefP); if (states[a].wavesDrawable == null) { if (currentStyle == 5) { @@ -331,7 +336,7 @@ protected void onDraw(Canvas canvas) { if (currentStyle == 5) { states[a].wavesDrawable.setColor(ColorUtils.setAlphaComponent(Theme.getColor(Theme.key_voipgroup_speakingText), (int) (255 * 0.3f * alpha))); } - if (states[a].participant.amplitude > 0) { + if (states[a].participant != null && states[a].participant.amplitude > 0) { states[a].wavesDrawable.setShowWaves(true, this); float amplitude = states[a].participant.amplitude * 15f; states[a].wavesDrawable.setAmplitude(amplitude); @@ -368,13 +373,17 @@ protected void onDraw(Canvas canvas) { states[a].wavesDrawable.draw(canvas, imageReceiver.getCenterX(), imageReceiver.getCenterY(), this); avatarScale = states[a].wavesDrawable.getAvatarScale(); } else { - int paintAlpha = paint.getAlpha(); - if (alpha != 1f) { - paint.setAlpha((int) (paintAlpha * alpha)); - } - canvas.drawCircle(imageReceiver.getCenterX(), imageReceiver.getCenterY(), AndroidUtilities.dp(currentStyle == 4 ? 17 : 13), paint); - if (alpha != 1f) { - paint.setAlpha(paintAlpha); + if (useAlphaLayer) { + canvas.drawCircle(imageReceiver.getCenterX(), imageReceiver.getCenterY(), AndroidUtilities.dp(currentStyle == 4 ? 17 : 13), xRefP); + } else { + int paintAlpha = paint.getAlpha(); + if (alpha != 1f) { + paint.setAlpha((int) (paintAlpha * alpha)); + } + canvas.drawCircle(imageReceiver.getCenterX(), imageReceiver.getCenterY(), AndroidUtilities.dp(currentStyle == 4 ? 17 : 13), paint); + if (alpha != 1f) { + paint.setAlpha(paintAlpha); + } } } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Bulletin.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Bulletin.java index 576eaa31ca1..27dd5f98569 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Bulletin.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Bulletin.java @@ -6,13 +6,15 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.res.Configuration; +import android.graphics.Canvas; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.Rect; import android.graphics.Typeface; -import android.graphics.drawable.InsetDrawable; +import android.graphics.drawable.Drawable; import android.os.Build; import android.text.TextUtils; +import android.util.Property; import android.util.TypedValue; import android.view.GestureDetector; import android.view.Gravity; @@ -32,6 +34,7 @@ import androidx.core.util.Consumer; import androidx.core.view.ViewCompat; import androidx.dynamicanimation.animation.DynamicAnimation; +import androidx.dynamicanimation.animation.FloatPropertyCompat; import androidx.dynamicanimation.animation.SpringAnimation; import androidx.dynamicanimation.animation.SpringForce; @@ -104,7 +107,7 @@ public static void hide(@NonNull FrameLayout containerLayout, boolean animated) private boolean showing; private boolean canHide; - private int currentBottomOffset; + public int currentBottomOffset; private Delegate currentDelegate; private Layout.Transition layoutTransition; @@ -128,6 +131,10 @@ protected void onHide() { this.duration = duration; } + public static Bulletin getVisibleBulletin() { + return visibleBulletin; + } + public Bulletin show() { if (!showing) { showing = true; @@ -154,14 +161,12 @@ public void onLayoutChange(View v, int left, int top, int right, int bottom, int currentDelegate.onShow(Bulletin.this); } if (isTransitionsEnabled()) { - if (currentBottomOffset != 0) { - ViewCompat.setClipBounds(parentLayout, new Rect(left, top - currentBottomOffset, right, bottom - currentBottomOffset)); - } else { - ViewCompat.setClipBounds(parentLayout, null); - } ensureLayoutTransitionCreated(); + layout.transitionRunning = true; + layout.delegate = currentDelegate; + layout.invalidate(); layoutTransition.animateEnter(layout, layout::onEnterTransitionStart, () -> { - ViewCompat.setClipBounds(parentLayout, null); + layout.transitionRunning = false; layout.onEnterTransitionEnd(); setCanHide(true); }, offset -> { @@ -173,7 +178,7 @@ public void onLayoutChange(View v, int left, int top, int right, int bottom, int if (currentDelegate != null) { currentDelegate.onOffsetChange(layout.getHeight() - currentBottomOffset); } - layout.setTranslationY(-currentBottomOffset); + updatePosition(); layout.onEnterTransitionStart(); layout.onEnterTransitionEnd(); setCanHide(true); @@ -233,18 +238,16 @@ public void hide(boolean animated) { if (ViewCompat.isLaidOut(layout)) { layout.removeCallbacks(hideRunnable); if (animated) { - if (bottomOffset != 0) { - ViewCompat.setClipBounds(parentLayout, new Rect(layout.getLeft(), layout.getTop() - bottomOffset, layout.getRight(), layout.getBottom() - bottomOffset)); - } else { - ViewCompat.setClipBounds(parentLayout, null); - } + layout.transitionRunning = true; + layout.delegate = currentDelegate; + layout.invalidate(); ensureLayoutTransitionCreated(); layoutTransition.animateExit(layout, layout::onExitTransitionStart, () -> { if (currentDelegate != null) { currentDelegate.onOffsetChange(0); currentDelegate.onHide(this); } - ViewCompat.setClipBounds(parentLayout, null); + layout.transitionRunning = false; layout.onExitTransitionEnd(); layout.onHide(); containerLayout.removeView(parentLayout); @@ -284,6 +287,10 @@ private static boolean isTransitionsEnabled() { return MessagesController.getGlobalMainSettings().getBoolean("view_animations", true) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2; } + public void updatePosition() { + layout.updatePosition(); + } + @Retention(SOURCE) @IntDef(value = {ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT}) private @interface WidthDef { @@ -461,6 +468,9 @@ default void onHide(Bulletin bulletin) { public abstract static class Layout extends FrameLayout { private final List callbacks = new ArrayList<>(); + public boolean transitionRunning; + Delegate delegate; + public float inOutOffset; protected Bulletin bulletin; @@ -473,13 +483,42 @@ public Layout(@NonNull Context context) { this(context, Theme.getColor(Theme.key_undo_background)); } + Drawable background; + public Layout(@NonNull Context context, @ColorInt int backgroundColor) { super(context); setMinimumHeight(AndroidUtilities.dp(48)); - setBackground(new InsetDrawable(Theme.createRoundRectDrawable(AndroidUtilities.dp(6), backgroundColor), AndroidUtilities.dp(8))); + background = Theme.createRoundRectDrawable(AndroidUtilities.dp(6), backgroundColor); updateSize(); + setPadding(AndroidUtilities.dp(8), AndroidUtilities.dp(8), AndroidUtilities.dp(8), AndroidUtilities.dp(8)); + setWillNotDraw(false); } + public final static FloatPropertyCompat IN_OUT_OFFSET_Y = new FloatPropertyCompat("offsetY") { + @Override + public float getValue(Layout object) { + return object.inOutOffset; + } + + @Override + public void setValue(Layout object, float value) { + object.setInOutOffset(value); + } + }; + + public final static Property IN_OUT_OFFSET_Y2 = new AnimationProperties.FloatProperty("offsetY") { + + @Override + public Float get(Layout layout) { + return layout.inOutOffset; + } + + @Override + public void setValue(Layout object, float value) { + object.setInOutOffset(value); + } + }; + @Override protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); @@ -602,6 +641,14 @@ public void removeCallback(@NonNull Callback callback) { callbacks.remove(callback); } + public void updatePosition() { + float tranlsation = 0; + if (delegate != null) { + tranlsation += delegate.getBottomOffset() ; + } + setTranslationY(-tranlsation + inOutOffset); + } + public interface Callback { void onAttach(@NonNull Layout layout, @NonNull Bulletin bulletin); @@ -637,7 +684,11 @@ public static class DefaultTransition implements Transition { @Override public void animateEnter(@NonNull Layout layout, @Nullable Runnable startAction, @Nullable Runnable endAction, @Nullable Consumer onUpdate, int bottomOffset) { - final ObjectAnimator animator = ObjectAnimator.ofFloat(layout, View.TRANSLATION_Y, layout.getHeight(), -bottomOffset); + layout.setInOutOffset(layout.getMeasuredHeight()); + if (onUpdate != null) { + onUpdate.accept(layout.getTranslationY()); + } + final ObjectAnimator animator = ObjectAnimator.ofFloat(layout, IN_OUT_OFFSET_Y2, 0); animator.setDuration(225); animator.setInterpolator(Easings.easeOutQuad); if (startAction != null || endAction != null) { @@ -658,14 +709,14 @@ public void onAnimationEnd(Animator animation) { }); } if (onUpdate != null) { - animator.addUpdateListener(a -> onUpdate.accept((Float) a.getAnimatedValue())); + animator.addUpdateListener(a -> onUpdate.accept(layout.getTranslationY())); } animator.start(); } @Override public void animateExit(@NonNull Layout layout, @Nullable Runnable startAction, @Nullable Runnable endAction, @Nullable Consumer onUpdate, int bottomOffset) { - final ObjectAnimator animator = ObjectAnimator.ofFloat(layout, View.TRANSLATION_Y, layout.getTranslationY(), layout.getHeight()); + final ObjectAnimator animator = ObjectAnimator.ofFloat(layout, IN_OUT_OFFSET_Y2, layout.getHeight()); animator.setDuration(175); animator.setInterpolator(Easings.easeInQuad); if (startAction != null || endAction != null) { @@ -686,7 +737,7 @@ public void onAnimationEnd(Animator animation) { }); } if (onUpdate != null) { - animator.addUpdateListener(a -> onUpdate.accept((Float) a.getAnimatedValue())); + animator.addUpdateListener(a -> onUpdate.accept(layout.getTranslationY())); } animator.start(); } @@ -699,23 +750,23 @@ public static class SpringTransition implements Transition { @Override public void animateEnter(@NonNull Layout layout, @Nullable Runnable startAction, @Nullable Runnable endAction, @Nullable Consumer onUpdate, int bottomOffset) { - final int translationY = layout.getHeight() - bottomOffset; - layout.setTranslationY(translationY); + layout.setInOutOffset(layout.getMeasuredHeight()); if (onUpdate != null) { - onUpdate.accept((float) translationY); + onUpdate.accept(layout.getTranslationY()); } - final SpringAnimation springAnimation = new SpringAnimation(layout, SpringAnimation.TRANSLATION_Y, -bottomOffset); + final SpringAnimation springAnimation = new SpringAnimation(layout, IN_OUT_OFFSET_Y, 0); springAnimation.getSpring().setDampingRatio(DAMPING_RATIO); springAnimation.getSpring().setStiffness(STIFFNESS); if (endAction != null) { springAnimation.addEndListener((animation, canceled, value, velocity) -> { + layout.setInOutOffset(0); if (!canceled) { endAction.run(); } }); } if (onUpdate != null) { - springAnimation.addUpdateListener((animation, value, velocity) -> onUpdate.accept(value)); + springAnimation.addUpdateListener((animation, value, velocity) -> onUpdate.accept(layout.getTranslationY())); } springAnimation.start(); if (startAction != null) { @@ -725,7 +776,7 @@ public void animateEnter(@NonNull Layout layout, @Nullable Runnable startAction, @Override public void animateExit(@NonNull Layout layout, @Nullable Runnable startAction, @Nullable Runnable endAction, @Nullable Consumer onUpdate,int bottomOffset) { - final SpringAnimation springAnimation = new SpringAnimation(layout, SpringAnimation.TRANSLATION_Y, layout.getHeight() - bottomOffset); + final SpringAnimation springAnimation = new SpringAnimation(layout, IN_OUT_OFFSET_Y, layout.getHeight()); springAnimation.getSpring().setDampingRatio(DAMPING_RATIO); springAnimation.getSpring().setStiffness(STIFFNESS); if (endAction != null) { @@ -736,7 +787,7 @@ public void animateExit(@NonNull Layout layout, @Nullable Runnable startAction, }); } if (onUpdate != null) { - springAnimation.addUpdateListener((animation, value, velocity) -> onUpdate.accept(value)); + springAnimation.addUpdateListener((animation, value, velocity) -> onUpdate.accept(layout.getTranslationY())); } springAnimation.start(); if (startAction != null) { @@ -744,6 +795,30 @@ public void animateExit(@NonNull Layout layout, @Nullable Runnable startAction, } } } + + private void setInOutOffset(float offset) { + inOutOffset = offset; + updatePosition(); + } + + @Override + protected void dispatchDraw(Canvas canvas) { + background.setBounds(AndroidUtilities.dp(8), AndroidUtilities.dp(8), getMeasuredWidth() - AndroidUtilities.dp(8), getMeasuredHeight() - AndroidUtilities.dp(8)); + if (transitionRunning && delegate != null) { + int clipBottom = ((View)getParent()).getMeasuredHeight() - delegate.getBottomOffset(); + int viewBottom = (int) (getY() + getMeasuredHeight()); + canvas.save(); + canvas.clipRect(0, 0, getMeasuredWidth(), getMeasuredHeight() - (viewBottom - clipBottom)); + background.draw(canvas); + super.dispatchDraw(canvas); + canvas.restore(); + invalidate(); + } else { + background.draw(canvas); + super.dispatchDraw(canvas); + } + } + //endregion } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/BulletinFactory.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/BulletinFactory.java index 48e2a80dbd7..a40d749b1b9 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BulletinFactory.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/BulletinFactory.java @@ -1,6 +1,7 @@ package org.telegram.ui.Components; import android.content.Context; +import android.view.ViewGroup; import android.widget.FrameLayout; import androidx.annotation.CheckResult; @@ -25,6 +26,20 @@ public static boolean canShowBulletin(BaseFragment fragment) { return fragment != null && fragment.getParentActivity() != null && fragment.getLayoutContainer() != null; } + public Bulletin createMembersNotifyInfo(boolean on) { + if (on) { + final Bulletin.LottieLayout layout = new Bulletin.LottieLayout(getContext()); + layout.setAnimation(R.raw.silent_unmute, 36, 36, "NULL BODY", "BODY", "Waves R", "Waves L", "Bottom"); + layout.textView.setText(LocaleController.getString("ChannelNotifyMembersInfoOn", R.string.ChannelNotifyMembersInfoOn)); + return create(layout, Bulletin.DURATION_SHORT); + } else { + final Bulletin.LottieLayout layout = new Bulletin.LottieLayout(getContext()); + layout.setAnimation(R.raw.silent_mute, 36, 36, "NULL BODY", "BODY", "Pieces", "Line Cross", "Bottom"); + layout.textView.setText(LocaleController.getString("ChannelNotifyMembersInfoOff", R.string.ChannelNotifyMembersInfoOff)); + return create(layout, Bulletin.DURATION_SHORT); + } + } + public enum FileType { PHOTO("PhotoSavedHint", R.string.PhotoSavedHint, Icon.SAVED_TO_GALLERY), @@ -289,6 +304,11 @@ public static Bulletin createCopyLinkBulletin(BaseFragment fragment) { return of(fragment).createCopyLinkBulletin(); } + @CheckResult + public static Bulletin createCopyLinkBulletin(FrameLayout containerView) { + return of(containerView).createCopyLinkBulletin(); + } + @CheckResult public static Bulletin createPinMessageBulletin(BaseFragment fragment) { return createPinMessageBulletin(fragment, true, null, null); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java index fcd009cc416..6ca0e8f4871 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java @@ -218,6 +218,7 @@ default void onTrendingStickersShowed(boolean show) { private NumberTextView captionLimitView; private int currentLimit = -1; private int codePointCount; + CrossOutDrawable notifySilentDrawable; private class SeekBarWaveformView extends View { @@ -353,6 +354,8 @@ public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo i public ValueAnimator currentTopViewAnimation; private ReplaceableIconDrawable botButtonDrawablel; + private boolean isPaste; + private boolean destroyed; private MessageObject editingMessageObject; @@ -1771,6 +1774,14 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { } isInitLineCount = false; } + + @Override + public boolean onTextContextMenuItem(int id) { + if (id == android.R.id.paste) { + isPaste = true; + } + return super.onTextContextMenuItem(id); + } }; messageEditText.setDelegate(() -> { if (delegate != null) { @@ -1780,7 +1791,7 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { messageEditText.setWindowView(parentActivity.getWindow().getDecorView()); TLRPC.EncryptedChat encryptedChat = parentFragment != null ? parentFragment.getCurrentEncryptedChat() : null; messageEditText.setAllowTextEntitiesIntersection(supportsSendingNewEntities()); - updateFieldHint(); + updateFieldHint(false); int flags = EditorInfo.IME_FLAG_NO_EXTRACT_UI; if (encryptedChat != null) { flags |= 0x01000000; //EditorInfo.IME_FLAG_NO_PERSONALIZED_LEARNING; @@ -1876,9 +1887,10 @@ public void onTextChanged(CharSequence charSequence, int start, int before, int if (innerTextChange == 1) { return; } - if (sendByEnter && editingMessageObject == null && count > before && charSequence.length() > 0 && count == 1 && before == 0 && charSequence.length() == start + count && charSequence.charAt(charSequence.length() - 1) == '\n') { + if (sendByEnter && !isPaste && editingMessageObject == null && count > before && charSequence.length() > 0 && charSequence.length() == start + count && charSequence.charAt(charSequence.length() - 1) == '\n') { nextChangeIsSend = true; } + isPaste = false; checkSendButton(true); CharSequence message = AndroidUtilities.getTrimmedString(charSequence.toString()); if (delegate != null) { @@ -2036,7 +2048,9 @@ public void onAnimationEnd(Animator animation) { }); notifyButton = new ImageView(context); - notifyButton.setImageResource(silent ? R.drawable.input_notify_off : R.drawable.input_notify_on); + notifySilentDrawable = new CrossOutDrawable(context, R.drawable.input_notify_on, Theme.key_chat_messagePanelIcons); + notifyButton.setImageDrawable(notifySilentDrawable); + notifySilentDrawable.setCrossOut(silent, false); notifyButton.setContentDescription(silent ? LocaleController.getString("AccDescrChanSilentOn", R.string.AccDescrChanSilentOn) : LocaleController.getString("AccDescrChanSilentOff", R.string.AccDescrChanSilentOff)); notifyButton.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_messagePanelIcons), PorterDuff.Mode.MULTIPLY)); notifyButton.setScaleType(ImageView.ScaleType.CENTER); @@ -2052,7 +2066,11 @@ public void onAnimationEnd(Animator animation) { @Override public void onClick(View v) { silent = !silent; - notifyButton.setImageResource(silent ? R.drawable.input_notify_off : R.drawable.input_notify_on); + if (notifySilentDrawable == null) { + notifySilentDrawable = new CrossOutDrawable(context, R.drawable.input_notify_on, Theme.key_chat_messagePanelIcons); + } + notifySilentDrawable.setCrossOut(silent, true); + notifyButton.setImageDrawable(notifySilentDrawable); MessagesController.getNotificationsSettings(currentAccount).edit().putBoolean("silent_" + dialog_id, silent).commit(); NotificationsController.getInstance(currentAccount).updateServerNotificationsSettings(dialog_id); try { @@ -2062,15 +2080,9 @@ public void onClick(View v) { } catch (Exception e) { FileLog.e(e); } - if (silent) { - visibleToast = Toast.makeText(parentActivity, LocaleController.getString("ChannelNotifyMembersInfoOff", R.string.ChannelNotifyMembersInfoOff), Toast.LENGTH_SHORT); - visibleToast.show(); - } else { - visibleToast = Toast.makeText(parentActivity, LocaleController.getString("ChannelNotifyMembersInfoOn", R.string.ChannelNotifyMembersInfoOn), Toast.LENGTH_SHORT); - visibleToast.show(); - } + BulletinFactory.of(fragment).createMembersNotifyInfo(!silent).show(); notifyButton.setContentDescription(silent ? LocaleController.getString("AccDescrChanSilentOn", R.string.AccDescrChanSilentOn) : LocaleController.getString("AccDescrChanSilentOff", R.string.AccDescrChanSilentOff)); - updateFieldHint(); + updateFieldHint(true); } }); @@ -3434,7 +3446,7 @@ public void setDialogId(long id, int account) { updateScheduleButton(false); checkRoundVideo(); - updateFieldHint(); + updateFieldHint(false); } public void setChatInfo(TLRPC.ChatFull chatInfo) { @@ -3495,7 +3507,7 @@ public boolean hasRecordVideo() { return hasRecordVideo; } - private void updateFieldHint() { + private void updateFieldHint(boolean animated) { if (editingMessageObject != null) { messageEditText.setHintText(editingCaption ? LocaleController.getString("Caption", R.string.Caption) : LocaleController.getString("TypeMessage", R.string.TypeMessage)); } else { @@ -3517,9 +3529,9 @@ private void updateFieldHint() { } } else if (isChannel) { if (silent) { - messageEditText.setHintText(LocaleController.getString("ChannelSilentBroadcast", R.string.ChannelSilentBroadcast)); + messageEditText.setHintText(LocaleController.getString("ChannelSilentBroadcast", R.string.ChannelSilentBroadcast), animated); } else { - messageEditText.setHintText(LocaleController.getString("ChannelBroadcast", R.string.ChannelBroadcast)); + messageEditText.setHintText(LocaleController.getString("ChannelBroadcast", R.string.ChannelBroadcast), animated); } } else { messageEditText.setHintText(LocaleController.getString("TypeMessage", R.string.TypeMessage)); @@ -5454,7 +5466,7 @@ public void setEditingMessageObject(MessageObject messageObject, boolean caption } updateFieldRight(1); } - updateFieldHint(); + updateFieldHint(false); } public ImageView getAttachButton() { @@ -5654,7 +5666,11 @@ public void updateScheduleButton(boolean animated) { canWriteToChannel = ChatObject.isChannel(currentChat) && (currentChat.creator || currentChat.admin_rights != null && currentChat.admin_rights.post_messages) && !currentChat.megagroup; if (notifyButton != null) { notifyVisible = canWriteToChannel; - notifyButton.setImageResource(silent ? R.drawable.input_notify_off : R.drawable.input_notify_on); + if (notifySilentDrawable == null) { + notifySilentDrawable = new CrossOutDrawable(getContext(), R.drawable.input_notify_on, Theme.key_chat_messagePanelIcons); + } + notifySilentDrawable.setCrossOut(silent, false); + notifyButton.setImageDrawable(notifySilentDrawable); } if (attachLayout != null) { updateFieldRight(attachLayout.getVisibility() == VISIBLE ? 1 : 0); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertLocationLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertLocationLayout.java index 5ab56a1048e..d17c102d6fe 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertLocationLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertLocationLayout.java @@ -1578,15 +1578,19 @@ void onShow() { } } fixLayoutInternal(true); - if (checkPermission && Build.VERSION.SDK_INT >= 23) { - Activity activity = getParentActivity(); - if (activity != null) { - checkPermission = false; - if (activity.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { - activity.requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, 2); + boolean keyboardVisible = parentAlert.delegate.needEnterComment(); + AndroidUtilities.runOnUIThread(() -> { + if (checkPermission && Build.VERSION.SDK_INT >= 23) { + Activity activity = getParentActivity(); + if (activity != null) { + checkPermission = false; + if (activity.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { + activity.requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, 2); + } } } - } + }, keyboardVisible ? 200 : 0); + layoutManager.scrollToPositionWithOffset(0, 0); updateClipView(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertPhotoLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertPhotoLayout.java index 685852f1dd6..51d31e9f0bb 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertPhotoLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAttachAlertPhotoLayout.java @@ -40,6 +40,7 @@ import android.view.ViewGroup; import android.view.ViewOutlineProvider; import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityNodeInfo; import android.view.animation.DecelerateInterpolator; import android.widget.FrameLayout; import android.widget.ImageView; @@ -441,12 +442,19 @@ public ChatAttachAlertPhotoLayout(ChatAttachAlert alert, Context context) { cameraDrawable = context.getResources().getDrawable(R.drawable.instant_camera).mutate(); ActionBarMenu menu = parentAlert.actionBar.createMenu(); - dropDownContainer = new ActionBarMenuItem(context, menu, 0, 0); + dropDownContainer = new ActionBarMenuItem(context, menu, 0, 0) { + @Override + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(info); + info.setText(dropDown.getText()); + } + }; dropDownContainer.setSubMenuOpenSide(1); parentAlert.actionBar.addView(dropDownContainer, 0, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT, AndroidUtilities.isTablet() ? 64 : 56, 0, 40, 0)); dropDownContainer.setOnClickListener(view -> dropDownContainer.toggleSubMenu()); dropDown = new TextView(context); + dropDown.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO); dropDown.setGravity(Gravity.LEFT); dropDown.setSingleLine(true); dropDown.setLines(1); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAvatarContainer.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAvatarContainer.java index a7bf924b63a..d3e08bc06c6 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAvatarContainer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatAvatarContainer.java @@ -264,14 +264,14 @@ public void setTitleIcons(Drawable leftIcon, Drawable rightIcon) { } public void setTitle(CharSequence value) { - setTitle(value, false); + setTitle(value, false, false); } - public void setTitle(CharSequence value, boolean scam) { + public void setTitle(CharSequence value, boolean scam, boolean fake) { titleTextView.setText(value); - if (scam) { + if (scam || fake) { if (!(titleTextView.getRightDrawable() instanceof ScamDrawable)) { - ScamDrawable drawable = new ScamDrawable(11); + ScamDrawable drawable = new ScamDrawable(11, scam ? 0 : 1); drawable.setColor(Theme.getColor(Theme.key_actionBarDefaultSubtitle)); titleTextView.setRightDrawable(drawable); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatGreetingsView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatGreetingsView.java index 43f41924453..191adaa202a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatGreetingsView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatGreetingsView.java @@ -8,12 +8,14 @@ import android.widget.TextView; import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.DocumentObject; import org.telegram.messenger.Emoji; import org.telegram.messenger.FileLoader; import org.telegram.messenger.ImageLocation; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MessageObject; import org.telegram.messenger.R; +import org.telegram.messenger.SvgHelper; import org.telegram.messenger.UserConfig; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLRPC; @@ -53,8 +55,13 @@ public ChatGreetingsView(Context context, TLRPC.User user, int distance, TLRPC.D updateColors(); - titleView.setText(LocaleController.formatString("NearbyPeopleGreetingsMessage", R.string.NearbyPeopleGreetingsMessage, user.first_name, LocaleController.formatDistance(distance, 1))); - descriptionView.setText(LocaleController.getString("NearbyPeopleGreetingsDescription", R.string.NearbyPeopleGreetingsDescription)); + if (distance <= 0) { + titleView.setText(LocaleController.getString("NoMessages", R.string.NoMessages)); + descriptionView.setText(LocaleController.getString("NoMessagesGreetingsDescription", R.string.NoMessagesGreetingsDescription)); + } else { + titleView.setText(LocaleController.formatString("NearbyPeopleGreetingsMessage", R.string.NearbyPeopleGreetingsMessage, user.first_name, LocaleController.formatDistance(distance, 1))); + descriptionView.setText(LocaleController.getString("NearbyPeopleGreetingsDescription", R.string.NearbyPeopleGreetingsDescription)); + } if (preloadedGreetingsSticker == null) { TLRPC.TL_messages_getStickers req = new TLRPC.TL_messages_getStickers(); @@ -64,27 +71,23 @@ public ChatGreetingsView(Context context, TLRPC.User user, int distance, TLRPC.D ArrayList list = ((TLRPC.TL_messages_stickers) response).stickers; if (!list.isEmpty()) { TLRPC.Document sticker = list.get(Math.abs(new Random().nextInt() % list.size())); - AndroidUtilities.runOnUIThread(() -> { - setSticker(sticker); - }); + AndroidUtilities.runOnUIThread(() -> setSticker(sticker)); } } }); - } else { setSticker(preloadedGreetingsSticker); } } private void setSticker(TLRPC.Document sticker) { - TLRPC.PhotoSize thumb = FileLoader.getClosestPhotoSizeWithSize(sticker.thumbs, 90); - - - stickerToSendView.setImage( - ImageLocation.getForDocument(sticker), createFilter(sticker), - ImageLocation.getForDocument(thumb, sticker), null, - 0, sticker - ); + SvgHelper.SvgDrawable svgThumb = DocumentObject.getSvgThumb(sticker, Theme.key_chat_serviceBackground, 1.0f); + if (svgThumb != null) { + stickerToSendView.setImage(ImageLocation.getForDocument(sticker), createFilter(sticker), svgThumb, 0, sticker); + } else { + TLRPC.PhotoSize thumb = FileLoader.getClosestPhotoSizeWithSize(sticker.thumbs, 90); + stickerToSendView.setImage(ImageLocation.getForDocument(sticker), createFilter(sticker), ImageLocation.getForDocument(thumb, sticker), null, 0, sticker); + } stickerToSendView.setOnClickListener(v -> { if (listener != null) { listener.onGreetings(sticker); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChecksHintView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChecksHintView.java new file mode 100644 index 00000000000..c7c2d7e8f73 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChecksHintView.java @@ -0,0 +1,209 @@ +package org.telegram.ui.Components; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; +import android.content.Context; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.View; +import android.view.animation.OvershootInterpolator; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.TextView; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.R; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Cells.ChatMessageCell; + + +@SuppressWarnings("FieldCanBeLocal") +public class ChecksHintView extends FrameLayout { + + private TextView[] textView = new TextView[2]; + private RLottieImageView[] imageView = new RLottieImageView[2]; + private ImageView arrowImageView; + private ChatMessageCell messageCell; + private View currentView; + private AnimatorSet animatorSet; + private Runnable hideRunnable; + private float translationY; + + private long showingDuration = 2000; + + public ChecksHintView(Context context) { + super(context); + + FrameLayout backgroundView = new FrameLayout(context); + backgroundView.setBackground(Theme.createRoundRectDrawable(AndroidUtilities.dp(6), Theme.getColor(Theme.key_chat_gifSaveHintBackground))); + backgroundView.setPadding(AndroidUtilities.dp(8), AndroidUtilities.dp(8), 0, AndroidUtilities.dp(8)); + addView(backgroundView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 0, 0, 0, 6)); + + for (int a = 0; a < 2; a++) { + imageView[a] = new RLottieImageView(context); + imageView[a].setScaleType(ImageView.ScaleType.CENTER); + backgroundView.addView(imageView[a], LayoutHelper.createFrame(24, 24, Gravity.LEFT | Gravity.TOP, 0, a == 0 ? 0 : 24, 0, 0)); + + textView[a] = new TextView(context); + textView[a].setTextColor(Theme.getColor(Theme.key_chat_gifSaveHintText)); + textView[a].setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + textView[a].setMaxLines(1); + textView[a].setSingleLine(true); + textView[a].setMaxWidth(AndroidUtilities.dp(250)); + textView[a].setGravity(Gravity.LEFT | Gravity.TOP); + textView[a].setPivotX(0); + backgroundView.addView(textView[a], LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, 32, a == 0 ? 2 : 26, 10, 0)); + + if (a == 0) { + imageView[a].setAnimation(R.raw.ticks_single, 24, 24); + textView[a].setText(LocaleController.getString("HintSent", R.string.HintSent)); + } else { + imageView[a].setAnimation(R.raw.ticks_double, 24, 24); + textView[a].setText(LocaleController.getString("HintRead", R.string.HintRead)); + } + imageView[a].playAnimation(); + } + + arrowImageView = new ImageView(context); + arrowImageView.setImageResource(R.drawable.tooltip_arrow); + arrowImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chat_gifSaveHintBackground), PorterDuff.Mode.MULTIPLY)); + addView(arrowImageView, LayoutHelper.createFrame(14, 6, Gravity.LEFT | Gravity.BOTTOM, 0, 0, 0, 0)); + } + + public float getBaseTranslationY() { + return translationY; + } + + public boolean showForMessageCell(ChatMessageCell cell, boolean animated) { + if (hideRunnable != null) { + AndroidUtilities.cancelRunOnUIThread(hideRunnable); + hideRunnable = null; + } + int[] position = new int[2]; + cell.getLocationInWindow(position); + int top = position[1]; + View p = (View) getParent(); + p.getLocationInWindow(position); + top -= position[1]; + + View parentView = (View) cell.getParent(); + + measure(MeasureSpec.makeMeasureSpec(1000, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(1000, MeasureSpec.AT_MOST)); + + if (top <= getMeasuredHeight() + AndroidUtilities.dp(10)) { + return false; + } + top += cell.getChecksY() + AndroidUtilities.dp(6); + int centerX = cell.getChecksX() + AndroidUtilities.dp(5); + + int parentWidth = parentView.getMeasuredWidth(); + setTranslationY(translationY = top - getMeasuredHeight()); + int iconX = cell.getLeft() + centerX; + int left = AndroidUtilities.dp(15); + if (iconX > parentView.getMeasuredWidth() / 2) { + int offset = parentWidth - getMeasuredWidth() - AndroidUtilities.dp(20); + setTranslationX(offset); + left += offset; + } else { + setTranslationX(0); + } + float arrowX = cell.getLeft() + centerX - left - arrowImageView.getMeasuredWidth() / 2; + arrowImageView.setTranslationX(arrowX); + if (iconX > parentView.getMeasuredWidth() / 2) { + if (arrowX < AndroidUtilities.dp(10)) { + float diff = arrowX - AndroidUtilities.dp(10); + setTranslationX(getTranslationX() + diff); + arrowImageView.setTranslationX(arrowX - diff); + } + } else { + if (arrowX > getMeasuredWidth() - AndroidUtilities.dp(14 + 10)) { + float diff = arrowX - getMeasuredWidth() + AndroidUtilities.dp(14 + 10); + setTranslationX(diff); + arrowImageView.setTranslationX(arrowX - diff); + } else if (arrowX < AndroidUtilities.dp(10)) { + float diff = arrowX - AndroidUtilities.dp(10); + setTranslationX(getTranslationX() + diff); + arrowImageView.setTranslationX(arrowX - diff); + } + } + setPivotX(arrowX); + setPivotY(getMeasuredHeight()); + + messageCell = cell; + if (animatorSet != null) { + animatorSet.cancel(); + animatorSet = null; + } + + setTag(1); + setVisibility(VISIBLE); + if (animated) { + animatorSet = new AnimatorSet(); + animatorSet.playTogether( + ObjectAnimator.ofFloat(this, View.ALPHA, 0.0f, 1.0f), + ObjectAnimator.ofFloat(this, View.SCALE_X, 0.0f, 1.0f), + ObjectAnimator.ofFloat(this, View.SCALE_Y, 0.0f, 1.0f) + ); + animatorSet.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + animatorSet = null; + AndroidUtilities.runOnUIThread(hideRunnable = () -> hide(), 3000); + } + }); + animatorSet.setDuration(180); + animatorSet.start(); + + for (int a = 0; a < 2; a++) { + final int num = a; + textView[a].animate().scaleX(1.04f).scaleY(1.04f).setInterpolator(CubicBezierInterpolator.EASE_IN).setStartDelay((a == 0 ? 132 : 500) + 140).setDuration(100).setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + textView[num].animate().scaleX(1.0f).scaleY(1.0f).setInterpolator(CubicBezierInterpolator.EASE_OUT).setStartDelay(0).setDuration(100).start(); + } + }).start(); + } + } else { + setAlpha(1.0f); + } + + return true; + } + + public void hide() { + if (getTag() == null) { + return; + } + setTag(null); + if (hideRunnable != null) { + AndroidUtilities.cancelRunOnUIThread(hideRunnable); + hideRunnable = null; + } + if (animatorSet != null) { + animatorSet.cancel(); + animatorSet = null; + } + animatorSet = new AnimatorSet(); + animatorSet.playTogether( + ObjectAnimator.ofFloat(this, View.ALPHA, 0.0f), + ObjectAnimator.ofFloat(this, View.SCALE_X, 0.0f), + ObjectAnimator.ofFloat(this, View.SCALE_Y, 0.0f) + ); + animatorSet.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + setVisibility(View.INVISIBLE); + currentView = null; + messageCell = null; + animatorSet = null; + } + }); + animatorSet.setDuration(180); + animatorSet.start(); + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/CounterView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/CounterView.java new file mode 100644 index 00000000000..9737a68ccb5 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/CounterView.java @@ -0,0 +1,311 @@ +package org.telegram.ui.Components; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ValueAnimator; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.RectF; +import android.text.Layout; +import android.text.SpannableStringBuilder; +import android.text.StaticLayout; +import android.text.TextPaint; +import android.view.Gravity; +import android.view.View; +import android.view.animation.OvershootInterpolator; + +import com.google.android.exoplayer2.util.Log; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.ui.ActionBar.Theme; + +public class CounterView extends View { + + private final static int ANIMATION_TYPE_IN = 0; + private final static int ANIMATION_TYPE_OUT = 1; + private final static int ANIMATION_TYPE_REPLACE = 2; + + int animationType = -1; + + Paint circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG); + TextPaint textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); + RectF rectF = new RectF(); + + int currentCount; + private boolean countAnimationIncrement; + private ValueAnimator countAnimator; + private float countChangeProgress = 1f; + private StaticLayout countLayout; + private StaticLayout countOldLayout; + private StaticLayout countAnimationStableLayout; + private StaticLayout countAnimationInLayout; + + private int countWidthOld; + private int countWidth; + + private int circleColor; + private int textColor; + private String textColorKey = Theme.key_chat_goDownButtonCounter; + private String circleColorKey = Theme.key_chat_goDownButtonCounterBackground; + + int lastH; + int gravity = Gravity.CENTER; + float countLeft; + float x; + + private boolean reverseAnimation; + public float horizontalPadding; + + + public CounterView(Context context) { + super(context); + setVisibility(View.GONE); + circlePaint.setColor(Color.BLACK); + + textPaint.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + textPaint.setTextSize(AndroidUtilities.dp(13)); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + if (getMeasuredHeight() != lastH) { + int count = currentCount; + currentCount = -1; + setCount(count, animationType == ANIMATION_TYPE_IN); + lastH = getMeasuredHeight(); + } + } + + public void setCount(int count, boolean animated) { + if (count == currentCount) { + return; + } + if (countAnimator != null) { + countAnimator.cancel(); + } + if (count > 0) { + setVisibility(View.VISIBLE); + } + if (!animated) { + currentCount = count; + if (count == 0) { + setVisibility(View.GONE); + return; + } + String newStr = String.valueOf(count); + countWidth = Math.max(AndroidUtilities.dp(12), (int) Math.ceil(textPaint.measureText(newStr))); + countLayout = new StaticLayout(newStr, textPaint, countWidth, Layout.Alignment.ALIGN_CENTER, 1.0f, 0.0f, false); + invalidate(); + } + String newStr = String.valueOf(count); + + if (animated) { + if (countAnimator != null) { + countAnimator.cancel(); + } + countChangeProgress = 0f; + countAnimator = ValueAnimator.ofFloat(0, 1f); + countAnimator.addUpdateListener(valueAnimator -> { + countChangeProgress = (float) valueAnimator.getAnimatedValue(); + invalidate(); + }); + countAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + animationType = -1; + countChangeProgress = 1f; + countOldLayout = null; + countAnimationStableLayout = null; + countAnimationInLayout = null; + if (currentCount == 0) { + setVisibility(View.GONE); + } + invalidate(); + } + }); + if (currentCount <= 0) { + animationType = ANIMATION_TYPE_IN; + countAnimator.setDuration(220); + countAnimator.setInterpolator(new OvershootInterpolator()); + } else if (count == 0) { + animationType = ANIMATION_TYPE_OUT; + countAnimator.setDuration(150); + countAnimator.setInterpolator(CubicBezierInterpolator.DEFAULT); + } else { + animationType = ANIMATION_TYPE_REPLACE; + countAnimator.setDuration(430); + countAnimator.setInterpolator(CubicBezierInterpolator.DEFAULT); + } + if (countLayout != null) { + String oldStr = String.valueOf(currentCount); + + if (oldStr.length() == newStr.length()) { + SpannableStringBuilder oldSpannableStr = new SpannableStringBuilder(oldStr); + SpannableStringBuilder newSpannableStr = new SpannableStringBuilder(newStr); + SpannableStringBuilder stableStr = new SpannableStringBuilder(newStr); + for (int i = 0; i < oldStr.length(); i++) { + if (oldStr.charAt(i) == newStr.charAt(i)) { + oldSpannableStr.setSpan(new EmptyStubSpan(), i, i + 1, 0); + newSpannableStr.setSpan(new EmptyStubSpan(), i, i + 1, 0); + } else { + stableStr.setSpan(new EmptyStubSpan(), i, i + 1, 0); + } + } + + int countOldWidth = Math.max(AndroidUtilities.dp(12), (int) Math.ceil(textPaint.measureText(oldStr))); + countOldLayout = new StaticLayout(oldSpannableStr, textPaint, countOldWidth, Layout.Alignment.ALIGN_CENTER, 1.0f, 0.0f, false); + countAnimationStableLayout = new StaticLayout(stableStr, textPaint, countOldWidth, Layout.Alignment.ALIGN_CENTER, 1.0f, 0.0f, false); + countAnimationInLayout = new StaticLayout(newSpannableStr, textPaint, countOldWidth, Layout.Alignment.ALIGN_CENTER, 1.0f, 0.0f, false); + } else { + countOldLayout = countLayout; + } + } + countWidthOld = countWidth; + countAnimationIncrement = count > currentCount; + countAnimator.start(); + } + if (count > 0) { + countWidth = Math.max(AndroidUtilities.dp(12), (int) Math.ceil(textPaint.measureText(newStr))); + countLayout = new StaticLayout(newStr, textPaint, countWidth, Layout.Alignment.ALIGN_CENTER, 1.0f, 0.0f, false); + } + + currentCount = count; + invalidate(); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + int textColor = Theme.getColor(textColorKey); + int circleColor = Theme.getColor(circleColorKey); + if (this.textColor != textColor) { + this.textColor = textColor; + textPaint.setColor(textColor); + } + if (this.circleColor != circleColor) { + this.circleColor = circleColor; + circlePaint.setColor(circleColor); + } + if (countChangeProgress != 1f) { + if (animationType == ANIMATION_TYPE_IN || animationType == ANIMATION_TYPE_OUT) { + updateX(countWidth); + float cx = countLeft + countWidth / 2f; + float cy = getMeasuredHeight() / 2f; + canvas.save(); + float progress = animationType == ANIMATION_TYPE_IN ? countChangeProgress : (1f - countChangeProgress); + canvas.scale(progress, progress, cx, cy); + drawInternal(canvas); + canvas.restore(); + } else { + float progressHalf = countChangeProgress * 2; + if (progressHalf > 1f) { + progressHalf = 1f; + } + + float countTop = (getMeasuredHeight() - AndroidUtilities.dp(23)) / 2f; + float countWidth; + if (this.countWidth == this.countWidthOld) { + countWidth = this.countWidth; + } else { + countWidth = this.countWidth * progressHalf + this.countWidthOld * (1f - progressHalf); + } + updateX(countWidth); + + float scale = 1f; + if (countAnimationIncrement) { + if (countChangeProgress <= 0.5f) { + scale += 0.1f * CubicBezierInterpolator.EASE_OUT.getInterpolation(countChangeProgress * 2); + } else { + scale += 0.1f * CubicBezierInterpolator.EASE_IN.getInterpolation((1f - (countChangeProgress - 0.5f) * 2)); + } + } + + rectF.set(x, countTop, x + countWidth + AndroidUtilities.dp(11), countTop + AndroidUtilities.dp(23)); + canvas.save(); + canvas.scale(scale, scale, rectF.centerX(), rectF.centerY()); + canvas.drawRoundRect(rectF, 11.5f * AndroidUtilities.density, 11.5f * AndroidUtilities.density, circlePaint); + canvas.clipRect(rectF); + + boolean increment = reverseAnimation != countAnimationIncrement; + if (countAnimationInLayout != null) { + canvas.save(); + canvas.translate(countLeft, countTop + AndroidUtilities.dp(4) + (increment ? AndroidUtilities.dp(13) : -AndroidUtilities.dp(13)) * (1f - progressHalf)); + textPaint.setAlpha((int) (255 * progressHalf)); + countAnimationInLayout.draw(canvas); + canvas.restore(); + } else if (countLayout != null) { + canvas.save(); + canvas.translate(countLeft, countTop + AndroidUtilities.dp(4) + (increment ? AndroidUtilities.dp(13) : -AndroidUtilities.dp(13)) * (1f - progressHalf)); + textPaint.setAlpha((int) (255 * progressHalf)); + countLayout.draw(canvas); + canvas.restore(); + } + + if (countOldLayout != null) { + canvas.save(); + canvas.translate(countLeft, countTop + AndroidUtilities.dp(4) + (increment ? -AndroidUtilities.dp(13) : AndroidUtilities.dp(13)) * (progressHalf)); + textPaint.setAlpha((int) (255 * (1f - progressHalf))); + countOldLayout.draw(canvas); + canvas.restore(); + } + + if (countAnimationStableLayout != null) { + canvas.save(); + canvas.translate(countLeft, countTop + AndroidUtilities.dp(4)); + textPaint.setAlpha(255); + countAnimationStableLayout.draw(canvas); + canvas.restore(); + } + textPaint.setAlpha(255); + canvas.restore(); + } + } else { + drawInternal(canvas); + } + } + + private void updateX(float countWidth) { + if (gravity == Gravity.RIGHT) { + countLeft = getMeasuredWidth() - AndroidUtilities.dp(5.5f); + if (horizontalPadding != 0) { + countLeft -= Math.max(horizontalPadding + countWidth / 2f, countWidth); + } else { + countLeft -= countWidth; + } + } else if (gravity == Gravity.LEFT) { + countLeft = AndroidUtilities.dp(5.5f); + } else { + countLeft = (int) ((getMeasuredWidth() - countWidth) / 2f); + } + x = countLeft - AndroidUtilities.dp(5.5f); + } + + private void drawInternal(Canvas canvas) { + float countTop = (getMeasuredHeight() - AndroidUtilities.dp(23)) / 2f; + updateX(countWidth); + rectF.set(x, countTop, x + countWidth + AndroidUtilities.dp(11), countTop + AndroidUtilities.dp(23)); + canvas.drawRoundRect(rectF, 11.5f * AndroidUtilities.density, 11.5f * AndroidUtilities.density, circlePaint); + if (countLayout != null) { + canvas.save(); + canvas.translate(countLeft, countTop + AndroidUtilities.dp(4)); + countLayout.draw(canvas); + canvas.restore(); + } + } + + public void setColors(String textKey, String circleKey){ + this.textColorKey = textKey; + this.circleColorKey = circleKey; + } + + public void setGravity(int gravity) { + this.gravity = gravity; + } + + public void setReverse(boolean b) { + reverseAnimation = b; + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/CrossOutDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/CrossOutDrawable.java new file mode 100644 index 00000000000..b84e9fc616d --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/CrossOutDrawable.java @@ -0,0 +1,132 @@ +package org.telegram.ui.Components; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.ColorFilter; +import android.graphics.Paint; +import android.graphics.PixelFormat; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; +import android.graphics.Rect; +import android.graphics.RectF; +import android.graphics.drawable.Drawable; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.ui.ActionBar.Theme; + +public class CrossOutDrawable extends Drawable { + + Drawable iconDrawable; + RectF rectF = new RectF(); + Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); + final Paint xRefPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + + int color; + String colorKey; + float progress; + boolean cross; + + public CrossOutDrawable(Context context, int iconRes, String colorKey) { + iconDrawable = ContextCompat.getDrawable(context, iconRes); + this.colorKey = colorKey; + paint.setStyle(Paint.Style.STROKE); + paint.setStrokeWidth(AndroidUtilities.dpf2(1.7f)); + paint.setStrokeCap(Paint.Cap.ROUND); + xRefPaint.setColor(0xff000000); + xRefPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); + xRefPaint.setStyle(Paint.Style.STROKE); + xRefPaint.setStrokeWidth(AndroidUtilities.dpf2(2.5f)); + } + + public void setCrossOut(boolean cross, boolean animated) { + this.cross = cross; + if (!animated) { + progress = cross ? 1f : 0f; + } else { + progress = cross ? 0f : 1f; + } + invalidateSelf(); + } + + @Override + public void draw(@NonNull Canvas canvas) { + if (cross && progress != 1f) { + progress += 16f / 150f; + invalidateSelf(); + if (progress > 1f) { + progress = 1f; + } + } else if (!cross && progress != 0f) { + progress -= 16f / 150f; + invalidateSelf(); + if (progress < 0) { + progress = 0; + } + } + if (progress == 0) { + iconDrawable.draw(canvas); + return; + } + int newColor = Theme.getColor(colorKey); + if (color != newColor) { + color = newColor; + paint.setColor(newColor); + } + rectF.set(iconDrawable.getBounds()); + canvas.saveLayerAlpha(rectF, 255, Canvas.ALL_SAVE_FLAG); + iconDrawable.draw(canvas); + + float startX = rectF.left + AndroidUtilities.dpf2(4.5f); + float startY = rectF.top + AndroidUtilities.dpf2(4.5f) - AndroidUtilities.dp(1); + float stopX = rectF.right - AndroidUtilities.dp(3); + float stopY = rectF.bottom - AndroidUtilities.dp(1) - AndroidUtilities.dp(3); + if (cross) { + stopX = startX + (stopX - startX) * progress; + stopY = startY + (stopY - startY) * progress; + } else { + startX = startX + (stopX - startX) * (1f - progress); + startY = startY + (stopY - startY) * (1f - progress); + } + canvas.drawLine(startX, startY - paint.getStrokeWidth(), stopX, stopY - paint.getStrokeWidth(), xRefPaint); + canvas.drawLine(startX, startY, stopX, stopY, paint); + canvas.restore(); + } + + @Override + public void setAlpha(int i) { + } + + @Override + public void setBounds(int left, int top, int right, int bottom) { + super.setBounds(left, top, right, bottom); + iconDrawable.setBounds(left, top, right, bottom); + } + + @Override + public void setColorFilter(@Nullable ColorFilter colorFilter) { + iconDrawable.setColorFilter(colorFilter); + } + + @Override + public int getIntrinsicHeight() { + return iconDrawable.getIntrinsicHeight(); + } + + @Override + public int getIntrinsicWidth() { + return iconDrawable.getIntrinsicWidth(); + } + + @Override + public int getOpacity() { + return PixelFormat.TRANSLUCENT; + } + + public void setColorKey(String colorKey) { + this.colorKey = colorKey; + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/DotDividerSpan.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/DotDividerSpan.java new file mode 100644 index 00000000000..fc15c508bf0 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/DotDividerSpan.java @@ -0,0 +1,35 @@ +package org.telegram.ui.Components; + +import android.graphics.Canvas; +import android.graphics.Paint; +import android.text.style.ReplacementSpan; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import org.telegram.messenger.AndroidUtilities; + +public class DotDividerSpan extends ReplacementSpan { + + Paint p = new Paint(Paint.ANTI_ALIAS_FLAG); + int color; + int topPadding; + + @Override + public int getSize(@NonNull Paint paint, CharSequence charSequence, int i, int i1, @Nullable Paint.FontMetricsInt fontMetricsInt) { + return AndroidUtilities.dp(3); + } + + @Override + public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) { + if (color != paint.getColor()) { + p.setColor(paint.getColor()); + } + float radius = AndroidUtilities.dpf2(3) / 2f; + canvas.drawCircle(x + radius, (bottom - top) / 2 + topPadding, radius, p); + } + + public void setTopPadding(int topPadding) { + this.topPadding = topPadding; + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/EditTextBoldCursor.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/EditTextBoldCursor.java index 51bf044dcf4..542a0f6cb8f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/EditTextBoldCursor.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/EditTextBoldCursor.java @@ -8,8 +8,11 @@ package org.telegram.ui.Components; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; +import android.animation.ValueAnimator; import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.content.Context; @@ -28,6 +31,7 @@ import androidx.core.view.accessibility.AccessibilityNodeInfoCompat; import android.text.Layout; +import android.text.SpannableStringBuilder; import android.text.StaticLayout; import android.text.TextPaint; import android.text.TextUtils; @@ -42,6 +46,7 @@ import android.widget.TextView; import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.Emoji; import org.telegram.messenger.FileLog; import org.telegram.messenger.LocaleController; import org.telegram.messenger.R; @@ -65,6 +70,7 @@ public class EditTextBoldCursor extends EditText { private Object editor; private GradientDrawable gradientDrawable; + private SubstringLayoutAnimator hintAnimator; private Runnable invalidateRunnable = new Runnable() { @Override @@ -391,9 +397,26 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { } public void setHintText(CharSequence text) { + setHintText(text, false); + } + + public void setHintText(CharSequence text, boolean animated) { if (text == null) { text = ""; } + if (getMeasuredWidth() == 0) { + animated = false; + } + if (animated) { + if (hintAnimator == null) { + hintAnimator = new SubstringLayoutAnimator(this); + } + hintAnimator.create(hintLayout, hint, text, getPaint()); + } else { + if (hintAnimator != null) { + hintAnimator.cancel(); + } + } hint = text; if (getMeasuredWidth() != 0) { text = TextUtils.ellipsize(text, getPaint(), getMeasuredWidth(), TextUtils.TruncateAt.END); @@ -561,7 +584,14 @@ protected void onDraw(Canvas canvas) { getPaint().setColor(hintColor); getPaint().setAlpha((int) (255 * hintAlpha * (Color.alpha(hintColor) / 255.0f))); } - hintLayout.draw(canvas); + if (hintAnimator != null && hintAnimator.animateTextChange) { + canvas.save(); + canvas.clipRect(0, 0, getMeasuredWidth(), getMeasuredHeight()); + hintAnimator.draw(canvas, getPaint()); + canvas.restore(); + } else { + hintLayout.draw(canvas); + } getPaint().setColor(oldColor); canvas.restore(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/EditTextEmoji.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/EditTextEmoji.java index a43eb18499d..65a58b8e677 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/EditTextEmoji.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/EditTextEmoji.java @@ -126,11 +126,6 @@ public boolean onTouchEvent(MotionEvent event) { return false; } - @Override - public void setImeOptions(int imeOptions) { - super.setImeOptions(imeOptions); - } - @Override protected void onLineCountChanged(int oldLineCount, int newLineCount) { EditTextEmoji.this.onLineCountChanged(oldLineCount, newLineCount); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmbedBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmbedBottomSheet.java index a5ade3e6475..872c9330caa 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmbedBottomSheet.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmbedBottomSheet.java @@ -1027,6 +1027,15 @@ public void destroy() { dismissInternal(); } + @Override + public void dismissInternal() { + super.dismissInternal(); + if (orientationEventListener != null) { + orientationEventListener.disable(); + orientationEventListener = null; + } + } + public void exitFromPip() { if (webView == null || pipVideoView == null) { return; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmptyTextProgressView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmptyTextProgressView.java index dc6718fc642..d2a1e2a6add 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmptyTextProgressView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmptyTextProgressView.java @@ -26,15 +26,24 @@ public class EmptyTextProgressView extends FrameLayout { private TextView textView; - private RadialProgressView progressBar; + private View progressView; private boolean inLayout; private int showAtPos; public EmptyTextProgressView(Context context) { + this(context, null); + } + + public EmptyTextProgressView(Context context, View progressView) { super(context); - progressBar = new RadialProgressView(context); - addView(progressBar, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT)); + if (progressView == null) { + progressView = new RadialProgressView(context); + addView(progressView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT)); + } else { + addView(progressView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); + } + this.progressView = progressView; textView = new TextView(context); textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); @@ -44,7 +53,7 @@ public EmptyTextProgressView(Context context) { textView.setText(LocaleController.getString("NoResult", R.string.NoResult)); addView(textView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT)); - progressBar.setAlpha(0f); + progressView.setAlpha(0f); textView.setAlpha(0f); setOnTouchListener((v, event) -> true); @@ -52,12 +61,12 @@ public EmptyTextProgressView(Context context) { public void showProgress() { textView.animate().alpha(0f).setDuration(150).start(); - progressBar.animate().alpha(1f).setDuration(150).start(); + progressView.animate().alpha(1f).setDuration(150).start(); } public void showTextView() { textView.animate().alpha(1f).setDuration(150).start(); - progressBar.animate().alpha(0f).setDuration(150).start(); + progressView.animate().alpha(0f).setDuration(150).start(); } public void setText(String text) { @@ -69,7 +78,9 @@ public void setTextColor(int color) { } public void setProgressBarColor(int color) { - progressBar.setProgressColor(color); + if (progressView instanceof RadialProgressView) { + ((RadialProgressView) progressView).setProgressColor(color); + } } public void setTopImage(int resId) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/FilterTabsView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/FilterTabsView.java index 84bb8822b39..1ded05c3e2c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/FilterTabsView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/FilterTabsView.java @@ -556,6 +556,7 @@ public boolean animateChange() { @Override public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(info); + info.setSelected(currentTab != null && selectedTabId != -1 && currentTab.id == selectedTabId); info.addAction(AccessibilityNodeInfo.ACTION_CLICK); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { info.addAction(new AccessibilityNodeInfo.AccessibilityAction(AccessibilityNodeInfo.ACTION_LONG_CLICK, LocaleController.getString("AccDescrOpenMenu2", R.string.AccDescrOpenMenu2))); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/FlickerLoadingView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/FlickerLoadingView.java index d4f17320be7..b3813ff4348 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/FlickerLoadingView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/FlickerLoadingView.java @@ -5,6 +5,7 @@ import android.graphics.LinearGradient; import android.graphics.Matrix; import android.graphics.Paint; +import android.graphics.Path; import android.graphics.RectF; import android.graphics.Shader; import android.os.SystemClock; @@ -12,6 +13,7 @@ import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.LocaleController; +import org.telegram.messenger.SharedConfig; import org.telegram.ui.ActionBar.Theme; public class FlickerLoadingView extends View { @@ -22,6 +24,10 @@ public class FlickerLoadingView extends View { public final static int AUDIO_TYPE = 4; public final static int LINKS_TYPE = 5; public final static int USERS_TYPE = 6; + public final static int DIALOG_CELL_TYPE = 7; + public final static int CALL_LOG_TYPE = 8; + public final static int INVITE_LINKS_TYPE = 9; + public final static int USERS2_TYPE = 10; private int gradientWidth; private LinearGradient gradient; @@ -40,10 +46,13 @@ public class FlickerLoadingView extends View { private boolean isSingleCell; private int viewType; + private int paddingTop; + private int paddingLeft; private String colorKey1 = Theme.key_windowBackgroundWhite; private String colorKey2 = Theme.key_windowBackgroundGray; private String colorKey3; + private int itemsCount = 1; public void setViewType(int type) { this.viewType = type; @@ -77,7 +86,11 @@ public FlickerLoadingView(Context context) { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (isSingleCell) { - super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(getCellHeight(MeasureSpec.getSize(widthMeasureSpec)), MeasureSpec.EXACTLY)); + if (itemsCount > 1 && MeasureSpec.getSize(heightMeasureSpec) > 0) { + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(Math.min(MeasureSpec.getSize(heightMeasureSpec), getCellHeight(MeasureSpec.getSize(widthMeasureSpec)) * itemsCount), MeasureSpec.EXACTLY)); + } else { + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(getCellHeight(MeasureSpec.getSize(widthMeasureSpec)), MeasureSpec.EXACTLY)); + } } else { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @@ -98,7 +111,7 @@ protected void onDraw(Canvas canvas) { paint.setShader(gradient); } - int h = 0; + int h = paddingTop; if (useHeaderOffset) { h += AndroidUtilities.dp(32); if (colorKey3 != null) { @@ -106,8 +119,42 @@ protected void onDraw(Canvas canvas) { } canvas.drawRect(0,0, getMeasuredWidth(), AndroidUtilities.dp(32), colorKey3 != null ? headerPaint : paint); } - if (getViewType() == DIALOG_TYPE) { - while (h < getMeasuredHeight()) { + if (getViewType() == DIALOG_CELL_TYPE) { + int k = 0; + while (h <= getMeasuredHeight()) { + int childH = getCellHeight(getMeasuredWidth()); + int r = AndroidUtilities.dp(28); + canvas.drawCircle(checkRtl(AndroidUtilities.dp(10) + r), h + (childH >> 1), r, paint); + + rectF.set(AndroidUtilities.dp(76), h + AndroidUtilities.dp(16), AndroidUtilities.dp(148), h + AndroidUtilities.dp(24)); + checkRtl(rectF); + canvas.drawRoundRect(rectF, AndroidUtilities.dp(4), AndroidUtilities.dp(4), paint); + + rectF.set(AndroidUtilities.dp(76), h + AndroidUtilities.dp(38), AndroidUtilities.dp(268), h + AndroidUtilities.dp(46)); + checkRtl(rectF); + canvas.drawRoundRect(rectF, AndroidUtilities.dp(4), AndroidUtilities.dp(4), paint); + + if (SharedConfig.useThreeLinesLayout) { + rectF.set(AndroidUtilities.dp(76), h + AndroidUtilities.dp(46 + 8), AndroidUtilities.dp(220), h + AndroidUtilities.dp(46 + 8 + 8)); + checkRtl(rectF); + canvas.drawRoundRect(rectF, AndroidUtilities.dp(4), AndroidUtilities.dp(4), paint); + } + + if (showDate) { + rectF.set(getMeasuredWidth() - AndroidUtilities.dp(50), h + AndroidUtilities.dp(16), getMeasuredWidth() - AndroidUtilities.dp(12), h + AndroidUtilities.dp(24)); + checkRtl(rectF); + canvas.drawRoundRect(rectF, AndroidUtilities.dp(4), AndroidUtilities.dp(4), paint); + } + + h += getCellHeight(getMeasuredWidth()); + k++; + if (isSingleCell && k >= itemsCount) { + break; + } + } + } else if (getViewType() == DIALOG_TYPE) { + int k = 0; + while (h <= getMeasuredHeight()) { int r = AndroidUtilities.dp(25); canvas.drawCircle(checkRtl(AndroidUtilities.dp(9) + r), h + (AndroidUtilities.dp(78) >> 1), r, paint); @@ -126,7 +173,8 @@ protected void onDraw(Canvas canvas) { } h += getCellHeight(getMeasuredWidth()); - if (isSingleCell) { + k++; + if (isSingleCell && k >= itemsCount) { break; } } @@ -148,7 +196,8 @@ protected void onDraw(Canvas canvas) { } } } else if (getViewType() == 3) { - while (h < getMeasuredHeight()) { + int k = 0; + while (h <= getMeasuredHeight()) { rectF.set(AndroidUtilities.dp(12), h + AndroidUtilities.dp(8), AndroidUtilities.dp(52), h + AndroidUtilities.dp(48)); checkRtl(rectF); canvas.drawRoundRect(rectF, AndroidUtilities.dp(4), AndroidUtilities.dp(4), paint); @@ -168,12 +217,14 @@ protected void onDraw(Canvas canvas) { } h += getCellHeight(getMeasuredWidth()); - if (isSingleCell) { + k++; + if (isSingleCell && k >= itemsCount) { break; } } } else if (getViewType() == 4) { - while (h < getMeasuredHeight()) { + int k = 0; + while (h <= getMeasuredHeight()) { int radius = AndroidUtilities.dp(44) >> 1; canvas.drawCircle(checkRtl(AndroidUtilities.dp(12) + radius), h + AndroidUtilities.dp(6) + radius, radius, paint); @@ -192,12 +243,14 @@ protected void onDraw(Canvas canvas) { } h += getCellHeight(getMeasuredWidth()); - if (isSingleCell) { + k++; + if (isSingleCell && k >= itemsCount) { break; } } } else if (getViewType() == 5) { - while (h < getMeasuredHeight()) { + int k = 0; + while (h <= getMeasuredHeight()) { rectF.set(AndroidUtilities.dp(10), h + AndroidUtilities.dp(11), AndroidUtilities.dp(62), h + AndroidUtilities.dp(11 + 52)); checkRtl(rectF); canvas.drawRoundRect(rectF, AndroidUtilities.dp(4), AndroidUtilities.dp(4), paint); @@ -221,20 +274,48 @@ protected void onDraw(Canvas canvas) { } h += getCellHeight(getMeasuredWidth()); - if (isSingleCell) { + k++; + if (isSingleCell && k >= itemsCount) { + break; + } + } + } else if (getViewType() == 6 || getViewType() == USERS2_TYPE) { + int k = 0; + while (h <= getMeasuredHeight()) { + int r = AndroidUtilities.dp(23); + canvas.drawCircle(checkRtl(paddingLeft + AndroidUtilities.dp(9) + r), h + (AndroidUtilities.dp(64) >> 1), r, paint); + + rectF.set(paddingLeft + AndroidUtilities.dp(68), h + AndroidUtilities.dp(17), paddingLeft + AndroidUtilities.dp(260), h + AndroidUtilities.dp(25)); + checkRtl(rectF); + canvas.drawRoundRect(rectF, AndroidUtilities.dp(4), AndroidUtilities.dp(4), paint); + + rectF.set(paddingLeft + AndroidUtilities.dp(68), h + AndroidUtilities.dp(39), paddingLeft + AndroidUtilities.dp(140), h + AndroidUtilities.dp(47)); + checkRtl(rectF); + canvas.drawRoundRect(rectF, AndroidUtilities.dp(4), AndroidUtilities.dp(4), paint); + + if (showDate) { + rectF.set(getMeasuredWidth() - AndroidUtilities.dp(50), h + AndroidUtilities.dp(20), getMeasuredWidth() - AndroidUtilities.dp(12), h + AndroidUtilities.dp(28)); + checkRtl(rectF); + canvas.drawRoundRect(rectF, AndroidUtilities.dp(4), AndroidUtilities.dp(4), paint); + } + + h += getCellHeight(getMeasuredWidth()); + k++; + if (isSingleCell && k >= itemsCount) { break; } } - } else if (getViewType() == 6) { - while (h < getMeasuredHeight()) { + } else if (getViewType() == CALL_LOG_TYPE) { + int k = 0; + while (h <= getMeasuredHeight()) { int r = AndroidUtilities.dp(23); - canvas.drawCircle(checkRtl(AndroidUtilities.dp(9) + r), h + (AndroidUtilities.dp(64) >> 1), r, paint); + canvas.drawCircle(checkRtl(paddingLeft + AndroidUtilities.dp(11) + r), h + (AndroidUtilities.dp(64) >> 1), r, paint); - rectF.set(AndroidUtilities.dp(68), h + AndroidUtilities.dp(17), AndroidUtilities.dp(260), h + AndroidUtilities.dp(25)); + rectF.set(paddingLeft + AndroidUtilities.dp(68), h + AndroidUtilities.dp(17), paddingLeft + AndroidUtilities.dp(140), h + AndroidUtilities.dp(25)); checkRtl(rectF); canvas.drawRoundRect(rectF, AndroidUtilities.dp(4), AndroidUtilities.dp(4), paint); - rectF.set(AndroidUtilities.dp(68), h + AndroidUtilities.dp(39), AndroidUtilities.dp(140), h + AndroidUtilities.dp(47)); + rectF.set(paddingLeft + AndroidUtilities.dp(68), h + AndroidUtilities.dp(39), paddingLeft + AndroidUtilities.dp(260), h + AndroidUtilities.dp(47)); checkRtl(rectF); canvas.drawRoundRect(rectF, AndroidUtilities.dp(4), AndroidUtilities.dp(4), paint); @@ -245,7 +326,35 @@ protected void onDraw(Canvas canvas) { } h += getCellHeight(getMeasuredWidth()); - if (isSingleCell) { + k++; + if (isSingleCell && k >= itemsCount) { + break; + } + } + } else if (getViewType() == INVITE_LINKS_TYPE) { + int k = 0; + while (h <= getMeasuredHeight()) { + int childH = getCellHeight(getMeasuredWidth()); + int r = AndroidUtilities.dp(32) / 2; + canvas.drawCircle(checkRtl(AndroidUtilities.dp(35)), h + (childH >> 1), r, paint); + + rectF.set(AndroidUtilities.dp(72), h + AndroidUtilities.dp(16), AndroidUtilities.dp(268), h + AndroidUtilities.dp(24)); + checkRtl(rectF); + canvas.drawRoundRect(rectF, AndroidUtilities.dp(4), AndroidUtilities.dp(4), paint); + + rectF.set(AndroidUtilities.dp(72), h + AndroidUtilities.dp(38), AndroidUtilities.dp(140), h + AndroidUtilities.dp(46)); + checkRtl(rectF); + canvas.drawRoundRect(rectF, AndroidUtilities.dp(4), AndroidUtilities.dp(4), paint); + + if (showDate) { + rectF.set(getMeasuredWidth() - AndroidUtilities.dp(50), h + AndroidUtilities.dp(16), getMeasuredWidth() - AndroidUtilities.dp(12), h + AndroidUtilities.dp(24)); + checkRtl(rectF); + canvas.drawRoundRect(rectF, AndroidUtilities.dp(4), AndroidUtilities.dp(4), paint); + } + + h += getCellHeight(getMeasuredWidth()); + k++; + if (isSingleCell && k >= itemsCount) { break; } } @@ -289,7 +398,9 @@ private void checkRtl(RectF rectF) { } private int getCellHeight(int width) { - if (getViewType() == DIALOG_TYPE) { + if (getViewType() == DIALOG_CELL_TYPE) { + return AndroidUtilities.dp((SharedConfig.useThreeLinesLayout ? 78 : 72) + 1); + } else if (getViewType() == DIALOG_TYPE) { return AndroidUtilities.dp(78) + 1; } else if (getViewType() == PHOTOS_TYPE) { int photoWidth = (width - (AndroidUtilities.dp(2) * (getColumnsCount() - 1))) / getColumnsCount(); @@ -302,6 +413,12 @@ private int getCellHeight(int width) { return AndroidUtilities.dp(80); } else if (getViewType() == USERS_TYPE) { return AndroidUtilities.dp(64); + } else if (getViewType() == INVITE_LINKS_TYPE) { + return AndroidUtilities.dp(66); + } else if (getViewType() == USERS2_TYPE) { + return AndroidUtilities.dp(58); + } else if (getViewType() == CALL_LOG_TYPE) { + return AndroidUtilities.dp(61); } return 0; } @@ -317,4 +434,18 @@ public void setUseHeaderOffset(boolean useHeaderOffset) { public void skipDrawItemsCount(int i) { skipDrawItemsCount = i; } + + public void setPaddingTop(int t) { + paddingTop = t; + invalidate(); + } + + public void setPaddingLeft(int paddingLeft) { + this.paddingLeft = paddingLeft; + invalidate(); + } + + public void setItemsCount(int i) { + this.itemsCount = i; + } } \ No newline at end of file diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ForegroundColorSpanThemable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ForegroundColorSpanThemable.java index 5a3b86e4a75..b95fa63cb16 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ForegroundColorSpanThemable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ForegroundColorSpanThemable.java @@ -2,7 +2,6 @@ import android.text.TextPaint; import android.text.style.CharacterStyle; -import android.text.style.ForegroundColorSpan; import android.text.style.UpdateAppearance; import androidx.annotation.NonNull; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/FragmentContextView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/FragmentContextView.java index 35bec2ca9ab..a30160be832 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/FragmentContextView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/FragmentContextView.java @@ -12,6 +12,7 @@ import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; +import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; @@ -43,6 +44,7 @@ import org.telegram.messenger.AccountInstance; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ChatObject; +import org.telegram.messenger.ContactsController; import org.telegram.messenger.LocaleController; import org.telegram.messenger.LocationController; import org.telegram.messenger.MediaController; @@ -73,7 +75,7 @@ public class FragmentContextView extends FrameLayout implements NotificationCent private ImageView playButton; private PlayPauseDrawable playPauseDrawable; - private TextView titleTextView; + private AudioPlayerAlert.ClippingTextViewSwitcher titleTextView; private AudioPlayerAlert.ClippingTextViewSwitcher subtitleTextView; private AnimatorSet animatorSet; private BaseFragment fragment; @@ -81,6 +83,7 @@ public class FragmentContextView extends FrameLayout implements NotificationCent private FrameLayout frameLayout; private View shadow; private View selector; + private RLottieImageView importingImageView; private RLottieImageView muteButton; private RLottieDrawable muteDrawable; private ImageView closeButton; @@ -90,6 +93,8 @@ public class FragmentContextView extends FrameLayout implements NotificationCent private boolean isMuted; + private int currentProgress = -1; + private MessageObject lastMessageObject; private float topPadding; private boolean visible; @@ -116,8 +121,9 @@ public void run() { }; private int animationIndex = -1; - boolean checkCallAfterAnimation; - boolean checkPlayerAfterAnimation; + private boolean checkCallAfterAnimation; + private boolean checkPlayerAfterAnimation; + private boolean checkImportAfterAnimation; @Override public void onAudioSettingsChanged() { @@ -135,6 +141,10 @@ public void onAudioSettingsChanged() { } } + public boolean drawOverlayed() { + return currentStyle == 3; + } + public interface FragmentContextViewDelegate { void onAnimation(boolean start, boolean show); } @@ -191,13 +201,44 @@ public void invalidate() { } }); - titleTextView = new TextView(context); - titleTextView.setMaxLines(1); - titleTextView.setLines(1); - titleTextView.setSingleLine(true); - titleTextView.setEllipsize(TextUtils.TruncateAt.END); - titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); - titleTextView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); + importingImageView = new RLottieImageView(context); + importingImageView.setScaleType(ImageView.ScaleType.CENTER); + importingImageView.setAutoRepeat(true); + importingImageView.setAnimation(R.raw.import_progress, 30, 30); + importingImageView.setBackground(Theme.createCircleDrawable(AndroidUtilities.dp(22), Theme.getColor(Theme.key_inappPlayerPlayPause))); + addView(importingImageView, LayoutHelper.createFrame(22, 22, Gravity.TOP | Gravity.LEFT, 7, 7, 0, 0)); + + + titleTextView = new AudioPlayerAlert.ClippingTextViewSwitcher(context) { + @Override + protected TextView createTextView() { + TextView textView = new TextView(context); + textView.setMaxLines(1); + textView.setLines(1); + textView.setSingleLine(true); + textView.setEllipsize(TextUtils.TruncateAt.END); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); + textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); + + if (currentStyle == 0 || currentStyle == 2) { + textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); + textView.setTextColor(Theme.getColor(Theme.key_inappPlayerTitle)); + textView.setTypeface(Typeface.DEFAULT); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); + } else if (currentStyle == 4) { + textView.setGravity(Gravity.TOP | Gravity.LEFT); + textView.setTextColor(Theme.getColor(Theme.key_inappPlayerPerformer)); + textView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); + } else if (currentStyle == 1 || currentStyle == 3) { + textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); + textView.setTextColor(Theme.getColor(Theme.key_returnToCallText)); + textView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + } + return textView; + } + }; addView(titleTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 36, Gravity.LEFT | Gravity.TOP, 35, 0, 36, 0)); subtitleTextView = new AudioPlayerAlert.ClippingTextViewSwitcher(context) { @@ -243,6 +284,7 @@ protected TextView createTextView() { } else { MediaController.getInstance().setPlaybackSpeed(isMusic, 1.8f); } + playbackSpeedChanged(currentPlaybackSpeed <= 1); }); updatePlaybackButton(); } @@ -291,7 +333,7 @@ protected TextView createTextView() { @Override public boolean onTouchEvent(MotionEvent event) { - if (currentStyle == 3) { + if (currentStyle == 3 || currentStyle == 1) { VoIPService service = VoIPService.getSharedInstance(); if (service == null) { AndroidUtilities.cancelRunOnUIThread(pressRunnable); @@ -310,7 +352,7 @@ public boolean onTouchEvent(MotionEvent event) { scheduled = false; } else if (pressed) { isMuted = true; - if (muteDrawable.setCustomEndFrame(isMuted ? 15 : 29)) { + if (muteDrawable.setCustomEndFrame(15)) { if (isMuted) { muteDrawable.setCurrentFrame(0); } else { @@ -356,12 +398,14 @@ public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { if (voIPService == null) { return; } - ChatObject.Call call = voIPService.groupCall; - AccountInstance accountInstance = AccountInstance.getInstance(voIPService.getAccount()); - TLRPC.Chat chat = voIPService.getChat(); - TLRPC.TL_groupCallParticipant participant = call.participants.get(accountInstance.getUserConfig().getClientUserId()); - if (participant != null && !participant.can_self_unmute && participant.muted && !ChatObject.canManageCalls(chat)) { - return; + if (voIPService.groupCall != null) { + AccountInstance accountInstance = AccountInstance.getInstance(voIPService.getAccount()); + ChatObject.Call call = voIPService.groupCall; + TLRPC.Chat chat = voIPService.getChat(); + TLRPC.TL_groupCallParticipant participant = call.participants.get(accountInstance.getUserConfig().getClientUserId()); + if (participant != null && !participant.can_self_unmute && participant.muted && !ChatObject.canManageCalls(chat)) { + return; + } } isMuted = !voIPService.isMicMute(); @@ -483,12 +527,9 @@ public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { fragment.showDialog(new SharingLocationsAlert(getContext(), this::openSharingLocation)); } } else if (currentStyle == 3) { - // long d = Theme.getFragmentContextViewWavesDrawable().getRippleFinishedDelay(); - // AndroidUtilities.runOnUIThread(() -> { - if (VoIPService.getSharedInstance() != null && getContext() instanceof LaunchActivity) { - GroupCallActivity.create((LaunchActivity) getContext(), AccountInstance.getInstance(VoIPService.getSharedInstance().getAccount())); - } - // }, d); + if (VoIPService.getSharedInstance() != null && getContext() instanceof LaunchActivity) { + GroupCallActivity.create((LaunchActivity) getContext(), AccountInstance.getInstance(VoIPService.getSharedInstance().getAccount())); + } } else if (currentStyle == 4) { if (fragment.getParentActivity() == null) { return; @@ -499,6 +540,11 @@ public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { return; } VoIPHelper.startCall(chatActivity.getMessagesController().getChat(call.chatId), false, fragment.getParentActivity()); + } else if (currentStyle == 5) { + ImportingAlert importingAlert = new ImportingAlert(getContext(), (ChatActivity) fragment); + importingAlert.setOnHideListener(dialog -> checkImport(false)); + fragment.showDialog(importingAlert); + checkImport(false); } }); } @@ -562,7 +608,9 @@ private void checkVisibility() { } else { if (VoIPService.getSharedInstance() != null && !VoIPService.getSharedInstance().isHangingUp() && VoIPService.getSharedInstance().getCallState() != VoIPService.STATE_WAITING_INCOMING) { show = true; - } else if (fragment instanceof ChatActivity && ((ChatActivity) fragment).getGroupCall() != null) { + } else if (fragment instanceof ChatActivity && fragment.getSendMessagesHelper().getImportingHistory(((ChatActivity) fragment).getDialogId()) != null && !isPlayingVoice()) { + show = true; + } else if (fragment instanceof ChatActivity && ((ChatActivity) fragment).getGroupCall() != null && !GroupCallPip.isShowing() && !isPlayingVoice()) { show = true; } else { MessageObject messageObject = MediaController.getInstance().getPlayingMessageObject(); @@ -589,11 +637,15 @@ public void setTopPadding(float value) { } } + protected void playbackSpeedChanged(boolean enabled) { + + } + private void updateStyle(int style) { if (currentStyle == style) { return; } - if (currentStyle == 3) { + if (currentStyle == 3 || currentStyle == 1) { Theme.getFragmentContextViewWavesDrawable().removeParent(this); if (VoIPService.getSharedInstance() != null) { VoIPService.getSharedInstance().unregisterStateListener(this); @@ -601,7 +653,6 @@ private void updateStyle(int style) { } currentStyle = style; - if (avatars != null) { avatars.setStyle(currentStyle); avatars.setLayoutParams(LayoutHelper.createFrame(108, getStyleHeight(), Gravity.LEFT | Gravity.TOP)); @@ -613,21 +664,59 @@ private void updateStyle(int style) { updatePaddings(); setTopPadding(AndroidUtilities.dp2(getStyleHeight())); } - if (style == 0 || style == 2) { + if (style == 5) { selector.setBackground(Theme.getSelectorDrawable(false)); frameLayout.setBackgroundColor(Theme.getColor(Theme.key_inappPlayerBackground)); frameLayout.setTag(Theme.key_inappPlayerBackground); - titleTextView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); - titleTextView.setTextColor(Theme.getColor(Theme.key_inappPlayerTitle)); + + for (int i = 0; i < 2; i++) { + TextView textView = i == 0 ? titleTextView.getTextView() : titleTextView.getNextTextView(); + if (textView == null) { + continue; + } + textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); + textView.setTextColor(Theme.getColor(Theme.key_inappPlayerTitle)); + textView.setTypeface(Typeface.DEFAULT); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); + } titleTextView.setTag(Theme.key_inappPlayerTitle); + subtitleTextView.setVisibility(GONE); + joinButton.setVisibility(GONE); + closeButton.setVisibility(GONE); + playButton.setVisibility(GONE); + muteButton.setVisibility(GONE); + avatars.setVisibility(GONE); + importingImageView.setVisibility(VISIBLE); + importingImageView.playAnimation(); + closeButton.setContentDescription(LocaleController.getString("AccDescrClosePlayer", R.string.AccDescrClosePlayer)); + if (playbackSpeedButton != null) { + playbackSpeedButton.setVisibility(GONE); + } + titleTextView.setLayoutParams(LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 36, Gravity.LEFT | Gravity.TOP, 35, 0, 36, 0)); + } else if (style == 0 || style == 2) { + selector.setBackground(Theme.getSelectorDrawable(false)); + frameLayout.setBackgroundColor(Theme.getColor(Theme.key_inappPlayerBackground)); + frameLayout.setTag(Theme.key_inappPlayerBackground); + subtitleTextView.setVisibility(GONE); joinButton.setVisibility(GONE); closeButton.setVisibility(VISIBLE); playButton.setVisibility(VISIBLE); muteButton.setVisibility(GONE); + importingImageView.setVisibility(GONE); + importingImageView.stopAnimation(); avatars.setVisibility(GONE); - titleTextView.setTypeface(Typeface.DEFAULT); - titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); + for (int i = 0; i < 2; i++) { + TextView textView = i == 0 ? titleTextView.getTextView() : titleTextView.getNextTextView(); + if (textView == null) { + continue; + } + textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); + textView.setTextColor(Theme.getColor(Theme.key_inappPlayerTitle)); + textView.setTypeface(Typeface.DEFAULT); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); + } + titleTextView.setTag(Theme.key_inappPlayerTitle); if (style == 0) { playButton.setLayoutParams(LayoutHelper.createFrame(36, 36, Gravity.TOP | Gravity.LEFT, 0, 0, 0, 0)); titleTextView.setLayoutParams(LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 36, Gravity.LEFT | Gravity.TOP, 35, 0, 36, 0)); @@ -649,13 +738,22 @@ private void updateStyle(int style) { subtitleTextView.setVisibility(VISIBLE); joinButton.setVisibility(VISIBLE); - titleTextView.setTextColor(Theme.getColor(Theme.key_inappPlayerPerformer)); + for (int i = 0; i < 2; i++) { + TextView textView = i == 0 ? titleTextView.getTextView() : titleTextView.getNextTextView(); + if (textView == null) { + continue; + } + textView.setGravity(Gravity.TOP | Gravity.LEFT); + textView.setTextColor(Theme.getColor(Theme.key_inappPlayerPerformer)); + textView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); + } titleTextView.setTag(Theme.key_inappPlayerPerformer); - titleTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); - titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); titleTextView.setPadding(0, 0, 0, 0); - titleTextView.setText(LocaleController.getString("VoipGroupVoiceChat", R.string.VoipGroupVoiceChat)); - titleTextView.setGravity(Gravity.TOP | Gravity.LEFT); + titleTextView.setText(LocaleController.getString("VoipGroupVoiceChat", R.string.VoipGroupVoiceChat), false); + + importingImageView.setVisibility(GONE); + importingImageView.stopAnimation(); avatars.setVisibility(VISIBLE); updateAvatars(false); @@ -667,37 +765,42 @@ private void updateStyle(int style) { } } else if (style == 1 || style == 3) { selector.setBackground(null); + updateCallTitle(); + avatars.setVisibility(VISIBLE); if (style == 3) { - updateGroupCallTitle(); - muteButton.setVisibility(VISIBLE); - avatars.setVisibility(VISIBLE); - updateAvatars(false); - isMuted = VoIPService.getSharedInstance() != null && VoIPService.getSharedInstance().isMicMute(); - muteDrawable.setCustomEndFrame(isMuted ? 15 : 29); - muteDrawable.setCurrentFrame(muteDrawable.getCustomEndFrame() - 1, false, true); - muteButton.invalidate(); - frameLayout.setBackground(null); - Theme.getFragmentContextViewWavesDrawable().addParent(this); if (VoIPService.getSharedInstance() != null) { VoIPService.getSharedInstance().registerStateListener(this); } - invalidate(); - } else { - frameLayout.setTag(Theme.key_returnToCallBackground); - titleTextView.setText(LocaleController.getString("ReturnToCall", R.string.ReturnToCall)); - muteButton.setVisibility(GONE); - avatars.setVisibility(GONE); - frameLayout.setBackgroundColor(Theme.getColor(Theme.key_returnToCallBackground)); - } - titleTextView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); - titleTextView.setTextColor(Theme.getColor(Theme.key_returnToCallText)); + } + updateAvatars(false); + muteButton.setVisibility(VISIBLE); + isMuted = VoIPService.getSharedInstance() != null && VoIPService.getSharedInstance().isMicMute(); + muteDrawable.setCustomEndFrame(isMuted ? 15 : 29); + muteDrawable.setCurrentFrame(muteDrawable.getCustomEndFrame() - 1, false, true); + muteButton.invalidate(); + frameLayout.setBackground(null); + importingImageView.setVisibility(GONE); + importingImageView.stopAnimation(); + Theme.getFragmentContextViewWavesDrawable().addParent(this); + invalidate(); + + for (int i = 0; i < 2; i++) { + TextView textView = i == 0 ? titleTextView.getTextView() : titleTextView.getNextTextView(); + if (textView == null) { + continue; + } + textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); + textView.setTextColor(Theme.getColor(Theme.key_returnToCallText)); + textView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + } + titleTextView.setTag(Theme.key_returnToCallText); closeButton.setVisibility(GONE); playButton.setVisibility(GONE); subtitleTextView.setVisibility(GONE); joinButton.setVisibility(GONE); - titleTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); - titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + titleTextView.setLayoutParams(LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER, 0, 0, 0, 2)); titleTextView.setPadding(AndroidUtilities.dp(112), 0, AndroidUtilities.dp(112), 0); if (playbackSpeedButton != null) { @@ -726,6 +829,7 @@ protected void onDetachedFromWindow() { NotificationCenter.getInstance(a).removeObserver(this, NotificationCenter.messagePlayingDidStart); NotificationCenter.getInstance(a).removeObserver(this, NotificationCenter.groupCallUpdated); NotificationCenter.getInstance(a).removeObserver(this, NotificationCenter.groupCallTypingsUpdated); + NotificationCenter.getInstance(a).removeObserver(this, NotificationCenter.historyImportProgressChanged); } NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.messagePlayingSpeedChanged); NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.didStartedCall); @@ -735,7 +839,7 @@ protected void onDetachedFromWindow() { NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.groupCallVisibilityChanged); } - if (currentStyle == 3) { + if (currentStyle == 3 || currentStyle == 1) { Theme.getFragmentContextViewWavesDrawable().removeParent(this); } if (VoIPService.getSharedInstance() != null) { @@ -761,6 +865,7 @@ protected void onAttachedToWindow() { NotificationCenter.getInstance(a).addObserver(this, NotificationCenter.messagePlayingDidStart); NotificationCenter.getInstance(a).addObserver(this, NotificationCenter.groupCallUpdated); NotificationCenter.getInstance(a).addObserver(this, NotificationCenter.groupCallTypingsUpdated); + NotificationCenter.getInstance(a).addObserver(this, NotificationCenter.historyImportProgressChanged); } NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.messagePlayingSpeedChanged); NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.didStartedCall); @@ -774,6 +879,8 @@ protected void onAttachedToWindow() { if (VoIPService.getSharedInstance() != null && !VoIPService.getSharedInstance().isHangingUp() && VoIPService.getSharedInstance().getCallState() != VoIPService.STATE_WAITING_INCOMING && !GroupCallPip.isShowing()) { checkCall(true); + } else if (fragment instanceof ChatActivity && fragment.getSendMessagesHelper().getImportingHistory(((ChatActivity) fragment).getDialogId()) != null && !isPlayingVoice()) { + checkImport(true); } else if (fragment instanceof ChatActivity && ((ChatActivity) fragment).getGroupCall() != null && !GroupCallPip.isShowing() && !isPlayingVoice()) { checkCall(true); } else { @@ -782,7 +889,7 @@ protected void onAttachedToWindow() { } } - if (currentStyle == 3) { + if (currentStyle == 3 || currentStyle == 1) { Theme.getFragmentContextViewWavesDrawable().addParent(this); if (VoIPService.getSharedInstance() != null) { VoIPService.getSharedInstance().registerStateListener(this); @@ -822,7 +929,7 @@ public void didReceivedNotification(int id, int account, Object... args) { } } } else if (id == NotificationCenter.messagePlayingDidStart || id == NotificationCenter.messagePlayingPlayStateChanged || id == NotificationCenter.messagePlayingDidReset || id == NotificationCenter.didEndCall) { - if (currentStyle == 3 || currentStyle == 4) { + if (currentStyle == 1 || currentStyle == 3 || currentStyle == 4) { checkCall(false); } checkPlayer(false); @@ -853,13 +960,18 @@ public void didReceivedNotification(int id, int account, Object... args) { ChatObject.Call call = ((ChatActivity) fragment).getGroupCall(); if (call != null) { if (call.call.participants_count == 0) { - subtitleTextView.setText(LocaleController.getString("MembersTalkingNobody", R.string.MembersTalkingNobody)); + subtitleTextView.setText(LocaleController.getString("MembersTalkingNobody", R.string.MembersTalkingNobody), false); } else { - subtitleTextView.setText(LocaleController.formatPluralString("Participants", call.call.participants_count)); + subtitleTextView.setText(LocaleController.formatPluralString("Participants", call.call.participants_count), false); } } updateAvatars(true); } + } else if (id == NotificationCenter.historyImportProgressChanged) { + if (currentStyle == 1 || currentStyle == 3 || currentStyle == 4) { + checkCall(false); + } + checkImport(false); } else if (id == NotificationCenter.messagePlayingSpeedChanged) { updatePlaybackButton(); } else if (id == NotificationCenter.webRtcMicAmplitudeEvent) { @@ -994,10 +1106,17 @@ public void onAnimationEnd(Animator animation) { String fullString = String.format(str, liveLocation, param); int start = fullString.indexOf(liveLocation); SpannableStringBuilder stringBuilder = new SpannableStringBuilder(fullString); - titleTextView.setEllipsize(TextUtils.TruncateAt.END); + for (int i = 0; i < 2; i++) { + TextView textView = i == 0 ? titleTextView.getTextView() : titleTextView.getNextTextView(); + if (textView == null) { + continue; + } + textView.setEllipsize(TextUtils.TruncateAt.END); + } + TypefaceSpan span = new TypefaceSpan(AndroidUtilities.getTypeface("fonts/rmedium.ttf"), 0, Theme.getColor(Theme.key_inappPlayerPerformer)); stringBuilder.setSpan(span, start, start + liveLocation.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); - titleTextView.setText(stringBuilder); + titleTextView.setText(stringBuilder, false); } else { checkLocationRunnable.run(); checkLocationString(); @@ -1072,16 +1191,22 @@ private void checkLocationString() { lastString = fullString; int start = fullString.indexOf(liveLocation); SpannableStringBuilder stringBuilder = new SpannableStringBuilder(fullString); - titleTextView.setEllipsize(TextUtils.TruncateAt.END); + for (int i = 0; i < 2; i++) { + TextView textView = i == 0 ? titleTextView.getTextView() : titleTextView.getNextTextView(); + if (textView == null) { + continue; + } + textView.setEllipsize(TextUtils.TruncateAt.END); + } if (start >= 0) { TypefaceSpan span = new TypefaceSpan(AndroidUtilities.getTypeface("fonts/rmedium.ttf"), 0, Theme.getColor(Theme.key_inappPlayerPerformer)); stringBuilder.setSpan(span, start, start + liveLocation.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); } - titleTextView.setText(stringBuilder); + titleTextView.setText(stringBuilder, false); } private void checkPlayer(boolean create) { - if (visible && (currentStyle == 3 || currentStyle == 4 && !isPlayingVoice())) { + if (visible && (currentStyle == 1 || currentStyle == 3 || (currentStyle == 4 || currentStyle == 5) && !isPlayingVoice())) { return; } MessageObject messageObject = MediaController.getInstance().getPlayingMessageObject(); @@ -1091,6 +1216,7 @@ private void checkPlayer(boolean create) { create = true; } } + boolean wasVisible = visible; if (messageObject == null || messageObject.getId() == 0 || messageObject.isVideo()) { lastMessageObject = null; boolean callAvailable = supportsCalls && VoIPService.getSharedInstance() != null && !VoIPService.getSharedInstance().isHangingUp() && VoIPService.getSharedInstance().getCallState() != VoIPService.STATE_WAITING_INCOMING && !GroupCallPip.isShowing(); @@ -1134,9 +1260,12 @@ public void onAnimationEnd(Animator animation) { checkCall(false); } else if (checkPlayerAfterAnimation) { checkPlayer(false); + } else if (checkImportAfterAnimation) { + checkImport(false); } checkCallAfterAnimation = false; checkPlayerAfterAnimation = false; + checkImportAfterAnimation = false; } } }); @@ -1191,9 +1320,12 @@ public void onAnimationEnd(Animator animation) { checkCall(false); } else if (checkPlayerAfterAnimation) { checkPlayer(false); + } else if (checkImportAfterAnimation) { + checkImport(false); } checkCallAfterAnimation = false; checkPlayerAfterAnimation = false; + checkImportAfterAnimation = false; } } }); @@ -1220,7 +1352,15 @@ public void onAnimationEnd(Animator animation) { } titleTextView.setPadding(0, 0, AndroidUtilities.dp(44), 0); stringBuilder = new SpannableStringBuilder(String.format("%s %s", messageObject.getMusicAuthor(), messageObject.getMusicTitle())); - titleTextView.setEllipsize(TextUtils.TruncateAt.MIDDLE); + + for (int i = 0; i < 2; i++) { + TextView textView = i == 0 ? titleTextView.getTextView() : titleTextView.getNextTextView(); + if (textView == null) { + continue; + } + textView.setEllipsize(TextUtils.TruncateAt.MIDDLE); + } + updatePlaybackButton(); } else { isMusic = true; @@ -1239,11 +1379,147 @@ public void onAnimationEnd(Animator animation) { titleTextView.setPadding(0, 0, 0, 0); } stringBuilder = new SpannableStringBuilder(String.format("%s - %s", messageObject.getMusicAuthor(), messageObject.getMusicTitle())); - titleTextView.setEllipsize(TextUtils.TruncateAt.END); + for (int i = 0; i < 2; i++) { + TextView textView = i == 0 ? titleTextView.getTextView() : titleTextView.getNextTextView(); + if (textView == null) { + continue; + } + textView.setEllipsize(TextUtils.TruncateAt.END); + } } TypefaceSpan span = new TypefaceSpan(AndroidUtilities.getTypeface("fonts/rmedium.ttf"), 0, Theme.getColor(Theme.key_inappPlayerPerformer)); stringBuilder.setSpan(span, 0, messageObject.getMusicAuthor().length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); - titleTextView.setText(stringBuilder); + titleTextView.setText(stringBuilder, !create && wasVisible); + } + } + } + + public void checkImport(boolean create) { + if (!(fragment instanceof ChatActivity) || visible && (currentStyle == 1 || currentStyle == 3)) { + return; + } + ChatActivity chatActivity = (ChatActivity) fragment; + SendMessagesHelper.ImportingHistory importingHistory = chatActivity.getSendMessagesHelper().getImportingHistory(chatActivity.getDialogId()); + View fragmentView = fragment.getFragmentView(); + if (!create && fragmentView != null) { + if (fragmentView.getParent() == null || ((View) fragmentView.getParent()).getVisibility() != VISIBLE) { + create = true; + } + } + + Dialog dialog = chatActivity.getVisibleDialog(); + if ((isPlayingVoice() || chatActivity.shouldShowImport() || dialog instanceof ImportingAlert && !((ImportingAlert) dialog).isDismissed()) && importingHistory != null) { + importingHistory = null; + } + + if (importingHistory == null) { + if (visible && (create && currentStyle == -1 || currentStyle == 5)) { + visible = false; + if (create) { + if (getVisibility() != GONE) { + setVisibility(GONE); + } + setTopPadding(0); + } else { + if (animatorSet != null) { + animatorSet.cancel(); + animatorSet = null; + } + final int currentAccount = account; + animationIndex = NotificationCenter.getInstance(currentAccount).setAnimationInProgress(animationIndex, null); + animatorSet = new AnimatorSet(); + animatorSet.playTogether(ObjectAnimator.ofFloat(this, "topPadding", 0)); + animatorSet.setDuration(220); + animatorSet.setInterpolator(CubicBezierInterpolator.DEFAULT); + animatorSet.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + NotificationCenter.getInstance(currentAccount).onAnimationFinish(animationIndex); + if (animatorSet != null && animatorSet.equals(animation)) { + setVisibility(GONE); + animatorSet = null; + if (checkCallAfterAnimation) { + checkCall(false); + } else if (checkPlayerAfterAnimation) { + checkPlayer(false); + } else if (checkImportAfterAnimation) { + checkImport(false); + } + checkCallAfterAnimation = false; + checkPlayerAfterAnimation = false; + checkImportAfterAnimation = false; + } + } + }); + animatorSet.start(); + } + } else if (currentStyle == -1 || currentStyle == 5) { + visible = false; + setVisibility(GONE); + } + } else { + if (currentStyle != 5 && animatorSet != null && !create) { + checkImportAfterAnimation = true; + return; + } + int prevStyle = currentStyle; + updateStyle(5); + if (create && topPadding == 0) { + updatePaddings(); + setTopPadding(AndroidUtilities.dp2(getStyleHeight())); + if (delegate != null) { + delegate.onAnimation(true, true); + delegate.onAnimation(false, true); + } + } + if (!visible) { + if (!create) { + if (animatorSet != null) { + animatorSet.cancel(); + animatorSet = null; + } + animationIndex = NotificationCenter.getInstance(account).setAnimationInProgress(animationIndex, null); + animatorSet = new AnimatorSet(); + if (additionalContextView != null && additionalContextView.getVisibility() == VISIBLE) { + ((LayoutParams) getLayoutParams()).topMargin = -AndroidUtilities.dp(getStyleHeight() + additionalContextView.getStyleHeight()); + } else { + ((LayoutParams) getLayoutParams()).topMargin = -AndroidUtilities.dp(getStyleHeight()); + } + if (delegate != null) { + delegate.onAnimation(true, true); + } + animatorSet.playTogether(ObjectAnimator.ofFloat(this, "topPadding", AndroidUtilities.dp2(getStyleHeight()))); + animatorSet.setDuration(200); + animatorSet.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + NotificationCenter.getInstance(account).onAnimationFinish(animationIndex); + if (animatorSet != null && animatorSet.equals(animation)) { + if (delegate != null) { + delegate.onAnimation(false, true); + } + animatorSet = null; + if (checkCallAfterAnimation) { + checkCall(false); + } else if (checkPlayerAfterAnimation) { + checkPlayer(false); + } else if (checkImportAfterAnimation) { + checkImport(false); + } + checkCallAfterAnimation = false; + checkPlayerAfterAnimation = false; + checkImportAfterAnimation = false; + } + } + }); + animatorSet.start(); + } + visible = true; + setVisibility(VISIBLE); + } + if (currentProgress != importingHistory.uploadProgress) { + currentProgress = importingHistory.uploadProgress; + titleTextView.setText(AndroidUtilities.replaceTags(LocaleController.formatString("ImportUploading", R.string.ImportUploading, importingHistory.uploadProgress)), false); } } } @@ -1254,6 +1530,9 @@ private boolean isPlayingVoice() { } public void checkCall(boolean create) { + if (visible && currentStyle == 5 && (VoIPService.getSharedInstance() == null || VoIPService.getSharedInstance().isHangingUp())) { + return; + } View fragmentView = fragment.getFragmentView(); if (!create && fragmentView != null) { if (fragmentView.getParent() == null || ((View) fragmentView.getParent()).getVisibility() != VISIBLE) { @@ -1271,14 +1550,17 @@ public void checkCall(boolean create) { callAvailable = false; } groupActive = false; - if (!isPlayingVoice() && !GroupCallActivity.groupCallUiVisible && supportsCalls && !callAvailable && fragment instanceof ChatActivity && ((ChatActivity) fragment).getGroupCall() != null) { - callAvailable = true; - groupActive = true; + if (!isPlayingVoice() && !GroupCallActivity.groupCallUiVisible && supportsCalls && !callAvailable && fragment instanceof ChatActivity) { + ChatObject.Call call = ((ChatActivity) fragment).getGroupCall(); + if (call != null && call.call.participants_count > 0) { + callAvailable = true; + groupActive = true; + } } } if (!callAvailable) { - if (visible && (create && currentStyle == -1 || currentStyle == 4 || currentStyle == 3)) { + if (visible && (create && currentStyle == -1 || currentStyle == 4 || currentStyle == 3 || currentStyle == 1)) { visible = false; if (create) { if (getVisibility() != GONE) { @@ -1307,15 +1589,18 @@ public void onAnimationEnd(Animator animation) { checkCall(false); } else if (checkPlayerAfterAnimation) { checkPlayer(false); + } else if (checkImportAfterAnimation) { + checkImport(false); } checkCallAfterAnimation = false; checkPlayerAfterAnimation = false; + checkImportAfterAnimation = false; } } }); animatorSet.start(); } - } else if (currentStyle == -1 || currentStyle == 4 || currentStyle == 3) { + } else if (currentStyle == -1 || currentStyle == 4 || currentStyle == 3 || currentStyle == 1) { visible = false; setVisibility(GONE); } @@ -1364,9 +1649,9 @@ public void onAnimationEnd(Animator animation) { ChatObject.Call call = ((ChatActivity) fragment).getGroupCall(); if (call.call.participants_count == 0) { - subtitleTextView.setText(LocaleController.getString("MembersTalkingNobody", R.string.MembersTalkingNobody)); + subtitleTextView.setText(LocaleController.getString("MembersTalkingNobody", R.string.MembersTalkingNobody), false); } else { - subtitleTextView.setText(LocaleController.formatPluralString("Participants", call.call.participants_count)); + subtitleTextView.setText(LocaleController.formatPluralString("Participants", call.call.participants_count), false); } updateAvatars(avatars.wasDraw && updateAnimated); @@ -1375,6 +1660,7 @@ public void onAnimationEnd(Animator animation) { updateAvatars(currentStyle == 3); updateStyle(3); } else { + updateAvatars(currentStyle == 1); updateStyle(1); } } @@ -1406,9 +1692,12 @@ public void onAnimationEnd(Animator animation) { checkCall(false); } else if (checkPlayerAfterAnimation) { checkPlayer(false); + } else if (checkImportAfterAnimation) { + checkImport(false); } checkCallAfterAnimation = false; checkPlayerAfterAnimation = false; + checkImportAfterAnimation = false; } }); animatorSet.start(); @@ -1430,6 +1719,7 @@ private void updateAvatars(boolean animated) { } } ChatObject.Call call; + TLRPC.User userCall; if (avatars.transitionProgressAnimator == null) { int currentAccount; if (currentStyle == 4) { @@ -1441,12 +1731,15 @@ private void updateAvatars(boolean animated) { call = null; currentAccount = account; } + userCall = null; } else { if (VoIPService.getSharedInstance() != null) { call = VoIPService.getSharedInstance().groupCall; + userCall = fragment instanceof ChatActivity ? null : VoIPService.getSharedInstance().getUser(); currentAccount = VoIPService.getSharedInstance().getAccount(); } else { call = null; + userCall = null; currentAccount = account; } } @@ -1458,13 +1751,17 @@ private void updateAvatars(boolean animated) { avatars.setObject(a, currentAccount, null); } } - avatars.commitTransition(animated); + } else if (userCall != null) { + avatars.setObject(0, currentAccount, userCall); + for (int a = 1; a < 3; a++) { + avatars.setObject(a, currentAccount, null); + } } else { for (int a = 0; a < 3; a++) { avatars.setObject(a, currentAccount, null); } - avatars.commitTransition(animated); } + avatars.commitTransition(animated); if (currentStyle == 4 && call != null) { int N = Math.min(3, call.sortedParticipants.size()); @@ -1510,7 +1807,7 @@ protected void dispatchDraw(Canvas canvas) { return; } boolean clipped = false; - if (currentStyle == 3 && drawOverlay) { + if ((currentStyle == 3 || currentStyle == 1) && drawOverlay) { Theme.getFragmentContextViewWavesDrawable().updateState(wasDraw); float progress = topPadding / AndroidUtilities.dp((getStyleHeight())); @@ -1547,15 +1844,15 @@ public void setDrawOverlay(boolean drawOverlay) { @Override public void invalidate() { super.invalidate(); - if (currentStyle == 3) { + if (currentStyle == 3 || currentStyle == 1) { if (getParent() != null) { ((View) getParent()).invalidate(); } } } - public int getCurrentStyle() { - return currentStyle; + public boolean isCallStyle() { + return currentStyle == 3 || currentStyle == 1; } @Override @@ -1584,35 +1881,29 @@ private void updatePaddings() { @Override public void onStateChanged(int state) { - updateGroupCallTitle(); + updateCallTitle(); } - private void updateGroupCallTitle() { + private void updateCallTitle() { VoIPService service = VoIPService.getSharedInstance(); - if (service != null && currentStyle == 3) { + if (service != null && (currentStyle == 1 || currentStyle == 3)) { int currentCallState = service.getCallState(); if (currentCallState == VoIPService.STATE_WAIT_INIT || currentCallState == VoIPService.STATE_WAIT_INIT_ACK || currentCallState == VoIPService.STATE_CREATING || currentCallState == VoIPService.STATE_RECONNECTING) { - titleTextView.setText(LocaleController.getString("VoipGroupConnecting", R.string. VoipGroupConnecting)); + titleTextView.setText(LocaleController.getString("VoipGroupConnecting", R.string. VoipGroupConnecting), false); } else if (service.getChat() != null) { if (fragment instanceof ChatActivity && ((ChatActivity) fragment).getCurrentChat() != null && ((ChatActivity) fragment).getCurrentChat().id == service.getChat().id) { - titleTextView.setText(LocaleController.getString("VoipGroupViewVoiceChat", R.string.VoipGroupViewVoiceChat)); + titleTextView.setText(LocaleController.getString("VoipGroupViewVoiceChat", R.string.VoipGroupViewVoiceChat), false); + } else { + titleTextView.setText(service.getChat().title, false); + } + } else if (service.getUser() != null) { + TLRPC.User user = service.getUser(); + if (fragment instanceof ChatActivity && ((ChatActivity) fragment).getCurrentUser() != null && ((ChatActivity) fragment).getCurrentUser().id == user.id) { + titleTextView.setText(LocaleController.getString("ReturnToCall", R.string.ReturnToCall)); } else { - titleTextView.setText(service.getChat().title); + titleTextView.setText(ContactsController.formatName(user.first_name, user.last_name)); } } } } - - public float hotspotX; - public float hotspotY; - - @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { - if (ev.getAction() == MotionEvent.ACTION_DOWN) { - hotspotX = ev.getX(); - hotspotY = ev.getY(); - } - return super.onInterceptTouchEvent(ev); - } - } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/FragmentContextViewWavesDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/FragmentContextViewWavesDrawable.java index e85b37c0cda..39d4b726933 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/FragmentContextViewWavesDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/FragmentContextViewWavesDrawable.java @@ -1,7 +1,6 @@ package org.telegram.ui.Components; import android.graphics.Canvas; -import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Path; @@ -10,12 +9,9 @@ import android.graphics.RadialGradient; import android.graphics.RectF; import android.graphics.Shader; -import android.os.Build; import android.os.SystemClock; import android.view.View; -import androidx.core.graphics.ColorUtils; - import org.telegram.messenger.AccountInstance; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.ChatObject; @@ -300,10 +296,15 @@ public void updateState(boolean animated) { if (currentCallState == VoIPService.STATE_WAIT_INIT || currentCallState == VoIPService.STATE_WAIT_INIT_ACK || currentCallState == VoIPService.STATE_CREATING || currentCallState == VoIPService.STATE_RECONNECTING) { setState(FragmentContextViewWavesDrawable.MUTE_BUTTON_STATE_CONNECTING, animated); } else { - TLRPC.TL_groupCallParticipant participant = VoIPService.getSharedInstance().groupCall.participants.get(AccountInstance.getInstance(VoIPService.getSharedInstance().getAccount()).getUserConfig().getClientUserId()); - if (participant != null && !participant.can_self_unmute && participant.muted && !ChatObject.canManageCalls(VoIPService.getSharedInstance().getChat())) { - VoIPService.getSharedInstance().setMicMute(true, false, false); - setState(FragmentContextViewWavesDrawable.MUTE_BUTTON_STATE_MUTED_BY_ADMIN, animated); + if (VoIPService.getSharedInstance().groupCall != null) { + TLRPC.TL_groupCallParticipant participant = VoIPService.getSharedInstance().groupCall.participants.get(AccountInstance.getInstance(VoIPService.getSharedInstance().getAccount()).getUserConfig().getClientUserId()); + if (participant != null && !participant.can_self_unmute && participant.muted && !ChatObject.canManageCalls(VoIPService.getSharedInstance().getChat())) { + VoIPService.getSharedInstance().setMicMute(true, false, false); + setState(FragmentContextViewWavesDrawable.MUTE_BUTTON_STATE_MUTED_BY_ADMIN, animated); + } else { + boolean isMuted = VoIPService.getSharedInstance().isMicMute(); + setState(isMuted ? FragmentContextViewWavesDrawable.MUTE_BUTTON_STATE_MUTE : FragmentContextViewWavesDrawable.MUTE_BUTTON_STATE_UNMUTE, animated); + } } else { boolean isMuted = VoIPService.getSharedInstance().isMicMute(); setState(isMuted ? FragmentContextViewWavesDrawable.MUTE_BUTTON_STATE_MUTE : FragmentContextViewWavesDrawable.MUTE_BUTTON_STATE_UNMUTE, animated); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/GroupVoipInviteAlert.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/GroupVoipInviteAlert.java index a5b8d4e2689..88df5a0a135 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/GroupVoipInviteAlert.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/GroupVoipInviteAlert.java @@ -70,31 +70,12 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -public class GroupVoipInviteAlert extends BottomSheet { +public class GroupVoipInviteAlert extends UsersAlertBase { - private FrameLayout frameLayout; - private RecyclerListView listView; - private SearchAdapter searchListViewAdapter; - private ListAdapter listViewAdapter; - private Drawable shadowDrawable; - private View shadow; - private AnimatorSet shadowAnimation; - private StickerEmptyView emptyView; - private FlickerLoadingView flickerLoadingView; - private SearchField searchView; - - private RectF rect = new RectF(); - private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); - - private String linkToCopy; - - private int scrollOffsetY; + private final SearchAdapter searchAdapter; private int delayResults; - private float colorProgress; - private int backgroundColor; - private TLRPC.Chat currentChat; private TLRPC.ChatFull info; @@ -129,323 +110,37 @@ public interface GroupVoipInviteAlertDelegate { void needOpenSearch(MotionEvent ev, EditTextBoldCursor editText); } - @SuppressWarnings("FieldCanBeLocal") - private class SearchField extends FrameLayout { - - private View searchBackground; - private ImageView searchIconImageView; - private ImageView clearSearchImageView; - private CloseProgressDrawable2 progressDrawable; - private EditTextBoldCursor searchEditText; - private View backgroundView; - - public SearchField(Context context) { - super(context); - - searchBackground = new View(context); - searchBackground.setBackgroundDrawable(Theme.createRoundRectDrawable(AndroidUtilities.dp(18), Theme.getColor(Theme.key_voipgroup_searchBackground))); - addView(searchBackground, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 36, Gravity.LEFT | Gravity.TOP, 14, 11, 14, 0)); - - searchIconImageView = new ImageView(context); - searchIconImageView.setScaleType(ImageView.ScaleType.CENTER); - searchIconImageView.setImageResource(R.drawable.smiles_inputsearch); - searchIconImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_voipgroup_searchPlaceholder), PorterDuff.Mode.MULTIPLY)); - addView(searchIconImageView, LayoutHelper.createFrame(36, 36, Gravity.LEFT | Gravity.TOP, 16, 11, 0, 0)); - - clearSearchImageView = new ImageView(context); - clearSearchImageView.setScaleType(ImageView.ScaleType.CENTER); - clearSearchImageView.setImageDrawable(progressDrawable = new CloseProgressDrawable2()); - progressDrawable.setSide(AndroidUtilities.dp(7)); - clearSearchImageView.setScaleX(0.1f); - clearSearchImageView.setScaleY(0.1f); - clearSearchImageView.setAlpha(0.0f); - clearSearchImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_voipgroup_searchPlaceholder), PorterDuff.Mode.MULTIPLY)); - addView(clearSearchImageView, LayoutHelper.createFrame(36, 36, Gravity.RIGHT | Gravity.TOP, 14, 11, 14, 0)); - clearSearchImageView.setOnClickListener(v -> { - searchEditText.setText(""); - AndroidUtilities.showKeyboard(searchEditText); - }); - - searchEditText = new EditTextBoldCursor(context) { - @Override - public boolean dispatchTouchEvent(MotionEvent event) { - MotionEvent e = MotionEvent.obtain(event); - e.setLocation(e.getRawX(), e.getRawY() - containerView.getTranslationY()); - if (e.getAction() == MotionEvent.ACTION_UP) { - e.setAction(MotionEvent.ACTION_CANCEL); - } - listView.dispatchTouchEvent(e); - e.recycle(); - return super.dispatchTouchEvent(event); - } - }; - searchEditText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); - searchEditText.setHintTextColor(Theme.getColor(Theme.key_voipgroup_searchPlaceholder)); - searchEditText.setTextColor(Theme.getColor(Theme.key_voipgroup_searchText)); - searchEditText.setBackgroundDrawable(null); - searchEditText.setPadding(0, 0, 0, 0); - searchEditText.setMaxLines(1); - searchEditText.setLines(1); - searchEditText.setSingleLine(true); - searchEditText.setImeOptions(EditorInfo.IME_ACTION_SEARCH | EditorInfo.IME_FLAG_NO_EXTRACT_UI); - searchEditText.setHint(LocaleController.getString("VoipGroupSearchMembers", R.string.VoipGroupSearchMembers)); - searchEditText.setCursorColor(Theme.getColor(Theme.key_voipgroup_searchText)); - searchEditText.setCursorSize(AndroidUtilities.dp(20)); - searchEditText.setCursorWidth(1.5f); - addView(searchEditText, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 40, Gravity.LEFT | Gravity.TOP, 16 + 38, 9, 16 + 30, 0)); - searchEditText.addTextChangedListener(new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - - } - - @Override - public void afterTextChanged(Editable s) { - boolean show = searchEditText.length() > 0; - boolean showed = clearSearchImageView.getAlpha() != 0; - if (show != showed) { - clearSearchImageView.animate() - .alpha(show ? 1.0f : 0.0f) - .setDuration(150) - .scaleX(show ? 1.0f : 0.1f) - .scaleY(show ? 1.0f : 0.1f) - .start(); - } - String text = searchEditText.getText().toString(); - int oldItemsCount = listView.getAdapter() == null ? 0 : listView.getAdapter().getItemCount(); - searchListViewAdapter.searchUsers(text); - if (TextUtils.isEmpty(text) && listView != null && listView.getAdapter() != listViewAdapter) { - listView.setAnimateEmptyView(false, 0); - listView.setAdapter(listViewAdapter); - listView.setAnimateEmptyView(true, 0); - if (oldItemsCount == 0) { - showItemsAnimated(0); - } - } - flickerLoadingView.setVisibility(View.VISIBLE); - } - }); - searchEditText.setOnEditorActionListener((v, actionId, event) -> { - if (event != null && (event.getAction() == KeyEvent.ACTION_UP && event.getKeyCode() == KeyEvent.KEYCODE_SEARCH || event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) { - AndroidUtilities.hideKeyboard(searchEditText); - } - return false; - }); - } - - public void hideKeyboard() { - AndroidUtilities.hideKeyboard(searchEditText); - } - - @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { - delegate.needOpenSearch(ev, searchEditText); - return super.onInterceptTouchEvent(ev); - } + @Override + protected void updateColorKeys() { + keyScrollUp = Theme.key_voipgroup_scrollUp; + keyListSelector = Theme.key_voipgroup_listSelector; + keySearchBackground = Theme.key_voipgroup_searchBackground; + keyInviteMembersBackground = Theme.key_voipgroup_inviteMembersBackground; + keyListViewBackground = Theme.key_voipgroup_listViewBackground; + keyActionBarUnscrolled = Theme.key_voipgroup_actionBarUnscrolled; + keyNameText = Theme.key_voipgroup_nameText; + keyLastSeenText = Theme.key_voipgroup_lastSeenText; + keyLastSeenTextUnscrolled = Theme.key_voipgroup_lastSeenTextUnscrolled; + keySearchPlaceholder = Theme.key_voipgroup_searchPlaceholder; + keySearchText = Theme.key_voipgroup_searchText; + keySearchIcon = Theme.key_voipgroup_mutedIcon; + keySearchIconUnscrolled = Theme.key_voipgroup_mutedIconUnscrolled; } - public static final Property COLOR_PROGRESS = new AnimationProperties.FloatProperty("colorProgress") { - @Override - public void setValue(GroupVoipInviteAlert object, float value) { - object.setColorProgress(value); - } - - @Override - public Float get(GroupVoipInviteAlert object) { - return object.getColorProgress(); - } - }; - public GroupVoipInviteAlert(final Context context, int account, TLRPC.Chat chat, TLRPC.ChatFull chatFull, SparseArray participants, HashSet invited) { - super(context, false); + super(context, false, account); setDimBehindAlpha(75); - currentAccount = account; currentChat = chat; info = chatFull; ignoredUsers = participants; invitedUsers = invited; - shadowDrawable = context.getResources().getDrawable(R.drawable.sheet_shadow_round).mutate(); - - containerView = new FrameLayout(context) { - - private boolean ignoreLayout = false; - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - int totalHeight = MeasureSpec.getSize(heightMeasureSpec); - - if (Build.VERSION.SDK_INT >= 21) { - ignoreLayout = true; - setPadding(backgroundPaddingLeft, AndroidUtilities.statusBarHeight, backgroundPaddingLeft, 0); - ignoreLayout = false; - } - int availableHeight = totalHeight - getPaddingTop(); - int padding; - if (keyboardVisible) { - padding = AndroidUtilities.dp(8); - setAllowNestedScroll(false); - } else { - padding = availableHeight - (availableHeight / 5 * 3) + AndroidUtilities.dp(8); - setAllowNestedScroll(true); - } - if (listView.getPaddingTop() != padding) { - ignoreLayout = true; - listView.setPadding(0, padding, 0, 0); - ignoreLayout = false; - } - super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(totalHeight, MeasureSpec.EXACTLY)); - } - - @Override - protected void onLayout(boolean changed, int l, int t, int r, int b) { - super.onLayout(changed, l, t, r, b); - updateLayout(); - } - - @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { - if (ev.getAction() == MotionEvent.ACTION_DOWN && ev.getY() < scrollOffsetY) { - dismiss(); - return true; - } - return super.onInterceptTouchEvent(ev); - } - - @Override - public boolean onTouchEvent(MotionEvent e) { - return !isDismissed() && super.onTouchEvent(e); - } - - @Override - public void requestLayout() { - if (ignoreLayout) { - return; - } - super.requestLayout(); - } - - @Override - protected void onDraw(Canvas canvas) { - canvas.save(); - int y = scrollOffsetY - backgroundPaddingTop + AndroidUtilities.dp(6); - int top = scrollOffsetY - backgroundPaddingTop - AndroidUtilities.dp(13); - int height = getMeasuredHeight() + AndroidUtilities.dp(30) + backgroundPaddingTop; - int statusBarHeight = 0; - float radProgress = 1.0f; - if (Build.VERSION.SDK_INT >= 21) { - top += AndroidUtilities.statusBarHeight; - y += AndroidUtilities.statusBarHeight; - height -= AndroidUtilities.statusBarHeight; - - if (top + backgroundPaddingTop < AndroidUtilities.statusBarHeight * 2) { - int diff = Math.min(AndroidUtilities.statusBarHeight, AndroidUtilities.statusBarHeight * 2 - top - backgroundPaddingTop); - top -= diff; - height += diff; - radProgress = 1.0f - Math.min(1.0f, (diff * 2) / (float) AndroidUtilities.statusBarHeight); - } - if (top + backgroundPaddingTop < AndroidUtilities.statusBarHeight) { - statusBarHeight = Math.min(AndroidUtilities.statusBarHeight, AndroidUtilities.statusBarHeight - top - backgroundPaddingTop); - } - } - - shadowDrawable.setBounds(0, top, getMeasuredWidth(), height); - shadowDrawable.draw(canvas); - - if (radProgress != 1.0f) { - Theme.dialogs_onlineCirclePaint.setColor(backgroundColor); - rect.set(backgroundPaddingLeft, backgroundPaddingTop + top, getMeasuredWidth() - backgroundPaddingLeft, backgroundPaddingTop + top + AndroidUtilities.dp(24)); - canvas.drawRoundRect(rect, AndroidUtilities.dp(12) * radProgress, AndroidUtilities.dp(12) * radProgress, Theme.dialogs_onlineCirclePaint); - } - - int w = AndroidUtilities.dp(36); - rect.set((getMeasuredWidth() - w) / 2, y, (getMeasuredWidth() + w) / 2, y + AndroidUtilities.dp(4)); - Theme.dialogs_onlineCirclePaint.setColor(Theme.getColor(Theme.key_voipgroup_scrollUp)); - canvas.drawRoundRect(rect, AndroidUtilities.dp(2), AndroidUtilities.dp(2), Theme.dialogs_onlineCirclePaint); - - if (statusBarHeight > 0) { - int finalColor = Color.argb(0xff, (int) (Color.red(backgroundColor) * 0.8f), (int) (Color.green(backgroundColor) * 0.8f), (int) (Color.blue(backgroundColor) * 0.8f)); - Theme.dialogs_onlineCirclePaint.setColor(finalColor); - canvas.drawRect(backgroundPaddingLeft, AndroidUtilities.statusBarHeight - statusBarHeight, getMeasuredWidth() - backgroundPaddingLeft, AndroidUtilities.statusBarHeight, Theme.dialogs_onlineCirclePaint); - } - canvas.restore(); - } - - @Override - protected void dispatchDraw(Canvas canvas) { - canvas.save(); - canvas.clipRect(0, getPaddingTop(), getMeasuredWidth(), getMeasuredHeight()); - super.dispatchDraw(canvas); - canvas.restore(); - } - }; - containerView.setWillNotDraw(false); - containerView.setClipChildren(false); - containerView.setPadding(backgroundPaddingLeft, 0, backgroundPaddingLeft, 0); - - frameLayout = new FrameLayout(context); - - searchView = new SearchField(context); - frameLayout.addView(searchView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT)); - - flickerLoadingView = new FlickerLoadingView(context); - flickerLoadingView.setViewType(FlickerLoadingView.USERS_TYPE); - flickerLoadingView.showDate(false); - flickerLoadingView.setUseHeaderOffset(true); - flickerLoadingView.setColors(Theme.key_voipgroup_inviteMembersBackground, Theme.key_voipgroup_searchBackground, Theme.key_voipgroup_actionBarUnscrolled); - - emptyView = new StickerEmptyView(context, flickerLoadingView, StickerEmptyView.STICKER_TYPE_SEARCH); - emptyView.addView(flickerLoadingView, 0, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, 0,0,2,0,0)); - emptyView.title.setText(LocaleController.getString("NoResult", R.string.NoResult)); - emptyView.subtitle.setText(LocaleController.getString("SearchEmptyViewFilteredSubtitle2", R.string.SearchEmptyViewFilteredSubtitle2)); - emptyView.setVisibility(View.GONE); - emptyView.setAnimateLayoutChange(true); - emptyView.showProgress(true, false); - emptyView.setColors(Theme.key_voipgroup_nameText, Theme.key_voipgroup_lastSeenText, Theme.key_voipgroup_inviteMembersBackground, Theme.key_voipgroup_searchBackground); - containerView.addView(emptyView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.LEFT | Gravity.TOP, 0, 58 + 4, 0, 0)); - - searchListViewAdapter = new SearchAdapter(context); - - listView = new RecyclerListView(context) { - @Override - protected boolean allowSelectChildAtPosition(float x, float y) { - return y >= scrollOffsetY + AndroidUtilities.dp(48) + (Build.VERSION.SDK_INT >= 21 ? AndroidUtilities.statusBarHeight : 0); - } - - @Override - public void setTranslationY(float translationY) { - super.setTranslationY(translationY); - int[] ii = new int[2]; - getLocationInWindow(ii); - } - - @Override - protected boolean emptyViewIsVisible() { - if (getAdapter() == null) { - return false; - } - return getAdapter().getItemCount() <= 2; - } - }; - listView.setTag(13); - listView.setPadding(0, 0, 0, AndroidUtilities.dp(48)); - listView.setClipToPadding(false); - listView.setHideIfEmpty(false); - listView.setSelectorDrawableColor(Theme.getColor(Theme.key_voipgroup_listSelector)); - FillLastLinearLayoutManager layoutManager = new FillLastLinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false, AndroidUtilities.dp(8), listView); - layoutManager.setBind(false); - listView.setLayoutManager(layoutManager); - listView.setHorizontalScrollBarEnabled(false); - listView.setVerticalScrollBarEnabled(false); - containerView.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT, 0, 0, 0, 0)); - listView.setAdapter(listViewAdapter = new ListAdapter(context)); + currentChat = chat; + info = chatFull; + ignoredUsers = participants; + invitedUsers = invited; listView.setOnItemClickListener((view, position) -> { if (position == addNewRow) { delegate.copyInviteLink(); @@ -458,89 +153,18 @@ protected boolean emptyViewIsVisible() { delegate.inviteUser(cell.getUserId()); } }); - listView.setOnScrollListener(new RecyclerView.OnScrollListener() { - @Override - public void onScrolled(RecyclerView recyclerView, int dx, int dy) { - updateLayout(); - } - - @Override - public void onScrollStateChanged(RecyclerView recyclerView, int newState) { - if (newState == RecyclerView.SCROLL_STATE_IDLE) { - if (scrollOffsetY + backgroundPaddingTop + AndroidUtilities.dp(13) < AndroidUtilities.statusBarHeight * 2 && listView.canScrollVertically(1)) { - View child = listView.getChildAt(0); - RecyclerListView.Holder holder = (RecyclerListView.Holder) listView.findViewHolderForAdapterPosition(0); - if (holder != null && holder.itemView.getTop() > 0) { - listView.smoothScrollBy(0, holder.itemView.getTop()); - } - } - } - } - }); - - FrameLayout.LayoutParams frameLayoutParams = new FrameLayout.LayoutParams(LayoutHelper.MATCH_PARENT, AndroidUtilities.getShadowHeight(), Gravity.TOP | Gravity.LEFT); - frameLayoutParams.topMargin = AndroidUtilities.dp(58); - shadow = new View(context); - shadow.setBackgroundColor(Theme.getColor(Theme.key_dialogShadowLine)); - shadow.setAlpha(0.0f); - shadow.setTag(1); - containerView.addView(shadow, frameLayoutParams); - - containerView.addView(frameLayout, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 58, Gravity.LEFT | Gravity.TOP)); - - setColorProgress(0.0f); - + searchListViewAdapter = searchAdapter = new SearchAdapter(context); + listView.setAdapter(listViewAdapter = new ListAdapter(context)); loadChatParticipants(0, 200); updateRows(); - listView.setEmptyView(emptyView); - listView.setAnimateEmptyView(true, 0); - } - - private float getColorProgress() { - return colorProgress; - } - - private void setColorProgress(float progress) { - colorProgress = progress; - backgroundColor = AndroidUtilities.getOffsetColor(Theme.getColor(Theme.key_voipgroup_inviteMembersBackground), Theme.getColor(Theme.key_voipgroup_listViewBackground), progress, 1.0f); - shadowDrawable.setColorFilter(new PorterDuffColorFilter(backgroundColor, PorterDuff.Mode.MULTIPLY)); - frameLayout.setBackgroundColor(backgroundColor); - navBarColor = backgroundColor; - listView.setGlowColor(backgroundColor); - - int color = AndroidUtilities.getOffsetColor(Theme.getColor(Theme.key_voipgroup_lastSeenTextUnscrolled), Theme.getColor(Theme.key_voipgroup_lastSeenText), progress, 1.0f); - int color2 = AndroidUtilities.getOffsetColor(Theme.getColor(Theme.key_voipgroup_mutedIconUnscrolled), Theme.getColor(Theme.key_voipgroup_mutedIcon), progress, 1.0f);// - for (int a = 0, N = listView.getChildCount(); a < N; a++) { - View child = listView.getChildAt(a); - if (child instanceof GroupCallTextCell) { - GroupCallTextCell cell = (GroupCallTextCell) child; - cell.setColors(color, color); - } else if (child instanceof GroupCallUserCell) { - GroupCallUserCell cell = (GroupCallUserCell) child; - cell.setGrayIconColor(shadow.getTag() != null ? Theme.key_voipgroup_mutedIcon : Theme.key_voipgroup_mutedIconUnscrolled, color2); - } - } - containerView.invalidate(); - listView.invalidate(); - container.invalidate(); + setColorProgress(0.0f); } public void setDelegate(GroupVoipInviteAlertDelegate groupVoipInviteAlertDelegate) { delegate = groupVoipInviteAlertDelegate; } - private int getCurrentTop() { - if (listView.getChildCount() != 0) { - View child = listView.getChildAt(0); - RecyclerListView.Holder holder = (RecyclerListView.Holder) listView.findContainingViewHolder(child); - if (holder != null) { - return listView.getPaddingTop() - (holder.getAdapterPosition() == 0 && child.getTop() >= 0 ? child.getTop() : 0); - } - } - return -1000; - } - private void updateRows() { addNewRow = -1; emptyRow = -1; @@ -581,107 +205,6 @@ private void updateRows() { lastRow = rowCount++; } - @Override - protected boolean canDismissWithSwipe() { - return false; - } - - @Override - public void dismiss() { - AndroidUtilities.hideKeyboard(searchView.searchEditText); - super.dismiss(); - } - - @SuppressLint("NewApi") - private void updateLayout() { - if (listView.getChildCount() <= 0) { - return; - } - View child = listView.getChildAt(0); - RecyclerListView.Holder holder = (RecyclerListView.Holder) listView.findContainingViewHolder(child); - int top = child.getTop() - AndroidUtilities.dp(8); - int newOffset = top > 0 && holder != null && holder.getAdapterPosition() == 0 ? top : 0; - if (top >= 0 && holder != null && holder.getAdapterPosition() == 0) { - newOffset = top; - runShadowAnimation(false); - } else { - runShadowAnimation(true); - } - if (scrollOffsetY != newOffset) { - listView.setTopGlowOffset(scrollOffsetY = (int) (newOffset)); - frameLayout.setTranslationY(scrollOffsetY); - emptyView.setTranslationY(scrollOffsetY); - containerView.invalidate(); - } - } - - private void runShadowAnimation(final boolean show) { - if (show && shadow.getTag() != null || !show && shadow.getTag() == null) { - shadow.setTag(show ? null : 1); - if (show) { - shadow.setVisibility(View.VISIBLE); - } - if (shadowAnimation != null) { - shadowAnimation.cancel(); - } - shadowAnimation = new AnimatorSet(); - shadowAnimation.playTogether(ObjectAnimator.ofFloat(shadow, View.ALPHA, show ? 1.0f : 0.0f)); - shadowAnimation.setDuration(150); - shadowAnimation.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - if (shadowAnimation != null && shadowAnimation.equals(animation)) { - if (!show) { - shadow.setVisibility(View.INVISIBLE); - } - shadowAnimation = null; - } - } - - @Override - public void onAnimationCancel(Animator animation) { - if (shadowAnimation != null && shadowAnimation.equals(animation)) { - shadowAnimation = null; - } - } - }); - shadowAnimation.start(); - } - } - - private void showItemsAnimated(int from) { - if (!isShowing()) { - return; - } - listView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { - @Override - public boolean onPreDraw() { - listView.getViewTreeObserver().removeOnPreDrawListener(this); - int n = listView.getChildCount(); - AnimatorSet animatorSet = new AnimatorSet(); - for (int i = 0; i < n; i++) { - View child = listView.getChildAt(i); - int position = listView.getChildAdapterPosition(child); - if (position < from) { - continue; - } - if (position == 1 && listView.getAdapter() == searchListViewAdapter && child instanceof GraySectionCell) { - child = ((GraySectionCell) child).getTextView(); - } - child.setAlpha(0); - int s = Math.min(listView.getMeasuredHeight(), Math.max(0, child.getTop())); - int delay = (int) ((s / (float) listView.getMeasuredHeight()) * 100); - ObjectAnimator a = ObjectAnimator.ofFloat(child, View.ALPHA, 0, 1f); - a.setStartDelay(delay); - a.setDuration(200); - animatorSet.playTogether(a); - } - animatorSet.start(); - return true; - } - }); - } - private void loadChatParticipants(int offset, int count) { if (loadingUsers) { return; @@ -690,7 +213,8 @@ private void loadChatParticipants(int offset, int count) { loadChatParticipants(offset, count, true); } - private void loadChatParticipants(int offset, int count, boolean reset) { + + protected void loadChatParticipants(int offset, int count, boolean reset) { if (!ChatObject.isChannel(currentChat)) { loadingUsers = false; participants.clear(); @@ -1364,4 +888,13 @@ public TLObject getItem(int position) { } } + @Override + protected void search(String text) { + searchAdapter.searchUsers(text); + } + + @Override + protected void onSearchViewTouched(MotionEvent ev, EditTextBoldCursor searchEditText) { + delegate.needOpenSearch(ev, searchEditText); + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/GroupedPhotosListView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/GroupedPhotosListView.java index 57ebe5e101a..16cd09dc3af 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/GroupedPhotosListView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/GroupedPhotosListView.java @@ -236,7 +236,7 @@ public void onAnimationEnd(Animator animation) { } } if (!changed) { - if (newCount != currentPhotos.size() || currentObjects.indexOf(currentObject) == -1) { + if (newCount != currentPhotos.size() || !currentObjects.contains(currentObject)) { changed = true; } else { int newImageIndex = currentObjects.indexOf(currentObject); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ImageUpdater.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ImageUpdater.java index e0dfb9e1639..502aa463b2c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ImageUpdater.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ImageUpdater.java @@ -11,6 +11,7 @@ import android.Manifest; import android.app.Activity; import android.app.Dialog; +import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Bitmap; @@ -136,12 +137,12 @@ public void setDelegate(ImageUpdaterDelegate imageUpdaterDelegate) { delegate = imageUpdaterDelegate; } - public void openMenu(boolean hasAvatar, Runnable onDeleteAvatar) { + public void openMenu(boolean hasAvatar, Runnable onDeleteAvatar, DialogInterface.OnDismissListener onDismiss) { if (parentFragment == null || parentFragment.getParentActivity() == null) { return; } if (useAttachMenu) { - openAttachMenu(); + openAttachMenu(onDismiss); return; } BottomSheet.Builder builder = new BottomSheet.Builder(parentFragment.getParentActivity()); @@ -196,6 +197,7 @@ public void openMenu(boolean hasAvatar, Runnable onDeleteAvatar) { } }); BottomSheet sheet = builder.create(); + sheet.setOnHideListener(onDismiss); parentFragment.showDialog(sheet); if (hasAvatar) { sheet.setItemColor(items.size() - 1, Theme.getColor(Theme.key_dialogTextRed2), Theme.getColor(Theme.key_dialogRedIcon)); @@ -296,7 +298,7 @@ public void onCaptionChanged(CharSequence caption) { parentFragment.presentFragment(fragment); } - private void openAttachMenu() { + private void openAttachMenu(DialogInterface.OnDismissListener onDismissListener) { if (parentFragment == null || parentFragment.getParentActivity() == null) { return; } @@ -308,6 +310,7 @@ private void openAttachMenu() { AndroidUtilities.hideKeyboard(parentFragment.getFragmentView().findFocus()); } chatAttachAlert.init(); + chatAttachAlert.setOnHideListener(onDismissListener); parentFragment.showDialog(chatAttachAlert); } @@ -874,7 +877,7 @@ public void didReceivedNotification(int id, int account, Object... args) { return; } uploadingVideo = (String) args[1]; - parentFragment.getFileLoader().uploadFile(uploadingVideo, false, false, (int) convertingVideo.videoEditedInfo.estimatedSize, ConnectionsManager.FileTypeVideo); + parentFragment.getFileLoader().uploadFile(uploadingVideo, false, false, (int) convertingVideo.videoEditedInfo.estimatedSize, ConnectionsManager.FileTypeVideo, false); } } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ImportingAlert.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ImportingAlert.java new file mode 100644 index 00000000000..97fe6d2290a --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ImportingAlert.java @@ -0,0 +1,255 @@ +/* + * This is the source code of Telegram for Android v. 5.x.x. + * It is licensed under GNU GPL v. 2 or later. + * You should have received a copy of the license in this archive (see LICENSE). + * + * Copyright Nikolai Kudashov, 2013-2018. + */ + +package org.telegram.ui.Components; + +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; +import android.content.Context; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; +import android.text.TextUtils; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.View; +import android.view.animation.OvershootInterpolator; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.FileLog; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.NotificationCenter; +import org.telegram.messenger.R; +import org.telegram.messenger.SendMessagesHelper; +import org.telegram.ui.ActionBar.BottomSheet; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.ChatActivity; + +public class ImportingAlert extends BottomSheet implements NotificationCenter.NotificationCenterDelegate { + + private TextView[] importCountTextView = new TextView[2]; + private TextView percentTextView; + private LineProgressView lineProgressView; + private ChatActivity parentFragment; + private RLottieImageView imageView; + private BottomSheetCell cell; + private boolean compteled; + private RLottieDrawable completedDrawable; + private TextView[] infoTextView = new TextView[2]; + + public static class BottomSheetCell extends FrameLayout { + + private View background; + private TextView textView; + private RLottieImageView imageView; + private LinearLayout linearLayout; + + public BottomSheetCell(Context context) { + super(context); + + background = new View(context); + background.setBackground(Theme.createSimpleSelectorRoundRectDrawable(AndroidUtilities.dp(4), Theme.getColor(Theme.key_featuredStickers_addButton), Theme.getColor(Theme.key_featuredStickers_addButtonPressed))); + addView(background, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, 0, 16, 16, 16, 16)); + + linearLayout = new LinearLayout(context); + linearLayout.setOrientation(LinearLayout.HORIZONTAL); + addView(linearLayout, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); + + imageView = new RLottieImageView(context); + imageView.setBackground(Theme.createCircleDrawable(AndroidUtilities.dp(20), Theme.getColor(Theme.key_featuredStickers_buttonText))); + imageView.setScaleType(ImageView.ScaleType.CENTER); + imageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_featuredStickers_addButton), PorterDuff.Mode.MULTIPLY)); + imageView.setAnimation(R.raw.import_check, 26, 26); + imageView.setScaleX(0.8f); + imageView.setScaleY(0.8f); + linearLayout.addView(imageView, LayoutHelper.createLinear(20, 20, Gravity.CENTER_VERTICAL)); + + textView = new TextView(context); + textView.setLines(1); + textView.setSingleLine(true); + textView.setGravity(Gravity.CENTER_HORIZONTAL); + textView.setEllipsize(TextUtils.TruncateAt.END); + textView.setGravity(Gravity.CENTER); + textView.setTextColor(Theme.getColor(Theme.key_featuredStickers_buttonText)); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + textView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + linearLayout.addView(textView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_VERTICAL, 10, 0, 0, 0)); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(80), MeasureSpec.EXACTLY)); + } + + public void setTextColor(int color) { + textView.setTextColor(color); + } + + public void setGravity(int gravity) { + textView.setGravity(gravity); + } + + public void setText(CharSequence text) { + textView.setText(text); + } + } + + @SuppressWarnings("FieldCanBeLocal") + private final Runnable onFinishCallback = () -> { + if (compteled) { + imageView.getAnimatedDrawable().setAutoRepeat(0); + imageView.setAnimation(completedDrawable); + imageView.playAnimation(); + } + }; + + public ImportingAlert(final Context context, ChatActivity chatActivity) { + super(context, false); + setApplyBottomPadding(false); + setApplyTopPadding(false); + parentFragment = chatActivity; + + FrameLayout frameLayout = new FrameLayout(context); + setCustomView(frameLayout); + + TextView textView = new TextView(context); + textView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); + textView.setTextColor(Theme.getColor(Theme.key_dialogTextBlack)); + textView.setText(LocaleController.getString("ImportImportingTitle", R.string.ImportImportingTitle)); + textView.setSingleLine(true); + textView.setEllipsize(TextUtils.TruncateAt.END); + frameLayout.addView(textView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.LEFT, 17, 20, 17, 0)); + + completedDrawable = new RLottieDrawable(R.raw.import_finish, "" + R.raw.import_finish, AndroidUtilities.dp(120), AndroidUtilities.dp(120), false, null); + completedDrawable.setAllowDecodeSingleFrame(true); + + imageView = new RLottieImageView(context); + imageView.setAutoRepeat(true); + imageView.setAnimation(R.raw.import_loop, 120, 120); + imageView.playAnimation(); + frameLayout.addView(imageView, LayoutHelper.createFrame(160, 160, Gravity.CENTER_HORIZONTAL | Gravity.TOP, 17, 79, 17, 0)); + imageView.getAnimatedDrawable().setOnFinishCallback(onFinishCallback, 178); + + SendMessagesHelper.ImportingHistory importingHistory = parentFragment.getSendMessagesHelper().getImportingHistory(parentFragment.getDialogId()); + + percentTextView = new TextView(context); + percentTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + percentTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 24); + percentTextView.setTextColor(Theme.getColor(Theme.key_dialogTextBlack)); + percentTextView.setText(String.format("%d%%", importingHistory.uploadProgress)); + frameLayout.addView(percentTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.CENTER_HORIZONTAL, 17, 262, 17, 0)); + + lineProgressView = new LineProgressView(getContext()); + lineProgressView.setProgress(importingHistory.uploadProgress / 100.0f, false); + lineProgressView.setProgressColor(Theme.getColor(Theme.key_featuredStickers_addButton)); + lineProgressView.setBackColor(Theme.getColor(Theme.key_dialogLineProgressBackground)); + frameLayout.addView(lineProgressView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 4, Gravity.LEFT | Gravity.TOP, 50, 307, 50, 0)); + + cell = new BottomSheetCell(context); + cell.setBackground(null); + cell.setText(LocaleController.getString("ImportDone", R.string.ImportDone)); + cell.setVisibility(View.INVISIBLE); + cell.background.setOnClickListener(v -> dismiss()); + cell.background.setPivotY(AndroidUtilities.dp(48)); + cell.background.setScaleY(0.04f); + frameLayout.addView(cell, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 50, Gravity.LEFT | Gravity.TOP, 34, 247, 34, 0)); + + for (int a = 0; a < 2; a++) { + importCountTextView[a] = new TextView(context); + importCountTextView[a].setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + importCountTextView[a].setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + importCountTextView[a].setTextColor(Theme.getColor(Theme.key_dialogTextBlack)); + frameLayout.addView(importCountTextView[a], LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.CENTER_HORIZONTAL, 17, 340, 17, 0)); + + infoTextView[a] = new TextView(context); + infoTextView[a].setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + infoTextView[a].setTextColor(Theme.getColor(Theme.key_dialogTextGray3)); + infoTextView[a].setGravity(Gravity.CENTER_HORIZONTAL); + frameLayout.addView(infoTextView[a], LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.CENTER_HORIZONTAL, 30, 368, 30, 44)); + + if (a == 0) { + infoTextView[a].setText(LocaleController.getString("ImportImportingInfo", R.string.ImportImportingInfo)); + importCountTextView[a].setText(LocaleController.formatString("ImportCount", R.string.ImportCount, AndroidUtilities.formatFileSize(importingHistory.getUploadedCount()), AndroidUtilities.formatFileSize(importingHistory.getTotalCount()))); + } else { + infoTextView[a].setText(LocaleController.getString("ImportDoneInfo", R.string.ImportDoneInfo)); + importCountTextView[a].setText(LocaleController.getString("ImportDoneTitle", R.string.ImportDoneTitle)); + + infoTextView[a].setAlpha(0.0f); + infoTextView[a].setTranslationY(AndroidUtilities.dp(10)); + importCountTextView[a].setAlpha(0.0f); + importCountTextView[a].setTranslationY(AndroidUtilities.dp(10)); + } + } + + parentFragment.getNotificationCenter().addObserver(this, NotificationCenter.historyImportProgressChanged); + } + + public void setCompteled() { + compteled = true; + imageView.setAutoRepeat(false); + cell.setVisibility(View.VISIBLE); + AnimatorSet animatorSet = new AnimatorSet(); + animatorSet.setDuration(250); + animatorSet.setInterpolator(CubicBezierInterpolator.EASE_OUT); + animatorSet.playTogether( + ObjectAnimator.ofFloat(percentTextView, View.ALPHA, 0.0f), + ObjectAnimator.ofFloat(percentTextView, View.TRANSLATION_Y, -AndroidUtilities.dp(10)), + ObjectAnimator.ofFloat(infoTextView[0], View.ALPHA, 0.0f), + ObjectAnimator.ofFloat(infoTextView[0], View.TRANSLATION_Y, -AndroidUtilities.dp(10)), + ObjectAnimator.ofFloat(importCountTextView[0], View.ALPHA, 0.0f), + ObjectAnimator.ofFloat(importCountTextView[0], View.TRANSLATION_Y, -AndroidUtilities.dp(10)), + ObjectAnimator.ofFloat(infoTextView[1], View.ALPHA, 1.0f), + ObjectAnimator.ofFloat(infoTextView[1], View.TRANSLATION_Y, 0), + ObjectAnimator.ofFloat(importCountTextView[1], View.ALPHA, 1.0f), + ObjectAnimator.ofFloat(importCountTextView[1], View.TRANSLATION_Y, 0), + ObjectAnimator.ofFloat(lineProgressView, View.ALPHA, 0), + ObjectAnimator.ofFloat(cell.linearLayout, View.TRANSLATION_Y, AndroidUtilities.dp(8), 0) + ); + cell.background.animate().scaleY(1.0f).setInterpolator(new OvershootInterpolator(1.02f)).setDuration(250).start(); + cell.imageView.animate().scaleY(1.0f).scaleX(1.0f).setInterpolator(new OvershootInterpolator(1.02f)).setDuration(250).start(); + cell.imageView.playAnimation(); + animatorSet.start(); + } + + @Override + public void didReceivedNotification(int id, int account, Object... args) { + if (id == NotificationCenter.historyImportProgressChanged) { + if (args.length > 1) { + dismiss(); + return; + } + long dialogId = parentFragment.getDialogId(); + SendMessagesHelper.ImportingHistory importingHistory = parentFragment.getSendMessagesHelper().getImportingHistory(dialogId); + if (importingHistory == null) { + setCompteled(); + return; + } + if (!compteled) { + double timeToEndAnimation = (180 - imageView.getAnimatedDrawable().getCurrentFrame()) * 16.6 + 3000; + if (timeToEndAnimation >= importingHistory.timeUntilFinish) { + imageView.setAutoRepeat(false); + compteled = true; + } + } + + percentTextView.setText(String.format("%d%%", importingHistory.uploadProgress)); + importCountTextView[0].setText(LocaleController.formatString("ImportCount", R.string.ImportCount, AndroidUtilities.formatFileSize(importingHistory.getUploadedCount()), AndroidUtilities.formatFileSize(importingHistory.getTotalCount()))); + lineProgressView.setProgress(importingHistory.uploadProgress / 100.0f, true); + } + } + + @Override + public void dismissInternal() { + super.dismissInternal(); + parentFragment.getNotificationCenter().removeObserver(this, NotificationCenter.historyImportProgressChanged); + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/InstantCameraView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/InstantCameraView.java index 86aa0a8cb2d..f8e96dcb051 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/InstantCameraView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/InstantCameraView.java @@ -2254,7 +2254,7 @@ public Surface getInputSurface() { private void didWriteData(File file, long availableSize, boolean last) { if (videoConvertFirstWrite) { - FileLoader.getInstance(currentAccount).uploadFile(file.toString(), isSecretChat, false, 1, ConnectionsManager.FileTypeVideo); + FileLoader.getInstance(currentAccount).uploadFile(file.toString(), isSecretChat, false, 1, ConnectionsManager.FileTypeVideo, false); videoConvertFirstWrite = false; if (last) { FileLoader.getInstance(currentAccount).checkUploadNewDataAvailable(file.toString(), isSecretChat, availableSize, last ? file.length() : 0); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/InviteLinkBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/InviteLinkBottomSheet.java new file mode 100644 index 00000000000..c22e63a53e8 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/InviteLinkBottomSheet.java @@ -0,0 +1,710 @@ +package org.telegram.ui.Components; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.RectF; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.MessagesController; +import org.telegram.messenger.R; +import org.telegram.messenger.UserConfig; +import org.telegram.tgnet.ConnectionsManager; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.AlertDialog; +import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.ActionBar.BottomSheet; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Cells.HeaderCell; +import org.telegram.ui.Cells.ShadowSectionCell; +import org.telegram.ui.Cells.TextInfoPrivacyCell; +import org.telegram.ui.Cells.UserCell; +import org.telegram.ui.ManageLinksActivity; +import org.telegram.ui.ProfileActivity; + +import java.util.ArrayList; +import java.util.HashMap; + +public class InviteLinkBottomSheet extends BottomSheet { + + TLRPC.TL_chatInviteExported invite; + HashMap users; + TLRPC.ChatFull info; + + int creatorHeaderRow; + int creatorRow; + int dividerRow; + int divider2Row; + int usersHeaderRow; + int usersStartRow; + int usersEndRow; + int linkActionRow; + int linkInfoRow; + int loadingRow; + int emptyView; + int emptyView2; + + boolean usersLoading; + boolean hasMore; + + int rowCount; + Adapter adapter; + BaseFragment fragment; + + private RecyclerListView listView; + private TextView titleTextView; + private AnimatorSet shadowAnimation; + private View shadow; + + private int scrollOffsetY; + private boolean ignoreLayout; + private boolean permanent; + + ArrayList invitedUsers = new ArrayList<>(); + + private int chatId; + + public InviteLinkBottomSheet(Context context, TLRPC.TL_chatInviteExported invite, TLRPC.ChatFull info, HashMap users, BaseFragment fragment, int chatId, boolean permanent) { + super(context, false); + this.invite = invite; + this.users = users; + this.fragment = fragment; + this.info = info; + this.chatId = chatId; + this.permanent = permanent; + + containerView = new FrameLayout(context) { + + private RectF rect = new RectF(); + private boolean fullHeight; + + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + if (ev.getAction() == MotionEvent.ACTION_DOWN && scrollOffsetY != 0 && ev.getY() < scrollOffsetY) { + dismiss(); + return true; + } + return super.onInterceptTouchEvent(ev); + } + + @Override + public boolean onTouchEvent(MotionEvent e) { + return !isDismissed() && super.onTouchEvent(e); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int height = MeasureSpec.getSize(heightMeasureSpec); + if (Build.VERSION.SDK_INT >= 21) { + ignoreLayout = true; + setPadding(backgroundPaddingLeft, AndroidUtilities.statusBarHeight, backgroundPaddingLeft, 0); + ignoreLayout = false; + } + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); + fullHeight = true; + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + updateLayout(); + } + + @Override + public void requestLayout() { + if (ignoreLayout) { + return; + } + super.requestLayout(); + } + + @Override + protected void onDraw(Canvas canvas) { + int top = scrollOffsetY - backgroundPaddingTop - AndroidUtilities.dp(8); + int height = getMeasuredHeight() + AndroidUtilities.dp(36) + backgroundPaddingTop; + int statusBarHeight = 0; + float radProgress = 1.0f; + if (Build.VERSION.SDK_INT >= 21) { + top += AndroidUtilities.statusBarHeight; + height -= AndroidUtilities.statusBarHeight; + + if (fullHeight) { + if (top + backgroundPaddingTop < AndroidUtilities.statusBarHeight * 2) { + int diff = Math.min(AndroidUtilities.statusBarHeight, AndroidUtilities.statusBarHeight * 2 - top - backgroundPaddingTop); + top -= diff; + height += diff; + radProgress = 1.0f - Math.min(1.0f, (diff * 2) / (float) AndroidUtilities.statusBarHeight); + } + if (top + backgroundPaddingTop < AndroidUtilities.statusBarHeight) { + statusBarHeight = Math.min(AndroidUtilities.statusBarHeight, AndroidUtilities.statusBarHeight - top - backgroundPaddingTop); + } + } + } + + shadowDrawable.setBounds(0, top, getMeasuredWidth(), height); + shadowDrawable.draw(canvas); + + if (radProgress != 1.0f) { + Theme.dialogs_onlineCirclePaint.setColor(Theme.getColor(Theme.key_dialogBackground)); + rect.set(backgroundPaddingLeft, backgroundPaddingTop + top, getMeasuredWidth() - backgroundPaddingLeft, backgroundPaddingTop + top + AndroidUtilities.dp(24)); + canvas.drawRoundRect(rect, AndroidUtilities.dp(12) * radProgress, AndroidUtilities.dp(12) * radProgress, Theme.dialogs_onlineCirclePaint); + } + + if (statusBarHeight > 0) { + int color1 = Theme.getColor(Theme.key_dialogBackground); + int finalColor = Color.argb(0xff, (int) (Color.red(color1) * 0.8f), (int) (Color.green(color1) * 0.8f), (int) (Color.blue(color1) * 0.8f)); + Theme.dialogs_onlineCirclePaint.setColor(finalColor); + canvas.drawRect(backgroundPaddingLeft, AndroidUtilities.statusBarHeight - statusBarHeight, getMeasuredWidth() - backgroundPaddingLeft, AndroidUtilities.statusBarHeight, Theme.dialogs_onlineCirclePaint); + } + } + }; + containerView.setWillNotDraw(false); + + FrameLayout.LayoutParams frameLayoutParams = new FrameLayout.LayoutParams(LayoutHelper.MATCH_PARENT, AndroidUtilities.getShadowHeight(), Gravity.TOP | Gravity.LEFT); + frameLayoutParams.topMargin = AndroidUtilities.dp(48); + shadow = new View(context); + shadow.setAlpha(0.0f); + shadow.setVisibility(View.INVISIBLE); + shadow.setTag(1); + containerView.addView(shadow, frameLayoutParams); + + listView = new RecyclerListView(context) { + + int lastH; + @Override + public void requestLayout() { + if (ignoreLayout) { + return; + } + super.requestLayout(); + } + + @Override + protected void onMeasure(int widthSpec, int heightSpec) { + if (lastH != MeasureSpec.getSize(heightSpec)) { + lastH = MeasureSpec.getSize(heightSpec); + ignoreLayout = true; + listView.setPadding(0, 0, 0, 0); + ignoreLayout = false; + + measure(widthSpec, View.MeasureSpec.makeMeasureSpec(heightSpec, MeasureSpec.AT_MOST)); + int contentSize = getMeasuredHeight(); + + int padding = (int) (lastH / 5f * 2f); + if (padding < lastH - contentSize + AndroidUtilities.dp(60)) { + padding = lastH - contentSize; + } + ignoreLayout = true; + listView.setPadding(0, padding, 0, 0); + ignoreLayout = false; + + measure(widthSpec, View.MeasureSpec.makeMeasureSpec(heightSpec, MeasureSpec.AT_MOST)); + } + + super.onMeasure(widthSpec, heightSpec); + } + }; + listView.setTag(14); + LinearLayoutManager layoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false); + listView.setLayoutManager(layoutManager); + listView.setAdapter(adapter = new Adapter()); + listView.setVerticalScrollBarEnabled(false); + listView.setClipToPadding(false); + listView.setNestedScrollingEnabled(true); + listView.setOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrolled(RecyclerView recyclerView, int dx, int dy) { + updateLayout(); + if (hasMore && !usersLoading) { + int lastPosition = layoutManager.findLastVisibleItemPosition(); + if (rowCount - lastPosition < 10) { + loadUsers(); + } + } + } + }); + listView.setOnItemClickListener(new RecyclerListView.OnItemClickListener() { + @Override + public void onItemClick(View view, int position) { + if (position == creatorRow || (position >= usersStartRow && position < usersEndRow)) { + TLRPC.User user; + if (position == creatorRow) { + user = users.get(invite.admin_id); + } else { + TLRPC.TL_chatInviteImporter invitedUser = invitedUsers.get(position - usersStartRow); + user = users.get(invitedUser.user_id); + } + if (user != null) { + Bundle bundle = new Bundle(); + bundle.putInt("user_id", user.id); + MessagesController.getInstance(UserConfig.selectedAccount).putUser(user, false); + ProfileActivity profileActivity = new ProfileActivity(bundle); + fragment.presentFragment(profileActivity); + dismiss(); + } + } + } + }); + containerView.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT, 0, permanent ? 0 : 48, 0, 0)); + + if (!permanent) { + titleTextView = new TextView(context); + titleTextView.setLines(1); + titleTextView.setSingleLine(true); + titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); + titleTextView.setEllipsize(TextUtils.TruncateAt.END); + titleTextView.setPadding(AndroidUtilities.dp(18), 0, AndroidUtilities.dp(18), 0); + titleTextView.setGravity(Gravity.CENTER_VERTICAL); + titleTextView.setText(invite.revoked ? LocaleController.getString("RevokedLink", R.string.RevokedLink) : LocaleController.getString("InviteLink", R.string.InviteLink)); + titleTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + containerView.addView(titleTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 50, Gravity.LEFT | Gravity.TOP, 0, 0, 40, 0)); + } + + updateRows(); + loadUsers(); + if (users.get(invite.admin_id) == null) { + loadCreator(); + } + + updateColors(); + } + + public void updateColors() { + if (titleTextView != null) { + titleTextView.setTextColor(Theme.getColor(Theme.key_dialogTextBlack)); + titleTextView.setLinkTextColor(Theme.getColor(Theme.key_dialogTextLink)); + titleTextView.setHighlightColor(Theme.getColor(Theme.key_dialogLinkSelection)); + } + listView.setGlowColor(Theme.getColor(Theme.key_dialogScrollGlow)); + shadow.setBackgroundColor(Theme.getColor(Theme.key_dialogShadowLine)); + setBackgroundColor(Theme.getColor(Theme.key_dialogBackground)); + + + int count = listView.getHiddenChildCount(); + + for (int i = 0; i < listView.getChildCount(); i++) { + updateColorForView(listView.getChildAt(i)); + } + for (int a = 0; a < count; a++) { + updateColorForView(listView.getHiddenChildAt(a)); + } + count = listView.getCachedChildCount(); + for (int a = 0; a < count; a++) { + updateColorForView(listView.getCachedChildAt(a)); + } + count = listView.getAttachedScrapChildCount(); + for (int a = 0; a < count; a++) { + updateColorForView(listView.getAttachedScrapChildAt(a)); + } + containerView.invalidate(); + } + + private void updateColorForView(View view) { + if (view instanceof HeaderCell) { + ((HeaderCell) view).getTextView().setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueHeader)); + } else if (view instanceof LinkActionView){ + ((LinkActionView) view).updateColors(); + } else if (view instanceof TextInfoPrivacyCell) { + CombinedDrawable combinedDrawable = new CombinedDrawable(new ColorDrawable(Theme.getColor(Theme.key_windowBackgroundGray)), Theme.getThemedDrawable(view.getContext(), R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow)); + combinedDrawable.setFullsize(true); + view.setBackground(combinedDrawable); + ((TextInfoPrivacyCell) view).setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText4)); + } else if (view instanceof UserCell) { + ((UserCell) view).update(0); + } + RecyclerView.ViewHolder holder = listView.getChildViewHolder(view); + if (holder != null){ + if (holder.getItemViewType() == 7) { + Drawable shadowDrawable = Theme.getThemedDrawable(view.getContext(), R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow); + Drawable background = new ColorDrawable(Theme.getColor(Theme.key_windowBackgroundGray)); + CombinedDrawable combinedDrawable = new CombinedDrawable(background, shadowDrawable, 0, 0); + combinedDrawable.setFullsize(true); + view.setBackgroundDrawable(combinedDrawable); + } else if (holder.getItemViewType() == 2) { + Drawable shadowDrawable = Theme.getThemedDrawable(view.getContext(), R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow); + Drawable background = new ColorDrawable(Theme.getColor(Theme.key_windowBackgroundGray)); + CombinedDrawable combinedDrawable = new CombinedDrawable(background, shadowDrawable, 0, 0); + combinedDrawable.setFullsize(true); + view.setBackgroundDrawable(combinedDrawable); + } + } + } + + private void loadCreator() { + TLRPC.TL_users_getUsers req = new TLRPC.TL_users_getUsers(); + req.id.add(MessagesController.getInstance(UserConfig.selectedAccount).getInputUser(invite.admin_id)); + ConnectionsManager.getInstance(UserConfig.selectedAccount).sendRequest(req, (response, error) -> { + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + if (error == null) { + TLRPC.Vector vector = (TLRPC.Vector) response; + TLRPC.User user = (TLRPC.User) vector.objects.get(0); + users.put(invite.admin_id, user); + adapter.notifyDataSetChanged(); + } + } + }); + + }); + } + + @Override + protected boolean canDismissWithSwipe() { + return false; + } + + private void updateRows() { + rowCount = 0; + dividerRow = -1; + divider2Row = -1; + usersHeaderRow = -1; + usersStartRow = -1; + usersEndRow = -1; + emptyView2 = -1; + linkActionRow = -1; + linkInfoRow = -1; + + + if (!permanent) { + linkActionRow = rowCount++; + linkInfoRow = rowCount++; + } + creatorHeaderRow = rowCount++; + creatorRow = rowCount++; + emptyView = rowCount++; + + if (invite.usage > 0) { + dividerRow = rowCount++; + usersHeaderRow = rowCount++; + if (!invitedUsers.isEmpty()) { + usersStartRow = rowCount; + rowCount += invitedUsers.size(); + usersEndRow = rowCount; + } else { + loadingRow = rowCount++; + } + emptyView2 = rowCount++; + } + divider2Row = rowCount++; + + adapter.notifyDataSetChanged(); + } + + private class Adapter extends RecyclerListView.SelectionAdapter { + + @Override + public int getItemViewType(int position) { + if (position == creatorHeaderRow) { + return 0; + } else if (position == creatorRow || position >= usersStartRow && position < usersEndRow) { + return 1; + } else if (position == dividerRow) { + return 2; + } else if (position == linkActionRow) { + return 3; + } else if (position == linkInfoRow) { + return 4; + } else if (position == loadingRow) { + return 5; + } else if (position == emptyView || position == emptyView2) { + return 6; + } else if (position == divider2Row) { + return 7; + } + return 0; + } + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view; + Context context = parent.getContext(); + switch (viewType) { + default: + case 0: + view = new HeaderCell(context); + break; + case 1: + view = new UserCell(context, 12, 0, true); + break; + case 2: + view = new ShadowSectionCell(context, 12, Theme.getColor(Theme.key_windowBackgroundGray)); + break; + case 3: + LinkActionView linkActionView = new LinkActionView(context, fragment, InviteLinkBottomSheet.this, chatId, false); + view = linkActionView; + linkActionView.setDelegate(new LinkActionView.Delegate() { + @Override + public void revokeLink() { + if (fragment instanceof ManageLinksActivity) { + ((ManageLinksActivity) fragment).revokeLink(invite); + } + dismiss(); + } + + @Override + public void editLink() { + if (fragment instanceof ManageLinksActivity) { + ((ManageLinksActivity) fragment).editLink(invite); + } + dismiss(); + } + + @Override + public void removeLink() { + if (fragment instanceof ManageLinksActivity) { + ((ManageLinksActivity) fragment).deleteLink(invite); + } + dismiss(); + } + }); + view.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + break; + case 4: + view = new TextInfoPrivacyCell(context); + CombinedDrawable combinedDrawable = new CombinedDrawable(new ColorDrawable(Theme.getColor(Theme.key_windowBackgroundGray)), Theme.getThemedDrawable(context, R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow)); + combinedDrawable.setFullsize(true); + view.setBackground(combinedDrawable); + break; + case 5: + FlickerLoadingView flickerLoadingView = new FlickerLoadingView(context); + flickerLoadingView.setIsSingleCell(true); + flickerLoadingView.setViewType(FlickerLoadingView.USERS2_TYPE); + flickerLoadingView.showDate(false); + view = flickerLoadingView; + break; + case 6: + view = new View(context) { + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(5), MeasureSpec.EXACTLY)); + } + }; + break; + case 7: + view = new ShadowSectionCell(context, 12); + Drawable shadowDrawable = Theme.getThemedDrawable(context, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow); + Drawable background = new ColorDrawable(Theme.getColor(Theme.key_windowBackgroundGray)); + combinedDrawable = new CombinedDrawable(background, shadowDrawable, 0, 0); + combinedDrawable.setFullsize(true); + view.setBackgroundDrawable(combinedDrawable); + break; + } + view.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + return new RecyclerListView.Holder(view); + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + switch (holder.getItemViewType()) { + case 0: + HeaderCell headerCell = (HeaderCell) holder.itemView; + if (position == creatorHeaderRow) { + headerCell.setText(LocaleController.getString("LinkCreatedeBy", R.string.LinkCreatedeBy)); + } else if (position == usersHeaderRow) { + headerCell.setText(LocaleController.formatPluralString("PeopleJoined", invite.usage)); + } + break; + case 1: + UserCell userCell = (UserCell) holder.itemView; + TLRPC.User user; + String role = null; + String status = null; + if (position == creatorRow) { + user = users.get(invite.admin_id); + if (user != null) { + status = LocaleController.formatDateAudio(invite.date, false); + } + if (info != null && user != null) { + for (int i = 0; i < info.participants.participants.size(); i++) { + if (info.participants.participants.get(i).user_id == user.id) { + TLRPC.ChatParticipant part = info.participants.participants.get(i); + + if (part instanceof TLRPC.TL_chatChannelParticipant) { + TLRPC.ChannelParticipant channelParticipant = ((TLRPC.TL_chatChannelParticipant) part).channelParticipant; + if (!TextUtils.isEmpty(channelParticipant.rank)) { + role = channelParticipant.rank; + } else { + if (channelParticipant instanceof TLRPC.TL_channelParticipantCreator) { + role = LocaleController.getString("ChannelCreator", R.string.ChannelCreator); + } else if (channelParticipant instanceof TLRPC.TL_channelParticipantAdmin) { + role = LocaleController.getString("ChannelAdmin", R.string.ChannelAdmin); + } else { + role = null; + } + } + } else { + if (part instanceof TLRPC.TL_chatParticipantCreator) { + role = LocaleController.getString("ChannelCreator", R.string.ChannelCreator); + } else if (part instanceof TLRPC.TL_chatParticipantAdmin) { + role = LocaleController.getString("ChannelAdmin", R.string.ChannelAdmin); + } else { + role = null; + } + } + break; + } + } + + } + } else { + TLRPC.TL_chatInviteImporter invitedUser = invitedUsers.get(position - usersStartRow); + user = users.get(invitedUser.user_id); + } + userCell.setAdminRole(role); + userCell.setData(user, null, status, 0, false); + break; + case 3: + LinkActionView actionView = (LinkActionView) holder.itemView; + actionView.setUsers(0, null); + actionView.setLink(invite.link); + actionView.setRevoke(invite.revoked); + break; + case 4: + TextInfoPrivacyCell privacyCell = (TextInfoPrivacyCell) holder.itemView; + if (invite.revoked) { + privacyCell.setText(LocaleController.getString("LinkIsNoActive", R.string.LinkIsNoActive)); + } else if (invite.expired) { + privacyCell.setText(LocaleController.getString("LinkIsExpired", R.string.LinkIsExpired)); + } else if (invite.expire_date > 0) { + privacyCell.setText(LocaleController.formatString("LinkExpiresIn", R.string.LinkExpiresIn, LocaleController.formatDateAudio(invite.expire_date, false))); + } else { + privacyCell.setText(null); + } + break; + } + } + + @Override + public int getItemCount() { + return rowCount; + } + + @Override + public boolean isEnabled(RecyclerView.ViewHolder holder) { + int position = holder.getAdapterPosition(); + if (position == creatorRow || (position >= usersStartRow && position < usersEndRow)) { + return true; + } + return false; + } + } + + private void updateLayout() { + if (listView.getChildCount() <= 0) { + listView.setTopGlowOffset(scrollOffsetY = listView.getPaddingTop()); + titleTextView.setTranslationY(scrollOffsetY); + shadow.setTranslationY(scrollOffsetY); + containerView.invalidate(); + return; + } + View child = listView.getChildAt(0); + RecyclerListView.Holder holder = (RecyclerListView.Holder) listView.findContainingViewHolder(child); + int top = child.getTop(); + int newOffset = 0; + if (top >= 0 && holder != null && holder.getAdapterPosition() == 0) { + newOffset = top; + runShadowAnimation(false); + } else { + runShadowAnimation(true); + } + if (scrollOffsetY != newOffset) { + listView.setTopGlowOffset(scrollOffsetY = newOffset); + if (titleTextView != null) { + titleTextView.setTranslationY(scrollOffsetY); + } + shadow.setTranslationY(scrollOffsetY); + containerView.invalidate(); + } + } + + private void runShadowAnimation(final boolean show) { + if (show && shadow.getTag() != null || !show && shadow.getTag() == null) { + shadow.setTag(show ? null : 1); + if (show) { + shadow.setVisibility(View.VISIBLE); + } + if (shadowAnimation != null) { + shadowAnimation.cancel(); + } + shadowAnimation = new AnimatorSet(); + shadowAnimation.playTogether(ObjectAnimator.ofFloat(shadow, View.ALPHA, show ? 1.0f : 0.0f)); + shadowAnimation.setDuration(150); + shadowAnimation.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + if (shadowAnimation != null && shadowAnimation.equals(animation)) { + if (!show) { + shadow.setVisibility(View.INVISIBLE); + } + shadowAnimation = null; + } + } + + @Override + public void onAnimationCancel(Animator animation) { + if (shadowAnimation != null && shadowAnimation.equals(animation)) { + shadowAnimation = null; + } + } + }); + shadowAnimation.start(); + } + } + + public void loadUsers() { + if (invite.usage <= 0 || usersLoading) { + return; + } + TLRPC.TL_messages_getChatInviteImporters req = new TLRPC.TL_messages_getChatInviteImporters(); + req.link = invite.link; + req.peer = MessagesController.getInstance(UserConfig.selectedAccount).getInputPeer(-chatId); + if (invitedUsers.isEmpty()) { + req.offset_user = new TLRPC.TL_inputUserEmpty(); + } else { + TLRPC.TL_chatInviteImporter invitedUser = invitedUsers.get(invitedUsers.size() - 1); + req.offset_user = MessagesController.getInstance(currentAccount).getInputUser(users.get(invitedUser.user_id)); + req.offset_date = invitedUser.date; + } + usersLoading = true; + ConnectionsManager.getInstance(UserConfig.selectedAccount).sendRequest(req, (response, error) -> { + AndroidUtilities.runOnUIThread(() -> { + if (error == null) { + TLRPC.TL_messages_chatInviteImporters inviteImporters = (TLRPC.TL_messages_chatInviteImporters) response; + + invitedUsers.addAll(inviteImporters.importers); + + for (int i = 0; i < inviteImporters.users.size(); i++) { + TLRPC.User user = inviteImporters.users.get(i); + users.put(user.id, user); + } + hasMore = invitedUsers.size() < inviteImporters.count; + updateRows(); + } + usersLoading = false; + }); + }); + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/InviteMembersBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/InviteMembersBottomSheet.java new file mode 100644 index 00000000000..efff2779408 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/InviteMembersBottomSheet.java @@ -0,0 +1,1229 @@ +package org.telegram.ui.Components; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; +import android.animation.StateListAnimator; +import android.animation.ValueAnimator; +import android.annotation.SuppressLint; +import android.app.Activity; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Outline; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.TextUtils; +import android.text.style.ForegroundColorSpan; +import android.util.SparseArray; +import android.view.Gravity; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewConfiguration; +import android.view.ViewGroup; +import android.view.ViewOutlineProvider; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ScrollView; + +import androidx.annotation.NonNull; +import androidx.core.graphics.ColorUtils; +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.recyclerview.widget.RecyclerView; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.ApplicationLoader; +import org.telegram.messenger.ChatObject; +import org.telegram.messenger.ContactsController; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.MessagesController; +import org.telegram.messenger.R; +import org.telegram.messenger.UserObject; +import org.telegram.messenger.Utilities; +import org.telegram.tgnet.ConnectionsManager; +import org.telegram.tgnet.TLObject; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.AlertDialog; +import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Adapters.SearchAdapterHelper; +import org.telegram.ui.Cells.CheckBoxCell; +import org.telegram.ui.Cells.GroupCreateSectionCell; +import org.telegram.ui.Cells.GroupCreateUserCell; +import org.telegram.ui.Cells.ManageChatTextCell; +import org.telegram.ui.ChatActivity; +import org.telegram.ui.GroupCreateActivity; +import org.telegram.ui.LaunchActivity; + +import java.util.ArrayList; + +public class InviteMembersBottomSheet extends UsersAlertBase { + + private SparseArray ignoreUsers; + private final SpansContainer spansContainer; + private final ScrollView spansScrollView; + SearchAdapter searchAdapter; + + private int emptyRow; + private int copyLinkRow; + private int contactsStartRow; + private int contactsEndRow; + private int noContactsStubRow; + private int lastRow; + + private int rowCount; + + private AnimatorSet currentAnimation; + + private ArrayList contacts = new ArrayList<>(); + private SparseArray selectedContacts = new SparseArray<>(); + private ArrayList allSpans = new ArrayList<>(); + + boolean spanEnter; + float spansEnterProgress = 0; + private ValueAnimator spansEnterAnimator; + private GroupCreateSpan currentDeletingSpan; + int scrollViewH; + private GroupCreateActivity.ContactsAddActivityDelegate delegate; + + int additionalHeight; + + float touchSlop; + BaseFragment parentFragment; + + View.OnClickListener spanClickListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + GroupCreateSpan span = (GroupCreateSpan) v; + if (span.isDeleting()) { + currentDeletingSpan = null; + selectedContacts.remove(span.getUid()); + spansContainer.removeSpan(span); + spansCountChanged(); + AndroidUtilities.updateVisibleRows(listView); + } else { + if (currentDeletingSpan != null) { + currentDeletingSpan.cancelDeleteAnimation(); + } + currentDeletingSpan = span; + span.startDeleteAnimation(); + } + } + }; + private int maxSize; + private final ImageView floatingButton; + private AnimatorSet currentDoneButtonAnimation; + private int searchAdditionalHeight; + private int chatId; + + public InviteMembersBottomSheet(Context context, int account, SparseArray ignoreUsers, int chatId, BaseFragment parentFragment) { + super(context, false, account); + this.ignoreUsers = ignoreUsers; + needSnapToTop = false; + this.parentFragment = parentFragment; + this.chatId = chatId; + + final ViewConfiguration configuration = ViewConfiguration.get(context); + touchSlop = configuration.getScaledTouchSlop(); + + searchListViewAdapter = searchAdapter = new SearchAdapter(); + listView.setAdapter(listViewAdapter = new ListAdapter()); + + ArrayList arrayList = ContactsController.getInstance(account).contacts; + for (int a = 0; a < arrayList.size(); a++) { + TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(arrayList.get(a).user_id); + if (user == null || user.self || user.deleted) { + continue; + } + contacts.add(user); + } + + spansContainer = new SpansContainer(context); + + listView.setOnItemClickListener((view, position) -> { + TLObject object = null; + if (listView.getAdapter() == searchAdapter) { + int localCount = searchAdapter.searchResult.size(); + int globalCount = searchAdapter.searchAdapterHelper.getGlobalSearch().size(); + int localServerCount = searchAdapter.searchAdapterHelper.getLocalServerSearch().size(); + + position--; + if (position >= 0 && position < localCount) { + object = searchAdapter.searchResult.get(position); + } else if (position >= localCount && position < localServerCount + localCount) { + object = searchAdapter.searchAdapterHelper.getLocalServerSearch().get(position - localCount); + } else if (position > localCount + localServerCount && position <= globalCount + localCount + localServerCount) { + object = searchAdapter.searchAdapterHelper.getGlobalSearch().get(position - localCount - localServerCount - 1); + } + } else { + if (position == copyLinkRow) { + TLRPC.Chat chat = MessagesController.getInstance(currentAccount).getChat(chatId); + TLRPC.ChatFull chatInfo = MessagesController.getInstance(currentAccount).getChatFull(chatId); + String link = null; + if (chat != null && !TextUtils.isEmpty(chat.username)) { + link = "https://t.me/" + chat.username; + } else if (chatInfo != null && chatInfo.exported_invite != null) { + link = chatInfo.exported_invite.link; + } else { + generateLink(); + } + + if (link == null) { + return; + } + android.content.ClipboardManager clipboard = (android.content.ClipboardManager) ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE); + android.content.ClipData clip = android.content.ClipData.newPlainText("label", link); + clipboard.setPrimaryClip(clip); + BulletinFactory.createCopyLinkBulletin(parentFragment).show(); + dismiss(); + + } else if (position >= contactsStartRow && position < contactsEndRow) { + object = contacts.get(position - contactsStartRow); + } + } + + if (object != null) { + int id; + if (object instanceof TLRPC.User) { + id = ((TLRPC.User) object).id; + } else if (object instanceof TLRPC.Chat) { + id = -((TLRPC.Chat) object).id; + } else { + id = 0; + } + if (ignoreUsers != null && ignoreUsers.indexOfKey(id) >= 0) { + return; + } + if (id != 0) { + if (selectedContacts.indexOfKey(id) >= 0) { + GroupCreateSpan groupCreateSpan = selectedContacts.get(id); + selectedContacts.remove(id); + spansContainer.removeSpan(groupCreateSpan); + } else { + GroupCreateSpan groupCreateSpan = new GroupCreateSpan(context, object); + groupCreateSpan.setOnClickListener(spanClickListener); + selectedContacts.put(id, groupCreateSpan); + spansContainer.addSpan(groupCreateSpan); + } + } + spansCountChanged(); + AndroidUtilities.updateVisibleRows(listView); + } + }); + + listView.setItemAnimator(new ItemAnimator()); + updateRows(); + + + spansScrollView = new ScrollView(context) { + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + + if (AndroidUtilities.isTablet() || height > width) { + maxSize = AndroidUtilities.dp(144); + } else { + maxSize = AndroidUtilities.dp(56); + } + int lastH = getMeasuredHeight(); + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(maxSize, MeasureSpec.AT_MOST)); + + } + }; + spansScrollView.setVisibility(View.GONE); + spansScrollView.setClipChildren(false); + spansScrollView.addView(spansContainer); + containerView.addView(spansScrollView); + + floatingButton = new ImageView(context); + floatingButton.setScaleType(ImageView.ScaleType.CENTER); + + Drawable drawable = Theme.createSimpleSelectorCircleDrawable(AndroidUtilities.dp(56), Theme.getColor(Theme.key_chats_actionBackground), Theme.getColor(Theme.key_chats_actionPressedBackground)); + if (Build.VERSION.SDK_INT < 21) { + Drawable shadowDrawable = context.getResources().getDrawable(R.drawable.floating_shadow).mutate(); + shadowDrawable.setColorFilter(new PorterDuffColorFilter(0xff000000, PorterDuff.Mode.MULTIPLY)); + CombinedDrawable combinedDrawable = new CombinedDrawable(shadowDrawable, drawable, 0, 0); + combinedDrawable.setIconSize(AndroidUtilities.dp(56), AndroidUtilities.dp(56)); + drawable = combinedDrawable; + } + floatingButton.setBackgroundDrawable(drawable); + floatingButton.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chats_actionIcon), PorterDuff.Mode.MULTIPLY)); + floatingButton.setImageResource(R.drawable.floating_check); + + if (Build.VERSION.SDK_INT >= 21) { + StateListAnimator animator = new StateListAnimator(); + animator.addState(new int[]{android.R.attr.state_pressed}, ObjectAnimator.ofFloat(floatingButton, "translationZ", AndroidUtilities.dp(2), AndroidUtilities.dp(4)).setDuration(200)); + animator.addState(new int[]{}, ObjectAnimator.ofFloat(floatingButton, "translationZ", AndroidUtilities.dp(4), AndroidUtilities.dp(2)).setDuration(200)); + floatingButton.setStateListAnimator(animator); + floatingButton.setOutlineProvider(new ViewOutlineProvider() { + @SuppressLint("NewApi") + @Override + public void getOutline(View view, Outline outline) { + outline.setOval(0, 0, AndroidUtilities.dp(56), AndroidUtilities.dp(56)); + } + }); + } + + floatingButton.setOnClickListener(v -> { + if (selectedContacts.size() == 0) { + return; + } + Activity activity = AndroidUtilities.findActivity(context); + if (activity == null) { + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + if (selectedContacts.size() == 1) { + builder.setTitle(LocaleController.getString("AddOneMemberAlertTitle", R.string.AddOneMemberAlertTitle)); + } else { + builder.setTitle(LocaleController.formatString("AddMembersAlertTitle", R.string.AddMembersAlertTitle, LocaleController.formatPluralString("Members", selectedContacts.size()))); + } + StringBuilder stringBuilder = new StringBuilder(); + for (int a = 0; a < selectedContacts.size(); a++) { + int uid = selectedContacts.keyAt(a); + TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(uid); + if (user == null) { + continue; + } + if (stringBuilder.length() > 0) { + stringBuilder.append(", "); + } + stringBuilder.append("**").append(ContactsController.formatName(user.first_name, user.last_name)).append("**"); + } + TLRPC.Chat chat = MessagesController.getInstance(currentAccount).getChat(chatId); + if (selectedContacts.size() > 5) { + SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(AndroidUtilities.replaceTags(LocaleController.formatString("AddMembersAlertNamesText", R.string.AddMembersAlertNamesText, LocaleController.formatPluralString("Members", selectedContacts.size()), chat.title))); + String countString = String.format("%d", selectedContacts.size()); + int index = TextUtils.indexOf(spannableStringBuilder, countString); + if (index >= 0) { + spannableStringBuilder.setSpan(new TypefaceSpan(AndroidUtilities.getTypeface("fonts/rmedium.ttf")), index, index + countString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + builder.setMessage(spannableStringBuilder); + } else { + builder.setMessage(AndroidUtilities.replaceTags(LocaleController.formatString("AddMembersAlertNamesText", R.string.AddMembersAlertNamesText, stringBuilder, chat.title))); + } +// CheckBoxCell[] cells = new CheckBoxCell[1]; +// if (!ChatObject.isChannel(chat)) { +// LinearLayout linearLayout = new LinearLayout(activity); +// linearLayout.setOrientation(LinearLayout.VERTICAL); +// cells[0] = new CheckBoxCell(activity, 1); +// cells[0].setBackgroundDrawable(Theme.getSelectorDrawable(false)); +// cells[0].setMultiline(true); +// if (selectedContacts.size() == 1) { +// TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(selectedContacts.keyAt(0)); +// cells[0].setText(AndroidUtilities.replaceTags(LocaleController.formatString("AddOneMemberForwardMessages", R.string.AddOneMemberForwardMessages, UserObject.getFirstName(user))), "", true, false); +// } else { +// cells[0].setText(LocaleController.getString("AddMembersForwardMessages", R.string.AddMembersForwardMessages), "", true, false); +// } +// cells[0].setPadding(LocaleController.isRTL ? AndroidUtilities.dp(16) : AndroidUtilities.dp(8), 0, LocaleController.isRTL ? AndroidUtilities.dp(8) : AndroidUtilities.dp(16), 0); +// linearLayout.addView(cells[0], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); +// cells[0].setOnClickListener(v1 -> cells[0].setChecked(!cells[0].isChecked(), true)); +// +// builder.setCustomViewOffset(12); +// builder.setView(linearLayout); +// } + builder.setPositiveButton(LocaleController.getString("Add", R.string.Add), (dialogInterface, i) -> onAddToGroupDone(0)); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + builder.create(); + builder.show(); + }); + floatingButton.setVisibility(View.INVISIBLE); + floatingButton.setScaleX(0.0f); + floatingButton.setScaleY(0.0f); + floatingButton.setAlpha(0.0f); + floatingButton.setContentDescription(LocaleController.getString("Next", R.string.Next)); + + containerView.addView(floatingButton, LayoutHelper.createFrame((Build.VERSION.SDK_INT >= 21 ? 56 : 60), (Build.VERSION.SDK_INT >= 21 ? 56 : 60), Gravity.RIGHT | Gravity.BOTTOM, 14, 14, 14, 14)); + + ((ViewGroup.MarginLayoutParams) emptyView.getLayoutParams()).topMargin = AndroidUtilities.dp(20); + ((ViewGroup.MarginLayoutParams) emptyView.getLayoutParams()).leftMargin = AndroidUtilities.dp(4); + ((ViewGroup.MarginLayoutParams) emptyView.getLayoutParams()).rightMargin = AndroidUtilities.dp(4); + } + + private void onAddToGroupDone(int i) { + ArrayList result = new ArrayList<>(); + for (int a = 0; a < selectedContacts.size(); a++) { + TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(selectedContacts.keyAt(a)); + result.add(user); + } + if (delegate != null) { + delegate.didSelectUsers(result, i); + } + dismiss(); + } + + private void spansCountChanged() { + boolean enter = selectedContacts.size() > 0; + if (spanEnter != enter) { + if (spansEnterAnimator != null) { + spansEnterAnimator.removeAllListeners(); + spansEnterAnimator.cancel(); + } + spanEnter = enter; + if (spanEnter) { + spansScrollView.setVisibility(View.VISIBLE); + } + spansEnterAnimator = ValueAnimator.ofFloat(spansEnterProgress, enter ? 1f : 0f); + spansEnterAnimator.addUpdateListener(valueAnimator1 -> { + spansEnterProgress = (float) valueAnimator1.getAnimatedValue(); + containerView.invalidate(); + }); + spansEnterAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + spansEnterProgress = enter ? 1f : 0f; + containerView.invalidate(); + if (!enter) { + spansScrollView.setVisibility(View.GONE); + } + } + }); + spansEnterAnimator.setDuration(150); + spansEnterAnimator.start(); + + if (!spanEnter) { + if (currentDoneButtonAnimation != null) { + currentDoneButtonAnimation.cancel(); + } + currentDoneButtonAnimation = new AnimatorSet(); + currentDoneButtonAnimation.playTogether(ObjectAnimator.ofFloat(floatingButton, View.SCALE_X, 0.0f), + ObjectAnimator.ofFloat(floatingButton, View.SCALE_Y, 0.0f), + ObjectAnimator.ofFloat(floatingButton, View.ALPHA, 0.0f)); + currentDoneButtonAnimation.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + floatingButton.setVisibility(View.INVISIBLE); + } + }); + currentDoneButtonAnimation.setDuration(180); + currentDoneButtonAnimation.start(); + } else { + if (currentDoneButtonAnimation != null) { + currentDoneButtonAnimation.cancel(); + } + currentDoneButtonAnimation = new AnimatorSet(); + floatingButton.setVisibility(View.VISIBLE); + currentDoneButtonAnimation.playTogether(ObjectAnimator.ofFloat(floatingButton, View.SCALE_X, 1.0f), + ObjectAnimator.ofFloat(floatingButton, View.SCALE_Y, 1.0f), + ObjectAnimator.ofFloat(floatingButton, View.ALPHA, 1.0f)); + currentDoneButtonAnimation.setDuration(180); + currentDoneButtonAnimation.start(); + } + } + } + + private void updateRows() { + contactsStartRow = -1; + contactsEndRow = -1; + noContactsStubRow = -1; + + rowCount = 0; + emptyRow = rowCount++; + copyLinkRow = rowCount++; + + if (contacts.size() != 0) { + contactsStartRow = rowCount; + rowCount += contacts.size(); + contactsEndRow = rowCount; + } else { + noContactsStubRow = rowCount++; + } + + lastRow = rowCount++; + } + + private class ListAdapter extends RecyclerListView.SelectionAdapter { + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + Context context = parent.getContext(); + View view; + switch (viewType) { + default: + case 1: + ManageChatTextCell manageChatTextCell = new ManageChatTextCell(context); + manageChatTextCell.setText(LocaleController.getString("VoipGroupCopyInviteLink", R.string.VoipGroupCopyInviteLink), null, R.drawable.msg_link, 7, true); + manageChatTextCell.setColors(Theme.key_dialogTextBlue2, Theme.key_dialogTextBlue2); + view = manageChatTextCell; + break; + case 2: + view = new View(context) { + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(48) + additionalHeight, MeasureSpec.EXACTLY)); + } + }; + break; + case 3: + view = new GroupCreateUserCell(context, true, 0, false); + break; + case 4: + view = new View(context); + break; + case 5: + StickerEmptyView stickerEmptyView = new StickerEmptyView(context, null, StickerEmptyView.STICKER_TYPE_NO_CONTACTS) { + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + stickerView.getImageReceiver().startAnimation(); + } + }; + stickerEmptyView.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); + stickerEmptyView.subtitle.setVisibility(View.GONE); + stickerEmptyView.title.setText(LocaleController.getString("NoContacts", R.string.NoContacts)); + stickerEmptyView.setAnimateLayoutChange(true); + view = stickerEmptyView; + break; + } + return new RecyclerListView.Holder(view); + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + switch (holder.getItemViewType()) { + case 2: + holder.itemView.requestLayout(); + break; + case 3: + GroupCreateUserCell cell = (GroupCreateUserCell) holder.itemView; + TLObject object; + CharSequence username = null; + CharSequence name = null; + object = contacts.get(position - contactsStartRow); + + Object oldObject = cell.getObject(); + int oldId; + if (oldObject instanceof TLRPC.User) { + oldId = ((TLRPC.User) oldObject).id; + } else if (oldObject instanceof TLRPC.Chat) { + oldId = -((TLRPC.Chat) oldObject).id; + } else { + oldId = 0; + } + + cell.setObject(object, name, username, position != contactsEndRow); + int id; + if (object instanceof TLRPC.User) { + id = ((TLRPC.User) object).id; + } else if (object instanceof TLRPC.Chat) { + id = -((TLRPC.Chat) object).id; + } else { + id = 0; + } + if (id != 0) { + if (ignoreUsers != null && ignoreUsers.indexOfKey(id) >= 0) { + cell.setChecked(true, false); + cell.setCheckBoxEnabled(false); + } else { + cell.setChecked(selectedContacts.indexOfKey(id) >= 0, oldId == id); + cell.setCheckBoxEnabled(true); + } + } + break; + } + } + + @Override + public int getItemViewType(int position) { + if (position == copyLinkRow) { + return 1; + } else if (position == emptyRow) { + return 2; + } else if (position >= contactsStartRow && position < contactsEndRow) { + return 3; + } else if (position == lastRow) { + return 4; + } else if (position == noContactsStubRow) { + return 5; + } + return 0; + } + + + @Override + public boolean isEnabled(RecyclerView.ViewHolder holder) { + if (holder.getItemViewType() == 3 || holder.getItemViewType() == 1) { + return true; + } + return false; + } + + @Override + public int getItemCount() { + return rowCount; + } + } + + private class SearchAdapter extends RecyclerListView.SelectionAdapter { + + private ArrayList searchResult = new ArrayList<>(); + private ArrayList searchResultNames = new ArrayList<>(); + private final SearchAdapterHelper searchAdapterHelper; + private int currentItemsCount; + private Runnable searchRunnable; + + public SearchAdapter() { + searchAdapterHelper = new SearchAdapterHelper(false); + searchAdapterHelper.setDelegate((searchId) -> { + showItemsAnimated(currentItemsCount - 1); + if (searchRunnable == null && !searchAdapterHelper.isSearchInProgress() && getItemCount() <= 2) { + emptyView.showProgress(false, true); + } + notifyDataSetChanged(); + }); + } + + @Override + public boolean isEnabled(RecyclerView.ViewHolder holder) { + if (holder.getItemViewType() == 1) { + return true; + } + return false; + } + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + Context context = parent.getContext(); + View view; + switch (viewType) { + default: + case 0: + view = new GroupCreateSectionCell(context); + break; + case 1: + view = new GroupCreateUserCell(context, true, 0, false); + break; + case 2: + view = new View(context) { + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(48) + additionalHeight + searchAdditionalHeight, MeasureSpec.EXACTLY)); + } + }; + break; + case 4: + view = new View(context); + break; + } + return new RecyclerListView.Holder(view); + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + switch (holder.getItemViewType()) { + case 2: + holder.itemView.requestLayout(); + break; + case 0: { + GroupCreateSectionCell cell = (GroupCreateSectionCell) holder.itemView; + cell.setText(LocaleController.getString("GlobalSearch", R.string.GlobalSearch)); + break; + } + case 1: { + GroupCreateUserCell cell = (GroupCreateUserCell) holder.itemView; + TLObject object; + CharSequence username = null; + CharSequence name = null; + + int localCount = searchResult.size(); + int globalCount = searchAdapterHelper.getGlobalSearch().size(); + int localServerCount = searchAdapterHelper.getLocalServerSearch().size(); + + position--; + if (position >= 0 && position < localCount) { + object = searchResult.get(position); + } else if (position >= localCount && position < localServerCount + localCount) { + object = searchAdapterHelper.getLocalServerSearch().get(position - localCount); + } else if (position > localCount + localServerCount && position <= globalCount + localCount + localServerCount) { + object = searchAdapterHelper.getGlobalSearch().get(position - localCount - localServerCount - 1); + } else { + object = null; + } + if (object != null) { + String objectUserName; + if (object instanceof TLRPC.User) { + objectUserName = ((TLRPC.User) object).username; + } else { + objectUserName = ((TLRPC.Chat) object).username; + } + if (position < localCount) { + name = searchResultNames.get(position); + if (name != null && !TextUtils.isEmpty(objectUserName)) { + if (name.toString().startsWith("@" + objectUserName)) { + username = name; + name = null; + } + } + } else if (position > localCount && !TextUtils.isEmpty(objectUserName)) { + String foundUserName = searchAdapterHelper.getLastFoundUsername(); + if (foundUserName.startsWith("@")) { + foundUserName = foundUserName.substring(1); + } + try { + int index; + SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(); + spannableStringBuilder.append("@"); + spannableStringBuilder.append(objectUserName); + if ((index = AndroidUtilities.indexOfIgnoreCase(objectUserName, foundUserName)) != -1) { + int len = foundUserName.length(); + if (index == 0) { + len++; + } else { + index++; + } + spannableStringBuilder.setSpan(new ForegroundColorSpan(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText4)), index, index + len, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + } + username = spannableStringBuilder; + } catch (Exception e) { + username = objectUserName; + } + } + } + + + Object oldObject = cell.getObject(); + int oldId; + if (oldObject instanceof TLRPC.User) { + oldId = ((TLRPC.User) oldObject).id; + } else if (oldObject instanceof TLRPC.Chat) { + oldId = -((TLRPC.Chat) oldObject).id; + } else { + oldId = 0; + } + + cell.setObject(object, name, username); + int id; + if (object instanceof TLRPC.User) { + id = ((TLRPC.User) object).id; + } else if (object instanceof TLRPC.Chat) { + id = -((TLRPC.Chat) object).id; + } else { + id = 0; + } + if (id != 0) { + if (ignoreUsers != null && ignoreUsers.indexOfKey(id) >= 0) { + cell.setChecked(true, oldId == id); + cell.setCheckBoxEnabled(false); + } else { + cell.setChecked(selectedContacts.indexOfKey(id) >= 0, oldId == id); + cell.setCheckBoxEnabled(true); + } + } + break; + } + } + } + + @Override + public int getItemViewType(int position) { + if (position == 0) { + return 2; + } else if (position == currentItemsCount - 1) { + return 4; + } + position--; + if (position == searchResult.size() + searchAdapterHelper.getLocalServerSearch().size()) { + return 0; + } + return 1; + } + + @Override + public int getItemCount() { + int count = searchResult.size(); + int localServerCount = searchAdapterHelper.getLocalServerSearch().size(); + int globalCount = searchAdapterHelper.getGlobalSearch().size(); + count += localServerCount; + if (globalCount != 0) { + count += globalCount + 1; + } + // if (count > 0) { + count += 2; + // } + currentItemsCount = count; + return count; + } + + private void updateSearchResults(final ArrayList users, final ArrayList names) { + AndroidUtilities.runOnUIThread(() -> { + searchRunnable = null; + searchResult = users; + searchResultNames = names; + searchAdapterHelper.mergeResults(searchResult); + showItemsAnimated(currentItemsCount - 1); + notifyDataSetChanged(); + if (!searchAdapterHelper.isSearchInProgress() && getItemCount() <= 2) { + emptyView.showProgress(false, true); + } + }); + } + + public void searchDialogs(final String query) { + if (searchRunnable != null) { + Utilities.searchQueue.cancelRunnable(searchRunnable); + searchRunnable = null; + } + + searchResult.clear(); + searchResultNames.clear(); + searchAdapterHelper.mergeResults(null); + searchAdapterHelper.queryServerSearch(null, true, false, false, false, false, 0, false, 0, 0); + notifyDataSetChanged(); + + if (!TextUtils.isEmpty(query)) { + if (listView.getAdapter() != searchListViewAdapter) { + listView.setAdapter(searchListViewAdapter); + } + emptyView.showProgress(true, false); + Utilities.searchQueue.postRunnable(searchRunnable = () -> AndroidUtilities.runOnUIThread(() -> { + searchAdapterHelper.queryServerSearch(query, true, false, true, false, false, 0, false, 0, 0); + Utilities.searchQueue.postRunnable(searchRunnable = () -> { + String search1 = query.trim().toLowerCase(); + if (search1.length() == 0) { + updateSearchResults(new ArrayList<>(), new ArrayList<>()); + return; + } + String search2 = LocaleController.getInstance().getTranslitString(search1); + if (search1.equals(search2) || search2.length() == 0) { + search2 = null; + } + String[] search = new String[1 + (search2 != null ? 1 : 0)]; + search[0] = search1; + if (search2 != null) { + search[1] = search2; + } + + ArrayList resultArray = new ArrayList<>(); + ArrayList resultArrayNames = new ArrayList<>(); + + for (int a = 0; a < contacts.size(); a++) { + TLObject object = contacts.get(a); + + String name; + String username; + + if (object instanceof TLRPC.User) { + TLRPC.User user = (TLRPC.User) object; + name = ContactsController.formatName(user.first_name, user.last_name).toLowerCase(); + username = user.username; + } else { + TLRPC.Chat chat = (TLRPC.Chat) object; + name = chat.title; + username = chat.username; + } + String tName = LocaleController.getInstance().getTranslitString(name); + if (name.equals(tName)) { + tName = null; + } + + int found = 0; + for (String q : search) { + if (name.startsWith(q) || name.contains(" " + q) || tName != null && (tName.startsWith(q) || tName.contains(" " + q))) { + found = 1; + } else if (username != null && username.startsWith(q)) { + found = 2; + } + + if (found != 0) { + if (found == 1) { + if (object instanceof TLRPC.User) { + TLRPC.User user = (TLRPC.User) object; + resultArrayNames.add(AndroidUtilities.generateSearchName(user.first_name, user.last_name, q)); + } else { + TLRPC.Chat chat = (TLRPC.Chat) object; + resultArrayNames.add(AndroidUtilities.generateSearchName(chat.title, null, q)); + } + } else { + resultArrayNames.add(AndroidUtilities.generateSearchName("@" + username, null, "@" + q)); + } + resultArray.add(object); + break; + } + } + } + updateSearchResults(resultArray, resultArrayNames); + }); + }), 300); + } else { + if (listView.getAdapter() != listViewAdapter) { + listView.setAdapter(listViewAdapter); + } + } + } + } + + boolean enterEventSent; + float y; + + @Override + protected void onSearchViewTouched(MotionEvent ev, EditTextBoldCursor searchEditText) { + if (ev.getAction() == MotionEvent.ACTION_DOWN) { + y = scrollOffsetY; + } else if (ev.getAction() == MotionEvent.ACTION_UP && Math.abs(scrollOffsetY - y) < touchSlop) { + if (!enterEventSent) { + Activity activity = AndroidUtilities.findActivity(getContext()); + BaseFragment fragment = null; + if (activity instanceof LaunchActivity) { + fragment = ((LaunchActivity) activity).getActionBarLayout().fragmentsStack.get(((LaunchActivity) activity).getActionBarLayout().fragmentsStack.size() - 1); + } + if (fragment instanceof ChatActivity) { + boolean keyboardVisible = ((ChatActivity) fragment).needEnterText(); + enterEventSent = true; + AndroidUtilities.runOnUIThread(() -> { + setFocusable(true); + searchEditText.requestFocus(); + AndroidUtilities.runOnUIThread(() -> AndroidUtilities.showKeyboard(searchEditText)); + }, keyboardVisible ? 200 : 0); + } else { + enterEventSent = true; + setFocusable(true); + searchEditText.requestFocus(); + AndroidUtilities.runOnUIThread(() -> AndroidUtilities.showKeyboard(searchEditText)); + } + } + } + } + + private class SpansContainer extends ViewGroup { + + private boolean animationStarted; + private ArrayList animators = new ArrayList<>(); + private View addingSpan; + private View removingSpan; + private int animationIndex = -1; + boolean addAnimation; + + public SpansContainer(Context context) { + super(context); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int count = getChildCount(); + int width = MeasureSpec.getSize(widthMeasureSpec); + int maxWidth = width - AndroidUtilities.dp(26); + int currentLineWidth = 0; + int y = AndroidUtilities.dp(10); + int allCurrentLineWidth = 0; + int allY = AndroidUtilities.dp(10); + int x; + for (int a = 0; a < count; a++) { + View child = getChildAt(a); + if (!(child instanceof GroupCreateSpan)) { + continue; + } + child.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(32), MeasureSpec.EXACTLY)); + if (child != removingSpan && currentLineWidth + child.getMeasuredWidth() > maxWidth) { + y += child.getMeasuredHeight() + AndroidUtilities.dp(8); + currentLineWidth = 0; + } + if (allCurrentLineWidth + child.getMeasuredWidth() > maxWidth) { + allY += child.getMeasuredHeight() + AndroidUtilities.dp(8); + allCurrentLineWidth = 0; + } + x = AndroidUtilities.dp(13) + currentLineWidth; + if (!animationStarted) { + if (child == removingSpan) { + child.setTranslationX(AndroidUtilities.dp(13) + allCurrentLineWidth); + child.setTranslationY(allY); + } else if (removingSpan != null) { + if (child.getTranslationX() != x) { + animators.add(ObjectAnimator.ofFloat(child, "translationX", x)); + } + if (child.getTranslationY() != y) { + animators.add(ObjectAnimator.ofFloat(child, "translationY", y)); + } + } else { + child.setTranslationX(x); + child.setTranslationY(y); + } + } + if (child != removingSpan) { + currentLineWidth += child.getMeasuredWidth() + AndroidUtilities.dp(9); + } + allCurrentLineWidth += child.getMeasuredWidth() + AndroidUtilities.dp(9); + } + + int h = allY + AndroidUtilities.dp(32 + 10); + int animateToH = y + AndroidUtilities.dp(32 + 10); + + int newAdditionalH = Math.max(0, Math.min(maxSize, animateToH) - AndroidUtilities.dp(52)); + int oldSearchAdditionalH = searchAdditionalHeight; + searchAdditionalHeight = (selectedContacts.size() > 0 ? AndroidUtilities.dp(56) : 0); + if (newAdditionalH != additionalHeight || oldSearchAdditionalH != searchAdditionalHeight) { + additionalHeight = newAdditionalH; + if (listView.getAdapter() != null && listView.getAdapter().getItemCount() > 0) { + RecyclerView.ViewHolder holder = listView.findViewHolderForAdapterPosition(0); + if (holder != null) { + listView.getAdapter().notifyItemChanged(0); + layoutManager.scrollToPositionWithOffset(0, holder.itemView.getTop() - listView.getPaddingTop()); + } + } + } + + int newSize = Math.min(maxSize, animateToH); + if (scrollViewH != newSize) { + ValueAnimator valueAnimator = ValueAnimator.ofInt(scrollViewH, newSize); + valueAnimator.addUpdateListener(valueAnimator1 -> { + scrollViewH = (int) valueAnimator1.getAnimatedValue(); + containerView.invalidate(); + }); + animators.add(valueAnimator); + } + + if (addAnimation && animateToH > maxSize) { + AndroidUtilities.runOnUIThread(() -> spansScrollView.smoothScrollTo(0, animateToH - maxSize)); + } else if (!addAnimation && spansScrollView.getScrollY() + spansScrollView.getMeasuredHeight() > animateToH) { + AndroidUtilities.runOnUIThread(() -> spansScrollView.smoothScrollTo(0, animateToH - maxSize)); + } + + if (!animationStarted) { + if (currentAnimation != null) { + currentAnimation.playTogether(animators); + currentAnimation.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + currentAnimation = null; + requestLayout(); + } + }); + + currentAnimation.start(); + animationStarted = true; + } + } + + if (currentAnimation == null) { + scrollViewH = newSize; + containerView.invalidate(); + } + + setMeasuredDimension(width, Math.max(animateToH, h)); + + listView.setTranslationY(0); + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + int count = getChildCount(); + for (int a = 0; a < count; a++) { + View child = getChildAt(a); + child.layout(0, 0, child.getMeasuredWidth(), child.getMeasuredHeight()); + } + } + + public void addSpan(final GroupCreateSpan span) { + addAnimation = true; + allSpans.add(span); + selectedContacts.put(span.getUid(), span); + + if (currentAnimation != null) { + currentAnimation.setupEndValues(); + currentAnimation.cancel(); + } + animationStarted = false; + currentAnimation = new AnimatorSet(); + currentAnimation.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animator) { + addingSpan = null; + currentAnimation = null; + animationStarted = false; + } + }); + currentAnimation.setDuration(150); + currentAnimation.setInterpolator(CubicBezierInterpolator.DEFAULT); + addingSpan = span; + animators.clear(); + animators.add(ObjectAnimator.ofFloat(addingSpan, View.SCALE_X, 0.01f, 1.0f)); + animators.add(ObjectAnimator.ofFloat(addingSpan, View.SCALE_Y, 0.01f, 1.0f)); + animators.add(ObjectAnimator.ofFloat(addingSpan, View.ALPHA, 0.0f, 1.0f)); + addView(span); + } + + public void removeSpan(final GroupCreateSpan span) { + addAnimation = false; + boolean ignoreScrollEvent = true; + selectedContacts.remove(span.getUid()); + allSpans.remove(span); + span.setOnClickListener(null); + + if (currentAnimation != null) { + currentAnimation.setupEndValues(); + currentAnimation.cancel(); + } + animationStarted = false; + currentAnimation = new AnimatorSet(); + currentAnimation.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animator) { + removeView(span); + removingSpan = null; + currentAnimation = null; + animationStarted = false; + } + }); + currentAnimation.setDuration(150); + removingSpan = span; + animators.clear(); + animators.add(ObjectAnimator.ofFloat(removingSpan, View.SCALE_X, 1.0f, 0.01f)); + animators.add(ObjectAnimator.ofFloat(removingSpan, View.SCALE_Y, 1.0f, 0.01f)); + animators.add(ObjectAnimator.ofFloat(removingSpan, View.ALPHA, 1.0f, 0.0f)); + requestLayout(); + } + } + + @Override + protected ContainerView createContainerView(Context context) { + return new ContainerView(context) { + + float emptyViewOffset; + float animateToEmptyViewOffset; + + Paint paint = new Paint(); + + float deltaOffset; + + private VerticalPositionAutoAnimator verticalPositionAutoAnimator; + + @Override + public void onViewAdded(View child) { + if (child == floatingButton && verticalPositionAutoAnimator == null) { + verticalPositionAutoAnimator = VerticalPositionAutoAnimator.attach(child); + } + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + if (verticalPositionAutoAnimator != null) { + verticalPositionAutoAnimator.ignoreNextLayout(); + } + } + + @Override + protected void dispatchDraw(Canvas canvas) { + int y = scrollOffsetY - backgroundPaddingTop + AndroidUtilities.dp(6); + spansScrollView.setTranslationY(y + AndroidUtilities.dp(64)); + + float newEmptyViewOffset = additionalHeight + searchAdditionalHeight; + if (emptyView.getVisibility() != View.VISIBLE) { + emptyViewOffset = newEmptyViewOffset; + animateToEmptyViewOffset = emptyViewOffset; + } else { + if (animateToEmptyViewOffset != newEmptyViewOffset) { + animateToEmptyViewOffset = newEmptyViewOffset; + deltaOffset = (newEmptyViewOffset - emptyViewOffset) * (16f / 150f); + } + } + + if (emptyViewOffset != animateToEmptyViewOffset) { + emptyViewOffset += deltaOffset; + if (deltaOffset > 0 && emptyViewOffset > animateToEmptyViewOffset) { + emptyViewOffset = animateToEmptyViewOffset; + } else if (deltaOffset < 0 && emptyViewOffset < animateToEmptyViewOffset) { + emptyViewOffset = animateToEmptyViewOffset; + } else { + invalidate(); + } + } + emptyView.setTranslationY(scrollOffsetY + emptyViewOffset); + super.dispatchDraw(canvas); + } + + @Override + protected boolean drawChild(Canvas canvas, View child, long drawingTime) { + if (child == spansScrollView) { + canvas.save(); + canvas.clipRect(0, child.getY() - AndroidUtilities.dp(4), getMeasuredWidth(), child.getY() + scrollViewH + 1); + canvas.drawColor(ColorUtils.setAlphaComponent(Theme.getColor(Theme.key_windowBackgroundWhite), (int) (255 * spansEnterProgress))); + paint.setColor(ColorUtils.setAlphaComponent(Theme.getColor(Theme.key_divider), (int) (255 * spansEnterProgress))); + canvas.drawRect(0, child.getY() + scrollViewH, getMeasuredWidth(), child.getY() + scrollViewH + 1, paint); + boolean rez = super.drawChild(canvas, child, drawingTime); + canvas.restore(); + return rez; + } else { + return super.drawChild(canvas, child, drawingTime); + } + } + }; + } + + + @Override + protected void search(String text) { + searchAdapter.searchDialogs(text); + } + + public void setDelegate(GroupCreateActivity.ContactsAddActivityDelegate delegate) { + this.delegate = delegate; + } + + private class ItemAnimator extends DefaultItemAnimator { + + public ItemAnimator() { + translationInterpolator = CubicBezierInterpolator.DEFAULT; + setMoveDuration(150); + setAddDuration(150); + setRemoveDuration(150); + setShowWithoutAnimation(false); + } + } + + @Override + public void dismissInternal() { + super.dismissInternal(); + if (enterEventSent) { + Activity activity = AndroidUtilities.findActivity(getContext()); + if (activity instanceof LaunchActivity) { + BaseFragment fragment = ((LaunchActivity) activity).getActionBarLayout().fragmentsStack.get(((LaunchActivity) activity).getActionBarLayout().fragmentsStack.size() - 1); + if (fragment instanceof ChatActivity) { + ((ChatActivity) fragment).onEditTextDialogClose(true); + } + } + } + } + + boolean linkGenerating; + TLRPC.TL_chatInviteExported invite; + + private void generateLink() { + if (linkGenerating) { + return; + } + linkGenerating = true; + TLRPC.TL_messages_exportChatInvite req = new TLRPC.TL_messages_exportChatInvite(); + //req.legacy_revoke_permanent = true; TODO layer 124 + req.peer = MessagesController.getInstance(currentAccount).getInputPeer(-chatId); + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { + if (error == null) { + invite = (TLRPC.TL_chatInviteExported) response; + + TLRPC.ChatFull chatInfo = MessagesController.getInstance(currentAccount).getChatFull(chatId); + if (chatInfo != null) { + chatInfo.exported_invite = invite; + } + + if (invite.link == null) { + return; + } + android.content.ClipboardManager clipboard = (android.content.ClipboardManager) ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE); + android.content.ClipData clip = android.content.ClipData.newPlainText("label", invite.link); + clipboard.setPrimaryClip(clip); + BulletinFactory.createCopyLinkBulletin(parentFragment).show(); + dismiss(); + + } + linkGenerating = false; + })); + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/LineProgressView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/LineProgressView.java index 14c4f2f1414..162f1837d74 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/LineProgressView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/LineProgressView.java @@ -11,6 +11,7 @@ import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; +import android.graphics.RectF; import android.view.View; import android.view.animation.DecelerateInterpolator; @@ -31,6 +32,8 @@ public class LineProgressView extends View { private static DecelerateInterpolator decelerateInterpolator; private static Paint progressPaint; + private RectF rect = new RectF(); + public LineProgressView(Context context) { super(context); @@ -104,12 +107,14 @@ public void onDraw(Canvas canvas) { progressPaint.setColor(backColor); progressPaint.setAlpha((int) (255 * animatedAlphaValue)); int start = (int) (getWidth() * animatedProgressValue); - canvas.drawRect(start, 0, getWidth(), getHeight(), progressPaint); + rect.set(0, 0, getWidth(), getHeight()); + canvas.drawRoundRect(rect, getHeight() / 2, getHeight() / 2, progressPaint); } progressPaint.setColor(progressColor); - progressPaint.setAlpha((int)(255 * animatedAlphaValue)); - canvas.drawRect(0, 0, getWidth() * animatedProgressValue, getHeight(), progressPaint); + progressPaint.setAlpha((int) (255 * animatedAlphaValue)); + rect.set(0, 0, getWidth() * animatedProgressValue, getHeight()); + canvas.drawRoundRect(rect, getHeight() / 2, getHeight() / 2, progressPaint); updateAnimation(); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/LinkActionView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/LinkActionView.java new file mode 100644 index 00000000000..6881a02a83c --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/LinkActionView.java @@ -0,0 +1,513 @@ +package org.telegram.ui.Components; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.content.Context; +import android.content.Intent; +import android.graphics.Canvas; +import android.graphics.Color; +import android.text.SpannableStringBuilder; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.KeyEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; +import androidx.core.graphics.ColorUtils; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.ApplicationLoader; +import org.telegram.messenger.FileLog; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.MessagesController; +import org.telegram.messenger.R; +import org.telegram.messenger.UserConfig; +import org.telegram.tgnet.ConnectionsManager; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.ActionBarMenuSubItem; +import org.telegram.ui.ActionBar.ActionBarPopupWindow; +import org.telegram.ui.ActionBar.AlertDialog; +import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.ActionBar.BottomSheet; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Cells.DialogCell; + +import java.util.ArrayList; + +public class LinkActionView extends LinearLayout { + + TextView linkView; + String link; + BaseFragment fragment; + ImageView optionsView; + private final TextView copyView; + private final TextView shareView; + private final TextView removeView; + private final FrameLayout frameLayout; + + private Delegate delegate; + + private ActionBarPopupWindow actionBarPopupWindow; + private final AvatarsContainer avatarsContainer; + private int usersCount; + + private boolean revoked; + private boolean permanent; + boolean loadingImporters; + private QRCodeBottomSheet qrCodeBottomSheet; + private boolean isPublic; + + public LinkActionView(Context context, BaseFragment fragment, BottomSheet bottomSheet, int chatId, boolean permanent) { + super(context); + this.fragment = fragment; + this.permanent = permanent; + setOrientation(VERTICAL); + frameLayout = new FrameLayout(context); + linkView = new TextView(context); + linkView.setPadding(AndroidUtilities.dp(20), AndroidUtilities.dp(18), AndroidUtilities.dp(40), AndroidUtilities.dp(18)); + linkView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + + frameLayout.addView(linkView); + optionsView = new ImageView(context); + optionsView.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_ab_other)); + optionsView.setScaleType(ImageView.ScaleType.CENTER); + frameLayout.addView(optionsView, LayoutHelper.createFrame(40, 48, Gravity.RIGHT | Gravity.CENTER_VERTICAL)); + addView(frameLayout, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0, 4, 0, 4, 0)); + + LinearLayout linearLayout = new LinearLayout(context); + linearLayout.setOrientation(HORIZONTAL); + + copyView = new TextView(context); + copyView.setGravity(Gravity.CENTER_HORIZONTAL); + SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(); + spannableStringBuilder.append("..").setSpan(new ColoredImageSpan(ContextCompat.getDrawable(context, R.drawable.msg_copy_filled)), 0, 1, 0); + spannableStringBuilder.setSpan(new DialogCell.FixedWidthSpan(AndroidUtilities.dp(8)), 1, 2, 0); + spannableStringBuilder.append(LocaleController.getString("CopyLink", R.string.CopyLink)); + spannableStringBuilder.append(".").setSpan(new DialogCell.FixedWidthSpan(AndroidUtilities.dp(5)), spannableStringBuilder.length() - 1, spannableStringBuilder.length(), 0); + copyView.setText(spannableStringBuilder); + copyView.setPadding(AndroidUtilities.dp(10), AndroidUtilities.dp(10), AndroidUtilities.dp(10), AndroidUtilities.dp(10)); + copyView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + copyView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + copyView.setLines(1); + linearLayout.addView(copyView, LayoutHelper.createLinear(0, LayoutHelper.WRAP_CONTENT, 1f, 0, 4, 0, 4, 0)); + + shareView = new TextView(context); + shareView.setGravity(Gravity.CENTER_HORIZONTAL); + spannableStringBuilder = new SpannableStringBuilder(); + spannableStringBuilder.append("..").setSpan(new ColoredImageSpan(ContextCompat.getDrawable(context, R.drawable.msg_share_filled)), 0, 1, 0); + spannableStringBuilder.setSpan(new DialogCell.FixedWidthSpan(AndroidUtilities.dp(8)), 1, 2, 0); + spannableStringBuilder.append(LocaleController.getString("ShareLink", R.string.ShareLink)); + spannableStringBuilder.append(".").setSpan(new DialogCell.FixedWidthSpan(AndroidUtilities.dp(5)), spannableStringBuilder.length() - 1, spannableStringBuilder.length(), 0); + shareView.setText(spannableStringBuilder); + shareView.setPadding(AndroidUtilities.dp(10), AndroidUtilities.dp(10), AndroidUtilities.dp(10), AndroidUtilities.dp(10)); + + shareView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + shareView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + shareView.setLines(1); + linearLayout.addView(shareView, LayoutHelper.createLinear(0, LayoutHelper.WRAP_CONTENT, 1f, 4, 0, 4, 0)); + + + removeView = new TextView(context); + removeView.setGravity(Gravity.CENTER_HORIZONTAL); + spannableStringBuilder = new SpannableStringBuilder(); + spannableStringBuilder.append("..").setSpan(new ColoredImageSpan(ContextCompat.getDrawable(context, R.drawable.msg_delete)), 0, 1, 0); + spannableStringBuilder.setSpan(new DialogCell.FixedWidthSpan(AndroidUtilities.dp(8)), 1, 2, 0); + spannableStringBuilder.append(LocaleController.getString("DeleteLink", R.string.DeleteLink)); + spannableStringBuilder.append(".").setSpan(new DialogCell.FixedWidthSpan(AndroidUtilities.dp(5)), spannableStringBuilder.length() - 1, spannableStringBuilder.length(), 0); + removeView.setText(spannableStringBuilder); + removeView.setPadding(AndroidUtilities.dp(10), AndroidUtilities.dp(10), AndroidUtilities.dp(10), AndroidUtilities.dp(10)); + removeView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + removeView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + removeView.setLines(1); + linearLayout.addView(removeView, LayoutHelper.createLinear(0, LayoutHelper.WRAP_CONTENT, 1f, 4, 0, 4, 0)); + removeView.setVisibility(View.GONE); + + + addView(linearLayout, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0 , 20, 0, 0)); + + avatarsContainer = new AvatarsContainer(context); + addView(avatarsContainer, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 28 + 16, 0 , 12, 0, 0)); + copyView.setOnClickListener(view -> { + try { + if (link == null) { + return; + } + android.content.ClipboardManager clipboard = (android.content.ClipboardManager) ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE); + android.content.ClipData clip = android.content.ClipData.newPlainText("label", link); + clipboard.setPrimaryClip(clip); + if (bottomSheet != null && bottomSheet.getContainer() != null) { + BulletinFactory.createCopyLinkBulletin(bottomSheet.getContainer()).show(); + } else { + BulletinFactory.createCopyLinkBulletin(fragment).show(); + } + } catch (Exception e) { + FileLog.e(e); + } + }); + + if (permanent) { + avatarsContainer.setOnClickListener(view -> { + delegate.showUsersForPermanentLink(); + }); + } + + shareView.setOnClickListener(view -> { + try { + if (link == null) { + return; + } + Intent intent = new Intent(Intent.ACTION_SEND); + intent.setType("text/plain"); + intent.putExtra(Intent.EXTRA_TEXT, link); + fragment.startActivityForResult(Intent.createChooser(intent, LocaleController.getString("InviteToGroupByLink", R.string.InviteToGroupByLink)), 500); + } catch (Exception e) { + FileLog.e(e); + } + }); + + removeView.setOnClickListener(view -> { + AlertDialog.Builder builder = new AlertDialog.Builder(fragment.getParentActivity()); + builder.setTitle(LocaleController.getString("DeleteLink", R.string.DeleteLink)); + builder.setMessage(LocaleController.getString("DeleteLinkHelp", R.string.DeleteLinkHelp)); + builder.setPositiveButton(LocaleController.getString("Delete", R.string.Delete), (dialogInterface2, i2) -> { + if (delegate != null) { + delegate.removeLink(); + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + fragment.showDialog(builder.create()); + }); + + optionsView.setOnClickListener(view -> { + if (isPublic) { + showQrCode(); + return; + } + if (actionBarPopupWindow != null) { + return; + } + ActionBarPopupWindow.ActionBarPopupWindowLayout layout = new ActionBarPopupWindow.ActionBarPopupWindowLayout(context); + + ActionBarMenuSubItem subItem; + if (!permanent) { + subItem = new ActionBarMenuSubItem(context, true, false); + subItem.setTextAndIcon(LocaleController.getString("Edit", R.string.Edit), R.drawable.msg_edit); + layout.addView(subItem, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 48)); + subItem.setOnClickListener(view12 -> { + delegate.editLink(); + if (actionBarPopupWindow != null) { + actionBarPopupWindow.dismiss(); + } + }); + } + +// subItem = new ActionBarMenuSubItem(context, true, false); +// subItem.setTextAndIcon(LocaleController.getString("GetQRCode", R.string.GetQRCode), R.drawable.msg_qrcode); +// layout.addView(subItem, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 48)); +// subItem.setOnClickListener(view12 -> { +// showQrCode(); +// }); + + subItem = new ActionBarMenuSubItem(context, false, true); + subItem.setTextAndIcon(LocaleController.getString("RevokeLink", R.string.RevokeLink), R.drawable.msg_delete); + subItem.setColors(Theme.getColor(Theme.key_windowBackgroundWhiteRedText), Theme.getColor(Theme.key_windowBackgroundWhiteRedText)); + subItem.setOnClickListener(view1 -> { + revokeLink(); + if (actionBarPopupWindow != null) { + actionBarPopupWindow.dismiss(); + } + }); + layout.addView(subItem, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 48)); + + FrameLayout container; + float y = 0; + if (bottomSheet == null) { + container = fragment.getParentLayout(); + } else { + container = bottomSheet.getContainer(); + } + + View v = frameLayout; + while (v != container) { + y += v.getY(); + v = (View) v.getParent(); + if (!(v instanceof ViewGroup)) { + return; + } + } + + if (container != null) { + FrameLayout finalContainer = container; + View dimView = new View(context) { + @Override + protected void onDraw(Canvas canvas) { + canvas.drawColor(0x33000000); + float x = 0; + float y = 0; + View v = frameLayout; + while (v != finalContainer) { + y += v.getY(); + x += v.getX(); + v = (View) v.getParent(); + if (!(v instanceof ViewGroup)) { + return; + } + } + canvas.save(); + canvas.translate(x, y); + frameLayout.draw(canvas); + canvas.restore(); + } + }; + container.addView(dimView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); + dimView.setAlpha(0); + dimView.animate().alpha(1f).setDuration(150); + layout.measure(MeasureSpec.makeMeasureSpec(container.getMeasuredWidth(), MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(container.getMeasuredHeight(), MeasureSpec.UNSPECIFIED)); + + + actionBarPopupWindow = new ActionBarPopupWindow(layout, LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT) { + @Override + public void dismiss() { + super.dismiss(); + actionBarPopupWindow = null; + dimView.animate().cancel(); + dimView.animate().alpha(0).setDuration(150).setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + if (dimView.getParent() != null) { + finalContainer.removeView(dimView); + } + } + }); + } + }; + actionBarPopupWindow.setOutsideTouchable(true); + actionBarPopupWindow.setClippingEnabled(true); + actionBarPopupWindow.setAnimationStyle(R.style.PopupContextAnimation); + actionBarPopupWindow.setFocusable(true); + actionBarPopupWindow.setInputMethodMode(ActionBarPopupWindow.INPUT_METHOD_NOT_NEEDED); + actionBarPopupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED); + actionBarPopupWindow.getContentView().setFocusableInTouchMode(true); + + layout.setDispatchKeyEventListener(keyEvent -> { + if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_BACK && keyEvent.getRepeatCount() == 0 && actionBarPopupWindow.isShowing()) { + actionBarPopupWindow.dismiss(true); + } + }); + + actionBarPopupWindow.showAtLocation(container, 0, (int) container.getMeasuredWidth() - layout.getMeasuredWidth() - AndroidUtilities.dp(16), (int) y + frameLayout.getMeasuredHeight()); + } + + }); + + frameLayout.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + copyView.callOnClick(); + } + }); + updateColors(); + } + + private void showQrCode() { + qrCodeBottomSheet = new QRCodeBottomSheet(getContext(), link) { + @Override + public void dismiss() { + super.dismiss(); + qrCodeBottomSheet = null; + } + }; + qrCodeBottomSheet.show(); + if (actionBarPopupWindow != null) { + actionBarPopupWindow.dismiss(); + } + } + + public void updateColors() { + copyView.setTextColor(Theme.getColor(Theme.key_featuredStickers_buttonText)); + shareView.setTextColor(Theme.getColor(Theme.key_featuredStickers_buttonText)); + removeView.setTextColor(Theme.getColor(Theme.key_featuredStickers_buttonText)); + copyView.setBackground(Theme.createSimpleSelectorRoundRectDrawable(AndroidUtilities.dp(6), Theme.getColor(Theme.key_featuredStickers_addButton), Theme.getColor(Theme.key_featuredStickers_addButtonPressed))); + shareView.setBackground(Theme.createSimpleSelectorRoundRectDrawable(AndroidUtilities.dp(6), Theme.getColor(Theme.key_featuredStickers_addButton), Theme.getColor(Theme.key_featuredStickers_addButtonPressed))); + removeView.setBackground(Theme.createSimpleSelectorRoundRectDrawable(AndroidUtilities.dp(6), Theme.getColor(Theme.key_chat_attachAudioBackground), Theme.getColor(Theme.key_featuredStickers_addButtonPressed))); + frameLayout.setBackground(Theme.createSimpleSelectorRoundRectDrawable(AndroidUtilities.dp(6), Theme.getColor(Theme.key_graySection), ColorUtils.setAlphaComponent(Theme.getColor(Theme.key_listSelector), (int) (255 * 0.3f)))); + linkView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); + optionsView.setColorFilter(Theme.getColor(Theme.key_dialogTextGray3)); + //optionsView.setBackground(Theme.createSelectorDrawable(Theme.getColor(Theme.key_listSelector), 1)); + avatarsContainer.countTextView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText)); + avatarsContainer.setBackground(Theme.createSimpleSelectorRoundRectDrawable(AndroidUtilities.dp(6),0, ColorUtils.setAlphaComponent(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText), (int) (255 * 0.3f)))); + + if (qrCodeBottomSheet != null) { + qrCodeBottomSheet.updateColors(); + } + } + + + public void setLink(String link) { + this.link = link; + if (link == null) { + linkView.setText(LocaleController.getString("Loading", R.string.Loading)); + } else if (link.startsWith("https://")) { + linkView.setText(link.substring("https://".length())); + } else { + linkView.setText(link); + } + } + + public void setRevoke(boolean revoked) { + this.revoked = revoked; + if (revoked) { + optionsView.setVisibility(View.GONE); + shareView.setVisibility(View.GONE); + copyView.setVisibility(View.GONE); + removeView.setVisibility(View.VISIBLE); + } else { + optionsView.setVisibility(View.VISIBLE); + shareView.setVisibility(View.VISIBLE); + copyView.setVisibility(View.VISIBLE); + removeView.setVisibility(View.GONE); + } + } + + public void showOptions(boolean b) { + optionsView.setVisibility(b ? View.VISIBLE : View.GONE); + } + + public void setPublic(boolean b) { + if (isPublic != b) { + isPublic = b; + if (isPublic) { + optionsView.setVisibility(View.GONE); + optionsView.setImageDrawable(ContextCompat.getDrawable(optionsView.getContext(), R.drawable.msg_qrcode)); + } else { + optionsView.setVisibility(View.VISIBLE); + optionsView.setImageDrawable(ContextCompat.getDrawable(optionsView.getContext(), R.drawable.ic_ab_other)); + } + } + } + + private class AvatarsContainer extends FrameLayout { + + TextView countTextView; + AvatarsImageView avatarsImageView; + + public AvatarsContainer(@NonNull Context context) { + super(context); + avatarsImageView = new AvatarsImageView(context) { + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int N = Math.min(3, usersCount); + int x = N == 0 ? 0 :(20 * (N - 1) + 24 + 8); + super.onMeasure(MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(x), MeasureSpec.EXACTLY), heightMeasureSpec); + } + }; + + LinearLayout linearLayout = new LinearLayout(context); + linearLayout.setOrientation(HORIZONTAL); + + addView(linearLayout, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.MATCH_PARENT, Gravity.CENTER_HORIZONTAL)); + + countTextView = new TextView(context); + countTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + countTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + + linearLayout.addView(avatarsImageView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.MATCH_PARENT)); + linearLayout.addView(countTextView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_VERTICAL)); + + setPadding(0, AndroidUtilities.dp(8), 0 ,AndroidUtilities.dp(8)); + avatarsImageView.commitTransition(false); + } + } + + private void revokeLink() { + AlertDialog.Builder builder = new AlertDialog.Builder(fragment.getParentActivity()); + builder.setMessage(LocaleController.getString("RevokeAlert", R.string.RevokeAlert)); + builder.setTitle(LocaleController.getString("RevokeLink", R.string.RevokeLink)); + builder.setPositiveButton(LocaleController.getString("RevokeButton", R.string.RevokeButton), (dialogInterface, i) -> { + if (delegate != null) { + delegate.revokeLink(); + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + fragment.showDialog(builder.create()); + } + + public void setDelegate(Delegate delegate) { + this.delegate = delegate; + } + + public void setUsers(int usersCount, ArrayList importers) { + this.usersCount = usersCount; + if (usersCount == 0) { + avatarsContainer.setVisibility(View.GONE); + setPadding(AndroidUtilities.dp(19), AndroidUtilities.dp(18), AndroidUtilities.dp(19), AndroidUtilities.dp(18)); + } else { + avatarsContainer.setVisibility(View.VISIBLE); + setPadding(AndroidUtilities.dp(19), AndroidUtilities.dp(18), AndroidUtilities.dp(19), AndroidUtilities.dp(10)); + avatarsContainer.countTextView.setText(LocaleController.formatPluralString("PeopleJoined", usersCount)); + avatarsContainer.requestLayout(); + } + if (importers != null) { + for (int i = 0; i < 3; i++) { + if (i < importers.size()) { + MessagesController.getInstance(UserConfig.selectedAccount).putUser(importers.get(i), false); + avatarsContainer.avatarsImageView.setObject(i, UserConfig.selectedAccount, importers.get(i)); + } else { + avatarsContainer.avatarsImageView.setObject(i, UserConfig.selectedAccount, null); + } + avatarsContainer.avatarsImageView.commitTransition(false); + } + } + } + + public void loadUsers(TLRPC.TL_chatInviteExported invite, int chatId) { + if (invite == null) { + setUsers(0, null); + return; + } + setUsers(invite.usage, invite.importers); + if (invite.usage > 0 && invite.importers == null && !loadingImporters) { + TLRPC.TL_messages_getChatInviteImporters req = new TLRPC.TL_messages_getChatInviteImporters(); + req.link = invite.link; + req.peer = MessagesController.getInstance(UserConfig.selectedAccount).getInputPeer(-chatId); + req.offset_user = new TLRPC.TL_inputUserEmpty(); + req.limit = Math.min(invite.usage, 3); + + loadingImporters = true; + ConnectionsManager.getInstance(UserConfig.selectedAccount).sendRequest(req, (response, error) -> { + AndroidUtilities.runOnUIThread(() -> { + loadingImporters = false; + if (error == null) { + TLRPC.TL_messages_chatInviteImporters inviteImporters = (TLRPC.TL_messages_chatInviteImporters) response; + if (invite.importers == null) { + invite.importers = new ArrayList<>(3); + } + invite.importers.clear(); + for (int i = 0; i < inviteImporters.users.size(); i++) { + invite.importers.addAll(inviteImporters.users); + } + setUsers(invite.usage, invite.importers); + } + }); + }); + } + } + + public interface Delegate { + void revokeLink(); + default void editLink() {} + default void removeLink() {} + default void showUsersForPermanentLink() {} + } + + public void setPermanent(boolean permanent) { + this.permanent = permanent; + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/LoadingStickerDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/LoadingStickerDrawable.java index 0b2fa719d47..7260f63a8de 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/LoadingStickerDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/LoadingStickerDrawable.java @@ -30,22 +30,28 @@ public class LoadingStickerDrawable extends Drawable { private float gradientWidth; private View parentView; + int currentColor0; + int currentColor1; + public LoadingStickerDrawable(View parent, String svg, int w, int h) { bitmap = SvgHelper.getBitmapByPathOnly(svg,512,512, w, h); parentView = parent; placeholderMatrix = new Matrix(); - setColors(Theme.key_dialogBackground, Theme.key_dialogBackgroundGray); } public void setColors(String key1, String key2) { int color0 = Theme.getColor(key1); int color1 = Theme.getColor(key2); - color0 = AndroidUtilities.getAverageColor(color1, color0); - placeholderPaint.setColor(color1); - placeholderGradient = new LinearGradient(0, 0, gradientWidth = AndroidUtilities.dp(500), 0, new int[]{color1, color0, color1}, new float[]{0.0f, 0.18f, 0.36f}, Shader.TileMode.REPEAT); - placeholderGradient.setLocalMatrix(placeholderMatrix); - Shader shaderB = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); - placeholderPaint.setShader(new ComposeShader(placeholderGradient, shaderB, PorterDuff.Mode.MULTIPLY)); + if (currentColor0 != color0 || currentColor1 != color1) { + currentColor0 = color0; + currentColor1 = color1; + color0 = AndroidUtilities.getAverageColor(color1, color0); + placeholderPaint.setColor(color1); + placeholderGradient = new LinearGradient(0, 0, gradientWidth = AndroidUtilities.dp(500), 0, new int[]{color1, color0, color1}, new float[]{0.0f, 0.18f, 0.36f}, Shader.TileMode.REPEAT); + placeholderGradient.setLocalMatrix(placeholderMatrix); + Shader shaderB = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); + placeholderPaint.setShader(new ComposeShader(placeholderGradient, shaderB, PorterDuff.Mode.MULTIPLY)); + } } @Override @@ -53,6 +59,7 @@ public void draw(Canvas canvas) { if (bitmap == null) { return; } + setColors(Theme.key_dialogBackground, Theme.key_dialogBackgroundGray); android.graphics.Rect bounds = getBounds(); canvas.drawRect(bounds.left, bounds.top, bounds.right, bounds.bottom, placeholderPaint); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/PermanentLinkBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/PermanentLinkBottomSheet.java new file mode 100644 index 00000000000..a4d7ed38c38 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/PermanentLinkBottomSheet.java @@ -0,0 +1,165 @@ +package org.telegram.ui.Components; + +import android.content.Context; +import android.graphics.Color; +import android.view.Gravity; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.core.graphics.ColorUtils; +import androidx.core.widget.NestedScrollView; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.MessagesController; +import org.telegram.messenger.R; +import org.telegram.tgnet.ConnectionsManager; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.ActionBar.BottomSheet; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.ActionBar.ThemeDescription; +import org.telegram.ui.ManageLinksActivity; + +import java.util.ArrayList; + +public class PermanentLinkBottomSheet extends BottomSheet { + + TLRPC.ChatFull info; + RLottieDrawable linkIcon; + private final TextView titleView; + private final TextView subtitle; + // private final TextView manage; + private final RLottieImageView imageView; + private final LinkActionView linkActionView; + private int chatId; + + public PermanentLinkBottomSheet(Context context, boolean needFocus, BaseFragment fragment, TLRPC.ChatFull info, int chatId) { + super(context, needFocus); + this.info = info; + this.chatId = chatId; + + setAllowNestedScroll(true); + setApplyBottomPadding(false); + + linkActionView = new LinkActionView(context, fragment, this, chatId, true); + linkActionView.setPermanent(true); + imageView = new RLottieImageView(context); + linkIcon = new RLottieDrawable(R.raw.shared_link_enter, "" + R.raw.shared_link_enter, AndroidUtilities.dp(90), AndroidUtilities.dp(90), false, null); + linkIcon.setCustomEndFrame(42); + imageView.setAnimation(linkIcon); + linkActionView.setUsers(0, null); + linkActionView.setPublic(true); + + titleView = new TextView(context); + titleView.setText(LocaleController.getString("InviteLink", R.string.InviteLink)); + titleView.setTextSize(24); + titleView.setGravity(Gravity.CENTER_HORIZONTAL); + titleView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); + + subtitle = new TextView(context); + subtitle.setText(LocaleController.getString("LinkInfo", R.string.LinkInfo)); + subtitle.setTextSize(14); + subtitle.setGravity(Gravity.CENTER_HORIZONTAL); + subtitle.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText)); + + /* + manage = new TextView(context); + manage.setText(LocaleController.getString("ManageInviteLinks", R.string.ManageInviteLinks)); + manage.setTextSize(14); + manage.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText)); + manage.setBackground(Theme.createRadSelectorDrawable(ColorUtils.setAlphaComponent(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText), (int) (255 * 0.3f)), AndroidUtilities.dp(4), AndroidUtilities.dp(4))); + manage.setPadding(AndroidUtilities.dp(12), AndroidUtilities.dp(4), AndroidUtilities.dp(12), AndroidUtilities.dp(4)); + + manage.setOnClickListener(view -> { + ManageLinksActivity manageFragment = new ManageLinksActivity(info.id); + manageFragment.setInfo(info, info.exported_invite); + fragment.presentFragment(manageFragment); + dismiss(); + }); +*/ + LinearLayout linearLayout = new LinearLayout(context); + linearLayout.setOrientation(LinearLayout.VERTICAL); + linearLayout.addView(imageView, LayoutHelper.createLinear(90, 90, Gravity.CENTER_HORIZONTAL, 0, 24, 0, 0)); + linearLayout.addView(titleView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 60, 16, 60, 0)); + linearLayout.addView(subtitle, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 60, 16, 60, 0)); + linearLayout.addView(linkActionView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); + // linearLayout.addView(manage, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL, 60, 26, 60, 26)); + + NestedScrollView scrollView = new NestedScrollView(context); + scrollView.setVerticalScrollBarEnabled(false); + scrollView.addView(linearLayout); + + setCustomView(scrollView); + + if (info != null && info.exported_invite != null) { + linkActionView.setLink(info.exported_invite.link); + } else { + generateLink(); + } + + updateColors(); + } + + boolean linkGenerating; + TLRPC.TL_chatInviteExported invite; + + private void generateLink() { + if (linkGenerating) { + return; + } + linkGenerating = true; + TLRPC.TL_messages_exportChatInvite req = new TLRPC.TL_messages_exportChatInvite(); + //req.legacy_revoke_permanent = true; TODO layer 124 + req.peer = MessagesController.getInstance(currentAccount).getInputPeer(-chatId); + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { + if (error == null) { + invite = (TLRPC.TL_chatInviteExported) response; + + TLRPC.ChatFull chatInfo = MessagesController.getInstance(currentAccount).getChatFull(chatId); + if (chatInfo != null) { + chatInfo.exported_invite = invite; + } + + linkActionView.setLink(invite.link); + } + linkGenerating = false; + })); + } + + @Override + public void show() { + super.show(); + AndroidUtilities.runOnUIThread(() -> { + linkIcon.start(); + }, 50); + } + + @Override + public ArrayList getThemeDescriptions() { + ArrayList arrayList = new ArrayList<>(); + ThemeDescription.ThemeDescriptionDelegate descriptionDelegate = () -> { + updateColors(); + }; + arrayList.add(new ThemeDescription(titleView, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); + arrayList.add(new ThemeDescription(subtitle, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteGrayText)); + // arrayList.add(new ThemeDescription(manage, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteBlueText)); + arrayList.add(new ThemeDescription(null, 0, null, null, null, descriptionDelegate, Theme.key_featuredStickers_addButton)); + arrayList.add(new ThemeDescription(null, 0, null, null, null, descriptionDelegate, Theme.key_featuredStickers_buttonText)); + arrayList.add(new ThemeDescription(null, 0, null, null, null, descriptionDelegate, Theme.key_windowBackgroundWhiteBlueText)); + return arrayList; + } + + private void updateColors() { + imageView.setBackground(Theme.createCircleDrawable(AndroidUtilities.dp(90), Theme.getColor(Theme.key_featuredStickers_addButton))); + // manage.setBackground(Theme.createRadSelectorDrawable(ColorUtils.setAlphaComponent(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText), (int) (255 * 0.3f)), AndroidUtilities.dp(4), AndroidUtilities.dp(4))); + int color = Theme.getColor(Theme.key_featuredStickers_buttonText); + linkIcon.setLayerColor("Top.**", color); + linkIcon.setLayerColor("Bottom.**", color); + linkIcon.setLayerColor("Center.**", color); + linkActionView.updateColors(); + setBackgroundColor(Theme.getColor(Theme.key_dialogBackground)); + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/QRCodeBottomSheet.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/QRCodeBottomSheet.java new file mode 100644 index 00000000000..7aa62d31f6c --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/QRCodeBottomSheet.java @@ -0,0 +1,123 @@ +package org.telegram.ui.Components; + +import android.content.ActivityNotFoundException; +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.net.Uri; +import android.provider.MediaStore; +import android.text.TextUtils; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.google.zxing.BarcodeFormat; +import com.google.zxing.EncodeHintType; +import com.google.zxing.qrcode.QRCodeWriter; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.FileLog; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.R; +import org.telegram.ui.ActionBar.BottomSheet; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.ActionBar.ThemeDescription; + +import java.io.ByteArrayOutputStream; +import java.util.ArrayList; +import java.util.HashMap; + +public class QRCodeBottomSheet extends BottomSheet { + + Bitmap qrCode; + private final TextView help; + private final TextView buttonTextView; + + public QRCodeBottomSheet(Context context, String link) { + super(context, false); + + setTitle(LocaleController.getString("InviteByQRCode", R.string.InviteByQRCode), true); + ImageView imageView = new ImageView(context) { + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int size = MeasureSpec.getSize(widthMeasureSpec); + super.onMeasure(MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY)); + } + }; + int p = AndroidUtilities.dp(54); + imageView.setPadding(p, p, p, p); + imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); + + LinearLayout linearLayout = new LinearLayout(context); + linearLayout.setOrientation(LinearLayout.VERTICAL); + imageView.setImageBitmap(qrCode = createQR(context, link, qrCode)); + FrameLayout frameLayout = new FrameLayout(context); + frameLayout.addView(imageView); + linearLayout.addView(frameLayout, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 30, 0,30 ,0)); + + help = new TextView(context); + help.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + help.setText(LocaleController.getString("QRCodeLinkHelp", R.string.QRCodeLinkHelp)); + help.setGravity(Gravity.CENTER_HORIZONTAL); + frameLayout.addView(help, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.BOTTOM,40, 0,40 ,8)); + + buttonTextView = new TextView(context); + + buttonTextView.setPadding(AndroidUtilities.dp(34), 0, AndroidUtilities.dp(34), 0); + buttonTextView.setGravity(Gravity.CENTER); + buttonTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + buttonTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + buttonTextView.setText(LocaleController.getString("ShareQrCode", R.string.ShareQrCode)); + buttonTextView.setOnClickListener(view -> { + Intent i = new Intent(Intent.ACTION_SEND); + + i.setType("image/*"); + i.putExtra(Intent.EXTRA_STREAM, getImageUri(context, qrCode)); + try { + AndroidUtilities.findActivity(context).startActivityForResult(Intent.createChooser(i, LocaleController.getString("InviteByQRCode", R.string.InviteByQRCode)), 500); + } catch (ActivityNotFoundException ex) { + ex.printStackTrace(); + } + }); + + linearLayout.addView(buttonTextView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 48, Gravity.BOTTOM, 16, 15, 16, 16)); + + updateColors(); + setCustomView(linearLayout); + } + + public Uri getImageUri(Context inContext, Bitmap inImage) { + ByteArrayOutputStream bytes = new ByteArrayOutputStream(); + inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes); + + String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "group_invite_qr", null); + return Uri.parse(path); + } + + public Bitmap createQR(Context context, String key, Bitmap oldBitmap) { + try { + HashMap hints = new HashMap<>(); + hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M); + hints.put(EncodeHintType.MARGIN, 0); + return new QRCodeWriter().encode(key, BarcodeFormat.QR_CODE, 768, 768, hints, oldBitmap, context); + } catch (Exception e) { + FileLog.e(e); + } + return null; + } + + void updateColors() { + buttonTextView.setBackgroundDrawable(Theme.createSimpleSelectorRoundRectDrawable(AndroidUtilities.dp(6), Theme.getColor(Theme.key_featuredStickers_addButton), Theme.getColor(Theme.key_featuredStickers_addButtonPressed))); + help.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText)); + buttonTextView.setTextColor(Theme.getColor(Theme.key_featuredStickers_buttonText)); + if (getTitleView() != null) { + getTitleView().setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); + } + setBackgroundColor(Theme.getColor(Theme.key_dialogBackground)); + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/RLottieDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/RLottieDrawable.java index 5833ed9d252..c67f02cdcb2 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/RLottieDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/RLottieDrawable.java @@ -556,7 +556,7 @@ public void setPlayInDirectionOfCustomEndFrame(boolean value) { } public boolean setCustomEndFrame(int frame) { - if (customEndFrame == frame || customEndFrame > metaData[0]) { + if (customEndFrame == frame || frame > metaData[0]) { return false; } customEndFrame = frame; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ScamDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ScamDrawable.java index ac502639750..811cff985eb 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ScamDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ScamDrawable.java @@ -19,21 +19,32 @@ public class ScamDrawable extends Drawable { private TextPaint textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); private int textWidth; private String text; + private int currentType; - public ScamDrawable(int textSize) { + public ScamDrawable(int textSize, int type) { super(); + currentType = type; textPaint.setTextSize(AndroidUtilities.dp(textSize)); textPaint.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(AndroidUtilities.dp(1)); - text = LocaleController.getString("ScamMessage", R.string.ScamMessage); + if (type == 0) { + text = LocaleController.getString("ScamMessage", R.string.ScamMessage); + } else { + text = LocaleController.getString("FakeMessage", R.string.FakeMessage); + } textWidth = (int) Math.ceil(textPaint.measureText(text)); } public void checkText() { - String newText = LocaleController.getString("ScamMessage", R.string.ScamMessage); + String newText; + if (currentType == 0) { + newText = LocaleController.getString("ScamMessage", R.string.ScamMessage); + } else { + newText = LocaleController.getString("FakeMessage", R.string.FakeMessage); + } if (!newText.equals(text)) { text = newText; textWidth = (int) Math.ceil(textPaint.measureText(text)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ScrollSlidingTextTabStrip.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ScrollSlidingTextTabStrip.java index 5df96abd1a5..de1878f36ef 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ScrollSlidingTextTabStrip.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ScrollSlidingTextTabStrip.java @@ -24,6 +24,7 @@ import android.view.Gravity; import android.view.View; import android.view.ViewGroup; +import android.view.accessibility.AccessibilityNodeInfo; import android.widget.HorizontalScrollView; import android.widget.LinearLayout; import android.widget.TextView; @@ -217,13 +218,19 @@ public int getNextPageId(boolean forward) { } public SparseArray removeTabs() { + SparseArray views = new SparseArray<>(); + for (int i = 0; i < getChildCount(); i++) { + View child = getChildAt(i); + views.get(positionToId.get(i), child); + } positionToId.clear(); idToPosition.clear(); positionToWidth.clear(); tabsContainer.removeAllViews(); allTextWidth = 0; tabCount = 0; - return null; + + return views; } public int getTabsCount() { @@ -254,7 +261,13 @@ public void addTextTab(final int id, CharSequence text, SparseArray viewsC viewsCache.delete(id); } if (tab == null) { - tab = new TextView(getContext()); + tab = new TextView(getContext()) { + @Override + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(info); + info.setSelected(selectedTabId == id); + } + }; tab.setWillNotDraw(false); tab.setGravity(Gravity.CENTER); tab.setBackgroundDrawable(Theme.createSelectorDrawable(Theme.getColor(selectorColorKey), 3)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/SearchViewPager.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/SearchViewPager.java index 0f613356c55..e8e3530ef9f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/SearchViewPager.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SearchViewPager.java @@ -96,11 +96,15 @@ public SearchViewPager(Context context, BaseFragment fragment, int type, int ini dialogsSearchAdapter = new DialogsSearchAdapter(context, type, initialDialogsType, folderId) { @Override public void notifyDataSetChanged() { + int itemCount = getCurrentItemCount(); super.notifyDataSetChanged(); if (!lastSearchScrolledToTop && searchListView != null) { searchListView.scrollToPosition(0); lastSearchScrolledToTop = true; } + if (getItemCount() == 0 && itemCount != 0 && !isSearching()) { + emptyView.showProgress(false, false); + } } }; @@ -613,6 +617,15 @@ public void reset() { viewsByType.clear(); } + public void setPosition(int position) { + super.setPosition(position); + viewsByType.clear(); + if (tabsView != null) { + tabsView.selectTabWithId(position, 1f); + } + invalidate(); + } + public void setKeyboardHeight(int keyboardSize) { this.keyboardSize = keyboardSize; boolean animated = getVisibility() == View.VISIBLE && getAlpha() > 0; @@ -742,6 +755,10 @@ public void cancelEnterAnimation() { } } + public TabsView getTabsView() { + return tabsView; + } + private class SearchResultsEnterAnimator { final ValueAnimator valueAnimator; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ShareAlert.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ShareAlert.java index edb6adfaa1c..df41e964e66 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ShareAlert.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ShareAlert.java @@ -1068,6 +1068,7 @@ public void getOutline(View view, Outline outline) { } SendMessagesHelper.getInstance(currentAccount).sendMessage(sendingMessageObjects, key, true, 0); } + onSend(selectedDialogs, sendingMessageObjects.size()); } else if (sendingText != null) { for (int a = 0; a < selectedDialogs.size(); a++) { long key = selectedDialogs.keyAt(a); @@ -1124,6 +1125,10 @@ protected void onDraw(Canvas canvas) { } } + protected void onSend(LongSparseArray dids, int count) { + + } + private int getCurrentTop() { if (gridView.getChildCount() != 0) { View child = gridView.getChildAt(0); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/SharedMediaLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/SharedMediaLayout.java index b18ae7887ae..f99ff0a27d8 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/SharedMediaLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SharedMediaLayout.java @@ -41,6 +41,7 @@ import android.widget.LinearLayout; import android.widget.TextView; +import androidx.core.view.accessibility.AccessibilityNodeInfoCompat; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -988,6 +989,15 @@ protected int getFlowItemCount() { } return getItemCount(); } + + @Override + public void onInitializeAccessibilityNodeInfoForItem(RecyclerView.Recycler recycler, RecyclerView.State state, View host, AccessibilityNodeInfoCompat info) { + super.onInitializeAccessibilityNodeInfoForItem(recycler, state, host, info); + final AccessibilityNodeInfoCompat.CollectionItemInfoCompat itemInfo = info.getCollectionItemInfo(); + if (itemInfo != null && itemInfo.isHeading()) { + info.setCollectionItemInfo(AccessibilityNodeInfoCompat.CollectionItemInfoCompat.obtain(itemInfo.getRowIndex(), itemInfo.getRowSpan(), itemInfo.getColumnIndex(), itemInfo.getColumnSpan(), false)); + } + } }; layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override @@ -1254,7 +1264,7 @@ protected void onDraw(Canvas canvas) { @Override protected void dispatchDraw(Canvas canvas) { super.dispatchDraw(canvas); - if (fragmentContextView != null && fragmentContextView.getCurrentStyle() == 3) { + if (fragmentContextView != null && fragmentContextView.isCallStyle()) { canvas.save(); canvas.translate(fragmentContextView.getX(), fragmentContextView.getY()); fragmentContextView.setDrawOverlay(true); @@ -2461,41 +2471,41 @@ private void updateTabs(boolean animated) { if (!profileActivity.isFragmentOpened) { animated = false; } - boolean changed = false; + int changed = 0; if ((chatUsersAdapter.chatInfo == null) == scrollSlidingTextTabStrip.hasTab(7)) { - changed = true; + changed++; } if ((hasMedia[0] <= 0) == scrollSlidingTextTabStrip.hasTab(0)) { - changed = true; + changed++; } if ((hasMedia[1] <= 0) == scrollSlidingTextTabStrip.hasTab(1)) { - changed = true; + changed++; } if ((int) dialog_id != 0) { if ((hasMedia[3] <= 0) == scrollSlidingTextTabStrip.hasTab(3)) { - changed = true; + changed++; } if ((hasMedia[4] <= 0) == scrollSlidingTextTabStrip.hasTab(4)) { - changed = true; + changed++; } } else { TLRPC.EncryptedChat currentEncryptedChat = profileActivity.getMessagesController().getEncryptedChat((int) (dialog_id >> 32)); if (currentEncryptedChat != null && AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) >= 46) { if ((hasMedia[4] <= 0) == scrollSlidingTextTabStrip.hasTab(4)) { - changed = true; + changed++; } } } if ((hasMedia[2] <= 0) == scrollSlidingTextTabStrip.hasTab(2)) { - changed = true; + changed++; } if ((hasMedia[5] <= 0) == scrollSlidingTextTabStrip.hasTab(5)) { - changed = true; + changed++; } if ((hasMedia[6] <= 0) == scrollSlidingTextTabStrip.hasTab(6)) { - changed = true; + changed++; } - if (changed) { + if (changed > 0) { if (animated && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { final TransitionSet transitionSet = new TransitionSet(); transitionSet.setOrdering(TransitionSet.ORDERING_TOGETHER); @@ -2530,6 +2540,9 @@ public Animator onDisappear(ViewGroup sceneRoot, View view, TransitionValues sta scrollSlidingTextTabStrip.recordIndicatorParams(); } SparseArray idToView = scrollSlidingTextTabStrip.removeTabs(); + if (changed > 3) { + idToView = null; + } if (chatUsersAdapter.chatInfo != null) { if (!scrollSlidingTextTabStrip.hasTab(7)) { scrollSlidingTextTabStrip.addTextTab(7, LocaleController.getString("GroupMembers", R.string.GroupMembers), idToView); @@ -2912,10 +2925,10 @@ private void onItemClick(int index, View view, MessageObject message, int a, int } else if (!cell.isLoading()) { MessageObject messageObject = cell.getMessage(); profileActivity.getFileLoader().loadFile(document, messageObject, 0, 0); - cell.updateFileExistIcon(); + cell.updateFileExistIcon(true); } else { profileActivity.getFileLoader().cancelLoadFile(document); - cell.updateFileExistIcon(); + cell.updateFileExistIcon(true); } } } else if (selectedMode == 3) { @@ -4033,6 +4046,7 @@ private void getChats(int max_id, final int count) { loading = true; notifyDataSetChanged(); int reqId = profileActivity.getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { + int oldCount = getItemCount(); if (error == null) { TLRPC.messages_Chats res = (TLRPC.messages_Chats) response; profileActivity.getMessagesController().putChats(res.chats, false); @@ -4046,7 +4060,7 @@ private void getChats(int max_id, final int count) { if (mediaPages[a].selectedType == 6) { if (mediaPages[a].listView != null) { final RecyclerListView listView = mediaPages[a].listView; - if (firstLoaded) { + if (firstLoaded || oldCount == 0) { animateItemsEnter(listView, 0); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/SlideChooseView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/SlideChooseView.java index e595d7961fc..a04d1bef08b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/SlideChooseView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SlideChooseView.java @@ -72,7 +72,6 @@ public void setCallback(Callback callback) { } public void setOptions(int selected, String... options) { - this.callback = callback; this.optionsStr = options; selectedIndex = selected; optionsSizes = new int[optionsStr.length]; @@ -203,6 +202,10 @@ public boolean performAccessibilityAction(int action, Bundle arguments) { return super.performAccessibilityAction(action, arguments) || accessibilityDelegate.performAccessibilityActionInternal(this, action, arguments); } + public int getSelectedIndex() { + return selectedIndex; + } + public interface Callback { void onOptionSelected(int index); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/SubstringLayoutAnimator.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/SubstringLayoutAnimator.java new file mode 100644 index 00000000000..a6c91ecefdd --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SubstringLayoutAnimator.java @@ -0,0 +1,144 @@ +package org.telegram.ui.Components; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ValueAnimator; +import android.graphics.Canvas; +import android.text.Layout; +import android.text.SpannableStringBuilder; +import android.text.StaticLayout; +import android.text.TextPaint; +import android.view.View; + +import org.telegram.messenger.AndroidUtilities; + +public class SubstringLayoutAnimator { + + private final View parentView; + + private StaticLayout animateInLayout; + private StaticLayout animateOutLayout; + private StaticLayout animateStableLayout; + public boolean animateTextChange; + private boolean animateTextChangeOut; + private boolean replaceAnimation; + private float xOffset; + private float hintProgress; + + ValueAnimator valueAnimator; + + public SubstringLayoutAnimator(View parentView) { + this.parentView = parentView; + } + + public void create(StaticLayout hintLayout, CharSequence hint, CharSequence text, TextPaint paint) { + if (hintLayout != null && !hint.equals(text)) { + + if (valueAnimator != null) { + valueAnimator.cancel(); + } + + boolean animateOut; + String maxStr; + String substring; + if (hint.length() > text.length()) { + animateOut = true; + maxStr = hint.toString(); + substring = text.toString(); + } else { + animateOut = false; + maxStr = text.toString(); + substring = hint.toString(); + } + int startFrom = maxStr.indexOf(substring); + if (startFrom >= 0) { + SpannableStringBuilder inStr = new SpannableStringBuilder(maxStr); + SpannableStringBuilder stabeStr = new SpannableStringBuilder(maxStr); + if (startFrom != 0) { + stabeStr.setSpan(new EmptyStubSpan(), 0, startFrom, 0); + } + if (startFrom + substring.length() != maxStr.length()) { + stabeStr.setSpan(new EmptyStubSpan(), startFrom + substring.length(), maxStr.length(), 0); + } + inStr.setSpan(new EmptyStubSpan(), startFrom, startFrom + substring.length(), 0); + + animateInLayout = new StaticLayout(inStr, paint, AndroidUtilities.dp(400), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0, false); + animateStableLayout = new StaticLayout(stabeStr, paint, AndroidUtilities.dp(400), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0, false); + animateTextChange = true; + animateTextChangeOut = animateOut; + xOffset = startFrom == 0 ? 0 : -animateStableLayout.getPrimaryHorizontal(startFrom); + animateOutLayout = null; + replaceAnimation = false; + } else { + animateInLayout = new StaticLayout(text, paint, AndroidUtilities.dp(400), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0, false); + animateOutLayout = new StaticLayout(hint, paint, AndroidUtilities.dp(400), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0, false); + animateStableLayout = null; + animateTextChange = true; + replaceAnimation = true; + xOffset = 0; + } + + hintProgress = 0f; + valueAnimator = ValueAnimator.ofFloat(0, 1f); + valueAnimator.addUpdateListener(valueAnimator1 -> { + hintProgress = (float) valueAnimator1.getAnimatedValue(); + parentView.invalidate(); + }); + valueAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + animateTextChange = false; + } + }); + valueAnimator.setDuration(150); + valueAnimator.setInterpolator(CubicBezierInterpolator.DEFAULT); + valueAnimator.start(); + } + } + + public void draw(Canvas canvas, TextPaint paint) { + if (animateTextChange) { + float titleOffsetX = xOffset * (animateTextChangeOut ? hintProgress : 1f - hintProgress); + int alpha = paint.getAlpha(); + if (animateStableLayout != null) { + canvas.save(); + canvas.translate(titleOffsetX, 0); + animateStableLayout.draw(canvas); + canvas.restore(); + } + if (animateInLayout != null) { + float p = animateTextChangeOut ? 1f - hintProgress : hintProgress; + canvas.save(); + paint.setAlpha((int) (alpha * p)); + canvas.translate(titleOffsetX, 0); + if (replaceAnimation) { + float s = 0.9f + 0.1f * p; + canvas.scale(s, s, titleOffsetX, parentView.getMeasuredHeight() / 2f); + } + animateInLayout.draw(canvas); + canvas.restore(); + paint.setAlpha(alpha); + } + if (animateOutLayout != null) { + float p = animateTextChangeOut ? hintProgress : 1f - hintProgress; + canvas.save(); + paint.setAlpha((int) (alpha * (animateTextChangeOut ? hintProgress : 1f - hintProgress))); + canvas.translate(titleOffsetX, 0); + if (replaceAnimation) { + float s = 0.9f + 0.1f * p; + canvas.scale(s, s, titleOffsetX, parentView.getMeasuredHeight() / 2f); + } + animateOutLayout.draw(canvas); + canvas.restore(); + paint.setAlpha(alpha); + } + } + } + + public void cancel() { + if (valueAnimator != null) { + valueAnimator.cancel(); + } + animateTextChange = false; + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/UndoView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/UndoView.java index e8bfd705aa3..a691b718b68 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/UndoView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/UndoView.java @@ -114,6 +114,17 @@ public class UndoView extends FrameLayout { public final static int ACTION_VOIP_REMOVED = 32; public final static int ACTION_VOIP_LINK_COPIED = 33; public final static int ACTION_VOIP_INVITED = 34; + public final static int ACTION_VOIP_MUTED_FOR_YOU = 35; + public final static int ACTION_VOIP_UNMUTED_FOR_YOU = 36; + + public final static int ACTION_IMPORT_NOT_MUTUAL = 40; + public final static int ACTION_IMPORT_GROUP_NOT_ADMIN = 41; + public final static int ACTION_IMPORT_INFO = 42; + + public final static int ACTION_PLAYBACK_SPEED_ENABLED = 50; + public final static int ACTION_PLAYBACK_SPEED_DISABLED = 51; + public final static int ACTION_TEXT_COPIED = 52; + public final static int ACTION_FWD_MESSAGES = 53; private CharSequence infoText; @@ -244,7 +255,7 @@ private boolean isTooltipAction() { currentAction == ACTION_OWNER_TRANSFERED_GROUP || currentAction == ACTION_QUIZ_CORRECT || currentAction == ACTION_QUIZ_INCORRECT || currentAction == ACTION_CACHE_WAS_CLEARED || currentAction == ACTION_ADDED_TO_FOLDER || currentAction == ACTION_REMOVED_FROM_FOLDER || currentAction == ACTION_PROFILE_PHOTO_CHANGED || currentAction == ACTION_CHAT_UNARCHIVED || currentAction == ACTION_VOIP_MUTED || currentAction == ACTION_VOIP_UNMUTED || currentAction == ACTION_VOIP_REMOVED || - currentAction == ACTION_VOIP_LINK_COPIED || currentAction == ACTION_VOIP_INVITED; + currentAction == ACTION_VOIP_LINK_COPIED || currentAction == ACTION_VOIP_INVITED || currentAction == ACTION_VOIP_MUTED_FOR_YOU || currentAction == ACTION_VOIP_UNMUTED_FOR_YOU; } private boolean hasSubInfo() { @@ -349,6 +360,7 @@ public void showWithAction(long did, int action, Object infoObject, Object infoO lastUpdateTime = SystemClock.elapsedRealtime(); undoTextView.setText(LocaleController.getString("Undo", R.string.Undo).toUpperCase()); undoImageView.setVisibility(VISIBLE); + leftImageView.setPadding(0, 0, 0, 0); infoTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); avatarImageView.setVisibility(GONE); @@ -366,6 +378,7 @@ public void showWithAction(long did, int action, Object infoObject, Object infoO layoutParams2.height = LayoutHelper.WRAP_CONTENT; infoTextView.setMinHeight(0); + boolean infoOnly = false; if (isTooltipAction()) { CharSequence infoText; @@ -395,12 +408,24 @@ public void showWithAction(long did, int action, Object infoObject, Object infoO subInfoText = null; icon = R.raw.voip_muted; timeLeft = 3000; + } else if (action == ACTION_VOIP_MUTED_FOR_YOU) { + TLRPC.User user = (TLRPC.User) infoObject; + infoText = AndroidUtilities.replaceTags(LocaleController.formatString("VoipGroupUserCantNowSpeakForYou", R.string.VoipGroupUserCantNowSpeakForYou, UserObject.getFirstName(user))); + subInfoText = null; + icon = R.raw.voip_muted; + timeLeft = 3000; } else if (action == ACTION_VOIP_UNMUTED) { TLRPC.User user = (TLRPC.User) infoObject; infoText = AndroidUtilities.replaceTags(LocaleController.formatString("VoipGroupUserCanNowSpeak", R.string.VoipGroupUserCanNowSpeak, UserObject.getFirstName(user))); subInfoText = null; icon = R.raw.voip_unmuted; timeLeft = 3000; + } else if (action == ACTION_VOIP_UNMUTED_FOR_YOU) { + TLRPC.User user = (TLRPC.User) infoObject; + infoText = AndroidUtilities.replaceTags(LocaleController.formatString("VoipGroupUserCanNowSpeakForYou", R.string.VoipGroupUserCanNowSpeakForYou, UserObject.getFirstName(user))); + subInfoText = null; + icon = R.raw.voip_unmuted; + timeLeft = 3000; } else if (action == ACTION_VOIP_REMOVED) { TLRPC.User user = (TLRPC.User) infoObject; infoText = AndroidUtilities.replaceTags(LocaleController.formatString("VoipGroupRemovedFromGroup", R.string.VoipGroupRemovedFromGroup, UserObject.getFirstName(user))); @@ -559,6 +584,92 @@ public void showWithAction(long did, int action, Object infoObject, Object infoO } undoButton.setVisibility(GONE); + } else if (currentAction == ACTION_IMPORT_NOT_MUTUAL || currentAction == ACTION_IMPORT_GROUP_NOT_ADMIN || currentAction == ACTION_IMPORT_INFO || + currentAction == ACTION_PLAYBACK_SPEED_DISABLED || currentAction == ACTION_PLAYBACK_SPEED_ENABLED || currentAction == ACTION_TEXT_COPIED || + currentAction == ACTION_FWD_MESSAGES) { + undoImageView.setVisibility(GONE); + leftImageView.setVisibility(VISIBLE); + + infoTextView.setTypeface(Typeface.DEFAULT); + infoTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); + + if (currentAction == ACTION_IMPORT_NOT_MUTUAL) { + infoTextView.setText(LocaleController.getString("ImportMutualError", R.string.ImportMutualError)); + leftImageView.setAnimation(R.raw.error, 36, 36); + infoOnly = true; + layoutParams.topMargin = AndroidUtilities.dp(10); + } else if (currentAction == ACTION_IMPORT_GROUP_NOT_ADMIN) { + infoTextView.setText(LocaleController.getString("ImportNotAdmin", R.string.ImportNotAdmin)); + leftImageView.setAnimation(R.raw.error, 36, 36); + infoOnly = true; + layoutParams.topMargin = AndroidUtilities.dp(10); + } else if (currentAction == ACTION_IMPORT_INFO) { + infoTextView.setText(LocaleController.getString("ImportedInfo", R.string.ImportedInfo)); + leftImageView.setAnimation(R.raw.imported, 36, 36); + leftImageView.setPadding(0, 0, 0, AndroidUtilities.dp(5)); + infoOnly = true; + layoutParams.topMargin = AndroidUtilities.dp(10); + } else if (currentAction == ACTION_PLAYBACK_SPEED_DISABLED) { + infoTextView.setText(LocaleController.getString("AudioSpeedNormal", R.string.AudioSpeedNormal)); + leftImageView.setAnimation(R.raw.audio_stop_speed, 36, 36); + timeLeft = 3000; + } else if (currentAction == ACTION_PLAYBACK_SPEED_ENABLED) { + infoTextView.setText(LocaleController.getString("AudioSpeedFast", R.string.AudioSpeedFast)); + leftImageView.setAnimation(R.raw.audio_speed, 36, 36); + timeLeft = 3000; + } else if (currentAction == ACTION_TEXT_COPIED) { + infoTextView.setText(LocaleController.getString("MessageCopied", R.string.MessageCopied)); + leftImageView.setAnimation(R.raw.copy, 30, 30); + timeLeft = 3000; + } else if (currentAction == ACTION_FWD_MESSAGES) { + Integer count = (Integer) infoObject; + if (infoObject2 == null) { + if (did == UserConfig.getInstance(currentAccount).clientUserId) { + if (count == 1) { + infoTextView.setText(AndroidUtilities.replaceTags(LocaleController.getString("FwdMessageToSavedMessages", R.string.FwdMessageToSavedMessages))); + } else { + infoTextView.setText(AndroidUtilities.replaceTags(LocaleController.getString("FwdMessagesToSavedMessages", R.string.FwdMessagesToSavedMessages))); + } + leftImageView.setAnimation(R.raw.saved_messages, 30, 30); + } else { + int lowerId = (int) did; + if (lowerId < 0) { + TLRPC.Chat chat = MessagesController.getInstance(currentAccount).getChat(-lowerId); + if (count == 1) { + infoTextView.setText(AndroidUtilities.replaceTags(LocaleController.formatString("FwdMessageToGroup", R.string.FwdMessageToGroup, chat.title))); + } else { + infoTextView.setText(AndroidUtilities.replaceTags(LocaleController.formatString("FwdMessagesToGroup", R.string.FwdMessagesToGroup, chat.title))); + } + } else { + TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(lowerId); + if (count == 1) { + infoTextView.setText(AndroidUtilities.replaceTags(LocaleController.formatString("FwdMessageToUser", R.string.FwdMessageToUser, UserObject.getFirstName(user)))); + } else { + infoTextView.setText(AndroidUtilities.replaceTags(LocaleController.formatString("FwdMessagesToUser", R.string.FwdMessagesToUser, UserObject.getFirstName(user)))); + } + } + leftImageView.setAnimation(R.raw.forward, 30, 30); + } + } else { + int amount = (Integer) infoObject2; + if (count == 1) { + infoTextView.setText(AndroidUtilities.replaceTags(LocaleController.formatString("FwdMessageToChats", R.string.FwdMessageToChats, LocaleController.formatPluralString("Chats", amount)))); + } else { + infoTextView.setText(AndroidUtilities.replaceTags(LocaleController.formatString("FwdMessagesToChats", R.string.FwdMessagesToChats, LocaleController.formatPluralString("Chats", amount)))); + } + leftImageView.setAnimation(R.raw.forward, 30, 30); + } + timeLeft = 3000; + } + subinfoTextView.setVisibility(GONE); + undoTextView.setTextColor(Theme.getColor(Theme.key_undo_cancelColor)); + undoButton.setVisibility(GONE); + + layoutParams.leftMargin = AndroidUtilities.dp(58); + layoutParams.rightMargin = AndroidUtilities.dp(8); + + leftImageView.setProgress(0); + leftImageView.playAnimation(); } else if (currentAction == ACTION_PROXIMITY_SET || currentAction == ACTION_PROXIMITY_REMOVED) { int radius = (Integer) infoObject; TLRPC.User user = (TLRPC.User) infoObject2; @@ -840,6 +951,8 @@ public void showWithAction(long did, int action, Object infoObject, Object infoO undoViewHeight = Math.max(undoViewHeight, AndroidUtilities.dp(52)); } else if (currentAction == ACTION_PROXIMITY_REMOVED) { undoViewHeight = Math.max(undoViewHeight, AndroidUtilities.dp(50)); + } else if (infoOnly) { + undoViewHeight -= AndroidUtilities.dp(8); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/UsersAlertBase.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/UsersAlertBase.java new file mode 100644 index 00000000000..787c880e550 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/UsersAlertBase.java @@ -0,0 +1,624 @@ +package org.telegram.ui.Components; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; +import android.animation.ValueAnimator; +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; +import android.graphics.RectF; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.util.Property; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.view.inputmethod.EditorInfo; +import android.widget.FrameLayout; +import android.widget.ImageView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.google.android.exoplayer2.util.Log; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.R; +import org.telegram.ui.ActionBar.AdjustPanLayoutHelper; +import org.telegram.ui.ActionBar.BottomSheet; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.Cells.GraySectionCell; +import org.telegram.ui.Cells.GroupCallTextCell; +import org.telegram.ui.Cells.GroupCallUserCell; + +public class UsersAlertBase extends BottomSheet { + + protected FrameLayout frameLayout; + protected RecyclerListView listView; + protected RecyclerListView.SelectionAdapter searchListViewAdapter; + protected RecyclerListView.SelectionAdapter listViewAdapter; + protected Drawable shadowDrawable; + protected View shadow; + protected AnimatorSet shadowAnimation; + protected StickerEmptyView emptyView; + protected FlickerLoadingView flickerLoadingView; + private SearchField searchView; + + private RectF rect = new RectF(); + + protected int scrollOffsetY; + + private float colorProgress; + private int backgroundColor; + + protected boolean needSnapToTop = true; + + protected String keyScrollUp = Theme.key_sheet_scrollUp; + protected String keyListSelector = Theme.key_listSelector; + protected String keySearchBackground = Theme.key_dialogSearchBackground; + protected String keyInviteMembersBackground = Theme.key_windowBackgroundWhite; + protected String keyListViewBackground = Theme.key_windowBackgroundWhite; + protected String keyActionBarUnscrolled = Theme.key_windowBackgroundWhite; + protected String keyNameText = Theme.key_windowBackgroundWhiteBlackText; + protected String keyLastSeenText = Theme.key_windowBackgroundWhiteGrayText; + protected String keyLastSeenTextUnscrolled = Theme.key_windowBackgroundWhiteGrayText; + protected String keySearchPlaceholder = Theme.key_dialogSearchHint; + protected String keySearchText = Theme.key_dialogSearchText; + protected String keySearchIcon = Theme.key_dialogSearchIcon; + protected String keySearchIconUnscrolled = Theme.key_dialogSearchIcon; + protected final FillLastLinearLayoutManager layoutManager; + + + public UsersAlertBase(Context context, boolean needFocus, int account) { + super(context, needFocus); + updateColorKeys(); + setDimBehindAlpha(75); + + currentAccount = account; + + shadowDrawable = context.getResources().getDrawable(R.drawable.sheet_shadow_round).mutate(); + + containerView = createContainerView(context); + containerView.setWillNotDraw(false); + containerView.setClipChildren(false); + containerView.setPadding(backgroundPaddingLeft, 0, backgroundPaddingLeft, 0); + + frameLayout = new FrameLayout(context); + + searchView = new SearchField(context); + frameLayout.addView(searchView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT)); + + flickerLoadingView = new FlickerLoadingView(context); + flickerLoadingView.setViewType(FlickerLoadingView.USERS_TYPE); + flickerLoadingView.showDate(false); + flickerLoadingView.setUseHeaderOffset(true); + flickerLoadingView.setColors(keyInviteMembersBackground, keySearchBackground, keyActionBarUnscrolled); + + emptyView = new StickerEmptyView(context, flickerLoadingView, StickerEmptyView.STICKER_TYPE_SEARCH); + emptyView.addView(flickerLoadingView, 0, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, 0, 0, 2, 0, 0)); + emptyView.title.setText(LocaleController.getString("NoResult", R.string.NoResult)); + emptyView.subtitle.setText(LocaleController.getString("SearchEmptyViewFilteredSubtitle2", R.string.SearchEmptyViewFilteredSubtitle2)); + emptyView.setVisibility(View.GONE); + emptyView.setAnimateLayoutChange(true); + emptyView.showProgress(true, false); + emptyView.setColors(keyNameText, keyLastSeenText, keyInviteMembersBackground, keySearchBackground); + containerView.addView(emptyView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.LEFT | Gravity.TOP, 0, 58 + 4, 0, 0)); + + listView = new RecyclerListView(context) { + @Override + protected boolean allowSelectChildAtPosition(float x, float y) { + return y >= scrollOffsetY + AndroidUtilities.dp(48) + (Build.VERSION.SDK_INT >= 21 ? AndroidUtilities.statusBarHeight : 0); + } + + @Override + public void setTranslationY(float translationY) { + super.setTranslationY(translationY); + int[] ii = new int[2]; + getLocationInWindow(ii); + } + + @Override + protected boolean emptyViewIsVisible() { + if (getAdapter() == null) { + return false; + } + return getAdapter().getItemCount() <= 2; + } + }; + listView.setTag(13); + listView.setPadding(0, 0, 0, AndroidUtilities.dp(48)); + listView.setClipToPadding(false); + listView.setHideIfEmpty(false); + listView.setSelectorDrawableColor(Theme.getColor(keyListSelector)); + layoutManager = new FillLastLinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false, AndroidUtilities.dp(8), listView); + layoutManager.setBind(false); + listView.setLayoutManager(layoutManager); + listView.setHorizontalScrollBarEnabled(false); + listView.setVerticalScrollBarEnabled(false); + containerView.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT, 0, 0, 0, 0)); + + listView.setOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrolled(RecyclerView recyclerView, int dx, int dy) { + updateLayout(); + } + + @Override + public void onScrollStateChanged(RecyclerView recyclerView, int newState) { + if (newState == RecyclerView.SCROLL_STATE_IDLE && needSnapToTop) { + if (scrollOffsetY + backgroundPaddingTop + AndroidUtilities.dp(13) < AndroidUtilities.statusBarHeight * 2 && listView.canScrollVertically(1)) { + RecyclerListView.Holder holder = (RecyclerListView.Holder) listView.findViewHolderForAdapterPosition(0); + if (holder != null && holder.itemView.getTop() > 0) { + listView.smoothScrollBy(0, holder.itemView.getTop()); + } + } + } + } + }); + + FrameLayout.LayoutParams frameLayoutParams = new FrameLayout.LayoutParams(LayoutHelper.MATCH_PARENT, AndroidUtilities.getShadowHeight(), Gravity.TOP | Gravity.LEFT); + frameLayoutParams.topMargin = AndroidUtilities.dp(58); + shadow = new View(context); + shadow.setBackgroundColor(Theme.getColor(Theme.key_dialogShadowLine)); + shadow.setAlpha(0.0f); + shadow.setTag(1); + containerView.addView(shadow, frameLayoutParams); + + containerView.addView(frameLayout, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 58, Gravity.LEFT | Gravity.TOP)); + + setColorProgress(0.0f); + + listView.setEmptyView(emptyView); + listView.setAnimateEmptyView(true, 0); + } + + protected ContainerView createContainerView(Context context) { + return new ContainerView(context); + } + + protected void updateColorKeys() { + + } + + @SuppressWarnings("FieldCanBeLocal") + private class SearchField extends FrameLayout { + + private final View searchBackground; + private final ImageView searchIconImageView; + private final ImageView clearSearchImageView; + private final CloseProgressDrawable2 progressDrawable; + private EditTextBoldCursor searchEditText; + + public SearchField(Context context) { + super(context); + + searchBackground = new View(context); + searchBackground.setBackgroundDrawable(Theme.createRoundRectDrawable(AndroidUtilities.dp(18), Theme.getColor(keySearchBackground))); + addView(searchBackground, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 36, Gravity.LEFT | Gravity.TOP, 14, 11, 14, 0)); + + searchIconImageView = new ImageView(context); + searchIconImageView.setScaleType(ImageView.ScaleType.CENTER); + searchIconImageView.setImageResource(R.drawable.smiles_inputsearch); + searchIconImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(keySearchPlaceholder), PorterDuff.Mode.MULTIPLY)); + addView(searchIconImageView, LayoutHelper.createFrame(36, 36, Gravity.LEFT | Gravity.TOP, 16, 11, 0, 0)); + + clearSearchImageView = new ImageView(context); + clearSearchImageView.setScaleType(ImageView.ScaleType.CENTER); + clearSearchImageView.setImageDrawable(progressDrawable = new CloseProgressDrawable2()); + progressDrawable.setSide(AndroidUtilities.dp(7)); + clearSearchImageView.setScaleX(0.1f); + clearSearchImageView.setScaleY(0.1f); + clearSearchImageView.setAlpha(0.0f); + clearSearchImageView.setColorFilter(new PorterDuffColorFilter(Theme.getColor(keySearchPlaceholder), PorterDuff.Mode.MULTIPLY)); + addView(clearSearchImageView, LayoutHelper.createFrame(36, 36, Gravity.RIGHT | Gravity.TOP, 14, 11, 14, 0)); + clearSearchImageView.setOnClickListener(v -> { + searchEditText.setText(""); + AndroidUtilities.showKeyboard(searchEditText); + }); + + searchEditText = new EditTextBoldCursor(context) { + @Override + public boolean dispatchTouchEvent(MotionEvent event) { + MotionEvent e = MotionEvent.obtain(event); + e.setLocation(e.getRawX(), e.getRawY() - containerView.getTranslationY()); + if (e.getAction() == MotionEvent.ACTION_UP) { + e.setAction(MotionEvent.ACTION_CANCEL); + } + listView.dispatchTouchEvent(e); + e.recycle(); + return super.dispatchTouchEvent(event); + } + }; + searchEditText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + searchEditText.setHintTextColor(Theme.getColor(keySearchPlaceholder)); + searchEditText.setTextColor(Theme.getColor(keySearchText)); + searchEditText.setBackgroundDrawable(null); + searchEditText.setPadding(0, 0, 0, 0); + searchEditText.setMaxLines(1); + searchEditText.setLines(1); + searchEditText.setSingleLine(true); + searchEditText.setImeOptions(EditorInfo.IME_ACTION_SEARCH | EditorInfo.IME_FLAG_NO_EXTRACT_UI); + searchEditText.setHint(LocaleController.getString("VoipGroupSearchMembers", R.string.VoipGroupSearchMembers)); + searchEditText.setCursorColor(Theme.getColor(keySearchText)); + searchEditText.setCursorSize(AndroidUtilities.dp(20)); + searchEditText.setCursorWidth(1.5f); + addView(searchEditText, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 40, Gravity.LEFT | Gravity.TOP, 16 + 38, 9, 16 + 30, 0)); + searchEditText.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + boolean show = searchEditText.length() > 0; + boolean showed = clearSearchImageView.getAlpha() != 0; + if (show != showed) { + clearSearchImageView.animate() + .alpha(show ? 1.0f : 0.0f) + .setDuration(150) + .scaleX(show ? 1.0f : 0.1f) + .scaleY(show ? 1.0f : 0.1f) + .start(); + } + String text = searchEditText.getText().toString(); + int oldItemsCount = listView.getAdapter() == null ? 0 : listView.getAdapter().getItemCount(); + search(text); + if (TextUtils.isEmpty(text) && listView != null && listView.getAdapter() != listViewAdapter) { + listView.setAnimateEmptyView(false, 0); + listView.setAdapter(listViewAdapter); + listView.setAnimateEmptyView(true, 0); + if (oldItemsCount == 0) { + showItemsAnimated(0); + } + } + flickerLoadingView.setVisibility(View.VISIBLE); + } + }); + searchEditText.setOnEditorActionListener((v, actionId, event) -> { + if (event != null && (event.getAction() == KeyEvent.ACTION_UP && event.getKeyCode() == KeyEvent.KEYCODE_SEARCH || event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) { + AndroidUtilities.hideKeyboard(searchEditText); + } + return false; + }); + } + + public void hideKeyboard() { + AndroidUtilities.hideKeyboard(searchEditText); + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + onSearchViewTouched(ev, searchEditText); + return super.onInterceptTouchEvent(ev); + } + } + + protected void onSearchViewTouched(MotionEvent ev, EditTextBoldCursor searchEditText) { + + } + + protected void search(String text) { + + } + + public static final Property COLOR_PROGRESS = new AnimationProperties.FloatProperty("colorProgress") { + @Override + public void setValue(UsersAlertBase object, float value) { + object.setColorProgress(value); + } + + @Override + public Float get(UsersAlertBase object) { + return object.getColorProgress(); + } + }; + + private float getColorProgress() { + return colorProgress; + } + + protected void setColorProgress(float progress) { + colorProgress = progress; + backgroundColor = AndroidUtilities.getOffsetColor(Theme.getColor(keyInviteMembersBackground), Theme.getColor(keyListViewBackground), progress, 1.0f); + shadowDrawable.setColorFilter(new PorterDuffColorFilter(backgroundColor, PorterDuff.Mode.MULTIPLY)); + frameLayout.setBackgroundColor(backgroundColor); + navBarColor = backgroundColor; + listView.setGlowColor(backgroundColor); + + int color = AndroidUtilities.getOffsetColor(Theme.getColor(keyLastSeenTextUnscrolled), Theme.getColor(keyLastSeenText), progress, 1.0f); + int color2 = AndroidUtilities.getOffsetColor(Theme.getColor(keySearchIconUnscrolled), Theme.getColor(keySearchIcon), progress, 1.0f);// + for (int a = 0, N = listView.getChildCount(); a < N; a++) { + View child = listView.getChildAt(a); + if (child instanceof GroupCallTextCell) { + GroupCallTextCell cell = (GroupCallTextCell) child; + cell.setColors(color, color); + } else if (child instanceof GroupCallUserCell) { + GroupCallUserCell cell = (GroupCallUserCell) child; + cell.setGrayIconColor(shadow.getTag() != null ? keySearchIcon : keySearchIconUnscrolled, color2); + } + } + containerView.invalidate(); + listView.invalidate(); + container.invalidate(); + } + + @Override + protected boolean canDismissWithSwipe() { + return false; + } + + @Override + public void dismiss() { + AndroidUtilities.hideKeyboard(searchView.searchEditText); + super.dismiss(); + } + + @SuppressLint("NewApi") + private void updateLayout() { + if (listView.getChildCount() <= 0) { + return; + } + + RecyclerView.ViewHolder holder = listView.findViewHolderForAdapterPosition(0); + int top; + if (holder != null) { + top = holder.itemView.getTop() - AndroidUtilities.dp(8); + } else { + top = 0; + } + int newOffset = top > 0 && holder != null && holder.getAdapterPosition() == 0 ? top : 0; + if (top >= 0 && holder != null && holder.getAdapterPosition() == 0) { + newOffset = top; + runShadowAnimation(false); + } else { + runShadowAnimation(true); + } + if (scrollOffsetY != newOffset) { + listView.setTopGlowOffset(scrollOffsetY = (int) (newOffset)); + frameLayout.setTranslationY(scrollOffsetY); + emptyView.setTranslationY(scrollOffsetY); + containerView.invalidate(); + } + } + + private void runShadowAnimation(final boolean show) { + if (show && shadow.getTag() != null || !show && shadow.getTag() == null) { + shadow.setTag(show ? null : 1); + if (show) { + shadow.setVisibility(View.VISIBLE); + } + if (shadowAnimation != null) { + shadowAnimation.cancel(); + } + shadowAnimation = new AnimatorSet(); + shadowAnimation.playTogether(ObjectAnimator.ofFloat(shadow, View.ALPHA, show ? 1.0f : 0.0f)); + shadowAnimation.setDuration(150); + shadowAnimation.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + if (shadowAnimation != null && shadowAnimation.equals(animation)) { + if (!show) { + shadow.setVisibility(View.INVISIBLE); + } + shadowAnimation = null; + } + } + + @Override + public void onAnimationCancel(Animator animation) { + if (shadowAnimation != null && shadowAnimation.equals(animation)) { + shadowAnimation = null; + } + } + }); + shadowAnimation.start(); + } + } + + protected void showItemsAnimated(int from) { + if (!isShowing()) { + return; + } + listView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + listView.getViewTreeObserver().removeOnPreDrawListener(this); + int n = listView.getChildCount(); + AnimatorSet animatorSet = new AnimatorSet(); + for (int i = 0; i < n; i++) { + View child = listView.getChildAt(i); + int position = listView.getChildAdapterPosition(child); + if (position < from) { + continue; + } + if (position == 1 && listView.getAdapter() == searchListViewAdapter && child instanceof GraySectionCell) { + child = ((GraySectionCell) child).getTextView(); + } + child.setAlpha(0); + int s = Math.min(listView.getMeasuredHeight(), Math.max(0, child.getTop())); + int delay = (int) ((s / (float) listView.getMeasuredHeight()) * 100); + ObjectAnimator a = ObjectAnimator.ofFloat(child, View.ALPHA, 0, 1f); + a.setStartDelay(delay); + a.setDuration(200); + animatorSet.playTogether(a); + } + animatorSet.start(); + return true; + } + }); + } + + protected class ContainerView extends FrameLayout { + + ValueAnimator valueAnimator; + float snapToTopOffset; + + public ContainerView(@NonNull Context context) { + super(context); + } + + private boolean ignoreLayout = false; + + @Override + public void setTranslationY(float translationY) { + super.setTranslationY(translationY); + invalidate(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int totalHeight = View.MeasureSpec.getSize(heightMeasureSpec); + + if (Build.VERSION.SDK_INT >= 21) { + ignoreLayout = true; + setPadding(backgroundPaddingLeft, AndroidUtilities.statusBarHeight, backgroundPaddingLeft, 0); + ignoreLayout = false; + } + int availableHeight = totalHeight - getPaddingTop(); + int padding; + if (keyboardVisible) { + padding = AndroidUtilities.dp(8); + setAllowNestedScroll(false); + if (scrollOffsetY != 0) { + snapToTopOffset = scrollOffsetY; + setTranslationY(snapToTopOffset); + if (valueAnimator != null) { + valueAnimator.removeAllListeners(); + valueAnimator.cancel(); + } + valueAnimator = ValueAnimator.ofFloat(snapToTopOffset, 0); + valueAnimator.addUpdateListener(valueAnimator -> { + snapToTopOffset = (float) valueAnimator.getAnimatedValue(); + setTranslationY(snapToTopOffset); + }); + valueAnimator.setDuration(AdjustPanLayoutHelper.keyboardDuration); + valueAnimator.setInterpolator(AdjustPanLayoutHelper.keyboardInterpolator); + valueAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + super.onAnimationEnd(animation); + snapToTopOffset = 0; + setTranslationY(0); + valueAnimator = null; + } + }); + valueAnimator.start(); + } else if (valueAnimator != null) { + setTranslationY(snapToTopOffset); + } + } else { + padding = availableHeight - (availableHeight / 5 * 3) + AndroidUtilities.dp(8); + setAllowNestedScroll(true); + } + if (listView.getPaddingTop() != padding) { + ignoreLayout = true; + listView.setPadding(0, padding, 0, 0); + ignoreLayout = false; + } + super.onMeasure(widthMeasureSpec, View.MeasureSpec.makeMeasureSpec(totalHeight, View.MeasureSpec.EXACTLY)); + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + updateLayout(); + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + if (ev.getAction() == MotionEvent.ACTION_DOWN && ev.getY() < scrollOffsetY) { + dismiss(); + return true; + } + return super.onInterceptTouchEvent(ev); + } + + @Override + public boolean onTouchEvent(MotionEvent e) { + return !isDismissed() && super.onTouchEvent(e); + } + + @Override + public void requestLayout() { + if (ignoreLayout) { + return; + } + super.requestLayout(); + } + + @Override + protected void onDraw(Canvas canvas) { + canvas.save(); + int y = scrollOffsetY - backgroundPaddingTop + AndroidUtilities.dp(6); + int top = scrollOffsetY - backgroundPaddingTop - AndroidUtilities.dp(13); + int height = getMeasuredHeight() + AndroidUtilities.dp(50) + backgroundPaddingTop; + int statusBarHeight = 0; + float radProgress = 1.0f; + if (Build.VERSION.SDK_INT >= 21) { + top += AndroidUtilities.statusBarHeight; + y += AndroidUtilities.statusBarHeight; + height -= AndroidUtilities.statusBarHeight; + + if (top + backgroundPaddingTop + getTranslationY() < AndroidUtilities.statusBarHeight * 2) { + int diff = (int) Math.min(AndroidUtilities.statusBarHeight, AndroidUtilities.statusBarHeight * 2 - top - backgroundPaddingTop - getTranslationY()); + top -= diff; + height += diff; + radProgress = 1.0f - Math.min(1.0f, (diff * 2) / (float) AndroidUtilities.statusBarHeight); + } + if (top + backgroundPaddingTop + getTranslationY() < AndroidUtilities.statusBarHeight) { + statusBarHeight = (int) Math.min(AndroidUtilities.statusBarHeight, AndroidUtilities.statusBarHeight - top - backgroundPaddingTop - getTranslationY()); + } + } + + shadowDrawable.setBounds(0, top, getMeasuredWidth(), height); + shadowDrawable.draw(canvas); + + if (radProgress != 1.0f) { + Theme.dialogs_onlineCirclePaint.setColor(backgroundColor); + rect.set(backgroundPaddingLeft, backgroundPaddingTop + top, getMeasuredWidth() - backgroundPaddingLeft, backgroundPaddingTop + top + AndroidUtilities.dp(24)); + canvas.drawRoundRect(rect, AndroidUtilities.dp(12) * radProgress, AndroidUtilities.dp(12) * radProgress, Theme.dialogs_onlineCirclePaint); + } + + int w = AndroidUtilities.dp(36); + rect.set((getMeasuredWidth() - w) / 2, y, (getMeasuredWidth() + w) / 2, y + AndroidUtilities.dp(4)); + Theme.dialogs_onlineCirclePaint.setColor(Theme.getColor(keyScrollUp)); + canvas.drawRoundRect(rect, AndroidUtilities.dp(2), AndroidUtilities.dp(2), Theme.dialogs_onlineCirclePaint); + + if (statusBarHeight > 0) { + int finalColor = Color.argb(0xff, (int) (Color.red(backgroundColor) * 0.8f), (int) (Color.green(backgroundColor) * 0.8f), (int) (Color.blue(backgroundColor) * 0.8f)); + Theme.dialogs_onlineCirclePaint.setColor(finalColor); + canvas.drawRect(backgroundPaddingLeft, AndroidUtilities.statusBarHeight - statusBarHeight - getTranslationY(), getMeasuredWidth() - backgroundPaddingLeft, AndroidUtilities.statusBarHeight - getTranslationY(), Theme.dialogs_onlineCirclePaint); + } + canvas.restore(); + } + + @Override + protected void dispatchDraw(Canvas canvas) { + canvas.save(); + canvas.clipRect(0, getPaddingTop(), getMeasuredWidth(), getMeasuredHeight()); + super.dispatchDraw(canvas); + canvas.restore(); + } + + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ViewPagerFixed.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ViewPagerFixed.java index 4c5c8d364bc..34cd52aa7a0 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ViewPagerFixed.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ViewPagerFixed.java @@ -26,6 +26,7 @@ import android.view.View; import android.view.ViewConfiguration; import android.view.ViewGroup; +import android.view.accessibility.AccessibilityNodeInfo; import android.view.animation.Interpolator; import android.widget.FrameLayout; import android.widget.TextView; @@ -759,6 +760,12 @@ protected void onDraw(Canvas canvas) { canvas.restore(); } } + + @Override + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(info); + info.setSelected(currentTab != null && selectedTabId != -1 && currentTab.id == selectedTabId); + } } private TextPaint textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); @@ -981,7 +988,7 @@ public boolean isAnimatingIndicator() { return animatingIndicator; } - private void scrollToTab(int id, int position) { + public void scrollToTab(int id, int position) { boolean scrollingForward = currentPosition < position; scrollingToChild = -1; previousPosition = currentPosition; @@ -993,7 +1000,6 @@ private void scrollToTab(int id, int position) { tabsAnimator.cancel(); } if (animatingIndicator) { - animatingIndicator = false; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/voip/AcceptDeclineView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/voip/AcceptDeclineView.java index 78297ee07a9..e6678e7d0c7 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/voip/AcceptDeclineView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/voip/AcceptDeclineView.java @@ -474,6 +474,17 @@ protected void getVirtualViewBoundsInParent(int virtualViewId, Rect outRect) { outRect.setEmpty(); } } + + @Override + protected void onVirtualViewClick(int virtualViewId) { + if (listener != null) { + if (virtualViewId == ACCEPT_VIEW_ID) { + listener.onAccept(); + } else if (virtualViewId == DECLINE_VIEW_ID) { + listener.onDicline(); + } + } + } }; } return accessibilityNodeProvider; @@ -535,6 +546,9 @@ public boolean performAction(int virtualViewId, int action, Bundle arguments) { } else { if (action == AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS) { sendAccessibilityEventForVirtualView(virtualViewId, AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED); + } else if (action == AccessibilityNodeInfo.ACTION_CLICK) { + onVirtualViewClick(virtualViewId); + return true; } } return false; @@ -580,5 +594,7 @@ private void sendAccessibilityEventForVirtualView(int virtualViewId, int eventTy protected abstract void getVirtualViewBoundsInScreen(int virtualViewId, Rect outRect); protected abstract void getVirtualViewBoundsInParent(int virtualViewId, Rect outRect); + + protected abstract void onVirtualViewClick(int virtualViewId); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/voip/VoIPToggleButton.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/voip/VoIPToggleButton.java index 214f738c234..9c68940ecad 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/voip/VoIPToggleButton.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/voip/VoIPToggleButton.java @@ -20,6 +20,7 @@ import android.widget.Button; import android.widget.FrameLayout; import android.widget.TextView; +import android.widget.ToggleButton; import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; @@ -63,6 +64,7 @@ public class VoIPToggleButton extends FrameLayout { private Paint bitmapPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private boolean checkableForAccessibility; private boolean checkable; private boolean checked; private float checkedProgress; @@ -361,6 +363,10 @@ public void jumpDrawablesToCurrentState() { } } + public void setCheckableForAccessibility(boolean checkableForAccessibility) { + this.checkableForAccessibility = checkableForAccessibility; + } + //animate background if true public void setCheckable(boolean checkable) { this.checkable = checkable; @@ -403,10 +409,12 @@ public boolean isChecked() { public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(info); info.setText(currentText); - info.setClassName(Button.class.getName()); - if (checkable) { + if (checkable || checkableForAccessibility) { + info.setClassName(ToggleButton.class.getName()); info.setCheckable(true); info.setChecked(checked); + } else { + info.setClassName(Button.class.getName()); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java index c3f067f11de..ba65cf6d863 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java @@ -33,6 +33,7 @@ import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.os.SystemClock; import android.provider.Settings; import android.text.Editable; import android.text.InputType; @@ -146,6 +147,7 @@ public class ContactsActivity extends BaseFragment implements NotificationCenter private boolean disableSections; private boolean checkPermission = true; + private long permissionRequestTime; private AnimatorSet bounceIconAnimator; private int animationIndex = -1; @@ -413,9 +415,6 @@ public void setPadding(int left, int top, int right, int bottom) { Object object = searchListViewAdapter.getItem(position); if (object instanceof TLRPC.User) { TLRPC.User user = (TLRPC.User) object; - if (user == null) { - return; - } if (searchListViewAdapter.isGlobalSearch(position)) { ArrayList users = new ArrayList<>(); users.add(user); @@ -603,7 +602,7 @@ public void onScrolled(RecyclerView recyclerView, int dx, int dy) { } else { goingDown = firstVisibleItem > prevPosition; } - if (changed && scrollUpdated && (goingDown || !goingDown && scrollingManually)) { + if (changed && scrollUpdated && (goingDown || scrollingManually)) { hideFloatingButton(goingDown); } prevPosition = firstVisibleItem; @@ -849,6 +848,7 @@ private void askForPermissons(boolean alert) { showDialog(builder.create()); return; } + permissionRequestTime = SystemClock.elapsedRealtime(); ArrayList permissons = new ArrayList<>(); permissons.add(Manifest.permission.READ_CONTACTS); permissons.add(Manifest.permission.WRITE_CONTACTS); @@ -873,7 +873,18 @@ public void onRequestPermissionsResultFragment(int requestCode, String[] permiss ContactsController.getInstance(currentAccount).forceImportContacts(); } else { MessagesController.getGlobalNotificationsSettings().edit().putBoolean("askAboutContacts", askAboutContacts = false).commit(); + if (SystemClock.elapsedRealtime() - permissionRequestTime < 200) { + try { + Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + Uri uri = Uri.fromParts("package", ApplicationLoader.applicationContext.getPackageName(), null); + intent.setData(uri); + getParentActivity().startActivity(intent); + } catch (Exception e) { + FileLog.e(e); + } + } } + break; } } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/DataSettingsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/DataSettingsActivity.java index fbe5090d77a..b3c0066e410 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/DataSettingsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/DataSettingsActivity.java @@ -660,7 +660,7 @@ public boolean isEnabled(RecyclerView.ViewHolder holder) { @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = null; + View view; switch (viewType) { case 0: view = new ShadowSectionCell(mContext); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java index 179c079452c..fe917192364 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java @@ -39,14 +39,6 @@ import android.os.Build; import android.os.Bundle; import android.os.Vibrator; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.ItemTouchHelper; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.LinearSmoothScrollerCustom; -import androidx.recyclerview.widget.RecyclerView; -import androidx.viewpager.widget.ViewPager; - import android.text.TextUtils; import android.util.Property; import android.util.StateSet; @@ -72,7 +64,13 @@ import android.widget.ScrollView; import android.widget.TextView; +import androidx.annotation.NonNull; import androidx.core.graphics.ColorUtils; +import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.LinearSmoothScrollerCustom; +import androidx.recyclerview.widget.RecyclerView; +import androidx.viewpager.widget.ViewPager; import org.telegram.messenger.AccountInstance; import org.telegram.messenger.AndroidUtilities; @@ -130,6 +128,7 @@ import org.telegram.ui.Cells.ProfileSearchCell; import org.telegram.ui.Cells.ShadowSectionCell; import org.telegram.ui.Cells.TextCell; +import org.telegram.ui.Cells.TextInfoPrivacyCell; import org.telegram.ui.Cells.UserCell; import org.telegram.ui.Components.AlertsCreator; import org.telegram.ui.Components.AnimatedArrowDrawable; @@ -146,6 +145,7 @@ import org.telegram.ui.Components.EditTextBoldCursor; import org.telegram.ui.Components.FilterTabsView; import org.telegram.ui.Components.FiltersListBottomSheet; +import org.telegram.ui.Components.FlickerLoadingView; import org.telegram.ui.Components.FragmentContextView; import org.telegram.ui.Components.JoinGroupAlert; import org.telegram.ui.Components.LayoutHelper; @@ -155,7 +155,6 @@ import org.telegram.ui.Components.PullForegroundDrawable; import org.telegram.ui.Components.RLottieDrawable; import org.telegram.ui.Components.RLottieImageView; -import org.telegram.ui.Components.RadialProgressView; import org.telegram.ui.Components.RecyclerAnimationScrollHelper; import org.telegram.ui.Components.RecyclerListView; import org.telegram.ui.Components.SearchViewPager; @@ -170,6 +169,21 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. private boolean canShowFilterTabsView; private boolean filterTabsViewIsVisible; + private int initialSearchType = -1; + + public void setShowSearch(String query, int i) { + if (!searching) { + initialSearchType = i; + actionBar.openSearchField(query, false); + } else { + if (!searchItem.getSearchField().getText().toString().equals(query)) { + searchItem.getSearchField().setText(query); + } + if (searchViewPager.getTabsView().getCurrentTabId() != i) { + searchViewPager.getTabsView().scrollToTab(i, i); + } + } + } private class ViewPage extends FrameLayout { private DialogsRecyclerView listView; @@ -182,7 +196,7 @@ private class ViewPage extends FrameLayout { private RecyclerAnimationScrollHelper scrollHelper; private int dialogsType; private int archivePullViewState; - private RadialProgressView progressView; + private FlickerLoadingView progressView; private int lastItemsCount; private DialogsItemAnimator dialogsItemAnimator; @@ -211,6 +225,8 @@ public boolean isDefaultDialogType() { private UndoView[] undoView = new UndoView[2]; private FilterTabsView filterTabsView; private boolean askingForPermissions; + private RLottieDrawable passcodeDrawable; + private RLottieDrawable passcodeDrawable2; private SearchViewPager searchViewPager; @@ -275,7 +291,7 @@ public boolean isDefaultDialogType() { private FragmentContextView fragmentLocationContextView; private FragmentContextView fragmentContextView; - private static ArrayList frozenDialogsList; + private ArrayList frozenDialogsList; private boolean dialogsListFrozen; private int dialogRemoveFinished; private int dialogInsertFinished; @@ -292,6 +308,7 @@ public boolean isDefaultDialogType() { private int prevTop; private boolean scrollUpdated; private boolean floatingHidden; + private boolean floatingForceVisible; private final AccelerateDecelerateInterpolator floatingInterpolator = new AccelerateDecelerateInterpolator(); private boolean checkPermission = true; @@ -372,6 +389,7 @@ public boolean isDefaultDialogType() { private boolean searchIsShowed; private boolean searchWasFullyShowed; private boolean whiteActionBar; + private boolean searchFiltersWasShowed; private float progressToActionMode; private ValueAnimator actionBarColorAnimator; @@ -488,14 +506,14 @@ public int getActionBarFullHeight() { @Override protected boolean drawChild(Canvas canvas, View child, long drawingTime) { - if (child == fragmentContextView && fragmentContextView.getCurrentStyle() == 3) { + if (child == fragmentContextView && fragmentContextView.isCallStyle()) { return true; } if (child == blurredView) { return true; } boolean result; - if (child == viewPages[0] || (viewPages.length > 1 && child == viewPages[1]) || child == fragmentContextView || child == fragmentLocationContextView) { + if (child == viewPages[0] || (viewPages.length > 1 && child == viewPages[1]) || child == fragmentContextView || child == fragmentLocationContextView || child == searchViewPager) { canvas.save(); canvas.clipRect(0, -getY() + actionBar.getY() + getActionBarFullHeight(), getMeasuredWidth(), getMeasuredHeight()); result = super.drawChild(canvas, child, drawingTime); @@ -598,7 +616,7 @@ protected void dispatchDraw(Canvas canvas) { windowBackgroundPaint.setAlpha((int) (windowBackgroundPaint.getAlpha() * searchAnimationProgress)); canvas.drawRect(0, top + actionBarHeight, getMeasuredWidth(), top + actionBar.getMeasuredHeight() + searchTabsView.getMeasuredHeight(), windowBackgroundPaint); } - if (fragmentContextView != null && fragmentContextView.getCurrentStyle() == 3) { + if (fragmentContextView != null && fragmentContextView.isCallStyle()) { canvas.save(); canvas.translate(fragmentContextView.getX(), fragmentContextView.getY()); fragmentContextView.setDrawOverlay(true); @@ -1170,6 +1188,7 @@ protected void onMeasure(int widthSpec, int heightSpec) { } setTopGlowOffset(t); setPadding(0, t, 0, 0); + parentPage.progressView.setPaddingTop(t); ignoreLayout = false; } @@ -1554,7 +1573,7 @@ public long getAnimationDuration(RecyclerView recyclerView, int animationType, f @Override public float getSwipeThreshold(RecyclerView.ViewHolder viewHolder) { - return 0.3f; + return 0.45f; } @Override @@ -1758,8 +1777,11 @@ public View createView(final Context context) { proxyDrawable = new ProxyDrawable(context); proxyItem = menu.addItem(2, proxyDrawable); proxyItem.setContentDescription(LocaleController.getString("ProxySettings", R.string.ProxySettings)); - passcodeItem = menu.addItem(1, R.drawable.lock_close); - updatePasscodeButton(); + + passcodeDrawable = new RLottieDrawable(R.raw.passcode_lock_open, "passcode_lock_open", AndroidUtilities.dp(28), AndroidUtilities.dp(28), true, null); + passcodeDrawable2 = new RLottieDrawable(R.raw.passcode_lock_close, "passcode_lock_close", AndroidUtilities.dp(28), AndroidUtilities.dp(28), true, null); + passcodeItem = menu.addItem(1, passcodeDrawable); + updatePasscodeButton(false); updateProxyButton(false); } searchItem = menu.addItem(0, R.drawable.ic_ab_search).setIsSearchField(true, true).setActionBarMenuItemSearchListener(new ActionBarMenuItem.ActionBarMenuItemSearchListener() { @@ -1784,7 +1806,7 @@ public void onSearchExpand() { } } setScrollY(0); - updatePasscodeButton(); + updatePasscodeButton(false); actionBar.setBackButtonContentDescription(LocaleController.getString("AccDescrGoBack", R.string.AccDescrGoBack)); } @@ -1818,7 +1840,7 @@ public void onSearchCollapse() { } showSearch(false, true); } - updatePasscodeButton(); + updatePasscodeButton(false); if (menuDrawable != null) { if (actionBar.getBackButton().getDrawable() != menuDrawable) { actionBar.setBackButtonDrawable(menuDrawable); @@ -1831,9 +1853,9 @@ public void onSearchCollapse() { @Override public void onTextChanged(EditText editText) { String text = editText.getText().toString(); - if (text.length() != 0 || searchViewPager.dialogsSearchAdapter != null && searchViewPager.dialogsSearchAdapter.hasRecentSearch()) { + if (text.length() != 0 || (searchViewPager.dialogsSearchAdapter != null && searchViewPager.dialogsSearchAdapter.hasRecentSearch()) || searchFiltersWasShowed) { searchWas = true; - if (viewPages[0].listView.getVisibility() == View.VISIBLE) { + if (!searchIsShowed) { showSearch(true, true); } } @@ -1863,6 +1885,8 @@ public boolean canToggleSearch() { actionBar.setBackButtonImage(R.drawable.ic_ab_back); if (initialDialogsType == 3 && selectAlertString == null) { actionBar.setTitle(LocaleController.getString("ForwardTo", R.string.ForwardTo)); + } else if (initialDialogsType == 10) { + actionBar.setTitle(LocaleController.getString("SelectChats", R.string.SelectChats)); } else { actionBar.setTitle(LocaleController.getString("SelectChat", R.string.SelectChat)); } @@ -1893,7 +1917,9 @@ public boolean canToggleSearch() { actionBar.setClipContent(true); } actionBar.setTitleActionRunnable(() -> { - hideFloatingButton(false); + if (initialDialogsType != 10) { + hideFloatingButton(false); + } scrollToTop(); }); @@ -2295,7 +2321,13 @@ public void setTranslationX(float translationX) { viewPage.dialogsType = initialDialogsType; viewPages[a] = viewPage; + viewPage.progressView = new FlickerLoadingView(context); + viewPage.progressView.setViewType(FlickerLoadingView.DIALOG_CELL_TYPE); + viewPage.progressView.setVisibility(View.GONE); + viewPage.addView(viewPage.progressView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); + viewPage.listView = new DialogsRecyclerView(context, viewPage); + viewPage.listView.setAnimateEmptyView(true, 0); viewPage.listView.setClipToPadding(false); viewPage.listView.setPivotY(0); viewPage.dialogsItemAnimator = new DialogsItemAnimator() { @@ -2501,7 +2533,47 @@ public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerVi viewPage.listView.setLayoutManager(viewPage.layoutManager); viewPage.listView.setVerticalScrollbarPosition(LocaleController.isRTL ? RecyclerListView.SCROLLBAR_POSITION_LEFT : RecyclerListView.SCROLLBAR_POSITION_RIGHT); viewPage.addView(viewPage.listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); - viewPage.listView.setOnItemClickListener((view, position) -> onItemClick(view, position, viewPage.dialogsAdapter)); + viewPage.listView.setOnItemClickListener((view, position) -> { + if (initialDialogsType == 10) { + onItemLongClick(view, position, 0, 0, viewPage.dialogsType, viewPage.dialogsAdapter); + return; + } else if ((initialDialogsType == 11 || initialDialogsType == 13) && position == 1) { + Bundle args = new Bundle(); + args.putBoolean("forImport", true); + ArrayList result = new ArrayList<>(); + result.add(getUserConfig().getClientUserId()); + args.putIntegerArrayList("result", result); + args.putInt("chatType", ChatObject.CHAT_TYPE_MEGAGROUP); + String title = arguments.getString("importTitle"); + if (title != null) { + args.putString("title", title); + } + GroupCreateFinalActivity activity = new GroupCreateFinalActivity(args); + activity.setDelegate(new GroupCreateFinalActivity.GroupCreateFinalActivityDelegate() { + @Override + public void didStartChatCreation() { + + } + + @Override + public void didFinishChatCreation(GroupCreateFinalActivity fragment, int chatId) { + ArrayList arrayList = new ArrayList<>(); + arrayList.add((long) -chatId); + DialogsActivityDelegate dialogsActivityDelegate = delegate; + removeSelfFromStack(); + dialogsActivityDelegate.didSelectDialogs(DialogsActivity.this, arrayList, null, true); + } + + @Override + public void didFailChatCreation() { + + } + }); + presentFragment(activity); + return; + } + onItemClick(view, position, viewPage.dialogsAdapter); + }); viewPage.listView.setOnItemLongClickListener(new RecyclerListView.OnItemLongClickListenerExtended() { @Override public boolean onItemClick(View view, int position, float x, float y) { @@ -2567,7 +2639,7 @@ public void onScrollStateChanged(RecyclerView recyclerView, int newState) { public void onScrolled(RecyclerView recyclerView, int dx, int dy) { viewPage.dialogsItemAnimator.onListScroll(-dy); checkListLoad(viewPage); - if (wasManualScroll && floatingButtonContainer.getVisibility() != View.GONE && recyclerView.getChildCount() > 0) { + if (initialDialogsType != 10 && wasManualScroll && floatingButtonContainer.getVisibility() != View.GONE && recyclerView.getChildCount() > 0) { int firstVisibleItem = viewPage.layoutManager.findFirstVisibleItemPosition(); if (firstVisibleItem != RecyclerView.NO_POSITION) { RecyclerView.ViewHolder holder = recyclerView.findViewHolderForAdapterPosition(firstVisibleItem); @@ -2585,7 +2657,7 @@ public void onScrolled(RecyclerView recyclerView, int dx, int dy) { } else { goingDown = firstVisibleItem > prevPosition; } - if (changed && scrollUpdated && (goingDown || !goingDown && scrollingManually)) { + if (changed && scrollUpdated && (goingDown || scrollingManually)) { hideFloatingButton(goingDown); } prevPosition = firstVisibleItem; @@ -2626,11 +2698,6 @@ public void onScrolled(RecyclerView recyclerView, int dx, int dy) { } }); - viewPage.progressView = new RadialProgressView(context); - viewPage.progressView.setPivotY(0); - viewPage.progressView.setVisibility(View.GONE); - viewPage.addView(viewPage.progressView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); - viewPage.archivePullViewState = SharedConfig.archiveHidden ? ARCHIVE_ITEM_STATE_HIDDEN : ARCHIVE_ITEM_STATE_PINNED; if (viewPage.pullForegroundDrawable == null && folderId == 0) { viewPage.pullForegroundDrawable = new PullForegroundDrawable(LocaleController.getString("AccSwipeForArchive", R.string.AccSwipeForArchive), LocaleController.getString("AccReleaseForArchive", R.string.AccReleaseForArchive)) { @@ -2647,7 +2714,7 @@ protected float getViewOffset() { viewPage.pullForegroundDrawable.setWillDraw(viewPage.archivePullViewState != ARCHIVE_ITEM_STATE_PINNED); } - viewPage.dialogsAdapter = new DialogsAdapter(context, viewPage.dialogsType, folderId, onlySelect, selectedDialogs, currentAccount) { + viewPage.dialogsAdapter = new DialogsAdapter(this, context, viewPage.dialogsType, folderId, onlySelect, selectedDialogs, currentAccount) { @Override public void notifyDataSetChanged() { viewPage.lastItemsCount = getItemCount(); @@ -2658,6 +2725,7 @@ public void notifyDataSetChanged() { } } }; + viewPage.dialogsAdapter.setForceShowEmptyCell(afterSignup); if (AndroidUtilities.isTablet() && openedDialogId != 0) { viewPage.dialogsAdapter.setOpenedDialogId(openedDialogId); } @@ -2807,7 +2875,13 @@ public void runResultsEnterAnimation() { } }); - searchViewPager.searchListView.setOnItemClickListener((view, position) -> onItemClick(view, position, searchViewPager.dialogsSearchAdapter)); + searchViewPager.searchListView.setOnItemClickListener((view, position) -> { + if (initialDialogsType == 10) { + onItemLongClick(view, position, 0, 0, -1, searchViewPager.dialogsSearchAdapter); + return; + } + onItemClick(view, position, searchViewPager.dialogsSearchAdapter); + }); searchViewPager.searchListView.setOnItemLongClickListener(new RecyclerListView.OnItemLongClickListenerExtended() { @Override public boolean onItemClick(View view, int position, float x, float y) { @@ -2837,15 +2911,21 @@ public void onMove(float dx, float dy) { filtersView.setVisibility(View.GONE); floatingButtonContainer = new FrameLayout(context); - floatingButtonContainer.setVisibility(onlySelect || folderId != 0 ? View.GONE : View.VISIBLE); + floatingButtonContainer.setVisibility(onlySelect && initialDialogsType != 10 || folderId != 0 ? View.GONE : View.VISIBLE); contentView.addView(floatingButtonContainer, LayoutHelper.createFrame((Build.VERSION.SDK_INT >= 21 ? 56 : 60) + 20, (Build.VERSION.SDK_INT >= 21 ? 56 : 60) + 20, (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.BOTTOM, LocaleController.isRTL ? 4 : 0, 0, LocaleController.isRTL ? 0 : 4, 0)); floatingButtonContainer.setOnClickListener(v -> { - Bundle args = new Bundle(); - args.putBoolean("destroyAfterSelect", true); - presentFragment(new ContactsActivity(args)); + if (initialDialogsType == 10) { + if (delegate == null || selectedDialogs.isEmpty()) { + return; + } + delegate.didSelectDialogs(DialogsActivity.this, selectedDialogs, null, false); + } else { + Bundle args = new Bundle(); + args.putBoolean("destroyAfterSelect", true); + presentFragment(new ContactsActivity(args)); + } }); - floatingButton = new RLottieImageView(context); floatingButton.setScaleType(ImageView.ScaleType.CENTER); Drawable drawable = Theme.createSimpleSelectorCircleDrawable(AndroidUtilities.dp(56), Theme.getColor(Theme.key_chats_actionBackground), Theme.getColor(Theme.key_chats_actionPressedBackground)); @@ -2858,7 +2938,13 @@ public void onMove(float dx, float dy) { } floatingButton.setBackgroundDrawable(drawable); floatingButton.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_chats_actionIcon), PorterDuff.Mode.MULTIPLY)); - floatingButton.setAnimation(R.raw.write_contacts_fab_icon, 52, 52); + if (initialDialogsType == 10) { + floatingButton.setImageResource(R.drawable.floating_check); + floatingButtonContainer.setContentDescription(LocaleController.getString("Done", R.string.Done)); + } else { + floatingButton.setAnimation(R.raw.write_contacts_fab_icon, 52, 52); + floatingButtonContainer.setContentDescription(LocaleController.getString("NewMessageTitle", R.string.NewMessageTitle)); + } if (Build.VERSION.SDK_INT >= 21) { StateListAnimator animator = new StateListAnimator(); animator.addState(new int[]{android.R.attr.state_pressed}, ObjectAnimator.ofFloat(floatingButton, View.TRANSLATION_Z, AndroidUtilities.dp(2), AndroidUtilities.dp(4)).setDuration(200)); @@ -2872,7 +2958,6 @@ public void getOutline(View view, Outline outline) { } }); } - floatingButtonContainer.setContentDescription(LocaleController.getString("NewMessageTitle", R.string.NewMessageTitle)); floatingButtonContainer.addView(floatingButton, LayoutHelper.createFrame((Build.VERSION.SDK_INT >= 21 ? 56 : 60), (Build.VERSION.SDK_INT >= 21 ? 56 : 60), Gravity.LEFT | Gravity.TOP, 10, 6, 10, 0)); searchTabsView = null; @@ -2882,7 +2967,12 @@ public void getOutline(View view, Outline outline) { fragmentLocationContextView.setLayoutParams(LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 38, Gravity.TOP | Gravity.LEFT, 0, -36, 0, 0)); contentView.addView(fragmentLocationContextView); - fragmentContextView = new FragmentContextView(context, this, false); + fragmentContextView = new FragmentContextView(context, this, false) { + @Override + protected void playbackSpeedChanged(boolean enabled) { + getUndoView().showWithAction(0, enabled ? UndoView.ACTION_PLAYBACK_SPEED_ENABLED : UndoView.ACTION_PLAYBACK_SPEED_DISABLED, null); + } + }; fragmentContextView.setLayoutParams(LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 38, Gravity.TOP | Gravity.LEFT, 0, -36, 0, 0)); contentView.addView(fragmentContextView); @@ -2908,10 +2998,7 @@ public boolean dispatchTouchEvent(MotionEvent ev) { commentView.setDelegate(new ChatActivityEnterView.ChatActivityEnterViewDelegate() { @Override public void onMessageSend(CharSequence message, boolean notify, int scheduleDate) { - if (delegate == null) { - return; - } - if (selectedDialogs.isEmpty()) { + if (delegate == null || selectedDialogs.isEmpty()) { return; } delegate.didSelectDialogs(DialogsActivity.this, selectedDialogs, message, false); @@ -3101,6 +3188,7 @@ public void setAlpha(float alpha) { } } + searchIsShowed = false; updateFilterTabs(false, false); if (searchString != null) { @@ -3272,7 +3360,7 @@ public void onItemClick(int id) { } else if (id == 1) { SharedConfig.appLocked = !SharedConfig.appLocked; SharedConfig.saveConfig(); - updatePasscodeButton(); + updatePasscodeButton(true); } else if (id == 2) { presentFragment(new ProxyListActivity()); } else if (id >= 10 && id < 10 + UserConfig.MAX_ACCOUNT_COUNT) { @@ -3491,7 +3579,7 @@ private void updateFilterTabs(boolean force, boolean animated) { if (viewPages[a].dialogsType == 0 && viewPages[a].archivePullViewState == ARCHIVE_ITEM_STATE_HIDDEN && hasHiddenArchive()) { int p = viewPages[a].layoutManager.findFirstVisibleItemPosition(); if (p == 0 || p == 1) { - viewPages[a].layoutManager.scrollToPositionWithOffset(p, 0); + viewPages[a].layoutManager.scrollToPositionWithOffset(1, 0); } } viewPages[a].listView.setScrollingTouchSlop(RecyclerView.TOUCH_SLOP_DEFAULT); @@ -3809,10 +3897,17 @@ private void showSearch(boolean show, boolean animated) { } searchIsShowed = show; if (show) { - int dialogsCount = getMessagesController().getTotalDialogsCount(); - boolean onlyDialogsAdapter = onlySelect || !searchViewPager.dialogsSearchAdapter.hasRecentSearch() || dialogsCount <= 10; + boolean onlyDialogsAdapter; + if (searchFiltersWasShowed) { + onlyDialogsAdapter = false; + } else { + onlyDialogsAdapter = onlyDialogsAdapter(); + } searchViewPager.showOnlyDialogsAdapter(onlyDialogsAdapter); whiteActionBar = !onlyDialogsAdapter; + if (whiteActionBar) { + searchFiltersWasShowed = true; + } ContentView contentView = (ContentView) fragmentView; if (searchTabsView == null && !onlyDialogsAdapter) { searchTabsView = searchViewPager.createTabsView(); @@ -4010,6 +4105,17 @@ public void onAnimationCancel(Animator animation) { setSearchAnimationProgress(show ? 1f : 0); fragmentView.invalidate(); } + if (initialSearchType >= 0) { + searchViewPager.setPosition(initialSearchType); + } + if (!show) { + initialSearchType = -1; + } + } + + public boolean onlyDialogsAdapter() { + int dialogsCount = getMessagesController().getTotalDialogsCount(); + return onlySelect || !searchViewPager.dialogsSearchAdapter.hasRecentSearch() || dialogsCount <= 10; } private void updateFilterTabsVisibility(boolean animated) { @@ -4121,7 +4227,16 @@ private void checkListLoad(ViewPage viewPage) { return; } int firstVisibleItem = viewPage.layoutManager.findFirstVisibleItemPosition(); + int lastVisibleItem = viewPage.layoutManager.findLastVisibleItemPosition(); int visibleItemCount = Math.abs(viewPage.layoutManager.findLastVisibleItemPosition() - firstVisibleItem) + 1; + if (lastVisibleItem != RecyclerView.NO_POSITION) { + RecyclerView.ViewHolder holder = viewPage.listView.findViewHolderForAdapterPosition(lastVisibleItem); + if (floatingForceVisible = holder != null && holder.getItemViewType() == 11) { + hideFloatingButton(false); + } + } else { + floatingForceVisible = false; + } boolean loadArchived = false; boolean loadArchivedFromCache = false; boolean load = false; @@ -4131,7 +4246,7 @@ private void checkListLoad(ViewPage viewPage) { if (viewPage.selectedType >= 0 && viewPage.selectedType < dialogFilters.size()) { MessagesController.DialogFilter filter = getMessagesController().dialogFilters.get(viewPage.selectedType); if ((filter.flags & MessagesController.DIALOG_FILTER_FLAG_EXCLUDE_ARCHIVED) == 0) { - if (visibleItemCount > 0 && viewPage.layoutManager.findLastVisibleItemPosition() >= getDialogsArray(currentAccount, viewPage.dialogsType, 1, dialogsListFrozen).size() - 10 || + if (visibleItemCount > 0 && lastVisibleItem >= getDialogsArray(currentAccount, viewPage.dialogsType, 1, dialogsListFrozen).size() - 10 || visibleItemCount == 0 && !getMessagesController().isDialogsEndReached(1)) { loadArchivedFromCache = !getMessagesController().isDialogsEndReached(1); if (loadArchivedFromCache || !getMessagesController().isServerDialogsEndReached(1)) { @@ -4141,7 +4256,7 @@ private void checkListLoad(ViewPage viewPage) { } } } - if (visibleItemCount > 0 && viewPage.layoutManager.findLastVisibleItemPosition() >= getDialogsArray(currentAccount, viewPage.dialogsType, folderId, dialogsListFrozen).size() - 10 || + if (visibleItemCount > 0 && lastVisibleItem >= getDialogsArray(currentAccount, viewPage.dialogsType, folderId, dialogsListFrozen).size() - 10 || visibleItemCount == 0 && (viewPage.dialogsType == 7 || viewPage.dialogsType == 8) && !getMessagesController().isDialogsEndReached(folderId)) { loadFromCache = !getMessagesController().isDialogsEndReached(folderId); if (loadFromCache || !getMessagesController().isServerDialogsEndReached(folderId)) { @@ -4290,7 +4405,7 @@ private void onItemClick(View view, int position, RecyclerListView.Adapter adapt if (lower_part != 0) { if (lower_part > 0) { args.putInt("user_id", lower_part); - } else if (lower_part < 0) { + } else { if (message_id != 0) { TLRPC.Chat chat = getMessagesController().getChat(-lower_part); if (chat != null && chat.migrated_to != null) { @@ -4334,7 +4449,11 @@ private void onItemClick(View view, int position, RecyclerListView.Adapter adapt } } else { if (getMessagesController().checkCanOpenChat(args, DialogsActivity.this)) { - presentFragment(new ChatActivity(args)); + ChatActivity chatActivity = new ChatActivity(args); + if (adapter instanceof DialogsAdapter && lower_part > 0 && getMessagesController().dialogs_dict.get(dialogId) == null) { + chatActivity.setPreloadedSticker(((DialogsAdapter) adapter).getPreloadedSticker(), true); + } + presentFragment(chatActivity); } } } @@ -4399,7 +4518,7 @@ private boolean onItemLongClick(View view, int position, float x, float y, int d } final TLRPC.Dialog dialog = dialogs.get(position); if (onlySelect) { - if (initialDialogsType != 3) { + if (initialDialogsType != 3 && initialDialogsType != 10) { return false; } if (!validateSlowModeDialog(dialog.id)) { @@ -4409,6 +4528,7 @@ private boolean onItemLongClick(View view, int position, float x, float y, int d updateSelectedCount(); } else { if (dialog instanceof TLRPC.TL_dialogFolder) { + view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); BottomSheet.Builder builder = new BottomSheet.Builder(getParentActivity()); final boolean hasUnread = getMessagesStorage().getArchiveUnreadCount() != 0; @@ -4927,7 +5047,7 @@ private void perfromSelectedDialogsAction(int action, boolean alert) { builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); showDialog(builder.create()); } else { - AlertsCreator.createClearOrDeleteDialogAlert(DialogsActivity.this, action == clear, chat, user, lower_id == 0, (param) -> { + AlertsCreator.createClearOrDeleteDialogAlert(DialogsActivity.this, action == clear, chat, user, lower_id == 0, action == delete, (param) -> { hideActionMode(false); if (action == clear && ChatObject.isChannel(chat) && (!chat.megagroup || !TextUtils.isEmpty(chat.username))) { getMessagesController().deleteDialog(selectedDialog, 2, param); @@ -4944,7 +5064,7 @@ private void perfromSelectedDialogsAction(int action, boolean alert) { getMessagesController().deleteDialog(selectedDialog, 0, param); } else { TLRPC.User currentUser = getMessagesController().getUser(getUserConfig().getClientUserId()); - getMessagesController().deleteUserFromChat((int) -selectedDialog, currentUser, null); + getMessagesController().deleteUserFromChat((int) -selectedDialog, currentUser, null, param, false); } } else { getMessagesController().deleteDialog(selectedDialog, 0, param); @@ -5022,7 +5142,9 @@ private void perfromSelectedDialogsAction(int action, boolean alert) { } } if (scrollToTop) { - hideFloatingButton(false); + if (initialDialogsType != 10) { + hideFloatingButton(false); + } scrollToTop(); } hideActionMode(action != pin2 && action != pin && action != delete); @@ -5448,51 +5570,52 @@ public void onAnimationEnd(Animator animation) { } private void updateSelectedCount() { - if (commentView == null) { - return; - } - if (selectedDialogs.isEmpty()) { - if (initialDialogsType == 3 && selectAlertString == null) { - actionBar.setTitle(LocaleController.getString("ForwardTo", R.string.ForwardTo)); + if (commentView != null) { + if (selectedDialogs.isEmpty()) { + if (initialDialogsType == 3 && selectAlertString == null) { + actionBar.setTitle(LocaleController.getString("ForwardTo", R.string.ForwardTo)); + } else { + actionBar.setTitle(LocaleController.getString("SelectChat", R.string.SelectChat)); + } + if (commentView.getTag() != null) { + commentView.hidePopup(false); + commentView.closeKeyboard(); + AnimatorSet animatorSet = new AnimatorSet(); + animatorSet.playTogether(ObjectAnimator.ofFloat(commentView, View.TRANSLATION_Y, 0, commentView.getMeasuredHeight())); + animatorSet.setDuration(180); + animatorSet.setInterpolator(new DecelerateInterpolator()); + animatorSet.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + commentView.setVisibility(View.GONE); + } + }); + animatorSet.start(); + commentView.setTag(null); + fragmentView.requestLayout(); + } } else { - actionBar.setTitle(LocaleController.getString("SelectChat", R.string.SelectChat)); - } - if (commentView.getTag() != null) { - commentView.hidePopup(false); - commentView.closeKeyboard(); - AnimatorSet animatorSet = new AnimatorSet(); - animatorSet.playTogether(ObjectAnimator.ofFloat(commentView, View.TRANSLATION_Y, 0, commentView.getMeasuredHeight())); - animatorSet.setDuration(180); - animatorSet.setInterpolator(new DecelerateInterpolator()); - animatorSet.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - commentView.setVisibility(View.GONE); - } - }); - animatorSet.start(); - commentView.setTag(null); - fragmentView.requestLayout(); - } - } else { - if (commentView.getTag() == null) { - commentView.setFieldText(""); - commentView.setVisibility(View.VISIBLE); - AnimatorSet animatorSet = new AnimatorSet(); - animatorSet.playTogether(ObjectAnimator.ofFloat(commentView, View.TRANSLATION_Y, commentView.getMeasuredHeight(), 0)); - animatorSet.setDuration(180); - animatorSet.setInterpolator(new DecelerateInterpolator()); - animatorSet.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - commentView.setTag(2); - commentView.requestLayout(); - } - }); - animatorSet.start(); - commentView.setTag(1); + if (commentView.getTag() == null) { + commentView.setFieldText(""); + commentView.setVisibility(View.VISIBLE); + AnimatorSet animatorSet = new AnimatorSet(); + animatorSet.playTogether(ObjectAnimator.ofFloat(commentView, View.TRANSLATION_Y, commentView.getMeasuredHeight(), 0)); + animatorSet.setDuration(180); + animatorSet.setInterpolator(new DecelerateInterpolator()); + animatorSet.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + commentView.setTag(2); + commentView.requestLayout(); + } + }); + animatorSet.start(); + commentView.setTag(1); + } + actionBar.setTitle(LocaleController.formatPluralString("Recipient", selectedDialogs.size())); } - actionBar.setTitle(LocaleController.formatPluralString("Recipient", selectedDialogs.size())); + } else if (initialDialogsType == 10) { + hideFloatingButton(selectedDialogs.isEmpty()); } } @@ -5600,14 +5723,33 @@ public void didReceivedNotification(int id, int account, Object... args) { if (viewPages == null || dialogsListFrozen) { return; } + + MessagesController messagesController = AccountInstance.getInstance(currentAccount).getMessagesController(); + ArrayList dialogs = messagesController.getDialogs(folderId); + for (int a = 0; a < viewPages.length; a++) { if (viewPages[a].getVisibility() != View.VISIBLE) { continue; } + int oldItemCount = viewPages[a].dialogsAdapter.getCurrentCount(); + + if (viewPages[a].dialogsType == 0 && hasHiddenArchive() && viewPages[a].listView.getChildCount() == 0) { + LinearLayoutManager layoutManager = (LinearLayoutManager) viewPages[a].listView.getLayoutManager(); + layoutManager.scrollToPositionWithOffset(1, 0); + } + if (viewPages[a].dialogsAdapter.isDataSetChanged() || args.length > 0) { viewPages[a].dialogsAdapter.notifyDataSetChanged(); + int newItemCount = viewPages[a].dialogsAdapter.getItemCount(); + if (newItemCount > oldItemCount && initialDialogsType != 11 && initialDialogsType != 12 && initialDialogsType != 13) { + showItemsAnimated(viewPages[a].listView, oldItemCount); + } } else { updateVisibleRows(MessagesController.UPDATE_MASK_NEW_MESSAGE); + int newItemCount = viewPages[a].dialogsAdapter.getItemCount(); + if (newItemCount > oldItemCount && initialDialogsType != 11 && initialDialogsType != 12 && initialDialogsType != 13) { + showItemsAnimated(viewPages[a].listView, oldItemCount); + } } try { viewPages[a].listView.setEmptyView(folderId == 0 ? viewPages[a].progressView : null); @@ -5657,7 +5799,7 @@ public void didReceivedNotification(int id, int account, Object... args) { } boolean updateVisibleRows = false; for (int a = 0; a < viewPages.length; a++) { - if (viewPages[a].isDefaultDialogType() && getMessagesController().getDialogs(folderId).isEmpty()) { + if (viewPages[a].isDefaultDialogType() && getMessagesController().getDialogs(folderId).size() <= 10) { viewPages[a].dialogsAdapter.notifyDataSetChanged(); } else { updateVisibleRows = true; @@ -5690,7 +5832,7 @@ public void didReceivedNotification(int id, int account, Object... args) { } else if (id == NotificationCenter.messageReceivedByAck || id == NotificationCenter.messageReceivedByServer || id == NotificationCenter.messageSendError) { updateVisibleRows(MessagesController.UPDATE_MASK_SEND_STATE); } else if (id == NotificationCenter.didSetPasscode) { - updatePasscodeButton(); + updatePasscodeButton(true); } else if (id == NotificationCenter.needReloadRecentDialogsSearch) { if (searchViewPager != null && searchViewPager.dialogsSearchAdapter != null) { searchViewPager.dialogsSearchAdapter.loadRecentSearch(); @@ -5720,7 +5862,7 @@ public void didReceivedNotification(int id, int account, Object... args) { if (ChatObject.isNotInChat(chat)) { getMessagesController().deleteDialog(dialogId, 0, revoke); } else { - getMessagesController().deleteUserFromChat((int) -dialogId, getMessagesController().getUser(getUserConfig().getClientUserId()), null, false, revoke); + getMessagesController().deleteUserFromChat((int) -dialogId, getMessagesController().getUser(getUserConfig().getClientUserId()), null, revoke, revoke); } } else { getMessagesController().deleteDialog(dialogId, 0, revoke); @@ -5759,6 +5901,64 @@ public void didReceivedNotification(int id, int account, Object... args) { } } + private void showItemsAnimated(RecyclerListView listView, int from) { + int n = listView.getChildCount(); + View progressView = null; + for (int i = 0; i < n; i++) { + View child = listView.getChildAt(i); + if (child instanceof FlickerLoadingView) { + progressView = child; + } + } + final View finalProgressView = progressView; + if (progressView != null) { + listView.removeView(progressView); + from--; + } + int finalFrom = from; + listView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + listView.getViewTreeObserver().removeOnPreDrawListener(this); + int n = listView.getChildCount(); + AnimatorSet animatorSet = new AnimatorSet(); + for (int i = 0; i < n; i++) { + View child = listView.getChildAt(i); + if (child != finalProgressView && listView.getChildAdapterPosition(child) >= finalFrom - 1) { + child.setAlpha(0); + int s = Math.min(listView.getMeasuredHeight(), Math.max(0, child.getTop())); + int delay = (int) ((s / (float) listView.getMeasuredHeight()) * 100); + ObjectAnimator a = ObjectAnimator.ofFloat(child, View.ALPHA, 0, 1f); + a.setStartDelay(delay); + a.setDuration(200); + animatorSet.playTogether(a); + } + } + + if (finalProgressView != null && finalProgressView.getParent() == null) { + listView.addView(finalProgressView); + RecyclerView.LayoutManager layoutManager = listView.getLayoutManager(); + if (layoutManager != null) { + layoutManager.ignoreView(finalProgressView); + Animator animator = ObjectAnimator.ofFloat(finalProgressView, View.ALPHA, finalProgressView.getAlpha(), 0); + animator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + finalProgressView.setAlpha(1f); + layoutManager.stopIgnoringView(finalProgressView); + listView.removeView(finalProgressView); + } + }); + animator.start(); + } + } + + animatorSet.start(); + return true; + } + }); + } + private String showingSuggestion; private void showNextSupportedSuggestion() { if (showingSuggestion != null) { @@ -5825,24 +6025,25 @@ private void setDialogsListFrozen(boolean frozen) { } } - public static ArrayList getDialogsArray(int currentAccount, int dialogsType, int folderId, boolean frozen) { + @NonNull + public ArrayList getDialogsArray(int currentAccount, int dialogsType, int folderId, boolean frozen) { if (frozen && frozenDialogsList != null) { return frozenDialogsList; } MessagesController messagesController = AccountInstance.getInstance(currentAccount).getMessagesController(); if (dialogsType == 0) { return messagesController.getDialogs(folderId); - } else if (dialogsType == 1) { + } else if (dialogsType == 1 || dialogsType == 10 || dialogsType == 13) { return messagesController.dialogsServerOnly; } else if (dialogsType == 2) { return messagesController.dialogsCanAddUsers; } else if (dialogsType == 3) { return messagesController.dialogsForward; - } else if (dialogsType == 4) { + } else if (dialogsType == 4 || dialogsType == 12) { return messagesController.dialogsUsersOnly; } else if (dialogsType == 5) { return messagesController.dialogsChannelsOnly; - } else if (dialogsType == 6) { + } else if (dialogsType == 6 || dialogsType == 11) { return messagesController.dialogsGroupsOnly; } else if (dialogsType == 7 || dialogsType == 8) { MessagesController.DialogFilter dialogFilter = messagesController.selectedDialogFilter[dialogsType == 7 ? 0 : 1]; @@ -5854,7 +6055,7 @@ public static ArrayList getDialogsArray(int currentAccount, int di } else if (dialogsType == 9) { return messagesController.dialogsForBlock; } - return null; + return new ArrayList<>(); } public void setSideMenu(RecyclerView recyclerView) { @@ -5863,21 +6064,36 @@ public void setSideMenu(RecyclerView recyclerView) { sideMenu.setGlowColor(Theme.getColor(Theme.key_chats_menuBackground)); } - private void updatePasscodeButton() { + private void updatePasscodeButton(boolean animated) { if (passcodeItem == null) { return; } + if (isPaused) { + animated = false; + } if (SharedConfig.passcodeHash.length() != 0 && !searching) { if (doneItem == null || doneItem.getVisibility() != View.VISIBLE) { passcodeItem.setVisibility(View.VISIBLE); } passcodeItemVisible = true; if (SharedConfig.appLocked) { - passcodeItem.setIcon(R.drawable.lock_close); passcodeItem.setContentDescription(LocaleController.getString("AccDescrPasscodeUnlock", R.string.AccDescrPasscodeUnlock)); + passcodeItem.setIcon(passcodeDrawable2); + if (animated) { + passcodeDrawable2.setCurrentFrame(0, false); + passcodeItem.getIconView().playAnimation(); + } else { + passcodeDrawable2.setCurrentFrame(38, false); + } } else { - passcodeItem.setIcon(R.drawable.lock_open); passcodeItem.setContentDescription(LocaleController.getString("AccDescrPasscodeLock", R.string.AccDescrPasscodeLock)); + passcodeItem.setIcon(passcodeDrawable); + if (animated) { + passcodeDrawable.setCurrentFrame(0, false); + passcodeItem.getIconView().playAnimation(); + } else { + passcodeDrawable.setCurrentFrame(31, false); + } } } else { passcodeItem.setVisibility(View.GONE); @@ -5886,7 +6102,7 @@ private void updatePasscodeButton() { } private void hideFloatingButton(boolean hide) { - if (floatingHidden == hide) { + if (floatingHidden == hide || hide && floatingForceVisible) { return; } floatingHidden = hide; @@ -6014,6 +6230,10 @@ public boolean isMainDialogList() { return delegate == null && searchString == null; } + public void setInitialSearchType(int type) { + this.initialSearchType = type; + } + private void didSelectResult(final long dialog_id, boolean useAlert, final boolean param) { if (addToGroupAlertString == null && checkCanWrite) { int lowerId = (int) dialog_id; @@ -6040,7 +6260,30 @@ private void didSelectResult(final long dialog_id, boolean useAlert, final boole return; } } - if (useAlert && (selectAlertString != null && selectAlertStringGroup != null || addToGroupAlertString != null)) { + if (initialDialogsType == 11 || initialDialogsType == 12 || initialDialogsType == 13) { + int lower_part = (int) dialog_id; + TLRPC.User user = null; + TLRPC.Chat chat = null; + if (lower_part > 0) { + user = getMessagesController().getUser(lower_part); + if (!user.mutual_contact) { + getUndoView().showWithAction(dialog_id, UndoView.ACTION_IMPORT_NOT_MUTUAL, null); + return; + } + } else { + chat = getMessagesController().getChat(-lower_part); + if (!ChatObject.hasAdminRights(chat) || !ChatObject.canChangeChatInfo(chat)) { + getUndoView().showWithAction(dialog_id, UndoView.ACTION_IMPORT_GROUP_NOT_ADMIN, null); + return; + } + } + AlertsCreator.createImportDialogAlert(this, arguments.getString("importTitle"), user, chat, () -> { + setDialogsListFrozen(true); + ArrayList dids = new ArrayList<>(); + dids.add(dialog_id); + delegate.didSelectDialogs(DialogsActivity.this, dids, null, param); + }); + } else if (useAlert && (selectAlertString != null && selectAlertStringGroup != null || addToGroupAlertString != null)) { if (getParentActivity() == null) { return; } @@ -6311,7 +6554,7 @@ public ArrayList getThemeDescriptions() { arrayList.add(new ThemeDescription(list, 0, new Class[]{DialogCell.class}, Theme.dialogs_countTextPaint, null, null, Theme.key_chats_unreadCounterText)); arrayList.add(new ThemeDescription(list, 0, new Class[]{DialogCell.class, ProfileSearchCell.class}, null, new Drawable[]{Theme.dialogs_lockDrawable}, null, Theme.key_chats_secretIcon)); arrayList.add(new ThemeDescription(list, 0, new Class[]{DialogCell.class, ProfileSearchCell.class}, null, new Drawable[]{Theme.dialogs_groupDrawable, Theme.dialogs_broadcastDrawable, Theme.dialogs_botDrawable}, null, Theme.key_chats_nameIcon)); - arrayList.add(new ThemeDescription(list, 0, new Class[]{DialogCell.class, ProfileSearchCell.class}, null, new Drawable[]{Theme.dialogs_scamDrawable}, null, Theme.key_chats_draft)); + arrayList.add(new ThemeDescription(list, 0, new Class[]{DialogCell.class, ProfileSearchCell.class}, null, new Drawable[]{Theme.dialogs_scamDrawable, Theme.dialogs_fakeDrawable}, null, Theme.key_chats_draft)); arrayList.add(new ThemeDescription(list, 0, new Class[]{DialogCell.class}, null, new Drawable[]{Theme.dialogs_pinnedDrawable, Theme.dialogs_reorderDrawable}, null, Theme.key_chats_pinnedIcon)); arrayList.add(new ThemeDescription(list, 0, new Class[]{DialogCell.class, ProfileSearchCell.class}, null, new Paint[]{Theme.dialogs_namePaint[0], Theme.dialogs_namePaint[1], Theme.dialogs_searchNamePaint}, null, null, Theme.key_chats_name)); arrayList.add(new ThemeDescription(list, 0, new Class[]{DialogCell.class, ProfileSearchCell.class}, null, new Paint[]{Theme.dialogs_nameEncryptedPaint[0], Theme.dialogs_nameEncryptedPaint[1], Theme.dialogs_searchNameEncryptedPaint}, null, null, Theme.key_chats_secretName)); @@ -6352,6 +6595,11 @@ public ArrayList getThemeDescriptions() { arrayList.add(new ThemeDescription(list, ThemeDescription.FLAG_TEXTCOLOR, new Class[]{HashtagSearchCell.class}, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); arrayList.add(new ThemeDescription(list, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{ShadowSectionCell.class}, null, null, null, Theme.key_windowBackgroundGrayShadow)); arrayList.add(new ThemeDescription(list, ThemeDescription.FLAG_BACKGROUNDFILTER | ThemeDescription.FLAG_CELLBACKGROUNDCOLOR, new Class[]{ShadowSectionCell.class}, null, null, null, Theme.key_windowBackgroundGray)); + + arrayList.add(new ThemeDescription(list, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{TextInfoPrivacyCell.class}, null, null, null, Theme.key_windowBackgroundGrayShadow)); + arrayList.add(new ThemeDescription(list, ThemeDescription.FLAG_BACKGROUNDFILTER | ThemeDescription.FLAG_CELLBACKGROUNDCOLOR, new Class[]{TextInfoPrivacyCell.class}, null, null, null, Theme.key_windowBackgroundGray)); + arrayList.add(new ThemeDescription(list, 0, new Class[]{TextInfoPrivacyCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText4)); + arrayList.add(new ThemeDescription(list, ThemeDescription.FLAG_TEXTCOLOR, new Class[]{TextCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlueText2)); } @@ -6421,6 +6669,9 @@ public ArrayList getThemeDescriptions() { arrayList.add(new ThemeDescription(viewPages[a].listView, 0, new Class[]{UserCell.class}, new String[]{"statusColor"}, null, null, cellDelegate, Theme.key_windowBackgroundWhiteGrayText)); arrayList.add(new ThemeDescription(viewPages[a].listView, 0, new Class[]{UserCell.class}, new String[]{"statusOnlineColor"}, null, null, cellDelegate, Theme.key_windowBackgroundWhiteBlueText)); + arrayList.add(new ThemeDescription(viewPages[a].listView, 0, new Class[]{TextCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlueText4)); + arrayList.add(new ThemeDescription(viewPages[a].listView, 0, new Class[]{TextCell.class}, new String[]{"imageView"}, null, null, null, Theme.key_windowBackgroundWhiteBlueText4)); + arrayList.add(new ThemeDescription(viewPages[a].progressView, ThemeDescription.FLAG_PROGRESSBAR, null, null, null, null, Theme.key_progressCircle)); ViewPager pager = viewPages[a].dialogsAdapter.getArchiveHintCellPager(); @@ -6601,7 +6852,6 @@ public ArrayList getThemeDescriptions() { arrayList.add(new ThemeDescription(null, 0, null, null, null, null, Theme.key_voipgroup_overlayAlertMutedByAdmin)); arrayList.add(new ThemeDescription(null, 0, null, null, null, null, Theme.key_voipgroup_overlayAlertMutedByAdmin2)); - if (filtersView != null) { arrayList.addAll(filtersView.getThemeDescriptions()); filtersView.updateColors(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ExternalActionActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ExternalActionActivity.java index 76aa4aecd3c..4402c340132 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ExternalActionActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ExternalActionActivity.java @@ -56,9 +56,9 @@ public class ExternalActionActivity extends Activity implements ActionBarLayout. private static ArrayList layerFragmentsStack = new ArrayList<>(); private PasscodeView passcodeView; - private ActionBarLayout actionBarLayout; - private ActionBarLayout layersActionBarLayout; - private View backgroundTablet; + protected ActionBarLayout actionBarLayout; + protected ActionBarLayout layersActionBarLayout; + protected View backgroundTablet; protected DrawerLayoutContainer drawerLayoutContainer; private Intent passcodeSaveIntent; @@ -233,7 +233,7 @@ public void onFinishLogin() { } } - private boolean handleIntent(final Intent intent, final boolean isNew, final boolean restore, final boolean fromPassword, final int intentAccount, int state) { + protected boolean checkPasscode(final Intent intent, final boolean isNew, final boolean restore, final boolean fromPassword, final int intentAccount, int state) { if (!fromPassword && (AndroidUtilities.needShowPasscode(true) || SharedConfig.isWaitingForPasscodeEnter)) { showPasscodeActivity(); passcodeSaveIntent = intent; @@ -244,6 +244,13 @@ private boolean handleIntent(final Intent intent, final boolean isNew, final boo UserConfig.getInstance(intentAccount).saveConfig(false); return false; } + return true; + } + + protected boolean handleIntent(final Intent intent, final boolean isNew, final boolean restore, final boolean fromPassword, final int intentAccount, int state) { + if (!checkPasscode(intent, isNew, restore, fromPassword, intentAccount, state)) { + return false; + } if ("org.telegram.passport.AUTHORIZE".equals(intent.getAction())) { if (state == 0) { int activatedAccountsCount = UserConfig.getActivatedAccountsCount(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/FeedWidgetConfigActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/FeedWidgetConfigActivity.java new file mode 100644 index 00000000000..49dc7fde1d0 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/FeedWidgetConfigActivity.java @@ -0,0 +1,72 @@ +package org.telegram.ui; + +import android.app.Activity; +import android.appwidget.AppWidgetManager; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.view.View; + +import org.telegram.messenger.AccountInstance; +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.FeedWidgetProvider; + +public class FeedWidgetConfigActivity extends ExternalActionActivity { + + private int creatingAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; + + @Override + protected boolean handleIntent(Intent intent, boolean isNew, boolean restore, boolean fromPassword, int intentAccount, int state) { + if (!checkPasscode(intent, isNew, restore, fromPassword, intentAccount, state)) { + return false; + } + Bundle extras = intent.getExtras(); + if (extras != null) { + creatingAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); + } + if (creatingAppWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) { + Bundle args = new Bundle(); + args.putBoolean("onlySelect", true); + args.putInt("dialogsType", 5); + args.putBoolean("allowSwitchAccount", true); + args.putBoolean("checkCanWrite", false); + DialogsActivity fragment = new DialogsActivity(args); + fragment.setDelegate((fragment1, dids, message, param) -> { + AccountInstance.getInstance(fragment1.getCurrentAccount()).getMessagesStorage().putWidgetDialogs(creatingAppWidgetId, dids); + + SharedPreferences preferences = FeedWidgetConfigActivity.this.getSharedPreferences("feed_widget", Activity.MODE_PRIVATE); + preferences.edit().putInt("account" + creatingAppWidgetId, fragment1.getCurrentAccount()).commit(); + preferences.edit().putLong("dialogId" + creatingAppWidgetId, dids.get(0)).commit(); + + AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(FeedWidgetConfigActivity.this); + FeedWidgetProvider.updateWidget(FeedWidgetConfigActivity.this, appWidgetManager, creatingAppWidgetId); + + Intent resultValue = new Intent(); + resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, creatingAppWidgetId); + setResult(RESULT_OK, resultValue); + finish(); + }); + + if (AndroidUtilities.isTablet()) { + if (layersActionBarLayout.fragmentsStack.isEmpty()) { + layersActionBarLayout.addFragmentToStack(fragment); + } + } else { + if (actionBarLayout.fragmentsStack.isEmpty()) { + actionBarLayout.addFragmentToStack(fragment); + } + } + if (!AndroidUtilities.isTablet()) { + backgroundTablet.setVisibility(View.GONE); + } + actionBarLayout.showLastFragment(); + if (AndroidUtilities.isTablet()) { + layersActionBarLayout.showLastFragment(); + } + intent.setAction(null); + } else { + finish(); + } + return true; + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/FilteredSearchView.java b/TMessagesProj/src/main/java/org/telegram/ui/FilteredSearchView.java index b38e7082e0d..143a943a939 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/FilteredSearchView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/FilteredSearchView.java @@ -1025,10 +1025,10 @@ private void onItemClick(int index, View view, MessageObject message, int a) { } else if (!cell.isLoading()) { MessageObject messageObject = cell.getMessage(); AccountInstance.getInstance(UserConfig.selectedAccount).getFileLoader().loadFile(document, messageObject, 0, 0); - cell.updateFileExistIcon(); + cell.updateFileExistIcon(true); } else { AccountInstance.getInstance(UserConfig.selectedAccount).getFileLoader().cancelLoadFile(document); - cell.updateFileExistIcon(); + cell.updateFileExistIcon(true); } } } else if (currentSearchFilter.filterType == FiltersView.FILTER_TYPE_LINKS) { @@ -1518,7 +1518,7 @@ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int View view; switch (viewType) { case 0: - view = new DialogCell(parent.getContext(), true, false); + view = new DialogCell(null, parent.getContext(), true, false); break; case 3: FlickerLoadingView flickerLoadingView = new FlickerLoadingView(parent.getContext()); @@ -1738,7 +1738,7 @@ public ArrayList getThemeDescriptions() { arrayList.add(new ThemeDescription(recyclerListView, 0, new Class[]{DialogCell.class}, Theme.dialogs_countTextPaint, null, null, Theme.key_chats_unreadCounterText)); arrayList.add(new ThemeDescription(recyclerListView, 0, new Class[]{DialogCell.class, ProfileSearchCell.class}, null, new Drawable[]{Theme.dialogs_lockDrawable}, null, Theme.key_chats_secretIcon)); arrayList.add(new ThemeDescription(recyclerListView, 0, new Class[]{DialogCell.class, ProfileSearchCell.class}, null, new Drawable[]{Theme.dialogs_groupDrawable, Theme.dialogs_broadcastDrawable, Theme.dialogs_botDrawable}, null, Theme.key_chats_nameIcon)); - arrayList.add(new ThemeDescription(recyclerListView, 0, new Class[]{DialogCell.class, ProfileSearchCell.class}, null, new Drawable[]{Theme.dialogs_scamDrawable}, null, Theme.key_chats_draft)); + arrayList.add(new ThemeDescription(recyclerListView, 0, new Class[]{DialogCell.class, ProfileSearchCell.class}, null, new Drawable[]{Theme.dialogs_scamDrawable, Theme.dialogs_fakeDrawable}, null, Theme.key_chats_draft)); arrayList.add(new ThemeDescription(recyclerListView, 0, new Class[]{DialogCell.class}, null, new Drawable[]{Theme.dialogs_pinnedDrawable, Theme.dialogs_reorderDrawable}, null, Theme.key_chats_pinnedIcon)); arrayList.add(new ThemeDescription(recyclerListView, 0, new Class[]{DialogCell.class, ProfileSearchCell.class}, null, new Paint[]{Theme.dialogs_namePaint[0], Theme.dialogs_namePaint[1], Theme.dialogs_searchNamePaint}, null, null, Theme.key_chats_name)); arrayList.add(new ThemeDescription(recyclerListView, 0, new Class[]{DialogCell.class, ProfileSearchCell.class}, null, new Paint[]{Theme.dialogs_nameEncryptedPaint[0], Theme.dialogs_nameEncryptedPaint[1], Theme.dialogs_searchNameEncryptedPaint}, null, null, Theme.key_chats_secretName)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/GroupCallActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/GroupCallActivity.java index 47323d1886d..d3f5574ec80 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/GroupCallActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/GroupCallActivity.java @@ -10,9 +10,12 @@ import android.content.DialogInterface; import android.graphics.Canvas; import android.graphics.Color; +import android.graphics.ColorFilter; import android.graphics.LinearGradient; import android.graphics.Matrix; import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.PixelFormat; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.RadialGradient; @@ -33,6 +36,7 @@ import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; +import android.view.ViewConfiguration; import android.view.ViewGroup; import android.view.WindowManager; import android.view.accessibility.AccessibilityNodeInfo; @@ -101,6 +105,7 @@ import org.telegram.ui.Components.voip.VoIPToggleButton; import java.util.ArrayList; +import java.util.Locale; public class GroupCallActivity extends BottomSheet implements NotificationCenter.NotificationCenterDelegate, VoIPBaseService.StateListener { @@ -108,6 +113,7 @@ public class GroupCallActivity extends BottomSheet implements NotificationCenter private static final int admin_can_speak_item = 2; private static final int share_invite_link_item = 3; private static final int leave_item = 4; + private static final int start_record = 5; private static final int MUTE_BUTTON_STATE_UNMUTE = 0; private static final int MUTE_BUTTON_STATE_MUTE = 1; @@ -176,10 +182,12 @@ public class GroupCallActivity extends BottomSheet implements NotificationCenter public TLRPC.Chat currentChat; public ChatObject.Call call; + private RecordCallDrawable recordCallDrawable; private TextView titleTextView; private ActionBarMenuItem otherItem; private ActionBarMenuItem pipItem; private ActionBarMenuSubItem inviteItem; + private ActionBarMenuSubItem recordItem; private ActionBarMenuSubItem everyoneItem; private ActionBarMenuSubItem adminItem; private ActionBarMenuSubItem leaveItem; @@ -237,6 +245,367 @@ public Float get(GroupCallActivity object) { } }; + private static class RecordCallDrawable extends Drawable { + + private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); + private Paint paint2 = new Paint(Paint.ANTI_ALIAS_FLAG); + + private long lastUpdateTime; + private float alpha = 1.0f; + private int state; + + private boolean recording; + private View parentView; + + public RecordCallDrawable() { + super(); + paint.setColor(0xffffffff); + paint.setStyle(Paint.Style.STROKE); + paint.setStrokeWidth(AndroidUtilities.dp(1.5f)); + } + + public void setParentView(View view) { + parentView = view; + } + + @Override + public int getIntrinsicWidth() { + return AndroidUtilities.dp(24); + } + + @Override + public int getIntrinsicHeight() { + return AndroidUtilities.dp(24); + } + + public boolean isRecording() { + return recording; + } + + public void setRecording(boolean value) { + recording = value; + alpha = 1.0f; + invalidateSelf(); + } + + @Override + public void draw(Canvas canvas) { + int cx = getBounds().centerX(); + int cy = getBounds().centerY(); + canvas.drawCircle(cx, cy, AndroidUtilities.dp(10), paint); + + paint2.setColor(recording ? 0xffEE7D79 : 0xffffffff); + paint2.setAlpha((int) (255 * alpha)); + canvas.drawCircle(cx, cy, AndroidUtilities.dp(5), paint2); + if (recording) { + long newTime = SystemClock.elapsedRealtime(); + long dt = newTime - lastUpdateTime; + if (dt > 17) { + dt = 17; + } + lastUpdateTime = newTime; + if (state == 0) { + alpha += dt / 500.0f; + if (alpha >= 1.0f) { + alpha = 1.0f; + state = 1; + } + } else if (state == 1) { + alpha -= dt / 500.0f; + if (alpha < 0.5f) { + alpha = 0.5f; + state = 0; + } + } + parentView.invalidate(); + } + } + + @Override + public void setAlpha(int alpha) { + + } + + @Override + public void setColorFilter(ColorFilter colorFilter) { + + } + + @Override + public int getOpacity() { + return PixelFormat.TRANSPARENT; + } + } + + private class VolumeSlider extends FrameLayout { + + private RLottieImageView imageView; + private TextView textView; + private TLRPC.TL_groupCallParticipant currentParticipant; + private RLottieDrawable speakerDrawable; + + private boolean captured; + private float sx, sy; + private int thumbX; + private double currentProgress; + private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); + private Paint paint2 = new Paint(Paint.ANTI_ALIAS_FLAG); + private Path path = new Path(); + private float[] radii = new float[8]; + private RectF rect = new RectF(); + private int currentColor; + private int oldColor; + private float colorChangeProgress; + private long lastUpdateTime; + private float[] volumeAlphas = new float[3]; + + public VolumeSlider(Context context, TLRPC.TL_groupCallParticipant participant) { + super(context); + setWillNotDraw(false); + currentParticipant = participant; + currentProgress = ChatObject.getParticipantVolume(participant) / 20000.0f; + colorChangeProgress = 1.0f; + + setPadding(AndroidUtilities.dp(12), 0, AndroidUtilities.dp(12), 0); + + speakerDrawable = new RLottieDrawable(R.raw.speaker, "" + R.raw.speaker, AndroidUtilities.dp(24), AndroidUtilities.dp(24), true, null); + + imageView = new RLottieImageView(context); + imageView.setScaleType(ImageView.ScaleType.CENTER); + imageView.setAnimation(speakerDrawable); + imageView.setTag(currentProgress == 0 ? 1 : null); + addView(imageView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, 40, Gravity.CENTER_VERTICAL | (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT), 0, 0, 0, 0)); + + speakerDrawable.setCustomEndFrame(currentProgress == 0 ? 17 : 34); + speakerDrawable.setCurrentFrame(speakerDrawable.getCustomEndFrame() - 1, false, true); + + textView = new TextView(context); + textView.setLines(1); + textView.setSingleLine(true); + textView.setGravity(Gravity.LEFT); + textView.setEllipsize(TextUtils.TruncateAt.END); + textView.setTextColor(Theme.getColor(Theme.key_voipgroup_actionBarItems)); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + double vol = ChatObject.getParticipantVolume(currentParticipant) / 100.0; + textView.setText(String.format(Locale.US, "%d%%", (int) (vol > 0 ? Math.max(vol, 1) : 0))); + textView.setPadding(LocaleController.isRTL ? 0 : AndroidUtilities.dp(43), 0, LocaleController.isRTL ? AndroidUtilities.dp(43) : 0, 0); + addView(textView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL)); + + paint2.setStyle(Paint.Style.STROKE); + paint2.setStrokeWidth(AndroidUtilities.dp(1.5f)); + paint2.setStrokeCap(Paint.Cap.ROUND); + paint2.setColor(0xffffffff); + + int percent = (int) (ChatObject.getParticipantVolume(currentParticipant) / 100.0); + for (int a = 0; a < volumeAlphas.length; a++) { + int p; + if (a == 0) { + p = 0; + } else if (a == 1) { + p = 50; + } else { + p = 150; + } + if (percent > p) { + volumeAlphas[a] = 1.0f; + } else { + volumeAlphas[a] = 0.0f; + } + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, View.MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(48), View.MeasureSpec.EXACTLY)); + thumbX = (int) (MeasureSpec.getSize(widthMeasureSpec) * currentProgress); + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + return onTouch(ev); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + return onTouch(event); + } + + boolean onTouch(MotionEvent ev) { + if (ev.getAction() == MotionEvent.ACTION_DOWN) { + sx = ev.getX(); + sy = ev.getY(); + return true; + } else if (ev.getAction() == MotionEvent.ACTION_UP || ev.getAction() == MotionEvent.ACTION_CANCEL) { + captured = false; + if (ev.getAction() == MotionEvent.ACTION_UP) { + final ViewConfiguration vc = ViewConfiguration.get(getContext()); + if (Math.abs(ev.getY() - sy) < vc.getScaledTouchSlop()) { + thumbX = (int) ev.getX(); + if (thumbX < 0) { + thumbX = 0; + } else if (thumbX > getMeasuredWidth()) { + thumbX = getMeasuredWidth(); + } + pressed = true; + } + } + if (pressed) { + if (ev.getAction() == MotionEvent.ACTION_UP) { + onSeekBarDrag(thumbX / (double) getMeasuredWidth(), true); + } + pressed = false; + invalidate(); + return true; + } + } else if (ev.getAction() == MotionEvent.ACTION_MOVE) { + if (!captured) { + final ViewConfiguration vc = ViewConfiguration.get(getContext()); + if (Math.abs(ev.getY() - sy) > vc.getScaledTouchSlop()) { + return false; + } + if (Math.abs(ev.getX() - sx) > vc.getScaledTouchSlop()) { + captured = true; + getParent().requestDisallowInterceptTouchEvent(true); + if (ev.getY() >= 0 && ev.getY() <= getMeasuredHeight()) { + thumbX = (int) ev.getX(); + if (thumbX < 0) { + thumbX = 0; + } else if (thumbX > getMeasuredWidth()) { + thumbX = getMeasuredWidth(); + } + pressed = true; + invalidate(); + return true; + } + } + } else { + if (pressed) { + thumbX = (int) ev.getX(); + if (thumbX < 0) { + thumbX = 0; + } else if (thumbX > getMeasuredWidth()) { + thumbX = getMeasuredWidth(); + } + onSeekBarDrag(thumbX / (double) getMeasuredWidth(), false); + invalidate(); + return true; + } + } + } + return false; + } + + private void onSeekBarDrag(double progress, boolean finalMove) { + if (VoIPService.getSharedInstance() == null) { + return; + } + currentProgress = progress; + currentParticipant.volume = (int) (progress * 20000); + currentParticipant.flags |= 128; + double vol = ChatObject.getParticipantVolume(currentParticipant) / 100.0; + textView.setText(String.format(Locale.US, "%d%%", (int) (vol > 0 ? Math.max(vol, 1) : 0))); + VoIPService.getSharedInstance().setParticipantVolume(currentParticipant.source, currentParticipant.volume); + if (finalMove) { + TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(currentParticipant.user_id); + if (currentParticipant.volume == 0) { + scrimPopupWindow.dismiss(); + scrimPopupWindow = null; + scrimPopupWindowItems = null; + processSelectedOption(currentParticipant, currentParticipant.user_id, ChatObject.canManageCalls(currentChat) ? 0 : 5); + } else { + VoIPService.getSharedInstance().editCallMember(user, false, currentParticipant.volume); + } + } + Integer newTag = currentProgress == 0 ? 1 : null; + if (imageView.getTag() == null && newTag != null || imageView.getTag() != null && newTag == null) { + speakerDrawable.setCustomEndFrame(currentProgress == 0 ? 17 : 34); + speakerDrawable.setCurrentFrame(currentProgress == 0 ? 0 : 17); + speakerDrawable.start(); + imageView.setTag(newTag); + } + } + + @Override + protected void onDraw(Canvas canvas) { + int prevColor = currentColor; + if (currentProgress < 0.25f) { + currentColor = 0xffCC5757; + } else if (currentProgress > 0.25f && currentProgress < 0.5f) { + currentColor = 0xffC9A53B; + } else if (currentProgress >= 0.5f && currentProgress <= 0.75f) { + currentColor = 0xff57BC6B; + } else { + currentColor = 0xff4DA6DF; + } + int color = AndroidUtilities.getOffsetColor(oldColor, prevColor, colorChangeProgress, 1.0f); + if (prevColor != 0 && prevColor != currentColor) { + colorChangeProgress = 0.0f; + oldColor = color; + } + paint.setColor(color); + long newTime = SystemClock.elapsedRealtime(); + long dt = newTime - lastUpdateTime; + if (dt > 17) { + dt = 17; + } + lastUpdateTime = newTime; + if (colorChangeProgress < 1.0f) { + colorChangeProgress += dt / 200.0f; + if (colorChangeProgress > 1.0f) { + colorChangeProgress = 1.0f; + } else { + invalidate(); + } + } + path.reset(); + radii[0] = radii[1] = radii[6] = radii[7] = AndroidUtilities.dp(6); + float rad = thumbX < AndroidUtilities.dp(12) ? Math.max(0, (thumbX - AndroidUtilities.dp(6)) / (float) AndroidUtilities.dp(6)) : 1.0f; + radii[2] = radii[3] = radii[4] = radii[5] = AndroidUtilities.dp(6) * rad; + rect.set(0, 0, thumbX, getMeasuredHeight()); + path.addRoundRect(rect, radii, Path.Direction.CW); + path.close(); + canvas.drawPath(path, paint); + + int percent = (int) (ChatObject.getParticipantVolume(currentParticipant) / 100.0); + int cx = imageView.getLeft() + imageView.getMeasuredWidth() / 2 + AndroidUtilities.dp(5); + int cy = imageView.getTop() + imageView.getMeasuredHeight() / 2; + for (int a = 0; a < volumeAlphas.length; a++) { + int p; + if (a == 0) { + p = 0; + rad = AndroidUtilities.dp(6); + } else if (a == 1) { + p = 50; + rad = AndroidUtilities.dp(10); + } else { + p = 150; + rad = AndroidUtilities.dp(14); + } + float offset = (AndroidUtilities.dp(2) * (1.0f - volumeAlphas[a])); + paint2.setAlpha((int) (255 * volumeAlphas[a])); + rect.set(cx - rad + offset, cy - rad + offset, cx + rad - offset, cy + rad - offset); + canvas.drawArc(rect, -50, 100, false, paint2); + if (percent > p) { + if (volumeAlphas[a] < 1.0f) { + volumeAlphas[a] += dt / 180.0f; + if (volumeAlphas[a] > 1.0f) { + volumeAlphas[a] = 1.0f; + } + invalidate(); + } + } else { + if (volumeAlphas[a] > 0.0f) { + volumeAlphas[a] -= dt / 180.0f; + if (volumeAlphas[a] < 0.0f) { + volumeAlphas[a] = 0.0f; + } + invalidate(); + } + } + } + } + } + private class WeavingState { private float targetX = -1f; private float targetY = -1f; @@ -363,6 +732,7 @@ public void dismiss() { accountInstance.getNotificationCenter().removeObserver(this, NotificationCenter.groupCallUpdated); accountInstance.getNotificationCenter().removeObserver(this, NotificationCenter.chatInfoDidLoad); accountInstance.getNotificationCenter().removeObserver(this, NotificationCenter.didLoadChatAdmins); + accountInstance.getNotificationCenter().removeObserver(this, NotificationCenter.applyGroupCallVisibleParticipants); NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.webRtcMicAmplitudeEvent); NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.didEndCall); super.dismiss(); @@ -451,6 +821,17 @@ public void didReceivedNotification(int id, int account, Object... args) { updateItems(); updateState(isShowing(), false); } + } else if (id == NotificationCenter.applyGroupCallVisibleParticipants) { + int count = listView.getChildCount(); + long time = (Long) args[0]; + for (int a = 0; a < count; a++) { + View child = listView.getChildAt(a); + RecyclerView.ViewHolder holder = listView.findContainingViewHolder(child); + if (holder != null && holder.itemView instanceof GroupCallUserCell) { + GroupCallUserCell cell = (GroupCallUserCell) holder.itemView; + cell.getParticipant().lastVisibleDate = time; + } + } } } @@ -461,7 +842,7 @@ private void applyCallParticipantUpdates() { for (int a = 0; a < count; a++) { View child = listView.getChildAt(a); RecyclerView.ViewHolder holder = listView.findContainingViewHolder(child); - if (holder != null) { + if (holder != null && holder.getAdapterPosition() != RecyclerView.NO_POSITION) { if (minChild == null || minPosition > holder.getAdapterPosition()) { minChild = child; minPosition = holder.getAdapterPosition(); @@ -477,7 +858,9 @@ private void applyCallParticipantUpdates() { FileLog.e(e); listAdapter.notifyDataSetChanged(); } + call.saveActiveDates(); if (minChild != null) { + FileLog.d("scroll to " + minPosition + " top = " + (minChild.getTop() - listView.getPaddingTop())); layoutManager.scrollToPositionWithOffset(minPosition, minChild.getTop() - listView.getPaddingTop()); } oldParticipants.clear(); @@ -492,7 +875,7 @@ private void applyCallParticipantUpdates() { if (holder != null) { if (child instanceof GroupCallUserCell) { ((GroupCallUserCell) child).setDrawDivider(holder.getAdapterPosition() != listAdapter.getItemCount() - 2); - } else if (child instanceof GroupCallInvitedCell) { + } else { ((GroupCallInvitedCell) child).setDrawDivider(holder.getAdapterPosition() != listAdapter.getItemCount() - 2); } } @@ -628,7 +1011,7 @@ public void setAlpha(int a) { int idx = array.indexOf(participant); if (idx >= 0) { RecyclerView.ViewHolder holder = listView.findViewHolderForAdapterPosition(idx + listAdapter.usersStartRow); - if (holder != null) { + if (holder != null && holder.itemView instanceof GroupCallUserCell) { GroupCallUserCell cell = (GroupCallUserCell) holder.itemView; cell.setAmplitude(levels[a] * 15.0f); if (holder.itemView == scrimView) { @@ -644,6 +1027,7 @@ public void setAlpha(int a) { accountInstance.getNotificationCenter().addObserver(this, NotificationCenter.needShowAlert); accountInstance.getNotificationCenter().addObserver(this, NotificationCenter.chatInfoDidLoad); accountInstance.getNotificationCenter().addObserver(this, NotificationCenter.didLoadChatAdmins); + accountInstance.getNotificationCenter().addObserver(this, NotificationCenter.applyGroupCallVisibleParticipants); NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.webRtcMicAmplitudeEvent); NotificationCenter.getGlobalInstance().addObserver(this, NotificationCenter.didEndCall); @@ -804,7 +1188,7 @@ protected void dispatchDraw(Canvas canvas) { for (int a = 0, N = getChildCount(); a < N; a++) { View child = getChildAt(a); ViewHolder holder = findContainingViewHolder(child); - if (holder.getItemViewType() == 3) { + if (holder == null || holder.getItemViewType() == 3) { continue; } maxBottom = Math.max(maxBottom, child.getY() + child.getMeasuredHeight()); @@ -876,10 +1260,7 @@ public void onScrollStateChanged(RecyclerView recyclerView, int newState) { if (cell.isSelfUser()) { return; } - Bundle args = new Bundle(); - args.putInt("user_id", cell.getParticipant().user_id); - parentActivity.presentFragment(new ProfileActivity(args)); - dismiss(); + showMenuForCell(cell); } else if (view instanceof GroupCallInvitedCell) { GroupCallInvitedCell cell = (GroupCallInvitedCell) view; if (cell.getUser() == null) { @@ -926,9 +1307,6 @@ public void needOpenSearch(MotionEvent ev, EditTextBoldCursor editText) { listView.setOnItemLongClickListener((view, position) -> { if (view instanceof GroupCallUserCell) { updateItems(); - if (!ChatObject.canManageCalls(currentChat)) { - return false; - } GroupCallUserCell cell = (GroupCallUserCell) view; return cell.clickMuteButton(); } @@ -1448,6 +1826,10 @@ public void onItemClick(int id) { button.setTextColor(Theme.getColor(Theme.key_voipgroup_leaveCallMenu)); } dialog.setTextColor(Theme.getColor(Theme.key_voipgroup_actionBarItems)); + } else if (id == start_record) { + recordCallDrawable.setRecording(!recordCallDrawable.isRecording()); + recordItem.setText(recordCallDrawable.isRecording() ? LocaleController.getString("VoipGroupStopRecordCall", R.string.VoipGroupStopRecordCall) : LocaleController.getString("VoipGroupRecordCall", R.string.VoipGroupRecordCall)); + recordItem.setSubtext(recordCallDrawable.isRecording() ? "00:01:00" : null); } } }); @@ -1547,12 +1929,17 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { adminItem.setColors(Theme.getColor(Theme.key_voipgroup_checkMenu), Theme.getColor(Theme.key_voipgroup_checkMenu)); dividerItem = otherItem.addDivider(Theme.getColor(Theme.key_voipgroup_listViewBackground)); + recordCallDrawable = new RecordCallDrawable(); + recordItem = otherItem.addSubItem(start_record, 0, recordCallDrawable, LocaleController.getString("VoipGroupRecordCall", R.string.VoipGroupRecordCall), false); + recordCallDrawable.setParentView(recordItem.getImageView()); inviteItem = otherItem.addSubItem(share_invite_link_item, R.drawable.msg_link, LocaleController.getString("VoipGroupShareInviteLink", R.string.VoipGroupShareInviteLink)); leaveItem = otherItem.addSubItem(leave_item, R.drawable.msg_endcall, LocaleController.getString("VoipGroupEndChat", R.string.VoipGroupEndChat)); otherItem.setPopupItemsSelectorColor(Theme.getColor(Theme.key_voipgroup_listSelector)); leaveItem.setColors(Theme.getColor(Theme.key_voipgroup_leaveCallMenu), Theme.getColor(Theme.key_voipgroup_leaveCallMenu)); inviteItem.setColors(Theme.getColor(Theme.key_voipgroup_actionBarItems), Theme.getColor(Theme.key_voipgroup_actionBarItems)); + recordItem.setColors(Theme.getColor(Theme.key_voipgroup_actionBarItems), Theme.getColor(Theme.key_voipgroup_actionBarItems)); + recordItem.setVisibility(View.GONE); listAdapter.notifyDataSetChanged(); oldCount = listAdapter.getItemCount(); @@ -1561,6 +1948,7 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { actionBar.setSubtitle(LocaleController.formatPluralString("Participants", call.call.participants_count + (listAdapter.addSelfToCounter() ? 1 : 0))); actionBar.setTitleRightMargin(AndroidUtilities.dp(48) * 2); + call.saveActiveDates(); VoIPService.getSharedInstance().registerStateListener(this); updateItems(); updateSpeakerPhoneIcon(false); @@ -1660,14 +2048,14 @@ private void getLink(boolean copy) { if (!TextUtils.isEmpty(currentChat.username)) { url = accountInstance.getMessagesController().linkPrefix + "/" + currentChat.username; } else { - url = chatFull != null && chatFull.exported_invite instanceof TLRPC.TL_chatInviteExported ? chatFull.exported_invite.link : null; + url = chatFull != null && chatFull.exported_invite != null ? chatFull.exported_invite.link : null; } if (TextUtils.isEmpty(url)) { TLRPC.TL_messages_exportChatInvite req = new TLRPC.TL_messages_exportChatInvite(); req.peer = MessagesController.getInputPeer(currentChat); accountInstance.getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { if (response instanceof TLRPC.TL_chatInviteExported) { - TLRPC.ExportedChatInvite invite = (TLRPC.ExportedChatInvite) response; + TLRPC.TL_chatInviteExported invite = (TLRPC.TL_chatInviteExported) response; if (chatFull != null) { chatFull.exported_invite = invite; } @@ -1752,7 +2140,7 @@ private void inviteUserToCall(int id, boolean shouldAdd) { } progressDialog[0] = null; if (shouldAdd && "USER_NOT_PARTICIPANT".equals(error.text)) { - processSelectedOption(id, 3); + processSelectedOption(null, id, 3); } else { BaseFragment fragment = parentActivity.getActionBarLayout().fragmentsStack.get(parentActivity.getActionBarLayout().fragmentsStack.size() - 1); AlertsCreator.processError(currentAccount, error, fragment, req); @@ -2217,14 +2605,14 @@ public static void onLeaveClick(Context context, Runnable onLeave, boolean fromO private ActionBarPopupWindow scrimPopupWindow; private ActionBarMenuSubItem[] scrimPopupWindowItems; - private void processSelectedOption(int userId, int option) { + private void processSelectedOption(TLRPC.TL_groupCallParticipant participant, int userId, int option) { TLRPC.User user = accountInstance.getMessagesController().getUser(userId); if (option == 0 || option == 2 || option == 3) { if (option == 0) { if (VoIPService.getSharedInstance() == null) { return; } - VoIPService.getSharedInstance().editCallMember(user, true); + VoIPService.getSharedInstance().editCallMember(user, true, -1); getUndoView().showWithAction(0, UndoView.ACTION_VOIP_MUTED, user, null, null, null); return; } @@ -2258,10 +2646,7 @@ private void processSelectedOption(int userId, int option) { textView.setSingleLine(true); textView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL); textView.setEllipsize(TextUtils.TruncateAt.END); - if (option == 0) { - textView.setText(LocaleController.getString("VoipGroupMuteMemberAlertTitle", R.string.VoipGroupMuteMemberAlertTitle)); - messageTextView.setText(AndroidUtilities.replaceTags(LocaleController.formatString("VoipGroupMuteMemberAlertText", R.string.VoipGroupMuteMemberAlertText, name))); - } else if (option == 2) { + if (option == 2) { textView.setText(LocaleController.getString("VoipGroupRemoveMemberAlertTitle", R.string.VoipGroupRemoveMemberAlertTitle)); messageTextView.setText(AndroidUtilities.replaceTags(LocaleController.formatString("VoipGroupRemoveMemberAlertText", R.string.VoipGroupRemoveMemberAlertText, name))); } else { @@ -2272,15 +2657,7 @@ private void processSelectedOption(int userId, int option) { frameLayout.addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, (LocaleController.isRTL ? 21 : 76), 11, (LocaleController.isRTL ? 76 : 21), 0)); frameLayout.addView(messageTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, 24, 57, 24, 9)); - if (option == 0) { - builder.setPositiveButton(LocaleController.getString("VoipGroupMute", R.string.VoipGroupMute), (dialogInterface, i) -> { - if (VoIPService.getSharedInstance() == null) { - return; - } - VoIPService.getSharedInstance().editCallMember(user, true); - getUndoView().showWithAction(0, UndoView.ACTION_VOIP_MUTED, user, null, null, null); - }); - } else if (option == 2) { + if (option == 2) { builder.setPositiveButton(LocaleController.getString("VoipGroupUserRemove", R.string.VoipGroupUserRemove), (dialogInterface, i) -> { accountInstance.getMessagesController().deleteUserFromChat(currentChat.id, user, null); getUndoView().showWithAction(0, UndoView.ACTION_VOIP_REMOVED, user, null, null, null); @@ -2301,9 +2678,26 @@ private void processSelectedOption(int userId, int option) { button.setTextColor(Theme.getColor(Theme.key_voipgroup_leaveCallMenu)); } } + } else if (option == 6) { + Bundle args = new Bundle(); + args.putInt("user_id", participant.user_id); + parentActivity.presentFragment(new ProfileActivity(args)); + dismiss(); } else { - VoIPService.getSharedInstance().editCallMember(user, false); - getUndoView().showWithAction(0, UndoView.ACTION_VOIP_UNMUTED, user, null, null, null); + if (option == 5) { + VoIPService.getSharedInstance().editCallMember(user, true, -1); + getUndoView().showWithAction(0, UndoView.ACTION_VOIP_MUTED_FOR_YOU, user, null, null, null); + VoIPService.getSharedInstance().setParticipantVolume(participant.source, 0); + } else { + if ((participant.flags & 128) != 0 && participant.volume == 0) { + participant.volume = 10000; + VoIPService.getSharedInstance().editCallMember(user, false, participant.volume); + } else { + VoIPService.getSharedInstance().editCallMember(user, false, -1); + } + VoIPService.getSharedInstance().setParticipantVolume(participant.source, ChatObject.getParticipantVolume(participant)); + getUndoView().showWithAction(0, option == 1 ? UndoView.ACTION_VOIP_UNMUTED : UndoView.ACTION_VOIP_UNMUTED_FOR_YOU, user, null, null, null); + } } } @@ -2315,9 +2709,13 @@ private boolean showMenuForCell(GroupCallUserCell view) { return false; } + TLRPC.TL_groupCallParticipant participant = view.getParticipant(); + Rect rect = new Rect(); ActionBarPopupWindow.ActionBarPopupWindowLayout popupLayout = new ActionBarPopupWindow.ActionBarPopupWindowLayout(getContext()); + popupLayout.setBackgroundDrawable(null); + popupLayout.setPadding(0, 0, 0, 0); popupLayout.setOnTouchListener(new View.OnTouchListener() { private int[] pos = new int[2]; @@ -2346,13 +2744,44 @@ public boolean onTouch(View v, MotionEvent event) { scrimPopupWindow.dismiss(); } }); - Rect backgroundPaddings = new Rect(); + + LinearLayout buttonsLayout = new LinearLayout(getContext()); + LinearLayout volumeLayout = !participant.muted_by_you ? new LinearLayout(getContext()) : null; + + LinearLayout linearLayout = new LinearLayout(getContext()) { + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int width = MeasureSpec.getSize(widthMeasureSpec); + buttonsLayout.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); + if (volumeLayout != null) { + volumeLayout.measure(MeasureSpec.makeMeasureSpec(buttonsLayout.getMeasuredWidth(), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); + setMeasuredDimension(buttonsLayout.getMeasuredWidth(), buttonsLayout.getMeasuredHeight() + volumeLayout.getMeasuredHeight()); + } else { + setMeasuredDimension(buttonsLayout.getMeasuredWidth(), buttonsLayout.getMeasuredHeight()); + } + } + }; + linearLayout.setMinimumWidth(AndroidUtilities.dp(240)); + linearLayout.setOrientation(LinearLayout.VERTICAL); + VolumeSlider volumeSlider = null; + + if (!participant.muted_by_you && (!participant.muted || participant.can_self_unmute)) { + Drawable shadowDrawable = getContext().getResources().getDrawable(R.drawable.popup_fixed_alert).mutate(); + shadowDrawable.setColorFilter(new PorterDuffColorFilter(backgroundColor, PorterDuff.Mode.MULTIPLY)); + volumeLayout.setBackgroundDrawable(shadowDrawable); + linearLayout.addView(volumeLayout, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, 0, 0, 0, 0)); + + volumeSlider = new VolumeSlider(getContext(), participant); + volumeLayout.addView(volumeSlider, LayoutHelper.MATCH_PARENT, 48); + } + + buttonsLayout.setMinimumWidth(AndroidUtilities.dp(240)); + buttonsLayout.setOrientation(LinearLayout.VERTICAL); Drawable shadowDrawable = getContext().getResources().getDrawable(R.drawable.popup_fixed_alert).mutate(); - shadowDrawable.getPadding(backgroundPaddings); - popupLayout.setBackgroundDrawable(shadowDrawable); - popupLayout.setBackgroundColor(backgroundColor); + shadowDrawable.setColorFilter(new PorterDuffColorFilter(backgroundColor, PorterDuff.Mode.MULTIPLY)); + buttonsLayout.setBackgroundDrawable(shadowDrawable); + linearLayout.addView(buttonsLayout, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, 0, volumeSlider != null ? -8 : 0, 0, 0)); - LinearLayout linearLayout = new LinearLayout(getContext()); ScrollView scrollView; if (Build.VERSION.SDK_INT >= 21) { scrollView = new ScrollView(getContext(), null, 0, R.style.scrollbarShapeStyle) { @@ -2368,10 +2797,6 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { scrollView.setClipToPadding(false); popupLayout.addView(scrollView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT)); - linearLayout.setMinimumWidth(AndroidUtilities.dp(200)); - linearLayout.setOrientation(LinearLayout.VERTICAL); - - TLRPC.TL_groupCallParticipant participant = view.getParticipant(); ArrayList items = new ArrayList<>(2); ArrayList icons = new ArrayList<>(2); ArrayList options = new ArrayList<>(2); @@ -2390,24 +2815,39 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { } } } - if (!isAdmin || !participant.muted) { - if (!participant.muted || participant.can_self_unmute) { - items.add(LocaleController.getString("VoipGroupMute", R.string.VoipGroupMute)); - icons.add(R.drawable.msg_voice_muted); - options.add(0); - } else { - items.add(LocaleController.getString("VoipGroupAllowToSpeak", R.string.VoipGroupAllowToSpeak)); + if (ChatObject.canManageCalls(currentChat)) { + if (!isAdmin || !participant.muted) { + if (!participant.muted || participant.can_self_unmute) { + items.add(LocaleController.getString("VoipGroupMute", R.string.VoipGroupMute)); + icons.add(R.drawable.msg_voice_muted); + options.add(0); + } else { + items.add(LocaleController.getString("VoipGroupAllowToSpeak", R.string.VoipGroupAllowToSpeak)); + icons.add(R.drawable.msg_voice_unmuted); + options.add(1); + } + } + items.add(LocaleController.getString("VoipGroupOpenProfile", R.string.VoipGroupOpenProfile)); + icons.add(R.drawable.msg_openprofile); + options.add(6); + if (!isAdmin) { + items.add(LocaleController.getString("VoipGroupUserRemove", R.string.VoipGroupUserRemove)); + icons.add(R.drawable.msg_block2); + options.add(2); + } + } else { + if (participant.muted_by_you) { + items.add(LocaleController.getString("VoipGroupUnmuteForMe", R.string.VoipGroupUnmuteForMe)); icons.add(R.drawable.msg_voice_unmuted); - options.add(1); + options.add(4); + } else { + items.add(LocaleController.getString("VoipGroupMuteForMe", R.string.VoipGroupMuteForMe)); + icons.add(R.drawable.msg_voice_muted); + options.add(5); } - } - if (!isAdmin) { - items.add(LocaleController.getString("VoipGroupUserRemove", R.string.VoipGroupUserRemove)); - icons.add(R.drawable.msg_block2); - options.add(2); - } - if (options.isEmpty()) { - return false; + items.add(LocaleController.getString("VoipGroupOpenProfile", R.string.VoipGroupOpenProfile)); + icons.add(R.drawable.msg_openprofile); + options.add(6); } scrimPopupWindowItems = new ActionBarMenuSubItem[items.size()]; @@ -2421,13 +2861,13 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { cell.setSelectorColor(Theme.getColor(Theme.key_voipgroup_listSelector)); cell.setTextAndIcon(items.get(a), icons.get(a)); scrimPopupWindowItems[a] = cell; - linearLayout.addView(cell); + buttonsLayout.addView(cell); final int i = a; cell.setOnClickListener(v1 -> { if (i >= options.size()) { return; } - processSelectedOption(participant.user_id, options.get(i)); + processSelectedOption(participant, participant.user_id, options.get(i)); if (scrimPopupWindow != null) { scrimPopupWindow.dismiss(); } @@ -2478,7 +2918,7 @@ public void onAnimationEnd(Animator animation) { scrimPopupWindow.setInputMethodMode(ActionBarPopupWindow.INPUT_METHOD_NOT_NEEDED); scrimPopupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED); scrimPopupWindow.getContentView().setFocusableInTouchMode(true); - int popupX = AndroidUtilities.dp(14) + listView.getMeasuredWidth() + AndroidUtilities.dp(6) - popupLayout.getMeasuredWidth(); + int popupX = AndroidUtilities.dp(14) + listView.getMeasuredWidth() + AndroidUtilities.dp(8) - popupLayout.getMeasuredWidth(); int popupY = (int) (listView.getY() + view.getY() + view.getMeasuredHeight()); scrimPopupWindow.showAtLocation(listView, Gravity.LEFT | Gravity.TOP, popupX, popupY); @@ -2804,7 +3244,7 @@ public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { } else { newItem = call.sortedParticipants.get(newItemPosition - listAdapter.usersStartRow); } - return oldItem.user_id == newItem.user_id; + return oldItem.user_id == newItem.user_id && oldItem.lastActiveDate == oldItem.active_date; } else if (newItemPosition >= listAdapter.invitedStartRow && newItemPosition < listAdapter.invitedEndRow && oldItemPosition >= oldInvitedStartRow && oldItemPosition < oldInvitedEndRow) { Integer oldItem = oldInvited.get(oldItemPosition - oldInvitedStartRow); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java index 33f3cd92735..4f5efa866bd 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java @@ -78,6 +78,7 @@ import org.telegram.ui.Components.CombinedDrawable; import org.telegram.ui.Components.EditTextBoldCursor; import org.telegram.ui.Components.FlickerLoadingView; +import org.telegram.ui.Components.PermanentLinkBottomSheet; import org.telegram.ui.Components.StickerEmptyView; import org.telegram.ui.Components.VerticalPositionAutoAnimator; import org.telegram.ui.Components.GroupCreateDividerItemDecoration; @@ -117,6 +118,7 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen private int maxCount = getMessagesController().maxMegagroupCount; private int chatType = ChatObject.CHAT_TYPE_CHAT; + private boolean forImport; private boolean isAlwaysShare; private boolean isNeverShare; private boolean addToGroup; @@ -133,11 +135,16 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen int maxSize; private final static int done_button = 1; + private PermanentLinkBottomSheet sharedLinkBottomSheet; public interface GroupCreateActivityDelegate { void didSelectUsers(ArrayList ids); } + public interface GroupCreateActivityImportDelegate { + void didCreateChat(int id); + } + public interface ContactsAddActivityDelegate { void didSelectUsers(ArrayList users, int fwdCount); @@ -340,6 +347,7 @@ public GroupCreateActivity() { public GroupCreateActivity(Bundle args) { super(args); chatType = args.getInt("chatType", ChatObject.CHAT_TYPE_CHAT); + forImport = args.getBoolean("forImport", false); isAlwaysShare = args.getBoolean("isAlwaysShare", false); isNeverShare = args.getBoolean("isNeverShare", false); addToGroup = args.getBoolean("addToGroup", false); @@ -667,15 +675,19 @@ public void afterTextChanged(Editable editable) { frameLayout.addView(listView); listView.setOnItemClickListener((view, position) -> { if (position == 0 && adapter.inviteViaLink != 0 && !adapter.searching) { - int id = chatId != 0 ? chatId : channelId; - TLRPC.Chat chat = getMessagesController().getChat(id); - if (chat != null && chat.has_geo && !TextUtils.isEmpty(chat.username)) { - ChatEditTypeActivity activity = new ChatEditTypeActivity(id, true); - activity.setInfo(info); - presentFragment(activity); - return; - } - presentFragment(new GroupInviteActivity(id)); + sharedLinkBottomSheet = new PermanentLinkBottomSheet(context, false, this, info, chatId); + showDialog(sharedLinkBottomSheet); +// int id = chatId != 0 ? chatId : channelId; +// TLRPC.Chat chat = getMessagesController().getChat(id); +// if (chat != null && chat.has_geo && !TextUtils.isEmpty(chat.username)) { +// ChatEditTypeActivity activity = new ChatEditTypeActivity(id, true); +// activity.setInfo(info); +// presentFragment(activity); +// return; +// } +// presentFragment(new GroupInviteActivity(id)); + + } else if (view instanceof GroupCreateUserCell) { GroupCreateUserCell cell = (GroupCreateUserCell) view; Object object = cell.getObject(); @@ -1054,6 +1066,7 @@ private boolean onDonePressed(boolean alert) { Bundle args = new Bundle(); args.putIntegerArrayList("result", result); args.putInt("chatType", chatType); + args.putBoolean("forImport", forImport); presentFragment(new GroupCreateFinalActivity(args)); } } @@ -1632,6 +1645,10 @@ public ArrayList getThemeDescriptions() { themeDescriptions.add(new ThemeDescription(emptyView.title, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); themeDescriptions.add(new ThemeDescription(emptyView.subtitle, ThemeDescription.FLAG_TEXTCOLOR, null, null, null, null, Theme.key_windowBackgroundWhiteGrayText)); + if (sharedLinkBottomSheet != null) { + themeDescriptions.addAll(sharedLinkBottomSheet.getThemeDescriptions()); + } + return themeDescriptions; } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java index 0fad2f84c09..5e07163d6e7 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java @@ -58,6 +58,8 @@ import org.telegram.ui.Components.AvatarDrawable; import org.telegram.ui.Components.CombinedDrawable; import org.telegram.ui.Components.EditTextEmoji; +import org.telegram.ui.Components.RLottieDrawable; +import org.telegram.ui.Components.RLottieImageView; import org.telegram.ui.Components.VerticalPositionAutoAnimator; import org.telegram.ui.Components.ImageUpdater; import org.telegram.ui.Components.BackupImageView; @@ -82,7 +84,7 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati private EditTextEmoji editText; private BackupImageView avatarImage; private View avatarOverlay; - private ImageView avatarEditor; + private RLottieImageView avatarEditor; private AnimatorSet avatarAnimation; private RadialProgressView avatarProgressView; private AvatarDrawable avatarDrawable; @@ -107,6 +109,10 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati private String nameToSet; private int chatType; + private RLottieDrawable cameraDrawable; + + private boolean forImport; + private String currentGroupCreateAddress; private Location currentGroupCreateLocation; @@ -128,6 +134,8 @@ public GroupCreateFinalActivity(Bundle args) { avatarDrawable = new AvatarDrawable(); currentGroupCreateAddress = args.getString("address"); currentGroupCreateLocation = args.getParcelable("location"); + forImport = args.getBoolean("forImport", false); + nameToSet = args.getString("title", null); } @Override @@ -142,7 +150,7 @@ public boolean onFragmentCreate() { final ArrayList usersToLoad = new ArrayList<>(); for (int a = 0; a < selectedContacts.size(); a++) { Integer uid = selectedContacts.get(a); - if (MessagesController.getInstance(currentAccount).getUser(uid) == null) { + if (getMessagesController().getUser(uid) == null) { usersToLoad.add(uid); } } @@ -163,7 +171,7 @@ public boolean onFragmentCreate() { } if (!users.isEmpty()) { for (TLRPC.User user : users) { - MessagesController.getInstance(currentAccount).putUser(user, true); + getMessagesController().putUser(user, true); } } else { return false; @@ -440,19 +448,30 @@ protected void onDraw(Canvas canvas) { } }; editTextContainer.addView(avatarOverlay, LayoutHelper.createFrame(64, 64, Gravity.TOP | (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT), LocaleController.isRTL ? 0 : 16, 16, LocaleController.isRTL ? 16 : 0, 16)); - avatarOverlay.setOnClickListener(view -> imageUpdater.openMenu(avatar != null, () -> { - avatar = null; - avatarBig = null; - inputPhoto = null; - inputVideo = null; - inputVideoPath = null; - videoTimestamp = 0; - showAvatarProgress(false, true); - avatarImage.setImage(null, null, avatarDrawable, null); - avatarEditor.setImageResource(R.drawable.actions_setphoto); - })); - - avatarEditor = new ImageView(context) { + avatarOverlay.setOnClickListener(view -> { + imageUpdater.openMenu(avatar != null, () -> { + avatar = null; + avatarBig = null; + inputPhoto = null; + inputVideo = null; + inputVideoPath = null; + videoTimestamp = 0; + showAvatarProgress(false, true); + avatarImage.setImage(null, null, avatarDrawable, null); + avatarEditor.setAnimation(cameraDrawable); + cameraDrawable.setCurrentFrame(0); + }, dialog -> { + cameraDrawable.setCustomEndFrame(86); + avatarEditor.playAnimation(); + }); + cameraDrawable.setCurrentFrame(0); + cameraDrawable.setCustomEndFrame(43); + avatarEditor.playAnimation(); + }); + + cameraDrawable = new RLottieDrawable(R.raw.camera, "" + R.raw.camera, AndroidUtilities.dp(60), AndroidUtilities.dp(60), false, null); + + avatarEditor = new RLottieImageView(context) { @Override public void invalidate(int l, int t, int r, int b) { super.invalidate(l, t, r, b); @@ -466,10 +485,10 @@ public void invalidate() { } }; avatarEditor.setScaleType(ImageView.ScaleType.CENTER); - avatarEditor.setImageResource(R.drawable.actions_setphoto); + avatarEditor.setAnimation(cameraDrawable); avatarEditor.setEnabled(false); avatarEditor.setClickable(false); - avatarEditor.setPadding(AndroidUtilities.dp(2), 0, 0, 0); + avatarEditor.setPadding(AndroidUtilities.dp(2), 0, 0, AndroidUtilities.dp(1)); editTextContainer.addView(avatarEditor, LayoutHelper.createFrame(64, 64, Gravity.TOP | (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT), LocaleController.isRTL ? 0 : 16, 16, LocaleController.isRTL ? 16 : 0, 16)); avatarProgressView = new RadialProgressView(context) { @@ -577,7 +596,7 @@ public void getOutline(View view, Outline outline) { createAfterUpload = true; } else { showEditDoneProgress(true); - reqId = MessagesController.getInstance(currentAccount).createChat(editText.getText().toString(), selectedContacts, null, chatType, currentGroupCreateLocation, currentGroupCreateAddress, GroupCreateFinalActivity.this); + reqId = getMessagesController().createChat(editText.getText().toString(), selectedContacts, null, chatType, forImport, currentGroupCreateLocation, currentGroupCreateAddress, GroupCreateFinalActivity.this); } }); @@ -627,7 +646,7 @@ public void didUploadPhoto(final TLRPC.InputFile photo, final TLRPC.InputFile vi if (delegate != null) { delegate.didStartChatCreation(); } - MessagesController.getInstance(currentAccount).createChat(editText.getText().toString(), selectedContacts, null, chatType, currentGroupCreateLocation, currentGroupCreateAddress, GroupCreateFinalActivity.this); + getMessagesController().createChat(editText.getText().toString(), selectedContacts, null, chatType, forImport, currentGroupCreateLocation, currentGroupCreateAddress, GroupCreateFinalActivity.this); } showAvatarProgress(false, true); avatarEditor.setImageDrawable(null); @@ -784,7 +803,7 @@ public void didReceivedNotification(int id, int account, Object... args) { presentFragment(new ChatActivity(args2), true); } if (inputPhoto != null || inputVideo != null) { - MessagesController.getInstance(currentAccount).changeChatAvatar(chat_id, null, inputPhoto, inputVideo, videoTimestamp, inputVideoPath, avatar, avatarBig); + getMessagesController().changeChatAvatar(chat_id, null, inputPhoto, inputVideo, videoTimestamp, inputVideoPath, avatar, avatarBig); } } } @@ -907,7 +926,7 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { } case 2: { GroupCreateUserCell cell = (GroupCreateUserCell) holder.itemView; - TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(selectedContacts.get(position - usersStartRow)); + TLRPC.User user = getMessagesController().getUser(selectedContacts.get(position - usersStartRow)); cell.setObject(user, null, null); break; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/GroupInviteActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/GroupInviteActivity.java index 0c7dd37a0d6..c4a5917d709 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/GroupInviteActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/GroupInviteActivity.java @@ -51,7 +51,7 @@ public class GroupInviteActivity extends BaseFragment implements NotificationCen private int chat_id; private boolean loading; - private TLRPC.ExportedChatInvite invite; + private TLRPC.TL_chatInviteExported invite; private int linkRow; private int linkInfoRow; @@ -168,7 +168,7 @@ public void didReceivedNotification(int id, int account, Object... args) { int guid = (int) args[1]; if (info.id == chat_id && guid == classGuid) { invite = MessagesController.getInstance(currentAccount).getExportedInvite(chat_id); - if (!(invite instanceof TLRPC.TL_chatInviteExported)) { + if (invite == null) { generateLink(false); } else { loading = false; @@ -194,7 +194,7 @@ private void generateLink(final boolean newRequest) { req.peer = MessagesController.getInstance(currentAccount).getInputPeer(-chat_id); final int reqId = ConnectionsManager.getInstance(currentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { if (error == null) { - invite = (TLRPC.ExportedChatInvite) response; + invite = (TLRPC.TL_chatInviteExported) response; if (newRequest) { if (getParentActivity() == null) { return; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java index 4f1ab0b389e..d5f108455b8 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java @@ -97,6 +97,7 @@ import org.telegram.messenger.voip.VoIPPendingCall; import org.telegram.messenger.voip.VoIPService; import org.telegram.tgnet.ConnectionsManager; +import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.ActionBarLayout; import org.telegram.ui.ActionBar.AlertDialog; @@ -132,11 +133,15 @@ import org.telegram.ui.Components.UpdateAppAlertDialog; import org.telegram.ui.Components.voip.VoIPHelper; +import java.io.BufferedReader; import java.io.File; +import java.io.InputStream; +import java.io.InputStreamReader; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; public class LaunchActivity extends Activity implements ActionBarLayout.ActionBarLayoutDelegate, NotificationCenter.NotificationCenterDelegate, DialogsActivity.DialogsActivityDelegate { @@ -148,6 +153,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa private ArrayList photoPathsArray; private ArrayList documentsPathsArray; private ArrayList documentsUrisArray; + private Uri exportingChatUri; private String documentsMimeType; private ArrayList documentsOriginalPathsArray; private ArrayList contactsToSend; @@ -976,6 +982,7 @@ private void checkCurrentAccount() { NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.needShowPlayServicesAlert); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.fileDidLoad); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.fileDidFailToLoad); + NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.historyImportProgressChanged); } currentAccount = UserConfig.selectedAccount; NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.appDidLogout); @@ -988,6 +995,7 @@ private void checkCurrentAccount() { NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.needShowPlayServicesAlert); NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.fileDidLoad); NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.fileDidFailToLoad); + NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.historyImportProgressChanged); } private void checkLayout() { @@ -1199,6 +1207,7 @@ private boolean handleIntent(Intent intent, boolean isNew, boolean restore, bool documentsOriginalPathsArray = null; documentsMimeType = null; documentsUrisArray = null; + exportingChatUri = null; contactsToSend = null; contactsToSendUri = null; @@ -1287,8 +1296,8 @@ private boolean handleIntent(Intent intent, boolean isNew, boolean restore, bool error = true; } } - if (!error) { - if (uri != null && (type != null && type.startsWith("image/") || uri.toString().toLowerCase().endsWith(".jpg"))) { + if (!error && uri != null) { + if (type != null && type.startsWith("image/") || uri.toString().toLowerCase().endsWith(".jpg")) { if (photoPathsArray == null) { photoPathsArray = new ArrayList<>(); } @@ -1296,27 +1305,44 @@ private boolean handleIntent(Intent intent, boolean isNew, boolean restore, bool info.uri = uri; photoPathsArray.add(info); } else { - path = AndroidUtilities.getPath(uri); - if (path != null) { - if (path.startsWith("file:")) { - path = path.replace("file://", ""); + String originalPath = uri.toString(); + if (dialogId == 0 && originalPath != null) { + Set exportUris = MessagesController.getInstance(intentAccount[0]).exportUri; + for (String u : exportUris) { + if (originalPath.startsWith(u)) { + exportingChatUri = uri; + break; + } } - if (type != null && type.startsWith("video/")) { - videoPath = path; - } else { - if (documentsPathsArray == null) { - documentsPathsArray = new ArrayList<>(); - documentsOriginalPathsArray = new ArrayList<>(); + if (exportingChatUri == null) { + if (originalPath.startsWith("content://com.kakao.talk") && originalPath.endsWith("KakaoTalkChats.txt")) { + exportingChatUri = uri; } - documentsPathsArray.add(path); - documentsOriginalPathsArray.add(uri.toString()); } - } else { - if (documentsUrisArray == null) { - documentsUrisArray = new ArrayList<>(); + } + if (exportingChatUri == null) { + path = AndroidUtilities.getPath(uri); + if (path != null) { + if (path.startsWith("file:")) { + path = path.replace("file://", ""); + } + if (type != null && type.startsWith("video/")) { + videoPath = path; + } else { + if (documentsPathsArray == null) { + documentsPathsArray = new ArrayList<>(); + documentsOriginalPathsArray = new ArrayList<>(); + } + documentsPathsArray.add(path); + documentsOriginalPathsArray.add(uri.toString()); + } + } else { + if (documentsUrisArray == null) { + documentsUrisArray = new ArrayList<>(); + } + documentsUrisArray.add(uri); + documentsMimeType = type; } - documentsUrisArray.add(uri); - documentsMimeType = type; } } } @@ -1366,6 +1392,7 @@ private boolean handleIntent(Intent intent, boolean isNew, boolean restore, bool photoPathsArray.add(info); } } else { + Set exportUris = MessagesController.getInstance(intentAccount[0]).exportUri; for (int a = 0; a < uris.size(); a++) { Parcelable parcelable = uris.get(a); if (!(parcelable instanceof Uri)) { @@ -1377,6 +1404,23 @@ private boolean handleIntent(Intent intent, boolean isNew, boolean restore, bool if (originalPath == null) { originalPath = path; } + + if (dialogId == 0 && originalPath != null && exportingChatUri == null) { + boolean ok = false; + for (String u : exportUris) { + if (originalPath.startsWith(u)) { + exportingChatUri = uri; + ok = true; + break; + } + } + if (ok) { + continue; + } else if (originalPath.startsWith("content://com.kakao.talk") && originalPath.endsWith("KakaoTalkChats.txt")) { + exportingChatUri = uri; + continue; + } + } if (path != null) { if (path.startsWith("file:")) { path = path.replace("file://", ""); @@ -1937,6 +1981,9 @@ private boolean handleIntent(Intent intent, boolean isNew, boolean restore, bool int chatId = intent.getIntExtra("chatId", 0); int userId = intent.getIntExtra("userId", 0); int encId = intent.getIntExtra("encId", 0); + if (push_msg_id == 0) { + push_msg_id = intent.getIntExtra("message_id", 0); + } if (chatId != 0) { NotificationCenter.getInstance(intentAccount[0]).postNotificationName(NotificationCenter.closeChats); push_chat_id = chatId; @@ -2052,49 +2099,15 @@ private boolean handleIntent(Intent intent, boolean isNew, boolean restore, bool })); } pushOpened = false; + } else if (exportingChatUri != null) { + runImportRequest(exportingChatUri, documentsUrisArray); } else if (videoPath != null || photoPathsArray != null || sendingText != null || documentsPathsArray != null || contactsToSend != null || documentsUrisArray != null) { if (!AndroidUtilities.isTablet()) { NotificationCenter.getInstance(intentAccount[0]).postNotificationName(NotificationCenter.closeChats); } if (dialogId == 0) { - Bundle args = new Bundle(); - args.putBoolean("onlySelect", true); - args.putInt("dialogsType", 3); - args.putBoolean("allowSwitchAccount", true); - if (contactsToSend != null) { - if (contactsToSend.size() != 1) { - args.putString("selectAlertString", LocaleController.getString("SendContactToText", R.string.SendMessagesToText)); - args.putString("selectAlertStringGroup", LocaleController.getString("SendContactToGroupText", R.string.SendContactToGroupText)); - } - } else { - args.putString("selectAlertString", LocaleController.getString("SendMessagesToText", R.string.SendMessagesToText)); - args.putString("selectAlertStringGroup", LocaleController.getString("SendMessagesToGroupText", R.string.SendMessagesToGroupText)); - } - DialogsActivity fragment = new DialogsActivity(args); - fragment.setDelegate(this); - boolean removeLast; - if (AndroidUtilities.isTablet()) { - removeLast = layersActionBarLayout.fragmentsStack.size() > 0 && layersActionBarLayout.fragmentsStack.get(layersActionBarLayout.fragmentsStack.size() - 1) instanceof DialogsActivity; - } else { - removeLast = actionBarLayout.fragmentsStack.size() > 1 && actionBarLayout.fragmentsStack.get(actionBarLayout.fragmentsStack.size() - 1) instanceof DialogsActivity; - } - actionBarLayout.presentFragment(fragment, removeLast, true, true, false); + openDialogsToSend(false); pushOpened = true; - if (SecretMediaViewer.hasInstance() && SecretMediaViewer.getInstance().isVisible()) { - SecretMediaViewer.getInstance().closePhoto(false, false); - } else if (PhotoViewer.hasInstance() && PhotoViewer.getInstance().isVisible()) { - PhotoViewer.getInstance().closePhoto(false, true); - } else if (ArticleViewer.hasInstance() && ArticleViewer.getInstance().isVisible()) { - ArticleViewer.getInstance().close(false, true); - } - - drawerLayoutContainer.setAllowOpenDrawer(false, false); - if (AndroidUtilities.isTablet()) { - actionBarLayout.showLastFragment(); - rightActionBarLayout.showLastFragment(); - } else { - drawerLayoutContainer.setAllowOpenDrawer(true, false); - } } else { ArrayList dids = new ArrayList<>(); dids.add(dialogId); @@ -2299,6 +2312,48 @@ private boolean handleIntent(Intent intent, boolean isNew, boolean restore, bool return pushOpened; } + private void openDialogsToSend(boolean animated) { + Bundle args = new Bundle(); + args.putBoolean("onlySelect", true); + args.putInt("dialogsType", 3); + args.putBoolean("allowSwitchAccount", true); + if (contactsToSend != null) { + if (contactsToSend.size() != 1) { + args.putString("selectAlertString", LocaleController.getString("SendContactToText", R.string.SendMessagesToText)); + args.putString("selectAlertStringGroup", LocaleController.getString("SendContactToGroupText", R.string.SendContactToGroupText)); + } + } else { + args.putString("selectAlertString", LocaleController.getString("SendMessagesToText", R.string.SendMessagesToText)); + args.putString("selectAlertStringGroup", LocaleController.getString("SendMessagesToGroupText", R.string.SendMessagesToGroupText)); + } + DialogsActivity fragment = new DialogsActivity(args); + fragment.setDelegate(this); + boolean removeLast; + if (AndroidUtilities.isTablet()) { + removeLast = layersActionBarLayout.fragmentsStack.size() > 0 && layersActionBarLayout.fragmentsStack.get(layersActionBarLayout.fragmentsStack.size() - 1) instanceof DialogsActivity; + } else { + removeLast = actionBarLayout.fragmentsStack.size() > 1 && actionBarLayout.fragmentsStack.get(actionBarLayout.fragmentsStack.size() - 1) instanceof DialogsActivity; + } + actionBarLayout.presentFragment(fragment, removeLast, !animated, true, false); + if (SecretMediaViewer.hasInstance() && SecretMediaViewer.getInstance().isVisible()) { + SecretMediaViewer.getInstance().closePhoto(false, false); + } else if (PhotoViewer.hasInstance() && PhotoViewer.getInstance().isVisible()) { + PhotoViewer.getInstance().closePhoto(false, true); + } else if (ArticleViewer.hasInstance() && ArticleViewer.getInstance().isVisible()) { + ArticleViewer.getInstance().close(false, true); + } + + if (!animated) { + drawerLayoutContainer.setAllowOpenDrawer(false, false); + if (AndroidUtilities.isTablet()) { + actionBarLayout.showLastFragment(); + rightActionBarLayout.showLastFragment(); + } else { + drawerLayoutContainer.setAllowOpenDrawer(true, false); + } + } + } + private int runCommentRequest(int intentAccount, AlertDialog progressDialog, Integer messageId, Integer commentId, Integer threadId, TLRPC.Chat chat) { if (chat == null) { return 0; @@ -2346,6 +2401,123 @@ private int runCommentRequest(int intentAccount, AlertDialog progressDialog, Int })); } + private void runImportRequest(final Uri importUri, + ArrayList documents) { + final int intentAccount = UserConfig.selectedAccount; + final AlertDialog progressDialog = new AlertDialog(this, 3); + final int[] requestId = new int[]{0}; + Runnable cancelRunnable = null; + + String content; + try { + int linesCount = 0; + InputStream in = getContentResolver().openInputStream(importUri); + BufferedReader r = new BufferedReader(new InputStreamReader(in)); + StringBuilder total = new StringBuilder(); + for (String line; (line = r.readLine()) != null && linesCount < 100; ) { + total.append(line).append('\n'); + linesCount++; + } + content = total.toString(); + } catch (Exception e) { + FileLog.e(e); + return; + } + final TLRPC.TL_messages_checkHistoryImport req = new TLRPC.TL_messages_checkHistoryImport(); + req.import_head = content; + requestId[0] = ConnectionsManager.getInstance(intentAccount).sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { + if (!LaunchActivity.this.isFinishing()) { + if (response != null && actionBarLayout != null) { + final TLRPC.TL_messages_historyImportParsed res = (TLRPC.TL_messages_historyImportParsed) response; + Bundle args = new Bundle(); + args.putBoolean("onlySelect", true); + args.putString("importTitle", res.title); + + args.putBoolean("allowSwitchAccount", true); + if (res.pm) { + args.putInt("dialogsType", 12); + } else if (res.group) { + args.putInt("dialogsType", 11); + } else { + String uri = importUri.toString(); + Set uris = MessagesController.getInstance(intentAccount).exportPrivateUri; + boolean ok = false; + for (String u : uris) { + if (uri.contains(u)) { + args.putInt("dialogsType", 12); + ok = true; + break; + } + } + if (!ok) { + uris = MessagesController.getInstance(intentAccount).exportGroupUri; + for (String u : uris) { + if (uri.contains(u)) { + args.putInt("dialogsType", 11); + ok = true; + break; + } + } + if (!ok) { + args.putInt("dialogsType", 13); + } + } + } + + if (SecretMediaViewer.hasInstance() && SecretMediaViewer.getInstance().isVisible()) { + SecretMediaViewer.getInstance().closePhoto(false, false); + } else if (PhotoViewer.hasInstance() && PhotoViewer.getInstance().isVisible()) { + PhotoViewer.getInstance().closePhoto(false, true); + } else if (ArticleViewer.hasInstance() && ArticleViewer.getInstance().isVisible()) { + ArticleViewer.getInstance().close(false, true); + } + + drawerLayoutContainer.setAllowOpenDrawer(false, false); + if (AndroidUtilities.isTablet()) { + actionBarLayout.showLastFragment(); + rightActionBarLayout.showLastFragment(); + } else { + drawerLayoutContainer.setAllowOpenDrawer(true, false); + } + + DialogsActivity fragment = new DialogsActivity(args); + fragment.setDelegate(this); + boolean removeLast; + if (AndroidUtilities.isTablet()) { + removeLast = layersActionBarLayout.fragmentsStack.size() > 0 && layersActionBarLayout.fragmentsStack.get(layersActionBarLayout.fragmentsStack.size() - 1) instanceof DialogsActivity; + } else { + removeLast = actionBarLayout.fragmentsStack.size() > 1 && actionBarLayout.fragmentsStack.get(actionBarLayout.fragmentsStack.size() - 1) instanceof DialogsActivity; + } + actionBarLayout.presentFragment(fragment, removeLast, false, true, false); + } else { + if (documentsUrisArray == null) { + documentsUrisArray = new ArrayList<>(); + } + documentsUrisArray.add(0, exportingChatUri); + exportingChatUri = null; + openDialogsToSend(true); + } + try { + progressDialog.dismiss(); + } catch (Exception e) { + FileLog.e(e); + } + } + }, ConnectionsManager.RequestFlagFailOnServerErrors)); + final Runnable cancelRunnableFinal = cancelRunnable; + progressDialog.setOnCancelListener(dialog -> { + ConnectionsManager.getInstance(intentAccount).cancelRequest(requestId[0], true); + if (cancelRunnableFinal != null) { + cancelRunnableFinal.run(); + } + }); + try { + progressDialog.showDelayed(300); + } catch (Exception ignore) { + + } + } + private void runLinkRequest(final int intentAccount, final String username, final String group, @@ -3213,128 +3385,162 @@ protected void onNewIntent(Intent intent) { @Override public void didSelectDialogs(DialogsActivity dialogsFragment, ArrayList dids, CharSequence message, boolean param) { - int attachesCount = 0; - if (contactsToSend != null) { - attachesCount += contactsToSend.size(); - } - if (videoPath != null) { - attachesCount++; - } - if (photoPathsArray != null) { - attachesCount += photoPathsArray.size(); - } - if (documentsPathsArray != null) { - attachesCount += documentsPathsArray.size(); - } - if (documentsUrisArray != null) { - attachesCount += documentsUrisArray.size(); - } - if (videoPath == null && photoPathsArray == null && documentsPathsArray == null && documentsUrisArray == null && sendingText != null) { - attachesCount++; - } - - for (int i = 0; i < dids.size(); i++) { - final long did = dids.get(i); - if (AlertsCreator.checkSlowMode(this, currentAccount, did, attachesCount > 1)) { - return; - } - } - final int account = dialogsFragment != null ? dialogsFragment.getCurrentAccount() : currentAccount; - final ChatActivity fragment; - if (dids.size() <= 1) { - final long did = dids.get(0); - int lower_part = (int) did; - int high_id = (int) (did >> 32); - Bundle args = new Bundle(); - args.putBoolean("scrollToTopOnResume", true); - if (!AndroidUtilities.isTablet()) { - NotificationCenter.getInstance(account).postNotificationName(NotificationCenter.closeChats); - } - if (lower_part != 0) { - if (lower_part > 0) { - args.putInt("user_id", lower_part); - } else if (lower_part < 0) { - args.putInt("chat_id", -lower_part); + if (exportingChatUri != null) { + final AlertDialog progressDialog = new AlertDialog(this, 3); + SendMessagesHelper.getInstance(account).prepareImportHistory(dids.get(0), exportingChatUri, documentsUrisArray, (result) -> { + if (result != 0) { + Bundle args = new Bundle(); + args.putBoolean("scrollToTopOnResume", true); + if (!AndroidUtilities.isTablet()) { + NotificationCenter.getInstance(account).postNotificationName(NotificationCenter.closeChats); + } + if (result > 0) { + args.putInt("user_id", result); + } else { + args.putInt("chat_id", -result); + } + ChatActivity fragment = new ChatActivity(args); + fragment.setOpenImport(); + actionBarLayout.presentFragment(fragment, dialogsFragment != null || param, dialogsFragment == null, true, false); + } else { + dialogsFragment.finishFragment(); } - } else { - args.putInt("enc_id", high_id); - } - if (!MessagesController.getInstance(account).checkCanOpenChat(args, dialogsFragment)) { - return; + try { + progressDialog.dismiss(); + } catch (Exception e) { + FileLog.e(e); + } + }); + try { + progressDialog.showDelayed(300); + } catch (Exception ignore) { + } - fragment = new ChatActivity(args); } else { - fragment = null; - } + final ChatActivity fragment; + if (dids.size() <= 1) { + final long did = dids.get(0); + int lower_part = (int) did; + int high_id = (int) (did >> 32); - if (contactsToSend != null && contactsToSend.size() == 1 && !mainFragmentsStack.isEmpty()) { - PhonebookShareAlert alert = new PhonebookShareAlert(mainFragmentsStack.get(mainFragmentsStack.size() - 1), null, null, contactsToSendUri, null, null, null); - alert.setDelegate((user, notify, scheduleDate) -> { - if (fragment != null) { - actionBarLayout.presentFragment(fragment, true, false, true, false); + Bundle args = new Bundle(); + args.putBoolean("scrollToTopOnResume", true); + if (!AndroidUtilities.isTablet()) { + NotificationCenter.getInstance(account).postNotificationName(NotificationCenter.closeChats); } - for (int i = 0; i < dids.size(); i++) { - SendMessagesHelper.getInstance(account).sendMessage(user, dids.get(i), null, null, null, null, notify, scheduleDate); + if (lower_part != 0) { + if (lower_part > 0) { + args.putInt("user_id", lower_part); + } else if (lower_part < 0) { + args.putInt("chat_id", -lower_part); + } + } else { + args.putInt("enc_id", high_id); } - }); - mainFragmentsStack.get(mainFragmentsStack.size() - 1).showDialog(alert); - } else { - String captionToSend = null; + if (!MessagesController.getInstance(account).checkCanOpenChat(args, dialogsFragment)) { + return; + } + fragment = new ChatActivity(args); + } else { + fragment = null; + } + + int attachesCount = 0; + if (contactsToSend != null) { + attachesCount += contactsToSend.size(); + } + if (videoPath != null) { + attachesCount++; + } + if (photoPathsArray != null) { + attachesCount += photoPathsArray.size(); + } + if (documentsPathsArray != null) { + attachesCount += documentsPathsArray.size(); + } + if (documentsUrisArray != null) { + attachesCount += documentsUrisArray.size(); + } + if (videoPath == null && photoPathsArray == null && documentsPathsArray == null && documentsUrisArray == null && sendingText != null) { + attachesCount++; + } + for (int i = 0; i < dids.size(); i++) { final long did = dids.get(i); - int lower_part = (int) did; - int high_id = (int) (did >> 32); + if (AlertsCreator.checkSlowMode(this, currentAccount, did, attachesCount > 1)) { + return; + } + } - AccountInstance accountInstance = AccountInstance.getInstance(UserConfig.selectedAccount); - if (fragment != null) { - actionBarLayout.presentFragment(fragment, dialogsFragment != null, dialogsFragment == null, true, false); - if (videoPath != null) { - fragment.openVideoEditor(videoPath, sendingText); - sendingText = null; + if (contactsToSend != null && contactsToSend.size() == 1 && !mainFragmentsStack.isEmpty()) { + PhonebookShareAlert alert = new PhonebookShareAlert(mainFragmentsStack.get(mainFragmentsStack.size() - 1), null, null, contactsToSendUri, null, null, null); + alert.setDelegate((user, notify, scheduleDate) -> { + if (fragment != null) { + actionBarLayout.presentFragment(fragment, true, false, true, false); } - } else { - if (videoPath != null) { - if (sendingText != null && sendingText.length() <= 1024) { + for (int i = 0; i < dids.size(); i++) { + SendMessagesHelper.getInstance(account).sendMessage(user, dids.get(i), null, null, null, null, notify, scheduleDate); + } + }); + mainFragmentsStack.get(mainFragmentsStack.size() - 1).showDialog(alert); + } else { + String captionToSend = null; + for (int i = 0; i < dids.size(); i++) { + final long did = dids.get(i); + int lower_part = (int) did; + int high_id = (int) (did >> 32); + + AccountInstance accountInstance = AccountInstance.getInstance(UserConfig.selectedAccount); + if (fragment != null) { + actionBarLayout.presentFragment(fragment, dialogsFragment != null, dialogsFragment == null, true, false); + if (videoPath != null) { + fragment.openVideoEditor(videoPath, sendingText); + sendingText = null; + } + } else { + if (videoPath != null) { + if (sendingText != null && sendingText.length() <= 1024) { + captionToSend = sendingText; + sendingText = null; + } + ArrayList arrayList = new ArrayList<>(); + arrayList.add(videoPath); + SendMessagesHelper.prepareSendingDocuments(accountInstance, arrayList, arrayList, null, captionToSend, null, did, null, null, null, null, true, 0); + } + } + if (photoPathsArray != null) { + if (sendingText != null && sendingText.length() <= 1024 && photoPathsArray.size() == 1) { + photoPathsArray.get(0).caption = sendingText; + sendingText = null; + } + SendMessagesHelper.prepareSendingMedia(accountInstance, photoPathsArray, did, null, null, null, false, false, null, true, 0); + } + if (documentsPathsArray != null || documentsUrisArray != null) { + if (sendingText != null && sendingText.length() <= 1024 && ((documentsPathsArray != null ? documentsPathsArray.size() : 0) + (documentsUrisArray != null ? documentsUrisArray.size() : 0)) == 1) { captionToSend = sendingText; sendingText = null; } - ArrayList arrayList = new ArrayList<>(); - arrayList.add(videoPath); - SendMessagesHelper.prepareSendingDocuments(accountInstance, arrayList, arrayList, null, captionToSend, null, did, null, null, null, null, true, 0); + SendMessagesHelper.prepareSendingDocuments(accountInstance, documentsPathsArray, documentsOriginalPathsArray, documentsUrisArray, captionToSend, documentsMimeType, did, null, null, null, null, true, 0); } - } - if (photoPathsArray != null) { - if (sendingText != null && sendingText.length() <= 1024 && photoPathsArray.size() == 1) { - photoPathsArray.get(0).caption = sendingText; - sendingText = null; + if (sendingText != null) { + SendMessagesHelper.prepareSendingText(accountInstance, sendingText, did, true, 0); } - SendMessagesHelper.prepareSendingMedia(accountInstance, photoPathsArray, did, null, null, null, false, false, null, true, 0); - } - if (documentsPathsArray != null || documentsUrisArray != null) { - if (sendingText != null && sendingText.length() <= 1024 && ((documentsPathsArray != null ? documentsPathsArray.size() : 0) + (documentsUrisArray != null ? documentsUrisArray.size() : 0)) == 1) { - captionToSend = sendingText; - sendingText = null; + if (contactsToSend != null && !contactsToSend.isEmpty()) { + for (int a = 0; a < contactsToSend.size(); a++) { + TLRPC.User user = contactsToSend.get(a); + SendMessagesHelper.getInstance(account).sendMessage(user, did, null, null, null, null, true, 0); + } } - SendMessagesHelper.prepareSendingDocuments(accountInstance, documentsPathsArray, documentsOriginalPathsArray, documentsUrisArray, captionToSend, documentsMimeType, did, null, null, null, null, true, 0); - } - if (sendingText != null) { - SendMessagesHelper.prepareSendingText(accountInstance, sendingText, did, true, 0); - } - if (contactsToSend != null && !contactsToSend.isEmpty()) { - for (int a = 0; a < contactsToSend.size(); a++) { - TLRPC.User user = contactsToSend.get(a); - SendMessagesHelper.getInstance(account).sendMessage(user, did, null, null, null, null, true, 0); + if (!TextUtils.isEmpty(message)) { + SendMessagesHelper.prepareSendingText(accountInstance, message.toString(), did, true, 0); } } - if (!TextUtils.isEmpty(message)) { - SendMessagesHelper.prepareSendingText(accountInstance, message.toString(), did, true, 0); - } } - } - if (dialogsFragment != null && fragment == null) { - dialogsFragment.finishFragment(); + if (dialogsFragment != null && fragment == null) { + dialogsFragment.finishFragment(); + } } photoPathsArray = null; @@ -3344,6 +3550,7 @@ public void didSelectDialogs(DialogsActivity dialogsFragment, ArrayList di documentsOriginalPathsArray = null; contactsToSend = null; contactsToSendUri = null; + exportingChatUri = null; } private void onFinish() { @@ -3366,6 +3573,7 @@ private void onFinish() { NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.needShowPlayServicesAlert); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.fileDidLoad); NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.fileDidFailToLoad); + NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.historyImportProgressChanged); } NotificationCenter.getGlobalInstance().removeObserver(this, NotificationCenter.needShowAlert); @@ -4067,6 +4275,10 @@ public void onAnimationEnd(Animator animation) { } } else if (id == NotificationCenter.needCheckSystemBarColors) { checkSystemBarColors(); + } else if (id == NotificationCenter.historyImportProgressChanged) { + if (args.length > 1 && !mainFragmentsStack.isEmpty()) { + AlertsCreator.processError(currentAccount, (TLRPC.TL_error) args[2], mainFragmentsStack.get(mainFragmentsStack.size() - 1), (TLObject) args[1]); + } } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LinkEditActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LinkEditActivity.java new file mode 100644 index 00000000000..4d311731dbf --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/LinkEditActivity.java @@ -0,0 +1,545 @@ +package org.telegram.ui; + +import android.content.Context; +import android.graphics.Canvas; +import android.text.Editable; +import android.text.InputType; +import android.text.TextWatcher; +import android.text.method.DigitsKeyListener; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.View; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.ScrollView; +import android.widget.TextView; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.R; +import org.telegram.tgnet.TLObject; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.ActionBar; +import org.telegram.ui.ActionBar.AlertDialog; +import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.ActionBar.ThemeDescription; +import org.telegram.ui.Cells.HeaderCell; +import org.telegram.ui.Cells.TextInfoPrivacyCell; +import org.telegram.ui.Cells.TextSettingsCell; +import org.telegram.ui.Components.AlertsCreator; +import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.SizeNotifierFrameLayout; +import org.telegram.ui.Components.SlideChooseView; + +import java.util.ArrayList; + +public class LinkEditActivity extends BaseFragment { + + public final static int CREATE_TYPE = 0; + public final static int EDIT_TYPE = 1; + private int type; + + private final int chatId; + private SlideChooseView usesChooseView; + private SlideChooseView timeChooseView; + + TLRPC.TL_chatInviteExported inviteToEdit; + private TextView timeEditText; + private HeaderCell timeHeaderCell; + private TextInfoPrivacyCell divider; + private HeaderCell usesHeaderCell; + private EditText usesEditText; + private TextInfoPrivacyCell dividerUses; + private TextView buttonTextView; + private TextSettingsCell revokeLink; + private boolean ignoreSet; + + public LinkEditActivity(int type, int chatId) { + this.type = type; + this.chatId = chatId; + } + + private ArrayList dispalyedDates = new ArrayList<>(); + private final int[] defaultDates = new int[]{3600, 3600 * 24, 3600 * 24 * 7}; + private ArrayList dispalyedUses = new ArrayList<>(); + private final int[] defaultUses = new int[]{1, 10, 100}; + + private int selectedDate; + private Callback callback; + + AlertDialog progressDialog; + boolean loading; + boolean scrollToEnd; + + @Override + public View createView(Context context) { + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setAllowOverlayTitle(true); + if (type == CREATE_TYPE) { + actionBar.setTitle(LocaleController.getString("NewLink", R.string.NewLink)); + } else if (type == EDIT_TYPE) { + actionBar.setTitle(LocaleController.getString("EditLink", R.string.EditLink)); + } + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); + } + } + }); + + ScrollView scrollView = new ScrollView(context); + SizeNotifierFrameLayout contentView = new SizeNotifierFrameLayout(context) { + + int oldKeyboardHeight; + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + measureKeyboardHeight(); + if (oldKeyboardHeight != keyboardHeight && keyboardHeight > AndroidUtilities.dp(20)) { + scrollToEnd = true; + invalidate(); + } + oldKeyboardHeight = keyboardHeight; + } + + @Override + protected void dispatchDraw(Canvas canvas) { + super.dispatchDraw(canvas); + if (scrollToEnd) { + scrollToEnd = false; + scrollView.scrollTo(0, Math.max(0, scrollView.getChildAt(0).getMeasuredHeight() - scrollView.getMeasuredHeight() - AndroidUtilities.dp(16))); + } + } + }; + contentView.setDelegate((keyboardHeight, isWidthGreater) -> { + + }); + fragmentView = contentView; + + LinearLayout linearLayout = new LinearLayout(context); + linearLayout.setOrientation(LinearLayout.VERTICAL); + scrollView.addView(linearLayout); + + buttonTextView = new TextView(context); + + buttonTextView.setPadding(AndroidUtilities.dp(34), 0, AndroidUtilities.dp(34), 0); + buttonTextView.setGravity(Gravity.CENTER); + buttonTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + buttonTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + + if (type == CREATE_TYPE) { + buttonTextView.setText(LocaleController.getString("CreateLink", R.string.CreateLink)); + } else if (type == EDIT_TYPE) { + buttonTextView.setText(LocaleController.getString("SaveLink", R.string.SaveLink)); + } + + timeHeaderCell = new HeaderCell(context); + timeHeaderCell.setText(LocaleController.getString("LimitByPeriod", R.string.LimitByPeriod)); + linearLayout.addView(timeHeaderCell); + timeChooseView = new SlideChooseView(context); + linearLayout.addView(timeChooseView); + timeEditText = new TextView(context); + timeEditText.setPadding(AndroidUtilities.dp(22), 0, AndroidUtilities.dp(22), 0); + timeEditText.setGravity(Gravity.CENTER_VERTICAL); + timeEditText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + timeEditText.setHint(LocaleController.getString("TimeLimitHint", R.string.TimeLimitHint)); + timeEditText.setOnClickListener(view -> { + AlertsCreator.createDatePickerDialog(context, -1, (notify, scheduleDate) -> { + chooseDate(scheduleDate); + }); + }); + + timeChooseView.setCallback(index -> { + if (index < dispalyedDates.size()) { + long date = dispalyedDates.get(index) + getConnectionsManager().getCurrentTime(); + timeEditText.setText(LocaleController.formatDateAudio(date, false)); + } else { + timeEditText.setText(""); + } + }); + resetDates(); + linearLayout.addView(timeEditText, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 50)); + + divider = new TextInfoPrivacyCell(context); + divider.setText(LocaleController.getString("TimeLimitHelp", R.string.TimeLimitHelp)); + linearLayout.addView(divider); + + usesHeaderCell = new HeaderCell(context); + usesHeaderCell.setText(LocaleController.getString("LimitNumberOfUses", R.string.LimitNumberOfUses)); + linearLayout.addView(usesHeaderCell); + usesChooseView = new SlideChooseView(context); + usesChooseView.setCallback(index -> { + usesEditText.clearFocus(); + ignoreSet = true; + if (index < dispalyedUses.size()) { + usesEditText.setText(dispalyedUses.get(index).toString()); + } else { + usesEditText.setText(""); + } + ignoreSet = false; + }); + resetUses(); + linearLayout.addView(usesChooseView); + + usesEditText = new EditText(context); + usesEditText.setPadding(AndroidUtilities.dp(22), 0, AndroidUtilities.dp(22), 0); + usesEditText.setGravity(Gravity.CENTER_VERTICAL); + usesEditText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + usesEditText.setHint(LocaleController.getString("UsesLimitHint", R.string.UsesLimitHint)); + usesEditText.setKeyListener(DigitsKeyListener.getInstance("0123456789.")); + usesEditText.setInputType(InputType.TYPE_CLASS_NUMBER); + usesEditText.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + + } + + @Override + public void afterTextChanged(Editable editable) { + if (ignoreSet) { + return; + } + if (editable.toString().equals("0")) { + usesEditText.setText(""); + return; + } + int customUses; + try { + customUses = Integer.parseInt(editable.toString()); + } catch (NumberFormatException exception) { + resetUses(); + return; + } + chooseUses(customUses); + } + }); + linearLayout.addView(usesEditText, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, 50)); + + dividerUses = new TextInfoPrivacyCell(context); + dividerUses.setText(LocaleController.getString("UsesLimitHelp", R.string.UsesLimitHelp)); + + linearLayout.addView(dividerUses); + + if (type == EDIT_TYPE) { + revokeLink = new TextSettingsCell(context); + revokeLink.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); + revokeLink.setText(LocaleController.getString("RevokeLink", R.string.RevokeLink), false); + revokeLink.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteRedText5)); + revokeLink.setOnClickListener(view -> { + AlertDialog.Builder builder2 = new AlertDialog.Builder(getParentActivity()); + builder2.setMessage(LocaleController.getString("RevokeAlert", R.string.RevokeAlert)); + builder2.setTitle(LocaleController.getString("RevokeLink", R.string.RevokeLink)); + builder2.setPositiveButton(LocaleController.getString("RevokeButton", R.string.RevokeButton), (dialogInterface2, i2) -> { + callback.revokeLink(inviteToEdit); + finishFragment(); + }); + builder2.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showDialog(builder2.create()); + + }); + linearLayout.addView(revokeLink); + } + + contentView.addView(scrollView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, 0, 0, 0, 0, 80)); + contentView.addView(buttonTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.BOTTOM, 16, 15, 16, 16)); + + timeHeaderCell.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); + timeChooseView.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); + timeEditText.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); + usesHeaderCell.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); + usesChooseView.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); + usesEditText.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); + contentView.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundGray)); + + buttonTextView.setOnClickListener(view -> { + if (loading) { + return; + } + if (type == CREATE_TYPE) { + if (progressDialog != null) { + progressDialog.dismiss(); + } + loading = true; + progressDialog = new AlertDialog(context, 3); + progressDialog.showDelayed(500); + TLRPC.TL_messages_exportChatInvite req = new TLRPC.TL_messages_exportChatInvite(); + req.peer = getMessagesController().getInputPeer(-chatId); + /*req.legacy_revoke_permanent = false; TODO layer 124 + + int i = timeChooseView.getSelectedIndex(); + req.flags |= 1; + if (i < dispalyedDates.size()) { + req.expire_date = dispalyedDates.get(i) + getConnectionsManager().getCurrentTime(); + } else { + req.expire_date = 0; + } + + i = usesChooseView.getSelectedIndex(); + req.flags |= 2; + if (i < dispalyedUses.size()) { + req.usage_limit = dispalyedUses.get(i); + } else { + req.usage_limit = 0; + }*/ + + getConnectionsManager().sendRequest(req, (response, error) -> { + AndroidUtilities.runOnUIThread(() -> { + loading = false; + if (progressDialog != null) { + progressDialog.dismiss(); + } + if (error == null) { + if (callback != null) { + callback.onLinkCreated(response); + } + finishFragment(); + } else { + AlertsCreator.showSimpleAlert(LinkEditActivity.this, error.text); + } + }); + }); + } else if (type == EDIT_TYPE) { + if (progressDialog != null) { + progressDialog.dismiss(); + } + loading = true; + progressDialog = new AlertDialog(context, 3); + progressDialog.showDelayed(500); + + TLRPC.TL_messages_editExportedChatInvite req = new TLRPC.TL_messages_editExportedChatInvite(); + req.link = inviteToEdit.link; + req.revoked = false; + req.peer = getMessagesController().getInputPeer(-chatId); + + int i = timeChooseView.getSelectedIndex(); + req.flags |= 1; + if (i < dispalyedDates.size()) { + req.expire_date = dispalyedDates.get(i) + getConnectionsManager().getCurrentTime(); + } else { + req.expire_date = 0; + } + + i = usesChooseView.getSelectedIndex(); + req.flags |= 2; + if (i < dispalyedUses.size()) { + req.usage_limit = dispalyedUses.get(i); + } else { + req.usage_limit = 0; + } + + getConnectionsManager().sendRequest(req, (response, error) -> { + AndroidUtilities.runOnUIThread(() -> { + loading = false; + if (progressDialog != null) { + progressDialog.dismiss(); + } + if (error == null) { + if (callback != null) { + callback.onLinkEdited(inviteToEdit, response); + } + finishFragment(); + } else { + AlertsCreator.showSimpleAlert(LinkEditActivity.this, error.text); + } + }); + }); + } + }); + buttonTextView.setTextColor(Theme.getColor(Theme.key_featuredStickers_buttonText)); + + dividerUses.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow)); + divider.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow)); + buttonTextView.setBackgroundDrawable(Theme.createSimpleSelectorRoundRectDrawable(AndroidUtilities.dp(6), Theme.getColor(Theme.key_featuredStickers_addButton), Theme.getColor(Theme.key_featuredStickers_addButtonPressed))); + + usesEditText.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); + usesEditText.setHintTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText)); + + timeEditText.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); + timeEditText.setHintTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText)); + + setInviteToEdit(inviteToEdit); + return contentView; + } + + private void chooseUses(int customUses) { + int position = 0; + boolean added = false; + dispalyedUses.clear(); + for (int i = 0; i < defaultUses.length; i++) { + if (!added && customUses <= defaultUses[i]) { + if (customUses != defaultUses[i]) { + dispalyedUses.add(customUses); + + } + position = i; + added = true; + } + dispalyedUses.add(defaultUses[i]); + } + if (!added) { + dispalyedUses.add(customUses); + position = defaultUses.length; + } + String[] options = new String[dispalyedUses.size() + 1]; + for (int i = 0; i < options.length; i++) { + if (i == options.length - 1) { + options[i] = LocaleController.getString("NoLimit", R.string.NoLimit); + } else { + options[i] = dispalyedUses.get(i).toString(); + } + } + usesChooseView.setOptions(position, options); + } + + private void chooseDate(int selectedDate) { + this.selectedDate = selectedDate; + timeEditText.setText(LocaleController.formatDateAudio(selectedDate, false)); + + int originDate = selectedDate; + selectedDate -= getConnectionsManager().getCurrentTime(); + + int position = 0; + boolean added = false; + dispalyedDates.clear(); + for (int i = 0; i < defaultDates.length; i++) { + if (!added && selectedDate < defaultDates[i]) { + dispalyedDates.add(selectedDate); + position = i; + added = true; + } + dispalyedDates.add(defaultDates[i]); + } + if (!added) { + dispalyedDates.add(selectedDate); + position = defaultDates.length; + } + String[] options = new String[dispalyedDates.size() + 1]; + for (int i = 0; i < options.length; i++) { + if (i == options.length - 1) { + options[i] = LocaleController.getString("NoLimit", R.string.NoLimit); + } else { + if (dispalyedDates.get(i) == defaultDates[0]) { + options[i] = LocaleController.formatPluralString("Hours", 1); + } else if (dispalyedDates.get(i) == defaultDates[1]) { + options[i] = LocaleController.formatPluralString("Days", 1); + } else if (dispalyedDates.get(i) == defaultDates[2]) { + options[i] = LocaleController.formatPluralString("Weeks", 1); + } else { + if (selectedDate < 86400L) { + options[i] = LocaleController.getString("MessageScheduleToday", R.string.MessageScheduleToday); + } else if (selectedDate < 364 * 86400L){ + options[i] = LocaleController.getInstance().formatterScheduleDay.format(originDate * 1000L); + } else { + options[i] = LocaleController.getInstance().formatterYear.format(originDate * 1000L); + } + } + } + } + timeChooseView.setOptions(position, options); + } + + private void resetDates() { + dispalyedDates.clear(); + for (int i = 0; i < defaultDates.length; i++) { + dispalyedDates.add(defaultDates[i]); + } + timeChooseView.setOptions(4, LocaleController.formatPluralString("Hours", 1), LocaleController.formatPluralString("Days", 1), LocaleController.formatPluralString("Weeks", 1), LocaleController.getString("NoLimit", R.string.NoLimit)); + } + + public void setCallback(Callback callback) { + this.callback = callback; + } + + private void resetUses() { + dispalyedUses.clear(); + for (int i = 0; i < defaultUses.length; i++) { + dispalyedUses.add(defaultUses[i]); + } + usesChooseView.setOptions(4, "1", "10", "100", LocaleController.getString("NoLimit", R.string.NoLimit)); + } + + public void setInviteToEdit(TLRPC.TL_chatInviteExported invite) { + inviteToEdit = invite; + if (fragmentView != null && invite != null) { + if (invite.expire_date > 0) { + chooseDate(invite.expire_date); + } + if (invite.usage_limit > 0) { + chooseUses(invite.usage_limit); + } + } + } + + public interface Callback { + void onLinkCreated(TLObject response); + void onLinkEdited(TLRPC.TL_chatInviteExported inviteToEdit, TLObject response); + void onLinkRemoved(TLRPC.TL_chatInviteExported inviteFinal); + void revokeLink(TLRPC.TL_chatInviteExported inviteFinal); + } + + @Override + public ArrayList getThemeDescriptions() { + ThemeDescription.ThemeDescriptionDelegate descriptionDelegate = new ThemeDescription.ThemeDescriptionDelegate() { + @Override + public void didSetColor() { + if (dividerUses != null) { + Context context = dividerUses.getContext(); + dividerUses.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow)); + divider.setBackgroundDrawable(Theme.getThemedDrawable(context, R.drawable.greydivider, Theme.key_windowBackgroundGrayShadow)); + buttonTextView.setBackgroundDrawable(Theme.createSimpleSelectorRoundRectDrawable(AndroidUtilities.dp(6), Theme.getColor(Theme.key_featuredStickers_addButton), Theme.getColor(Theme.key_featuredStickers_addButtonPressed))); + + usesEditText.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); + usesEditText.setHintTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText)); + + timeEditText.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); + timeEditText.setHintTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText)); + buttonTextView.setTextColor(Theme.getColor(Theme.key_featuredStickers_buttonText)); + if (revokeLink != null) { + revokeLink.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteRedText5)); + } + } + } + }; + ArrayList themeDescriptions = new ArrayList<>(); + themeDescriptions.add(new ThemeDescription(timeHeaderCell, 0, new Class[]{HeaderCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlueHeader)); + themeDescriptions.add(new ThemeDescription(usesHeaderCell, 0, new Class[]{HeaderCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlueHeader)); + + themeDescriptions.add(new ThemeDescription(timeHeaderCell, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_windowBackgroundWhite)); + themeDescriptions.add(new ThemeDescription(usesHeaderCell, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_windowBackgroundWhite)); + themeDescriptions.add(new ThemeDescription(timeChooseView, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_windowBackgroundWhite)); + themeDescriptions.add(new ThemeDescription(usesChooseView, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_windowBackgroundWhite)); + themeDescriptions.add(new ThemeDescription(timeEditText, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_windowBackgroundWhite)); + themeDescriptions.add(new ThemeDescription(usesEditText, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_windowBackgroundWhite)); + themeDescriptions.add(new ThemeDescription(revokeLink, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_windowBackgroundWhite)); + + themeDescriptions.add(new ThemeDescription(divider, 0, new Class[]{TextInfoPrivacyCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText4)); + themeDescriptions.add(new ThemeDescription(dividerUses, 0, new Class[]{TextInfoPrivacyCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText4)); + + themeDescriptions.add(new ThemeDescription(fragmentView, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_windowBackgroundGray)); + + themeDescriptions.add(new ThemeDescription(actionBar, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_actionBarDefault)); + themeDescriptions.add(new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_ITEMSCOLOR, null, null, null, null, Theme.key_actionBarDefaultIcon)); + themeDescriptions.add(new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_TITLECOLOR, null, null, null, null, Theme.key_actionBarDefaultTitle)); + themeDescriptions.add(new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_SELECTORCOLOR, null, null, null, null, Theme.key_actionBarDefaultSelector)); + themeDescriptions.add(new ThemeDescription(null, 0, null, null, null, descriptionDelegate, Theme.key_windowBackgroundGrayShadow)); + themeDescriptions.add(new ThemeDescription(null, 0, null, null, null, descriptionDelegate, Theme.key_featuredStickers_addButton)); + themeDescriptions.add(new ThemeDescription(null, 0, null, null, null, descriptionDelegate, Theme.key_featuredStickers_addButtonPressed)); + themeDescriptions.add(new ThemeDescription(null, 0, null, null, null, descriptionDelegate, Theme.key_windowBackgroundWhiteBlackText)); + themeDescriptions.add(new ThemeDescription(null, 0, null, null, null, descriptionDelegate, Theme.key_windowBackgroundWhiteGrayText)); + themeDescriptions.add(new ThemeDescription(null, 0, null, null, null, descriptionDelegate, Theme.key_featuredStickers_buttonText)); + themeDescriptions.add(new ThemeDescription(null, 0, null, null, null, descriptionDelegate, Theme.key_windowBackgroundWhiteRedText5)); + + return themeDescriptions; + } + + +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java index 1c765d52e73..c5628534e86 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java @@ -99,6 +99,8 @@ import org.telegram.ui.Components.CombinedDrawable; import org.telegram.ui.Components.ContextProgressView; import org.telegram.ui.Components.EditTextBoldCursor; +import org.telegram.ui.Components.RLottieDrawable; +import org.telegram.ui.Components.RLottieImageView; import org.telegram.ui.Components.VerticalPositionAutoAnimator; import org.telegram.ui.Components.HintEditText; import org.telegram.ui.Components.ImageUpdater; @@ -153,6 +155,8 @@ public class LoginActivity extends BaseFragment { private final static int done_button = 1; + private boolean needRequestPermissions; + private static class ProgressView extends View { private final Path path = new Path(); @@ -443,6 +447,12 @@ public void onResume() { } catch (Exception e) { FileLog.e(e); } + if (currentViewNum == 0 && !needRequestPermissions) { + SlideView view = views[currentViewNum]; + if (view != null) { + view.onShow(); + } + } } @Override @@ -537,6 +547,9 @@ protected void onDialogDismiss(Dialog dialog) { } } else if (dialog == permissionsShowDialog && !permissionsShowItems.isEmpty() && getParentActivity() != null) { + AndroidUtilities.runOnUIThread(() -> { + needRequestPermissions = false; + }, 200); try { getParentActivity().requestPermissions(permissionsShowItems.toArray(new String[0]), 7); } catch (Exception ignore) { @@ -1690,6 +1703,7 @@ public void fillNumber() { builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null); builder.setMessage(LocaleController.getString("AllowFillNumber", R.string.AllowFillNumber)); permissionsShowDialog = showDialog(builder.create()); + needRequestPermissions = true; } else { getParentActivity().requestPermissions(permissionsShowItems.toArray(new String[0]), 7); } @@ -1740,13 +1754,18 @@ public void onShow() { } AndroidUtilities.runOnUIThread(() -> { if (phoneField != null) { - if (codeField.length() != 0) { - phoneField.requestFocus(); - phoneField.setSelection(phoneField.length()); - AndroidUtilities.showKeyboard(phoneField); + if (needRequestPermissions) { + codeField.clearFocus(); + phoneField.clearFocus(); } else { - codeField.requestFocus(); - AndroidUtilities.showKeyboard(codeField); + if (codeField.length() != 0) { + phoneField.requestFocus(); + phoneField.setSelection(phoneField.length()); + AndroidUtilities.showKeyboard(phoneField); + } else { + codeField.requestFocus(); + AndroidUtilities.showKeyboard(codeField); + } } } }, 100); @@ -3423,7 +3442,7 @@ public class LoginActivityRegisterView extends SlideView implements ImageUpdater private BackupImageView avatarImage; private AvatarDrawable avatarDrawable; private View avatarOverlay; - private ImageView avatarEditor; + private RLottieImageView avatarEditor; private RadialProgressView avatarProgressView; private AnimatorSet avatarAnimation; private TextView textView; @@ -3434,6 +3453,8 @@ public class LoginActivityRegisterView extends SlideView implements ImageUpdater private Bundle currentParams; private boolean nextPressed = false; + private RLottieDrawable cameraDrawable; + private ImageUpdater imageUpdater; private TLRPC.FileLocation avatar; @@ -3550,15 +3571,27 @@ protected void onDraw(Canvas canvas) { } }; editTextContainer.addView(avatarOverlay, LayoutHelper.createFrame(64, 64, Gravity.TOP | (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT), 0, 16, 0, 0)); - avatarOverlay.setOnClickListener(view -> imageUpdater.openMenu(avatar != null, () -> { - avatar = null; - avatarBig = null; - showAvatarProgress(false, true); - avatarImage.setImage(null, null, avatarDrawable, null); - avatarEditor.setImageResource(R.drawable.actions_setphoto); - })); - - avatarEditor = new ImageView(context) { + avatarOverlay.setOnClickListener(view -> { + imageUpdater.openMenu(avatar != null, () -> { + avatar = null; + avatarBig = null; + showAvatarProgress(false, true); + avatarImage.setImage(null, null, avatarDrawable, null); + avatarEditor.setImageResource(R.drawable.actions_setphoto); + avatarEditor.setAnimation(cameraDrawable); + cameraDrawable.setCurrentFrame(0); + }, dialog -> { + cameraDrawable.setCustomEndFrame(86); + avatarEditor.playAnimation(); + }); + cameraDrawable.setCurrentFrame(0); + cameraDrawable.setCustomEndFrame(43); + avatarEditor.playAnimation(); + }); + + cameraDrawable = new RLottieDrawable(R.raw.camera, "" + R.raw.camera, AndroidUtilities.dp(60), AndroidUtilities.dp(60), false, null); + + avatarEditor = new RLottieImageView(context) { @Override public void invalidate(int l, int t, int r, int b) { super.invalidate(l, t, r, b); @@ -3572,10 +3605,10 @@ public void invalidate() { } }; avatarEditor.setScaleType(ImageView.ScaleType.CENTER); - avatarEditor.setImageResource(R.drawable.actions_setphoto); + avatarEditor.setAnimation(cameraDrawable); avatarEditor.setEnabled(false); avatarEditor.setClickable(false); - avatarEditor.setPadding(AndroidUtilities.dp(2), 0, 0, 0); + avatarEditor.setPadding(AndroidUtilities.dp(2), 0, 0, AndroidUtilities.dp(1)); editTextContainer.addView(avatarEditor, LayoutHelper.createFrame(64, 64, Gravity.TOP | (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT), 0, 16, 0, 0)); avatarProgressView = new RadialProgressView(context) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ManageLinksActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ManageLinksActivity.java new file mode 100644 index 00000000000..60e5a8b1e36 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/ManageLinksActivity.java @@ -0,0 +1,1448 @@ +package org.telegram.ui; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; +import android.content.Context; +import android.content.Intent; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; +import android.graphics.RectF; +import android.graphics.drawable.Drawable; +import android.text.SpannableStringBuilder; +import android.text.TextUtils; +import android.util.SparseIntArray; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.HapticFeedbackConstants; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; +import androidx.core.graphics.ColorUtils; +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.recyclerview.widget.DiffUtil; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.ApplicationLoader; +import org.telegram.messenger.ChatObject; +import org.telegram.messenger.FileLog; +import org.telegram.messenger.ImageLocation; +import org.telegram.messenger.LocaleController; +import org.telegram.messenger.MediaDataController; +import org.telegram.messenger.MessagesController; +import org.telegram.messenger.NotificationCenter; +import org.telegram.messenger.R; +import org.telegram.messenger.UserConfig; +import org.telegram.tgnet.RequestDelegate; +import org.telegram.tgnet.TLObject; +import org.telegram.tgnet.TLRPC; +import org.telegram.ui.ActionBar.ActionBar; +import org.telegram.ui.ActionBar.AlertDialog; +import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.ActionBar.SimpleTextView; +import org.telegram.ui.ActionBar.Theme; +import org.telegram.ui.ActionBar.ThemeDescription; +import org.telegram.ui.Cells.HeaderCell; +import org.telegram.ui.Cells.ManageChatTextCell; +import org.telegram.ui.Cells.ManageChatUserCell; +import org.telegram.ui.Cells.ShadowSectionCell; +import org.telegram.ui.Cells.TextInfoPrivacyCell; +import org.telegram.ui.Cells.TextSettingsCell; +import org.telegram.ui.Components.BackupImageView; +import org.telegram.ui.Components.BulletinFactory; +import org.telegram.ui.Components.CombinedDrawable; +import org.telegram.ui.Components.DotDividerSpan; +import org.telegram.ui.Components.FlickerLoadingView; +import org.telegram.ui.Components.InviteLinkBottomSheet; +import org.telegram.ui.Components.LayoutHelper; +import org.telegram.ui.Components.LinkActionView; +import org.telegram.ui.Components.LoadingStickerDrawable; +import org.telegram.ui.Components.RecyclerListView; +import org.telegram.ui.Components.TimerParticles; + +import java.util.ArrayList; +import java.util.HashMap; + +public class ManageLinksActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate { + + private ListAdapter listViewAdapter; + private RecyclerListView listView; + + private TLRPC.Chat currentChat; + private TLRPC.ChatFull info; + private TLRPC.TL_chatInviteExported invite; + private boolean isChannel; + + private int currentChatId; + + private int helpRow; + private int permanentLinkHeaderRow; + private int permanentLinkRow; + private int dividerRow; + private int createNewLinkRow; + private int linksStartRow; + private int linksEndRow; + private int linksLoadingRow; + private int revokedLinksStartRow; + private int revokedLinksEndRow; + private int revokedDivider; + private int lastDivider; + private int revokedHeader; + private int revokeAllDivider; + private int revokeAllRow; + private int createLinkHelpRow; + boolean linksLoading; + + private int rowCount; + + Drawable linkIcon; + Drawable linkIconRevoked; + + boolean hasMore; + boolean deletingRevokedLinks; + + private ArrayList invites = new ArrayList<>(); + private ArrayList revokedInvites = new ArrayList<>(); + private HashMap users = new HashMap<>(); + private InviteLinkBottomSheet inviteLinkBottomSheet; + + + long timeDif; + + private boolean isPublic; + + @Override + public void didReceivedNotification(int id, int account, Object... args) { + + } + + + private static class EmptyView extends LinearLayout implements NotificationCenter.NotificationCenterDelegate { + + private BackupImageView stickerView; + private LoadingStickerDrawable drawable; + + private int currentAccount = UserConfig.selectedAccount; + + private static final String stickerSetName = "UtyaDuck"; + + public EmptyView(Context context) { + super(context); + + setPadding(0, AndroidUtilities.dp(12), 0, AndroidUtilities.dp(12)); + setOrientation(LinearLayout.VERTICAL); + + stickerView = new BackupImageView(context); + drawable = new LoadingStickerDrawable(stickerView, "M476.1,397.4c25.8-47.2,0.3-105.9-50.9-120c-2.5-6.9-7.8-12.7-15-16.4l0.4-229.4c0-12.3-10-22.4-22.4-22.4" + + "H128.5c-12.3,0-22.4,10-22.4,22.4l-0.4,229.8v0c0,6.7,2.9,12.6,7.6,16.7c-51.6,15.9-79.2,77.2-48.1,116.4" + + "c-8.7,11.7-13.4,27.5-14,47.2c-1.7,34.5,21.6,45.8,55.9,45.8c52.3,0,99.1,4.6,105.1-36.2c16.5,0.9,7.1-37.3-6.5-53.3" + + "c18.4-22.4,18.3-52.9,4.9-78.2c-0.7-5.3-3.8-9.8-8.1-12.6c-1.5-2-1.6-2-2.1-2.7c0.2-1,1.2-11.8-3.4-20.9h138.5" + + "c-4.8,8.8-4.7,17-2.9,22.1c-5.3,4.8-6.8,12.3-5.2,17c-11.4,24.9-10,53.8,4.3,77.5c-6.8,9.7-11.2,21.7-12.6,31.6" + + "c-0.2-0.2-0.4-0.3-0.6-0.5c0.8-3.3,0.4-6.4-1.3-7.8c9.3-12.1-4.5-29.2-17-21.7c-3.8-2.8-10.6-3.2-18.1-0.5" + + "c-2.4-10.6-21.1-10.6-28.6-1c-1.3,0.3-2.9,0.8-4.5,1.9c-5.2-0.9-10.9,0.1-14.1,4.4c-6.9,3-9.5,10.4-7.8,17c-0.9,1.8-1.1,4-0.8,6.3" + + "c-1.6,1.2-2.3,3.1-2,4.9c0.1,0.6,10.4,56.6,11.2,62c0.3,1.8,1.5,3.2,3.1,3.9c8.7,3.4,12,3.8,30.1,9.4c2.7,0.8,2.4,0.8,6.7-0.1" + + "c16.4-3.5,30.2-8.9,30.8-9.2c1.6-0.6,2.7-2,3.1-3.7c0.1-0.4,6.8-36.5,10-53.2c0.9,4.2,3.3,7.3,7.4,7.5c1.2,7.8,4.4,14.5,9.5,19.9" + + "c16.4,17.3,44.9,15.7,64.9,16.1c38.3,0.8,74.5,1.5,84.4-24.4C488.9,453.5,491.3,421.3,476.1,397.4z", AndroidUtilities.dp(104), AndroidUtilities.dp(104)); + stickerView.setImageDrawable(drawable); + addView(stickerView, LayoutHelper.createLinear(104, 104, Gravity.CENTER_HORIZONTAL | Gravity.TOP, 0, 2, 0, 0)); + } + + private void setSticker() { + TLRPC.TL_messages_stickerSet set = MediaDataController.getInstance(currentAccount).getStickerSetByName(stickerSetName); + if (set == null) { + set = MediaDataController.getInstance(currentAccount).getStickerSetByEmojiOrName(stickerSetName); + } + if (set != null && set.documents.size() >= 34) { + TLRPC.Document document = set.documents.get(33); + ImageLocation imageLocation = ImageLocation.getForDocument(document); + stickerView.setImage(imageLocation, "104_104", "tgs", drawable, set); + } else { + MediaDataController.getInstance(currentAccount).loadStickersByEmojiOrName(stickerSetName, false, set == null); + stickerView.setImageDrawable(drawable); + } + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + setSticker(); + NotificationCenter.getInstance(currentAccount).addObserver(this, NotificationCenter.diceStickersDidLoad); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + NotificationCenter.getInstance(currentAccount).removeObserver(this, NotificationCenter.diceStickersDidLoad); + } + + @Override + public void didReceivedNotification(int id, int account, Object... args) { + if (id == NotificationCenter.diceStickersDidLoad) { + String name = (String) args[0]; + if (stickerSetName.equals(name)) { + setSticker(); + } + } + } + } + + public ManageLinksActivity(int chatId) { + super(); + + currentChatId = chatId; + currentChat = MessagesController.getInstance(currentAccount).getChat(chatId); + isChannel = ChatObject.isChannel(currentChat) && !currentChat.megagroup; + } + + boolean loadRevoked = false; + + private void loadLinks() { + TLRPC.TL_messages_getExportedChatInvites req = new TLRPC.TL_messages_getExportedChatInvites(); + req.peer = getMessagesController().getInputPeer(-currentChatId); + req.admin_id = getMessagesController().getInputUser(getUserConfig().getCurrentUser()); + + boolean revoked = loadRevoked; + if (loadRevoked) { + req.revoked = true; + if (!revokedInvites.isEmpty()) { + req.flags |= 4; + req.offset_link = revokedInvites.get(revokedInvites.size() - 1).link; + } + } else { + if (!invites.isEmpty()) { + req.flags |= 4; + req.offset_link = invites.get(invites.size() - 1).link; + } + } + + linksLoading = true; + TLRPC.TL_chatInviteExported inviteFinal = isPublic ? null : invite; + getConnectionsManager().sendRequest(req, (response, error) -> { + + TLRPC.TL_chatInviteExported permanentLink = null; + if (error == null) { + TLRPC.TL_messages_exportedChatInvites invites = (TLRPC.TL_messages_exportedChatInvites) response; + if (invites.invites.size() > 0 && inviteFinal != null) { + for (int i = 0; i < invites.invites.size(); i++) { + if (((TLRPC.TL_chatInviteExported) invites.invites.get(i)).link.equals(inviteFinal.link)) { + permanentLink = (TLRPC.TL_chatInviteExported) invites.invites.remove(i); + break; + } + } + } + } + + TLRPC.TL_chatInviteExported finalPermanentLink = permanentLink; + AndroidUtilities.runOnUIThread(() -> { + getNotificationCenter().doOnIdle(() -> { + linksLoading = false; + hasMore = false; + if (finalPermanentLink != null) { + invite = finalPermanentLink; + if (info != null) { + info.exported_invite = finalPermanentLink; + } + } + if (error == null) { + TLRPC.TL_messages_exportedChatInvites invites = (TLRPC.TL_messages_exportedChatInvites) response; + + if (revoked) { + for (int i = 0; i < invites.invites.size(); i++) { + TLRPC.TL_chatInviteExported in = (TLRPC.TL_chatInviteExported) invites.invites.get(i); + fixDate(in); + this.revokedInvites.add(in); + } + } else { + for (int i = 0; i < invites.invites.size(); i++) { + TLRPC.TL_chatInviteExported in = (TLRPC.TL_chatInviteExported) invites.invites.get(i); + fixDate(in); + this.invites.add(in); + } + } + + for (int i = 0; i < invites.users.size(); i++) { + users.put(invites.users.get(i).id, invites.users.get(i)); + } + int oldRowsCount = rowCount; + if (invites.invites.size() == 0) { + hasMore = false; + } else if (revoked) { + hasMore = this.revokedInvites.size() + 1 < invites.count; + } else { + hasMore = this.invites.size() + 1 < invites.count; + } + if (invites.invites.size() > 0 || loadRevoked) { + showItemsAnimated(oldRowsCount - 1); + } + + if (!hasMore && !loadRevoked) { + hasMore = true; + loadRevoked = true; + loadLinks(); + } + updateRows(true); + if (info != null && !revoked) { + info.invitesCount = invites.count; + getMessagesStorage().saveChatLinksCount(currentChatId, info.invitesCount); + } + } + }); + }); + }); + } + + private void updateRows(boolean notify) { + currentChat = MessagesController.getInstance(currentAccount).getChat(currentChatId); + if (currentChat == null) { + return; + } + + linksStartRow = -1; + linksEndRow = -1; + linksLoadingRow = -1; + revokedLinksStartRow = -1; + revokedLinksEndRow = -1; + revokedHeader = -1; + revokedDivider = -1; + lastDivider = -1; + revokeAllRow = -1; + revokeAllDivider = -1; + createLinkHelpRow = -1; + + rowCount = 0; + + helpRow = rowCount++; + permanentLinkHeaderRow = rowCount++; + permanentLinkRow = rowCount++; + dividerRow = rowCount++; + createNewLinkRow = rowCount++; + + if (!invites.isEmpty()) { + linksStartRow = rowCount; + rowCount += invites.size(); + linksEndRow = rowCount; + } + + if (!revokedInvites.isEmpty()) { + revokedDivider = rowCount++; + revokedHeader = rowCount++; + revokedLinksStartRow = rowCount; + rowCount += revokedInvites.size(); + revokedLinksEndRow = rowCount; + revokeAllDivider = rowCount++; + revokeAllRow = rowCount++; + } + + if (linksLoading || hasMore) { + linksLoadingRow = rowCount++; + } + + if (invites.isEmpty() && revokedInvites.isEmpty() && !linksLoading) { + createLinkHelpRow = rowCount++; + } + + if (!invites.isEmpty() || !revokedInvites.isEmpty()) { + lastDivider = rowCount++; + } + + if (listViewAdapter != null && notify) { + listViewAdapter.notifyDataSetChanged(); + } + } + + @Override + public View createView(Context context) { + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + actionBar.setAllowOverlayTitle(true); + actionBar.setTitle(LocaleController.getString("InviteLinks", R.string.InviteLinks)); + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); + } + } + }); + + fragmentView = new FrameLayout(context); + fragmentView.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundGray)); + fragmentView.setTag(Theme.key_windowBackgroundGray); + FrameLayout frameLayout = (FrameLayout) fragmentView; + + + listView = new RecyclerListView(context); + LinearLayoutManager layoutManager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false); + listView.setLayoutManager(layoutManager); + listView.setAdapter(listViewAdapter = new ListAdapter(context)); + listView.setOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); + if (hasMore && !linksLoading) { + int lastPosition = layoutManager.findLastVisibleItemPosition(); + if (rowCount - lastPosition < 10) { + loadLinks(); + } + } + } + }); + DefaultItemAnimator defaultItemAnimator = new DefaultItemAnimator(); + defaultItemAnimator.setDelayAnimations(false); + defaultItemAnimator.setSupportsChangeAnimations(false); + listView.setItemAnimator(defaultItemAnimator); + listView.setVerticalScrollbarPosition(LocaleController.isRTL ? RecyclerListView.SCROLLBAR_POSITION_LEFT : RecyclerListView.SCROLLBAR_POSITION_RIGHT); + frameLayout.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); + + listView.setOnItemClickListener((view, position) -> { + if (position == createNewLinkRow) { + LinkEditActivity linkEditActivity = new LinkEditActivity(LinkEditActivity.CREATE_TYPE, currentChatId); + linkEditActivity.setCallback(linkEditActivityCallback); + presentFragment(linkEditActivity); + } else if (position >= linksStartRow && position < linksEndRow) { + TLRPC.TL_chatInviteExported invite = invites.get(position - linksStartRow); + inviteLinkBottomSheet = new InviteLinkBottomSheet(context, invite, info, users, this, currentChatId, false); + inviteLinkBottomSheet.show(); + } else if (position >= revokedLinksStartRow && position < revokedLinksEndRow) { + TLRPC.TL_chatInviteExported invite = revokedInvites.get(position - revokedLinksStartRow); + inviteLinkBottomSheet = new InviteLinkBottomSheet(context, invite, info, users, this, currentChatId, false); + inviteLinkBottomSheet.show(); + } else if (position == revokeAllRow) { + if (deletingRevokedLinks) { + return; + } + + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(LocaleController.getString("DeleteAllRevokedLinks", R.string.DeleteAllRevokedLinks)); + builder.setMessage(LocaleController.getString("DeleteAllRevokedLinkHelp", R.string.DeleteAllRevokedLinkHelp)); + builder.setPositiveButton(LocaleController.getString("Delete", R.string.Delete), (dialogInterface2, i2) -> { + TLRPC.TL_messages_deleteRevokedExportedChatInvites req = new TLRPC.TL_messages_deleteRevokedExportedChatInvites(); + req.peer = getMessagesController().getInputPeer(-currentChatId); + deletingRevokedLinks = true; + getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { + deletingRevokedLinks = false; + if (error == null) { + DiffCallback callback = saveListState(); + revokedInvites.clear(); + updateRows(false); + callback.fillPositions(callback.newPositionToItem); + DiffUtil.calculateDiff(callback).dispatchUpdatesTo(listViewAdapter); + } + })); + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showDialog(builder.create()); + } + }); + listView.setOnItemLongClickListener((view, position) -> { + if ((position >= linksStartRow && position < linksEndRow) || (position >= revokedLinksStartRow && position < revokedLinksEndRow)) { + LinkCell cell = (LinkCell) view; + cell.optionsView.callOnClick(); + view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); + return true; + } + return false; + }); + + linkIcon = ContextCompat.getDrawable(context, R.drawable.msg_link_1); + linkIconRevoked = ContextCompat.getDrawable(context, R.drawable.msg_link_2); + linkIcon.setColorFilter(new PorterDuffColorFilter(Color.WHITE, PorterDuff.Mode.MULTIPLY)); + updateRows(true); + + timeDif = getConnectionsManager().getCurrentTime() - (System.currentTimeMillis() / 1000L); + return fragmentView; + } + + public void setInfo(TLRPC.ChatFull chatFull, TLRPC.ExportedChatInvite invite) { + info = chatFull; + this.invite = (TLRPC.TL_chatInviteExported) invite; + + isPublic = !TextUtils.isEmpty(currentChat.username); + loadLinks(); + } + + @Override + public void onResume() { + super.onResume(); + if (listViewAdapter != null) { + listViewAdapter.notifyDataSetChanged(); + } + } + + @SuppressWarnings("FieldCanBeLocal") + public class HintInnerCell extends FrameLayout { + + private EmptyView emptyView; + private TextView messageTextView; + + public HintInnerCell(Context context) { + super(context); + + emptyView = new EmptyView(context); + addView(emptyView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 10, 0, 0)); + + messageTextView = new TextView(context); + messageTextView.setTextColor(Theme.getColor(Theme.key_chats_message)); + messageTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + messageTextView.setGravity(Gravity.CENTER); + messageTextView.setText(LocaleController.getString("PrimaryLinkHelp", R.string.PrimaryLinkHelp)); + + addView(messageTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.LEFT, 52, 143, 52, 18)); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY), heightMeasureSpec); + } + } + + private class ListAdapter extends RecyclerListView.SelectionAdapter { + + private Context mContext; + + public ListAdapter(Context context) { + mContext = context; + } + + @Override + public boolean isEnabled(RecyclerView.ViewHolder holder) { + int position = holder.getAdapterPosition(); + if (createNewLinkRow == position) { + return true; + } else if (position >= linksStartRow && position < linksEndRow) { + return true; + } else if (position >= revokedLinksStartRow && position < revokedLinksEndRow) { + return true; + } else if (position == revokeAllRow) { + return true; + } + return false; + } + + @Override + public int getItemCount() { + return rowCount; + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view; + switch (viewType) { + case 0: + default: + view = new HintInnerCell(mContext); + view.setBackgroundDrawable(Theme.getThemedDrawable(mContext, R.drawable.greydivider_bottom, Theme.key_windowBackgroundWhite)); + break; + case 1: + view = new HeaderCell(mContext, 23); + view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); + break; + case 2: + LinkActionView linkActionView = new LinkActionView(mContext, ManageLinksActivity.this, null, currentChatId, true); + linkActionView.setPermanent(true); + linkActionView.setDelegate(new LinkActionView.Delegate() { + @Override + public void revokeLink() { + revokePermanent(); + } + + @Override + public void showUsersForPermanentLink() { + inviteLinkBottomSheet = new InviteLinkBottomSheet(linkActionView.getContext(), invite, info, users, ManageLinksActivity.this, currentChatId, true); + inviteLinkBottomSheet.show(); + } + }); + view = linkActionView; + view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); + break; + case 3: + view = new TextCell(mContext); + view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); + break; + case 4: + view = new ShadowSectionCell(mContext); + break; + case 5: + view = new LinkCell(mContext); + break; + case 6: + FlickerLoadingView flickerLoadingView = new FlickerLoadingView(mContext); + flickerLoadingView.setIsSingleCell(true); + flickerLoadingView.setViewType(FlickerLoadingView.INVITE_LINKS_TYPE); + flickerLoadingView.showDate(false); + view = flickerLoadingView; + view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); + break; + case 7: + view = new ShadowSectionCell(mContext); + view.setBackground(Theme.getThemedDrawable(mContext, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow)); + break; + case 8: + TextSettingsCell revokeAll = new TextSettingsCell(mContext); + revokeAll.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); + revokeAll.setText(LocaleController.getString("DeleteAllRevokedLinks", R.string.DeleteAllRevokedLinks), false); + revokeAll.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteRedText5)); + view = revokeAll; + break; + case 9: + TextInfoPrivacyCell cell = new TextInfoPrivacyCell(mContext); + cell.setText(LocaleController.getString("CreateNewLinkHelp", R.string.CreateNewLinkHelp)); + cell.setBackground(Theme.getThemedDrawable(mContext, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow)); + view = cell; + break; + } + view.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + return new RecyclerListView.Holder(view); + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + switch (holder.getItemViewType()) { + case 2: + LinkActionView linkActionView = (LinkActionView) holder.itemView; + if (isPublic) { + if (info != null) { + linkActionView.setLink("https://t.me/" + currentChat.username); + linkActionView.setUsers(0, null); + linkActionView.setPublic(true); + } + } else { + linkActionView.setPublic(false); + if (invite != null) { + TLRPC.TL_chatInviteExported inviteExported = invite; + linkActionView.setLink(inviteExported.link); + linkActionView.loadUsers(inviteExported, currentChatId); + } else { + linkActionView.setLink(null); + } + } + break; + case 1: + HeaderCell headerCell = (HeaderCell) holder.itemView; + if (position == permanentLinkHeaderRow) { + headerCell.setText(LocaleController.getString("ChannelLinkTitle", R.string.ChannelLinkTitle)); + } else { + headerCell.setText(LocaleController.getString("RevokedLinks", R.string.RevokedLinks)); + } + break; + case 3: + TextCell textCell = (TextCell) holder.itemView; + Drawable drawable1 = mContext.getResources().getDrawable(R.drawable.poll_add_circle); + Drawable drawable2 = mContext.getResources().getDrawable(R.drawable.poll_add_plus); + drawable1.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_switchTrackChecked), PorterDuff.Mode.MULTIPLY)); + drawable2.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_checkboxCheck), PorterDuff.Mode.MULTIPLY)); + CombinedDrawable combinedDrawable = new CombinedDrawable(drawable1, drawable2); + + textCell.setTextAndIcon(LocaleController.getString("CreateNewLink", R.string.CreateNewLink), combinedDrawable, false); + break; + case 5: + TLRPC.TL_chatInviteExported invite; + if (position >= linksStartRow && position < linksEndRow) { + invite = invites.get(position - linksStartRow); + } else { + invite = revokedInvites.get(position - revokedLinksStartRow); + } + LinkCell cell = (LinkCell) holder.itemView; + cell.setLink(invite, position - linksStartRow); + break; + } + } + + @Override + public void onViewRecycled(RecyclerView.ViewHolder holder) { + if (holder.itemView instanceof ManageChatUserCell) { + ((ManageChatUserCell) holder.itemView).recycle(); + } + } + + @Override + public int getItemViewType(int position) { + if (position == helpRow) { + return 0; + } else if (position == permanentLinkHeaderRow || position == revokedHeader) { + return 1; + } else if (position == permanentLinkRow) { + return 2; + } else if (position == createNewLinkRow) { + return 3; + } else if (position == dividerRow || position == revokedDivider || position == revokeAllDivider) { + return 4; + } else if ((position >= linksStartRow && position < linksEndRow) || (position >= revokedLinksStartRow && position < revokedLinksEndRow)) { + return 5; + } else if (position == linksLoadingRow) { + return 6; + } else if (position == lastDivider) { + return 7; + } else if (position == revokeAllRow) { + return 8; + } else if (position == createLinkHelpRow) { + return 9; + } + return 1; + } + } + + private void revokePermanent() { + TLRPC.TL_messages_exportChatInvite req = new TLRPC.TL_messages_exportChatInvite(); + req.peer = getMessagesController().getInputPeer(-currentChatId); + //req.legacy_revoke_permanent = true; TODO layer 124 + TLRPC.TL_chatInviteExported oldInvite = invite; + invite = null; + info.exported_invite = null; + listViewAdapter.notifyItemChanged(permanentLinkRow); + final int reqId = getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { + if (error == null) { + invite = (TLRPC.TL_chatInviteExported) response; + if (info != null) { + info.exported_invite = invite; + } + + if (getParentActivity() == null) { + return; + } + + listViewAdapter.notifyItemChanged(permanentLinkRow); + oldInvite.revoked = true; + DiffCallback callback = saveListState(); + revokedInvites.add(0, oldInvite); + updateRows(false); + callback.fillPositions(callback.newPositionToItem); + DiffUtil.calculateDiff(callback).dispatchUpdatesTo(listViewAdapter); + AndroidUtilities.updateVisibleRows(listView); + } + + })); + getConnectionsManager().bindRequestToGuid(reqId, classGuid); + } + + public static class TextCell extends FrameLayout { + + private SimpleTextView textView; + private ImageView imageView; + + public TextCell(Context context) { + super(context); + + textView = new SimpleTextView(context); + textView.setTextSize(16); + textView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); + textView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText2)); + textView.setTag(Theme.key_windowBackgroundWhiteBlueText2); + addView(textView); + + imageView = new ImageView(context); + imageView.setScaleType(ImageView.ScaleType.CENTER); + addView(imageView); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = AndroidUtilities.dp(48); + + textView.measure(MeasureSpec.makeMeasureSpec(width - AndroidUtilities.dp(71 + 23), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(20), MeasureSpec.EXACTLY)); + imageView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(50), MeasureSpec.EXACTLY)); + setMeasuredDimension(width, AndroidUtilities.dp(50)); + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + int height = bottom - top; + int width = right - left; + + int viewLeft; + int viewTop = (height - textView.getTextHeight()) / 2; + if (LocaleController.isRTL) { + viewLeft = getMeasuredWidth() - textView.getMeasuredWidth() - AndroidUtilities.dp(imageView.getVisibility() == VISIBLE ? 70 : 25); + } else { + viewLeft = AndroidUtilities.dp(imageView.getVisibility() == VISIBLE ? 70 : 25); + } + textView.layout(viewLeft, viewTop, viewLeft + textView.getMeasuredWidth(), viewTop + textView.getMeasuredHeight()); + + viewLeft = !LocaleController.isRTL ? (AndroidUtilities.dp(70) - imageView.getMeasuredWidth()) / 2 : width - imageView.getMeasuredWidth() - AndroidUtilities.dp(25); + imageView.layout(viewLeft, 0, viewLeft + imageView.getMeasuredWidth(), imageView.getMeasuredHeight()); + } + + public void setTextAndIcon(String text, Drawable icon, boolean divider) { + textView.setText(text); + imageView.setImageDrawable(icon); + } + } + + private class LinkCell extends FrameLayout { + + private final static int LINK_STATE_BLUE = 0; + private final static int LINK_STATE_GREEN = 1; + private final static int LINK_STATE_YELLOW = 2; + private final static int LINK_STATE_RED = 3; + private final static int LINK_STATE_GRAY = 4; + + int lastDrawingState; + + TextView titleView; + TextView subtitleView; + TLRPC.TL_chatInviteExported invite; + int position; + Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); + Paint paint2 = new Paint(Paint.ANTI_ALIAS_FLAG); + RectF rectF = new RectF(); + + ImageView optionsView; + + int animateFromState; + float animateToStateProgress = 1f; + float lastDrawExpringProgress; + boolean animateHideExpiring; + + + public LinkCell(@NonNull Context context) { + super(context); + + paint2.setStyle(Paint.Style.STROKE); + paint2.setStrokeCap(Paint.Cap.ROUND); + + LinearLayout linearLayout = new LinearLayout(context); + linearLayout.setOrientation(LinearLayout.VERTICAL); + + addView(linearLayout, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_VERTICAL, 70, 0, 30, 0)); + + titleView = new TextView(context); + titleView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + titleView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteBlackText)); + titleView.setLines(1); + titleView.setEllipsize(TextUtils.TruncateAt.END); + + subtitleView = new TextView(context); + subtitleView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); + subtitleView.setTextColor(Theme.getColor(Theme.key_windowBackgroundWhiteGrayText)); + + linearLayout.addView(titleView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT)); + linearLayout.addView(subtitleView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, 0, 6, 0, 0)); + + optionsView = new ImageView(context); + optionsView.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_ab_other)); + optionsView.setScaleType(ImageView.ScaleType.CENTER); + optionsView.setColorFilter(Theme.getColor(Theme.key_dialogTextGray3)); + optionsView.setOnClickListener(view -> { + if (invite == null) { + return; + } + ArrayList items = new ArrayList<>(); + ArrayList icons = new ArrayList<>(); + final ArrayList actions = new ArrayList<>(); + + if (invite.revoked) { + items.add(LocaleController.getString("Delete", R.string.Delete)); + icons.add(R.drawable.msg_delete); + actions.add(4); + } else { + items.add(LocaleController.getString("Copy", R.string.Copy)); + icons.add(R.drawable.msg_copy); + actions.add(0); + + items.add(LocaleController.getString("Share", R.string.ShareLink)); + icons.add(R.drawable.msg_share); + actions.add(1); + + items.add(LocaleController.getString("Edit", R.string.Edit)); + icons.add(R.drawable.msg_edit); + actions.add(2); + + items.add(LocaleController.getString("RevokeLink", R.string.RevokeLink)); + icons.add(R.drawable.msg_delete); + actions.add(3); + } + + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setItems(items.toArray(new CharSequence[0]), AndroidUtilities.toIntArray(icons), (dialogInterface, i) -> { + switch (actions.get(i)) { + case 0: + try { + if (invite.link == null) { + return; + } + android.content.ClipboardManager clipboard = (android.content.ClipboardManager) ApplicationLoader.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE); + android.content.ClipData clip = android.content.ClipData.newPlainText("label", invite.link); + clipboard.setPrimaryClip(clip); + BulletinFactory.createCopyLinkBulletin(ManageLinksActivity.this).show(); + } catch (Exception e) { + FileLog.e(e); + } + break; + case 1: + try { + if (invite.link == null) { + return; + } + Intent intent = new Intent(Intent.ACTION_SEND); + intent.setType("text/plain"); + intent.putExtra(Intent.EXTRA_TEXT, invite.link); + startActivityForResult(Intent.createChooser(intent, LocaleController.getString("InviteToGroupByLink", R.string.InviteToGroupByLink)), 500); + } catch (Exception e) { + FileLog.e(e); + } + break; + case 2: + editLink(invite); + break; + case 3: + TLRPC.TL_chatInviteExported inviteFinal = invite; + AlertDialog.Builder builder2 = new AlertDialog.Builder(getParentActivity()); + builder2.setMessage(LocaleController.getString("RevokeAlert", R.string.RevokeAlert)); + builder2.setTitle(LocaleController.getString("RevokeLink", R.string.RevokeLink)); + builder2.setPositiveButton(LocaleController.getString("RevokeButton", R.string.RevokeButton), (dialogInterface2, i2) -> { + revokeLink(inviteFinal); + }); + builder2.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showDialog(builder2.create()); + break; + case 4: + inviteFinal = invite; + builder2 = new AlertDialog.Builder(getParentActivity()); + builder2.setTitle(LocaleController.getString("DeleteLink", R.string.DeleteLink)); + builder2.setMessage(LocaleController.getString("DeleteLinkHelp", R.string.DeleteLinkHelp)); + builder2.setPositiveButton(LocaleController.getString("Delete", R.string.Delete), (dialogInterface2, i2) -> { + deleteLink(inviteFinal); + }); + builder2.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showDialog(builder2.create()); + break; + } + }); + builder.setTitle(LocaleController.getString("InviteLink", R.string.InviteLink)); + AlertDialog alert = builder.create(); + builder.show(); + alert.setItemColor(items.size() - 1, Theme.getColor(Theme.key_dialogTextRed2), Theme.getColor(Theme.key_dialogRedIcon)); + }); + optionsView.setBackground(Theme.createSelectorDrawable(Theme.getColor(Theme.key_listSelector), 1)); + addView(optionsView, LayoutHelper.createFrame(40, 48, Gravity.RIGHT | Gravity.CENTER_VERTICAL)); + + + setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); + setWillNotDraw(false); + } + + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(64), MeasureSpec.EXACTLY)); + paint2.setStrokeWidth(AndroidUtilities.dp(2)); + } + + + private TimerParticles timerParticles = new TimerParticles(); + + @Override + protected void onDraw(Canvas canvas) { + if (invite == null) { + return; + } + int cX = AndroidUtilities.dp(36); + int cY = getMeasuredHeight() / 2; + + int drawState; + + float progress = 0; + if (invite.expired || invite.revoked) { + drawState = invite.revoked ? LINK_STATE_GRAY : LINK_STATE_RED; + } else if (invite.expire_date > 0) { + long currentTime = System.currentTimeMillis() + timeDif * 1000L; + long expireTime = invite.expire_date * 1000L; + long date = (invite.start_date <= 0 ? invite.date : invite.start_date) * 1000L; + long from = currentTime - date; + long to = expireTime - date; + progress = (1f - from / (float) to); + if (progress <= 0) { + invite.expired = true; + drawState = LINK_STATE_RED; + } else { + drawState = LINK_STATE_GREEN; + } + } else { + drawState = LINK_STATE_BLUE; + } + + if (drawState != lastDrawingState && lastDrawingState >= 0) { + animateFromState = lastDrawingState; + animateToStateProgress = 0f; + if (hasProgress(animateFromState) && !hasProgress(drawState)) { + animateHideExpiring = true; + } else { + animateHideExpiring = false; + } + } + + lastDrawingState = drawState; + + if (animateToStateProgress != 1f) { + animateToStateProgress += 16f / 250f; + if (animateToStateProgress >= 1f) { + animateToStateProgress = 1f; + animateHideExpiring = false; + } else { + invalidate(); + } + } + int color; + if (animateToStateProgress != 1f) { + color = ColorUtils.blendARGB(getColor(animateFromState, progress), getColor(drawState, progress), animateToStateProgress); + } else { + color = getColor(drawState, progress); + } + + paint.setColor(color); + canvas.drawCircle(cX, cY, AndroidUtilities.dp(32) / 2f, paint); + if (animateHideExpiring || (!invite.expired && invite.expire_date > 0 && !invite.revoked)) { + if (animateHideExpiring) { + progress = lastDrawExpringProgress; + } + + paint2.setColor(color); + rectF.set(cX - AndroidUtilities.dp(20), cY - AndroidUtilities.dp(20), cX + AndroidUtilities.dp(20), cY + AndroidUtilities.dp(20)); + + if (animateToStateProgress != 1f && (!hasProgress(animateFromState) || animateHideExpiring)) { + canvas.save(); + float a = (animateHideExpiring ? (1f - animateToStateProgress) : animateToStateProgress); + float s = (float) (0.7 + 0.3f * a); + canvas.scale(s, s, rectF.centerX(), rectF.centerY()); + canvas.drawArc(rectF, -90, -progress * 360, false, paint2); + timerParticles.draw(canvas, paint2, rectF, -progress * 360 , a); + canvas.restore(); + } else { + canvas.drawArc(rectF, -90, -progress * 360, false, paint2); + timerParticles.draw(canvas, paint2, rectF, -progress * 360, 1f); + } + if (!isPaused) { + invalidate(); + } + lastDrawExpringProgress = progress; + } + + if (invite.revoked) { + linkIconRevoked.setBounds(cX - AndroidUtilities.dp(12), cY - AndroidUtilities.dp(12), cX + AndroidUtilities.dp(12), cY + AndroidUtilities.dp(12)); + linkIconRevoked.draw(canvas); + } else { + linkIcon.setBounds(cX - AndroidUtilities.dp(12), cY - AndroidUtilities.dp(12), cX + AndroidUtilities.dp(12), cY + AndroidUtilities.dp(12)); + linkIcon.draw(canvas); + } + + } + + private boolean hasProgress(int state) { + return state == LINK_STATE_YELLOW || state == LINK_STATE_GREEN; + } + + private int getColor(int state, float progress) { + if (state == LINK_STATE_RED) { + return Theme.getColor(Theme.key_chat_attachAudioBackground); + } else if (state == LINK_STATE_GREEN) { + if (progress > 0.5f) { + float p = (progress - 0.5f) / 0.5f; + return ColorUtils.blendARGB(Theme.getColor(Theme.key_chat_attachLocationBackground), Theme.getColor(Theme.key_chat_attachPollBackground), (1f - p)); + } else { + float p = progress /0.5f; + return ColorUtils.blendARGB(Theme.getColor(Theme.key_chat_attachPollBackground),Theme.getColor(Theme.key_chat_attachAudioBackground), (1f - p)); + } + } else if (state == LINK_STATE_YELLOW) { + return Theme.getColor(Theme.key_chat_attachPollBackground); + } else if (state == LINK_STATE_GRAY) { + return Theme.getColor(Theme.key_windowBackgroundWhiteGrayIcon); + } else { + return Theme.getColor(Theme.key_featuredStickers_addButton); + } + } + + public void setLink(TLRPC.TL_chatInviteExported invite, int position) { + if (this.invite == null || invite == null || !this.invite.link.equals(invite.link)) { + lastDrawingState = -1; + animateToStateProgress = 1f; + } + this.invite = invite; + this.position = position; + + if (invite.link.startsWith("https://")) { + titleView.setText(invite.link.substring("https://".length())); + } else { + titleView.setText(invite.link); + } + + String joinedString = invite.usage == 0 ? LocaleController.getString("NoOneJoinedYet", R.string.NoOneJoinedYet) : LocaleController.formatPluralString("PeopleJoined", invite.usage); + if (invite.expired || invite.revoked) { + if (invite.revoked && invite.usage == 0) { + joinedString = LocaleController.getString("NoOneJoined", R.string.NoOneJoined); + } + SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(joinedString); + DotDividerSpan dotDividerSpan = new DotDividerSpan(); + dotDividerSpan.setTopPadding(AndroidUtilities.dp(1.5f)); + spannableStringBuilder.append(" . ").setSpan(dotDividerSpan, spannableStringBuilder.length() - 3, spannableStringBuilder.length() - 2, 0); + if (!invite.revoked && invite.usage_limit > 0 && invite.usage >= invite.usage_limit) { + spannableStringBuilder.append(LocaleController.getString("LinkLimitReached", R.string.LinkLimitReached)); + } else { + spannableStringBuilder.append(invite.revoked ? LocaleController.getString("Revoked", R.string.Revoked) : LocaleController.getString("Expired", R.string.Expired)); + } + subtitleView.setText(spannableStringBuilder); + } else { + subtitleView.setText(joinedString); + } + +// if (invite.revoked) { +// optionsView.setVisibility(View.GONE); +// } else { +// optionsView.setVisibility(View.VISIBLE); +// } + } + } + + public void deleteLink(TLRPC.TL_chatInviteExported invite) { + TLRPC.TL_messages_deleteExportedChatInvite req = new TLRPC.TL_messages_deleteExportedChatInvite(); + req.link = invite.link; + req.peer = getMessagesController().getInputPeer(-currentChatId); + TLRPC.TL_chatInviteExported inviteFinal = invite; + getConnectionsManager().sendRequest(req, new RequestDelegate() { + @Override + public void run(TLObject response, TLRPC.TL_error error) { + AndroidUtilities.runOnUIThread(() -> { + if (error == null) { + linkEditActivityCallback.onLinkRemoved(inviteFinal); + } + }); + } + }); + } + + public void editLink(TLRPC.TL_chatInviteExported invite) { + LinkEditActivity activity = new LinkEditActivity(LinkEditActivity.EDIT_TYPE, currentChatId); + activity.setCallback(linkEditActivityCallback); + activity.setInviteToEdit(invite); + presentFragment(activity); + } + + public void revokeLink(TLRPC.TL_chatInviteExported invite) { + TLRPC.TL_messages_editExportedChatInvite req = new TLRPC.TL_messages_editExportedChatInvite(); + req.link = invite.link; + req.revoked = true; + req.peer = getMessagesController().getInputPeer(-currentChatId); + TLRPC.TL_chatInviteExported inviteFinal = invite; + getConnectionsManager().sendRequest(req, (response, error) -> AndroidUtilities.runOnUIThread(() -> { + if (error == null) { + linkEditActivityCallback.onLinkEdited(inviteFinal, response); + if (info != null) { + info.invitesCount--; + if (info.invitesCount < 0) { + info.invitesCount = 0; + } + getMessagesStorage().saveChatLinksCount(currentChatId, info.invitesCount); + } + } + })); + } + + private void showItemsAnimated(int from) { + if (isPaused || listView == null) { + return; + } + View progressView = null; + for (int i = 0; i < listView.getChildCount(); i++) { + View child = listView.getChildAt(i); + if (listView.getChildAdapterPosition(child) >= 0 && child instanceof FlickerLoadingView) { + progressView = child; + } + } + final View finalProgressView = progressView; + if (finalProgressView != null) { + listView.removeView(finalProgressView); + } + + listView.invalidate(); + if (finalProgressView != null && finalProgressView.getParent() == null) { + RecyclerView.LayoutManager layoutManager = listView.getLayoutManager(); + listView.addView(finalProgressView); + if (layoutManager != null) { + layoutManager.ignoreView(finalProgressView); + Animator animator = ObjectAnimator.ofFloat(finalProgressView, View.ALPHA, finalProgressView.getAlpha(), 0); + animator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + finalProgressView.setAlpha(1f); + layoutManager.stopIgnoringView(finalProgressView); + listView.removeView(finalProgressView); + } + }); + animator.start(); + } + } + listView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + listView.getViewTreeObserver().removeOnPreDrawListener(this); + int n = listView.getChildCount(); + AnimatorSet animatorSet = new AnimatorSet(); + for (int i = 0; i < n; i++) { + View child = listView.getChildAt(i); + if (child == finalProgressView || listView.getChildAdapterPosition(child) < from) { + continue; + } + child.setAlpha(0); + int s = Math.min(listView.getMeasuredHeight(), Math.max(0, child.getTop())); + int delay = (int) ((s / (float) listView.getMeasuredHeight()) * 100); + ObjectAnimator a = ObjectAnimator.ofFloat(child, View.ALPHA, 0, 1f); + a.setStartDelay(delay); + a.setDuration(200); + animatorSet.playTogether(a); + } + + animatorSet.start(); + return false; + } + }); + } + + private final LinkEditActivity.Callback linkEditActivityCallback = new LinkEditActivity.Callback() { + @Override + public void onLinkCreated(TLObject response) { + if (response instanceof TLRPC.TL_chatInviteExported) { + AndroidUtilities.runOnUIThread(() -> { + DiffCallback callback = saveListState(); + invites.add(0, (TLRPC.TL_chatInviteExported) response); + updateRows(false); + callback.fillPositions(callback.newPositionToItem); + DiffUtil.calculateDiff(callback).dispatchUpdatesTo(listViewAdapter); + AndroidUtilities.updateVisibleRows(listView); + if (info != null) { + info.invitesCount++; + getMessagesStorage().saveChatLinksCount(currentChatId, info.invitesCount); + } + }, 200); + } + } + + @Override + public void onLinkEdited(TLRPC.TL_chatInviteExported inviteToEdit, TLObject response) { + if (response instanceof TLRPC.TL_messages_exportedChatInvite) { + TLRPC.TL_chatInviteExported edited = (TLRPC.TL_chatInviteExported) ((TLRPC.TL_messages_exportedChatInvite) response).invite; + fixDate(edited); + for (int i = 0; i < invites.size(); i++) { + if (invites.get(i).link.equals(inviteToEdit.link)) { + if (edited.revoked) { + DiffCallback callback = saveListState(); + invites.remove(i); + revokedInvites.add(0, edited); + updateRows(false); + callback.fillPositions(callback.newPositionToItem); + DiffUtil.calculateDiff(callback).dispatchUpdatesTo(listViewAdapter); + AndroidUtilities.updateVisibleRows(listView); + } else { + invites.set(i, edited); + listViewAdapter.notifyDataSetChanged(); + } + return; + } + } + } + } + + @Override + public void onLinkRemoved(TLRPC.TL_chatInviteExported removedInvite) { + for (int i = 0; i < revokedInvites.size(); i++) { + if (revokedInvites.get(i).link.equals(removedInvite.link)) { + DiffCallback callback = saveListState(); + revokedInvites.remove(i); + updateRows(false); + callback.fillPositions(callback.newPositionToItem); + DiffUtil.calculateDiff(callback).dispatchUpdatesTo(listViewAdapter); + AndroidUtilities.updateVisibleRows(listView); + return; + } + } + } + + @Override + public void revokeLink(TLRPC.TL_chatInviteExported inviteFinal) { + ManageLinksActivity.this.revokeLink(inviteFinal); + } + }; + + + private class DiffCallback extends DiffUtil.Callback { + + int oldRowCount; + int oldLinksStartRow; + int oldLinksEndRow; + int oldRevokedLinksStartRow; + int oldRevokedLinksEndRow; + + SparseIntArray oldPositionToItem = new SparseIntArray(); + SparseIntArray newPositionToItem = new SparseIntArray(); + ArrayList oldLinks = new ArrayList<>(); + ArrayList oldRevokedLinks = new ArrayList<>(); + + + @Override + public int getOldListSize() { + return oldRowCount; + } + + @Override + public int getNewListSize() { + return rowCount; + } + + @Override + public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { + if (oldItemPosition >= oldLinksStartRow && oldItemPosition < oldLinksEndRow || oldItemPosition >= oldRevokedLinksStartRow && oldItemPosition < oldRevokedLinksEndRow) { + if (newItemPosition >= linksStartRow && newItemPosition < linksEndRow || newItemPosition >= revokedLinksStartRow && newItemPosition < revokedLinksEndRow) { + TLRPC.TL_chatInviteExported newItem; + TLRPC.TL_chatInviteExported oldItem; + if (newItemPosition >= linksStartRow && newItemPosition < linksEndRow) { + newItem = invites.get(newItemPosition - linksStartRow); + } else { + newItem = revokedInvites.get(newItemPosition - revokedLinksStartRow); + } + if (oldItemPosition >= oldLinksStartRow && oldItemPosition < oldLinksEndRow) { + oldItem = oldLinks.get(oldItemPosition - oldLinksStartRow); + } else { + oldItem = oldRevokedLinks.get(oldItemPosition - oldRevokedLinksStartRow); + } + return oldItem.link.equals(newItem.link); + } + } + int oldItem = oldPositionToItem.get(oldItemPosition, -1); + int newItem = newPositionToItem.get(newItemPosition, -1); + return oldItem >= 0 && oldItem == newItem; + } + + @Override + public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { + return areItemsTheSame(oldItemPosition, newItemPosition); + } + + public void fillPositions(SparseIntArray sparseIntArray) { + sparseIntArray.clear(); + int pointer = 0; + + put(++pointer, helpRow, sparseIntArray); + put(++pointer, permanentLinkHeaderRow, sparseIntArray); + put(++pointer, permanentLinkRow, sparseIntArray); + put(++pointer, dividerRow, sparseIntArray); + put(++pointer, createNewLinkRow, sparseIntArray); + put(++pointer, revokedHeader, sparseIntArray); + put(++pointer, revokedDivider, sparseIntArray); + put(++pointer, lastDivider, sparseIntArray); + put(++pointer, revokeAllDivider, sparseIntArray); + put(++pointer, revokeAllRow, sparseIntArray); + put(++pointer, createLinkHelpRow, sparseIntArray); + } + + private void put(int id, int position, SparseIntArray sparseIntArray) { + if (position >= 0) { + sparseIntArray.put(position, id); + } + } + } + + private DiffCallback saveListState() { + DiffCallback callback = new DiffCallback(); + callback.fillPositions(callback.oldPositionToItem); + callback.oldLinksStartRow = linksStartRow; + callback.oldLinksEndRow = linksEndRow; + callback.oldRevokedLinksStartRow = revokedLinksStartRow; + callback.oldRevokedLinksEndRow = revokedLinksEndRow; + callback.oldRowCount = rowCount; + callback.oldLinks.clear(); + callback.oldLinks.addAll(invites); + + callback.oldRevokedLinks.clear(); + callback.oldRevokedLinks.addAll(revokedInvites); + + return callback; + } + + public void fixDate(TLRPC.TL_chatInviteExported edited) { + if (edited.expire_date > 0) { + edited.expired = getConnectionsManager().getCurrentTime() >= edited.expire_date; + } else if (edited.usage_limit > 0) { + edited.expired = edited.usage >= edited.usage_limit; + } + } + + @Override + public ArrayList getThemeDescriptions() { + ArrayList themeDescriptions = new ArrayList<>(); + + ThemeDescription.ThemeDescriptionDelegate cellDelegate = () -> { + if (listView != null) { + int count = listView.getChildCount(); + for (int a = 0; a < count; a++) { + View child = listView.getChildAt(a); + if (child instanceof ManageChatUserCell) { + ((ManageChatUserCell) child).update(0); + } + if (child instanceof LinkActionView) { + ((LinkActionView) child).updateColors(); + } + } + } + if (inviteLinkBottomSheet != null) { + inviteLinkBottomSheet.updateColors(); + } + }; + + themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_CELLBACKGROUNDCOLOR, new Class[]{HeaderCell.class, TextCell.class, LinkActionView.class, LinkCell.class}, null, null, null, Theme.key_windowBackgroundWhite)); + themeDescriptions.add(new ThemeDescription(fragmentView, ThemeDescription.FLAG_BACKGROUND | ThemeDescription.FLAG_CHECKTAG, null, null, null, null, Theme.key_windowBackgroundGray)); + themeDescriptions.add(new ThemeDescription(fragmentView, ThemeDescription.FLAG_BACKGROUND | ThemeDescription.FLAG_CHECKTAG, null, null, null, null, Theme.key_windowBackgroundWhite)); + + themeDescriptions.add(new ThemeDescription(actionBar, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_actionBarDefault)); + themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_LISTGLOWCOLOR, null, null, null, null, Theme.key_actionBarDefault)); + themeDescriptions.add(new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_ITEMSCOLOR, null, null, null, null, Theme.key_actionBarDefaultIcon)); + themeDescriptions.add(new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_TITLECOLOR, null, null, null, null, Theme.key_actionBarDefaultTitle)); + themeDescriptions.add(new ThemeDescription(actionBar, ThemeDescription.FLAG_AB_SELECTORCOLOR, null, null, null, null, Theme.key_actionBarDefaultSelector)); + + themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_SELECTOR, null, null, null, null, Theme.key_listSelector)); + + themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{View.class}, Theme.dividerPaint, null, null, Theme.key_divider)); + + themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{TextInfoPrivacyCell.class}, null, null, null, Theme.key_windowBackgroundGrayShadow)); + themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{TextInfoPrivacyCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText4)); + + themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{ManageChatUserCell.class}, new String[]{"nameTextView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); + themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{ManageChatUserCell.class}, new String[]{"statusColor"}, null, null, cellDelegate, Theme.key_windowBackgroundWhiteGrayText)); + themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{ManageChatUserCell.class}, new String[]{"statusOnlineColor"}, null, null, cellDelegate, Theme.key_windowBackgroundWhiteBlueText)); + themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{ManageChatUserCell.class}, null, Theme.avatarDrawables, null, Theme.key_avatar_text)); + themeDescriptions.add(new ThemeDescription(null, 0, null, null, null, cellDelegate, Theme.key_avatar_backgroundRed)); + themeDescriptions.add(new ThemeDescription(null, 0, null, null, null, cellDelegate, Theme.key_avatar_backgroundOrange)); + themeDescriptions.add(new ThemeDescription(null, 0, null, null, null, cellDelegate, Theme.key_avatar_backgroundViolet)); + themeDescriptions.add(new ThemeDescription(null, 0, null, null, null, cellDelegate, Theme.key_avatar_backgroundGreen)); + themeDescriptions.add(new ThemeDescription(null, 0, null, null, null, cellDelegate, Theme.key_avatar_backgroundCyan)); + themeDescriptions.add(new ThemeDescription(null, 0, null, null, null, cellDelegate, Theme.key_avatar_backgroundBlue)); + themeDescriptions.add(new ThemeDescription(null, 0, null, null, null, cellDelegate, Theme.key_avatar_backgroundPink)); + + themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{HintInnerCell.class}, new String[]{"messageTextView"}, null, null, null, Theme.key_chats_message)); + + themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_CHECKTAG, new Class[]{ManageChatTextCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); + themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_CHECKTAG, new Class[]{ManageChatTextCell.class}, new String[]{"imageView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayIcon)); + themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_CHECKTAG, new Class[]{ManageChatTextCell.class}, new String[]{"imageView"}, null, null, null, Theme.key_windowBackgroundWhiteBlueButton)); + themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_CHECKTAG, new Class[]{ManageChatTextCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlueIcon)); + + themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{TextCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlueText2)); + themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_BACKGROUNDFILTER, new Class[]{TextCell.class}, new String[]{"imageView"}, null, null, null, Theme.key_switchTrackChecked)); + themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{TextCell.class}, new String[]{"imageView"}, null, null, null, Theme.key_checkboxCheck)); + themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{HeaderCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlueHeader)); + + themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{LinkCell.class}, new String[]{"titleView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); + themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{LinkCell.class}, new String[]{"subtitleView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText)); + themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_IMAGECOLOR, new Class[]{LinkCell.class}, new String[]{"optionsView"}, null, null, null, Theme.key_dialogTextGray3)); + return themeDescriptions; + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/MediaActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/MediaActivity.java index ffd222d2b83..7247a532809 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/MediaActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/MediaActivity.java @@ -786,7 +786,7 @@ protected void dispatchDraw(Canvas canvas) { if (parentLayout != null) { parentLayout.drawHeaderShadow(canvas, actionBar.getMeasuredHeight() + (int) actionBar.getTranslationY()); } - if (fragmentContextView != null && fragmentContextView.getCurrentStyle() == 3) { + if (fragmentContextView != null && fragmentContextView.isCallStyle()) { canvas.save(); canvas.translate(fragmentContextView.getX(), fragmentContextView.getY()); fragmentContextView.setDrawOverlay(true); @@ -798,7 +798,7 @@ protected void dispatchDraw(Canvas canvas) { @Override protected boolean drawChild(Canvas canvas, View child, long drawingTime) { - if (child == fragmentContextView && fragmentContextView.getCurrentStyle() == 3) { + if (child == fragmentContextView && fragmentContextView.isCallStyle()) { return true; } return super.drawChild(canvas, child, drawingTime); @@ -1949,10 +1949,10 @@ private void onItemClick(int index, View view, MessageObject message, int a, int } else if (!cell.isLoading()) { MessageObject messageObject = cell.getMessage(); FileLoader.getInstance(currentAccount).loadFile(document, messageObject, 0, 0); - cell.updateFileExistIcon(); + cell.updateFileExistIcon(true); } else { FileLoader.getInstance(currentAccount).cancelLoadFile(document); - cell.updateFileExistIcon(); + cell.updateFileExistIcon(true); } } } else if (selectedMode == 3) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PeopleNearbyActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PeopleNearbyActivity.java index 6166fc04cb5..3e1bae3af1e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PeopleNearbyActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PeopleNearbyActivity.java @@ -691,7 +691,7 @@ public void didReceivedNotification(int id, int account, Object... args) { if (ChatObject.isNotInChat(chat)) { getMessagesController().deleteDialog(dialogId, 0, revoke); } else { - getMessagesController().deleteUserFromChat((int) -dialogId, getMessagesController().getUser(getUserConfig().getClientUserId()), null, false, revoke); + getMessagesController().deleteUserFromChat((int) -dialogId, getMessagesController().getUser(getUserConfig().getClientUserId()), null, revoke, revoke); } } else { getMessagesController().deleteDialog(dialogId, 0, revoke); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java b/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java index ef530ad7d7b..1ca0175c9e2 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java @@ -21,6 +21,7 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; +import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.graphics.Bitmap; @@ -96,6 +97,7 @@ import android.view.KeyEvent; import android.view.Menu; import android.view.MotionEvent; +import android.view.OrientationEventListener; import android.view.Surface; import android.view.TextureView; import android.view.VelocityTracker; @@ -433,6 +435,7 @@ public void run() { private int[] videoPlayerCurrentTime = new int[2]; private int[] videoPlayerTotalTime = new int[2]; private SimpleTextView videoPlayerTime; + private ImageView exitFullscreenButton; private VideoPlayerSeekBar videoPlayerSeekbar; private View videoPlayerSeekbarView; private VideoSeekPreviewImage videoPreviewFrame; @@ -442,6 +445,8 @@ public void run() { private int waitingForDraw; private TextureView changedTextureView; private ImageView textureImageView; + private ImageView[] fullscreenButton = new ImageView[3]; + private boolean allowShowFullscreenButton; private int[] pipPosition = new int[2]; private boolean pipAnimationInProgress; private Bitmap currentBitmap; @@ -462,6 +467,11 @@ public void run() { private StickersAlert masksAlert; private int lastImageId = -1; + private OrientationEventListener orientationEventListener; + private int prevOrientation = -10; + private int fullscreenedByButton; + private boolean wasRotated; + private int keyboardSize; private float currentPanTranslationY; @@ -1884,6 +1894,18 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { lp.bottomMargin = bottomLayoutHeight; measureChildWithMargins(groupedPhotosListView, widthMeasureSpec, 0, heightMeasureSpec, 0); groupedPhotosHeight = groupedPhotosListView.getMeasuredHeight(); + + ignoreLayout = true; + if (!AndroidUtilities.isTablet() && heightSize < widthSize) { + if (groupedPhotosListView.getVisibility() != INVISIBLE) { + groupedPhotosListView.setVisibility(INVISIBLE); + } + } else { + if (groupedPhotosListView.getVisibility() != VISIBLE) { + groupedPhotosListView.setVisibility(VISIBLE); + } + } + ignoreLayout = false; } else { groupedPhotosHeight = 0; } @@ -1933,7 +1955,7 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (captionAbove) { bottomMargin += groupedPhotosHeight; } - } else if (groupedPhotosListView.hasPhotos()) { + } else if (groupedPhotosListView.hasPhotos() && (AndroidUtilities.isTablet() || heightSize > widthSize)) { bottomMargin += groupedPhotosHeight; captionAbove = true; } else { @@ -2127,7 +2149,7 @@ public int getBottomOffset() { if (bottomLayout != null && bottomLayout.getVisibility() == VISIBLE) { offset += bottomLayout.getHeight(); } - if (groupedPhotosListView != null && groupedPhotosListView.hasPhotos()) { + if (groupedPhotosListView != null && groupedPhotosListView.hasPhotos() && (AndroidUtilities.isTablet() || containerView.getMeasuredHeight() > containerView.getMeasuredWidth())) { offset += groupedPhotosListView.getHeight(); } return offset; @@ -2207,6 +2229,21 @@ public boolean onTouchEvent(MotionEvent event) { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int extraWidth; + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) videoPlayerTime.getLayoutParams(); + if (containerView.getMeasuredWidth() > containerView.getMeasuredHeight()) { + if (exitFullscreenButton.getVisibility() != VISIBLE) { + exitFullscreenButton.setVisibility(VISIBLE); + } + extraWidth = AndroidUtilities.dp(48); + layoutParams.rightMargin = AndroidUtilities.dp(47); + } else { + if (exitFullscreenButton.getVisibility() != INVISIBLE) { + exitFullscreenButton.setVisibility(INVISIBLE); + } + extraWidth = 0; + layoutParams.rightMargin = AndroidUtilities.dp(12); + } super.onMeasure(widthMeasureSpec, heightMeasureSpec); long duration; if (videoPlayer != null) { @@ -2219,7 +2256,7 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { } duration /= 1000; int size = (int) Math.ceil(videoPlayerTime.getPaint().measureText(String.format(Locale.ROOT, "%02d:%02d / %02d:%02d", duration / 60, duration % 60, duration / 60, duration % 60))); - videoPlayerSeekbar.setSize(getMeasuredWidth() - AndroidUtilities.dp(2 + 14) - size, getMeasuredHeight()); + videoPlayerSeekbar.setSize(getMeasuredWidth() - AndroidUtilities.dp(2 + 14) - size - extraWidth, getMeasuredHeight()); } @Override @@ -2248,6 +2285,7 @@ public void setProgress(float progress) { private void onProgressChanged(float progress) { videoPlayerTime.setAlpha(progress); + exitFullscreenButton.setAlpha(progress); if (seekBarTransitionEnabled) { videoPlayerTime.setPivotX(videoPlayerTime.getWidth()); videoPlayerTime.setPivotY(videoPlayerTime.getHeight()); @@ -2492,11 +2530,11 @@ public int calculateNewContainerMarginTop(int width, int height) { final Layout layout = textView.getLayout(); final int lineCount = layout.getLineCount(); - if (isLandscape && lineCount <= 3 || !isLandscape && lineCount <= 5) { + if (isLandscape && lineCount <= 2 || !isLandscape && lineCount <= 5) { return height - textView.getMeasuredHeight(); } - int i = Math.min(isLandscape ? 3 : 5, lineCount); + int i = Math.min(isLandscape ? 2 : 5, lineCount); cycle: while (i > 1) { @@ -3373,7 +3411,11 @@ protected void onDraw(Canvas canvas) { AndroidUtilities.runOnUIThread(updateContainerFlagsRunnable, 200); } } - return insets.consumeSystemWindowInsets(); + if (Build.VERSION.SDK_INT >= 30) { + return WindowInsets.CONSUMED; + } else { + return insets.consumeSystemWindowInsets(); + } }); containerView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); } @@ -4062,6 +4104,35 @@ public void onStopScrolling() { } }); + for (int a = 0; a < 3; a++) { + fullscreenButton[a] = new ImageView(parentActivity); + fullscreenButton[a].setImageResource(R.drawable.msg_maxvideo); + fullscreenButton[a].setContentDescription(LocaleController.getString("AccSwitchToFullscreen", R.string.AccSwitchToFullscreen)); + fullscreenButton[a].setScaleType(ImageView.ScaleType.CENTER); + fullscreenButton[a].setBackground(Theme.createSelectorDrawable(Theme.ACTION_BAR_WHITE_SELECTOR_COLOR)); + fullscreenButton[a].setVisibility(View.INVISIBLE); + fullscreenButton[a].setAlpha(1.0f); + containerView.addView(fullscreenButton[a], LayoutHelper.createFrame(48, 48)); + fullscreenButton[a].setOnClickListener(v -> { + if (parentActivity == null) { + return; + } + wasRotated = false; + fullscreenedByButton = 1; + if (prevOrientation == -10) { + prevOrientation = parentActivity.getRequestedOrientation(); + } + WindowManager manager = (WindowManager) parentActivity.getSystemService(Activity.WINDOW_SERVICE); + int displayRotation = manager.getDefaultDisplay().getRotation(); + if (displayRotation == Surface.ROTATION_270) { + parentActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); + } else { + parentActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); + } + toggleActionBar(false, false); + }); + } + final LinkMovementMethod captionLinkMovementMethod = new CaptionLinkMovementMethod(); captionTextViewSwitcher = new CaptionTextViewSwitcher(containerView.getContext()); captionTextViewSwitcher.setFactory(() -> createCaptionTextView(captionLinkMovementMethod)); @@ -5934,6 +6005,25 @@ public void setVisibility(int visibility) { videoPlayerTime.setTextSize(14); videoPlayerTime.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO); videoPlayerControlFrameLayout.addView(videoPlayerTime, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.RIGHT | Gravity.TOP, 0, 15, 12, 0)); + + exitFullscreenButton = new ImageView(containerView.getContext()); + exitFullscreenButton.setImageResource(R.drawable.msg_minvideo); + exitFullscreenButton.setContentDescription(LocaleController.getString("AccExitFullscreen", R.string.AccExitFullscreen)); + exitFullscreenButton.setScaleType(ImageView.ScaleType.CENTER); + exitFullscreenButton.setBackground(Theme.createSelectorDrawable(Theme.ACTION_BAR_WHITE_SELECTOR_COLOR)); + exitFullscreenButton.setVisibility(View.INVISIBLE); + videoPlayerControlFrameLayout.addView(exitFullscreenButton, LayoutHelper.createFrame(48, 48, Gravity.TOP | Gravity.RIGHT)); + exitFullscreenButton.setOnClickListener(v -> { + if (parentActivity == null) { + return; + } + wasRotated = false; + fullscreenedByButton = 2; + if (prevOrientation == -10) { + prevOrientation = parentActivity.getRequestedOrientation(); + } + parentActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + }); } private void openCaptionEnter() { @@ -6458,6 +6548,45 @@ private void preparePlayer(Uri uri, boolean playWhenReady, boolean preview, Medi textureImageView.setVisibility(View.INVISIBLE); containerView.addView(textureImageView); } + checkFullscreenButton(); + + if (orientationEventListener == null) { + orientationEventListener = new OrientationEventListener(ApplicationLoader.applicationContext) { + @Override + public void onOrientationChanged(int orientation) { + if (orientationEventListener == null || aspectRatioFrameLayout == null || aspectRatioFrameLayout.getVisibility() != View.VISIBLE) { + return; + } + if (parentActivity != null && fullscreenedByButton != 0) { + if (fullscreenedByButton == 1) { + if (orientation >= 270 - 30 && orientation <= 270 + 30) { + wasRotated = true; + } else if (wasRotated && (orientation >= 330 || orientation <= 30)) { + parentActivity.setRequestedOrientation(prevOrientation); + fullscreenedByButton = 0; + wasRotated = false; + } + } else { + if (orientation >= 330 || orientation <= 30) { + wasRotated = true; + } else if (wasRotated && (orientation >= 270 - 30 && orientation <= 270 + 30)) { + parentActivity.setRequestedOrientation(prevOrientation); + fullscreenedByButton = 0; + wasRotated = false; + } + } + } + } + }; + + if (orientationEventListener.canDetectOrientation()) { + orientationEventListener.enable(); + } else { + orientationEventListener.disable(); + orientationEventListener = null; + } + } + textureUploaded = false; videoSizeSet = false; videoCrossfadeStarted = false; @@ -6722,6 +6851,56 @@ public void onAnimationEnd(Animator animation) { inPreview = preview; } + private void checkFullscreenButton() { + if (imagesArr.isEmpty()) { + for (int b = 0; b < 3; b++) { + fullscreenButton[b].setVisibility(View.INVISIBLE); + } + return; + } + for (int b = 0; b < 3; b++) { + int index = currentIndex; + if (b == 1) { + index += 1; + } else if (b == 2) { + index -= 1; + } + if (index < 0 || index >= imagesArr.size()) { + fullscreenButton[b].setVisibility(View.INVISIBLE); + continue; + } + MessageObject messageObject = imagesArr.get(index); + if (!messageObject.isVideo()) { + fullscreenButton[b].setVisibility(View.INVISIBLE); + continue; + } + int w = b == 0 && videoTextureView != null ? videoTextureView.getMeasuredWidth() : 0; + int h = b == 0 && videoTextureView != null ? videoTextureView.getMeasuredHeight() : 0; + TLRPC.Document document = messageObject.getDocument(); + for (int a = 0, N = document.attributes.size(); a < N; a++) { + TLRPC.DocumentAttribute attribute = document.attributes.get(a); + if (attribute instanceof TLRPC.TL_documentAttributeVideo) { + w = attribute.w; + h = attribute.h; + break; + } + } + if (containerView.getMeasuredHeight() > containerView.getMeasuredWidth() && !(videoTextureView instanceof VideoEditTextureView) && w > h) { + if (fullscreenButton[b].getVisibility() != View.VISIBLE) { + fullscreenButton[b].setVisibility(View.VISIBLE); + } + float scale = w / (float) containerView.getMeasuredWidth(); + int height = (int) (h / scale); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) fullscreenButton[b].getLayoutParams(); + layoutParams.topMargin = (containerView.getMeasuredHeight() + height) / 2 - AndroidUtilities.dp(48); + } else { + if (fullscreenButton[b].getVisibility() != View.INVISIBLE) { + fullscreenButton[b].setVisibility(View.INVISIBLE); + } + } + } + } + private void createVideoTextureView(MediaController.SavedFilterState savedFilterState) { if (videoTextureView != null) { return; @@ -6740,6 +6919,7 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { } else { videoTextureView.setPivotX(0); } + checkFullscreenButton(); } }; aspectRatioFrameLayout.setVisibility(View.INVISIBLE); @@ -6787,6 +6967,12 @@ private void releasePlayer(boolean onClose) { } else { playerWasPlaying = false; } + + if (orientationEventListener != null) { + orientationEventListener.disable(); + orientationEventListener = null; + } + videoPreviewFrame.close(); toggleMiniProgress(false, false); pipAvailable = false; @@ -8418,6 +8604,17 @@ private void toggleActionBar(final boolean show, final boolean animated, @NonNul } else { actionBar.setTranslationY(0); } + if (allowShowFullscreenButton) { + arrayList.add(ObjectAnimator.ofFloat(fullscreenButton[0], View.ALPHA, show ? 1.0f : 0.0f)); + } + for (int a = 1; a < 3; a++) { + fullscreenButton[a].setTranslationY(show ? 0 : offsetY); + } + if (params.enableTranslationAnimation) { + arrayList.add(ObjectAnimator.ofFloat(fullscreenButton[0], View.TRANSLATION_Y, show ? 0 : offsetY)); + } else { + fullscreenButton[0].setTranslationY(0); + } if (bottomLayout != null) { arrayList.add(ObjectAnimator.ofFloat(bottomLayout, View.ALPHA, show ? 1.0f : 0.0f)); if (params.enableTranslationAnimation) { @@ -8484,6 +8681,14 @@ public void onAnimationCancel(Animator animation) { actionBarAnimator.start(); } else { actionBar.setAlpha(show ? 1.0f : 0.0f); + if (fullscreenButton[0].getTranslationX() != 0) { + if (allowShowFullscreenButton) { + fullscreenButton[0].setAlpha(show ? 1.0f : 0.0f); + } + } + for (int a = 0; a < 3; a++) { + fullscreenButton[a].setTranslationY(show ? 0 : offsetY); + } actionBar.setTranslationY(show ? 0 : -offsetY); bottomLayout.setAlpha(show ? 1.0f : 0.0f); bottomLayout.setTranslationY(show ? 0 : offsetY); @@ -9228,6 +9433,7 @@ private void onPhotoShow(final MessageObject messageObject, final TLRPC.FileLoca timeItem.setVisibility(View.VISIBLE); } } + checkFullscreenButton(); } private boolean canSendMediaToParentChatActivity() { @@ -9314,7 +9520,9 @@ private void setIsAboutToSwitchToIndex(int index, boolean init, boolean animateC if (nameOverride != null) { nameTextView.setText(nameOverride); } else { - if (newMessageObject.isFromUser()) { + if (newMessageObject.messageOwner.fwd_from != null && newMessageObject.messageOwner.fwd_from.from_name != null) { + nameTextView.setText(newMessageObject.messageOwner.fwd_from.from_name, animated); + } else if (newMessageObject.isFromUser()) { TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(newMessageObject.messageOwner.from_id.user_id); if (user != null) { nameTextView.setText(UserObject.getUserName(user), animated); @@ -10008,6 +10216,12 @@ private void setImageIndex(int index, boolean init, boolean animateCaption) { PhotoProgressView tempProgress = photoProgressViews[0]; photoProgressViews[0] = photoProgressViews[2]; photoProgressViews[2] = tempProgress; + + ImageView tmp = fullscreenButton[0]; + fullscreenButton[0] = fullscreenButton[2]; + fullscreenButton[2] = tmp; + fullscreenButton[0].setTranslationY(tmp.getTranslationY()); + setIndexToImage(leftImage, currentIndex - 1); updateAccessibilityOverlayVisibility(); @@ -10022,6 +10236,12 @@ private void setImageIndex(int index, boolean init, boolean animateCaption) { PhotoProgressView tempProgress = photoProgressViews[0]; photoProgressViews[0] = photoProgressViews[1]; photoProgressViews[1] = tempProgress; + + ImageView tmp = fullscreenButton[0]; + fullscreenButton[0] = fullscreenButton[1]; + fullscreenButton[1] = tmp; + fullscreenButton[0].setTranslationY(tmp.getTranslationY()); + setIndexToImage(rightImage, currentIndex + 1); updateAccessibilityOverlayVisibility(); @@ -11130,6 +11350,7 @@ public boolean openPhoto(final MessageObject messageObject, final TLRPC.FileLoca } doneButtonPressed = false; + allowShowFullscreenButton = true; parentChatActivity = chatActivity; actionBar.setTitle(LocaleController.formatString("Of", R.string.Of, 1, 1)); @@ -11541,6 +11762,11 @@ public void closePhoto(boolean animated, boolean fromEditMode) { if (captionEditText.hideActionMode() && !fromEditMode) { return; } + if (parentActivity != null && fullscreenedByButton != 0) { + parentActivity.setRequestedOrientation(prevOrientation); + fullscreenedByButton = 0; + wasRotated = false; + } if (!doneButtonPressed && !imagesArrLocals.isEmpty() && currentIndex >= 0 && currentIndex < imagesArrLocals.size()) { Object entry = imagesArrLocals.get(currentIndex); if (entry instanceof MediaController.MediaEditState) { @@ -12630,6 +12856,20 @@ private void onDraw(Canvas canvas) { } } + if (isActionBarVisible) { + if (scale <= 1.0001f) { + if (!allowShowFullscreenButton) { + fullscreenButton[0].animate().alpha(1.0f).setDuration(120).start(); + allowShowFullscreenButton = true; + } + } else { + if (allowShowFullscreenButton) { + fullscreenButton[0].animate().alpha(0.0f).setDuration(120).start(); + allowShowFullscreenButton = false; + } + } + } + int containerWidth = getContainerViewWidth(); int containerHeight = getContainerViewHeight(); if (animationInProgress != 2 && !pipAnimationInProgress && !isInline) { @@ -12655,6 +12895,18 @@ private void onDraw(Canvas canvas) { changingPage = sideImage != null; } + for (int a = 0; a < 3; a++) { + float offsetX; + if (a == 1) { + offsetX = 0; + } else if (a == 2) { + offsetX = -containerView.getMeasuredWidth() - AndroidUtilities.dp(15) + (currentTranslationX - maxX); + } else { + offsetX = currentTranslationX < minX ? (currentTranslationX - minX) : 0; + } + fullscreenButton[a].setTranslationX(offsetX + containerView.getMeasuredWidth() - AndroidUtilities.dp(48)); + } + if (sideImage == rightImage) { float translateX = currentTranslationX; float scaleDiff = 0; @@ -12682,6 +12934,7 @@ private void onDraw(Canvas canvas) { sideImage.setAlpha(alpha); sideImage.setImageCoords(-width / 2, -height / 2, width, height); sideImage.draw(canvas); + canvas.restore(); } groupedPhotosListView.setMoveProgress(-alpha); @@ -12692,7 +12945,16 @@ private void onDraw(Canvas canvas) { photoProgressViews[1].setScale(1.0f - scaleDiff); photoProgressViews[1].setAlpha(alpha); photoProgressViews[1].onDraw(canvas); + + if (isActionBarVisible) { + fullscreenButton[1].setAlpha(alpha); + } + canvas.restore(); + } else { + if (isActionBarVisible) { + fullscreenButton[1].setAlpha(0.0f); + } } float translateX = currentTranslationX; @@ -12971,6 +13233,11 @@ private void onDraw(Canvas canvas) { photoProgressViews[0].setScale(1.0f - scaleDiff); photoProgressViews[0].setAlpha(progressAlpha); photoProgressViews[0].onDraw(canvas); + + if (isActionBarVisible && allowShowFullscreenButton) { + fullscreenButton[0].setAlpha(alpha); + } + canvas.restore(); } if (drawMiniProgress && !pipAnimationInProgress) { @@ -12997,6 +13264,7 @@ private void onDraw(Canvas canvas) { sideImage.setAlpha(1.0f); sideImage.setImageCoords(-width / 2, -height / 2, width, height); sideImage.draw(canvas); + canvas.restore(); } groupedPhotosListView.setMoveProgress(1.0f - alpha); @@ -13007,7 +13275,15 @@ private void onDraw(Canvas canvas) { photoProgressViews[2].setScale(1.0f); photoProgressViews[2].setAlpha(1.0f); photoProgressViews[2].onDraw(canvas); + + if (isActionBarVisible) { + fullscreenButton[2].setAlpha(1.0f); + } canvas.restore(); + } else { + if (isActionBarVisible) { + fullscreenButton[2].setAlpha(0.0f); + } } if (waitingForDraw != 0) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java index 629b6a3cab2..b177ca6d5dd 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java @@ -35,6 +35,7 @@ import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Typeface; +import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; import android.net.Uri; @@ -139,7 +140,6 @@ import org.telegram.ui.Components.AvatarDrawable; import org.telegram.ui.Components.BackupImageView; import org.telegram.ui.Components.BulletinFactory; -import org.telegram.ui.Components.ChatGreetingsView; import org.telegram.ui.Components.CombinedDrawable; import org.telegram.ui.Components.CrossfadeDrawable; import org.telegram.ui.Components.CubicBezierInterpolator; @@ -164,7 +164,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashSet; import java.util.Locale; import java.util.Random; @@ -396,6 +398,8 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. private int transitionIndex; private TLRPC.Document preloadedSticker; + private ArrayList chatParticipants = new ArrayList<>(); + private int usersForceShowingIn = 0; private final Property HEADER_SHADOW = new AnimationProperties.FloatProperty("headerShadow") { @Override @@ -1357,15 +1361,12 @@ public boolean onFragmentCreate() { private void preloadGreetingsSticker() { TLRPC.TL_messages_getStickers req = new TLRPC.TL_messages_getStickers(); req.emoticon = "\uD83D\uDC4B" + Emoji.fixEmoji("⭐"); - ConnectionsManager.getInstance(UserConfig.selectedAccount).sendRequest(req, (response, error) -> { + getConnectionsManager().sendRequest(req, (response, error) -> { if (response instanceof TLRPC.TL_messages_stickers) { ArrayList list = ((TLRPC.TL_messages_stickers) response).stickers; if (!list.isEmpty()) { TLRPC.Document sticker = list.get(Math.abs(new Random().nextInt() % list.size())); - AndroidUtilities.runOnUIThread(() -> { - ImageReceiver receiver = new ImageReceiver(); - receiver.setImage(ImageLocation.getForDocument(sticker), ChatGreetingsView.createFilter(sticker), null, null, sticker, 0); - }); + AndroidUtilities.runOnUIThread(() -> FileLoader.getInstance(currentAccount).loadFile(ImageLocation.getForDocument(sticker), sticker, null, 0, 1)); preloadedSticker = sticker; } } @@ -1635,7 +1636,12 @@ public void onItemClick(final int id) { VoIPHelper.startCall(user, id == video_call_item, userInfo != null && userInfo.video_calls_available, getParentActivity(), userInfo); } } else if (chat_id != 0) { - VoIPHelper.showGroupCallAlert(ProfileActivity.this, currentChat, false); + ChatObject.Call call = getMessagesController().getGroupCall(chat_id, false); + if (call == null) { + VoIPHelper.showGroupCallAlert(ProfileActivity.this, currentChat, false); + } else { + VoIPHelper.startCall(currentChat, false, getParentActivity()); + } } } else if (id == search_members) { Bundle args = new Bundle(); @@ -1888,8 +1894,13 @@ public void onTextChanged(EditText editText) { videoCallItem = menu.addItem(video_call_item, R.drawable.profile_video); videoCallItem.setContentDescription(LocaleController.getString("VideoCall", R.string.VideoCall)); - callItem = menu.addItem(call_item, R.drawable.ic_call); - callItem.setContentDescription(LocaleController.getString("Call", R.string.Call)); + if (chat_id != 0) { + callItem = menu.addItem(call_item, R.drawable.msg_voicechat2); + callItem.setContentDescription(LocaleController.getString("VoipGroupVoiceChat", R.string.VoipGroupVoiceChat)); + } else { + callItem = menu.addItem(call_item, R.drawable.ic_call); + callItem.setContentDescription(LocaleController.getString("Call", R.string.Call)); + } editItem = menu.addItem(edit_channel, R.drawable.group_edit_profile); editItem.setContentDescription(LocaleController.getString("Edit", R.string.Edit)); otherItem = menu.addItem(10, R.drawable.ic_ab_other); @@ -1971,7 +1982,7 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { } } } - if (firstLayout && (expandPhoto || openAnimationInProgress && playProfileAnimation == 2)) { + if (!fragmentOpened && (expandPhoto || openAnimationInProgress && playProfileAnimation == 2)) { ignoreLayout = true; if (expandPhoto) { @@ -2113,9 +2124,13 @@ public void requestLayout() { } super.requestLayout(); } - + + private final ArrayList sortedChildren = new ArrayList<>(); + private final Comparator viewComparator = (view, view2) -> (int) (view.getY() - view2.getY()); + + @Override - public void onDraw(Canvas c) { + protected void dispatchDraw(Canvas canvas) { whitePaint.setColor(Theme.getColor(Theme.key_windowBackgroundWhite)); if (listView.getVisibility() == VISIBLE) { grayPaint.setColor(Theme.getColor(Theme.key_windowBackgroundGray)); @@ -2126,57 +2141,65 @@ public void onDraw(Canvas c) { grayPaint.setAlpha((int) (255 * listView.getAlpha())); } - float minBottom = listView.getY(); - float minTop = 0; int count = listView.getChildCount(); - boolean animationIsRunning = listView.getItemAnimator().isRunning(); - if (animationIsRunning) { - c.drawRect(listView.getX(), listView.getY(), listView.getX() + listView.getMeasuredWidth(), listView.getY() + listView.getMeasuredHeight(), grayPaint); + sortedChildren.clear(); + for (int i = 0; i < count; i++) { + View child = listView.getChildAt(i); + if (listView.getChildAdapterPosition(child) != RecyclerView.NO_POSITION) { + sortedChildren.add(listView.getChildAt(i)); + } } - for (int a = 0; a <= count; a++) { - if (a < count) { - View child = listView.getChildAt(a); - float top = listView.getY() + child.getY(); - float bottom = listView.getY() + child.getY() + child.getMeasuredHeight(); - if (top < minTop || minTop == 0) { - minTop = top; - } - if (child.getBackground() != null) { - if (!animationIsRunning) { - c.drawRect(listView.getX(), top, listView.getX() + listView.getMeasuredWidth(), bottom, grayPaint); - } - } else if (!(animationIsRunning && child.getY() == 0)) { - boolean useAlpha = listView.getChildAdapterPosition(child) == sharedMediaRow && child.getAlpha() != 1f; - if (useAlpha) { - whitePaint.setAlpha((int) (255 * listView.getAlpha() * child.getAlpha())); - } - c.drawRect(listView.getX(), top, listView.getX() + listView.getMeasuredWidth(), bottom, whitePaint); - if (useAlpha) { - whitePaint.setAlpha((int) (255 * listView.getAlpha())); - } - } - - if (bottom > minBottom) { - minBottom = bottom; + Collections.sort(sortedChildren, viewComparator); + boolean hasBackground = false; + float lastY = listView.getY(); + count = sortedChildren.size(); + if (!openAnimationInProgress && count > 0) { + lastY += sortedChildren.get(0).getY(); + } + float alpha = 1f; + for (int i = 0; i < count; i++) { + View child = sortedChildren.get(i); + boolean currentHasBackground = child.getBackground() != null; + int currentY = (int) (listView.getY() + child.getY()); + if (hasBackground == currentHasBackground) { + if (child.getAlpha() == 1f) { + alpha = 1f; } + continue; + } + if (hasBackground) { + canvas.drawRect(listView.getX(), lastY, listView.getX() + listView.getMeasuredWidth(), currentY, grayPaint); } else { - if (openAnimationInProgress || searchViewTransition != null) { - c.drawRect(listView.getX(), listView.getY(), listView.getX() + listView.getMeasuredWidth(), minTop, whitePaint); + if (alpha != 1f) { + canvas.drawRect(listView.getX(), lastY, listView.getX() + listView.getMeasuredWidth(), currentY, grayPaint); + whitePaint.setAlpha((int) (255 * alpha)); + canvas.drawRect(listView.getX(), lastY, listView.getX() + listView.getMeasuredWidth(), currentY, whitePaint); + whitePaint.setAlpha(255); + } else { + canvas.drawRect(listView.getX(), lastY, listView.getX() + listView.getMeasuredWidth(), currentY, whitePaint); } + } + hasBackground = currentHasBackground; + lastY = currentY; + alpha = child.getAlpha(); + } - if (minBottom < listView.getBottom()) { - c.drawRect(listView.getX(), minBottom, listView.getX() + listView.getMeasuredWidth(), listView.getBottom(), grayPaint); - } + if (hasBackground) { + canvas.drawRect(listView.getX(), lastY, listView.getX() + listView.getMeasuredWidth(), listView.getBottom(), grayPaint); + } else { + if (alpha != 1f) { + canvas.drawRect(listView.getX(), lastY, listView.getX() + listView.getMeasuredWidth(), listView.getBottom(), grayPaint); + whitePaint.setAlpha((int) (255 * alpha)); + canvas.drawRect(listView.getX(), lastY, listView.getX() + listView.getMeasuredWidth(), listView.getBottom(), whitePaint); + whitePaint.setAlpha(255); + } else { + canvas.drawRect(listView.getX(), lastY, listView.getX() + listView.getMeasuredWidth(), listView.getBottom(), whitePaint); } } } else { int top = searchListView.getTop(); - c.drawRect(0, top + extraHeight + searchTransitionOffset, getMeasuredWidth(), top + getMeasuredHeight(), whitePaint); + canvas.drawRect(0, top + extraHeight + searchTransitionOffset, getMeasuredWidth(), top + getMeasuredHeight(), whitePaint); } - } - - @Override - protected void dispatchDraw(Canvas canvas) { super.dispatchDraw(canvas); if (profileTransitionInProgress && parentLayout.fragmentsStack.size() > 1) { BaseFragment fragment = parentLayout.fragmentsStack.get(parentLayout.fragmentsStack.size() - 2); @@ -2184,7 +2207,7 @@ protected void dispatchDraw(Canvas canvas) { ChatActivity chatActivity = (ChatActivity) fragment; FragmentContextView fragmentContextView = chatActivity.getFragmentContextView(); - if (fragmentContextView != null && fragmentContextView.getCurrentStyle() == 3) { + if (fragmentContextView != null && fragmentContextView.isCallStyle()) { float progress = extraHeight / AndroidUtilities.dpf2(fragmentContextView.getStyleHeight()); if (progress > 1f) { progress = 1f; @@ -2284,20 +2307,18 @@ public boolean drawChild(Canvas canvas, View child, long drawingTime) { } } return super.drawChild(canvas, child, drawingTime); - } }; listView.setVerticalScrollBarEnabled(false); DefaultItemAnimator defaultItemAnimator = new DefaultItemAnimator() { int animationIndex = -1; - int account; -// -// @Override -// protected void onAllAnimationsDone() { -// super.onAllAnimationsDone(); -// getNotificationCenter().onAnimationFinish(animationIndex); -// } + + @Override + protected void onAllAnimationsDone() { + super.onAllAnimationsDone(); + getNotificationCenter().onAnimationFinish(animationIndex); + } @Override public void runPendingAnimations() { @@ -2310,7 +2331,7 @@ public void runPendingAnimations() { valueAnimator.addUpdateListener(valueAnimator1 -> listView.invalidate()); valueAnimator.setDuration(getMoveDuration()); valueAnimator.start(); - //animationIndex = getNotificationCenter().setAnimationInProgress(animationIndex, null); + animationIndex = getNotificationCenter().setAnimationInProgress(animationIndex, null); } super.runPendingAnimations(); } @@ -2969,6 +2990,7 @@ protected TextView createTextView() { if (user_id != 0) { if (imageUpdater != null) { writeButton.setImageResource(R.drawable.menu_camera2); + writeButton.setContentDescription(LocaleController.getString("AccDescrChangeProfilePicture", R.string.AccDescrChangeProfilePicture)); writeButton.setPadding(AndroidUtilities.dp(2), AndroidUtilities.dp(2), 0, 0); } else { @@ -3196,7 +3218,9 @@ private void onWriteButtonClick() { if (user == null) { return; } - imageUpdater.openMenu(user.photo != null && user.photo.photo_big != null && !(user.photo instanceof TLRPC.TL_userProfilePhotoEmpty), () -> MessagesController.getInstance(currentAccount).deleteUserPhoto(null)); + imageUpdater.openMenu(user.photo != null && user.photo.photo_big != null && !(user.photo instanceof TLRPC.TL_userProfilePhotoEmpty), () -> MessagesController.getInstance(currentAccount).deleteUserPhoto(null), dialog -> { + + }); } else { if (playProfileAnimation != 0 && parentLayout.fragmentsStack.get(parentLayout.fragmentsStack.size() - 2) instanceof ChatActivity) { finishFragment(); @@ -3219,7 +3243,7 @@ private void onWriteButtonClick() { args.putInt("nearby_distance", distance); } ChatActivity chatActivity = new ChatActivity(args); - chatActivity.setPreloadedSticker(preloadedSticker); + chatActivity.setPreloadedSticker(preloadedSticker, false); presentFragment(chatActivity, true); if (AndroidUtilities.isTablet()) { finishFragment(); @@ -3320,7 +3344,7 @@ public boolean onMemberClick(TLRPC.ChatParticipant participant, boolean isLong, AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); builder.setItems(items.toArray(new CharSequence[0]), AndroidUtilities.toIntArray(icons), (dialogInterface, i) -> { if (actions.get(i) == 2) { - kickUser(selectedUser); + kickUser(selectedUser, participant); } else { int action = actions.get(i); if (action == 1 && (channelParticipant instanceof TLRPC.TL_channelParticipantAdmin || participant instanceof TLRPC.TL_chatParticipantAdmin)) { @@ -3560,7 +3584,7 @@ private boolean processOnClickOrPress(final int position) { } private void leaveChatPressed() { - AlertsCreator.createClearOrDeleteDialogAlert(ProfileActivity.this, false, currentChat, null, false, (param) -> { + AlertsCreator.createClearOrDeleteDialogAlert(ProfileActivity.this, false, currentChat, null, false, true, (param) -> { playProfileAnimation = 0; getNotificationCenter().removeObserver(ProfileActivity.this, NotificationCenter.closeChats); getNotificationCenter().postNotificationName(NotificationCenter.closeChats); @@ -3609,12 +3633,8 @@ private void getChannelParticipants(boolean reload) { } } } - updateOnlineCount(); loadingUsers = false; - updateRowsIds(); - if (listAdapter != null) { - listAdapter.notifyDataSetChanged(); - } + updateListAnimated(true); }, delay)); getConnectionsManager().bindRequestToGuid(reqId, classGuid); } @@ -3667,7 +3687,7 @@ public void setValue(ActionBar object, float value) { verifiedCheckDrawable.setColorFilter(AndroidUtilities.getOffsetColor(color1, color2, value, 1.0f), PorterDuff.Mode.MULTIPLY); } - if (avatarsViewPagerIndicatorView.getSecondaryMenuItem() != null && videoCallItemVisible) { + if (avatarsViewPagerIndicatorView.getSecondaryMenuItem() != null && (videoCallItemVisible || editItemVisible || callItemVisible)) { needLayoutText(Math.min(1f, extraHeight / AndroidUtilities.dp(88f))); } } @@ -3786,10 +3806,27 @@ private void openAddMember() { fragment.setIgnoreUsers(users); } fragment.setDelegate((users, fwdCount) -> { + HashSet currentParticipants = new HashSet<>(); + if (chatInfo.participants.participants != null) { + for (int i = 0; i < chatInfo.participants.participants.size(); i++) { + currentParticipants.add(chatInfo.participants.participants.get(i).user_id); + } + } for (int a = 0, N = users.size(); a < N; a++) { TLRPC.User user = users.get(a); getMessagesController().addUserToChat(chat_id, user, fwdCount, null, ProfileActivity.this, null); + if (!currentParticipants.contains(user.id)) { + if (chatInfo.participants == null) { + chatInfo.participants = new TLRPC.TL_chatParticipants(); + } + TLRPC.ChatParticipant participant = new TLRPC.TL_chatParticipant(); + participant.user_id = user.id; + participant.inviter_id = getAccountInstance().getUserConfig().clientUserId; + chatInfo.participants.participants.add(participant); + getMessagesController().putUser(user, false); + } } + updateListAnimated(true); }); presentFragment(fragment); } @@ -4197,7 +4234,7 @@ private void needLayoutText(float diff) { int viewWidth = AndroidUtilities.isTablet() ? AndroidUtilities.dp(490) : AndroidUtilities.displaySize.x; ActionBarMenuItem item = avatarsViewPagerIndicatorView.getSecondaryMenuItem(); - int buttonsWidth = AndroidUtilities.dp(118 + 8 + (40 + (item != null ? 48 * (1.0f - mediaHeaderAnimationProgress) : 0) + (videoCallItemVisible ? 48 * (1.0f - mediaHeaderAnimationProgress) : 0))); + int buttonsWidth = AndroidUtilities.dp(118 + 8 + (40 + (item != null ? 48 * (1.0f - mediaHeaderAnimationProgress) : 0) + (videoCallItemVisible || chat_id != 0 && callItemVisible ? 48 * (1.0f - mediaHeaderAnimationProgress) : 0))); int minWidth = viewWidth - buttonsWidth; int width = (int) (viewWidth - buttonsWidth * Math.max(0.0f, 1.0f - (diff != 1.0f ? diff * 0.15f / (1.0f - diff) : 1.0f)) - nameTextView[1].getTranslationX()); @@ -4290,12 +4327,13 @@ public void didReceivedNotification(int id, int account, final Object... args) { } } else if (chat_id != 0) { if ((mask & MessagesController.UPDATE_MASK_CHAT) != 0 || (mask & MessagesController.UPDATE_MASK_CHAT_AVATAR) != 0 || (mask & MessagesController.UPDATE_MASK_CHAT_NAME) != 0 || (mask & MessagesController.UPDATE_MASK_CHAT_MEMBERS) != 0 || (mask & MessagesController.UPDATE_MASK_STATUS) != 0) { - updateOnlineCount(); + if ((mask & MessagesController.UPDATE_MASK_CHAT) != 0) { + updateListAnimated(true); + } else { + updateOnlineCount(); + } updateProfileData(); } - if ((mask & MessagesController.UPDATE_MASK_CHAT) != 0) { - updateListAnimated(); - } if (infoChanged) { if (listView != null) { int count = listView.getChildCount(); @@ -4333,14 +4371,14 @@ public void didReceivedNotification(int id, int account, final Object... args) { TLRPC.EncryptedChat chat = (TLRPC.EncryptedChat) args[0]; if (currentEncryptedChat != null && chat.id == currentEncryptedChat.id) { currentEncryptedChat = chat; - updateListAnimated(); + updateListAnimated(false); } } else if (id == NotificationCenter.blockedUsersDidLoad) { boolean oldValue = userBlocked; userBlocked = getMessagesController().blockePeers.indexOfKey(user_id) >= 0; if (oldValue != userBlocked) { createActionBarMenu(true); - updateListAnimated(); + updateListAnimated(false); } } else if (id == NotificationCenter.groupCallUpdated) { Integer chatId = (Integer) args[0]; @@ -4369,11 +4407,10 @@ public void didReceivedNotification(int id, int account, final Object... args) { getMediaDataController().getMediaCount(mergeDialogId, MediaDataController.MEDIA_PHOTOVIDEO, classGuid, true); } fetchUsersFromChannelInfo(); - updateOnlineCount(); if (avatarsViewPager != null) { avatarsViewPager.setChatInfo(chatInfo); } - updateListAnimated(); + updateListAnimated(true); TLRPC.Chat newChat = getMessagesController().getChat(chat_id); if (newChat != null) { currentChat = newChat; @@ -4389,7 +4426,7 @@ public void didReceivedNotification(int id, int account, final Object... args) { TLRPC.BotInfo info = (TLRPC.BotInfo) args[0]; if (info.user_id == user_id) { botInfo = info; - updateListAnimated(); + updateListAnimated(false); } } else if (id == NotificationCenter.userInfoDidLoad) { int uid = (Integer) args[0]; @@ -4405,7 +4442,7 @@ public void didReceivedNotification(int id, int account, final Object... args) { } else { recreateMenuAfterAnimation = true; } - updateListAnimated(); + updateListAnimated(false); sharedMediaLayout.setCommonGroupsCount(userInfo.common_chats_count); updateSelectedMediaTabText(); if (sharedMediaPreloader == null || sharedMediaPreloader.isMediaWasLoaded()) { @@ -4538,7 +4575,7 @@ private void updateSharedMediaRows() { if (listAdapter == null) { return; } - updateListAnimated(); + updateListAnimated(false); } public boolean isFragmentOpened; @@ -4884,7 +4921,7 @@ private void updateOnlineCount() { if (listAdapter != null && membersStartRow > 0) { listAdapter.notifyItemRangeChanged(membersStartRow, sortedUsers.size()); } - if (sharedMediaLayout != null && sharedMediaRow != -1 && sortedUsers.size() > 5) { + if (sharedMediaLayout != null && sharedMediaRow != -1 && (sortedUsers.size() > 5 || usersForceShowingIn == 2) && usersForceShowingIn != 1) { sharedMediaLayout.setChatUsers(sortedUsers, chatInfo); } } else if (chatInfo instanceof TLRPC.TL_channelFull && chatInfo.participants_count > 200) { @@ -4927,13 +4964,16 @@ private void fetchUsersFromChannelInfo() { } } - private void kickUser(int uid) { + private void kickUser(int uid, TLRPC.ChatParticipant participant) { if (uid != 0) { TLRPC.User user = getMessagesController().getUser(uid); getMessagesController().deleteUserFromChat(chat_id, user, chatInfo); if (currentChat != null && user != null && BulletinFactory.canShowBulletin(this)) { BulletinFactory.createRemoveFromChatBulletin(this, user.first_name, currentChat.title).show(); } + if (chatInfo.participants.participants.remove(participant)) { + updateListAnimated(true); + } } else { getNotificationCenter().removeObserver(this, NotificationCenter.closeChats); if (AndroidUtilities.isTablet()) { @@ -5012,6 +5052,7 @@ private void updateRowsIds() { unblockRow = -1; joinRow = -1; lastSectionRow = -1; + chatParticipants.clear(); boolean hasMedia = false; if (sharedMediaPreloader != null) { @@ -5152,14 +5193,16 @@ private void updateRowsIds() { addMemberRow = rowCount++; } int count = chatInfo.participants.participants.size(); - if (count <= 5 || !hasMedia) { + if ((count <= 5 || !hasMedia || usersForceShowingIn == 1) && usersForceShowingIn != 2) { if (addMemberRow == -1) { membersHeaderRow = rowCount++; } membersStartRow = rowCount; - rowCount += chatInfo.participants.participants.size(); + rowCount += count; membersEndRow = rowCount; membersSectionRow = rowCount++; + chatParticipants.addAll(chatInfo.participants.participants); + usersForceShowingIn = 1; if (sharedMediaLayout != null) { sharedMediaLayout.setChatUsers(null, null); } @@ -5168,6 +5211,9 @@ private void updateRowsIds() { membersSectionRow = rowCount++; } if (sharedMediaLayout != null) { + if (!sortedUsers.isEmpty()) { + usersForceShowingIn = 2; + } sharedMediaLayout.setChatUsers(sortedUsers, chatInfo); } } @@ -5191,6 +5237,7 @@ private void updateRowsIds() { rowCount += chatInfo.participants.participants.size(); membersEndRow = rowCount; membersSectionRow = rowCount++; + chatParticipants.addAll(chatInfo.participants.participants); if (sharedMediaLayout != null) { sharedMediaLayout.setChatUsers(null, null); } @@ -5218,9 +5265,9 @@ private void updateRowsIds() { } } - private Drawable getScamDrawable() { + private Drawable getScamDrawable(int type) { if (scamDrawable == null) { - scamDrawable = new ScamDrawable(11); + scamDrawable = new ScamDrawable(11, type); scamDrawable.setColor(Theme.getColor(Theme.key_avatar_subtitleInProfileBlue)); } return scamDrawable; @@ -5282,8 +5329,7 @@ private void updateProfileData() { avatarImage.setImage(videoLocation, filter, thumbLocation, "50_50", avatarDrawable, user); } if (thumbLocation != null && setAvatarRow != -1 || thumbLocation == null && setAvatarRow == -1) { - int prevValue = setAvatarRow; - updateListAnimated(); + updateListAnimated(false); needLayout(true); } getFileLoader().loadFile(imageLocation, user, null, 0, 1); @@ -5328,13 +5374,13 @@ private void updateProfileData() { Drawable leftIcon = currentEncryptedChat != null ? getLockIconDrawable() : null; Drawable rightIcon = null; if (a == 0) { - if (user.scam) { - rightIcon = getScamDrawable(); + if (user.scam || user.fake) { + rightIcon = getScamDrawable(user.scam ? 0 : 1); } else { rightIcon = getMessagesController().isDialogMuted(dialog_id != 0 ? dialog_id : (long) user_id) ? Theme.chat_muteIconDrawable : null; } - } else if (user.scam) { - rightIcon = getScamDrawable(); + } else if (user.scam || user.fake) { + rightIcon = getScamDrawable(user.scam ? 0 : 1); } else if (user.verified) { rightIcon = getVerifiedCrossfadeDrawable(); } @@ -5425,16 +5471,16 @@ private void updateProfileData() { } nameTextView[a].setLeftDrawable(null); if (a != 0) { - if (chat.scam) { - nameTextView[a].setRightDrawable(getScamDrawable()); + if (chat.scam || chat.fake) { + nameTextView[a].setRightDrawable(getScamDrawable(chat.scam ? 0 : 1)); } else if (chat.verified) { nameTextView[a].setRightDrawable(getVerifiedCrossfadeDrawable()); } else { nameTextView[a].setRightDrawable(null); } } else { - if (chat.scam) { - nameTextView[a].setRightDrawable(getScamDrawable()); + if (chat.scam || chat.fake) { + nameTextView[a].setRightDrawable(getScamDrawable(chat.scam ? 0 : 1)); } else { nameTextView[a].setRightDrawable(getMessagesController().isDialogMuted(-chat_id) ? Theme.chat_muteIconDrawable : null); } @@ -5577,6 +5623,8 @@ private void createActionBarMenu(boolean animated) { if (chatInfo.can_view_stats) { otherItem.addSubItem(statistics, R.drawable.msg_stats, LocaleController.getString("Statistics", R.string.Statistics)); } + ChatObject.Call call = getMessagesController().getGroupCall(chat_id, false); + callItemVisible = call != null; } if (chat.megagroup) { canSearchMembers = true; @@ -5596,9 +5644,13 @@ private void createActionBarMenu(boolean animated) { } } } else { - if (chatInfo != null && ChatObject.canManageCalls(chat) && chatInfo.call == null) { - otherItem.addSubItem(call_item, R.drawable.msg_voicechat, LocaleController.getString("StartVoipChat", R.string.StartVoipChat)); - hasVoiceChatItem = true; + if (chatInfo != null) { + if (ChatObject.canManageCalls(chat) && chatInfo.call == null) { + otherItem.addSubItem(call_item, R.drawable.msg_voicechat, LocaleController.getString("StartVoipChat", R.string.StartVoipChat)); + hasVoiceChatItem = true; + } + ChatObject.Call call = getMessagesController().getGroupCall(chat_id, false); + callItemVisible = call != null; } if (ChatObject.canChangeChatInfo(chat)) { editItemVisible = true; @@ -6298,6 +6350,7 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { } } }; + view.setBackground(new ColorDrawable(Color.TRANSPARENT)); break; } case 13: { @@ -7455,8 +7508,11 @@ public ArrayList getThemeDescriptions() { return arrayList; } - public void updateListAnimated() { + public void updateListAnimated(boolean updateOnlineCount) { if (listAdapter == null) { + if (updateOnlineCount) { + updateOnlineCount(); + } updateRowsIds(); return; } @@ -7464,10 +7520,22 @@ public void updateListAnimated() { DiffCallback diffCallback = new DiffCallback(); diffCallback.oldRowCount = rowCount; diffCallback.fillPositions(diffCallback.oldPositionToItem); + diffCallback.oldChatParticipant.clear(); + diffCallback.oldChatParticipantSorted.clear(); + if (sortedUsers != null) { + diffCallback.oldChatParticipantSorted.addAll(sortedUsers); + } + diffCallback.oldChatParticipant.addAll(chatParticipants); + diffCallback.oldMembersStartRow = membersStartRow; + diffCallback.oldMembersEndRow = membersEndRow; + if (updateOnlineCount) { + updateOnlineCount(); + } updateRowsIds(); diffCallback.fillPositions(diffCallback.newPositionToItem); DiffUtil.calculateDiff(diffCallback).dispatchUpdatesTo(listAdapter); saveScrollPosition(); + AndroidUtilities.updateVisibleRows(listView); } private void saveScrollPosition() { @@ -7493,6 +7561,10 @@ private class DiffCallback extends DiffUtil.Callback { SparseIntArray oldPositionToItem = new SparseIntArray(); SparseIntArray newPositionToItem = new SparseIntArray(); + ArrayList oldChatParticipant = new ArrayList<>(); + ArrayList oldChatParticipantSorted = new ArrayList<>(); + int oldMembersStartRow; + int oldMembersEndRow; @Override public int getOldListSize() { @@ -7506,12 +7578,30 @@ public int getNewListSize() { @Override public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { + if (newItemPosition >= membersStartRow && newItemPosition < membersEndRow) { + if (oldItemPosition >= oldMembersStartRow && oldItemPosition < oldMembersEndRow) { + TLRPC.ChatParticipant oldItem; + TLRPC.ChatParticipant newItem; + if (!oldChatParticipantSorted.isEmpty()) { + oldItem = oldChatParticipant.get(oldChatParticipantSorted.get(oldItemPosition - oldMembersStartRow)); + } else { + oldItem = oldChatParticipant.get(oldItemPosition - oldMembersStartRow); + } + + if (!sortedUsers.isEmpty()) { + newItem = chatParticipants.get(sortedUsers.get(newItemPosition - membersStartRow)); + } else { + newItem = chatParticipants.get(newItemPosition - membersStartRow); + } + return oldItem.user_id == newItem.user_id; + } + } return oldPositionToItem.get(oldItemPosition) == newPositionToItem.get(newItemPosition); } @Override public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { - return oldPositionToItem.get(oldItemPosition) == newPositionToItem.get(newItemPosition); + return areItemsTheSame(oldItemPosition, newItemPosition); } public void fillPositions(SparseIntArray sparseIntArray) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/SecretMediaViewer.java b/TMessagesProj/src/main/java/org/telegram/ui/SecretMediaViewer.java index 71df3a97493..c81b1282fe7 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/SecretMediaViewer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/SecretMediaViewer.java @@ -610,7 +610,11 @@ protected void onLayout(boolean changed, int left, int top, int right, int botto if (oldInsets == null || !oldInsets.toString().equals(insets.toString())) { windowView.requestLayout(); } - return insets.consumeSystemWindowInsets(); + if (Build.VERSION.SDK_INT >= 30) { + return WindowInsets.CONSUMED; + } else { + return insets.consumeSystemWindowInsets(); + } }); containerView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/SessionsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/SessionsActivity.java index f5e722b399a..86f25265674 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/SessionsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/SessionsActivity.java @@ -113,7 +113,7 @@ public void onFragmentDestroy() { } @Override - public View createView(Context context) { + public View createView(Context context) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); if (currentType == 0) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ShortcutWidgetConfigActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ShortcutWidgetConfigActivity.java new file mode 100644 index 00000000000..2b328fad603 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/ShortcutWidgetConfigActivity.java @@ -0,0 +1,70 @@ +package org.telegram.ui; + +import android.app.Activity; +import android.appwidget.AppWidgetManager; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.view.View; + +import org.telegram.messenger.AccountInstance; +import org.telegram.messenger.AndroidUtilities; +import org.telegram.messenger.ShortcutWidgetProvider; + +public class ShortcutWidgetConfigActivity extends ExternalActionActivity { + + private int creatingAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; + + @Override + protected boolean handleIntent(Intent intent, boolean isNew, boolean restore, boolean fromPassword, int intentAccount, int state) { + if (!checkPasscode(intent, isNew, restore, fromPassword, intentAccount, state)) { + return false; + } + Bundle extras = intent.getExtras(); + if (extras != null) { + creatingAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); + } + if (creatingAppWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) { + Bundle args = new Bundle(); + args.putBoolean("onlySelect", true); + args.putInt("dialogsType", 10); + args.putBoolean("allowSwitchAccount", true); + DialogsActivity fragment = new DialogsActivity(args); + fragment.setDelegate((fragment1, dids, message, param) -> { + AccountInstance.getInstance(fragment1.getCurrentAccount()).getMessagesStorage().putWidgetDialogs(creatingAppWidgetId, dids); + + SharedPreferences preferences = ShortcutWidgetConfigActivity.this.getSharedPreferences("shortcut_widget", Activity.MODE_PRIVATE); + preferences.edit().putInt("account" + creatingAppWidgetId, fragment1.getCurrentAccount()).commit(); + + AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(ShortcutWidgetConfigActivity.this); + ShortcutWidgetProvider.updateWidget(ShortcutWidgetConfigActivity.this, appWidgetManager, creatingAppWidgetId); + + Intent resultValue = new Intent(); + resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, creatingAppWidgetId); + setResult(RESULT_OK, resultValue); + finish(); + }); + + if (AndroidUtilities.isTablet()) { + if (layersActionBarLayout.fragmentsStack.isEmpty()) { + layersActionBarLayout.addFragmentToStack(fragment); + } + } else { + if (actionBarLayout.fragmentsStack.isEmpty()) { + actionBarLayout.addFragmentToStack(fragment); + } + } + if (!AndroidUtilities.isTablet()) { + backgroundTablet.setVisibility(View.GONE); + } + actionBarLayout.showLastFragment(); + if (AndroidUtilities.isTablet()) { + layersActionBarLayout.showLastFragment(); + } + intent.setAction(null); + } else { + finish(); + } + return true; + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ThemeActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ThemeActivity.java index 279c4d3fff6..83d6baba326 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ThemeActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ThemeActivity.java @@ -72,6 +72,7 @@ import org.telegram.ui.Cells.HeaderCell; import org.telegram.ui.Cells.NotificationsCheckCell; import org.telegram.ui.Cells.ShadowSectionCell; +import org.telegram.ui.Cells.TextCell; import org.telegram.ui.Cells.TextCheckCell; import org.telegram.ui.Cells.TextInfoPrivacyCell; import org.telegram.ui.Cells.TextSettingsCell; @@ -1472,7 +1473,7 @@ public int getItemCount() { @Override public boolean isEnabled(RecyclerView.ViewHolder holder) { int type = holder.getItemViewType(); - return type == 0 || type == 1 || type == 4 || type == 7 || type == 10 || type == 11 || type == 12; + return type == 0 || type == 1 || type == 4 || type == 7 || type == 10 || type == 11 || type == 12 || type == 14; } private void showOptionsForTheme(Theme.ThemeInfo themeInfo) { @@ -1825,10 +1826,14 @@ public boolean onInterceptTouchEvent(MotionEvent e) { break; } case 13: - default: view = new BubbleRadiusCell(mContext); view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); break; + case 14: + default: + view = new TextCell(mContext); + view.setBackgroundColor(Theme.getColor(Theme.key_windowBackgroundWhite)); + break; } return new RecyclerListView.Holder(view); } @@ -1866,8 +1871,6 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { value = LocaleController.getString("LastName", R.string.SortLastName); } cell.setTextAndValue(LocaleController.getString("SortBy", R.string.SortBy), value, true); - } else if (position == backgroundRow) { - cell.setText(LocaleController.getString("ChangeChatBackground", R.string.ChangeChatBackground), false); } else if (position == contactsReimportRow) { cell.setText(LocaleController.getString("ImportContacts", R.string.ImportContacts), true); } else if (position == stickersRow) { @@ -2004,6 +2007,14 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { } break; } + case 14: { + TextCell cell = (TextCell) holder.itemView; + if (position == backgroundRow) { + cell.setTextAndIcon(LocaleController.getString("ChangeChatBackground", R.string.ChangeChatBackground), R.drawable.msg_background, false); + cell.setColors(Theme.key_windowBackgroundWhiteBlueText4, Theme.key_windowBackgroundWhiteBlueText4); + } + break; + } } } @@ -2021,7 +2032,7 @@ public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) { @Override public int getItemViewType(int position) { if (position == scheduleFromRow || position == distanceRow || - position == scheduleToRow || position == scheduleUpdateLocationRow || position == backgroundRow || + position == scheduleToRow || position == scheduleUpdateLocationRow || position == contactsReimportRow || position == contactsSortRow || position == stickersRow) { return 1; } else if (position == automaticBrightnessInfoRow || position == scheduleLocationInfoRow) { @@ -2054,6 +2065,8 @@ public int getItemViewType(int position) { return 12; } else if (position == bubbleRadiusRow) { return 13; + } else if (position == backgroundRow) { + return 14; } return 1; } @@ -2069,7 +2082,7 @@ private static abstract class TintRecyclerListView extends RecyclerListView { public ArrayList getThemeDescriptions() { ArrayList themeDescriptions = new ArrayList<>(); - themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_CELLBACKGROUNDCOLOR, new Class[]{TextSettingsCell.class, TextCheckCell.class, HeaderCell.class, BrightnessControlCell.class, ThemeTypeCell.class, TextSizeCell.class, BubbleRadiusCell.class, ChatListCell.class, NotificationsCheckCell.class, ThemesHorizontalListCell.class, TintRecyclerListView.class}, null, null, null, Theme.key_windowBackgroundWhite)); + themeDescriptions.add(new ThemeDescription(listView, ThemeDescription.FLAG_CELLBACKGROUNDCOLOR, new Class[]{TextSettingsCell.class, TextCheckCell.class, HeaderCell.class, BrightnessControlCell.class, ThemeTypeCell.class, TextSizeCell.class, BubbleRadiusCell.class, ChatListCell.class, NotificationsCheckCell.class, ThemesHorizontalListCell.class, TintRecyclerListView.class, TextCell.class}, null, null, null, Theme.key_windowBackgroundWhite)); themeDescriptions.add(new ThemeDescription(fragmentView, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_windowBackgroundGray)); themeDescriptions.add(new ThemeDescription(actionBar, ThemeDescription.FLAG_BACKGROUND, null, null, null, null, Theme.key_actionBarDefault)); @@ -2095,6 +2108,9 @@ public ArrayList getThemeDescriptions() { themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{HeaderCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlueHeader)); + themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{TextCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlueText4)); + themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{TextCell.class}, new String[]{"imageView"}, null, null, null, Theme.key_windowBackgroundWhiteBlueText4)); + themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{TextCheckCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{TextCheckCell.class}, new String[]{"checkBox"}, null, null, null, Theme.key_switchTrack)); themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{TextCheckCell.class}, new String[]{"checkBox"}, null, null, null, Theme.key_switchTrackChecked)); @@ -2116,6 +2132,9 @@ public ArrayList getThemeDescriptions() { themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{ChatListCell.class}, null, null, null, Theme.key_radioBackground)); themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{ChatListCell.class}, null, null, null, Theme.key_radioBackgroundChecked)); + themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{TextCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlueText4)); + themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{TextCell.class}, new String[]{"imageView"}, null, null, null, Theme.key_windowBackgroundWhiteBlueText4)); + themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{NotificationsCheckCell.class}, new String[]{"textView"}, null, null, null, Theme.key_windowBackgroundWhiteBlackText)); themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{NotificationsCheckCell.class}, new String[]{"valueTextView"}, null, null, null, Theme.key_windowBackgroundWhiteGrayText2)); themeDescriptions.add(new ThemeDescription(listView, 0, new Class[]{NotificationsCheckCell.class}, new String[]{"checkBox"}, null, null, null, Theme.key_switchTrack)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ThemePreviewActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ThemePreviewActivity.java index 13beb9e6a30..622824b79c3 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ThemePreviewActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ThemePreviewActivity.java @@ -50,6 +50,7 @@ import android.view.ViewGroup; import android.view.ViewOutlineProvider; import android.view.ViewTreeObserver; +import android.view.accessibility.AccessibilityNodeInfo; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.ImageView; @@ -650,7 +651,13 @@ public void setAlpha(float alpha) { ActionBarMenu menu2 = actionBar2.createMenu(); saveItem = menu2.addItem(4, LocaleController.getString("Save", R.string.Save).toUpperCase()); - dropDownContainer = new ActionBarMenuItem(context, menu2, 0, 0); + dropDownContainer = new ActionBarMenuItem(context, menu2, 0, 0) { + @Override + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(info); + info.setText(dropDown.getText()); + } + }; dropDownContainer.setSubMenuOpenSide(1); dropDownContainer.addSubItem(1, LocaleController.getString("ColorPickerMainColor", R.string.ColorPickerMainColor)); dropDownContainer.addSubItem(2, LocaleController.getString("ColorPickerBackground", R.string.ColorPickerBackground)); @@ -661,6 +668,7 @@ public void setAlpha(float alpha) { dropDownContainer.setOnClickListener(view -> dropDownContainer.toggleSubMenu()); dropDown = new TextView(context); + dropDown.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO); dropDown.setGravity(Gravity.LEFT); dropDown.setSingleLine(true); dropDown.setLines(1); @@ -2858,7 +2866,7 @@ public boolean isEnabled(RecyclerView.ViewHolder holder) { public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { View view = null; if (viewType == 0) { - view = new DialogCell(mContext, false, false); + view = new DialogCell(null, mContext, false, false); } else if (viewType == 1) { view = new LoadingCell(mContext); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/VoIPFragment.java b/TMessagesProj/src/main/java/org/telegram/ui/VoIPFragment.java index 74a896a8da5..fec57252ede 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/VoIPFragment.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/VoIPFragment.java @@ -41,6 +41,7 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; +import android.widget.ToggleButton; import androidx.annotation.RequiresApi; import androidx.core.content.ContextCompat; @@ -272,7 +273,11 @@ public boolean dispatchKeyEvent(KeyEvent event) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { fragment.setInsets(windowInsets); } - return windowInsets.consumeSystemWindowInsets(); + if (Build.VERSION.SDK_INT >= 30) { + return WindowInsets.CONSUMED; + } else { + return windowInsets.consumeSystemWindowInsets(); + } }); } @@ -777,7 +782,19 @@ public void onDicline() { backIcon.setContentDescription(LocaleController.getString("Back", R.string.Back)); frameLayout.addView(backIcon, LayoutHelper.createFrame(56, 56, Gravity.TOP | Gravity.LEFT)); - speakerPhoneIcon = new ImageView(context); + speakerPhoneIcon = new ImageView(context) { + @Override + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(info); + info.setClassName(ToggleButton.class.getName()); + info.setCheckable(true); + VoIPService service = VoIPService.getSharedInstance(); + if (service != null) { + info.setChecked(service.isSpeakerphoneOn()); + } + } + }; + speakerPhoneIcon.setContentDescription(LocaleController.getString("VoipSpeaker", R.string.VoipSpeaker)); speakerPhoneIcon.setBackground(Theme.createSelectorDrawable(ColorUtils.setAlphaComponent(Color.WHITE, (int) (255 * 0.3f)))); speakerPhoneIcon.setPadding(AndroidUtilities.dp(12), AndroidUtilities.dp(12), AndroidUtilities.dp(12), AndroidUtilities.dp(12)); frameLayout.addView(speakerPhoneIcon, LayoutHelper.createFrame(56, 56, Gravity.TOP | Gravity.RIGHT)); @@ -1909,6 +1926,7 @@ private void setSpeakerPhoneAction(VoIPToggleButton bottomButton, VoIPService se bottomButton.setData(R.drawable.calls_speaker, Color.WHITE, ColorUtils.setAlphaComponent(Color.WHITE, (int) (255 * 0.12f)), LocaleController.getString("VoipSpeaker", R.string.VoipSpeaker), false, animated); bottomButton.setChecked(false, animated); } + bottomButton.setCheckableForAccessibility(true); bottomButton.setOnClickListener(view -> { if (VoIPService.getSharedInstance() != null) { VoIPService.getSharedInstance().toggleSpeakerphoneOrShowRouteSheet(activity, false); diff --git a/TMessagesProj/src/main/java/org/webrtc/voiceengine/WebRtcAudioTrack.java b/TMessagesProj/src/main/java/org/webrtc/voiceengine/WebRtcAudioTrack.java index 1d5888b3a27..11adb829342 100644 --- a/TMessagesProj/src/main/java/org/webrtc/voiceengine/WebRtcAudioTrack.java +++ b/TMessagesProj/src/main/java/org/webrtc/voiceengine/WebRtcAudioTrack.java @@ -22,7 +22,6 @@ import java.lang.Thread; import java.nio.ByteBuffer; -import org.telegram.messenger.FileLog; import org.webrtc.ContextUtils; import org.webrtc.Logging; import org.webrtc.ThreadUtils; diff --git a/TMessagesProj/src/main/res/drawable-hdpi/actions_link.png b/TMessagesProj/src/main/res/drawable-hdpi/actions_link.png new file mode 100644 index 0000000000000000000000000000000000000000..fba66289522e4fa338b6ecc7b43b9fcca5d3b936 GIT binary patch literal 983 zcmV;|11S87P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91Dxd=Z1ONa40RR91DgXcg0Mr_#3jhEEK}keGR9Fe^m`i9BK@f(s>nkWe z65{jXK@fxlF(jTsL_{Tr2%;z`h^QBX=t&3?gv3i!#Dkv1g9k4m2NeZH@gyPy5fwpv z9aJQjh*88xP}i?y3X7fTnVy|p<6#PZx~KZDziN7VyJxnpF1LIJ@)@Yg3>2!O5+PD5 zl^Srb2OVG$m#ggQ(%}W0)sEaGSwLpw{Lan~I0}KFvV;1MEsA0GXI=M&o+gcrQK)@mE( zk)$Li0^LAoQuK~{#FQ6#pE&0-W9)_q2evdxKQvBY8~CCMw3QV3fVjqxc;H~H!|0E= zcuqgTbHH08a>7aeo3wl;lZsr3{u`5{D=9~4oM3x24uuG14)|${Y$E27DRQ_>GWn8V zdE5CEh|MfZ z0GomHq_X_jJ|craZDkx8()76TYK^&0i^nFxI@1qz`RtttIRghbQ3Ud1lW(ME7q4PJ zqK!b_*u~_9Vrp73Vy1y1pq6-Gq|Nb%kNQQ;K--%}1b#iZYT{*2Zb_rz%|&<_&_5C6 z6JfhgFuZxdeh$Cqy4@$XVh#y*12y@=JO$>u1Q}ZkUIMjII#pSlNpIe=@AXmG08s8Y z{mbAEkpGfon^^(6!D^uPicS|lwioKCc}uZdfjmNAy9CiW^EEA45`$ylHHfkaoU-w+ zsYN0BI8$j;jI6umK#teXK$gHg9<%gw%V!{;f&Y01egj2y=F!#U<$3@B002ovPDHLk FV1n@PqhSC5 literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/arrow_newchat.png b/TMessagesProj/src/main/res/drawable-hdpi/arrow_newchat.png new file mode 100644 index 0000000000000000000000000000000000000000..85f4d7491349171c2359cb99f4cc7e50f3c4c823 GIT binary patch literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyy~STEL88gA~qMxhWJ#-STvC46zX0 zI!TfHkb^{5esPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91B%lKT1ONa40RR91Bme*a04fgS`~Uy~&q+iJB1Lehx^Hd(Z!!+?Tv})6h`2e|-nC*=!qJhe?QQs+C4t zMf-(7Crm@NOj@13se~UWWe6Eg4y;#ez1hhY`GgRO}~;xj(q zXyy>iLfHCAbh%_ter5S1w0fOhS44ryHSi@^BtIH3jNbr*VAdEBC^Lajqlw`MBjqGJ z+=AZl0_M^-AD$~UrtTxs?MmRn%~-hb*3E?N~X9 z4)A`^i}@6^EH>|RHUAFLgpMw^;0%m0-tHR+$2Dz;i}!QE^X{U}#5zT!TrMxHs3C-# zVF23mR2h)lkGljq1Wv(O$U+m0FyD^2G#{0(V%3$l~&40K!OppPa-@Hu0AkHH?$3pZkM8`9x?1`cq6(|8@cUW1t$ z9ng+g!h7;h8SnHti(}m~ioZiQ!uKVFpWs$(BkTj+wmam;@CA+em()b&eM9=hW*aRi z;CF>D$atEy7YnRka@yar=TvGd|k1|%Oc%$NbB7>k44ofy`glX(f`xTHpSruq6Z zXaU(A42G$TlC0TWzSWdSpS4N|DZ_xKOUY)==*kOW7ch%lbKoW$g|Lh3xnb%ue?Ye7Z3|`{xX$D`zJ%H~h(+*w?f^RBvu z&D$yes`|Ajb747S^}LxgZ!!2QxW{?iI&<4{66;I53HvQIKY4seY}r=&bNiudD>NsZ sev`}iTJ`@l^RM2Ib^l#ztiRbPFSzuo0jIy)KTtGyy85}Sb4q9e0E%GFpa1{> literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/msg_delete_filled.png b/TMessagesProj/src/main/res/drawable-hdpi/msg_delete_filled.png new file mode 100644 index 0000000000000000000000000000000000000000..b076e59476c183c6990f602c6cfdae674a3a8ecd GIT binary patch literal 676 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbB7>k44ofy`glX(f`xTHpSruq6Z zXaU(A42G$TlC0TWzSWdSpS4N|DZ_xKM30~4R8i(^Ox z=iBhT`YeG0`%CvVXV-|hEL?Df<8G#(lGVh3pUgj$OTx1>SGuZ}n21{n%64i5DmWfI zn!dTN_+E_K`+M(p->v03nP+7FdG`G?du~>~|Mtyj=9gdT!XF-ed;R;LQqgq9=BVEC z2gx26Kkw-}_LtYic(uUo(yoS_D||`59Nc#k7ABrxf8rIrg}=h%XPUuM=iYMei$1F* z&Mu3Sz0>j_yyRZn>}IBbEev^g4xFA7dE{-Tp)Hg6fpV@h&m`5tlN3rHOj{@*dyY@? z&4oG_=fBIUeASkJvTZN$T)BJ!Q=;%IHz9dH+j^IBmV~GuR}b7xa>{3`SKFY-ckEi= z8HUFyQoc4SC)Yn)v@o_~b@u6N0XHNc-3c_4d0`mc>n647YQd@FnHkKoCoW!IsO!|{ zl74-|b%p7No*z5%&{CXz#gWj5y954}emZ#0ao?1D&!3;THft5vP3W^)SRMGn?`CLk z{snFWTc4Lne#ibBO*_AWH}aI~^2=>G#y;v({7#rLO3Q!cIk}zrT&i!j;d#4b+w8Jz z)UU~iB}?_+iR1YDb!O1U;sb95s-B+Jyl-Q0H7?-BT&KjJml@wz`DQ#*gAD_Za2=lo(;w6^_@)PeGr xq{Jb{s*wUtOP;QNF6*2UngGFZ7={1< literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/msg_link_1.png b/TMessagesProj/src/main/res/drawable-hdpi/msg_link_1.png new file mode 100644 index 0000000000000000000000000000000000000000..903c418c90fa3e88d10a64f98fe71a63f8640ddf GIT binary patch literal 699 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbB7>k44ofy`glX(f`xTHpSruq6Z zXaU(A42G$TlC0TWzSWdSpS4N|DZ_xKM31Cy$!i(^Ox z=i6zv`YwS2ZEM$fbhPw2X$o})JyMop3DgMu!6-F%!L=7ALQ+%xlou`hCiz>q##Bhi z$z^fmwa;qhDP_gqyLMkUd#940cJ9p1&*$dZrk`86(o;3Iv4r*CO|FzlzxK8|Eu0r~ zc!Btq2K54_KBJjFa%cAJ$4etWm^KP%B>oHeggs4hR@&84J!A9y7M z%VaHB)T+h0m!1sbuVIhd;_^ee`=ZUW9EQo^J$%3Irl}olNp)WRvR0nyjjXtKl%%q9 zo$Q%P_x>67+tf~aO$f-kr=C*wV$7q(3DRGF=O^D*iDFlqY$tfmZUft{z59c# ze>*eTD*Eg)_?CNM@*|n(74ts4Zg1$+J9W&U?2nc2tpmTL-48!gd8Aw^_QE!KQTL`5 zmyN>ae{`?57W`D?sc@Nf)w}FP-9hD(t+rcjFtt6?@TK8Du{ VKQkZ9pWO*cIG(P4F6*2UngC-77?S`1 literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/msg_link_2.png b/TMessagesProj/src/main/res/drawable-hdpi/msg_link_2.png new file mode 100644 index 0000000000000000000000000000000000000000..3dbcca8efc193bd1756f96a229dfb5c61f80f6c9 GIT binary patch literal 765 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 Ef)(6^kN^Mx literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/msg_share_filled.png b/TMessagesProj/src/main/res/drawable-hdpi/msg_share_filled.png new file mode 100644 index 0000000000000000000000000000000000000000..074f6e2084d25c459a6f65ecea3fc684829fa767 GIT binary patch literal 543 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbB7>k44ofy`glX(f`xTHpSruq6Z zXaU(A42G$TlC0TWzSWdSpS4N|DZ_xKM`S*NFqV@L$& z+i83Km>dNfEKM#o1_r9QaVI}2o)PhjLClWfp<|73a&D?}=TtGVe{A&u$w`UIrlQZy zU#Lz$duQW`S8kgp*RY>?cdm{{$9A!5R zm*NC5A;Xu~ddxLlJ(iqHJl7r4Ho+tI@S*jd8zWg>UuapAVI1(^P_yfF=dBjo7frr4 z2AL;!inwlnaP64G%+D@)M>|DYwF(yG7-hX`WnG=@8JNKP&i$@s`ak33$+M=+^6^hu zxMc^cp8bEhufJZ_u9>GC+@xI~SuXPXUT5;db>6~RCle#KylS)TYz=+UxO&3hdDcKzJ1=VJkcqE>j_&G(`L_mua%Wt*E1!4zR-A~asQ1*{$ItF7d1tmdKI;Vst0AF&|djJ3c literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/msg_voicechat2.png b/TMessagesProj/src/main/res/drawable-hdpi/msg_voicechat2.png new file mode 100644 index 0000000000000000000000000000000000000000..63b30ba041f954fdb5eb6c4caf1c295c734f5a3f GIT binary patch literal 648 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbB7>k44ofy`glX(f`xTHpSruq6Z zXaU(A42G$TlC0TWzSWdSpS4N|DZ_xKM`*(XmI$B+ol zx8b(l%#H$kh3&JfH(ofzFR<~F6N@$X!F!LkoU-4rakKf2sP53NKb(#_I#$O_lXk0k=KtBmw?uDm<-GF=`I2U@4wXpk zcfVISYgzcCnhwpw_Yya<6;5|;V$eAnl=x70=Ax)R9?x`!v$GF)ye^ix%k+F3XBLCO z2}i-dYAn2kb+Z@DVP>&=sLeG!G4J7*LWcmx`|p{#ziU0XqoUI{dl~Pq7bRa!>@T;=YJG_0>YJ*FNm6pQEE?PUt7toBH`W zZkt_opT#xiedmsg^I~tfA2BmMus2mWxFY&7gNje`UMA^gUhT#EU6l>4FEBT;YGaRx zy}A0~{lwa)>oe5P+~w`K^R48qV0HK1P!FNo+s_>T`R2wRmm1#i+SfP4+jGsg>i;~t zsj}t9rSguA1;3pwCWSse!M9QFL%Qo7*N=rW{&nva-Z*8BR8v}F@uwcSPyOW&gxQvQ U7lhmv`vyt{p00i_>zopr0OY+1U;qFB literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/voice_volume_mini.png b/TMessagesProj/src/main/res/drawable-hdpi/voice_volume_mini.png new file mode 100644 index 0000000000000000000000000000000000000000..68ab5527f1b759df2fbc8db668aa07f7e867130e GIT binary patch literal 649 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgf?6aqfV~7Xu z+o^lCT@z)FzjwXI>m^yTS&}1i0&A*)z)`hkBZ-s`;vIK$Ci3vOXinMF#}gD3p`(1pC_xtkq#pjA$mHtoa6aHYco?+HPCE3qR#uB$U${(aC z1$+>1@3j4pq<((!`iH_^e~Uj#KVY%?^KpsU(ZwGa^DnGV`Xb}8>hIYfUl;5ufAQ^k zkFNoHTcT82qO3~)g;!D=>SGqz>@2%5sam7Z)+^ZG3g% zvBFHBFArb*QDMKpQX0S=*{PH*aJhKG3}vVF66Zfp3vG(!IA6d#a~ZEQe~?icljpwx z;eTwdNBpk#>{!}eczyNd6+J4S>wH}oUsUgUmb0)rEd84P^naI`tY4gZrL=l$NYbAY zoeaarN)wA$Cx^v*Wgnc)yTd=>?tRhpyUtVJonT&blTY@l`kYhOXBTlq8M!o{dn+2U z;gqEQg1U~Inf>X>kBBzaDTNGV)X??78u9`-<)vZLdVnwkA&~ zxpnb=*Mhua)hiCtF-<9)pWaM3z;xZ$PQJ`h=-;(C7|A&Lk zo7{!L_0vRNr|r70YJK?6qGvzs`8faXf6wx2A-~dF6*2UngF#F3mX6c literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/voice_volume_muted.png b/TMessagesProj/src/main/res/drawable-hdpi/voice_volume_muted.png new file mode 100644 index 0000000000000000000000000000000000000000..28833f79ecd7875744013ff2e88a4cd061c204db GIT binary patch literal 831 zcmV-F1Hk-=P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91Bme*a08Uq3P5=M`sYygZR9Fe^m%D2fK@`SwlZX!ZvlEMmSc_JIk4_M*1Rwbmd{jY;fU(iSMnqFuX`_v3;-k>QM?b019EeEhcxVoMfF z+Cs#Oct!ua*af>rJMIb6PcHxx^I)eD!}lWSW`Dpr%lnr2I}O0P{{<*I0q&?e_6Ed6 ztdT3c*b+iKsescEF#Cyf5BTTX{}QpUQ&Iu?e#`VF+2$V&^NClAAfHsgYY51ejc{2@ zJ}QD-Cj$QYayXKM;AbvYa0i3IC4vhfv6uES#O+{oI)gf({1k_a9j)w>AvIIXMGwl%s-xnE*aAitq)5ry^HNnK`Sw+qP{0p|Iy z(^vZTV%M16zz_<)1hTuMF2`IiqV&&h)U}7sqxiDeV>+-M1v)nGaInXtaxKQE5kcYo z;5UfbI*Id@>_d`q$wVBd__vsX5MQJ%{gM&iYy$C{qcKc2kDQh97Yokb*y}+5XyjuFY&{Q48lZ%*wpstZ-A8~e@2z)!t-LhB^<{zgg zKG(Sq$#HNMnCYu^4Ct}5E9Z?oF>(t)_6uyy=R5C1;w;ehvdj*Z5n|vxI8c^L5`)ZP zum;R@le^G189VnkQU}5lEVK`(UFB@_rICgEMfx4+cObe0e*x3^8`*6@>4X3P002ov JPDHLkV1gtubr1jm literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/voice_volume_speaker.png b/TMessagesProj/src/main/res/drawable-hdpi/voice_volume_speaker.png new file mode 100644 index 0000000000000000000000000000000000000000..908294290ff07de390bd11b5ca0d91f88c840814 GIT binary patch literal 679 zcmeAS@N?(olHy`uVBq!ia0vp^20*OB!3HGHyY2)@Fct^7J29*~C-V}>aY>EvO!M_+ z&;qhK7#Q0#8CXC{fLIEM85o!sFfuR$X-1IP0w%bu!2)JDTLq-hFFe+dfq_ZT)5S3) zg7fVROAls8k+#ilidq@T3s+3-Xk}4Mdfb?xD!9f~;K)7ZgMI=!Ygil|tGPFRc#(7D z-0Bb!7tiG6MD+}1wb$lG+Ris3lgf-ZcQDuAyKQd$zSh{fdP0Ow)P3f3k@2-Gb63+jQ8ARkgFU3@31wESRLdZ-z_%%BW+X8LqeJi9V?Q zqw*>^srwlBY!8kE^-~%P(tq?SnVYRUGTrye<);GXx93Y2F!Stkk}dk6S2kt#H($AE zav&Xwj5cTtGNGH694(v zD^mY(T0gR$p-_8GZNY6PW1)A9)+fbwUObrf$Sr=tEGhfMyS_T#_GPrY9_TJy_haM5 z65)>1k0PZ760=^Y38*cM36_wp6(&$+8=l~Oc67?a6SAND3N%&`njxgN@xNA D#pe%5 literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-mdpi/actions_link.png b/TMessagesProj/src/main/res/drawable-mdpi/actions_link.png new file mode 100644 index 0000000000000000000000000000000000000000..4cabc973365bd5650a44095cae5b751b075dc1f0 GIT binary patch literal 719 zcmeAS@N?(olHy`uVBq!ia0vp^G9b*s1|*Ak?@s|zjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uvw#`F1}RM0`(+UW1Cynvi(`lf z@7rm%J|d11ZTXrSB6?E3BHF?e+*IATk_y$t+_XGB6cjd^skuq7_0c)kc8salM8Zp3 zT65)*84et*EddTo7fvXMdn|t>_}KH<^2v8^-n@Hx_n}Aop6uM2f3JMs&7HGn?si%z z>idsnkJ~HBpOY@9Ex954L-Nd*wr_$y4wBOx zHnJb)_4k_CzRE2m@r<6weD>`Rs~zUQU1`1i0CPZ1OK~Lg#rLN?&ZPe|GG#k|KyA)R z6QxHNy{c`i zrOc;$({6yA1>7Zh_Wyua}Lzlmo|qrIO<99NvPCPn(fqRDS3eRr{aBD;at zeu2bQq4$Pg4%^kVR;gKMiznVG4%o9{t4m+z!R=DTr^Q}w4}Ui6O`JiTwoT&oj;9j4 zm_Hlk=D1J#e>P?Qhv)KDKIRUFlGQ>&zqUk+{yG<<{rYQYvdK->>Y5q1k2`JO_h|2b zsrri(1OAKl9e0cQWGvfk6yp|O`r@SCJfCzg!>J*ELvQh~m|A{Nak~BX{zi4j>l4>) z__l|!VqJ6Dm(w=+tIj1w?VCS%f5VHWa(&FJOAM{Qn=%-|?McBa>e7j0-Axj6dHuREPykR+uGIrWdf#;L5b84zpx;YncQta8gyU z<2*9CVTPcul(qPZ3nCrsnF{4Lah2FBoLQ%o3J;bJe&&xd3TX#daYPEN@DS|S-8h3ia*mQ2!_oG{vnTgNvw~dc>FVdQ I&MBb@05#)JyZ`_I literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-mdpi/msg_background.png b/TMessagesProj/src/main/res/drawable-mdpi/msg_background.png new file mode 100644 index 0000000000000000000000000000000000000000..a276b53fbcfcaaa9088878a1b3119fa88c3d62f7 GIT binary patch literal 636 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgf?3t&FV~7Xu z+bO5DT@pnO#Hwj)y2e%dcvenPG5f>1Ehu?u#0_o1Nvum#PJ5LJNph#?YflP_t6Y-O zrN%93Di^!Ixc0m8y3>0vN1R-Ff6nppeZ}v}_gky$zV+|UoHf&cQSgH@zsg$23w4HV zxdLYnylddv(Vi*MTDPMi_QND5p{NHeuXqkuT$0WZXmiOtFj3vUy=3l-#0l1%N@uM^ zmtW!9YrgWB-b7c?=qsIiY?h1?&1PGd$G*)Lw_orrMRV`@jeJwzhMP{bU=fTc%iAPv z@%ZGA+baEs=iOd5MY`aTI2ZqJ(djeZpZ>kBA^gw&#_Q5vfBAkqt5)QCyg>waPDc(dZyL+jM@pqTe`^>bP0 Hl+XkKZjkvP literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-mdpi/msg_copy_filled.png b/TMessagesProj/src/main/res/drawable-mdpi/msg_copy_filled.png new file mode 100644 index 0000000000000000000000000000000000000000..149942a86f12afb36e7bf0c7a4ba14f52f2b0d31 GIT binary patch literal 417 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgfjN8-2F~oy6 zIYEMz#i>DX`k(**|KDsV+UStOcO)s|iflqk%A5vQ8P^WhR`#b1ywh2Ywli(C5}42W zDBQuvmSIbRxxjtKBvUWnqaPSA1f(ulsORv8m!~P(VV}taUM?*~g=1{@m|3SYT(vu< z)~U#5V!+Yi*udYx+W5n=!Xs@|3|zo);<^OG zY}ON9J0@DP+_1Uvgfp_im)|pKv6ukQx`&c3?2Z4{u|7L553-*aA zeGyvP5+Gxva!RCQ5xdF?R}I!_hQ*vyoE2WWI`nMKJE+xRAa{rgL(3x;PG_zb6Mw<&;$V4F@F63 literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-mdpi/msg_delete_filled.png b/TMessagesProj/src/main/res/drawable-mdpi/msg_delete_filled.png new file mode 100644 index 0000000000000000000000000000000000000000..6750c87fc0481cfaf5b026b4983d024b2dfa40e9 GIT binary patch literal 501 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgfEZ)<_F~o!S z?Uem`E{-C{zH@17P0=y*XlzCpXCcRj7>Idcz>uS8OTm6_;RM@^!bE*1< z)tdJ{Tb#~Zc`s0#_k`HB*cm(;^Fm$)KkUABr_Zv*^g_#ejpMFsf4o1-`(p~<4WkN1 zW1$4wgg;Dq=HA!Vxc%sV%65YN{23{)H$Pvn?%dY2=(&bg0TddCj`Qbkj$kEmO8#(X?&I_!?%@5VgJ4%Xbsk+LZ8~_wwIQ zq;R!eykT+D{P~%g)&HxX-zgUETyC4gYIENEZtdrev_ua34b7G&ijviaE~hpy-V~cw zS5njSZsURN!fzg37CIuH`0&%$h;D_T#{LZ)J10daNc}6jY@M_|VB5(f`XAV{PrH5+ zVw}1(Nx0*FB5U;tjsEk^Icbmes@PUXzj64x=|kS5mbm+!+24~@H=J`#ls=HKb&~c)yOz4^Sa|C^cE&F4)06qLZ*1PWYFS3j3^P6A+I=!x9c+Vj(K)oAh;ENCg+=+_P27HPW*a( zBM(>Yp^`O;cEZe`W~Dry`6ui8_a}+*@xE5g%N}r)JhIkssP}b#^~`>6qrQpj`fC=P Rx}Bg1@^tlcS?83{1OUWi(8B-# literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-mdpi/msg_maxvideo.png b/TMessagesProj/src/main/res/drawable-mdpi/msg_maxvideo.png new file mode 100644 index 0000000000000000000000000000000000000000..c25a69afa67a1e0899223f50615b576e01c3fdb4 GIT binary patch literal 884 zcmV-)1B?8LP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR917@z|H1ONa40RR917ytkO0OB=utpET5-bqA3R7efAluK_?Q51zK#n4B5 zAZkbIx&gjgUsp)`(0SS*FiZP{VKyZDByT~n%#0fiD zckgreNuNaT|E}~2ohbRe>@(q+K<5ty=pzweKN6k_&xJE` z$d!E}P%BWkG?N^OWHJeVKZS1syuvRqufJup=~n_BPg1EA{w47QEFFXbngE+3;E!Ox z%pji3v=L{)H;?xOI0+v1`~AyCqwz&HC&2|sSQP)G;B~9j`g&V}Esz%^>~v&v{^9nX z!1AGp&Q>m6|1BJ6Xd;gqj~URAa)Pa)55^5jSrXkGu6eFM$@e6RA?~rB z>xyV;#-Hryxh_Rpk;>=Bwlz$T{=blNOmf)36)Q9Me2bn#uH9MP z1ebEd3%64p424w+%N1t#3vx_2BH{3m`AI#~qq!cBmN%Z-HSxy`p9TB=DxA$o;NIo6 z;E$Mzslq$PlG4S093_|zbXYa1e%j#rDa@p_zTwZ?7ja3B;tZdzGk!EyDGV_B>h|dH zj5r6jDkEFQ$ttthc4f7Qi{5y|VEe=2p;o6J#}j$Rq)Ufox*ZogZQ*5P$X1@ScQrfT QUy#o{UHx3vIVCg!07{E+Qvd(} literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-mdpi/msg_qrcode.png b/TMessagesProj/src/main/res/drawable-mdpi/msg_qrcode.png new file mode 100644 index 0000000000000000000000000000000000000000..7ca846156b3039847ac8b4d19980a5336c3cad70 GIT binary patch literal 551 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgfY@(-&V~7Xu z-KmB_haGraliT{Pv9j{cVdBzrkln#9)7;c7(bmP|oXwRtQ6wP1_~qH(yR|oGpBCWa zS|sUu>H74P>hjH-Z(j4bUTRv^y)MvS?oFzvo(2VReiVO^tTnf}Dg4H< zRio{8;=K#vM`ylyJbzJnz+-Gs-dFSQslr7#+ol#N5;a%!5 zE%ILJQO+~^>#A0SPpD}~+|;gVF#CDizQQwNKUXrYK4KIt!prn{hVG@^u2Y!AUYs~= z`$j!4)%923k9+3?QZL7vJmTVT`oD7T+-n7x=R!#2ec`cbl;uX-}J$2}gzGs-P@sef2;MCw!iI-ltE8|+Y!ACAFr}vsy_H?+Ev?vJnJ1m@%Q7W>gSXeuIleP1U zH@<#l&+g^#+ih%}9humozF=O%V++?8jy`Murt}p`s~i(BpXuhqtqE&Pn>^nIX6D%_P(E$cEvN6C-Tof*2Ma9dEfc42p(UstjERqAfu9Cr~6rFr-o_g zPsH^eKUcLlmP_L0^z>uK|KA^9xB1QbXg%`)k)u){4R5f;T81C~zv!9RoTrulgswQ> zW4^v%rDR{6Pr{ukkze}fIvls`nSCh!*}0hp9+4+S^N!}1rbL_BZhE{pew&RKXGKfQ zy~zt7X~;a@S;`mV)IXI;(CKdd6%U8aFK4jU%$RdyqTb0Ts_c__bP0l+XkK DIDWEJ literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-mdpi/voice_volume_mini.png b/TMessagesProj/src/main/res/drawable-mdpi/voice_volume_mini.png new file mode 100644 index 0000000000000000000000000000000000000000..8438a4ebc8e19d7291c2e091e821c5209aec01d4 GIT binary patch literal 450 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uuz(rC1}QWNE&K#jrsL`27-AuK z_R@asmP8qb54&H-2zK*`E#Xi#+<9@)l#|EWCN0w2ee;R`hF^hRGdJwyNivd(nR8Hq zxjCuG?*8fDe7g=ki=Myl{O8(z=Znw(zBl{ipW7?0W)-iw^l7>Gt$>8t;(0f{_zd2q z%&iIX-kij4J7s5bhtPD-$%Qfn=ktP2&-@Y)Sh2_}X6KBvY3rYwe94(*VtBIWXNbZ+dIC8>CZWJIqsBY`jn)Fj%!w)os>F{*{Je-P0r<(j}~il zX7HcZUa~OX!S>&O+k2k-`?qMa&2p=J(DL_$XLI42*o)JzNTu<{$_Vv`=G^#_-!N^5+IfWVg?501&j>LK$;OGwtxvPtFV9>&Xxcvw7ouY3sBi!PZ!4! z58k&^cY8TI3bYlQEONTwcFAGU1U5qo5_XW0P>k2x2;88`l&Z1Kivstj*LgH_L=OaYc^ z0i*YQ6DuTBZar2_O$U>@QAj+;}Z-zPr^cy++txTO z-oD~od%f~ayB9rs9KJNo>NgS$R_{x&>Z+6%)NhPh@3*GX|AYRI>#{!>=M?^s=cqi; P0E$pgS3j3^P6N^5+IfWVg?501&j>LK$;OGwtxvPtFV9>&Xxcvw7ouY3s70Kr;B5V z2k+Zy8@-qv1==<{GHndd&X#x3S)-#{!xXI2nyC}~lVKU>w6J}REZUCq9eid@a9Fj) zbB)TuLtY$g7f+if>gR|ZlD(s%aOc4BHyd_;KL7UKy*RbWx9X!C6*yLXV0>S&apNz+ z(~h!7ei^jbTf|fgcDy;L-C=v!Y>LW(bCX3T^v>!zz?d9Wz*Qb#aLnfe;|uAgO~;c9 z-cEmTDpXnT7Gq~v!fEd)wRHy>4Z@9<})m-1z%KcX{EohsT>HZ{z`sJEU=>db`q)svNWm2HzbY^9%e z{Mf=^%eKT#JKe7w(5-3Awr83CE+J_u|HRqF7u71o%5>a+m<#M~{5kpY_3#6Wgl;?J z$lp@<#!zIuD#mT!wNnxYZEPAN_@7vbS;tv=?q)W;IV*dD{3OAUEvA=hq~jYUr<==c T&Z?`c0tL6HtDnm{r-UW|qoBBj literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/actions_link.png b/TMessagesProj/src/main/res/drawable-xhdpi/actions_link.png new file mode 100644 index 0000000000000000000000000000000000000000..59e3929a1aceacc96990a33050869ae1ea4129fd GIT binary patch literal 1301 zcmV+w1?u{VP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91IG_Un1ONa40RR91H~;_u01a1YQvd)2e@R3^RA>e5nrnznQ545r!g!BY z8t;-AB}x=Eo=GGnDao^Z67kI!kMEM?8wsO4%LlJS9+UDeB9ccLh8PpZ`!SjETjT6n zZFA4r=k9Z_tIn$b?6vn<>%Z38=bU}^Id@vMN+q3vbOzEHNM|6Ofvhu-$$BJ@2b!9i zT0=h$%m9->KhO(EJ}*HHxB!l4GMPuT|A$CnU?F$_T;&>uQ;WVrk{kkVyH?eL-ATrJ z#x1lUmnezNA+dd+TMG%kXY3BB1CmdFFcNeEwmfBE4wvmc`@lczQ``#h3uux4K`;Td zv6Ex01k3{GfGr;wD7St7NuNa4+S$>62u8UkgzZdF2edq<)7_OLFLorbL1z@`r)ayz z4T#TRU@uIEL@B#gQn<*$1!ZV)); z8^WMH6_>-?p1|9zB(~E}Y_*2#rs8ivFYLWYz;f^cNbrr`GiDLMDXX%U1(r$vyF`~A zONV?!g11aphrT^5j_e5&7aqio;9KIv5W@S4=AGj1tMtEAuL7C9Q9$mwLSH7es**lR zPfn$%$>0kxGA%AUj$=R-xDK2*)Yw)7BWL2qjkJf^E>40ik91T9*vmHUqc{fgjyCc+ ziH+Rf-vb|M_9|L`6~dN^yTy1%S9Wae;uva{(kKqB#8*plD>bYw6(_GiJ)#mb$Fa>; z+zw+C*5bbfXpt9Ze}Qo{_^g@H;}$m_AAMOGx0QNnXY;i%LO9V3Vz-3l2 zt}+g)b$ZSje*88mUs01UE-3Jk3UtvV5Y}RUL-~jrtGFQUNc`#po};wMU6wj|i0=kL zq`9JxWz(^n2HuMUvJ>RAAmCRDMr4bV$T$Jc0wdL~q&Tz#ksD`MJ|DZN7hd^PZe$Qi z4>X;ymbdPopgzpT9D}nbkkxv!87o*z(0M@1>Li0hJQV0X?(`)2Be@9P1<2#Uh$PcK z($T>H9$83a+oxrngKM%TMBk+|K=*#ZgkvmtYw^nF*?EtfSd|hK=uZUl0G^#|0DLC` zdm~W8*sxqVz5NKj326C7C-!b0pT*#-CPIG#26-pxLqGx_5;08(QOv_jY0nLpm>CY+JnmG z^!)zFnJ+1x%B)OCZW(x_Mo}qDO#Q&2U z(MVhtiV7eLj{H+k1Calkr~y@M+uqQolFmRn1L+K;Gmy?evCY75=3-4TZh@8`00000 LNkvXXu0mjf7fU)U literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/arrow_newchat.png b/TMessagesProj/src/main/res/drawable-xhdpi/arrow_newchat.png new file mode 100644 index 0000000000000000000000000000000000000000..579616965fc000ca4c040fde6b38a324abb22096 GIT binary patch literal 446 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDlgfOvBT~F~o!S z?v(Z2OpYSQW54Pw%Gl+bB(O7Mgs=tYKtRSSRGyVypva) zaqawpmc+!gil(Ej`k!Zf-#7pJw7EB39<80P(Iu79o2K#g%xN{-WokbKzFxc%tnF`H zD*5)p{%Zk#A1xTJU-UHJv7yXHtWxU5_Pho6o^)gtbsc9cNin%8G#xB@Cu5V6-YHE! z_5&urjA!X|81r@8uo`qvbDJFhh~M($Lxvxn-`s>>pZpYS5)$PAMJw8 zFGl*Wzcx)G$(Z4{6FYBs`J(jIqVJixFCJ^~KO!)jG2_pZKO4kvymI~B5Lf*zQ(*sI z){8Cck{-k^v0HX2_`m#p+Z8Vu->rG9z_D&!;}Oec=N2=r>N=aBT*1ItVrnq|_+DO6 O*m=78xvXPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NG6iGxuRA>e5nM-U9Q5eU2i$uM} z!ZX2w)N`R}q%3R*A`upi=t3kkA%sPj9wE9H!bX~ugf6@z5kYK-B2oz|HfV$hMMYSs zwyxj5=G>fn?o998-Wk1%`I3Ln_kHI(-{U-Hde4-VC6vrSG6O};KsudHfqL)|`~XqW z9~^apE1hi?KOEL}0|Fa|FId%zga(NEfW#DDL}xebX;105iUPHGgL+Vh5< z!;H-JR=ftk)u6`&qHVCfmfM2Ix6sb=(Hqr$k6B<8v`x&)FH4S$#qVRBJ+d6mxA?N* zwm@}rkXKl`Yw%|+`85uoc(PemiA8T4VvonqQt*lxZ{*Y>+y7WgpIrbQi|tPMTAclM zbdifBKO3j5U<&9%t|xADm_Y6p%98&_@?MgAz2qh8@ah2)in0<8HKN3fN~M5f%*#h_ zZu)5Vhn=UaLmYNc)OKvu4)%Q|euEBiV91gvK-p2mcbZ#)nFe%}$`%SpFTXk|Apac2 zYmux#yz`sid$I!g=O|u_WCfy{U*5#!LZSW&9#Ck2F!m(A3%f3$TaAOj_ouF(uOTmh zWOtL;37{V|qrhQs8hxmLbB444lH5$P$AL>*P+XXUsg(`vcA($1Hr+rNZG6Bl0$sKNyv{*C!Rxl~snf5?Fm&G7=CoK0x&X#D zmWT?M%2*h`G1 z06R`M!bUI|wAmdF--2uoa8MD$v1xY3#ae*&>PnLh{8(_)NkHNSU=FY`_ieG$C9Sf{UIam1&)jEFLJ}_PIdb6%Ut^;cI)Vq#e*O#FPTP6My5b<=-ZU3JK48(xdK;Nf=NN-WCj=o(P(q51JI~G2501lWSUaS9~ zGUWRh!*CTA&0u=Q@*ksFuVlM?#YPG1z?v25h1UvZZA0Y2lKkr6&b1uqtW^=e+vt1? zP$vn>!4fbFh?HO}gFp34{K2M?W}lH`ZuQSz4e{F|i$eig;+;TSC{EHhxhlWJ16RP$ zI7o-{8T4%e^Fh`Zl%O#o^m^Lpz}^R!?QIicY+{nkK-d}h3q1QeJg1<2XaE2J07*qo IM6N<$g0u@BJOBUy literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/msg_copy_filled.png b/TMessagesProj/src/main/res/drawable-xhdpi/msg_copy_filled.png new file mode 100644 index 0000000000000000000000000000000000000000..aef58235a20b9c5e55c6414ebc5403dbdcdf2e12 GIT binary patch literal 638 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyy~ySip>6gB0F2&*1?od*SKg7?Q#I zcE)~vmOz2y`LeC@f~{VQrfY~~m2hc&OwaHXu@Y4M-{7=RVT+WMN{JA!qw>TRrZG>i zr9TZ@wj<`=p1JKud_J8$w{Pyxeecgy-@IMDb=K_i1J(~@f1Kq@2~|7)dC&Ymo(4=+ z%sb;ctWR!QBPo$D-}a%ffI~{*SlHT-((KNF-A?D!R%90kA6d=i@W)E&TFZp=Kgu6C zq>}bb{=K!;idChu?MLOt@L4}@E0o+r&C%FZ?4eL~~rdyuvnHbKeuI ztM7E3V&ul;zEdR(h;MNM2 zw1VX|2?e$j?xfir>TBK6IBCYlNW;9Rdei@|`5~rx-nY%FQmKa&H*j|eZ;Q|_`hIXjSlWe~ z8629E`Gw3G_wny@`qWX$ZocPf9P?w_Gr(B*z*oWk#_9v7|DlL)y{7`dg5uuO)z4*} HQ$iB}aRvW< literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/msg_delete_filled.png b/TMessagesProj/src/main/res/drawable-xhdpi/msg_delete_filled.png new file mode 100644 index 0000000000000000000000000000000000000000..b96177128ab1ca3093ee9a4937363e3cfbbd4e83 GIT binary patch literal 882 zcmV-&1C9KNP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NE+(|@1RA>e5n7?aOK@i7tiSZ|h zUR@23T*BQw1$~}yWKv6zl-1)m~i<1if$g< zX|-Cv9QM(v2>u4x05P%%>G0^HwN@sW(_lR&a>aRSxfy7*gqfLzUtz$?V}#`mPBh=@ZB!RoPd*AmB_Zo^((7xUqUuwOGE7r~Ul(kk9~c^O=_DakhEA1a!DXZRa1PH9Z0EG4sO|j992#6S#}_$S~<9zeh0dj zE^cD-xoLh9Y-OxJmbyGRzJ87k>iHxf*KPEp=!Hdl1!%cc=?|h@Qidn=w*k4O-c@?t z)k*e(aP)MQ9Oj-1@4ipURal?EksiC-TcmdY*a0o0lbh>);F9Q1%9I3lv(gXOYD3mZ zVmrBp%YUJuL?2=tuHfx`&|`DL+t}b`sptf%xE?f*FX-WZkTEEMb1(^>>C-mk{$u>5 z7Bwv$7MK9n!8}+4O=T4a@@;(;M4!pDs0+JPpj4n#AXf$c0T?>bTB?LRNdN!<07*qo IM6N<$f+J{&0ssI2 literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/msg_link_1.png b/TMessagesProj/src/main/res/drawable-xhdpi/msg_link_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e2db663a92862dad25ab1edbd0041ce7b40cf8e0 GIT binary patch literal 893 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyy~ySip>6gB0F2&*5QUV0!N9;uw;_ z`gX?tY!OG1Rn3SKJ6viimijz|9$G(5T{xOqrEZQ1OV zt{A0J#>uFio1@gEU}+z}LpA^Y*>`@2-rZIF{NVIH^UrfD@7Lb^Stu#(Jxyx@914Ut z=54p;)N6dXLs0pE(;LwbJTeT~_8i*|e&RUsW_p7`=x@s(+^g2`CT^>rrnpt%8B<04 z(pz8amE)u)J(;|vW5SQ~elcQlk4hT;&)M{^cFxSnH`^X4J_ucQ%%=R~^R+UMEH@-u z%-o$?$^1R=qhj!(&k{Bo!jAvj9-h8BYiEqvvWs?;);B4C;9hfFrFr@JQ@1A1DC{i^ zFk(D+RIQ=<@~Y$ayJf9~Y*_pmci)ve!X@3WI&W(G2C)j3FEj6OpS_&5weE6V%CB?M z`|HFNZ)t74opErTSn2}*NAXPA*KOvXWA#4p|B2<+qdxDxSL)v2oZql*LdC4z+nMkD zer2%jrRCNmDi^*Un7`pxZV~si9UgzAzeXA!5kKgku=d0HtmE@;sW-nfySC;0^KD*_ zls@LaoV~@fb8E%-hOPQ6U)TGp?d5vow{Xc$=dK?nkB&dwe_7?2N&S8GwD@0V?1W!? z<>X%XcYDt5{o-fs)aw?%@>qB9|DCh-sLE$?gZk||1qDPz?pHUu{-{4QWBJz3ufh{u zy070#Y$(1f^nv?mdh)|H4Za(uZ8iO*a?obOHBQy04-z%3QEzs#NFpVE}1`HX#R4&v|YDJJ0Pn`}T8OMr6+{)eZAkc2&GOI?Foo^bxVIiWzJPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NFa7jc#RA>e5m|ciXQ547L&I}P_ zP|D1hZh11ePvq;t6@`c?FG?Zh1uq)q0ik)Jq&#{Uc~G7(HKM%Gq-jz!B@ZK0@)3p1 z!{np!(Okd9-qW(3d(Xb-gEVK=zrEL9YyHzuRCM@>y8SqHKXWF5#lkab`(cc4@% zEdw23(SO$mie3u70+A1(KEZOnwLh@WCOW-{&xOXVw@pUcug=<5QoL@QhPbhfT_Q z6Zq)Z!_+<;W z#m*?P_l-d=wM{zC_{?Jcrt#6kZr3-G4r3j7rk@ytQau3D+nJ62I&k-HOd}mqbGz}zf0pFZrE}@q_o7fHjd9rG0PqWU7+*EN^ zS7PRm7=L@0K`($VW7oqSl(Gk0F?kY3l1~LeA2(8@JeZyWz1_;X75O(bCy6>@aZrTp zK)tpq&+!RnNAK0%lxzQg2`3Dr` z^D>dzswSaW`N02oH)z!rX8~CUvJPY&nA9Ek0XH94fEVSAxc~qF07*qoM6N<$g2g7Y Ag#Z8m literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/msg_maxvideo.png b/TMessagesProj/src/main/res/drawable-xhdpi/msg_maxvideo.png new file mode 100644 index 0000000000000000000000000000000000000000..88a5818c464de855b4b9a8ca1c2eaeaa3b33c179 GIT binary patch literal 1884 zcmV-i2c!6jP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NI#z{m$RA>e5m`iL`RTPH%y6tUk zfr5&l@j)O>G)BTe2ZT6bV&cHW7-z(J(?q6@91sRLAYni%5GRHq9cdU86GNhnDFbXG z0zr%kX${cyA+3Gh`hTbAzwCQny`@z{(v_^Pz1Q0NUyuDbcekNoi?%ATRe`6v0*!S< z?=hA|Q&wW5W!6~ZSZ0l}&N!CVS7i|hHn>UL9Lu8dI9V1~Vx}KDHWqm1B0S?*Ch-K* z(9jb7P5-eo>}}!>aY>BhET@1kiT@VQ#clc!HsgU&7PpJR&ch>UiebFPxE~fos(b>t zRlMWMl`9|5&CQLhtgMU`@#5m*jjLC$_G!)w;%CGJ>tv1BJv=aR)i{h+Rib?esk!NI}drlzKfc%`wiv09DWw{MS~IdkS04R+P5 z^Wp|$=lAa2``Pj1#}Dq`zyHNbrBW@RwoT*m@^aJBqetKF>FGHbOlIZ6?HHI60S1<8 z#R6Re!T0s`eJ>qL$sy&i5g1IL1MIECA%twFKd&t`e(KbzpVTI>aHVLM`uqEr6A8HT zmKye$YAXC#o!u&xN(A{RW+&kQNrvj12^bp`CP}z*1Z!bam0X5@7EOmFiKYFaeyA02C&)s(EZ9crg5p z@S!9DY;8&aSvRdW0S6aWnsz-DCYT)0{s*TLUJS`WS$*%pEZhI0<91t*3#rt%1o>*8|xO?Z$ zodNaV5x)}Ka_?r@*Gm+V-$>7j-xwVo{bqiC{_dqqmp)hjE%6>PAGB1#eTZbMAcEMS3mvR0;LEbs=_vbohTqM4tx&O+%VzKKKb3lYWQZtm;KhA zfaXLA7!(O{hydBl;K7BQMAB#IFLj6=*eXQ&ukDrwuuRX`n8toUaofHuYdoY*b&d5Y z=&;xFhzgJ(99AP-(!9A(qQ{3h^l5)!rdGj+GwIO5bAY+pxJJ2F0l=05l5V5qVsVJ^ z$Fr0I+ZWPpHCKsASwxUb?$Fow*wWI{j}IR{{8D}HXA;52n9U-vV1nN%2m>HkTXMK z*y>)+DnM}qyyn>upcka#tXM@!xe-q*Rba z-fOl<(Lii5I1X3=|5ouT`HJ&(=RQ**2ZjvW*u1J)D}X(h)|&v1I8f|MJ}}G=14hTM zRG7AtaL`ViihxaxG@d}i?y1HIp3&(bS$nZ_Tj>lWlL#lhQ zs)!p5Wa6B*%-MR9n4X>{`~p#UughU zXFH~XXELB!#FBGRsb;s>pK|n2I1gYLCx3}qYR-Y*u-I5>@c62N2lFG5Gnh;^!~=)z z$eWl%cq3!4Qr;nE5YIUFF_Q_707xLup~vHhdEToI$o3E~FM(+L#yAwh=Sj_4DoTI= z$QUqg6@qsHYSs`zGM*rP1JQT2Y!C79&B`PTB30xwiANm9V@yQhR}z&IgrJF`70 z9VCwIEOZ#+8MDa0aV)_K@go0401nV&EUnLyc3_z`#yFN)W2`fdrS)5Ks{)%x4%D literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/msg_minvideo.png b/TMessagesProj/src/main/res/drawable-xhdpi/msg_minvideo.png new file mode 100644 index 0000000000000000000000000000000000000000..4c0aa646e40a3608eaf0ba2b286ba4b006c5d26f GIT binary patch literal 582 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyy~ySip>6gB0F2&*1?o+u-Tq7?Q#I zHr&>m*-_wZr@gbZtE<4DAMDf0%rY-^XiWR3bI{LaqoB^4oFnI4HhSo639fJW$ou>d zOJ3Qr&prIuxgIlH?-V50qlixzj*+ z-RdIkxf>h0e)+oQE(z(GBdNZ@*{r0SP3QK@w=IdkXI~Y`78XA)d}N~4^-TVt@?9U) zE#EEIHJ{pcUFGAx{@nie4=1jlu-q_k4!=R*?~8McKgg#&aI|#^e;RfxxZzxAPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91FrWhf1ONa40RR91FaQ7m0NXcg3;+NFZ%IT!RA>e5S-o!5KoGu=Q1S*y zS0j`M2zdh9NRd)T0#QK43s9y)LIQ~nN(zt=FF_(|f~Zk=0iX*C;rqS|k4l_DkqT=mj(=Wrn<|drG(1*}#P;w%-d(d{lLUG@jJa5me zM^LbDMQrQQ*-T@w_kFyrkK7khd+PHzGcUKqaV+*&Ca=DUa;tpN1k{(d4OZa@dM>L$ z`^b=2Z3}P{2aKWI;vt0~&2*_@D|t&hHx%ZYldbu!)fnux;dal+7|dqZmu9jeUkVl) z5k}+-;rdJ<1Q^@dX9B+ivXL)H%eo?r$QOe2nZQ#ZC@^jMhRS+z+itclmb@{w*5_-C zxjx?3@51eK1=_|K)gQe|D4`v!fcA4XUnNRqZMd};E{@JiUCJVtcLgtV)o>m++CtxR z#0p~(M&v7mOKA;^XaWzA-bhRk-3Duk;pM7u{Ww#9T7mz21@IK@dwRepugcIB2>Od$tJurwqrxG7f z^u`KZ+gN26&v$JPEZVibH4ebNueF|iw1s@m*!>?l0>u-+Dhxf9cn2b;X`2+_^3}xZ z*ycqq7woi!U=KQ#XdAT)x2?|n#a93Y(Mdt%Gwjkf!ian!UY`ks0AoA59;3>SKjQt$ z=#PBOZP>aU5j?>U6YgzF78iAV_NQNasLS66C{WRRAbS&|$o}P5^%XVwqoB;S5bQy? zhLc(V>erZq6zDKW3Yx^Hr@%iWO~B{*KGF}QR?kVR)aV}gDj;{n9?RU7ft6e3j_!d^ zh}>QjJ;Lm19zz?mU*uSm_Nh5aTHx3AxYTUICV76~Fd?_R0B{Z+@_h{D&6ADFx%`v1 z5L~sbw@hhRIln<2LitT6gB0F2&*5QUU`q3JaSX{| zeLMYpmWZRkvGPg2Eiz_pPXtO0kFfBnO%!l-Ji4Ib!#mx3MItqf_Z{RFj&x7IW5Xr4 zM>S5E!&0M5VbPlUu6>@m1S7 z0}jMam|B~-(AezPmYoyMHpWY?oWA|mp0EkI0*BlsJO7`tDmMEibl*wfRQ+#hh3W%G zzIpt*)?{eU<7gX{^C8vao~Zu_V3D1YNTpP5~# zCah2=9r^Bk{$Z&)%NZ(CmAjbigx>!skJ@c!qg$XcUNrZweV z9>>qz59gow&3WB2w{jJe){mz(cc!Y=cGe%-$DGo9H>vsLvXVqmk9CK>-(sCPtyzzk z>9PK{E}atgd&cix$*hS|4wY}Z-gv`0Vavy0(G>5#7eYHY-EyA)s=3byhmHStGS@R? XxqC0VF8nA3l=3`X{an^LB{Ts5^7%bK literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/msg_voicechat2.png b/TMessagesProj/src/main/res/drawable-xhdpi/msg_voicechat2.png new file mode 100644 index 0000000000000000000000000000000000000000..e0454a54ac0e553f5aa4089a8c6f2d01e28e44c0 GIT binary patch literal 842 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyy~ySip>6gB0F2&*5QUVA|s8;uw;_ z`gVqOwrHTh@nToU4~+HBtJ5wZ;#|p5CoW5s?vEO%JqP zl{%)n@tE!FP|}L4KYVwu&$oFui;K?5nLpz5IXCBK<)8Gl^Lg+3dP}dAKKTF6L4V1g zy8ZTjcSZJ?AKAw^n>R`4d)3~rOClKNw@rVz&7;WQU9|Br&!5e@Pqfx2SY(Sn+|ycM z(QsJHCeiX=>R;}obw|OelK0f=9fURq;yi7X9 zl4b4ly?*)!mo%=YVe9+5&T6i`(>2G4@ouPY`?L5Z8!jKRI1$;o=mpa%*}fBXzCSY} zSN=^ZVf=UDtC-1y?97EvgT!}j3v(P7u-3f&>n^K4bvkrSG%XC@S!^}2PSWzB`zUo6iz_+$jl=rI(&#d76Vgs{hNC9@M@ z){5K#z5lkpo@LtjT<`I;QvcYWYx$#p8`d$(7g}yzQ0;k6b6(Z`)jQ`3ANauC_NnD( zU};98e*9yxm&+FkYf9YSVaY;0PAh4_R;yf9TIq3=9opx+D;*LGDxhwOJjqd}e z*~WX!3mKnm+u(7mUhu(n-Db5fD_KumKIOV-I)D8481dOxmWn-?bwHY79`hfs$qt*3 zJW4nh=J!GP+ovPH%sDpfei-g5xIJ>SP3ERD<_o(YBu7pzIk=mzMApFi1G{x|>ArT2 RNozsr*wfX|Wt~$(69AZnYYPAX literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/voice_volume_mini.png b/TMessagesProj/src/main/res/drawable-xhdpi/voice_volume_mini.png new file mode 100644 index 0000000000000000000000000000000000000000..930d7785c24659c8ac2f21c5ef7873207bcb3a35 GIT binary patch literal 859 zcmV-h1ElPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91AfN*P1ONa40RR91AOHXW0IY^$^8f$>#Ysd#R9Fe^mQ8F-Q5c42T7SW! zKT^R$6Y3|L*jHF!XN84W2({?W0t+G{tw<~^D6zAUh=quighV35f(S|zvCz@S=k%O=?ww4gVT~O~xdTxY%}H6BzKltm!5Q!g z$cDkj^c`!cWTJ)O7AUr#2wmk`5$goA%EhbFX|NOw0k``&M}a1nod`8T-=B*{(POwh zlv7coup7LyMxx7LwhG}l60q~3M(Dk{X#USDs3VjYYb5B5yMQJYc7Sidtv^o2L7Z^` z$|dKt7sEG_^|4Q&2^~Je`q}?;Wo8`Tfvm+{oY<%l)R&p9!SgCY<7a$KC7P#?~;%H1$r(Y zTa~9wMhl31P%mb(m-KpV{njV?j+wvQwcJDEgF5qP>(`p-`_=pw*Z#`_IOk?2@YnNu zpA24R{s-5zfUFPd$h+ya$okz)^j&GbA4TpN&_m<4*qyY@f3KI&1*;!{@5o2j)mtqe zdy*$^01u2_wR&LmWS+!d1An)KKk#jG9@)4Wx<-=D_&3-`?X(s38c)I3&Ce5)ZUcWo zIU6V_umQ=T_rO*3QLxo(@Ye!=2NX`8Na`W!CKv-B4HK~26`X=!L5xcl;QgG*X#r1x zO#N1PtRj=V1Uv(7_i*AXgg@f~h_``Z;C86uq{RtT>eZ^9anpCbQ+cp|UEalY z!TNUA?rf1jkz<>^dR&#<99=dB>TC%ze6&~~Cy7NcXhrKZ%_Bi;Y8u6ortUuw@pA>s zK_?C^2@w`hy1>o68T${MhmQPVu`pKljbOId|{o z+S;X4xuyVNg~*EQubm%gR`B;#otpN}WQjjRa(&@3>%`N))+Vq=+&x)X6z#qE^#T5b zHK~FT5scvnm<+zLKUb4D)$6lc-(@npL$uO{Jcc{WcGbQ~sk`?+-PWfTE!Jq7eUQgv zbN5ccmrq&~E^gttlE?U7=h^&@;|Iz<1U;QsdMSKecBWM*OV+n0{jLQ&HYZHZ6#GBP z$IUGL8Moo3E#WLhj~|4)oZ-1_vD(D)(IYMe7lj8xiCsUXE|hgIh@aelO+1>RpJUdJ zAJcOmsi}p_FlKC%k74+EaXJ?tsG(98Fctn$x8 z90lhL!jp}aRPGsyc{cQS{gCv8_RI%Fe14&b+tatdSDU)ic(1Nwky40MmvkF}8 zQgKpa(h%f(%wB7mqUNA-i2K+Kjx)KFYdEH@WN?~r`k?Bej{+yW`Dbz~=syxj+#8wzvg2vkItCQ;B-#;P@BSg;fyTf3)^-_zZYP?%YW-u#@jIdmB$x4{*+u( zUVd)5Ue-bd5kW0a+sjXqKeaEKCG}YLgIU+t53?U|F8{G+p3i4jmMl5O&ov9W>L)$E z;~zcSdmfv6!=F{z$FfAW?m2pP)&_lcDI3-=U%h5zY%-U)&3@&*#LqV4ev1l0vrA8S z4S1g&Was|0!h80Wqu+RXIG&tis!rF;5%l@IPSEJL!=ud%d;6kp@)x|-5shNGetE%p zfx9bDcFS`f*zm;ywTmJ;-81g=j z5B9u%ebpS*Z5+mFwI7tvo~~zFr#8q@#guKme%AcXgp{j1XRa5&;oQK^(@<$}RQJ91u}fa8 dFj%$ZK)s`#MgXtMhConu^K|udS?83{1OOE?qHh2I literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/voice_volume_speaker.png b/TMessagesProj/src/main/res/drawable-xhdpi/voice_volume_speaker.png new file mode 100644 index 0000000000000000000000000000000000000000..7ec7f5e652aba7b3bbe1dc3a6f15045b8c8d888c GIT binary patch literal 849 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 literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/arrow_newchat.png b/TMessagesProj/src/main/res/drawable-xxhdpi/arrow_newchat.png new file mode 100644 index 0000000000000000000000000000000000000000..72943b46491641794a201f74fc3c0aff396648ac GIT binary patch literal 779 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbB7>k44ofy`glX(f`xTHpSruq6Z zXaU(A42G$TlC0TWzSWdSpS4N|DZ_xKM315>G|i(^Ox z=iBN29wC7u$I{QJ7_H#w5^yn3QgA$NmUuxaYXmv8|dX zZn<=CTNO#cbtR;@WNIb@a>c0yjSP^qS{)#U0PI9^QNZ+Ar3AJ$ok8LZ_rPV(w&% zO!=+S$KUtpZ?cN_S@&>*fkMKsf{V3V&hN-I*vE2a(n(WUu}`NOF8bE?Z!oxZAY92n z$(N03*<`CG%T-OwLK`ZROO_=H2^j1y*y$=$oaf(I`J`xOijV-`^^V|knR2yEulo|drLTP1?_;*RRS!EHnDgM}@s_+N zRlg4=aLl+`rIasUm3rVyf{Am4L~ZpI@l7cbuUh)|n!RSU&A7#4(Cwzq>#W@pJimB0 z+q0#oRZnVMFn(;teMWZi|FaWnO&ng7N37l&=Aiw7{j$%@2OMmP5uk+V>FVdQ&MBb@ E08>p$wg3PC literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/msg_background.png b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_background.png new file mode 100644 index 0000000000000000000000000000000000000000..70eb44b84ae280e54f4c57858635ab2cc0012f38 GIT binary patch literal 1647 zcmV-#29WuQP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91NT34%1ONa40RR91NB{r;0FW_8?*IS=*-1n}RCodHoLz`jRTRhPhFFLp@0#_!9Ug$UOMklMjIs)KerCO%eEkd7F_aE5o1= zN+YEyCHipue9-Z?F6SQ3S$FMo&$;)WGxwhMg1=|4uf5m)-}73q$=-AYcK6CtS|l76lmqQ}$(G2wm^ zR{%ZXtJsb(fRGUi@l}*Hp`p7QUr_%*OC>VVMPM8x$qk%a>I2XobOfKpz8TD~#};*z zF@v$C22122l1=Dk82o4TX4t}06yF}hFNMv^Rzc^Zr3PS;v?tSObRtim3m~mT2|8&c zZO&9cj=|I>XR(%(sfQ%90*>n*5_EluO&YOCW2g#X_q~Tm(W)xf=0qw#TzbrJj$V!h9JI0e8wDy!M8x({m5}Ru+wZ! zX0(>poml}HLR813G-pu97*QR0f)pWI^#o}~lj)rx42Re1QBmQ%s#Lq>yao|(2E^#Ys~AR!Y5B72 zX@Z#ea}e-0NV=4U@E;;puWQ2GTzZxuCM=6V<+4h12|YpF7&!}?QxcEp3W6v+Qys)F zV;Y|TYpuXB?APPdtZ5JN@0aA>Z}^<1OocgnX~99EGr>+ULHZSr@(C|*))g^Jh}jS3 z8nFkltpXdtHN$@|wxjg%sNqX*qJvx)FVO!iZ~$nzhT&ybrT7+r(>f{8zv6gDJ(uZ_kMoi5_%pWw?0I4C96iLuMMrE?dUm+v^Q5MPbh zQZ>oBLf{MFom2^~Ag=q4Kj!H(DibIVTH|Bi3a&puKOr=epkv6bHaYBkbk|&b-!+#3@ zixR`fJO_O;DLzkMk!R3hCbGI2IeN0wNsiRwB1oPtT88*Etv?QRoT)R>wV>h4oEh9j zM%N|wol)as*yQh>=vD-|md^m$19~}!&IAHxa|efjOWN!Kn>V*fw8 zo?~pKR3KGee~yAEsVTDy36nPkiTmbruL6?%|GbcfWr&h(*PDR+T(c0wz9*sQE%H4_ tUaXCQ?)kqv@}9Nt-!tGD@C=lhftzgv%BLnPH`V|E002ovPDHLkV1iE8=I#Ih literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/msg_copy_filled.png b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_copy_filled.png new file mode 100644 index 0000000000000000000000000000000000000000..981189127e666aae6d6776bb272ad90ee3ad826c GIT binary patch literal 926 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(<^v49!D1}U6i==L6{oWs+_F{Fa= z?X2BhB90<$<=3R+3SB?^Vqoi1n$aO4!7*z_=7J3i?b=uRD@b(AY~1;#?NP(@Ge=!~ z!U`Ract7YpD7&Be?1gLJs+O(ZRh2&L|AF&YzFv8`-tYSt15;yVVMaj#IBMi#+S|2F z$M^8V0`|V`suut6zW!RLa%TRVl?QHg=`Gy-!t_^LP_8I@|HW@7cV3z`QQ(ixEceqI z)9EVV>-)-~yIcvYr9lq{8FTXW!3lyC+dqs@H^NF@M*4}Gb`{;>sRhL*t;)RyW zDe^HJ_9{+)`>e`OvV_N0oBv!$UF-eJua92LvTkg#m)BxWzT^5ucxx)N*sfb5JuAK| zFl~^ZcfVPIZ}Pow>x_+#yA@bl|J3R@ru@hIb1lj| zi(mAK2I-nL>olA{_~`cy!`nM2PITPX-0sHvR!ryc^C0rFp6 z%T#_;2^TzaUST=e=T`H(h4vcDZIAr?H|ycw@``KGIx#aJ@Lwq7durivPd)oyd-f_l gCM5+FB<%4(KV^32f-^DpU7)<->FVdQ&MBb@0FOtCU;qFB literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/msg_delete_filled.png b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_delete_filled.png new file mode 100644 index 0000000000000000000000000000000000000000..899b452dcb3aea8fd365945f9b3354d6b1b67e9f GIT binary patch literal 1186 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 Dh3Zq@ literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/msg_link_2.png b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_link_2.png new file mode 100644 index 0000000000000000000000000000000000000000..f5ede48dd1a2b1c92e3f352a04dbd1738bff9d71 GIT binary patch literal 1532 zcmZuxeK^wz9RDpZo5`YF&2CbMje3M3T$7ezi!Ef2%1flpBRUI}a!!&ih;5I{vwP?s@Ky&)fI=`TLXTL3Y)GBA@^OXb}l`uMH(^ z0;0ab6lIy~hJd2HT#o`GIdWtp;Hf8xG!hBex8WfG=vFA8x>?x(Vgmr6A^-s@8w%RI z3AX(6B?wgh^_xYWrOPA$sL_acoOcXJndQ%+P;{Fmp^2W}sH_Yw%n-HD5PB?OPSC*? z+~85qbK4n02jLQP+X>b-oDh%KX5u+%+lf@D4$k1P9gCX94#uz!w_1D};uu)1^K-1m ztNm9LQ4a3c!BAEzN|ZyQoSHqD05f=JGTpCmik#K7HhSPFi}j2z)eN2?066egb@} zJnV`CmR%S{0)m7vJ(sUq(S@rHcK4glgLAvT6#uBttW~y*Mjbji z?!uadtq4c0w!%YJT8dI;KL%Q!)Iy1oU5mP6jqpmwr@c`~4r;dxY7Hfr% zSSW?u`jbvh+=^*P};#+QnLOZA`x%R=*8}31! zM$G7^%+8%5SJC{QbnKUS^|zX3h4y9wp68Q6lG_nw9skV?E!h!ztC%@acM&|;uv8FL zZdCFT$D>XA@7~)_hr`j--t|sD_O*=u$gfFGZ}jK~lIKw*mdI39)(y8Y3*A2VyaDf! zxn|^?M`%J$GNp{1$@8;#a{mk^0ktS$A8&x|=xxg!EVMz(kdz>|_7gUj+hsa}Vdt|7 zhTii|%aBXs+|Q`(y{WC{+#3VYdBY`1lAKnm!2{VsdkE?7xtS+?k|6!cP;oO6Qf*xK z9#HR6#O7EU%dwPDr=5oy-I0UwbLL_71$mkSAm0q@u;8-J2eta>GBjktX+Cm^Sn7Gblog z+9?@XtaIB2gLPYjEUEn5cvj(T-=DT0cez3v6@eId7G-{8u4k=Q`F~rs+e3X~OJ20$ Tm2rF(W^;Lo&SbpkXdvrvmUhW$ literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/msg_maxvideo.png b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_maxvideo.png new file mode 100644 index 0000000000000000000000000000000000000000..ae9ffc264b1ec0472bca2f60bb6fb4b0b2dd31ac GIT binary patch literal 2951 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 literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/msg_minvideo.png b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_minvideo.png new file mode 100644 index 0000000000000000000000000000000000000000..904f978121c4483282e158b233210056922bb01b GIT binary patch literal 782 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 literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/msg_voicechat2.png b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_voicechat2.png new file mode 100644 index 0000000000000000000000000000000000000000..57059581d76c55a99cf1eecc2cc55eb43d088fdb GIT binary patch literal 1116 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 a2JQf~ohb9`#G@+!0000Gcd3Sc)B=- zR4~4sZJQwyC~&;k(Wl4lAiv0!hz=ocS3yMuDOT^*9A=Et(%g(H@7$DBe8nmCkxR5o=8^|Z!&Ua0uzCKMs}{_VNjyL}6-nd{%}omshg=lv&T-@lbb zN1f?u5Hw(NJHR2qsGPt8;Ut7{hNP8d3rerPnswXbes|d--3+GQMT#X`gI3l&ySnBg z3q!o4df=?T3Om+cyscMjyI|Ww>C7j>8~69{PnC;W%)n60xobYd8p(eunYoMqwOzU< z*zsa%+Ya^TL74|lAN4YCVehRv(B)lbeEg!+7OtOV{^zAWmQUHl=J5N1{*%p~bN+f7 zoUyj)e0)+yTAP!hh{3nAq3gBwt5WZWlbg3>7gc2~Q)Sp2R&s9Xj2YpQ<-cD&+|Ksn zKt?UYl-LuwBAbr0OlyB7xS6fxLCQ~79Vth}$;V2TTvg2D^m&wt4>{G5MB0Y(i+C2 z8$(04v8^x=ou0z0(YJQhCR2yjl{-|j9SU*5m)*ecvxa{{@da0rP1{+n?JoTo$sD8c^$cT`$jP;@?W7OyRF0fqxm*3B zt%mya8y4LR4&N6S@<$Y&?&Cv+2~&0Jlo+Yz~HM z*{ZcI^L#e1-Y9iomdpx0SN=&Q#>d1>N_Ewn7!Evjs8(g(BeSD_;T8Qn!P#3wrZW_j zFLeAOchWKH3)fsn>AN+vr4gABks|{Hf3UAG6M9lFsq+k2L@;=|`njxgN@xNAljrR? literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable/shortcut_preview.png b/TMessagesProj/src/main/res/drawable/shortcut_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..8b1ba2043175676c98fa3243a6d9fdfab703b138 GIT binary patch literal 165366 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%0ApTXAY( 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

S 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 uoU8&$9-BjmxhYAa)qLG`2PdlPXW;Y literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/layout/feed_widget_item.xml b/TMessagesProj/src/main/res/layout/feed_widget_item.xml new file mode 100644 index 00000000000..974a3fbb6fb --- /dev/null +++ b/TMessagesProj/src/main/res/layout/feed_widget_item.xml @@ -0,0 +1,29 @@ + + + + + + + + \ No newline at end of file diff --git a/TMessagesProj/src/main/res/layout/feed_widget_layout.xml b/TMessagesProj/src/main/res/layout/feed_widget_layout.xml new file mode 100644 index 00000000000..f0b8e7c1b9b --- /dev/null +++ b/TMessagesProj/src/main/res/layout/feed_widget_layout.xml @@ -0,0 +1,25 @@ + + + + + + + \ No newline at end of file diff --git a/TMessagesProj/src/main/res/layout/shortcut_widget_item.xml b/TMessagesProj/src/main/res/layout/shortcut_widget_item.xml new file mode 100644 index 00000000000..9b06dd8742a --- /dev/null +++ b/TMessagesProj/src/main/res/layout/shortcut_widget_item.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TMessagesProj/src/main/res/layout/shortcut_widget_layout.xml b/TMessagesProj/src/main/res/layout/shortcut_widget_layout.xml new file mode 100644 index 00000000000..d55964ba5c5 --- /dev/null +++ b/TMessagesProj/src/main/res/layout/shortcut_widget_layout.xml @@ -0,0 +1,25 @@ + + + + + + + \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/audio_speed.json b/TMessagesProj/src/main/res/raw/audio_speed.json new file mode 100644 index 00000000000..e6dd4e39289 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/audio_speed.json @@ -0,0 +1 @@ +{"v":"5.7.1","fr":60,"ip":0,"op":75,"w":512,"h":512,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Null 1","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.31],"y":[0]},"t":55,"s":[0]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":65,"s":[3]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":70,"s":[-1]},{"t":74,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":0,"s":[199,388,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":7,"s":[199,280,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":13,"s":[199,306,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":18,"s":[199,314,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":25,"s":[199,299,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":32,"s":[199,314,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":39,"s":[199,299,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":46,"s":[199,314,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":53,"s":[199,299,0],"to":[0,0,0],"ti":[0,0,0]},{"t":62,"s":[199,306,0]}],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":0,"s":[0,0,100]},{"t":9,"s":[100,100,100]}],"ix":6}},"ao":0,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Body","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.31],"y":[0]},"t":2,"s":[10]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":13,"s":[-14]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":20,"s":[-10]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":27,"s":[-13]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":34,"s":[-10]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":41,"s":[-12]},{"i":{"x":[0.506],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":48,"s":[-9]},{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.31],"y":[0]},"t":55,"s":[-13]},{"t":65,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.2,"y":0},"t":2,"s":[-82.367,118.339,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0,"y":1},"o":{"x":0.2,"y":0},"t":4,"s":[-95.349,134.878,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.953,"y":0},"t":41,"s":[62.651,134.878,0],"to":[0,0,0],"ti":[0,0,0]},{"t":62,"s":[-41.349,134.878,0]}],"ix":2},"a":{"a":0,"k":[-148.349,134.878,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0.024],[-10.136,0],[0,0],[0,-0.03],[8.342,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-6.267,-0.007],[0,-0.032],[0,0],[8.253,0],[0,0.031],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-120.513,-117.597],[-121.338,-117.599],[-121.524,-117.599],[-120.774,-117.596],[-121.123,-117.599],[-120.99,-117.597],[-120.724,-117.595],[-120.419,-117.597],[-135.694,-117.598],[-136.53,-117.597],[-145.275,-117.642],[-130.205,-117.697],[-45.617,-117.697],[-32.341,-117.646],[-45.617,-117.594],[-103.205,-117.594],[-104.413,-117.594],[-118.132,-117.596],[-119.348,-117.596],[-119.759,-117.596]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0.024],[-10.136,0],[0,0],[0,-0.03],[13.034,-0.954],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.137,1.403],[0,-0.032],[0,0],[8.253,0],[0,0.031],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-120.345,-121.271],[-121.17,-121.273],[-121.355,-121.274],[-120.605,-121.27],[-120.955,-121.273],[-120.821,-121.272],[-120.556,-121.269],[-120.251,-121.271],[-135.526,-121.272],[-138.665,-120.691],[-139.552,-116.895],[-130.244,-110.538],[-45.655,-110.538],[-32.341,-117.646],[-46.083,-120.129],[-103.823,-121.186],[-105.03,-121.185],[-117.964,-121.271],[-119.18,-121.271],[-119.591,-121.271]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.039,-5.963],[-9.837,0.066],[0,0],[0.049,7.476],[8.096,-0.054],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-6.229,5.916],[0.052,8.01],[0,0],[8.009,-0.053],[-0.05,-7.654],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-122.419,-121.338],[-122.439,-121.311],[-122.411,-121.281],[-122.313,-121.32],[-122.47,-121.35],[-122.546,-121.353],[-122.502,-121.295],[-122.451,-121.09],[-122.58,-121.327],[-139.297,-105.56],[-147.724,-89.661],[-133.011,-76.23],[-50.922,-76.777],[-38.121,-89.501],[-51.087,-102.053],[-106.974,-101.681],[-92.584,-120.09],[-101.867,-120.536],[-107.919,-120.778],[-110.081,-120.923]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.063,-5.934],[-9.65,0.106],[0,0],[0.079,7.439],[7.942,-0.088],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-6.086,5.913],[0.085,7.971],[0,0],[7.856,-0.087],[-0.081,-7.617],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-90.929,-117.304],[-103.529,-117.63],[-106.364,-117.703],[-106.115,-116.732],[-106.103,-116.634],[-105.536,-116.522],[-105.006,-115.202],[-104.947,-115.411],[-105.434,-115.293],[-141.055,-79.473],[-149.255,-63.616],[-134.765,-50.313],[-54.238,-51.201],[-41.734,-63.917],[-54.507,-76.354],[-109.33,-75.749],[-78.246,-108.067],[-76.387,-113.467],[-76.385,-115.326],[-76.385,-115.954]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[6.675,-7.566],[0,0],[-0.088,-5.904],[-9.462,0.147],[0,0],[0.11,7.403],[7.788,-0.121],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-5.943,5.91],[0.118,7.931],[0,0],[7.704,-0.12],[-0.113,-7.579],[0,0],[0,0],[14.21,-15.05],[0,0],[0,0],[0,0]],"v":[[-64.173,-111.906],[-129.827,-112.253],[-134.85,-112.3],[-134.798,-112.304],[-134.784,-112.222],[-134.677,-112.303],[-133.467,-112.233],[-89.125,-112.337],[-100.909,-96.791],[-142.813,-53.386],[-150.786,-37.572],[-136.519,-24.396],[-57.554,-25.626],[-45.347,-38.333],[-57.926,-50.654],[-111.686,-49.817],[-81.343,-82.111],[-63.276,-110.187],[-63.506,-110.975],[-63.583,-111.241]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[{"i":[[0,0],[0,0],[0,0],[-0.045,-2.368],[-7.798,0.158],[-3.165,6.293],[-11.245,0.228],[-7.202,-1.462],[16.981,-18.065],[0,0],[-0.112,-5.875],[-9.275,0.188],[0,0],[0.14,7.366],[7.634,-0.155],[0,0],[0,0],[0.348,18.24],[4.464,-0.059],[0,0]],"o":[[0,0],[0,0],[0,0],[0.149,7.804],[6.32,-0.128],[3.938,-0.037],[12.476,-0.253],[0.206,10.786],[0,0],[-5.799,5.908],[0.15,7.892],[0,0],[7.551,-0.153],[-0.144,-7.541],[0,0],[0,0],[22.461,-23.528],[-5.384,0.37],[-2.181,0.029],[0,0]],"v":[[-107.081,-109.419],[-144.461,-109.504],[-152.871,-109.524],[-153.66,-112.119],[-140.941,-99.658],[-128.146,-109.041],[-107.401,-109.496],[-82.842,-108.372],[-103.684,-70.676],[-144.57,-27.3],[-152.317,-11.528],[-138.273,1.521],[-60.871,-0.051],[-48.96,-12.75],[-61.345,-24.955],[-114.042,-23.885],[-84.439,-56.154],[-54.253,-109.489],[-57.274,-109.113],[-75.378,-108.875]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[{"i":[[0,0],[13.478,-0.866],[1.34,-5.201],[-0.055,-2.356],[-7.64,0.193],[-3.072,6.276],[-11.018,0.278],[-0.287,-12.303],[16.558,-18.053],[0,0],[-0.136,-5.846],[-9.088,0.229],[0,0],[0.171,7.329],[7.479,-0.189],[0,0],[0,0],[0.423,18.149],[4.717,6.573],[0,0]],"o":[[0,0],[-3.698,4.601],[-0.593,2.198],[0.181,7.765],[6.193,-0.156],[4.627,-12.077],[12.225,-0.309],[0.25,10.732],[0,0],[-5.656,5.905],[0.183,7.853],[0,0],[7.399,-0.187],[-0.175,-7.504],[0,0],[0,0],[21.903,-23.514],[-0.156,-9.157],[-5.138,-0.457],[0,0]],"v":[[-108.908,-107.489],[-147.12,-107.243],[-154.731,-92.321],[-155.619,-85.576],[-143.1,-73.233],[-130.604,-82.628],[-107.457,-101.109],[-85.976,-80.611],[-106.46,-44.562],[-146.328,-1.213],[-153.848,14.517],[-140.027,27.438],[-64.187,25.524],[-52.573,12.834],[-64.765,0.744],[-116.397,2.047],[-87.536,-30.198],[-58.198,-83.408],[-65.748,-107.229],[-72.493,-107.035]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[13.069,-0.397],[7.702,-10.942],[1.126,-4.528],[-0.065,-2.344],[-7.483,0.227],[-2.98,6.26],[-10.791,0.328],[-0.338,-12.241],[16.135,-18.041],[0,0],[-0.161,-5.817],[-8.901,0.27],[0,0],[0.202,7.292],[7.325,-0.223],[0,0],[0,0],[0.499,18.058],[4.76,6.562],[3.24,2.406]],"o":[[-18.422,0.559],[-2.902,4.123],[-0.57,2.189],[0.214,7.727],[6.065,-0.184],[4.476,-12.04],[11.973,-0.364],[0.295,10.678],[0,0],[-5.513,5.902],[0.216,7.813],[0,0],[7.247,-0.22],[-0.206,-7.466],[0,0],[0,0],[21.345,-23.5],[-0.198,-9.226],[-2.326,-3.206],[-8.354,-6.203]],"v":[[-111.22,-93.847],[-151.056,-73.861],[-157.133,-60.739],[-157.972,-54.023],[-145.651,-41.798],[-133.455,-51.205],[-110.868,-69.703],[-89.732,-49.405],[-109.629,-13.438],[-148.479,29.883],[-155.771,45.571],[-142.174,58.365],[-67.896,56.109],[-56.579,43.427],[-68.577,31.453],[-119.146,32.989],[-91.026,0.768],[-62.536,-52.316],[-70.218,-76.231],[-78.595,-84.676]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.7,"y":0},"t":53,"s":[{"i":[[12.739,-0.469],[7.446,-10.922],[1.072,-4.508],[-0.077,-2.33],[-7.294,0.269],[-2.87,6.24],[-10.519,0.387],[-0.4,-12.167],[15.628,-18.027],[0,0],[-0.19,-5.781],[-8.676,0.319],[0,0],[0.238,7.248],[7.141,-0.263],[0,0],[0,0],[0.59,17.948],[4.678,6.497],[3.173,2.373]],"o":[[-17.958,0.661],[-2.805,4.115],[-0.543,2.18],[0.252,7.68],[5.912,-0.218],[4.295,-11.994],[11.671,-0.43],[0.349,10.614],[0,0],[-5.341,5.899],[0.255,7.766],[0,0],[7.064,-0.26],[-0.244,-7.421],[0,0],[0,0],[20.676,-23.483],[-0.245,-9.171],[-2.286,-3.174],[-8.18,-6.119]],"v":[[-114.549,-68.496],[-153.272,-48.4],[-159.121,-35.321],[-159.901,-28.639],[-147.82,-16.557],[-135.983,-25.978],[-114.068,-44.496],[-93.345,-24.438],[-112.538,11.432],[-150.167,54.718],[-157.186,70.355],[-143.857,82.996],[-71.453,80.33],[-60.492,67.659],[-72.258,55.824],[-121.551,57.639],[-94.32,25.448],[-66.847,-27.487],[-74.474,-51.217],[-82.69,-59.564]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":63,"s":[{"i":[[14.883,0],[9.108,-11.055],[1.424,-4.639],[0,-2.422],[-8.522,0],[-3.588,6.369],[-12.289,0],[0,-12.648],[18.927,-18.12],[0,0],[0,-6.01],[-10.136,0],[0,0],[0,7.535],[8.342,0],[0,0],[0,0],[0,18.658],[5.21,6.924],[3.611,2.586]],"o":[[-20.98,0],[-3.431,4.165],[-0.718,2.243],[0,7.983],[6.907,0],[5.472,-12.289],[13.635,0],[0,11.033],[0,0],[-6.459,5.92],[0,8.073],[0,0],[8.253,0],[0,-7.714],[0,0],[0,0],[25.027,-23.592],[0.065,-9.531],[-2.545,-3.383],[-9.31,-6.666]],"v":[[-65.81,-76.276],[-111.766,-56.892],[-119.093,-43.535],[-120.259,-36.628],[-106.624,-23.622],[-92.451,-32.951],[-66.169,-51.339],[-42.757,-29.721],[-66.528,6.787],[-112.096,50.293],[-120.887,66.26],[-105.817,79.894],[-21.228,79.894],[-7.952,67.157],[-21.228,54.419],[-78.817,54.419],[-45.806,22.037],[-11.72,-31.874],[-19.709,-56.804],[-28.976,-65.785]],"c":true}]},{"t":68,"s":[{"i":[[14.883,0],[9.108,-11.055],[1.424,-4.639],[0,-2.422],[-8.522,0],[-3.588,6.369],[-12.289,0],[0,-12.648],[18.927,-18.12],[0,0],[0,-6.01],[-10.136,0],[0,0],[0,7.535],[8.342,0],[0,0],[0,0],[0,18.658],[5.21,6.924],[3.611,2.586]],"o":[[-20.98,0],[-3.431,4.165],[-0.718,2.243],[0,7.983],[6.907,0],[5.472,-12.289],[13.635,0],[0,11.033],[0,0],[-6.459,5.92],[0,8.073],[0,0],[8.253,0],[0,-7.714],[0,0],[0,0],[25.027,-23.592],[0.065,-9.531],[-2.545,-3.383],[-9.31,-6.666]],"v":[[-71.806,-76.067],[-117.762,-56.683],[-125.089,-43.326],[-126.255,-36.419],[-112.621,-23.412],[-98.448,-32.741],[-72.165,-51.13],[-48.753,-29.512],[-72.524,6.997],[-118.092,50.502],[-126.883,66.469],[-111.813,80.104],[-27.225,80.104],[-13.949,67.366],[-27.225,54.628],[-84.813,54.628],[-51.803,22.246],[-17.716,-31.665],[-25.706,-56.594],[-34.972,-65.576]],"c":true}]}],"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":2,"s":[{"i":[[2.918,-3.404],[5.234,-5.12],[0,0],[1.578,-3.059],[-8.515,-0.332],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.717,-3.187],[-10.267,0.568],[-0.621,7.097],[0,0],[0,0],[0,0],[0,0],[0.924,6.601]],"o":[[-1.396,1.629],[-10.963,10.723],[0,0],[-2.424,4.699],[9.44,0.368],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[6.337,-0.351],[0.289,-3.306],[0,0],[0,0],[0,0],[0,0],[-2.072,-14.802]],"v":[[-32.087,-67.908],[-43.056,-56.827],[-68.908,-31.93],[-74.329,-23.551],[-64.105,-6.331],[-49.974,-10.777],[-38.372,-23.327],[-37.981,-21.666],[-38.367,14.331],[-38.67,52.382],[-37.9,65.219],[-34.837,81.422],[-22.077,85.239],[-9.867,74.134],[-9.922,66.74],[-9.943,51.172],[-9.94,28.221],[-10.147,-28.672],[-10.934,-60.083]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[3.286,-3.711],[5.895,-5.582],[0,0],[1.777,-3.335],[-9.59,-0.362],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.187,-3.475],[-11.563,0.619],[-0.699,7.737],[0,0],[0,0],[0,0],[0,0],[1.041,7.197]],"o":[[-1.572,1.776],[-12.347,11.691],[0,0],[-2.73,5.123],[10.632,0.402],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[7.137,-0.382],[0.326,-3.604],[0,0],[0,0],[0,0],[0,0],[-2.334,-16.137]],"v":[[-87.804,-94.075],[-100.158,-81.994],[-129.274,-54.851],[-135.38,-45.716],[-123.864,-26.943],[-107.949,-31.79],[-94.882,-45.472],[-94.442,-43.661],[-94.877,-4.417],[-95.218,37.067],[-94.351,51.062],[-90.901,68.727],[-76.53,72.888],[-62.779,60.781],[-62.84,52.72],[-62.864,35.747],[-62.861,10.726],[-63.094,-51.299],[-63.979,-85.543]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[3.286,-3.711],[5.895,-5.582],[0,0],[1.777,-3.335],[-9.59,-0.362],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.187,-3.475],[-11.563,0.619],[-0.699,7.737],[0,0],[0,0],[0,0],[0,0],[1.041,7.197]],"o":[[-1.572,1.776],[-12.347,11.691],[0,0],[-2.73,5.123],[10.632,0.402],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[7.137,-0.382],[0.326,-3.604],[0,0],[0,0],[0,0],[0,0],[-2.334,-16.137]],"v":[[-87.397,-74.143],[-99.751,-62.062],[-128.868,-34.92],[-134.973,-25.784],[-123.458,-7.011],[-107.543,-11.858],[-94.476,-25.54],[-94.036,-23.73],[-94.471,15.514],[-94.811,56.999],[-93.945,70.993],[-90.495,88.658],[-76.123,92.82],[-62.372,80.713],[-62.434,72.651],[-62.457,55.679],[-62.454,30.658],[-62.687,-31.367],[-63.573,-65.612]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[3.286,-3.711],[5.895,-5.582],[0,0],[1.777,-3.335],[-9.59,-0.362],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.187,-3.475],[-11.563,0.619],[-0.699,7.737],[0,0],[0,0],[0,0],[0,0],[1.041,7.197]],"o":[[-1.572,1.776],[-12.347,11.691],[0,0],[-2.73,5.123],[10.632,0.402],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[7.137,-0.382],[0.326,-3.604],[0,0],[0,0],[0,0],[0,0],[-2.334,-16.137]],"v":[[-86.991,-54.212],[-99.345,-42.13],[-128.462,-14.988],[-134.567,-5.853],[-123.052,12.921],[-107.136,8.073],[-94.069,-5.609],[-93.629,-3.798],[-94.064,35.446],[-94.405,76.93],[-93.538,90.925],[-90.088,108.59],[-75.717,112.751],[-61.966,100.645],[-62.027,92.583],[-62.051,75.611],[-62.048,50.59],[-62.281,-11.435],[-63.167,-45.68]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[3.286,-3.711],[5.895,-5.582],[0,0],[1.777,-3.335],[-9.59,-0.362],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.041,7.197]],"o":[[-1.572,1.776],[-12.347,11.691],[0,0],[-2.73,5.123],[10.632,0.402],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.334,-16.137]],"v":[[-86.483,-29.297],[-98.837,-17.216],[-127.954,9.926],[-134.059,19.062],[-122.544,37.835],[-106.628,32.988],[-93.561,19.306],[-93.121,21.116],[-93.556,60.36],[-93.897,101.845],[-93.03,115.839],[-87.784,115.982],[-78.737,116.416],[-69.291,116.93],[-61.847,116.658],[-61.543,100.525],[-61.54,75.504],[-61.773,13.479],[-62.659,-20.766]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[3.286,-3.711],[5.895,-5.582],[0,0],[1.777,-3.335],[-9.59,-0.362],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.041,7.197]],"o":[[-1.572,1.776],[-12.347,11.691],[0,0],[-2.73,5.123],[10.632,0.402],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.334,-16.137]],"v":[[-85.975,-4.383],[-98.329,7.699],[-127.446,34.841],[-133.551,43.976],[-122.036,62.749],[-106.12,57.902],[-93.053,44.22],[-92.613,46.031],[-93.048,85.275],[-92.51,115.833],[-85.593,116.151],[-81.357,116.613],[-78.425,116.851],[-72.961,116.293],[-65.685,115.895],[-60.947,115.242],[-61.032,100.418],[-61.265,38.394],[-62.151,4.149]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[{"i":[[3.286,-3.711],[5.895,-5.582],[0,0],[1.777,-3.335],[-9.59,-0.362],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.041,7.197]],"o":[[-1.572,1.776],[-12.347,11.691],[0,0],[-2.73,5.123],[10.632,0.402],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.334,-16.137]],"v":[[-85.467,20.532],[-97.821,32.613],[-126.938,59.755],[-133.043,68.891],[-121.528,87.664],[-105.612,82.817],[-92.545,69.135],[-92.105,70.945],[-92.25,117.098],[-92.073,117.28],[-87.167,117.902],[-82.509,118.133],[-77.665,118.053],[-70.629,117.953],[-65.478,117.679],[-61.257,117.464],[-60.999,116.614],[-60.757,63.308],[-61.643,29.063]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[{"i":[[3.286,-3.711],[5.895,-5.582],[0,0],[1.777,-3.335],[-9.59,-0.362],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.041,7.197]],"o":[[-1.572,1.776],[-12.347,11.691],[0,0],[-2.73,5.123],[10.632,0.402],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.334,-16.137]],"v":[[-84.959,45.446],[-97.313,57.528],[-126.43,84.67],[-132.535,93.805],[-121.02,112.578],[-105.104,107.731],[-92.037,94.049],[-91.597,95.86],[-91.322,117.754],[-91.208,118.203],[-91.181,117.971],[-82.605,117.937],[-71.575,117.946],[-64.955,117.88],[-59.748,117.568],[-59.845,117.952],[-59.94,117.691],[-60.249,88.223],[-61.135,53.978]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[3.286,-3.711],[5.895,-5.582],[0,0],[1.777,-3.335],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.041,7.197]],"o":[[-1.572,1.776],[-12.347,11.691],[0,0],[7.009,0.476],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.334,-16.137]],"v":[[-83.888,84.178],[-96.242,96.26],[-110.312,110.36],[-116.3,116.722],[-115.867,116.61],[-99.837,116.42],[-90.188,116.093],[-89.687,117.216],[-89.774,116.389],[-90.17,117.222],[-90.181,116.326],[-84.933,115.518],[-77.277,116.058],[-72.884,115.731],[-64.096,116.373],[-59.381,116.129],[-58.818,114.831],[-59.111,115.282],[-60.064,92.71]],"c":true}]},{"t":53,"s":[{"i":[[3.286,-0.056],[5.895,-0.085],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.041,0.11]],"o":[[-1.572,0.027],[-12.347,0.178],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.334,-0.246]],"v":[[-86.652,114.148],[-99.006,114.332],[-110.411,114.495],[-110.888,114.503],[-104.681,114.416],[-98.122,114.318],[-93.796,114.221],[-93.296,114.238],[-93.383,114.226],[-93.778,114.238],[-93.79,114.225],[-88.504,114.189],[-80.902,114.153],[-76.569,114.134],[-67.917,114.176],[-63.095,114.262],[-62.459,114.483],[-62.757,114.232],[-62.828,114.277]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":2,"s":[{"i":[[8.342,0],[3.678,-5.472],[0,0],[0,0],[0,0],[6.1,0],[0,-8.701],[-3.498,-4.665],[0,0],[0,0],[0,0],[0,-3.947],[-8.522,0],[-4.037,5.831],[0,0],[0,0],[0,0],[-5.831,0],[0,8.432],[2.96,3.857],[0,0],[0,0],[0,0],[0,4.216]],"o":[[-6.1,0],[0,0],[0,0],[0,0],[-4.126,-6.279],[-9.329,0],[0,4.126],[0,0],[0,0],[0,0],[-3.05,4.216],[0,7.714],[6.01,0],[0,0],[0,0],[0,0],[4.126,5.651],[8.88,0],[0,-4.216],[0,0],[0,0],[0,0],[3.05,-3.947],[0.09,-7.714]],"v":[[137.788,-73.187],[124.781,-65.383],[90.963,-16.047],[90.156,-16.047],[57.415,-64.306],[42.973,-73.187],[26.737,-58.117],[31.401,-45.828],[68.269,4.405],[68.269,5.213],[30.146,58.406],[25.84,69.977],[41,83.881],[54.455,76.077],[88.003,28.445],[88.811,28.445],[122.897,75.987],[136.801,83.971],[152.14,69.529],[147.924,57.868],[109.352,5.841],[109.352,5.123],[149.09,-47.98],[153.306,-59.462]],"c":true}]},{"i":{"x":0.2,"y":0.742},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[7.908,-0.143],[3.384,-6.028],[0,0],[0,0],[0,0],[5.782,-0.104],[-0.162,-9.485],[-3.404,-5.025],[0,0],[0,0],[0,0],[-0.074,-4.303],[-8.078,0.146],[-3.718,6.425],[0,0],[0,0],[0,0],[-5.527,0.1],[0.157,9.192],[2.878,4.154],[0,0],[0,0],[0,0],[0.079,4.596]],"o":[[-5.782,0.104],[0,0],[0,0],[0,0],[-4.029,-6.775],[-8.844,0.16],[0.077,4.498],[0,0],[0,0],[0,0],[-2.812,4.648],[0.144,8.41],[5.697,-0.103],[0,0],[0,0],[0,0],[4.017,6.09],[8.419,-0.152],[-0.079,-4.596],[0,0],[0,0],[0,0],[2.818,-4.355],[-0.059,-8.411]],"v":[[89.471,-101.108],[77.287,-92.378],[46.149,-38.016],[45.384,-38.003],[13.445,-90.052],[-0.412,-99.486],[-15.522,-82.781],[-10.871,-69.463],[25.017,-15.333],[25.032,-14.453],[-10.115,44.187],[-13.981,56.875],[0.65,71.773],[13.26,63.036],[44.174,10.537],[44.939,10.523],[78.14,61.767],[91.47,70.233],[105.742,54.227],[101.527,41.586],[63.99,-14.471],[63.977,-15.253],[100.656,-73.823],[104.439,-86.412]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.3,"y":0.097},"t":25,"s":[{"i":[[7.535,-0.207],[3.163,-5.561],[0,0],[0,0],[0,0],[5.51,-0.151],[-0.253,-8.698],[-3.296,-4.576],[0,0],[0,0],[0,0],[-0.115,-3.945],[-7.697,0.211],[-3.477,5.928],[0,0],[0,0],[0,0],[-5.266,0.145],[0.245,8.429],[2.786,3.782],[0,0],[0,0],[0,0],[0.123,4.214]],"o":[[-5.51,0.151],[0,0],[0,0],[0,0],[-3.91,-6.174],[-8.426,0.231],[0.12,4.125],[0,0],[0,0],[0,0],[-2.632,4.29],[0.224,7.711],[5.429,-0.149],[0,0],[0,0],[0,0],[3.891,5.547],[8.021,-0.22],[-0.123,-4.214],[0,0],[0,0],[0,0],[2.64,-4.021],[-0.143,-7.714]],"v":[[64.636,-75.371],[53.114,-67.248],[24.003,-17.092],[23.273,-17.072],[-7.703,-64.501],[-21.006,-73.019],[-35.233,-57.553],[-30.662,-45.384],[4.098,3.914],[4.122,4.721],[-28.767,58.839],[-32.319,70.512],[-18.222,84.035],[-6.296,75.9],[22.622,27.455],[23.351,27.435],[55.522,74.113],[68.313,81.748],[81.748,66.931],[77.601,55.379],[41.249,4.33],[41.228,3.613],[75.577,-50.455],[79.052,-62.037]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.7,"y":0},"t":53,"s":[{"i":[[7.126,-0.196],[2.991,-5.258],[0,0],[0,0],[0,0],[5.21,-0.143],[-0.239,-8.224],[-3.116,-4.327],[0,0],[0,0],[0,0],[-0.108,-3.73],[-7.279,0.2],[-3.288,5.605],[0,0],[0,0],[0,0],[-4.98,0.137],[0.232,7.969],[2.635,3.576],[0,0],[0,0],[0,0],[0.116,3.985]],"o":[[-5.21,0.143],[0,0],[0,0],[0,0],[-3.697,-5.838],[-7.969,0.219],[0.113,3.9],[0,0],[0,0],[0,0],[-2.489,4.056],[0.212,7.291],[5.134,-0.141],[0,0],[0,0],[0,0],[3.68,5.244],[7.586,-0.208],[-0.116,-3.985],[0,0],[0,0],[0,0],[2.497,-3.802],[-0.135,-7.293]],"v":[[52.827,-69.634],[41.932,-61.953],[14.401,-14.531],[13.712,-14.512],[-15.582,-59.356],[-28.162,-67.411],[-41.617,-52.787],[-37.294,-41.281],[-4.422,5.331],[-4.4,6.094],[-35.502,57.263],[-38.862,68.301],[-25.53,81.087],[-14.251,73.395],[13.096,27.59],[13.785,27.571],[44.209,71.705],[56.305,78.925],[69.01,64.915],[65.088,53.993],[30.71,5.724],[30.691,5.046],[63.175,-46.076],[66.46,-57.027]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":63,"s":[{"i":[[8.342,0],[3.678,-5.472],[0,0],[0,0],[0,0],[6.1,0],[0,-8.701],[-3.498,-4.665],[0,0],[0,0],[0,0],[0,-3.947],[-8.522,0],[-4.037,5.831],[0,0],[0,0],[0,0],[-5.831,0],[0,8.432],[2.96,3.857],[0,0],[0,0],[0,0],[0,4.216]],"o":[[-6.1,0],[0,0],[0,0],[0,0],[-4.126,-6.279],[-9.329,0],[0,4.126],[0,0],[0,0],[0,0],[-3.05,4.216],[0,7.714],[6.01,0],[0,0],[0,0],[0,0],[4.126,5.651],[8.88,0],[0,-4.216],[0,0],[0,0],[0,0],[3.05,-3.947],[0.09,-7.714]],"v":[[124.358,-75.021],[111.351,-67.217],[77.533,-17.881],[76.726,-17.881],[43.985,-66.14],[29.543,-75.021],[13.307,-59.951],[17.972,-47.662],[54.839,2.571],[54.839,3.379],[16.716,56.572],[12.41,68.143],[27.57,82.047],[41.025,74.243],[74.573,26.611],[75.381,26.611],[109.467,74.153],[123.371,82.137],[138.71,67.695],[134.494,56.034],[95.922,4.007],[95.922,3.289],[135.66,-49.814],[139.876,-61.296]],"c":true}]},{"t":68,"s":[{"i":[[8.342,0],[3.678,-5.472],[0,0],[0,0],[0,0],[6.1,0],[0,-8.701],[-3.498,-4.665],[0,0],[0,0],[0,0],[0,-3.947],[-8.522,0],[-4.037,5.831],[0,0],[0,0],[0,0],[-5.831,0],[0,8.432],[2.96,3.857],[0,0],[0,0],[0,0],[0,4.216]],"o":[[-6.1,0],[0,0],[0,0],[0,0],[-4.126,-6.279],[-9.329,0],[0,4.126],[0,0],[0,0],[0,0],[-3.05,4.216],[0,7.714],[6.01,0],[0,0],[0,0],[0,0],[4.126,5.651],[8.88,0],[0,-4.216],[0,0],[0,0],[0,0],[3.05,-3.947],[0.09,-7.714]],"v":[[118.361,-74.811],[105.355,-67.007],[71.537,-17.671],[70.73,-17.671],[37.989,-65.931],[23.547,-74.811],[7.311,-59.741],[11.975,-47.452],[48.843,2.781],[48.843,3.588],[10.719,56.781],[6.414,68.353],[21.573,82.257],[35.029,74.452],[68.577,26.821],[69.384,26.821],[103.471,74.363],[117.375,82.346],[132.714,67.904],[128.498,56.243],[89.926,4.216],[89.926,3.498],[129.664,-49.605],[133.88,-61.087]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.2,"y":0},"t":4,"s":[{"i":[[0,0],[0,-28.435],[0,0],[28.435,0],[0,0],[0,28.435],[0,0],[-28.435,0]],"o":[[28.435,0],[0,0],[0,28.435],[0,0],[-28.435,0],[0,0],[0,-28.435],[0,0]],"v":[[137.378,-137.333],[188.867,-85.845],[188.867,85.845],[137.378,137.333],[-137.378,137.333],[-188.867,85.845],[-188.867,-85.845],[-137.378,-137.333]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[0,0],[0,-30.199],[0,0],[27.483,0],[0,0],[0,30.199],[0,0],[-27.483,0]],"o":[[27.483,0],[0,0],[0,30.199],[0,0],[-27.483,0],[0,0],[0,-30.199],[0,0]],"v":[[126.631,-155.306],[176.396,-100.624],[176.396,81.711],[126.631,136.393],[-138.928,136.393],[-188.693,81.711],[-188.693,-100.624],[-138.928,-155.306]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.953,"y":0},"t":51,"s":[{"i":[[0,0],[0,-26.886],[0,0],[26.444,0],[0,0],[0,26.886],[0,0],[-26.444,0]],"o":[[26.444,0],[0,0],[0,26.886],[0,0],[-26.444,0],[0,0],[0,-26.886],[0,0]],"v":[[114.899,-124.335],[162.782,-75.651],[162.782,86.683],[114.899,135.367],[-140.619,135.367],[-188.502,86.683],[-188.502,-75.651],[-140.619,-124.335]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":63,"s":[{"i":[[0,0],[0,-28.435],[0,0],[28.435,0],[0,0],[0,28.435],[0,0],[-28.435,0]],"o":[[28.435,0],[0,0],[0,28.435],[0,0],[-28.435,0],[0,0],[0,-28.435],[0,0]],"v":[[137.378,-137.333],[188.867,-85.845],[188.867,85.845],[137.378,137.333],[-137.378,137.333],[-188.867,85.845],[-188.867,-85.845],[-137.378,-137.333]],"c":true}]},{"t":68,"s":[{"i":[[0,0],[0,-28.435],[0,0],[28.435,0],[0,0],[0,28.435],[0,0],[-28.435,0]],"o":[[28.435,0],[0,0],[0,28.435],[0,0],[-28.435,0],[0,0],[0,-28.435],[0,0]],"v":[[137.378,-137.333],[188.867,-85.845],[188.867,85.845],[137.378,137.333],[-137.378,137.333],[-188.867,85.845],[-188.867,-85.845],[-137.378,-137.333]],"c":true}]}],"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Combined-Shape","np":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Lines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.2,"y":0},"t":4,"s":[70,277.55,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.953,"y":0},"t":41,"s":[130,267.55,0],"to":[0,0,0],"ti":[0,0,0]},{"t":62,"s":[178,259.55,0]}],"ix":2},"a":{"a":0,"k":[-186,-0.45,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-270.667,102.8],[-208,100.1]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-270.667,102.8],[-174,99.6]],"c":false}]},{"t":34,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-269.667,101.3],[-155,98.1]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":6,"s":[100]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":28,"s":[38]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":35,"s":[67]},{"t":42,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.73],"y":[1]},"o":{"x":[0.27],"y":[0]},"t":33,"s":[100]},{"t":41,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":30,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-204],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-270.667,102.8],[-174,99.6]],"c":false}]},{"t":40,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-299.667,101.8],[-174,99.6]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":8,"s":[100]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":26,"s":[72]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":33,"s":[15]},{"t":40,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.73],"y":[1]},"o":{"x":[0.27],"y":[0]},"t":31,"s":[100]},{"t":39,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":30,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-100],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-270.238,87.8],[-134.571,87.6]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-270.965,68.8],[-135.299,68.6]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-271.153,77.8],[-135.486,77.6]],"c":false}]},{"t":15,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-269.76,95.8],[-134.094,95.6]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":5,"s":[100]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":15,"s":[19]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":23,"s":[67]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":30,"s":[0]},{"t":37,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.73],"y":[1]},"o":{"x":[0.27],"y":[0]},"t":28,"s":[100]},{"t":36,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":30,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":180,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/audio_stop_speed.json b/TMessagesProj/src/main/res/raw/audio_stop_speed.json new file mode 100644 index 00000000000..ec61f8aa060 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/audio_stop_speed.json @@ -0,0 +1 @@ +{"v":"5.7.1","fr":60,"ip":0,"op":72,"w":512,"h":512,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Null 1","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[219,262,0],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":0,"s":[0,0,100]},{"t":7,"s":[100,100,100]}],"ix":6}},"ao":0,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Body","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.204],"y":[0.644]},"o":{"x":[0.26],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.629],"y":[1]},"o":{"x":[0.212],"y":[0.307]},"t":22,"s":[14]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.9],"y":[0]},"t":47,"s":[20]},{"t":59,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.2,"y":0},"t":4,"s":[170.651,178.878,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.9,"y":0},"t":47,"s":[226.651,178.878,0],"to":[0,0,0],"ti":[0,0,0]},{"t":59,"s":[231.651,178.878,0]}],"ix":2},"a":{"a":0,"k":[143.651,134.878,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":47,"s":[100,100,100]},{"i":{"x":[0.7,0.7,0.7],"y":[1,1,1]},"o":{"x":[0.9,0.9,0.9],"y":[0,0,0]},"t":53,"s":[100,102,100]},{"i":{"x":[0.7,0.7,0.7],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":60,"s":[100,90,100]},{"i":{"x":[0.7,0.7,0.7],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":66,"s":[100,104,100]},{"t":71,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[{"i":[[2.631,0],[0,0],[1.402,0],[-7.608,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.81,0]],"o":[[-3.896,0],[0,0],[-1.779,0],[7.483,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.816,0]],"v":[[-71.717,111.239],[-104.905,111.239],[-109.8,111.239],[-100.669,111.239],[-88.584,111.239],[-77.5,111.239],[-77.154,111.239],[-77.611,111.239],[-78,111.239],[-77.493,111.239],[-75.27,111.239],[-63.195,111.239],[-52.193,111.239],[-52.219,111.239],[-52.19,111.239],[-52.117,111.239],[-52.128,111.239],[-52.738,111.239]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13.5,"s":[{"i":[[3.063,-3.421],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.876,6.703]],"o":[[-4.535,5.065],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.965,-15.032]],"v":[[-66.573,80.816],[-100.027,111.628],[-101.193,113.113],[-93.022,113.42],[-84.85,113.705],[-73.204,113.245],[-73.242,113.472],[-74.082,113.563],[-74.86,113.659],[-74.82,113.691],[-74.63,113.716],[-59.422,113.717],[-45.298,113.714],[-45.264,113.696],[-45.096,113.656],[-44.813,113.599],[-44.48,113.234],[-44.762,88.976]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[{"i":[[3.006,-3.399],[0,0],[1.651,-4.74],[-8.506,-1.129],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.794,6.709]],"o":[[-4.451,5.032],[0,0],[-2.095,6.015],[8.366,1.11],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.78,-15.043]],"v":[[-57.943,51.756],[-95.737,87.571],[-101.365,95.969],[-91.431,113.609],[-77.812,108.967],[-65.186,96.84],[-64.827,98.53],[-65.627,120.043],[-67.045,120.265],[-67.118,120.319],[-66.984,120.373],[-52.327,120.377],[-39.784,120.377],[-38.412,120.327],[-38.113,120.262],[-37.722,120.047],[-36.674,91.927],[-36.818,60.069]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[2.951,-3.377],[0,0],[1.645,-4.728],[-8.257,-1.189],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.714,6.714]],"o":[[-4.369,5.001],[0,0],[-2.088,6],[8.121,1.169],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.601,-15.055]],"v":[[-49.572,23.567],[-86.611,59.113],[-92.152,67.47],[-82.649,85.179],[-69.373,80.634],[-56.998,68.596],[-56.663,70.289],[-58.707,118.844],[-59.464,119.146],[-59.647,119.294],[-59.318,119.455],[-44.47,119.463],[-32.62,119.464],[-31.765,119.32],[-31.338,119.14],[-30.844,118.846],[-29.245,63.884],[-29.112,32.027]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[{"i":[[2.898,-3.357],[0,0],[1.64,-4.717],[-8.019,-1.246],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.637,6.719]],"o":[[-4.291,4.97],[0,0],[-2.081,5.985],[7.887,1.225],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.429,-15.066]],"v":[[-41.551,-3.44],[-77.868,31.849],[-83.327,40.168],[-74.236,57.942],[-61.288,53.489],[-49.154,41.537],[-48.843,43.232],[-50.524,79.697],[-51.65,118.343],[-51.81,118.785],[-51.499,119.05],[-42.53,119.343],[-25.285,118.911],[-25.273,118.528],[-24.993,117.455],[-24.008,94.676],[-22.128,37.018],[-21.729,5.162]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[{"i":[[2.848,-3.338],[0,0],[1.635,-4.706],[-7.796,-1.299],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.566,6.723]],"o":[[-4.217,4.942],[0,0],[-2.074,5.972],[7.667,1.278],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.268,-15.076]],"v":[[-34.036,-28.747],[-69.674,6.3],[-75.056,14.583],[-66.352,32.419],[-53.712,28.052],[-41.803,16.181],[-41.514,17.878],[-43.448,54.333],[-45.394,92.874],[-45.781,105.886],[-45.628,117.132],[-32.085,117.781],[-20.143,117.471],[-19.429,108.516],[-18.767,92.742],[-17.759,69.49],[-15.459,11.842],[-14.81,-20.012]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.167,"y":0.167},"t":36,"s":[{"i":[[2.804,-3.32],[0,0],[1.63,-4.696],[-7.596,-1.347],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.582,-2.054],[-9.292,0.126],[-0.917,7.162],[0,0],[0,0],[0,0],[0,0],[0.501,6.727]],"o":[[-4.151,4.916],[0,0],[-2.069,5.959],[7.471,1.325],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[5.735,-0.078],[0.427,-3.336],[0,0],[0,0],[0,0],[0,0],[-1.125,-15.085]],"v":[[-27.313,-51.383],[-62.346,-16.551],[-67.659,-8.301],[-59.301,9.59],[-46.936,5.3],[-35.228,-6.499],[-34.959,-4.8],[-37.119,31.647],[-39.307,70.179],[-39.781,83.19],[-37.919,99.358],[-25.99,104.188],[-14.415,93.474],[-14.092,85.981],[-13.327,70.211],[-12.17,46.962],[-9.493,-10.677],[-8.622,-42.53]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.9,"y":0},"t":47,"s":[{"i":[[2.763,-3.305],[0,0],[1.626,-4.687],[-7.413,-1.391],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.508,-2.069],[-9.081,0.072],[-0.947,7.157],[0,0],[0,0],[0,0],[0,0],[0.443,6.731]],"o":[[-4.091,4.893],[0,0],[-2.063,5.948],[7.291,1.368],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[5.605,-0.045],[0.441,-3.334],[0,0],[0,0],[0,0],[0,0],[-0.993,-15.093]],"v":[[-21.164,-72.091],[-55.642,-37.456],[-60.892,-29.235],[-52.85,-11.294],[-40.737,-15.513],[-29.213,-27.246],[-28.962,-25.545],[-31.329,10.893],[-33.738,49.417],[-34.293,62.427],[-32.587,78.608],[-20.963,83.508],[-9.577,72.859],[-9.209,65.367],[-8.351,49.599],[-7.057,26.354],[-4.036,-31.277],[-2.961,-63.128]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":59,"s":[{"i":[[3.37,-3.14],[0,0],[1.784,-4.339],[-9.787,-0.889],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.294,-2.94],[-11.86,0.524],[-0.791,8.294],[0,0],[0,0],[0,0],[0,0],[1.067,6.09]],"o":[[-4.99,4.65],[0,0],[-2.264,5.506],[9.626,0.875],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[7.32,-0.323],[0.291,-3.054],[0,0],[0,0],[0,0],[0,0],[-2.394,-13.655]],"v":[[-77.501,-48.175],[-120.036,-14.984],[-126.298,-7.253],[-114.487,8.632],[-98.967,4.19],[-84.761,-7.047],[-84.31,-5.515],[-84.756,27.693],[-85.106,62.797],[-84.967,74.639],[-80.678,89.587],[-65.938,93.109],[-52.084,81.908],[-51.897,76.042],[-51.921,61.68],[-51.918,40.508],[-52.157,-11.977],[-53.066,-40.955]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":66,"s":[{"i":[[2.927,-3.453],[0,0],[1.55,-4.77],[-8.501,-0.978],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.73,-3.233],[-10.302,0.576],[-0.623,7.199],[0,0],[0,0],[0,0],[0,0],[0.927,6.696]],"o":[[-4.335,5.113],[0,0],[-1.967,6.054],[8.362,0.962],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[6.358,-0.356],[0.29,-3.353],[0,0],[0,0],[0,0],[0,0],[-2.079,-15.015]],"v":[[-76.147,-74.596],[-113.094,-38.102],[-118.533,-29.602],[-108.274,-12.135],[-94.793,-17.02],[-82.454,-29.375],[-82.062,-27.69],[-82.449,8.824],[-82.753,47.422],[-82.605,60.323],[-79.282,76.879],[-66.103,80.751],[-53.852,69.486],[-53.907,61.986],[-53.928,46.194],[-53.925,22.914],[-54.133,-34.796],[-54.922,-66.658]],"c":true}]},{"t":71,"s":[{"i":[[3.146,-3.453],[0,0],[1.665,-4.77],[-9.136,-0.978],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.2,-1.927],[-11.071,0.576],[-0.669,7.199],[0,0],[0,0],[0,0],[0,0],[0.996,6.696]],"o":[[-4.658,5.113],[0,0],[-2.113,6.054],[8.986,0.962],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[6.833,-0.356],[0.312,-3.353],[0,0],[0,0],[0,0],[0,0],[-2.234,-15.015]],"v":[[-79.334,-72.673],[-119.041,-36.178],[-124.887,-27.679],[-113.861,-10.212],[-99.373,-15.097],[-86.112,-27.452],[-85.69,-25.767],[-86.107,10.747],[-86.433,49.345],[-86.228,62.366],[-83.05,78.427],[-68.54,82.674],[-55.374,71.409],[-55.433,63.909],[-55.455,48.117],[-55.453,24.837],[-55.676,-32.873],[-56.524,-64.735]],"c":true}]}],"ix":2},"nm":"Path 4","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.28,"y":0},"t":4,"s":[{"i":[[24.106,0],[7.475,-14.494],[0.623,-2.03],[0,-2.422],[-8.522,0],[-3.588,6.369],[-12.289,0],[0,-12.648],[9.439,-10.305],[4.674,-4.475],[0,0],[0,-6.01],[-10.136,0],[0,0],[0,7.535],[8.342,0],[0,0],[0,0],[-5.427,7.72],[0,9.974],[2.678,5.514]],"o":[[-25.426,0],[-1.017,1.971],[-0.718,2.243],[0,7.983],[6.907,0],[5.472,-12.289],[13.635,0],[0,8.309],[-3.096,3.379],[0,0],[-6.459,5.92],[0,8.073],[0,0],[8.253,0],[0,-7.714],[0,0],[0,0],[11.648,-10.98],[6.233,-8.866],[0.046,-6.749],[-7.717,-15.886]],"v":[[-71.806,-76.067],[-122.626,-49.34],[-125.089,-43.326],[-126.255,-36.419],[-112.621,-23.412],[-98.448,-32.741],[-72.165,-51.13],[-48.753,-29.512],[-60.939,-4.676],[-72.524,6.997],[-118.092,50.502],[-126.883,66.469],[-111.813,80.104],[-27.225,80.104],[-13.949,67.366],[-27.225,54.628],[-84.813,54.628],[-51.803,22.246],[-26.538,-4.85],[-17.716,-31.665],[-21.761,-50.146]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[{"i":[[23.948,0],[7.426,-14.494],[0.619,-2.03],[0,-2.422],[-8.466,0],[-3.565,6.369],[-12.209,0],[0,-12.648],[9.378,-10.305],[4.644,-4.475],[0,0],[0,-6.01],[-10.07,0],[0,0],[0,7.535],[8.288,0],[0,0],[0,0],[-5.391,7.72],[0,9.974],[2.661,5.514]],"o":[[-25.26,0],[-1.01,1.971],[-0.713,2.243],[0,7.983],[6.862,0],[5.436,-12.289],[13.546,0],[0,8.309],[-3.075,3.379],[0,0],[-6.416,5.92],[0,8.073],[0,0],[8.199,0],[0,-7.714],[0,0],[0,0],[11.572,-10.98],[6.192,-8.866],[0.046,-6.749],[-7.666,-15.886]],"v":[[-68.169,-88.073],[-118.657,-61.345],[-121.104,-55.332],[-122.262,-48.425],[-108.717,-35.418],[-94.636,-44.747],[-68.526,-63.136],[-45.267,-41.518],[-57.373,-16.681],[-68.882,-5.009],[-114.153,38.496],[-122.886,54.463],[-107.915,68.098],[-23.879,68.098],[-10.69,55.36],[-23.879,42.623],[-81.091,42.623],[-48.297,10.24],[-23.197,-16.856],[-14.433,-43.671],[-18.451,-62.152]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13.5,"s":[{"i":[[23.578,0],[7.311,-14.494],[0.609,-2.03],[0,-2.422],[-8.335,0],[-3.51,6.369],[-12.02,0],[0,-12.648],[9.233,-10.305],[4.572,-4.475],[0,0],[0,-6.01],[-9.914,0],[0,0],[0,7.535],[8.16,0],[0,0],[0,0],[-5.308,7.72],[0,9.974],[2.62,5.514]],"o":[[-24.87,0],[-0.994,1.971],[-0.702,2.243],[0,7.983],[6.756,0],[5.352,-12.289],[13.336,0],[0,8.309],[-3.028,3.379],[0,0],[-6.317,5.92],[0,8.073],[0,0],[8.072,0],[0,-7.714],[0,0],[0,0],[11.393,-10.98],[6.097,-8.866],[0.045,-6.749],[-7.548,-15.886]],"v":[[-59.626,-116.272],[-109.334,-89.545],[-111.743,-83.531],[-112.883,-76.624],[-99.547,-63.618],[-85.685,-72.947],[-59.977,-91.335],[-37.078,-69.717],[-48.997,-44.881],[-60.328,-33.209],[-104.899,10.297],[-113.498,26.264],[-98.758,39.898],[-16.021,39.898],[-3.035,27.161],[-16.021,14.423],[-72.348,14.423],[-40.061,-17.959],[-15.349,-45.055],[-6.72,-71.87],[-10.677,-90.351]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[{"i":[[22.849,0.579],[11.114,-0.789],[0.72,-2.437],[0,-2.422],[-8.207,0],[-3.456,6.369],[-11.836,0],[0,-12.648],[9.091,-10.305],[4.502,-4.475],[0,0],[0,-6.01],[-9.762,0],[0,0],[0,7.535],[8.034,0],[0,0],[0,0],[-5.227,7.72],[0,9.974],[2.793,5.683]],"o":[[-22.373,-0.567],[-1.265,2.346],[-0.691,2.243],[0,7.983],[6.652,0],[5.27,-12.289],[13.132,0],[0,8.309],[-2.981,3.379],[0,0],[-6.22,5.92],[0,8.073],[0,0],[7.948,0],[0,-7.714],[0,0],[0,0],[11.218,-10.98],[6.003,-8.866],[0.046,-7.031],[-12.925,-0.504]],"v":[[-52.106,-118.99],[-98.805,-119.255],[-102.591,-111.1],[-103.714,-104.193],[-90.583,-91.186],[-76.933,-100.515],[-51.62,-118.904],[-29.072,-97.286],[-40.808,-72.45],[-51.966,-60.777],[-95.853,-17.272],[-104.319,-1.305],[-89.805,12.33],[-8.338,12.33],[4.448,-0.408],[-8.338,-13.146],[-63.802,-13.146],[-32.009,-45.528],[-7.677,-72.624],[0.819,-99.439],[-3.406,-118.608]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[0,0],[0,0],[0,0],[2.793,0.409],[-8.074,0.384],[0,0],[0,0],[-5.562,-0.178],[8.86,-9.844],[4.434,-4.475],[0,0],[0,-6.01],[-9.615,0],[0,0],[0,7.535],[7.913,0],[0,0],[0,0],[-4.87,6.746],[0,9.974],[0,0]],"o":[[0,0],[0,0],[0,0],[0.184,1.832],[6.282,-0.298],[0,0],[0,0],[0,8.309],[-2.906,3.228],[0,0],[-6.126,5.92],[0,8.073],[0,0],[7.828,0],[0,-7.714],[0,0],[0,0],[11.049,-10.98],[5.594,-7.748],[-3.079,-0.274],[0,0]],"v":[[-45.14,-122.229],[-86.446,-122.981],[-89.942,-123.2],[-94.721,-123.711],[-81.813,-117.173],[-68.329,-122.64],[-44.839,-122.319],[-21.929,-121.476],[-32.916,-98.942],[-43.854,-87.52],[-87.077,-44.015],[-95.416,-28.048],[-81.121,-14.413],[-0.886,-14.413],[11.707,-27.151],[-0.886,-39.889],[-55.511,-39.889],[-24.199,-72.271],[-0.772,-97.482],[6.571,-120.339],[0.241,-120.673]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[3.815,-0.531],[2.808,-2.877],[0,0],[0,-6.01],[-9.473,0],[0,0],[0,7.535],[7.797,0],[0,0],[0,0],[-4.894,6.416],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.179,2.392],[0,0],[-6.036,5.92],[0,8.073],[0,0],[7.713,0],[0,-7.714],[0,0],[0,0],[8.646,-8.721],[4.137,-3.611],[0,0],[0,0]],"v":[[-30.427,-119.897],[-92.972,-122.414],[-93.102,-122.408],[-92.983,-122.426],[-77.85,-121.628],[-68.102,-121.123],[-50.83,-120.603],[-31.457,-119.868],[-29.766,-119.624],[-37.23,-111.751],[-78.67,-69.636],[-86.886,-53.669],[-72.802,-40.034],[6.254,-40.034],[18.661,-52.772],[6.254,-65.51],[-47.568,-65.51],[-16.717,-97.892],[-5.919,-109.99],[1.868,-119.602],[-17.968,-120.319]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.11,0.109],[0,0],[0,-6.01],[-9.341,0],[0,0],[0,7.535],[7.688,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-5.952,5.92],[0,8.073],[0,0],[7.605,0],[0,-7.714],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-27.808,-122.537],[-42.765,-122.499],[-43.275,-122.329],[-43.059,-122.691],[-42.15,-122.69],[-42.484,-122.342],[-42.757,-122.396],[-43.084,-122.517],[-42.132,-122.225],[-43.517,-122.299],[-70.792,-93.645],[-78.892,-77.678],[-65.005,-64.043],[12.944,-64.043],[25.178,-76.781],[12.944,-89.519],[-40.124,-89.519],[-10.12,-121.764],[-10.057,-121.864],[-10.086,-121.808],[-10.142,-121.856]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.167,"y":0.167},"t":36,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.11,0.109],[0,0],[0,-6.01],[-9.341,0],[0,0],[0,7.535],[7.688,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-5.952,5.92],[0,8.073],[0,0],[7.605,0],[0,-7.714],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-41.077,-119.984],[-56.034,-119.945],[-56.543,-119.776],[-56.327,-120.137],[-55.418,-120.137],[-55.752,-119.789],[-56.025,-119.843],[-56.352,-119.963],[-55.4,-119.671],[-56.785,-119.746],[-63.776,-115.182],[-71.877,-99.215],[-57.99,-85.58],[19.96,-85.58],[32.194,-98.318],[19.96,-111.056],[-33.109,-111.056],[-23.389,-119.21],[-23.326,-119.31],[-23.354,-119.254],[-23.411,-119.302]],"c":true}]},{"t":46,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.108,0.127],[0,0],[0,0],[0,0],[0,0],[0,0],[7.686,0.127],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[7.604,0.126],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-45.641,-118.112],[-60.555,-119.062],[-61.068,-118.901],[-60.846,-119.259],[-59.936,-119.244],[-60.276,-118.901],[-60.548,-118.96],[-60.874,-119.085],[-59.926,-118.778],[-61.31,-118.875],[-66.74,-119.456],[-66.615,-119.252],[-53.067,-118.543],[24.766,-116.988],[34.493,-117.475],[24.592,-116.995],[-31.395,-117.919],[-27.927,-117.789],[-27.862,-117.888],[-27.891,-117.832],[-27.947,-117.881]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.2,"y":0},"t":4,"s":[{"i":[[8.342,0],[3.678,-5.472],[0,0],[0,0],[0,0],[6.1,0],[0,-8.701],[-3.498,-4.665],[0,0],[0,0],[0,0],[0,-3.947],[-8.522,0],[-4.037,5.831],[0,0],[0,0],[0,0],[-5.831,0],[0,8.432],[2.96,3.857],[0,0],[0,0],[0,0],[0,4.216]],"o":[[-6.1,0],[0,0],[0,0],[0,0],[-4.126,-6.279],[-9.329,0],[0,4.126],[0,0],[0,0],[0,0],[-3.05,4.216],[0,7.714],[6.01,0],[0,0],[0,0],[0,0],[4.126,5.651],[8.88,0],[0,-4.216],[0,0],[0,0],[0,0],[3.05,-3.947],[0.09,-7.714]],"v":[[118.361,-74.811],[105.355,-67.007],[71.537,-17.671],[70.73,-17.671],[37.989,-65.931],[23.547,-74.811],[7.311,-59.741],[11.975,-47.452],[48.843,2.781],[48.843,3.588],[10.719,56.781],[6.414,68.353],[21.573,82.257],[35.029,74.452],[68.577,26.821],[69.384,26.821],[103.471,74.363],[117.375,82.346],[132.714,67.904],[128.498,56.243],[89.926,4.216],[89.926,3.498],[129.664,-49.605],[133.88,-61.087]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.9,"y":0},"t":47,"s":[{"i":[[7.501,0],[3.307,-5.472],[0,0],[0,0],[0,0],[5.484,0],[0,-8.701],[-3.145,-4.665],[0,0],[0,0],[0,0],[0,-3.947],[-7.662,0],[-3.629,5.831],[0,0],[0,0],[0,0],[-5.242,0],[0,8.432],[2.662,3.857],[0,0],[0,0],[0,0],[0,4.216]],"o":[[-5.484,0],[0,0],[0,0],[0,0],[-3.71,-6.279],[-8.388,0],[0,4.126],[0,0],[0,0],[0,0],[-2.742,4.216],[0,7.714],[5.404,0],[0,0],[0,0],[0,0],[3.71,5.651],[7.985,0],[0,-4.216],[0,0],[0,0],[0,0],[2.742,-3.947],[0.081,-7.714]],"v":[[148.01,-75.449],[136.315,-67.645],[105.909,-18.309],[105.183,-18.309],[75.745,-66.568],[62.76,-75.449],[48.162,-60.379],[52.356,-48.09],[85.504,2.143],[85.504,2.951],[51.226,56.144],[47.355,67.715],[60.985,81.619],[73.083,73.815],[103.248,26.183],[103.974,26.183],[134.622,73.725],[147.123,81.709],[160.915,67.267],[157.124,55.606],[122.443,3.579],[122.443,2.861],[158.172,-50.242],[161.963,-61.724]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":59,"s":[{"i":[[8.834,0],[3.895,-5.159],[0,0],[0,0],[0,0],[6.459,0],[0,-8.204],[-3.705,-4.398],[0,0],[0,0],[0,0],[0,-3.722],[-9.024,0],[-4.275,5.498],[0,0],[0,0],[0,0],[-6.174,0],[0,7.951],[3.135,3.637],[0,0],[0,0],[0,0],[0,3.975]],"o":[[-6.459,0],[0,0],[0,0],[0,0],[-4.369,-5.921],[-9.879,0],[0,3.891],[0,0],[0,0],[0,0],[-3.23,3.975],[0,7.274],[6.364,0],[0,0],[0,0],[0,0],[4.37,5.329],[9.404,0],[0,-3.975],[0,0],[0,0],[0,0],[3.23,-3.722],[0.095,-7.274]],"v":[[119.279,-52.661],[105.506,-45.303],[69.695,1.216],[68.84,1.216],[34.169,-44.288],[18.876,-52.661],[1.683,-38.452],[6.622,-26.865],[45.663,20.5],[45.663,21.261],[5.292,71.417],[0.733,82.328],[16.786,95.438],[31.034,88.079],[66.56,43.167],[67.415,43.167],[103.511,87.995],[118.235,95.522],[134.478,81.905],[130.013,70.91],[89.168,21.853],[89.168,21.177],[131.248,-28.895],[135.713,-39.721]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":66,"s":[{"i":[[7.962,0],[3.51,-5.472],[0,0],[0,0],[0,0],[5.821,0],[0,-8.701],[-3.339,-4.665],[0,0],[0,0],[0,0],[0,-3.947],[-8.133,0],[-3.852,5.831],[0,0],[0,0],[0,0],[-5.565,0],[0,8.432],[2.825,3.857],[0,0],[0,0],[0,0],[0,4.216]],"o":[[-5.821,0],[0,0],[0,0],[0,0],[-3.938,-6.279],[-8.903,0],[0,4.126],[0,0],[0,0],[0,0],[-2.911,4.216],[0,7.714],[5.736,0],[0,0],[0,0],[0,0],[3.938,5.651],[8.475,0],[0,-4.216],[0,0],[0,0],[0,0],[2.911,-3.947],[0.086,-7.714]],"v":[[110.211,-74.811],[97.798,-67.007],[65.523,-17.671],[64.753,-17.671],[33.505,-65.931],[19.722,-74.811],[4.227,-59.741],[8.679,-47.452],[43.864,2.781],[43.864,3.588],[7.48,56.781],[3.371,68.353],[17.839,82.257],[30.68,74.452],[62.698,26.821],[63.469,26.821],[96,74.363],[109.27,82.346],[123.909,67.904],[119.885,56.243],[83.073,4.216],[83.073,3.498],[120.998,-49.605],[125.022,-61.087]],"c":true}]},{"t":71,"s":[{"i":[[8.342,0],[3.678,-5.472],[0,0],[0,0],[0,0],[6.1,0],[0,-8.701],[-3.498,-4.665],[0,0],[0,0],[0,0],[0,-3.947],[-8.522,0],[-4.037,5.831],[0,0],[0,0],[0,0],[-5.831,0],[0,8.432],[2.96,3.857],[0,0],[0,0],[0,0],[0,4.216]],"o":[[-6.1,0],[0,0],[0,0],[0,0],[-4.126,-6.279],[-9.329,0],[0,4.126],[0,0],[0,0],[0,0],[-3.05,4.216],[0,7.714],[6.01,0],[0,0],[0,0],[0,0],[4.126,5.651],[8.88,0],[0,-4.216],[0,0],[0,0],[0,0],[3.05,-3.947],[0.09,-7.714]],"v":[[113.361,-74.811],[100.355,-67.007],[66.537,-17.671],[65.73,-17.671],[32.989,-65.931],[18.547,-74.811],[2.311,-59.741],[6.975,-47.452],[43.843,2.781],[43.843,3.588],[5.719,56.781],[1.414,68.353],[16.573,82.257],[30.029,74.452],[63.577,26.821],[64.384,26.821],[98.471,74.363],[112.375,82.346],[127.714,67.904],[123.498,56.243],[84.926,4.216],[84.926,3.498],[124.664,-49.605],[128.88,-61.087]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.2,"y":0},"t":4,"s":[{"i":[[0,0],[0,-28.435],[0,0],[28.435,0],[0,0],[0,28.435],[0,0],[-28.435,0]],"o":[[28.435,0],[0,0],[0,28.435],[0,0],[-28.435,0],[0,0],[0,-28.435],[0,0]],"v":[[137.378,-137.333],[188.867,-85.845],[188.867,85.845],[137.378,137.333],[-137.378,137.333],[-188.867,85.845],[-188.867,-85.845],[-137.378,-137.333]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.9,"y":0},"t":47,"s":[{"i":[[0,0],[0,-28.435],[0,0],[26.692,0],[0,0],[0,28.435],[0,0],[-26.692,0]],"o":[[26.692,0],[0,0],[0,28.435],[0,0],[-26.692,0],[0,0],[0,-28.435],[0,0]],"v":[[133.326,-137.333],[181.657,-85.845],[181.657,85.845],[133.326,137.333],[-124.581,137.333],[-172.913,85.845],[-172.913,-85.845],[-124.581,-137.333]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":59,"s":[{"i":[[0,0],[0,-28.435],[0,0],[30.112,0],[0,0],[0,28.435],[0,0],[-30.112,0]],"o":[[30.112,0],[0,0],[0,28.435],[0,0],[-30.112,0],[0,0],[0,-28.435],[0,0]],"v":[[145.476,-137.333],[200,-85.845],[200,85.845],[145.476,137.333],[-145.476,137.333],[-200,85.845],[-200,-85.845],[-145.476,-137.333]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":66,"s":[{"i":[[0,0],[0,-28.435],[0,0],[27.138,0],[0,0],[0,28.435],[0,0],[-27.138,0]],"o":[[27.138,0],[0,0],[0,28.435],[0,0],[-27.138,0],[0,0],[0,-28.435],[0,0]],"v":[[133.36,-137.333],[182.5,-85.845],[182.5,85.845],[133.36,137.333],[-128.86,137.333],[-178,85.845],[-178,-85.845],[-128.86,-137.333]],"c":true}]},{"t":71,"s":[{"i":[[0,0],[0,-28.435],[0,0],[28.435,0],[0,0],[0,28.435],[0,0],[-28.435,0]],"o":[[28.435,0],[0,0],[0,28.435],[0,0],[-28.435,0],[0,0],[0,-28.435],[0,0]],"v":[[137.378,-137.333],[188.867,-85.845],[188.867,85.845],[137.378,137.333],[-137.378,137.333],[-188.867,85.845],[-188.867,-85.845],[-137.378,-137.333]],"c":true}]}],"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Combined-Shape","np":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Lines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.461,"y":0.502},"o":{"x":0.387,"y":0},"t":6,"s":[414.762,400.8,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.455,"y":1},"o":{"x":0.171,"y":0.514},"t":21,"s":[350.327,402.8,0],"to":[0,0,0],"ti":[0,0,0]},{"t":54,"s":[306.762,400.8,0]}],"ix":2},"a":{"a":0,"k":[-270.238,87.8,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.9,"y":0},"t":54,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-483.238,88.6],[-134.571,88.6]],"c":false}]},{"t":58,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-484.238,84.6],[-135.571,84.6]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.252],"y":[0.429]},"o":{"x":[0.386],"y":[0]},"t":5,"s":[68]},{"i":{"x":[0.499],"y":[1]},"o":{"x":[0.194],"y":[0.298]},"t":20,"s":[82]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.9],"y":[0]},"t":48,"s":[95]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.9],"y":[0]},"t":54,"s":[95]},{"t":58,"s":[45]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":5,"s":[68]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.9],"y":[0]},"t":48,"s":[15]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.9],"y":[0]},"t":54,"s":[15]},{"t":58,"s":[45]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":26,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/camera.json b/TMessagesProj/src/main/res/raw/camera.json new file mode 100644 index 00000000000..aeb6eb16d2e --- /dev/null +++ b/TMessagesProj/src/main/res/raw/camera.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":""},"fr":60,"ip":0,"op":86,"w":512,"h":512,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.7,"y":1},"o":{"x":0.7,"y":0},"t":11,"s":[-7.992,-254.991,0],"to":[0,0,0],"ti":[0,0,0]},{"t":24,"s":[-7.992,61.009,0]}],"ix":2},"a":{"a":0,"k":[-7.992,-152.991,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[{"i":[[16.125,0],[-0.5,-27.5],[-14,0.5],[0.933,27.984]],"o":[[-16,0],[0.573,31.499],[14,-0.5],[-1,-30]],"v":[[-8,-194.5],[-49,-152.5],[-6.5,-111.5],[33,-152]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[{"i":[[12.066,0],[3.376,-30.527],[-10.476,0.557],[4.067,30.909]],"o":[[-11.973,0],[-3.856,34.872],[10.476,-0.557],[-4.485,-34.084]],"v":[[-7.391,-214.248],[-38.626,-157.22],[-6.823,-117.557],[22.735,-156.664]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[{"i":[[16.125,0],[-0.5,-27.5],[-14,0.5],[0.933,27.984]],"o":[[-16,0],[0.573,31.499],[14,-0.5],[-1,-30]],"v":[[-8,-194.5],[-49,-152.5],[-6.5,-111.5],[33,-152]],"c":true}]},{"t":25,"s":[{"i":[[21.175,0],[-8.089,-49.924],[-18.385,0.5],[0.753,28.001]],"o":[[-21.012,0],[5.04,31.102],[18.385,-0.5],[-1.275,-47.424]],"v":[[-8.068,-154],[-79.411,-135.5],[-6.098,-111.5],[66.775,-134.5]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":11,"op":27,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Picture","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-7.729,8,0],"ix":2},"a":{"a":0,"k":[565.271,8,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.3,"y":0},"t":24,"s":[{"i":[[-8.109,0],[0,0],[0,-11.603],[0,0],[9.326,-2.937],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[9.5,4.5],[0,0],[0,0]],"o":[[0,0],[8.109,0],[0,0],[0,0],[-12.324,3.881],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-8.405,-3.981],[0,0],[0,-11.603]],"v":[[504.246,-80.5],[626.413,-80.5],[641.118,-59.456],[641.387,62.035],[632.574,83.869],[604.03,87.988],[591.667,88.254],[567.717,88.27],[554.774,88.452],[532.934,88.433],[521.889,88.712],[500,84.25],[491.29,71.901],[489.54,-59.456]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":32,"s":[{"i":[[-9.396,0],[0,0],[0,-8.486],[0,0],[0,0],[0,0],[3.416,-3.577],[0,0],[3.342,3.077],[0,0],[3.379,-2.997],[0,0],[0,0],[0,0]],"o":[[0,0],[9.396,0],[0,0],[0,0],[0,0],[-3.575,-3.478],[0,0],[-2.93,3.329],[0,0],[-3.529,-2.887],[0,0],[0,0],[0,0],[0,-8.486]],"v":[[494.493,-64.081],[636.05,-64.081],[653.089,-48.69],[653.98,46.744],[653.617,45.891],[609.083,-3.022],[595.338,-2.828],[564.852,43.99],[552.462,44.489],[527.193,9.37],[514.396,9.574],[477.407,56.226],[477.453,51.765],[477.453,-48.69]],"c":true}]},{"t":39,"s":[{"i":[[-9.146,0],[0,0],[0,-9.145],[0,0],[0,0],[0,0],[3.325,-4.699],[0,0],[3.253,4.042],[0,0],[3.289,-3.937],[0,0],[0,0],[0,0]],"o":[[0,0],[9.146,0],[0,0],[0,0],[0,0],[-3.48,-4.569],[0,0],[-2.852,4.373],[0,0],[-3.435,-3.793],[0,0],[0,0],[0,0],[0,-9.145]],"v":[[496.379,-77.479],[634.164,-77.479],[650.75,-60.893],[651.617,41.951],[651.693,51],[607.826,4.001],[594.447,4.256],[564.624,49.994],[552.564,50.649],[528.118,20.28],[515.661,20.548],[479.793,63.484],[479.793,47.362],[479.793,-60.893]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.3,"y":0},"t":24,"s":[{"i":[[16.367,0],[0,0],[0,-18.143],[0,0],[-21.885,0.5],[0,0],[0,0],[0,0],[0,0],[-4.193,3.671],[-0.041,7.549],[0,0],[0,0],[0,0]],"o":[[0,0],[-16.367,0],[0,0],[0,18.143],[0,0],[0,0],[0,0],[0,0],[2.83,0],[6.959,-6.092],[0.042,-7.796],[0,0],[0,0],[0,-18.142]],"v":[[629.909,-101],[500.635,-101],[471,-68.15],[471,75.15],[500.635,108],[606.611,108],[615.322,107.896],[623.744,107.273],[634.416,106.523],[652.291,99.842],[660.791,79.451],[660.463,63.551],[660.293,52.301],[659.543,-68.15]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":32,"s":[{"i":[[17.922,0],[0,0],[0,-16.188],[0,0],[-17.922,0],[0,0],[0,0],[-6.471,0],[0,0],[0,2.799],[0,0],[-6.454,0],[0,0],[0,0]],"o":[[0,0],[-17.922,0],[0,0],[0,16.188],[0,0],[0,0],[-0.023,-5.844],[0,0],[3.099,0],[0,0],[0,-5.83],[0,0],[0,0],[0,-16.187]],"v":[[636.05,-78],[494.493,-78],[462.043,-48.69],[462.043,79.168],[494.493,108.479],[610.539,108.479],[610.496,97.679],[622.182,87.086],[637.974,87.086],[643.586,82.017],[643.586,69.176],[655.273,56.997],[668.5,56.997],[668.5,-48.69]],"c":true}]},{"t":39,"s":[{"i":[[17.444,0],[0,0],[0,-17.444],[0,0],[-17.444,0],[0,0],[0,0],[-6.298,0],[0,0],[0,3.017],[0,0],[-6.282,0],[0,0],[0,0]],"o":[[0,0],[-17.444,0],[0,0],[0,17.444],[0,0],[0,0],[-0.023,-6.298],[0,0],[3.017,0],[0,0],[0,-6.282],[0,0],[0,0],[0,-17.444]],"v":[[634.165,-92.479],[496.379,-92.479],[464.793,-60.893],[464.793,76.893],[496.379,108.479],[609.333,108.479],[609.291,96.841],[620.666,85.425],[636.038,85.425],[641.5,79.962],[641.5,66.125],[652.875,53],[665.75,53],[665.75,-60.893]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":24,"op":42,"st":-1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Camera 2","sr":1,"ks":{"o":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":11,"s":[100],"h":1},{"t":24,"s":[0],"h":1}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.1,"y":1},"o":{"x":0.3,"y":0},"t":0,"s":[247.272,261,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.7,"y":0},"t":11,"s":[247.272,363,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.3,"y":0},"t":24,"s":[247.272,236,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":30,"s":[247.272,287,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":37,"s":[247.272,253,0],"to":[0,0,0],"ti":[0,0,0]},{"t":42,"s":[247.272,261,0]}],"ix":2},"a":{"a":0,"k":[-8.728,5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.2,"y":0},"t":0,"s":[{"i":[[7.765,0],[6.148,3.691],[3.501,6.751],[0,6.784],[-3.049,5.727],[-1.97,2.288],[-3.394,2.164],[-8.086,0],[-6.958,-5.466],[-1.896,-2.31],[-1.43,-2.993],[0,-6.312],[3.15,-5.8],[2.121,-2.367],[3.465,-2.103]],"o":[[-7.693,0],[-6.498,-3.901],[-2.921,-5.633],[0,-6.941],[1.43,-2.687],[2.615,-3.039],[6.348,-4.047],[9.535,0],[2.351,1.847],[2.082,2.537],[2.552,5.339],[0,7.064],[-1.529,2.815],[-2.691,3.003],[-6.186,3.755]],"v":[[-8.728,54.788],[-29.767,48.975],[-45.09,32.67],[-49.661,13.855],[-44.885,-5.351],[-39.765,-12.834],[-30.701,-20.687],[-8.728,-27.078],[16.537,-18.352],[22.928,-12.096],[28.224,-3.775],[32.205,13.855],[27.265,33.365],[21.765,41.162],[12.482,48.871]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.7,"y":0},"t":11,"s":[{"i":[[0.011,0],[4.704,0],[2.041,-0.016],[0,-0.023],[-0.002,0],[-2.558,-0.014],[-0.009,0],[-7.345,0],[-3.68,0],[-1.942,0.009],[-0.184,0.012],[-0.029,0.021],[0.173,0.015],[0.004,0],[0.009,0]],"o":[[-0.011,0],[-5.284,0],[-1.775,0.014],[0,0.022],[0.002,0],[2.411,0.014],[0.009,0],[8.949,0],[5.384,0.001],[2.892,-0.014],[0.252,-0.016],[0.025,-0.019],[-0.331,-0.031],[-0.004,0],[-0.009,0]],"v":[[-11.731,59.863],[-35.191,59.863],[-50.298,59.879],[-51.988,59.937],[-52.111,60.11],[-50.413,60.151],[-37.951,60.162],[-9.595,60.164],[19.183,60.164],[32.858,60.154],[35.371,60.116],[35.456,59.939],[35.161,59.894],[12.633,59.864],[5.922,59.864]],"c":true}]},{"t":24,"s":[{"i":[[0,0],[8.149,-0.212],[3.533,8.892],[0,12.749],[0,0],[-4.434,8.1],[0,0],[-12.727,0],[-6.369,0.212],[-3.365,-5.297],[-0.316,-6.506],[-0.051,-11.879],[0.248,-8.544],[0,0],[0,0]],"o":[[0,0],[-9.154,0.238],[-3.073,-7.735],[0,-12.246],[0,0],[4.177,-7.629],[0,0],[15.507,0],[9.337,-0.31],[5.014,7.893],[0.431,8.857],[0.044,10.407],[-0.512,17.633],[0,0],[0,0]],"v":[[-13.316,87.844],[-53.957,87.791],[-80.149,78.543],[-83.079,46.325],[-83.305,-50.718],[-80.379,-73.871],[-58.765,-80.065],[-9.627,-80.957],[40.26,-80.854],[63.986,-75.562],[68.335,-54.152],[68.472,44.984],[68.011,70.617],[28.627,87.086],[17.191,87.097]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.2,"y":0},"t":0,"s":[{"i":[[11.749,0],[0,0],[0.712,0.956],[0,0],[3.805,0],[0,0],[2.279,-2.975],[0,0],[1.174,0],[0,0],[0,-11.749],[0,0],[-11.749,0],[0,0],[0,0],[-7.049,0],[0,0],[0,4.117],[0,0],[-6.526,0],[0,0],[0,0]],"o":[[0,0],[-1.192,0],[0,0],[-2.273,-3.052],[0,0],[-3.748,0],[0,0],[-0.714,0.932],[0,0],[-11.749,0],[0,0],[0,11.749],[0,0],[0,0],[0,-7.049],[0,0],[4.117,0],[0,0],[0,-6.526],[0,0],[0,0],[0,-11.749]],"v":[[71.801,-68.735],[44.18,-68.735],[41.153,-70.255],[30.303,-84.825],[20.644,-89.675],[-37.757,-89.675],[-47.318,-84.955],[-58.609,-70.214],[-61.605,-68.735],[-89.258,-68.735],[-110.532,-47.461],[-110.532,78.401],[-89.258,99.675],[32.959,99.675],[32.959,89.493],[45.776,76.677],[60.528,76.677],[67.982,69.222],[67.982,54.263],[79.798,42.447],[93.075,42.447],[93.075,-47.461]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.7,"y":0},"t":11,"s":[{"i":[[18.939,0.156],[0,0],[0,0],[0,0],[4.176,0],[0,0],[0,0],[0,0],[0,0],[0,0],[3.101,-7.199],[-7.351,-10.521],[-18.693,0.038],[0,0],[0,0],[0,0],[0,0],[0,0],[-8.896,2.188],[-1.598,3.404],[-0.39,3.321],[2.215,5.801]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-22.766,0.955],[-3.101,7.199],[2.482,3.553],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[4.563,-1.122],[0.782,-1.666],[0.985,-8.387],[-3.515,-9.203]],"v":[[71.378,35.183],[50.633,35.033],[45.185,35.031],[35.536,35],[24.138,35.058],[-39.825,35.058],[-49.654,35.036],[-62.179,35.043],[-66.397,35.033],[-92.109,35.295],[-120.274,47.926],[-117.024,85.271],[-89.436,91.962],[40.557,91.962],[45.597,91.962],[62.969,91.89],[62.902,91.872],[69.54,91.806],[92.812,89.497],[103.973,81.846],[106.39,75.012],[103.765,47.203]],"c":true}]},{"t":24,"s":[{"i":[[16.171,0.573],[0,0],[0,0],[0,0],[3.566,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.567,-14.567],[0,0],[-15.961,0.14],[-4.673,0.051],[0,0],[0,0],[-9.283,3.118],[0.196,7.678],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-23.556,4.55],[0,0],[0,17.238],[0,0],[10.169,-0.111],[0,0],[0,0],[9.283,-3.118],[-0.107,-4.192],[0,0],[0,0],[0,0],[0.093,-31.434]],"v":[[60.146,-100.329],[42.434,-100.878],[37.781,-100.885],[29.543,-101],[19.811,-100.789],[-34.803,-100.789],[-43.195,-100.867],[-53.889,-100.841],[-57.491,-100.878],[-79.444,-99.918],[-102.319,-52.69],[-102.319,76.91],[-77.163,107.86],[18.581,108.111],[36.365,107.167],[44.642,107.061],[71.717,104.368],[87.804,83.572],[87.862,62.345],[87.822,51.334],[87.835,45.613],[87.799,-56.255]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Camera","sr":1,"ks":{"o":{"a":1,"k":[{"t":0,"s":[100],"h":1},{"t":11,"s":[0],"h":1}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.1,"y":1},"o":{"x":0.3,"y":0},"t":0,"s":[247.272,261,0],"to":[0,0,0],"ti":[0,0,0]},{"t":11,"s":[247.272,363,0]}],"ix":2},"a":{"a":0,"k":[-8.728,5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.2,"y":0},"t":0,"s":[{"i":[[7.765,0],[6.148,3.691],[3.501,6.751],[0,6.784],[-3.049,5.727],[-1.97,2.288],[-3.394,2.164],[-8.086,0],[-6.958,-5.466],[-1.896,-2.31],[-1.43,-2.993],[0,-6.312],[3.15,-5.8],[2.121,-2.367],[3.465,-2.103]],"o":[[-7.693,0],[-6.498,-3.901],[-2.921,-5.633],[0,-6.941],[1.43,-2.687],[2.615,-3.039],[6.348,-4.047],[9.535,0],[2.351,1.847],[2.082,2.537],[2.552,5.339],[0,7.064],[-1.529,2.815],[-2.691,3.003],[-6.186,3.755]],"v":[[-8.728,54.788],[-29.767,48.975],[-45.09,32.67],[-49.661,13.855],[-44.885,-5.351],[-39.765,-12.834],[-30.701,-20.687],[-8.728,-27.078],[16.537,-18.352],[22.928,-12.096],[28.224,-3.775],[32.205,13.855],[27.265,33.365],[21.765,41.162],[12.482,48.871]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[{"i":[[7.19,0],[5.66,3.837],[3.242,7.051],[0.349,8.271],[-2.823,5.981],[-1.824,2.39],[-3.143,2.26],[-7.488,0],[-6.443,-5.708],[-1.756,-2.413],[-1.325,-3.125],[0,-6.592],[2.917,-6.057],[1.964,-2.472],[3.547,-1.796]],"o":[[-7.124,0],[-5.268,-5.003],[-2.705,-5.883],[-0.259,-7.239],[1.324,-2.806],[2.422,-3.173],[5.878,-4.226],[8.829,0],[2.177,1.929],[1.928,2.65],[2.363,5.576],[0,7.377],[-1.416,2.94],[-2.492,3.136],[-5.203,2.454]],"v":[[-9.15,10.342],[-30.41,4.789],[-41.156,-8.557],[-46.554,-28.206],[-42.131,-48.264],[-37.389,-56.08],[-28.996,-64.281],[-8.756,-70.003],[14.746,-61.842],[20.664,-55.309],[25.568,-46.618],[29.254,-28.206],[23.939,-8.678],[19.116,-1.006],[9.453,5.922]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[{"i":[[6.408,0],[4.906,8.876],[2.889,7.459],[0.824,10.295],[-2.516,6.327],[-1.625,2.528],[-2.801,2.39],[-6.673,0],[-5.742,-6.039],[-1.565,-2.552],[-1.18,-3.306],[0,-6.974],[2.6,-6.407],[1.75,-2.615],[1.417,-3.401]],"o":[[-6.349,0],[-3.595,-6.504],[-2.41,-6.223],[-0.612,-7.644],[1.18,-2.968],[2.158,-3.357],[5.239,-4.47],[7.869,0],[1.94,2.04],[1.718,2.803],[2.106,5.898],[0,7.804],[-1.262,3.11],[-2.221,3.317],[-2.962,7.111]],"v":[[-8.543,-14.742],[-27.155,-45.914],[-35.801,-64.677],[-42.324,-85.463],[-38.382,-106.681],[-34.156,-114.948],[-26.676,-123.623],[-8.793,-128.434],[12.309,-121.044],[17.583,-114.133],[21.953,-104.94],[25.238,-85.463],[19.412,-65.91],[14.623,-56.046],[9.462,-44.279]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":6,"s":[{"i":[[5.239,0],[4.148,4.411],[2.362,8.068],[0,8.107],[-2.057,6.844],[-1.329,2.735],[-2.29,2.586],[-5.456,0],[-4.695,-6.532],[-1.279,-2.761],[-0.965,-3.576],[0,-7.543],[2.125,-6.931],[1.431,-2.829],[2.338,-2.513]],"o":[[-5.19,0],[-4.384,-4.661],[-1.971,-6.732],[0,-8.295],[0.965,-3.211],[1.765,-3.631],[4.283,-4.836],[6.433,0],[1.586,2.207],[1.405,3.032],[1.722,6.38],[0,8.442],[-1.032,3.364],[-1.815,3.588],[-4.174,4.487]],"v":[[-8.383,-122.139],[-22.577,-129.085],[-32.916,-148.57],[-36,-171.055],[-32.778,-194.007],[-29.323,-202.95],[-23.207,-212.334],[-8.383,-219.972],[8.664,-209.544],[12.976,-202.068],[16.549,-192.124],[19.235,-171.055],[15.902,-147.74],[12.192,-138.422],[5.928,-129.21]],"c":true}]},{"t":11,"s":[{"i":[[7.765,0],[6.148,3.691],[3.501,6.751],[0,6.784],[-3.049,5.727],[-1.97,2.288],[-3.394,2.164],[-8.086,0],[-6.958,-5.466],[-1.896,-2.31],[-1.43,-2.993],[0,-6.312],[3.15,-5.8],[2.121,-2.367],[3.465,-2.103]],"o":[[-7.693,0],[-6.498,-3.901],[-2.921,-5.633],[0,-6.941],[1.43,-2.687],[2.615,-3.039],[6.348,-4.047],[9.535,0],[2.351,1.847],[2.082,2.537],[2.552,5.339],[0,7.064],[-1.529,2.815],[-2.691,3.003],[-6.186,3.755]],"v":[[-8.246,-214.212],[-29.284,-220.025],[-44.608,-236.33],[-49.179,-255.145],[-44.403,-274.351],[-39.282,-281.834],[-30.219,-289.687],[-8.246,-296.078],[17.02,-287.352],[23.41,-281.096],[28.706,-272.775],[32.687,-255.145],[27.747,-235.635],[22.248,-227.838],[12.965,-220.129]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.2,"y":0},"t":0,"s":[{"i":[[11.749,0],[0,0],[0.712,0.956],[0,0],[3.805,0],[0,0],[2.279,-2.975],[0,0],[1.174,0],[0,0],[0,-11.749],[0,0],[-11.749,0],[0,0],[0,0],[-7.049,0],[0,0],[0,4.117],[0,0],[-6.526,0],[0,0],[0,0]],"o":[[0,0],[-1.192,0],[0,0],[-2.273,-3.052],[0,0],[-3.748,0],[0,0],[-0.714,0.932],[0,0],[-11.749,0],[0,0],[0,11.749],[0,0],[0,0],[0,-7.049],[0,0],[4.117,0],[0,0],[0,-6.526],[0,0],[0,0],[0,-11.749]],"v":[[71.801,-68.735],[44.18,-68.735],[41.153,-70.255],[30.303,-84.825],[20.644,-89.675],[-37.757,-89.675],[-47.318,-84.955],[-58.609,-70.214],[-61.605,-68.735],[-89.258,-68.735],[-110.532,-47.461],[-110.532,78.401],[-89.258,99.675],[32.959,99.675],[32.959,89.493],[45.776,76.677],[60.528,76.677],[67.982,69.222],[67.982,54.263],[79.798,42.447],[93.075,42.447],[93.075,-47.461]],"c":true}]},{"t":11,"s":[{"i":[[18.769,0.153],[0,0],[0,0],[0,0],[4.139,0],[0,0],[0,0],[0,0],[0,0],[0,0],[4.656,-6.944],[-6.094,-6.67],[-16.293,0.287],[0,0],[0,0],[0,0],[0,0],[0,0],[-8.795,2.236],[-2.348,2.445],[-1.078,6.146],[4.109,6.939]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-20.144,0.71],[-3.23,4.818],[5.166,5.654],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[9.173,-2.332],[1.058,-1.102],[1.233,-7.03],[-5.767,-9.739]],"v":[[70.67,35.18],[50.11,35.033],[44.71,35.031],[35.148,35],[23.852,35.057],[-39.539,35.057],[-49.28,35.036],[-61.693,35.043],[-65.874,35.033],[-91.356,35.29],[-120.156,46.694],[-118.406,83.67],[-89.707,91.713],[39.75,92.088],[44.744,92.088],[61.836,91.892],[61.769,91.874],[68.723,91.684],[89.904,90.166],[103.723,82.805],[106.517,75.78],[103.267,46.489]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Plus Camera","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[98]},{"t":40,"s":[90]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.1,"y":1},"o":{"x":0.3,"y":0},"t":0,"s":[88.761,95.41,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.7,"y":0},"t":9,"s":[78.206,82.541,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.3,"y":0},"t":24,"s":[67.882,97.761,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.3,"y":0},"t":32,"s":[88.261,119.91,0],"to":[0,0,0],"ti":[0,0,0]},{"t":39,"s":[88.261,106.91,0]}],"ix":2},"a":{"a":0,"k":[88.761,95.41,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.1,"y":1},"o":{"x":0.3,"y":0},"t":0,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[87.967,61.876],[87.967,128.944]],"c":false}]},{"i":{"x":0.7,"y":1},"o":{"x":0.7,"y":0},"t":9,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[88.01,95.619],[88.01,95.201]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.3,"y":0},"t":25,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[87.953,87.022],[87.953,95.285]],"c":false}]},{"t":32,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[87.967,61.876],[87.967,128.944]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":15,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[87.75,94.75],"ix":2},"a":{"a":0,"k":[88,95.5],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.1,"y":1},"o":{"x":0.3,"y":0},"t":0,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[123.287,94.021],[54.235,94.021]],"c":false}]},{"i":{"x":0.7,"y":1},"o":{"x":0.7,"y":0},"t":9,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[89.467,94.413],[88.055,94.413]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.3,"y":0},"t":25,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[84.96,90.105],[92.437,90.105]],"c":false}]},{"t":32,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[123.287,94.021],[54.235,94.021]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":15,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[88,94.75],"ix":2},"a":{"a":0,"k":[89,94.5],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Picture 2","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":48,"s":[0]},{"t":61,"s":[-90]}],"ix":10},"p":{"a":0,"k":[-7.729,8,0],"ix":2},"a":{"a":0,"k":[565.271,8,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.3,"y":0},"t":42,"s":[{"i":[[-9.146,0],[0,0],[0,-9.145],[0,0],[0,0],[0,0],[3.325,-4.699],[0,0],[3.253,4.042],[0,0],[3.289,-3.937],[0,0],[0,0],[0,0]],"o":[[0,0],[9.146,0],[0,0],[0,0],[0,0],[-3.48,-4.569],[0,0],[-2.852,4.373],[0,0],[-3.435,-3.793],[0,0],[0,0],[0,0],[0,-9.145]],"v":[[496.379,-77.479],[634.164,-77.479],[650.75,-60.893],[651.617,41.951],[651.693,51],[607.826,4.001],[594.447,4.256],[564.624,49.994],[552.564,50.649],[528.118,20.28],[515.661,20.548],[479.793,63.484],[479.793,47.362],[479.793,-60.893]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.2,"y":0},"t":48,"s":[{"i":[[-10.534,0],[0,0],[0,-7.348],[0,0],[0,0],[0,0],[3.829,-3.776],[0,0],[3.747,3.248],[0,0],[3.788,-3.164],[0,0],[0,0],[0,0]],"o":[[0,0],[10.534,0],[0,0],[0,0],[0,0],[-4.008,-3.671],[0,0],[-3.284,3.514],[0,0],[-3.956,-3.047],[0,0],[0,0],[0,0],[0,-7.348]],"v":[[485.923,-40.947],[644.62,-40.947],[663.723,-27.62],[664.722,55.02],[664.81,62.292],[614.285,24.526],[598.875,24.731],[564.526,61.483],[550.635,62.01],[522.479,37.607],[508.132,37.822],[466.82,72.323],[466.82,59.369],[466.82,-27.62]],"c":true}]},{"t":55,"s":[{"i":[[0.006,4.214],[0.005,-4.39],[0.002,-5.114],[0,0],[-0.001,-1.307],[0,0],[-0.001,0.021],[0,0],[-0.002,-0.179],[0,0],[-0.002,0.996],[0,0],[-0.001,4.172],[0,0]],"o":[[-0.006,-4.214],[-0.002,2.167],[-0.004,11.209],[0,0],[0.001,2.401],[0.001,0.563],[0,0],[0.002,0.612],[0,0],[0.003,-0.476],[0,0],[0,0],[0.001,-6.228],[0,-3.691]],"v":[[565.039,-17.399],[565.014,-17.75],[565.007,-9.299],[565.005,13.248],[565.007,18.657],[565.012,24.182],[565.016,25.515],[565.02,26.153],[565.026,26.505],[565.029,26.539],[565.037,24.54],[565.042,21.325],[565.045,13.413],[565.045,-5.612]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.3,"y":0},"t":42,"s":[{"i":[[17.444,0],[0,0],[0,-17.444],[0,0],[-17.444,0],[0,0],[0,0],[-6.298,0],[0,0],[0,3.017],[0,0],[-6.282,0],[0,0],[0,0]],"o":[[0,0],[-17.444,0],[0,0],[0,17.444],[0,0],[0,0],[-0.023,-6.298],[0,0],[3.017,0],[0,0],[0,-6.282],[0,0],[0,0],[0,-17.444]],"v":[[634.165,-92.479],[496.379,-92.479],[464.793,-60.893],[464.793,76.893],[496.379,108.479],[609.333,108.479],[609.291,96.841],[620.666,85.425],[636.038,85.425],[641.5,79.962],[641.5,66.125],[652.875,53],[665.75,53],[665.75,-60.893]],"c":true}]},{"i":{"x":0.1,"y":1},"o":{"x":0.2,"y":0},"t":48,"s":[{"i":[[20.092,0],[0,0],[0,-14.017],[0,0],[-20.092,0],[0,0],[0,0],[-7.254,0],[0,0],[0,2.424],[0,0],[-7.236,0],[0,0],[0,0]],"o":[[0,0],[-20.092,0],[0,0],[0,14.017],[0,0],[0,0],[-0.026,-5.061],[0,0],[3.475,0],[0,0],[0,-5.048],[0,0],[0,0],[0,-14.017]],"v":[[644.621,-53],[485.923,-53],[449.543,-27.619],[449.543,83.098],[485.923,108.479],[616.021,108.479],[615.972,99.127],[629.074,89.954],[646.778,89.954],[653.069,85.564],[653.069,74.445],[666.171,63.899],[681,63.899],[681,-27.62]],"c":true}]},{"t":58,"s":[{"i":[[6.153,7.544],[10.753,-10.552],[0,-20.985],[0,0],[-7.419,-7.493],[0,0],[0,0],[0,0],[-1.35,1.459],[-2.101,9.402],[0,7.52],[0,0],[0,0],[0,0]],"o":[[-6.153,-7.544],[-5.656,5.55],[0,0],[0,20.985],[5.445,5.499],[0,0],[0,0],[0,0],[3.589,-3.879],[2.275,-10.18],[0,-5.263],[0,0],[0,0],[0,-20.985]],"v":[[587.541,-108.516],[540.163,-107.914],[530.228,-74.428],[530.228,91.324],[541.002,127.517],[579.69,129.622],[584.24,128.854],[588.203,128.053],[592.337,124.654],[599.29,107.949],[600.638,83.483],[600.507,73.709],[600.551,62.582],[600.551,-74.429]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":42,"op":61,"st":41,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Camera 3","sr":1,"ks":{"o":{"a":1,"k":[{"t":42,"s":[0],"h":1},{"t":61,"s":[100],"h":1}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.3,"y":0},"t":42,"s":[247.272,261,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.3,"y":0},"t":48,"s":[247.272,321,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.7,"y":0},"t":60,"s":[247.272,211,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.414,"y":1},"o":{"x":0.3,"y":0},"t":69,"s":[247.272,297,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":76,"s":[247.272,245,0],"to":[0,0,0],"ti":[0,0,0]},{"t":81,"s":[247.272,261,0]}],"ix":2},"a":{"a":0,"k":[-8.728,5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.7,"y":0},"t":61,"s":[{"i":[[7.534,0],[5.965,-0.016],[3.396,-0.03],[0,-0.03],[-2.958,-0.025],[-1.911,-0.01],[-3.293,-0.01],[-7.845,0],[-6.751,0.024],[-1.839,0.01],[-1.388,0.013],[0,0.028],[3.056,0.026],[2.058,0.01],[3.362,0.009]],"o":[[-7.464,0],[-6.304,0.017],[-2.834,0.025],[0,0.031],[1.388,0.012],[2.537,0.013],[6.159,0.018],[9.251,0],[2.281,-0.008],[2.02,-0.011],[2.476,-0.023],[0,-0.031],[-1.483,-0.012],[-2.611,-0.013],[-6.002,-0.017]],"v":[[-8.728,8],[-29.14,8.026],[-44.007,8.097],[-48.442,8.18],[-43.808,8.264],[-38.84,8.297],[-30.047,8.332],[-8.728,8.36],[15.785,8.322],[21.985,8.294],[27.123,8.258],[30.986,8.18],[26.193,8.094],[20.857,8.06],[11.851,8.026]],"c":true}]},{"i":{"x":0.414,"y":1},"o":{"x":0.3,"y":0},"t":70,"s":[{"i":[[8.904,0],[7.05,4.663],[4.014,8.529],[0,8.57],[-3.496,7.235],[-2.258,2.891],[-3.892,2.733],[-9.272,0],[-7.978,-6.905],[-2.174,-2.918],[-1.64,-3.781],[0,-7.974],[3.612,-7.326],[2.432,-2.99],[3.973,-2.657]],"o":[[-8.821,0],[-7.45,-4.928],[-3.349,-7.116],[0,-8.768],[1.64,-3.394],[2.999,-3.839],[7.279,-5.112],[10.933,0],[2.696,2.333],[2.388,3.205],[2.926,6.745],[0,8.924],[-1.753,3.556],[-3.085,3.793],[-7.093,4.744]],"v":[[-8.728,57.656],[-32.852,50.312],[-50.423,29.715],[-55.664,5.946],[-50.188,-18.316],[-44.316,-27.77],[-33.923,-37.689],[-8.728,-45.763],[20.242,-34.74],[27.57,-26.837],[33.643,-16.325],[38.207,5.946],[32.543,30.592],[26.237,40.442],[15.593,50.181]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":77,"s":[{"i":[[7.526,0],[5.959,3.25],[3.393,5.945],[0,5.973],[-2.955,5.043],[-1.909,2.015],[-3.29,1.905],[-7.837,0],[-6.744,-4.813],[-1.837,-2.034],[-1.386,-2.635],[0,-5.558],[3.053,-5.107],[2.056,-2.084],[3.358,-1.852]],"o":[[-7.456,0],[-6.297,-3.434],[-2.831,-4.96],[0,-6.111],[1.386,-2.366],[2.535,-2.675],[6.152,-3.563],[9.241,0],[2.279,1.626],[2.018,2.234],[2.473,4.701],[0,6.22],[-1.482,2.478],[-2.608,2.644],[-5.995,3.306]],"v":[[-8.728,51.186],[-29.118,46.067],[-43.97,31.711],[-48.4,15.144],[-43.771,-1.766],[-38.808,-8.356],[-30.024,-15.27],[-8.728,-20.897],[15.759,-13.214],[21.953,-7.706],[27.085,-0.379],[30.943,15.144],[26.156,32.322],[20.826,39.188],[11.829,45.975]],"c":true}]},{"t":82,"s":[{"i":[[7.765,0],[6.148,3.691],[3.501,6.751],[0,6.784],[-3.049,5.727],[-1.97,2.288],[-3.394,2.164],[-8.086,0],[-6.958,-5.466],[-1.896,-2.31],[-1.43,-2.993],[0,-6.312],[3.15,-5.8],[2.121,-2.367],[3.465,-2.103]],"o":[[-7.693,0],[-6.498,-3.901],[-2.921,-5.633],[0,-6.941],[1.43,-2.687],[2.615,-3.039],[6.348,-4.047],[9.535,0],[2.351,1.847],[2.082,2.537],[2.552,5.339],[0,7.064],[-1.529,2.815],[-2.691,3.003],[-6.186,3.755]],"v":[[-8.728,54.788],[-29.767,48.975],[-45.09,32.67],[-49.661,13.855],[-44.885,-5.351],[-39.765,-12.834],[-30.701,-20.687],[-8.728,-27.078],[16.537,-18.352],[22.928,-12.096],[28.224,-3.775],[32.205,13.855],[27.265,33.365],[21.765,41.162],[12.482,48.871]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.7,"y":0},"t":60,"s":[{"i":[[13.686,0],[0,0],[0.83,0.027],[0,0],[4.432,0],[0,0],[2.655,-0.084],[0,0],[1.368,0],[0,0],[11.437,-9.225],[-11.249,-13.588],[-18.778,-1.418],[0,0],[0,0],[0,0],[0,0],[0,1.678],[0,0],[-7.91,6.182],[0,0],[4.2,5.819]],"o":[[0,0],[-1.389,0],[0,0],[-2.647,-0.086],[0,0],[-4.366,0],[0,0],[-0.832,0.026],[0,0],[-5.571,0.545],[-5.403,4.358],[6.003,7.251],[0,0],[0,0],[0,0],[0,0],[4.796,0],[0,0],[3.364,-0.785],[7.91,-6.182],[0,0],[-5.454,-7.558]],"v":[[85.068,-25.857],[53.494,-26.425],[49.668,-26.467],[37.029,-26.027],[25.778,-26.164],[-42.25,-26.164],[-53.387,-26.314],[-65.939,-26.75],[-70.629,-26.708],[-98.639,-26.708],[-124.02,-16.053],[-124.62,31.268],[-95.637,43.059],[40.124,43.059],[44.326,43.449],[55.353,43.333],[70.435,43.9],[82.121,42.848],[89.324,43.276],[107.59,36.475],[114.351,19.737],[110.149,-16.904]],"c":true}]},{"i":{"x":0.414,"y":1},"o":{"x":0.3,"y":0},"t":69,"s":[{"i":[[10.88,0],[0,0],[0.659,0.976],[0,0],[3.524,0],[0,0],[2.11,-3.035],[0,0],[1.087,0],[0,0],[0,-11.987],[0,0],[-10.88,0],[0,0],[0,0],[-6.527,0],[0,0],[0,4.2],[0,0],[-6.043,0],[0,0],[0,0]],"o":[[0,0],[-1.104,0],[0,0],[-2.105,-3.114],[0,0],[-3.47,0],[0,0],[-0.661,0.951],[0,0],[-10.88,0],[0,0],[0,11.987],[0,0],[0,0],[0,-7.191],[0,0],[3.813,0],[0,0],[0,-6.658],[0,0],[0,0],[0,-11.987]],"v":[[65.843,-68.312],[40.265,-68.312],[37.462,-69.863],[27.415,-84.727],[18.471,-89.675],[-35.609,-89.675],[-44.463,-84.86],[-54.918,-69.821],[-57.693,-68.312],[-83.3,-68.312],[-103,-46.608],[-103,81.796],[-83.3,103.5],[29.875,103.5],[29.875,93.113],[41.743,80.038],[55.404,80.038],[62.307,72.432],[62.307,57.17],[73.249,45.116],[85.543,45.116],[85.543,-46.608]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":76,"s":[{"i":[[12.26,0],[0,0],[0.743,0.907],[0,0],[3.971,0],[0,0],[2.378,-2.82],[0,0],[1.225,0],[0,0],[0,-11.138],[0,0],[-12.26,0],[0,0],[0,0],[-7.355,0],[0,0],[0,3.903],[0,0],[-6.81,0],[0,0],[0,0]],"o":[[0,0],[-1.244,0],[0,0],[-2.371,-2.893],[0,0],[-3.911,0],[0,0],[-0.745,0.884],[0,0],[-12.26,0],[0,0],[0,11.138],[0,0],[0,0],[0,-6.682],[0,0],[4.296,0],[0,0],[0,-6.186],[0,0],[0,0],[0,-11.138]],"v":[[75.301,-63.149],[46.479,-63.149],[43.321,-64.59],[31.999,-78.402],[21.92,-83],[-39.019,-83],[-48.995,-78.526],[-60.777,-64.551],[-63.903,-63.149],[-92.758,-63.149],[-114.957,-42.982],[-114.957,76.333],[-92.758,96.5],[34.771,96.5],[34.771,86.848],[48.145,74.699],[63.538,74.699],[71.317,67.632],[71.317,53.45],[83.646,42.249],[97.5,42.249],[97.5,-42.982]],"c":true}]},{"t":81,"s":[{"i":[[11.749,0],[0,0],[0.712,0.956],[0,0],[3.805,0],[0,0],[2.279,-2.975],[0,0],[1.174,0],[0,0],[0,-11.749],[0,0],[-11.749,0],[0,0],[0,0],[-7.049,0],[0,0],[0,4.117],[0,0],[-6.526,0],[0,0],[0,0]],"o":[[0,0],[-1.192,0],[0,0],[-2.273,-3.052],[0,0],[-3.748,0],[0,0],[-0.714,0.932],[0,0],[-11.749,0],[0,0],[0,11.749],[0,0],[0,0],[0,-7.049],[0,0],[4.117,0],[0,0],[0,-6.526],[0,0],[0,0],[0,-11.749]],"v":[[71.801,-68.735],[44.18,-68.735],[41.153,-70.255],[30.303,-84.825],[20.644,-89.675],[-37.757,-89.675],[-47.318,-84.955],[-58.609,-70.214],[-61.605,-68.735],[-89.258,-68.735],[-110.532,-47.461],[-110.532,78.401],[-89.258,99.675],[32.959,99.675],[32.959,89.493],[45.776,76.677],[60.528,76.677],[67.982,69.222],[67.982,54.263],[79.798,42.447],[93.075,42.447],[93.075,-47.461]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":42,"op":222,"st":42,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Plus Camera 2","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":48,"s":[90]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":62,"s":[0]},{"i":{"x":[0.252],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":64,"s":[-90]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":73,"s":[6]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":80,"s":[-2]},{"t":85,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.3,"y":0},"t":42,"s":[88.261,106.91,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.3,"y":0},"t":48,"s":[99.261,108.41,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.7,"y":0},"t":62,"s":[88.086,23.4,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.414,"y":1},"o":{"x":0.3,"y":0},"t":70,"s":[82.261,106.91,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":77,"s":[90.761,91.41,0],"to":[0,0,0],"ti":[0,0,0]},{"t":82,"s":[88.761,95.41,0]}],"ix":2},"a":{"a":0,"k":[88.761,95.41,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.3,"y":0},"t":42,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[87.967,61.876],[87.967,128.944]],"c":false}]},{"i":{"x":0.1,"y":1},"o":{"x":0.3,"y":0},"t":48,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[87.977,57.921],[87.977,132.899]],"c":false}]},{"i":{"x":0.5,"y":1},"o":{"x":0.7,"y":0},"t":62,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[88.003,89.56],[88.003,101.261]],"c":false}]},{"i":{"x":0.414,"y":1},"o":{"x":0.3,"y":0},"t":70,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[87.978,57.75],[87.978,133.07]],"c":false}]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":77,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[87.967,65.07],[87.967,125.75]],"c":false}]},{"t":82,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[87.967,61.876],[87.967,128.944]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":15,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[87.75,94.75],"ix":2},"a":{"a":0,"k":[88,95.5],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.3,"y":0},"t":42,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[123.287,94.021],[54.235,94.021]],"c":false}]},{"i":{"x":0.1,"y":1},"o":{"x":0.3,"y":0},"t":48,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[115.671,93.975],[61.851,93.975]],"c":false}]},{"i":{"x":0.5,"y":1},"o":{"x":0.7,"y":0},"t":62,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[94.784,94.342],[82.737,94.342]],"c":false}]},{"i":{"x":0.414,"y":1},"o":{"x":0.3,"y":0},"t":70,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[115.022,93.973],[62.5,93.973]],"c":false}]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":77,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[123.287,94.058],[54.235,94.058]],"c":false}]},{"t":82,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[123.287,94.021],[54.235,94.021]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":15,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[88,94.75],"ix":2},"a":{"a":0,"k":[89,94.5],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":42,"op":222,"st":42,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/copy.json b/TMessagesProj/src/main/res/raw/copy.json new file mode 100644 index 00000000000..e3d5dab32f4 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/copy.json @@ -0,0 +1 @@ +{"v":"5.7.1","fr":60,"ip":0,"op":61,"w":512,"h":512,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"NULL ROTATION","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":0,"s":[28]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":25,"s":[-8]},{"i":{"x":[0.545],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":43,"s":[3]},{"t":60,"s":[0]}],"ix":10},"p":{"a":0,"k":[267,273,0],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Back","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.3,"y":0},"t":0,"s":[131.747,63.566,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":20,"s":[-27.642,5.907,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0},"t":40,"s":[15.645,10.291,0],"to":[0,0,0],"ti":[0,0,0]},{"t":60,"s":[2.358,5.907,0]}],"ix":2},"a":{"a":0,"k":[-22.207,-16.42,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":0,"s":[0,50,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.41,0.41,0.41],"y":[0,0,0]},"t":24,"s":[145,145,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":46,"s":[172,172,100]},{"t":60,"s":[165,165,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":20,"s":[{"i":[[12.437,-4.553],[0,0],[-1.81,-40.928],[0,0],[-13.786,-1.094],[0,0],[0,0],[-30.956,9.678],[0,0]],"o":[[0,0],[-33.643,11.598],[0,0],[0,10.988],[0,0],[0,0],[-0.919,-28.745],[0,0],[-4.067,-10.357]],"v":[[9.381,-140.807],[-59.335,-116.766],[-95,-58],[-95,56.4],[-71.569,80.868],[-70.883,80.88],[-74.951,-51.996],[-45.179,-100.53],[38.744,-129.466]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":40,"s":[{"i":[[11.221,0],[0,0],[0,-28.719],[0,0],[-10.794,-0.762],[0,0],[0,0],[-21.422,0],[0,0]],"o":[[0,0],[-28.719,0],[0,0],[0,10.988],[0,0],[0,0],[1.04,-21.164],[0,0],[-0.418,-11.119]],"v":[[29.8,-110],[-43,-110],[-95,-58],[-95,56.4],[-75.685,77.148],[-75,77.16],[-74.951,-51.996],[-35,-90],[50.585,-89.996]],"c":true}]},{"t":60,"s":[{"i":[[11.221,0],[0,0],[0,-28.719],[0,0],[-10.794,-0.762],[0,0],[0,0],[-21.422,0],[0,0]],"o":[[0,0],[-28.719,0],[0,0],[0,10.988],[0,0],[0,0],[1.04,-21.164],[0,0],[-0.418,-11.119]],"v":[[29.8,-110],[-43,-110],[-95,-58],[-95,56.4],[-75.685,77.148],[-75,77.16],[-74.951,-51.996],[-35,-90],[50.585,-89.996]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Front","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":20,"s":[-14.458,-17.317,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.562,"y":1},"o":{"x":0.308,"y":0},"t":42,"s":[30.462,25.675,0],"to":[0,0,0],"ti":[0,0,0]},{"t":60,"s":[20,20,0]}],"ix":2},"a":{"a":0,"k":[20,20,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.4,"y":0},"t":20,"s":[{"i":[[0,0],[0.014,-17.6],[0,0],[-11.488,0],[0,0],[0,11.488],[0,0],[11.488,0]],"o":[[-7.368,3.347],[0,0],[0,11.488],[0,0],[10.117,-3.377],[0,0],[0,-11.488],[0,0]],"v":[[-35.178,-71.954],[-56.051,-45.667],[-55.449,97.695],[-34.649,118.495],[55.701,86.927],[76.501,66.127],[75.972,-82.722],[55.172,-103.522]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":42,"s":[{"i":[[0,0],[0,-11.488],[0,0],[-11.488,0],[0,0],[0,11.488],[0,0],[11.488,0]],"o":[[-11.488,0],[0,0],[0,11.488],[0,0],[11.488,0],[0,0],[0,-11.488],[0,0]],"v":[[-34.2,-70],[-55,-49.2],[-55,89.2],[-34.2,110],[74.2,110],[95,89.2],[95,-49.2],[74.2,-70]],"c":true}]},{"t":60,"s":[{"i":[[0,0],[0,-11.488],[0,0],[-11.488,0],[0,0],[0,11.488],[0,0],[11.488,0]],"o":[[-11.488,0],[0,0],[0,11.488],[0,0],[11.488,0],[0,0],[0,-11.488],[0,0]],"v":[[-34.2,-70],[-55,-49.2],[-55,89.2],[-34.2,110],[74.2,110],[95,89.2],[95,-49.2],[74.2,-70]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0}],"markers":[{"tm":60,"cm":"1","dr":0}]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/download_arrow.json b/TMessagesProj/src/main/res/raw/download_arrow.json new file mode 100644 index 00000000000..74090c73277 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/download_arrow.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":""},"fr":60,"ip":0,"op":30,"w":16,"h":16,"nm":"Comp 3","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":4,"ty":4,"nm":"Arrow Line","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":14,"s":[-90]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":15,"s":[-90]},{"t":29,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[8,6.333,0],"to":[-0.444,0.278,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":14,"s":[5.333,8,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":15,"s":[5.333,8,0],"to":[0,0,0],"ti":[-0.444,0.278,0]},{"t":29,"s":[8,6.333,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[3.333,3.333,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[-11.05,0],[0,0],[0,-11.05],[0,0],[11.05,0],[0,0],[0,11.05],[0,0]],"o":[[0,0],[11.05,0],[0,0],[0,11.05],[0,0],[-11.05,0],[0,0],[0,-11.05]],"v":[[-40,-110],[40,-110],[60,-90],[60,90],[40,110],[-40,110],[-60,90],[-60,-90]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":8,"s":[{"i":[[-16.57,0],[0,0],[0,-16.57],[0,0],[16.57,0],[0,0],[0,16.57],[0,0]],"o":[[0,0],[16.57,0],[0,0],[0,16.57],[0,0],[-16.57,0],[0,0],[0,-16.57]],"v":[[-120,-50],[120,-50],[150,-20],[150,20],[120,50],[-120,50],[-150,20],[-150,-20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":14,"s":[{"i":[[-16.57,0],[0,0],[0,-16.57],[0,0],[16.57,0],[0,0],[0,16.57],[0,0]],"o":[[0,0],[16.57,0],[0,0],[0,16.57],[0,0],[-16.57,0],[0,0],[0,-16.57]],"v":[[-120,-50],[120,-50],[150,-20],[150,20],[120,50],[-120,50],[-150,20],[-150,-20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":15,"s":[{"i":[[-16.57,0],[0,0],[0,-16.57],[0,0],[16.57,0],[0,0],[0,16.57],[0,0]],"o":[[0,0],[16.57,0],[0,0],[0,16.57],[0,0],[-16.57,0],[0,0],[0,-16.57]],"v":[[-120,-50],[120,-50],[150,-20],[150,20],[120,50],[-120,50],[-150,20],[-150,-20]],"c":true}]},{"t":24,"s":[{"i":[[-11.05,0],[0,0],[0,-11.05],[0,0],[11.05,0],[0,0],[0,11.05],[0,0]],"o":[[0,0],[11.05,0],[0,0],[0,11.05],[0,0],[-11.05,0],[0,0],[0,-11.05]],"v":[[-40,-110],[40,-110],[60,-90],[60,90],[40,110],[-40,110],[-60,90],[-60,-90]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Arrow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":14,"s":[-90]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":15,"s":[-90]},{"t":29,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[8,10.51,0],"to":[0.444,-0.418,0],"ti":[-0.444,0.418,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":14,"s":[10.667,8,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":15,"s":[10.667,8,0],"to":[-0.444,0.418,0],"ti":[0.444,-0.418,0]},{"t":29,"s":[8,10.51,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[3.333,3.333,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[-3.73,0],[0,0],[0,-7.73],[2.65,-2.63],[0,0],[7.79,7.74],[0,0],[-5.44,5.49]],"o":[[0,0],[7.73,0],[0,3.73],[0,0],[-7.8,7.74],[0,0],[-5.49,-5.45],[2.63,-2.65]],"v":[[-126.013,-75.288],[126.017,-75.288],[140.017,-61.288],[135.877,-51.348],[14.087,69.482],[-14.083,69.482],[-135.873,-51.348],[-135.953,-71.148]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":7,"s":[{"i":[[-16.57,0],[0,0],[0,-16.57],[0,0],[16.57,0],[0,0],[0,16.57],[0,0]],"o":[[0,0],[16.57,0],[0,0],[0,16.57],[0,0],[-16.57,0],[0,0],[0,-16.57]],"v":[[-120,-50],[120,-50],[150,-20],[150,20],[120,50],[-120,50],[-150,20],[-150,-20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":14,"s":[{"i":[[-16.57,0],[0,0],[0,-16.57],[0,0],[16.57,0],[0,0],[0,16.57],[0,0]],"o":[[0,0],[16.57,0],[0,0],[0,16.57],[0,0],[-16.57,0],[0,0],[0,-16.57]],"v":[[-120,-50],[120,-50],[150,-20],[150,20],[120,50],[-120,50],[-150,20],[-150,-20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":15,"s":[{"i":[[-16.57,0],[0,0],[0,-16.57],[0,0],[16.57,0],[0,0],[0,16.57],[0,0]],"o":[[0,0],[16.57,0],[0,0],[0,16.57],[0,0],[-16.57,0],[0,0],[0,-16.57]],"v":[[-120,-50],[120,-50],[150,-20],[150,20],[120,50],[-120,50],[-150,20],[-150,-20]],"c":true}]},{"t":23,"s":[{"i":[[-3.73,0],[0,0],[0,-7.73],[2.65,-2.63],[0,0],[7.79,7.74],[0,0],[-5.44,5.49]],"o":[[0,0],[7.73,0],[0,3.73],[0,0],[-7.8,7.74],[0,0],[-5.49,-5.45],[2.63,-2.65]],"v":[[-126.013,-75.288],[126.017,-75.288],[140.017,-61.288],[135.877,-51.348],[14.087,69.482],[-14.083,69.482],[-135.873,-51.348],[-135.953,-71.148]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/error.json b/TMessagesProj/src/main/res/raw/error.json new file mode 100644 index 00000000000..eb5dc156416 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/error.json @@ -0,0 +1 @@ +{"v":"5.7.6","fr":60,"ip":0,"op":120,"w":512,"h":512,"nm":"error","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"NULL CONTROL","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[256,256,0],"ix":2,"l":2},"a":{"a":0,"k":[115,115,0],"ix":1,"l":2},"s":{"a":0,"k":[400,400,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"NULL CONTROL","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":40.45,"ix":10},"p":{"a":0,"k":[253.063,256.518,0],"ix":2,"l":2},"a":{"a":0,"k":[115,115,0],"ix":1,"l":2},"s":{"a":0,"k":[90.222,90.222,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"line 9","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[194.624,115,0],"to":[0,0,0],"ti":[0,0,0]},{"t":26.666015625,"s":[374.846,115,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,-2.5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":23,"s":[80.099,80.099,100]},{"t":25.666015625,"s":[0,0,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,22],[0,-27]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17.334,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-0.045,4.273],[0,-27]],"c":false}]},{"t":26.666015625,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-0.125,-26.75],[0,-27]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":24,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":12,"op":95,"st":-25,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"line 8","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-90,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[35.376,115,0],"to":[0,0,0],"ti":[0,0,0]},{"t":26.666015625,"s":[-144.846,115,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,-2.5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":23,"s":[80.099,80.099,100]},{"t":25.666015625,"s":[0,0,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-0.926,57.718],[-0.926,47.141]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17.334,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-0.045,4.273],[0,-27]],"c":false}]},{"t":26.666015625,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-0.125,-26.75],[0,-27]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":24,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":12,"op":95,"st":-25,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"line 7","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":180,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[115,194.624,0],"to":[0,0,0],"ti":[0,0,0]},{"t":26.666015625,"s":[115,374.846,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,-2.5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":23,"s":[80.099,80.099,100]},{"t":25.666015625,"s":[0,0,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,22],[0,-27]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17.334,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-0.045,4.273],[0,-27]],"c":false}]},{"t":26.666015625,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-0.125,-26.75],[0,-27]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":24,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":12,"op":95,"st":-25,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"line 6","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[115,35.376,0],"to":[0,0,0],"ti":[0,0,0]},{"t":26.666015625,"s":[115,-144.846,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,-2.5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":23,"s":[80.099,80.099,100]},{"t":25.666015625,"s":[0,0,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1.009,22],[1.009,21.453]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17.334,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-0.045,4.273],[0,-27]],"c":false}]},{"t":26.666015625,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-0.125,-26.75],[0,-27]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":24,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":12,"op":95,"st":-25,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"line 5","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":45,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[171.303,58.697,0],"to":[0,0,0],"ti":[0,0,0]},{"t":26.666015625,"s":[298.739,-68.739,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,-2.5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":23,"s":[80.099,80.099,100]},{"t":25.666015625,"s":[0,0,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0.055,22],[0.055,20.577]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17.334,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-0.045,4.273],[0,-27]],"c":false}]},{"t":26.666015625,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-0.125,-26.75],[0,-27]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":24,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":12,"op":95,"st":-25,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"line 4","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-135,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[58.697,171.303,0],"to":[0,0,0],"ti":[0,0,0]},{"t":26.666015625,"s":[-68.739,298.739,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,-2.5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":23,"s":[80.099,80.099,100]},{"t":25.666015625,"s":[0,0,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0.721,33],[0.721,32.895]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17.334,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-0.045,4.273],[0,-27]],"c":false}]},{"t":26.666015625,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-0.125,-26.75],[0,-27]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":24,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":12,"op":95,"st":-25,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"line 3","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":135,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[171.303,171.303,0],"to":[0,0,0],"ti":[0,0,0]},{"t":26.666015625,"s":[298.739,298.739,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,-2.5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":23,"s":[80.099,80.099,100]},{"t":25.666015625,"s":[0,0,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1.015,-16.25],[1.015,-19.589]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17.334,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-0.045,4.273],[0,-27]],"c":false}]},{"t":26.666015625,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-0.125,-26.75],[0,-27]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":24,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":12,"op":95,"st":-25,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"line 2","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-40.45,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[57.365,45.114,0],"to":[0,0,0],"ti":[0,0,0]},{"t":26.666015625,"s":[-72.072,-106.707,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,-2.5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":23,"s":[88.67,88.67,100]},{"t":25.666015625,"s":[0,0,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0.562,22],[0.562,5.25]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17.334,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-0.045,4.273],[0,-27]],"c":false}]},{"t":26.666015625,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-0.125,-26.75],[0,-27]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":24,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":12,"op":95,"st":-25,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"error","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.42],"y":[0]},"t":0,"s":[160]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":15.254,"s":[-17]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":21.967,"s":[5]},{"t":36,"s":[0]}],"ix":10},"p":{"a":0,"k":[115,119.8,0],"ix":2,"l":2},"a":{"a":0,"k":[0,4.8,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.69,0.69,0.69],"y":[0,0,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":15.254,"s":[110,110,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":21.967,"s":[95,95,100]},{"i":{"x":[0.29,0.29,0.29],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":30,"s":[105,105,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":39,"s":[97,97,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":46,"s":[101,101,100]},{"t":55,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.29,"y":1},"o":{"x":0.69,"y":0},"t":7,"s":[{"i":[[2.056,0],[2.005,0],[0,1.964],[0,1.62],[-1.877,0],[-1.811,0],[0,-2.173],[0,-1.228]],"o":[[-2.056,0],[-2.005,0],[0,-1.964],[0,-1.62],[1.877,0],[1.811,0],[0,2.173],[0,1.228]],"v":[[0.284,13.878],[0.216,13.925],[-3.293,10.416],[-3.293,10.349],[-0.048,7.105],[-0.052,7.105],[3.422,10.578],[3.43,10.732]],"c":true}]},{"i":{"x":0.29,"y":1},"o":{"x":0.69,"y":0},"t":11,"s":[{"i":[[1.245,0.398],[1.088,0.348],[-0.658,0.906],[0.154,2.338],[-1.157,0],[-1.043,0],[0.033,-1.251],[1.352,-1.946]],"o":[[-1.245,-0.398],[-1.088,-0.348],[1.223,-1.684],[-0.065,-0.997],[1.157,0],[1.043,0],[-0.087,3.326],[-0.445,0.641]],"v":[[1.717,18.777],[-0.869,17.95],[-2.165,15.436],[-0.045,8.805],[1.955,6.805],[4.67,6.805],[6.67,8.805],[4.231,17.481]],"c":true}]},{"i":{"x":0.29,"y":1},"o":{"x":0.167,"y":0},"t":22,"s":[{"i":[[1.96,0],[1.713,0],[0,1.678],[0,1.497],[-1.735,0],[-1.563,0],[0,-1.876],[0,-1.17]],"o":[[-1.96,0],[-1.713,0],[0,-1.678],[0,-1.497],[1.735,0],[1.563,0],[0,1.876],[0,1.17]],"v":[[2.988,15.119],[-1.082,15.119],[-4.08,12.121],[-4.101,9.878],[-1.103,6.88],[2.966,6.88],[5.964,9.878],[5.986,12.121]],"c":true}]},{"i":{"x":0.29,"y":1},"o":{"x":0.167,"y":0},"t":38,"s":[{"i":[[1.307,0],[1.143,0],[0,1.119],[0,0.999],[-1.157,0],[-1.043,0],[0,-1.251],[0,-0.781]],"o":[[-1.307,0],[-1.143,0],[0,-1.119],[0,-0.999],[1.157,0],[1.043,0],[0,1.251],[0,0.781]],"v":[[1.357,21.345],[-1.357,21.345],[-3.357,19.345],[-3.357,13.949],[-1.357,11.949],[1.357,11.949],[3.357,13.949],[3.357,19.345]],"c":true}]},{"t":47,"s":[{"i":[[1.307,0],[1.143,0],[0,1.119],[0,0.999],[-1.157,0],[-1.043,0],[0,-1.251],[0,-0.781]],"o":[[-1.307,0],[-1.143,0],[0,-1.119],[0,-0.999],[1.157,0],[1.043,0],[0,1.251],[0,0.781]],"v":[[1.357,18.769],[-1.357,18.769],[-3.357,16.769],[-3.357,13.949],[-1.357,11.949],[1.357,11.949],[3.357,13.949],[3.357,16.769]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.29,"y":1},"o":{"x":0.69,"y":0},"t":7,"s":[{"i":[[1.847,0],[-0.056,1.917],[0.012,0.23],[-1.847,0],[0.014,-1.853],[-0.003,-0.411]],"o":[[-1.847,0],[0.009,-0.325],[-0.086,-1.795],[1.847,0],[0.01,0.158],[0.126,1.828]],"v":[[0,7.128],[-3.357,3.718],[-3.348,3.371],[0.009,-0.039],[3.366,3.371],[3.357,3.718]],"c":true}]},{"i":{"x":0.29,"y":1},"o":{"x":0.69,"y":0},"t":11,"s":[{"i":[[1.772,-0.518],[0.49,1.854],[-0.259,1.779],[-1.827,-0.267],[0.267,-1.833],[-0.692,-4.191]],"o":[[-1.772,0.518],[-1.699,-6.436],[0.259,-1.779],[1.827,0.267],[-0.267,1.833],[0.298,1.808]],"v":[[4.979,4.33],[0.799,1.999],[0.159,-9.7],[3.973,-12.59],[6.803,-8.73],[7.244,0.115]],"c":true}]},{"i":{"x":0.29,"y":1},"o":{"x":0.167,"y":0},"t":22,"s":[{"i":[[2.768,0],[0.231,2.866],[0.035,1.244],[-2.768,0],[0.1,-2.775],[0.023,-1.158]],"o":[[-2.768,0],[-0.021,-1.205],[-0.077,-2.693],[2.768,0],[-0.036,0.992],[-0.256,2.734]],"v":[[1.041,6.216],[-3.992,1.104],[-3.953,-2.27],[1.08,-7.382],[6.112,-2.27],[6.074,1.104]],"c":true}]},{"i":{"x":0.29,"y":1},"o":{"x":0.167,"y":0},"t":38,"s":[{"i":[[1.847,0],[0,1.918],[0,1.797],[-1.847,0],[0,-1.853],[0,-1.832]],"o":[[-1.847,0],[0,-1.918],[0,-1.797],[1.847,0],[0,1.853],[0,1.832]],"v":[[0,7.128],[-3.357,3.718],[-3.357,-7.678],[0,-11.088],[3.357,-7.678],[3.357,3.718]],"c":true}]},{"t":47,"s":[{"i":[[1.847,0],[0,1.918],[0,1.797],[-1.847,0],[0,-1.853],[0,-1.832]],"o":[[-1.847,0],[0,-1.918],[0,-1.797],[1.847,0],[0,1.853],[0,1.832]],"v":[[0,7.128],[-3.357,3.718],[-3.357,-5.103],[0,-8.513],[3.357,-5.103],[3.357,3.718]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":1,"k":[{"i":{"x":0.24,"y":1},"o":{"x":0.42,"y":0},"t":6,"s":[{"i":[[-4.198,-3.204],[-7.116,-8.256],[-1.557,5.269],[-1.926,10.657],[5.003,-1.155],[9.244,-0.565]],"o":[[9.181,7.008],[3.44,3.991],[2.625,-8.881],[0.945,-5.23],[-7.228,1.669],[-8.848,0.541]],"v":[[-18.981,14.01],[5.861,26.389],[18.334,26.106],[14.535,-0.968],[6.51,-9.721],[-12.444,1.802]],"c":true}]},{"i":{"x":0.833,"y":0.727},"o":{"x":0.42,"y":0},"t":11.287,"s":[{"i":[[-4.901,1.174],[-16.316,1.645],[3.341,3.54],[8.943,6.87],[0.742,-4.903],[3.674,-12.873]],"o":[[17.672,-3.781],[4.25,-1.072],[-7.759,-7.614],[-3.744,-2.846],[-2.519,16.581],[-1.402,4.747]],"v":[[-23.963,27.16],[26.087,26.915],[28.122,17.595],[4.046,-26.751],[-5.527,-22.213],[-31.096,20.517]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.273},"t":18,"s":[{"i":[[-5.15,-0.881],[-20.892,-8.354],[0.692,5.013],[4.448,9.372],[2.44,-4.475],[11.101,-9.667]],"o":[[20.57,3.52],[3.39,1.356],[-1.344,-9.741],[-1.809,-3.812],[-8.278,15.18],[-4.228,3.682]],"v":[[-28.533,22.818],[21.606,28.962],[28.765,24.188],[9.646,-23.779],[-0.231,-23.498],[-28.809,12.517]],"c":true}]},{"t":34.169921875,"s":[{"i":[[-5.281,0],[-5.269,0],[2.639,4.819],[2.658,4.602],[2.558,-4.452],[2.611,-4.631]],"o":[[5.281,0],[5.269,0],[-2.639,-4.819],[-2.658,-4.602],[-2.747,4.78],[-2.611,4.631]],"v":[[-25.281,29],[25.281,29],[31.089,18.769],[5.808,-25.598],[-5.808,-25.598],[-31.089,18.769]],"c":true}]}],"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/forward.json b/TMessagesProj/src/main/res/raw/forward.json new file mode 100644 index 00000000000..017fc1b83d7 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/forward.json @@ -0,0 +1 @@ +{"v":"5.7.1","fr":60,"ip":0,"op":47,"w":512,"h":512,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Circle Main 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.612],"y":[0.773]},"o":{"x":[0.341],"y":[0]},"t":0,"s":[-50]},{"i":{"x":[0.43],"y":[1]},"o":{"x":[0.6],"y":[0.069]},"t":9,"s":[-20]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.473],"y":[0]},"t":24,"s":[235]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":34,"s":[215]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":41,"s":[225]},{"t":46,"s":[221]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0},"t":0,"s":[256,256,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.457,"y":1},"o":{"x":0.457,"y":0},"t":9,"s":[256,236,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":0.7},"o":{"x":0.167,"y":0.167},"t":20,"s":[256,256,0],"to":[0,0,0],"ti":[0,0,0]},{"t":39,"s":[256,256,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.543,0.543,0.2],"y":[1,1,1]},"o":{"x":[0.281,0.281,0.167],"y":[0,0,0]},"t":9,"s":[108,108,100]},{"i":{"x":[0.391,0.391,0.2],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":18,"s":[88,88,100]},{"i":{"x":[0.7,0.7,0.7],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":26,"s":[105,105,100]},{"i":{"x":[0.7,0.7,0.7],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":35,"s":[97,97,100]},{"i":{"x":[0.7,0.7,0.7],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":41,"s":[101,101,100]},{"t":46,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.674,"y":1},"o":{"x":0.3,"y":0},"t":0,"s":[{"i":[[-0.003,0.672],[-1.429,0.111],[0,0],[-0.137,-3.277],[0,0],[0.488,-0.522],[1.03,0.858],[0,0],[2.174,-2.303],[6.721,-8.578],[0.819,-0.32],[0.455,1.154],[0.684,10.299],[-7.935,12.046],[0,0],[1.54,2.991],[0,0]],"o":[[0.006,-1.358],[0,0],[3.464,-0.268],[0,0],[0.028,0.666],[-0.991,1.059],[0,0],[-17.658,15.954],[-11.805,12.503],[-0.504,0.644],[-1.274,0.497],[-9.254,-13.369],[-0.622,-9.365],[4.162,-6.319],[0,0],[0,0],[-0.51,-0.424]],"v":[[-142.929,-73.145],[-140.331,-75.804],[-41.428,-83.458],[-34.988,-78.078],[-31.093,15.149],[-31.814,17.008],[-35.473,17.373],[-64.51,-6.802],[-81.206,8.901],[-103.868,36.379],[-105.452,38.189],[-108.584,37],[-121.961,-1.127],[-113.117,-37.599],[-111.428,-44.399],[-113.461,-47.556],[-142.135,-71.428]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.7,"y":0},"t":10,"s":[{"i":[[-0.622,0.382],[-0.763,-1.263],[0,0],[2.962,-2.004],[0,0],[0.708,0.154],[-0.316,1.447],[0,0],[20.15,-2.841],[24.656,-14.528],[0.77,0.435],[-0.676,1.208],[-23.429,13.055],[-14.872,2.277],[-7.707,-0.048],[-8.968,-1.014],[0,0]],"o":[[1.256,-0.773],[0,0],[1.849,3.061],[0,0],[-0.602,0.408],[-1.436,-0.313],[0,0],[-22.895,-7.249],[-17.738,2.501],[-0.764,0.45],[-1.197,-0.677],[15.85,-33.901],[16.585,-9.242],[7.801,-1.194],[8.734,0.054],[0,0],[0.156,-0.716]],"v":[[46.236,-118.334],[49.892,-117.446],[102.685,-30.042],[100.694,-20.983],[16.416,36.034],[14.365,36.43],[12.337,33.242],[21.234,-7.553],[-43.333,-14.165],[-115.658,13.802],[-118.134,13.826],[-119.077,10.413],[-60.157,-60.021],[-13.422,-76.495],[9.774,-78.099],[36.232,-76.328],[45.018,-116.614]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[-0.608,0.397],[-1.028,-1.024],[-0.371,-1.552],[2.836,-2.153],[1.719,-0.23],[0.712,0.115],[0.507,0.992],[0,0],[14.389,-7.015],[17.903,-21.088],[2.134,-0.052],[0.476,3.391],[-22.165,26.509],[-10.876,5.544],[-6.161,1.535],[-9.124,-0.227],[0,0]],"o":[[1.538,-0.479],[1.747,0.311],[1.982,4.804],[0,0],[-1.225,0.408],[-1.444,-0.233],[0,0],[-14.427,-4.404],[-15.917,7.025],[-1.707,1.924],[-3.467,0.085],[7.312,-32.773],[10.19,-9.623],[5.708,-2.852],[7.045,-1.977],[0,0],[0.719,-0.54]],"v":[[20.63,-136.731],[24.693,-135.66],[86.758,-64.563],[83.776,-53.096],[12.599,-13.971],[8.664,-13.442],[5.682,-15.812],[8.498,-46.017],[-42.071,-41.264],[-96.819,4.565],[-103.615,9.138],[-107.612,3.814],[-62.844,-76.368],[-32.901,-98.436],[-12.216,-106.351],[12.171,-109.098],[17.928,-135.517]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[-0.598,0.43],[-1.482,-0.653],[-0.532,-5.157],[2.689,-2.44],[4.56,-0.61],[0.733,0.053],[1.861,0.268],[0,0],[5.28,-13.971],[9.032,-13.194],[4.405,-0.807],[2.366,7.022],[-7.62,26.989],[-4.578,10.989],[-3.764,4.149],[-9.565,1.054],[0,0]],"o":[[2.028,-0.011],[4.633,0.826],[9.019,13.12],[0,0],[-2.266,0.416],[-1.488,-0.108],[0,0],[-5.02,11.311],[-5.421,18.36],[-1.711,5.16],[-7.243,1.331],[1.699,-19.474],[3.72,-10.015],[2.41,-5.617],[4.433,-5.334],[0,0],[1.653,-0.263]],"v":[[40.217,-92.288],[45.024,-90.894],[84.4,-74.828],[74.619,-44.762],[44.516,-44.018],[37.424,-43.262],[32.825,-44.346],[-3.353,-47.001],[-20.976,0.329],[-43.857,44.485],[-55.775,56.324],[-71.991,48.109],[-60.004,-43.025],[-48.802,-76.415],[-39.595,-91.904],[-18.089,-102.082],[35.037,-91.874]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.3,"y":0},"t":24,"s":[{"i":[[-0.589,0.457],[-1.874,-0.334],[-0.67,-8.269],[2.561,-2.688],[7.012,-0.938],[0.752,0],[3.03,-0.356],[0,0],[-2.582,-19.975],[1.375,-6.38],[6.366,-1.458],[3.997,10.157],[4.935,27.404],[0.858,15.69],[-1.696,6.406],[-9.946,2.159],[0,0]],"o":[[2.451,0.394],[7.125,1.27],[0.855,10.542],[0,0],[-3.165,0.424],[-1.526,0],[0,0],[3.101,24.876],[3.639,28.144],[-1.714,7.953],[-10.502,2.406],[-3.146,-7.994],[-1.865,-10.354],[-0.438,-8.004],[2.179,-8.231],[0,0],[2.459,-0.024]],"v":[[59.125,-97.178],[64.576,-95.506],[77.583,-76.866],[71.292,-58.64],[57.482,-50.751],[47.664,-49.799],[41.67,-49.774],[-13.583,-47.85],[-2.767,36.232],[1.86,78.943],[-14.48,97.054],[-41.243,86.345],[-57.552,-14.244],[-62.527,-57.406],[-63.229,-79.434],[-44.209,-96.026],[51.807,-97.455]],"c":true}]},{"t":32,"s":[{"i":[[-0.567,0.441],[-1.805,-0.322],[-0.478,-6.252],[3.54,-4.899],[6.754,-0.904],[0.724,0],[2.918,-0.343],[0,0],[-2.487,-19.24],[3.661,-5.111],[6.131,-1.405],[3.85,9.783],[4.754,26.396],[0.826,15.113],[-1.633,6.17],[-9.581,2.079],[0,0]],"o":[[2.361,0.38],[6.863,1.223],[0.852,11.148],[0,0],[-3.049,0.408],[-1.469,0],[0,0],[2.987,23.961],[3.505,27.109],[-4.47,6.24],[-10.116,2.318],[-3.03,-7.7],[-1.796,-9.973],[-0.421,-7.709],[2.099,-7.928],[0,0],[2.368,-0.023]],"v":[[46.982,-91.47],[52.232,-89.86],[65.66,-73.113],[58.88,-53.263],[45.399,-46.751],[35.943,-45.834],[30.169,-45.81],[-13.006,-45.395],[0.67,50.302],[5.18,114.358],[-11.032,127.234],[-36.81,116.92],[-55.358,-13.026],[-60.15,-54.6],[-60.826,-75.817],[-42.505,-91.799],[39.933,-91.737]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.3,"y":0},"t":0,"s":[{"i":[[53.21,0],[22.26,-43.235],[0,-22.089],[-0.233,-3.23],[-8.939,-16.368],[-0.072,-0.131],[-1.69,-2.619],[-2.732,-3.439],[-0.125,-0.156],[-42.355,0],[-6.035,0.831],[-20.969,26.978],[0,30.989],[8.495,17.605]],"o":[[-51.978,0],[-9.46,18.374],[0,3.29],[1.413,19.603],[0.072,0.131],[1.508,2.74],[2.389,3.702],[0.125,0.157],[24.578,30.664],[6.263,0],[35.473,-4.884],[17.651,-22.709],[0,-20.857],[-21.672,-44.915]],"v":[[0,-134.11],[-119.31,-61.305],[-134.11,0],[-133.759,9.782],[-117.78,64.189],[-117.565,64.582],[-112.764,72.623],[-105.078,83.341],[-104.703,83.811],[0,134.11],[18.461,132.85],[105.949,82.231],[134.11,0],[120.854,-58.207]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":10,"s":[{"i":[[71.418,0],[29.878,-58.029],[0,-29.648],[-0.313,-4.336],[-11.998,-21.968],[-0.097,-0.176],[-2.269,-3.515],[-3.666,-4.616],[-0.168,-0.21],[-56.849,0],[-8.1,1.115],[-28.144,36.21],[0,41.593],[11.401,23.629]],"o":[[-69.764,0],[-12.697,24.661],[0,4.415],[1.897,26.311],[0.096,0.176],[2.025,3.678],[3.206,4.969],[0.167,0.211],[32.988,41.157],[8.406,0],[47.611,-6.555],[23.69,-30.479],[0,-27.994],[-29.087,-60.283]],"v":[[0,-180],[-160.135,-82.282],[-180,0],[-179.528,13.129],[-158.082,86.153],[-157.793,86.68],[-151.35,97.473],[-141.033,111.858],[-140.53,112.489],[0,180],[24.778,178.309],[142.203,110.369],[180,0],[162.208,-78.124]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":20,"s":[{"i":[[65.476,0],[27.392,-53.202],[0,-27.181],[-0.287,-3.975],[-11,-20.14],[-0.089,-0.161],[-2.08,-3.223],[-3.361,-4.232],[-0.154,-0.192],[-52.119,0],[-7.426,1.022],[-25.803,33.197],[0,38.132],[10.453,21.663]],"o":[[-63.959,0],[-11.641,22.609],[0,4.048],[1.739,24.122],[0.088,0.161],[1.856,3.372],[2.94,4.555],[0.153,0.193],[30.243,37.733],[7.707,0],[43.649,-6.01],[21.719,-27.943],[0,-25.665],[-26.667,-55.268]],"v":[[0,-165.024],[-146.812,-75.437],[-165.024,0],[-164.592,12.037],[-144.93,78.985],[-144.665,79.468],[-138.758,89.363],[-129.299,102.552],[-128.838,103.13],[0,165.024],[22.717,163.473],[130.372,101.187],[165.024,0],[148.713,-71.624]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":29,"s":[{"i":[[71.418,0],[29.878,-58.029],[0,-29.648],[-0.313,-4.336],[-11.998,-21.968],[-0.097,-0.176],[-2.269,-3.515],[-3.666,-4.616],[-0.168,-0.21],[-56.849,0],[-8.1,1.115],[-28.144,36.21],[0,41.593],[11.401,23.629]],"o":[[-69.764,0],[-12.697,24.661],[0,4.415],[1.897,26.311],[0.096,0.176],[2.025,3.678],[3.206,4.969],[0.167,0.211],[32.988,41.157],[8.406,0],[47.611,-6.555],[23.69,-30.479],[0,-27.994],[-29.087,-60.283]],"v":[[0,-180],[-160.135,-82.282],[-180,0],[-179.528,13.129],[-158.082,86.153],[-157.793,86.68],[-151.35,97.473],[-141.033,111.858],[-140.53,112.489],[0,180],[24.778,178.309],[142.203,110.369],[180,0],[162.208,-78.124]],"c":true}]},{"t":39,"s":[{"i":[[71.418,0],[29.878,-58.029],[0,-29.648],[-0.313,-4.336],[-11.998,-21.968],[-0.097,-0.176],[-2.269,-3.515],[-3.666,-4.616],[-0.168,-0.21],[-56.849,0],[-8.1,1.115],[-28.144,36.21],[0,41.593],[11.401,23.629]],"o":[[-69.764,0],[-12.697,24.661],[0,4.415],[1.897,26.311],[0.096,0.176],[2.025,3.678],[3.206,4.969],[0.167,0.211],[32.988,41.157],[8.406,0],[47.611,-6.555],[23.69,-30.479],[0,-27.994],[-29.087,-60.283]],"v":[[0,-180],[-160.135,-82.282],[-180,0],[-179.528,13.129],[-158.082,86.153],[-157.793,86.68],[-151.35,97.473],[-141.033,111.858],[-140.53,112.489],[0,180],[24.778,178.309],[142.203,110.369],[180,0],[162.208,-78.124]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":117,"st":-3,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Circle Main 3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":360,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.3,"y":0},"t":15,"s":[{"i":[[62.981,0],[26.348,-51.174],[0,-26.145],[-0.276,-3.824],[-10.581,-19.373],[-0.085,-0.155],[-2.001,-3.1],[-3.233,-4.071],[-0.148,-0.185],[-50.133,0],[-7.143,0.983],[-24.82,31.932],[0,36.679],[10.055,20.838]],"o":[[-61.522,0],[-11.197,21.748],[0,3.894],[1.673,23.203],[0.085,0.155],[1.785,3.243],[2.828,4.382],[0.148,0.186],[29.091,36.295],[7.413,0],[41.986,-5.781],[20.892,-26.879],[0,-24.687],[-25.651,-53.162]],"v":[[0,-158.737],[-141.218,-72.562],[-158.737,0],[-158.321,11.578],[-139.408,75.976],[-139.153,76.441],[-133.471,85.958],[-124.373,98.644],[-123.929,99.201],[0,158.737],[21.851,157.245],[125.404,97.331],[158.737,0],[143.047,-68.895]],"c":true}]},{"t":34,"s":[{"i":[[92.137,0],[38.545,-74.865],[0,-38.249],[-0.403,-5.594],[-15.479,-28.341],[-0.125,-0.226],[-2.927,-4.535],[-4.73,-5.956],[-0.217,-0.271],[-73.341,0],[-10.45,1.439],[-36.309,46.714],[0,53.659],[14.709,30.485]],"o":[[-90.003,0],[-16.381,31.816],[0,5.696],[2.447,33.944],[0.124,0.227],[2.612,4.745],[4.137,6.41],[0.216,0.272],[42.558,53.097],[10.845,0],[61.423,-8.457],[30.563,-39.322],[0,-36.115],[-37.526,-77.772]],"v":[[0,-232.22],[-206.592,-106.154],[-232.22,0],[-231.612,16.938],[-203.944,111.147],[-203.571,111.827],[-195.259,125.751],[-181.948,144.31],[-181.299,145.123],[0,232.22],[31.966,230.038],[183.458,142.389],[232.22,0],[209.267,-100.789]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":15,"s":[15]},{"t":34,"s":[0]}],"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":34,"st":-2,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/import_check.json b/TMessagesProj/src/main/res/raw/import_check.json new file mode 100644 index 00000000000..077e3135b74 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/import_check.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":""},"fr":60,"ip":0,"op":13,"w":24,"h":24,"nm":"Comp 4","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":" Check","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[12,12.334,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[26.667,26.667,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":5,"s":[35.333,35.333,100]},{"t":11,"s":[33.333,33.333,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-7.4,-8.3],[-0.31,0.33],[0,0]],"o":[[0,0],[0.3,0.33],[15.81,-16.4],[0,0]],"v":[[-12.5,-0.31],[-4.86,8.24],[-3.67,8.26],[12.5,-8.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5.368,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path 6","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"t":11,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":13,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/import_finish.tgs b/TMessagesProj/src/main/res/raw/import_finish.tgs new file mode 100644 index 00000000000..48c257b28ef --- /dev/null +++ b/TMessagesProj/src/main/res/raw/import_finish.tgs @@ -0,0 +1 @@ +{"tgs":1,"v":"5.5.2.2","fr":60,"ip":0,"op":120,"w":512,"h":512,"nm":"_020_WHATSAPP_fin_OUT","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"shk13","sr":1,"ks":{"p":{"a":0,"k":[89.962,180.348,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-9.538,258.633],[-59.428,246.598],[-59.445,-149.918],[-9.555,-174.633]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.337254901961,0.549019607843,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.03137254902,0.525490196078,0.831372608858,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"shk12","sr":1,"ks":{"p":{"a":0,"k":[89.962,180.348,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[15.082,126.902],[15.555,-174.633],[-9.555,-174.633],[-10.027,128.402]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.337254901961,0.549019607843,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.113725490868,0.662745118141,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"wing_r 6","parent":44,"sr":1,"ks":{"p":{"a":0,"k":[-58.809,-56.332,0]},"a":{"a":0,"k":[-58.809,-56.332,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.254},"t":113.756,"s":[{"i":[[0,0],[-12.528,-12.993],[-0.395,-16.833]],"o":[[1.39,-62.584],[9.609,9.965],[0,0]],"v":[[-70.524,-48.518],[-17.974,-140.968],[-15.095,-81.054]],"c":false}]},{"i":{"x":0.833,"y":0.746},"o":{"x":0.333,"y":0},"t":121.623,"s":[{"i":[[0,0],[-14.208,10.399],[8.048,-43.787]],"o":[[23.947,-67.347],[16.217,-11.869],[0,0]],"v":[[-107.655,-60.291],[-124.624,-170.638],[-28.424,-47.103]],"c":false}]},{"t":126.8671875,"s":[{"i":[[0,0],[-12.528,-12.993],[-0.395,-16.833]],"o":[[3.685,-73.229],[9.609,9.965],[0,0]],"v":[[-80.894,-21.493],[-17.974,-140.968],[-19.855,-66.92]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.980392216701,0.564705882353,0.086274509804,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.835294127464,0.152941182256,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":0,"k":25},"e":{"a":0,"k":55},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":118,"op":126,"st":114,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"wing_bl 4","parent":44,"sr":1,"ks":{"r":{"a":0,"k":-172.417},"p":{"a":0,"k":[-54.755,-111.892,0]},"s":{"a":0,"k":[-100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.306,"y":1},"o":{"x":0.167,"y":0},"t":60,"s":[{"i":[[-16.004,6.98],[2.258,-12.51]],"o":[[7.913,17.033],[-1.441,7.984]],"v":[[0.289,-31.284],[6.431,20.145]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":70.488,"s":[{"i":[[-16.004,6.98],[-8.554,-11.251]],"o":[[5.587,13.961],[4.91,6.458]],"v":[[-29.273,-32.276],[-7.735,12.813]],"c":false}]},{"t":77.044921875,"s":[{"i":[[-16.004,6.98],[15.44,-7.583]],"o":[[-6.944,9.239],[-7.282,3.576]],"v":[[-3.702,-9.261],[-38.775,18.099]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.988235353956,0.933333393172,0.129411764706,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":67.867,"s":[0]},{"t":75.732421875,"s":[5]}]},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":67.867,"s":[95]},{"t":75.732421875,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":60,"op":72,"st":114,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"wing_r 3","parent":44,"sr":1,"ks":{"p":{"a":0,"k":[-58.809,-56.332,0]},"a":{"a":0,"k":[-58.809,-56.332,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.306,"y":1},"o":{"x":0.167,"y":0},"t":60,"s":[{"i":[[0,0],[-16.835,-6.508],[8.048,-43.787]],"o":[[61.001,-10.743],[24.823,9.596],[0,0]],"v":[[-107.655,-60.291],[-51.062,-162.155],[-27.184,-51.097]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":70.488,"s":[{"i":[[0,0],[-14.243,-11.087],[-2.262,-45.083]],"o":[[0.729,-63.214],[7.883,6.136],[0,0]],"v":[[-118.871,-29.792],[-42.247,-151.747],[-57.507,-52.802]],"c":false}]},{"t":77.044921875,"s":[{"i":[[0,0],[-17.608,3.967],[-9.637,-64.843]],"o":[[28.093,-40.527],[35.368,-7.969],[0,0]],"v":[[-107.655,-60.291],[-128.192,-160.615],[-27.184,-51.097]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.980392216701,0.564705882353,0.086274509804,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.835294127464,0.152941182256,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":0,"k":17},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":61.311,"s":[87]},{"t":70.48828125,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":60,"op":72,"st":114,"bm":0},{"ddd":0,"ind":6,"ty":3,"nm":"NULL CONTROL","sr":1,"ks":{"o":{"a":0,"k":0},"p":{"a":0,"k":[275.571,269.399,0]},"a":{"a":0,"k":[60,60,0]}},"ao":0,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"emj 2","parent":6,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.31],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":112.445,"s":[-24.547]},{"t":128.177734375,"s":[-8.934]}]},"p":{"a":1,"k":[{"i":{"x":0.31,"y":1},"o":{"x":0.333,"y":0},"t":112.445,"s":[79.216,181.16,0],"to":[-5.74,-132.756,0],"ti":[61.583,-132.25,0]},{"t":128.177734375,"s":[-73.147,-117.158,0]}]},"a":{"a":0,"k":[-83.624,-156.062,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.578,-3.816],[-9.017,0],[-6.49,2.864]],"o":[[6.468,2.824],[9.088,0],[1.46,-3.79]],"v":[[-107.364,-146.212],[-83.607,-141.692],[-59.697,-146.277]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-19.441,0],[4.837,4.277],[13.472,0],[4.177,-3.694]],"o":[[20.226,0],[-4.177,-3.694],[-13.472,0],[-4.837,4.277]],"v":[[-83.639,-130.843],[-60.016,-154.965],[-83.639,-153.158],[-107.261,-154.965]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.623,-1.999],[-5.025,0],[-0.923,2.113],[6.299,0]],"o":[[1.033,1.272],[5.025,0],[0.74,-1.694],[-6.707,0]],"v":[[-77.895,-163.765],[-68.797,-164.823],[-59.698,-163.765],[-68.797,-170.064]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.623,-1.999],[5.025,0],[0.923,2.113],[-6.299,0]],"o":[[-1.033,1.272],[-5.025,0],[-0.74,-1.694],[6.707,0]],"v":[[-89.836,-163.765],[-98.934,-164.823],[-108.033,-163.765],[-98.934,-170.064]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-21.673],[21.673,0],[0,21.673],[-21.673,0]],"o":[[0,21.673],[-21.673,0],[0,-21.673],[21.673,0]],"v":[[-44.382,-156.062],[-83.624,-116.82],[-122.866,-156.062],[-83.624,-195.304]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.980392216701,0.564705882353,0.086274509804,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7.5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.831372608858,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false}],"ip":114,"op":120,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"suit6","parent":22,"sr":1,"ks":{"p":{"a":0,"k":[-75.628,-68.335,0]},"a":{"a":0,"k":[207.107,377.635,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[-4.458,-0.488]],"o":[[0,0],[4.728,-0.669],[2.797,0.306]],"v":[[-25.347,-30.5],[54.18,-41.964],[68.015,-42.361]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.423529411765,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[209.806,367.965]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":156,"op":158,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"suit5","parent":22,"sr":1,"ks":{"p":{"a":0,"k":[-75.628,-68.335,0]},"a":{"a":0,"k":[207.107,377.635,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[2.797,0.306],[4.728,-0.669],[0,0],[0,0],[0,0]],"o":[[-4.458,-0.488],[0,0],[0,0],[0,0],[0,0]],"v":[[68.015,-42.361],[54.18,-41.964],[-10.847,-32.25],[-2.806,-20.715],[73.694,-26.215]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.670588235294,0.949019667682,0.56862745098,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[209.806,367.965]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":156,"op":158,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"suit 2","parent":23,"sr":1,"ks":{"r":{"a":0,"k":0.197},"p":{"a":0,"k":[-134.264,161.98,0]},"a":{"a":0,"k":[-134.264,161.98,0]},"s":{"a":0,"k":[100.109,99.891,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.115,-1.142],[1.394,-0.242],[0.115,1.142],[-1.394,0.242]],"o":[[0.115,1.142],[-1.394,0.242],[-0.115,-1.142],[1.394,-0.242]],"v":[[-117.199,153.768],[-119.514,156.273],[-122.246,154.644],[-119.931,152.139]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.115,-1.142],[1.394,-0.242],[0.115,1.142],[-1.394,0.242]],"o":[[0.115,1.142],[-1.394,0.242],[-0.115,-1.142],[1.394,-0.242]],"v":[[-141.272,156.574],[-143.587,159.079],[-146.319,157.449],[-144.004,154.944]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-109.809,153.049],[-117.566,155.362]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-152.472,157.422],[-144.202,158.092]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0.751,-0.664],[0,0],[-0.95,-0.49],[0,0],[-0.751,0.664],[0,0],[0.95,0.49],[0,0]],"o":[[0,0],[-0.751,0.664],[0,0],[0.95,0.49],[0,0],[0.751,-0.664],[0,0],[-0.95,-0.49]],"v":[[-131.697,162.903],[-135.295,166.083],[-134.935,168.173],[-130.386,170.518],[-127.305,170.202],[-123.707,167.022],[-124.067,164.932],[-128.617,162.587]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.945098042488,0.352941185236,0.141176477075,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.638,-3.707],[3.062,-0.314],[0.638,3.707],[-3.062,0.314]],"o":[[0.638,3.707],[-3.062,0.314],[-0.638,-3.707],[3.062,-0.314]],"v":[[-113.302,156.443],[-117.69,163.724],[-124.389,157.58],[-120.002,150.299]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":4},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.638,-3.707],[3.062,-0.314],[0.638,3.707],[-3.062,0.314]],"o":[[0.638,3.707],[-3.062,0.314],[-0.638,-3.707],[3.062,-0.314]],"v":[[-137.478,158.921],[-141.865,166.202],[-148.564,160.057],[-144.177,152.777]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":4},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[2.724,0.432],[-0.46,-1.07],[0,0],[-0.767,0.687],[0,0],[0,0],[0.298,1.077],[0,0],[0.859,-0.622]],"o":[[-3.586,-1.037],[-1.16,-0.184],[0,0],[0.426,0.991],[0,0],[0,0],[1.11,0.272],[0,0],[-0.292,-1.056],[0,0]],"v":[[-136.574,137.954],[-147.287,135.703],[-148.837,137.671],[-145.239,146.032],[-142.755,146.663],[-135.406,140.082],[-125.53,142.499],[-123.773,140.758],[-125.934,132.936],[-128.378,132.015]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.607843137255,0.878431372549,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":4},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.607843160629,0.878431379795,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 8","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-4.308,-12.946],[13.322,-2.995],[4.308,12.946],[-13.322,2.995]],"o":[[4.308,12.946],[-13.322,2.995],[-4.308,-12.946],[13.322,-2.995]],"v":[[-106.505,156.539],[-125.068,180.315],[-154.747,167.386],[-138.426,138.522]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.831372559071,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 9","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[14.678,-0.956],[1.796,-5.903],[0,0]],"o":[[-17.964,1.169],[13.73,-2.31],[-7.827,-18.221]],"v":[[-127.893,174.295],[-152.915,198.291],[-96.712,194.826]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.831372559071,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 10","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-106.6,127.209],[-93.345,194.264],[-155.352,200.784]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.726274677351,0.599050304936,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":44},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.672,0.093],[0,0]],"o":[[0,0],[-0.331,-1.642],[0,0],[0,0]],"v":[[-161.021,200.784],[-175.839,127.331],[-173.297,124.042],[-107.753,120.393]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156863213,0.713725507259,0.584313750267,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":44},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-90.108,196.722],[-157.941,203.566],[-173.387,127],[-104.673,123.175]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.709803938866,0.505882382393,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":15},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.831372559071,0.078431375325,0.352941185236,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-90.108,196.722],[-157.941,203.566],[-173.387,127],[-104.673,123.175]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.561199592142,0.276337687174,0.162392889285,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":26},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.333,"y":0},"t":138.666,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-136.306,188.315],[-179.301,190.709],[-164.733,146.6],[-134.252,144.207]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.6,"y":0},"t":149.156,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-133.223,210.384],[-176.218,212.777],[-159.587,158.073],[-129.106,155.68]],"c":true}]},{"t":160.955078125,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-136.306,188.315],[-179.301,190.709],[-164.733,146.6],[-134.252,144.207]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.709803921569,0.505882352941,0.411764735802,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.560784313725,0.274509803922,0.160784313725,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":12},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false}],"ip":144,"op":158,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"msg","parent":15,"sr":1,"ks":{"p":{"a":0,"k":[-44.199,-10.205,0]},"s":{"a":0,"k":[118.443,118.443,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[0.473663150563,0.725567267923,0.489048647413,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.647058823529,0.141176470588,0.917647058824,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"fl","c":{"a":0,"k":[0.647058844566,0.141176477075,0.917647063732,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":132,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"msg","parent":13,"sr":1,"ks":{"p":{"a":0,"k":[1.573,15.417,0]},"a":{"a":0,"k":[-298.846,-251.295,0]},"s":{"a":0,"k":[99.557,99.557,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-301.221,-260.093],[-296.75,-261.047],[-298.241,-258.185]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.929411768913,0.117647059262,0.474509805441,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.303,-2.018],[1.435,-0.215],[0.303,2.018],[-1.435,0.215]],"o":[[0.303,2.018],[-1.435,0.215],[-0.303,-2.018],[1.435,-0.215]],"v":[[-289.686,-263.866],[-291.736,-259.822],[-294.882,-263.087],[-292.832,-267.131]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.303,-2.018],[1.435,-0.215],[0.303,2.018],[-1.435,0.215]],"o":[[0.303,2.018],[-1.435,0.215],[-0.303,-2.018],[1.435,-0.215]],"v":[[-303.31,-261.284],[-305.36,-257.24],[-308.506,-260.505],[-306.456,-264.549]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-2.273,5.33],[1.828,2.614],[0.157,-0.533],[0.286,-1.203],[0,0],[1.452,1.277],[0.079,-0.54],[-0.305,-3.913],[-4.174,0]],"o":[[-2.042,-6.245],[-0.318,-0.455],[-0.372,1.264],[-3.961,0.523],[0,0],[-0.41,-0.361],[-0.747,5.096],[2.707,2.764],[6.161,0]],"v":[[-286.479,-260.363],[-292.921,-275.22],[-294.118,-275.029],[-294.888,-271.227],[-306.92,-269.209],[-309.643,-272.215],[-310.774,-271.808],[-310.848,-255.779],[-300.199,-251.295]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.874478448606,0.874478448606,0.874478448606,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false}],"ip":0,"op":132,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"msg","parent":15,"sr":1,"ks":{"p":{"a":0,"k":[-44.199,-10.205,0]},"s":{"a":0,"k":[118.443,118.443,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0]],"o":[[0,0]],"v":[[21.706,6.289]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.473663150563,0.725567267923,0.489048647413,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.647058823529,0.141176470588,0.917647058824,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-8.235],[8.235,0],[0,8.235],[-8.235,0]],"o":[[0,8.235],[-8.235,0],[0,-8.235],[8.235,0]],"v":[[14.91,0],[0,14.91],[-14.91,0],[0,-14.91]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.647058844566,0.141176477075,0.917647063732,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":132,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"msg","parent":15,"sr":1,"ks":{"p":{"a":0,"k":[15.576,-10.738,0]},"a":{"a":0,"k":[-1541.184,1009.518,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-19.665,0],[12.415,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1513.76,1000.998]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1.366,0],[20.134,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1528.516,1018.038]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-5.558,0],[20.558,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1564.215,1018.038]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-14.344,0],[3.094,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1555.429,1000.998]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false}],"ip":0,"op":132,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Layer 27","parent":6,"sr":1,"ks":{"r":{"a":0,"k":-0.407},"p":{"a":0,"k":[-11.331,19.357,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[5.671,0],[0,0],[0,-5.671],[0,0],[-5.671,0],[0,0],[0,5.671],[0,0]],"o":[[0,0],[-5.671,0],[0,0],[0,5.671],[0,0],[5.671,0],[0,0],[0,-5.671]],"v":[[62.304,-38.695],[-62.304,-38.695],[-72.572,-28.427],[-72.572,7.217],[-62.304,17.485],[62.304,17.485],[72.572,7.217],[72.572,-28.427]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.473663150563,0.725567267923,0.489048647413,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":132,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"suit","parent":22,"sr":1,"ks":{"p":{"a":0,"k":[-108.873,19.402,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,4.834],[0,0]],"o":[[0,0],[-5.684,-2.682],[0,0],[0,0]],"v":[[25.795,23.042],[-19.085,7.477],[-25.795,-2.296],[-25.795,-23.042]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.04705882445,0.929411768913,0.04705882445,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"suit","parent":22,"sr":1,"ks":{"p":{"a":0,"k":[131.536,7.255,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[2.814,-0.435]],"o":[[0,0],[0,8.556],[0,0]],"v":[[3.17,-14.661],[3.146,5.131],[-3.17,14.661]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.04705882445,0.929411768913,0.04705882445,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"suit","parent":22,"sr":1,"ks":{"p":{"a":0,"k":[107.847,8.546,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,27.019],[0,-27.019]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.423529411765,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7},"lc":2,"lj":2,"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":6}},{"n":"g","nm":"gap","v":{"a":0,"k":12}},{"n":"o","nm":"offset","v":{"a":0,"k":0}}],"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"suit","parent":22,"sr":1,"ks":{"p":{"a":0,"k":[-19.938,27.88,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,27.019],[0,-27.019]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.423529411765,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7},"lc":2,"lj":2,"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":6}},{"n":"g","nm":"gap","v":{"a":0,"k":12}},{"n":"o","nm":"offset","v":{"a":0,"k":0}}],"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"suit","parent":22,"sr":1,"ks":{"p":{"a":0,"k":[55.74,34.104,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0.913,0],[0,8.399],[0,0],[-2.481,0.416],[0,0],[-0.255,0],[0,-2.447],[0,0],[-1.163,0],[-0.152,0.025],[0,0],[0,1.67],[0,0],[-2.482,0.416],[0,0],[-0.255,0],[0,-2.447],[0,0],[9.11,-1.525],[0,0]],"o":[[-8.213,0],[0,0],[0,-2.512],[0,0],[0.268,-0.045],[2.413,0],[0,0],[0,1.225],[0.146,0],[0,0],[1.654,-0.276],[0,0],[0,-2.512],[0,0],[0.268,-0.045],[2.413,0],[0,0],[0,9.213],[0,0],[-0.929,0.155]],"v":[[-20.989,23.87],[-35.396,9.136],[-35.396,-8.321],[-30.971,-13.542],[-27.049,-14.199],[-26.265,-14.265],[-21.962,-9.901],[-21.962,4.072],[-20.018,6.12],[-19.57,6.082],[18.91,-0.362],[21.962,-3.953],[21.962,-17.927],[26.388,-23.147],[30.31,-23.805],[31.094,-23.87],[35.396,-19.507],[35.396,-2.05],[18.875,17.424],[-18.214,23.636]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.439215689898,0.439215689898,0.439215689898,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.678431391716,0.678431391716,0.678431391716,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"suit","parent":22,"sr":1,"ks":{"p":{"a":0,"k":[53.683,32.356,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0.742,0.624],[1.061,0],[0.268,-0.045],[0,0],[0,-2.512],[0,0],[1.654,-0.276],[0,0],[0,0],[0.563,0.735],[0.742,0.624],[1.061,0],[0.268,-0.045],[0,0],[0,-2.512],[0,0],[-4.412,-2.461],[-4.647,0],[-0.929,0.155],[0,0],[0,9.213],[0,0],[0.565,0.735]],"o":[[-0.742,-0.624],[-0.255,0],[0,0],[-2.482,0.416],[0,0],[0,1.67],[0,0],[0,0],[0,-1.025],[-0.761,-0.994],[-0.742,-0.624],[-0.255,0],[0,0],[-2.481,0.416],[0,0],[0,5.709],[2.598,3.282],[0.913,0],[0,0],[9.11,-1.525],[0,0],[0,-1.026],[-0.761,-0.992]],"v":[[31.8,-24.623],[29.037,-25.618],[28.253,-25.553],[24.331,-24.896],[19.905,-19.675],[19.905,-5.701],[16.853,-2.11],[-19.905,4.045],[-19.905,-8.153],[-20.8,-10.842],[-25.559,-15.018],[-28.321,-16.013],[-29.106,-15.947],[-33.027,-15.29],[-37.453,-10.069],[-37.453,7.388],[-30.175,20.306],[-18.932,25.618],[-16.158,25.384],[20.932,19.172],[37.453,-0.302],[37.453,-17.759],[36.556,-20.451]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.439215689898,0.439215689898,0.439215689898,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.439215689898,0.439215689898,0.439215689898,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"suit","parent":6,"sr":1,"ks":{"p":{"a":0,"k":[85.164,238.571,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[18.477,-2.926],[40.473,-6.651],[10.69,2.723],[0,0],[0.365,5.001],[-0.262,-1.005],[0,0],[0,0],[-8.717,-3.989],[0,0],[-15.65,2.413],[0,0],[0,12.053]],"o":[[0,0],[0.191,-1.658],[-27.035,4.281],[-32.424,5.328],[0,0],[-5.844,-3.671],[-1.293,0.943],[0,0],[0,0],[0,9.793],[0,0],[10.845,3.761],[0,0],[9.158,-1.412],[0,0]],"v":[[144.732,-28.907],[144.714,-28.907],[130.55,-22.751],[-22.958,0.931],[-83.425,-1.193],[-132.641,-18.549],[-143.1,-27.721],[-144.668,-24.773],[-144.668,-24.773],[-144.668,17.106],[-131.71,36.161],[-79.551,54.251],[-31.576,56.693],[129.89,31.799],[144.683,12.398]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.001470178366,0.422209855622,0.001470178366,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.752941191196,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"suit","parent":6,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":138.666,"s":[-16.345]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":149.156,"s":[16.908]},{"t":160.955078125,"s":[2.263]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":138.666,"s":[-0.085,213.581,0],"to":[24.831,-29.025,0],"ti":[-3.783,27.499,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":149.156,"s":[42.402,57.027,0],"to":[6.655,-48.376,0],"ti":[24.354,-41.676,0]},{"t":160.955078125,"s":[9.415,115.581,0]}]},"a":{"a":0,"k":[-134.264,161.98,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":138.666,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":149.156,"s":[110,90,100]},{"t":160.955078125,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.115,-1.142],[1.394,-0.242],[0.115,1.142],[-1.394,0.242]],"o":[[0.115,1.142],[-1.394,0.242],[-0.115,-1.142],[1.394,-0.242]],"v":[[-117.199,153.768],[-119.514,156.273],[-122.246,154.644],[-119.931,152.139]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.115,-1.142],[1.394,-0.242],[0.115,1.142],[-1.394,0.242]],"o":[[0.115,1.142],[-1.394,0.242],[-0.115,-1.142],[1.394,-0.242]],"v":[[-141.272,156.574],[-143.587,159.079],[-146.319,157.449],[-144.004,154.944]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-109.809,153.049],[-117.566,155.362]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-152.472,157.422],[-144.202,158.092]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0.751,-0.664],[0,0],[-0.95,-0.49],[0,0],[-0.751,0.664],[0,0],[0.95,0.49],[0,0]],"o":[[0,0],[-0.751,0.664],[0,0],[0.95,0.49],[0,0],[0.751,-0.664],[0,0],[-0.95,-0.49]],"v":[[-131.697,162.903],[-135.295,166.083],[-134.935,168.173],[-130.386,170.518],[-127.305,170.202],[-123.707,167.022],[-124.067,164.932],[-128.617,162.587]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.945098042488,0.352941185236,0.141176477075,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.638,-3.707],[3.062,-0.314],[0.638,3.707],[-3.062,0.314]],"o":[[0.638,3.707],[-3.062,0.314],[-0.638,-3.707],[3.062,-0.314]],"v":[[-113.302,156.443],[-117.69,163.724],[-124.389,157.58],[-120.002,150.299]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":4},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.638,-3.707],[3.062,-0.314],[0.638,3.707],[-3.062,0.314]],"o":[[0.638,3.707],[-3.062,0.314],[-0.638,-3.707],[3.062,-0.314]],"v":[[-137.478,158.921],[-141.865,166.202],[-148.564,160.057],[-144.177,152.777]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":4},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[2.724,0.432],[-0.46,-1.07],[0,0],[-0.767,0.687],[0,0],[0,0],[0.298,1.077],[0,0],[0.859,-0.622]],"o":[[-3.586,-1.037],[-1.16,-0.184],[0,0],[0.426,0.991],[0,0],[0,0],[1.11,0.272],[0,0],[-0.292,-1.056],[0,0]],"v":[[-136.574,137.954],[-147.287,135.703],[-148.837,137.671],[-145.239,146.032],[-142.755,146.663],[-135.406,140.082],[-125.53,142.499],[-123.773,140.758],[-125.934,132.936],[-128.378,132.015]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.607843137255,0.878431372549,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":4},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.607843160629,0.878431379795,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 8","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-4.308,-12.946],[13.322,-2.995],[4.308,12.946],[-13.322,2.995]],"o":[[4.308,12.946],[-13.322,2.995],[-4.308,-12.946],[13.322,-2.995]],"v":[[-106.505,156.539],[-125.068,180.315],[-154.747,167.386],[-138.426,138.522]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.831372559071,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 9","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[14.678,-0.956],[1.796,-5.903],[0,0]],"o":[[-17.964,1.169],[13.73,-2.31],[-7.827,-18.221]],"v":[[-127.893,174.295],[-152.915,198.291],[-96.712,194.826]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.831372559071,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 10","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-106.6,127.209],[-92.464,197.283],[-155.352,200.784]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.726274677351,0.599050304936,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":44},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.672,0.093],[0,0]],"o":[[0,0],[-0.331,-1.642],[0,0],[0,0]],"v":[[-161.021,200.784],[-175.839,127.331],[-173.297,124.042],[-107.753,120.393]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156863213,0.713725507259,0.584313750267,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":44},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-89.227,199.741],[-157.941,203.566],[-173.387,127],[-104.673,123.175]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.709803938866,0.505882382393,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":15},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.831372559071,0.078431375325,0.352941185236,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-89.227,199.741],[-157.941,203.566],[-173.387,127],[-104.673,123.175]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.561199592142,0.276337687174,0.162392889285,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":26},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.333,"y":0},"t":138.666,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-136.306,188.315],[-179.301,190.709],[-164.733,146.6],[-134.252,144.207]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.6,"y":0},"t":149.156,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-133.223,210.384],[-176.218,212.777],[-159.587,158.073],[-129.106,155.68]],"c":true}]},{"t":160.955078125,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-136.306,188.315],[-179.301,190.709],[-164.733,146.6],[-134.252,144.207]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.709803921569,0.505882352941,0.411764735802,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.560784313725,0.274509803922,0.160784313725,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":12},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false}],"ip":0,"op":144,"st":0,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":"m13","parent":26,"sr":1,"ks":{"p":{"a":0,"k":[15.576,-10.738,0]},"a":{"a":0,"k":[-1541.184,1009.518,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-23.79,0],[6.79,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1513.76,1000.998]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1528.516,1018.038]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-11.183,0],[27.183,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1564.215,1018.038]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-19.969,0],[2.969,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1555.429,1000.998]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false}],"ip":0,"op":132,"st":0,"bm":0},{"ddd":0,"ind":25,"ty":4,"nm":"m12","parent":26,"sr":1,"ks":{"p":{"a":0,"k":[-44.199,-10.205,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-8.235],[8.235,0],[0,8.235],[-8.235,0]],"o":[[0,8.235],[-8.235,0],[0,-8.235],[8.235,0]],"v":[[14.91,0],[0,14.91],[-14.91,0],[0,-14.91]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.417009091845,0.917647058824,0.141176470588,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":132,"st":0,"bm":0},{"ddd":0,"ind":26,"ty":4,"nm":"msg1","parent":6,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":69.178,"s":[-24.547]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":84.91,"s":[73.158]},{"t":94.08984375,"s":[4.609]}]},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":69.178,"s":[95.669,228.857,0],"to":[-16.439,-53.534,0],"ti":[49.354,29.091,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.8,"y":0},"t":84.91,"s":[49.305,-54.714,0],"to":[-21.676,-12.777,0],"ti":[27.888,-61.96,0]},{"t":94.08984375,"s":[-36.331,12.357,0]}]},"s":{"a":1,"k":[{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":69.178,"s":[100,80,100]},{"t":84.91015625,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[5.671,0],[0,0],[0,-5.671],[0,0],[-5.671,0],[0,0],[0,5.671],[0,0]],"o":[[0,0],[-5.671,0],[0,0],[0,5.671],[0,0],[5.671,0],[0,0],[0,-5.671]],"v":[[62.304,-38.695],[-62.304,-38.695],[-72.572,-28.427],[-72.572,7.217],[-62.304,17.485],[62.304,17.485],[72.572,7.217],[72.572,-28.427]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.560784339905,0.729411780834,0.858823537827,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":132,"st":0,"bm":0},{"ddd":0,"ind":27,"ty":4,"nm":"emj","parent":6,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.926],"y":[0]},"t":119,"s":[-24.547]},{"i":{"x":[0.31],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":138.666,"s":[360]},{"i":{"x":[0.77],"y":[1]},"o":{"x":[0.69],"y":[0]},"t":145.223,"s":[360]},{"t":155.7109375,"s":[380]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":119,"s":[122.349,201.429,0],"to":[43.26,-236.756,0],"ti":[76.083,-116.25,0]},{"t":138.666,"s":[-40.151,-118.571,0],"h":1},{"i":{"x":0.77,"y":1},"o":{"x":0.69,"y":0},"t":145.223,"s":[-40.151,-118.571,0],"to":[3.917,0.25,0],"ti":[-0.833,0,0]},{"t":155.7109375,"s":[-10.151,-118.571,0]}]},"a":{"a":0,"k":[-190.48,-156.062,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":136.045,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":141.289,"s":[105,95,100]},{"t":146.533203125,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0.733,1.838],[8.598,-3.023],[-2.25,0.196],[-3.256,-3.92]],"o":[[-1.86,-4.663],[-2.932,1.031],[4.938,-0.43],[1.216,1.465]],"v":[[-160.417,-168.366],[-177.721,-175.9],[-177.983,-173.095],[-162.057,-167.193]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.901,1.761],[-8.279,-3.81],[2.222,0.404],[3.606,-3.6]],"o":[[2.286,-4.47],[2.823,1.299],[-4.876,-0.887],[-1.347,1.345]],"v":[[-220.441,-162.582],[-202.511,-168.474],[-202.511,-165.657],[-218.918,-161.261]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-11.886,0],[3.505,2.54],[9.762,0],[3.027,-2.193]],"o":[[12.241,0],[-3.027,-2.193],[-9.762,0],[-3.505,2.54]],"v":[[-189.813,-127.788],[-172.695,-142.112],[-189.813,-136.474],[-206.93,-142.112]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.623,-1.999],[5.025,0],[0.923,2.113],[-6.299,0]],"o":[[-1.033,1.272],[-5.025,0],[-0.74,-1.694],[6.707,0]],"v":[[-196.014,-153.33],[-205.112,-154.388],[-214.211,-153.33],[-205.112,-159.629]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-3.944],[3.944,0],[0,3.944],[-3.944,0]],"o":[[0,3.944],[-3.944,0],[0,-3.944],[3.944,0]],"v":[[-167.163,-157.028],[-174.305,-149.886],[-181.447,-157.028],[-174.305,-164.17]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-21.673],[21.673,0],[0,21.673],[-21.673,0]],"o":[[0,21.673],[-21.673,0],[0,-21.673],[21.673,0]],"v":[[-151.238,-156.062],[-190.48,-116.82],[-229.722,-156.062],[-190.48,-195.304]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.632885203642,0.209849892411,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7.5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.996139705882,1,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":48,"op":300,"st":0,"bm":0},{"ddd":0,"ind":28,"ty":4,"nm":"emj","parent":6,"sr":1,"ks":{"r":{"a":0,"k":23.438},"p":{"a":0,"k":[-108.195,-118.461,0]},"a":{"a":0,"k":[-83.624,-156.062,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-14.641,0],[3.643,2.878],[10.146,0],[3.146,-2.485]],"o":[[15.233,0],[-3.146,-2.485],[-10.146,0],[-3.643,2.878]],"v":[[-83.639,-135.393],[-65.848,-151.623],[-83.639,-150.407],[-101.429,-151.623]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.623,-1.999],[-5.025,0],[-0.923,2.113],[6.299,0]],"o":[[1.033,1.272],[5.025,0],[0.74,-1.694],[-6.707,0]],"v":[[-77.895,-163.765],[-68.582,-160.556],[-59.698,-163.765],[-68.797,-170.064]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.623,-1.999],[5.025,0],[0.923,2.113],[-6.299,0]],"o":[[-1.033,1.272],[-5.025,0],[-0.74,-1.694],[6.707,0]],"v":[[-89.836,-163.765],[-99.217,-161.703],[-108.033,-163.765],[-98.934,-170.064]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-21.673],[21.673,0],[0,21.673],[-21.673,0]],"o":[[0,21.673],[-21.673,0],[0,-21.673],[21.673,0]],"v":[[-44.382,-156.062],[-83.624,-116.82],[-122.866,-156.062],[-83.624,-195.304]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.63137254902,0.211764705882,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7.5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.996078431373,1,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":29,"ty":4,"nm":"emj","parent":6,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.31],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":112.445,"s":[-24.547]},{"t":128.177734375,"s":[-8.934]}]},"p":{"a":1,"k":[{"i":{"x":0.31,"y":1},"o":{"x":0.333,"y":0},"t":112.445,"s":[79.216,181.16,0],"to":[-5.74,-132.756,0],"ti":[61.583,-132.25,0]},{"t":128.177734375,"s":[-73.147,-117.158,0]}]},"a":{"a":0,"k":[-83.624,-156.062,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":126.867,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":132.111,"s":[105,95,100]},{"t":137.35546875,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.578,-3.816],[-9.017,0],[-6.49,2.864]],"o":[[6.468,2.824],[9.088,0],[1.46,-3.79]],"v":[[-107.364,-146.212],[-83.607,-141.692],[-59.697,-146.277]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-19.441,0],[4.837,4.277],[13.472,0],[4.177,-3.694]],"o":[[20.226,0],[-4.177,-3.694],[-13.472,0],[-4.837,4.277]],"v":[[-83.639,-130.843],[-60.016,-154.965],[-83.639,-153.158],[-107.261,-154.965]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.623,-1.999],[-5.025,0],[-0.923,2.113],[6.299,0]],"o":[[1.033,1.272],[5.025,0],[0.74,-1.694],[-6.707,0]],"v":[[-77.895,-163.765],[-68.797,-164.823],[-59.698,-163.765],[-68.797,-170.064]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.623,-1.999],[5.025,0],[0.923,2.113],[-6.299,0]],"o":[[-1.033,1.272],[-5.025,0],[-0.74,-1.694],[6.707,0]],"v":[[-89.836,-163.765],[-98.934,-164.823],[-108.033,-163.765],[-98.934,-170.064]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-21.673],[21.673,0],[0,21.673],[-21.673,0]],"o":[[0,21.673],[-21.673,0],[0,-21.673],[21.673,0]],"v":[[-44.382,-156.062],[-83.624,-116.82],[-122.866,-156.062],[-83.624,-195.304]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.980392216701,0.564705882353,0.086274509804,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7.5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.831372608858,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false}],"ip":120,"op":300,"st":0,"bm":0},{"ddd":0,"ind":30,"ty":4,"nm":"emj","parent":6,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.31],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":112.445,"s":[-24.547]},{"t":128.177734375,"s":[-8.934]}]},"p":{"a":1,"k":[{"i":{"x":0.31,"y":1},"o":{"x":0.333,"y":0},"t":112.445,"s":[79.216,181.16,0],"to":[-5.74,-132.756,0],"ti":[61.583,-132.25,0]},{"t":128.177734375,"s":[-73.147,-117.158,0]}]},"a":{"a":0,"k":[-83.624,-156.062,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.578,-3.816],[-9.017,0],[-6.49,2.864]],"o":[[6.468,2.824],[9.088,0],[1.46,-3.79]],"v":[[-107.364,-146.212],[-83.607,-141.692],[-59.697,-146.277]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-19.441,0],[4.837,4.277],[13.472,0],[4.177,-3.694]],"o":[[20.226,0],[-4.177,-3.694],[-13.472,0],[-4.837,4.277]],"v":[[-83.639,-130.843],[-60.016,-154.965],[-83.639,-153.158],[-107.261,-154.965]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.623,-1.999],[-5.025,0],[-0.923,2.113],[6.299,0]],"o":[[1.033,1.272],[5.025,0],[0.74,-1.694],[-6.707,0]],"v":[[-77.895,-163.765],[-68.797,-164.823],[-59.698,-163.765],[-68.797,-170.064]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.623,-1.999],[5.025,0],[0.923,2.113],[-6.299,0]],"o":[[-1.033,1.272],[-5.025,0],[-0.74,-1.694],[6.707,0]],"v":[[-89.836,-163.765],[-98.934,-164.823],[-108.033,-163.765],[-98.934,-170.064]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-21.673],[21.673,0],[0,21.673],[-21.673,0]],"o":[[0,21.673],[-21.673,0],[0,-21.673],[21.673,0]],"v":[[-44.382,-156.062],[-83.624,-116.82],[-122.866,-156.062],[-83.624,-195.304]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.980392216701,0.564705882353,0.086274509804,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7.5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.831372608858,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false}],"ip":52,"op":114,"st":0,"bm":0},{"ddd":0,"ind":31,"ty":4,"nm":"m28","parent":32,"sr":1,"ks":{"p":{"a":0,"k":[-44.199,-10.205,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-8.235],[8.235,0],[0,8.235],[-8.235,0]],"o":[[0,8.235],[-8.235,0],[0,-8.235],[8.235,0]],"v":[[14.91,0],[0,14.91],[-14.91,0],[0,-14.91]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.417009091845,0.917647058824,0.141176470588,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":132,"st":0,"bm":0},{"ddd":0,"ind":32,"ty":4,"nm":"msg4","parent":6,"sr":1,"ks":{"r":{"a":0,"k":4.609},"p":{"a":0,"k":[-36.331,12.357,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[5.671,0],[0,0],[0,-5.671],[0,0],[-5.671,0],[0,0],[0,5.671],[0,0]],"o":[[0,0],[-5.671,0],[0,0],[0,5.671],[0,0],[5.671,0],[0,0],[0,-5.671]],"v":[[62.304,-38.695],[-62.304,-38.695],[-72.572,-28.427],[-72.572,7.217],[-62.304,17.485],[62.304,17.485],[72.572,7.217],[72.572,-28.427]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.560784339905,0.729411780834,0.858823537827,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":132,"st":0,"bm":0},{"ddd":0,"ind":33,"ty":4,"nm":"mouth","parent":35,"sr":1,"ks":{"p":{"a":0,"k":[237.401,247.552,0]},"a":{"a":0,"k":[237.401,247.552,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":60,"s":[{"i":[[-14.406,5.064],[11.992,11.496],[-19.628,-0.664]],"o":[[-41.827,17.295],[8.78,3.704],[30.289,1.024]],"v":[[44.104,-3.034],[-79.426,-0.631],[-33.101,9.454]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":69.178,"s":[{"i":[[-13.668,3.573],[11.377,8.112],[-18.622,-0.468]],"o":[[-39.682,12.204],[8.33,2.614],[28.736,0.723]],"v":[[49.75,-0.298],[-67.448,1.397],[-23.497,8.514]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":77.045,"s":[{"i":[[-13.668,3.573],[11.377,8.112],[-18.622,-0.468]],"o":[[-39.682,12.204],[8.33,2.614],[28.736,0.723]],"v":[[49.75,-0.298],[-67.448,1.397],[-23.497,8.514]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":84.91,"s":[{"i":[[-13.967,3.573],[11.626,8.112],[-19.029,-0.468]],"o":[[-40.55,12.204],[8.512,2.614],[29.364,0.723]],"v":[[44.488,-3.059],[-75.272,-1.363],[-30.361,5.754]],"c":true}]},{"i":{"x":0.11,"y":1},"o":{"x":0.333,"y":0},"t":98.021,"s":[{"i":[[-13.967,3.573],[11.626,8.112],[-19.029,-0.468]],"o":[[-40.55,12.204],[8.512,2.614],[29.364,0.723]],"v":[[44.488,-3.059],[-75.272,-1.363],[-30.361,5.754]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.89,"y":0},"t":115.066,"s":[{"i":[[-13.668,4.916],[11.377,11.159],[-18.622,-0.644]],"o":[[-39.682,16.788],[8.33,3.596],[28.736,0.994]],"v":[[49.399,-3.034],[-67.799,-0.701],[-23.848,9.089]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":120.311,"s":[{"i":[[-13.668,4.916],[11.377,11.159],[-18.622,-0.644]],"o":[[-39.682,16.788],[8.33,3.596],[28.736,0.994]],"v":[[49.399,-3.034],[-67.799,-0.701],[-23.848,9.089]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":126.867,"s":[{"i":[[-14.74,3.991],[11.115,12.346],[-19.526,-2.105]],"o":[[-42.985,14.173],[8.484,4.34],[30.131,3.248]],"v":[[43.975,6.008],[-79.398,-0.678],[-33.939,12.786]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":138.666,"s":[{"i":[[-14.406,5.064],[11.992,11.496],[-19.628,-0.664]],"o":[[-41.827,17.295],[8.78,3.704],[30.289,1.024]],"v":[[44.104,-3.034],[-79.426,-0.631],[-33.101,9.454]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":155.711,"s":[{"i":[[-14.406,5.064],[11.992,11.496],[-19.628,-0.664]],"o":[[-41.827,17.295],[8.78,3.704],[30.289,1.024]],"v":[[44.104,-3.034],[-79.426,-0.631],[-33.101,9.454]],"c":true}]},{"i":{"x":0.294,"y":1},"o":{"x":0.333,"y":0},"t":166.199,"s":[{"i":[[-14.406,5.064],[11.992,11.496],[-19.628,-0.664]],"o":[[-41.827,17.295],[8.78,3.704],[30.289,1.024]],"v":[[44.104,-3.034],[-79.426,-0.631],[-33.101,9.454]],"c":true}]},{"t":178,"s":[{"i":[[-8.706,7.731],[9.732,9.591],[-18.602,0.975]],"o":[[-18.562,11.912],[9.112,8.731],[31.851,-1.67]],"v":[[57.013,-2.914],[-69.516,1.178],[-9.41,7.418]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.490196079016,0.035294119269,0.035294119269,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[237.401,247.552]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"fl","c":{"a":0,"k":[0.490196078431,0.035294117647,0.035294117647,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false}],"ip":0,"op":300,"st":114,"bm":0},{"ddd":0,"ind":34,"ty":4,"nm":"beak_bl","parent":33,"sr":1,"ks":{"r":{"a":0,"k":-26.335},"p":{"a":0,"k":[211.876,216.495,0]},"a":{"a":0,"k":[35.051,-0.937,0]},"s":{"a":0,"k":[-100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":60,"s":[{"i":[[0,0],[9.529,12.852]],"o":[[-9.767,3.378],[0,0]],"v":[[35.498,-14.31],[-3.543,-34.996]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":69.178,"s":[{"i":[[0,0],[9.529,12.852]],"o":[[-9.767,3.378],[0,0]],"v":[[32.888,-13.714],[-7.072,-32.301]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":77.045,"s":[{"i":[[0,0],[9.529,12.852]],"o":[[-9.767,3.378],[0,0]],"v":[[32.888,-13.714],[-7.072,-32.301]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":84.91,"s":[{"i":[[0,0],[9.529,12.852]],"o":[[-10.575,1.56],[0,0]],"v":[[31.846,-15.21],[-9.151,-31.298]],"c":false}]},{"i":{"x":0.11,"y":1},"o":{"x":0.333,"y":0},"t":98.021,"s":[{"i":[[0,0],[9.529,12.852]],"o":[[-10.575,1.56],[0,0]],"v":[[31.846,-15.21],[-9.151,-31.298]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.89,"y":0},"t":115.066,"s":[{"i":[[0,0],[9.529,12.852]],"o":[[-9.767,3.378],[0,0]],"v":[[35.498,-14.31],[-3.543,-34.996]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":120.311,"s":[{"i":[[0,0],[9.529,12.852]],"o":[[-9.767,3.378],[0,0]],"v":[[35.498,-14.31],[-3.543,-34.996]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":126.867,"s":[{"i":[[0,0],[9.529,12.852]],"o":[[-10.575,1.56],[0,0]],"v":[[31.846,-15.21],[-9.151,-31.298]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":138.666,"s":[{"i":[[0,0],[9.529,12.852]],"o":[[-9.767,3.378],[0,0]],"v":[[35.498,-14.31],[-3.543,-34.996]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":155.711,"s":[{"i":[[0,0],[9.529,12.852]],"o":[[-9.767,3.378],[0,0]],"v":[[35.498,-14.31],[-3.543,-34.996]],"c":false}]},{"i":{"x":0.294,"y":1},"o":{"x":0.333,"y":0},"t":166.199,"s":[{"i":[[0,0],[9.529,12.852]],"o":[[-9.767,3.378],[0,0]],"v":[[35.498,-14.31],[-3.543,-34.996]],"c":false}]},{"t":178,"s":[{"i":[[0,0],[9.529,12.852]],"o":[[-12.786,3.346],[0,0]],"v":[[32.888,-13.714],[-7.072,-32.301]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.705882352941,0.517647058824,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[24.706,22.107]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":228,"s":[5]},{"t":240,"s":[0]}]},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[95]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":228,"s":[100]},{"t":240,"s":[95]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":0,"op":300,"st":124,"bm":0},{"ddd":0,"ind":35,"ty":4,"nm":"beak","parent":42,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[1.252]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":69.178,"s":[6.895]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":77.045,"s":[6.895]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84.91,"s":[4.844]},{"i":{"x":[0.11],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":98.021,"s":[4.844]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.89],"y":[0]},"t":115.066,"s":[3.037]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120.311,"s":[8.445]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":126.867,"s":[15.765]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":138.666,"s":[1.252]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":155.711,"s":[1.252]},{"i":{"x":[0.294],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":166.199,"s":[1.252]},{"t":178,"s":[3.352]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":60,"s":[-72.849,53.736,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":69.178,"s":[-56.801,63.014,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":77.045,"s":[-56.801,63.014,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":84.91,"s":[-85.992,41.664,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":98.021,"s":[-85.992,41.664,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":115.066,"s":[-63.352,95.288,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":120.311,"s":[-63.352,95.288,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":126.867,"s":[-86.64,-5.351,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":138.666,"s":[-72.849,53.736,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":155.711,"s":[-72.849,53.736,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.294,"y":1},"o":{"x":0.333,"y":0},"t":166.199,"s":[-72.849,53.736,0],"to":[0,0,0],"ti":[0,0,0]},{"t":178,"s":[-18.157,54.967,0]}]},"a":{"a":0,"k":[227.021,227.06,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":60,"s":[{"i":[[13.667,-1.115],[17.056,-0.373],[38.365,-2.028],[-6.649,-11.229],[-6.41,-3.253],[-32.636,14.5],[1.173,8.949]],"o":[[-39.27,3.204],[-20.031,0.403],[-15.118,0.953],[-7.719,5.894],[34.363,17.637],[10.394,-4.588],[-0.962,-8.435]],"v":[[53.62,-2.995],[1.921,-46.816],[-54.525,-0.174],[-71.056,18.934],[-67.488,37.524],[60.605,35.233],[75.517,11.594]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":69.178,"s":[{"i":[[13.739,0.037],[17.251,-3.073],[39.297,-2.513],[-0.476,-10.861],[-6.809,-2.405],[-33.199,9.861],[0.418,9.033]],"o":[[-39.477,-0.108],[-19.855,3.537],[-15.121,1.019],[0.476,10.861],[34.228,12.09],[10.939,-3.249],[-0.25,-8.502]],"v":[[56.422,-0.787],[-0.216,-46.139],[-48.254,0.979],[-68.21,21.526],[-56.424,39.141],[59.793,37.622],[76.671,15.277]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":77.045,"s":[{"i":[[13.739,0.037],[17.251,-3.073],[39.297,-2.513],[-0.476,-10.861],[-6.809,-2.405],[-33.199,9.861],[0.418,9.033]],"o":[[-39.477,-0.108],[-19.855,3.537],[-15.121,1.019],[0.476,10.861],[34.228,12.09],[10.939,-3.249],[-0.25,-8.502]],"v":[[56.422,-0.787],[-0.216,-46.139],[-48.254,0.979],[-68.21,21.526],[-56.424,39.141],[59.793,37.622],[76.671,15.277]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":84.91,"s":[{"i":[[13.739,0.037],[16.95,1.094],[45.152,-1.424],[-10.282,-11.503],[-6.809,-2.405],[-33.199,9.861],[0.418,9.033]],"o":[[-39.477,-0.108],[-20.126,-1.299],[-15.154,0.478],[-9.581,9.359],[34.228,12.09],[10.939,-3.249],[-0.25,-8.502]],"v":[[56.422,-0.787],[4.917,-45.876],[-56.562,-0.787],[-69.736,18.921],[-64.732,37.374],[59.793,37.622],[76.671,15.277]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":98.021,"s":[{"i":[[13.739,0.037],[16.95,1.094],[45.152,-1.424],[-10.282,-11.503],[-6.809,-2.405],[-33.199,9.861],[0.418,9.033]],"o":[[-39.477,-0.108],[-20.126,-1.299],[-15.154,0.478],[-9.581,9.359],[34.228,12.09],[10.939,-3.249],[-0.25,-8.502]],"v":[[56.422,-0.787],[4.917,-45.876],[-56.562,-0.787],[-69.736,18.921],[-64.732,37.374],[59.793,37.622],[76.671,15.277]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":115.066,"s":[{"i":[[13.739,0.037],[17.251,-3.073],[29.691,-4.22],[-0.476,-10.861],[-6.809,-2.405],[-33.199,9.861],[0.418,9.033]],"o":[[-39.477,-0.108],[-19.855,3.537],[-15.121,1.019],[0.476,10.861],[34.228,12.09],[10.939,-3.249],[-0.25,-8.502]],"v":[[56.422,-0.787],[-1.609,-53.14],[-48.254,0.979],[-68.21,21.526],[-56.424,39.141],[59.793,37.622],[76.671,15.277]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":120.311,"s":[{"i":[[13.739,0.037],[17.251,-3.073],[29.691,-4.22],[-0.476,-10.861],[-6.809,-2.405],[-33.199,9.861],[0.418,9.033]],"o":[[-39.477,-0.108],[-19.855,3.537],[-15.121,1.019],[0.476,10.861],[34.228,12.09],[10.939,-3.249],[-0.25,-8.502]],"v":[[56.422,-0.787],[-1.609,-53.14],[-48.254,0.979],[-68.21,21.526],[-56.424,39.141],[59.793,37.622],[76.671,15.277]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":126.867,"s":[{"i":[[13.719,0.734],[16.95,1.094],[45.152,-1.424],[-10.282,-11.503],[-6.193,-3.714],[-34.861,10.938],[-0.041,9.043]],"o":[[-39.42,-2.11],[-20.126,-1.299],[-15.154,0.478],[-11.894,4.246],[34.436,20.65],[10.888,-3.416],[0.182,-8.504]],"v":[[59.559,6.621],[4.917,-45.876],[-56.562,-0.787],[-69.736,18.921],[-72.129,36.66],[60.977,45.152],[78.967,23.692]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":138.666,"s":[{"i":[[13.667,-1.115],[17.056,-0.373],[38.365,-2.028],[-6.649,-11.229],[-6.41,-3.253],[-32.636,14.5],[1.173,8.949]],"o":[[-39.27,3.204],[-20.031,0.403],[-15.118,0.953],[-7.719,5.894],[34.363,17.637],[10.394,-4.588],[-0.962,-8.435]],"v":[[53.62,-2.995],[1.921,-46.816],[-54.525,-0.174],[-71.056,18.934],[-67.488,37.524],[60.605,35.233],[75.517,11.594]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":155.711,"s":[{"i":[[13.667,-1.115],[17.056,-0.373],[38.365,-2.028],[-6.649,-11.229],[-6.41,-3.253],[-32.636,14.5],[1.173,8.949]],"o":[[-39.27,3.204],[-20.031,0.403],[-15.118,0.953],[-7.719,5.894],[34.363,17.637],[10.394,-4.588],[-0.962,-8.435]],"v":[[53.62,-2.995],[1.921,-46.816],[-54.525,-0.174],[-71.056,18.934],[-67.488,37.524],[60.605,35.233],[75.517,11.594]],"c":true}]},{"i":{"x":0.294,"y":1},"o":{"x":0.333,"y":0},"t":166.199,"s":[{"i":[[13.667,-1.115],[17.056,-0.373],[38.365,-2.028],[-6.649,-11.229],[-6.41,-3.253],[-32.636,14.5],[1.173,8.949]],"o":[[-39.27,3.204],[-20.031,0.403],[-15.118,0.953],[-7.719,5.894],[34.363,17.637],[10.394,-4.588],[-0.962,-8.435]],"v":[[53.62,-2.995],[1.921,-46.816],[-54.525,-0.174],[-71.056,18.934],[-67.488,37.524],[60.605,35.233],[75.517,11.594]],"c":true}]},{"t":178,"s":[{"i":[[13.713,-0.834],[17.497,-0.943],[44.761,-4.86],[-1.25,-10.799],[-6.963,-1.913],[-33.199,9.861],[0.418,9.033]],"o":[[-46.839,2.848],[-20.151,1.086],[-15.01,2.095],[1.25,10.799],[35.004,9.616],[10.939,-3.249],[-0.25,-8.502]],"v":[[64.128,0.701],[1.839,-46.287],[-57.119,2.414],[-75.558,24.333],[-59.584,41.543],[67.498,39.111],[84.376,16.765]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.811764717102,0.207843139768,0.007843137719,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.364705890417,0.121568627656,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[227.021,227.06]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":0,"op":300,"st":114,"bm":0},{"ddd":0,"ind":36,"ty":4,"nm":"wing_bl","parent":37,"sr":1,"ks":{"p":{"a":0,"k":[-9.694,-7.958,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":62.623,"s":[{"i":[[-16.004,6.98],[-11.131,0.538]],"o":[[14.277,-6.769],[8.103,-0.392]],"v":[[-33.42,8.12],[10.56,-5.014]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":69.178,"s":[{"i":[[-16.004,6.98],[-12.355,6.026]],"o":[[14.965,-1.279],[7.292,-3.556]],"v":[[-33.42,8.12],[13.663,-1.56]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":75.732,"s":[{"i":[[-16.004,6.98],[-14.76,-0.82]],"o":[[6.507,-6.151],[8.1,0.45]],"v":[[-33.42,8.12],[13.663,-1.56]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":82.289,"s":[{"i":[[-16.004,6.98],[-11.131,0.538]],"o":[[14.277,-6.769],[8.103,-0.392]],"v":[[-33.42,8.12],[10.56,-5.014]],"c":false}]},{"i":{"x":0.833,"y":0.746},"o":{"x":0.333,"y":0},"t":100.645,"s":[{"i":[[-16.004,6.98],[-11.131,0.538]],"o":[[14.277,-6.769],[8.103,-0.392]],"v":[[-33.42,8.12],[10.56,-5.014]],"c":false}]},{"i":{"x":0.833,"y":0.746},"o":{"x":0.167,"y":0.254},"t":107.199,"s":[{"i":[[-16.004,6.98],[-14.207,-4.426]],"o":[[16.891,-3.183],[8.059,-0.803]],"v":[[-29.932,-23.892],[13.649,-19.477]],"c":false}]},{"i":{"x":0.833,"y":0.746},"o":{"x":0.167,"y":0.254},"t":121.623,"s":[{"i":[[-16.004,6.98],[-14.207,-4.426]],"o":[[16.891,-3.183],[8.059,-0.803]],"v":[[-29.932,-23.892],[13.649,-19.477]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.254},"t":125.555,"s":[{"i":[[-16.004,6.98],[-12.628,1.536]],"o":[[14.75,-9.741],[8.053,-0.98]],"v":[[-33.05,6.397],[11.03,-10.732]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":129.488,"s":[{"i":[[-16.004,6.98],[-12.531,2.49]],"o":[[15.511,-5.27],[7.957,-1.581]],"v":[[-33.05,6.397],[11.06,-4.734]],"c":false}]},{"i":{"x":0.833,"y":0.682},"o":{"x":0.167,"y":0},"t":155.711,"s":[{"i":[[-16.004,6.98],[-12.525,2.105]],"o":[[11.943,-6.264],[8.001,-1.344]],"v":[[-33.05,6.397],[11.819,-7.206]],"c":false}]},{"i":{"x":0.833,"y":0.746},"o":{"x":0.167,"y":0.254},"t":160.955,"s":[{"i":[[-16.004,6.98],[-10.842,5.054]],"o":[[15.262,-1.394],[7.353,-3.428]],"v":[[-33.05,6.397],[12.513,-4.703]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.254},"t":167.512,"s":[{"i":[[-16.004,6.98],[-14.926,-1.974]],"o":[[15.511,-5.27],[8.043,1.064]],"v":[[-33.05,6.397],[12.316,-1.061]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":174.066,"s":[{"i":[[-16.004,6.98],[-12.525,2.105]],"o":[[11.943,-6.264],[8.001,-1.344]],"v":[[-33.05,6.397],[11.819,-7.206]],"c":false}]},{"t":178,"s":[{"i":[[-16.004,6.98],[-9.683,2.21]],"o":[[11.943,-6.264],[7.909,-1.805]],"v":[[-33.05,6.397],[11.738,-9.63]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":228,"s":[5]},{"t":240,"s":[5]}]},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[95]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[95]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":228,"s":[100]},{"t":240,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":0,"op":300,"st":114,"bm":0},{"ddd":0,"ind":37,"ty":4,"nm":"wing_l","parent":64,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":100.645,"s":[77.884]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":107.199,"s":[134.158]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":121.623,"s":[134.158]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":125.555,"s":[193.817]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":129.488,"s":[226.511]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":147.844,"s":[77.884]},{"i":{"x":[0.294],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":166.199,"s":[77.884]},{"t":178,"s":[77.884]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":60,"s":[101.03,-17.712,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":66.555,"s":[103.971,-10.065,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":73.111,"s":[103.971,-10.065,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":79.666,"s":[101.03,-17.712,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":98.021,"s":[100.479,-17.712,0],"to":[0,0,0],"ti":[22.805,-65.222,0]},{"t":107.199,"s":[-15.9,-0.561,0],"h":1},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":121.623,"s":[-15.9,-0.561,0],"to":[17.258,1.985,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":125.555,"s":[14.547,-1.33,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.8,"y":0},"t":129.488,"s":[14.547,-1.33,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":147.844,"s":[101.017,-17.712,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.294,"y":1},"o":{"x":0.333,"y":0},"t":166.199,"s":[101.017,-17.712,0],"to":[0,0,0],"ti":[0,0,0]},{"t":178,"s":[118.664,-30.065,0]}]},"a":{"a":0,"k":[-54.963,0,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.746},"o":{"x":0.167,"y":0},"t":62.623,"s":[{"i":[[0,0],[-1.39,-11.722],[58.688,-22.847]],"o":[[50.108,-27.458],[1.39,11.722],[0,0]],"v":[[-50.77,-29.247],[55.179,-15.827],[-42.467,18.766]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.254},"t":69.178,"s":[{"i":[[0,0],[-1.39,-11.722],[72.695,-11.937]],"o":[[62.208,-0.877],[1.39,11.722],[0,0]],"v":[[-50.77,-29.247],[48.461,-28.237],[-42.467,18.766]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":75.732,"s":[{"i":[[0,0],[-1.39,-11.722],[58.688,-22.847]],"o":[[52.86,-16.108],[1.39,11.722],[0,0]],"v":[[-50.77,-29.247],[51.147,2.954],[-42.467,18.766]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":82.289,"s":[{"i":[[0,0],[-1.39,-11.722],[58.688,-22.847]],"o":[[50.108,-27.458],[1.39,11.722],[0,0]],"v":[[-50.77,-29.247],[55.179,-15.827],[-42.467,18.766]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":100.645,"s":[{"i":[[0,0],[-1.39,-11.722],[58.688,-22.847]],"o":[[50.108,-27.458],[1.39,11.722],[0,0]],"v":[[-50.77,-29.247],[55.179,-15.827],[-42.467,18.766]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":107.199,"s":[{"i":[[0,0],[3.785,-11.181],[57.848,1.311]],"o":[[61.82,4.334],[-5.316,15.707],[0,0]],"v":[[-49.094,-86.629],[76.209,-4.996],[-44.437,-17.038]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":121.623,"s":[{"i":[[0,0],[3.785,-11.181],[57.848,1.311]],"o":[[61.82,4.334],[-5.316,15.707],[0,0]],"v":[[-49.094,-86.629],[76.209,-4.996],[-44.437,-17.038]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":125.555,"s":[{"i":[[0,0],[3.785,-11.181],[40.6,-32.095]],"o":[[41.512,-43.839],[-5.316,15.707],[0,0]],"v":[[-59.509,-30.11],[58.667,-19.358],[-42.467,18.766]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.8,"y":0},"t":129.488,"s":[{"i":[[0,0],[3.785,-11.181],[52.717,-25.914]],"o":[[65.842,-34.834],[-5.316,15.707],[0,0]],"v":[[-59.509,-30.11],[65.578,-10.962],[-42.467,18.766]],"c":false}]},{"i":{"x":0.833,"y":0.746},"o":{"x":0.167,"y":0},"t":154.4,"s":[{"i":[[0,0],[-1.39,-11.722],[58.688,-22.847]],"o":[[50.108,-27.458],[1.39,11.722],[0,0]],"v":[[-50.77,-29.247],[55.179,-15.827],[-42.467,18.766]],"c":false}]},{"i":{"x":0.833,"y":0.746},"o":{"x":0.167,"y":0.254},"t":160.955,"s":[{"i":[[0,0],[-1.39,-11.722],[64.978,-17.947]],"o":[[55.542,-15.521],[1.39,11.722],[0,0]],"v":[[-50.77,-29.247],[52.162,-21.401],[-42.467,18.766]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.254},"t":167.512,"s":[{"i":[[0,0],[-1.39,-11.722],[60.276,-21.61]],"o":[[53.537,-15.96],[1.39,11.722],[0,0]],"v":[[-50.77,-29.247],[51.403,-3.195],[-42.467,18.766]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":174.066,"s":[{"i":[[0,0],[-1.39,-11.722],[58.688,-22.847]],"o":[[50.108,-27.458],[1.39,11.722],[0,0]],"v":[[-50.77,-29.247],[55.179,-15.827],[-42.467,18.766]],"c":false}]},{"t":178,"s":[{"i":[[0,0],[-1.39,-11.722],[58.688,-22.847]],"o":[[56.169,-27.252],[1.39,11.722],[0,0]],"v":[[-54.058,-25.14],[53.005,-25.318],[-42.467,18.766]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.980392158031,0.564705908298,0.086274512112,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.835294127464,0.152941182256,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":110,"bm":0},{"ddd":0,"ind":38,"ty":4,"nm":"eye 4","parent":35,"sr":1,"ks":{"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":60,"s":[163.594,187.222,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":69.178,"s":[161.247,187.336,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":77.045,"s":[161.247,187.336,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":84.91,"s":[168.289,186.856,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.11,"y":1},"o":{"x":0.333,"y":0},"t":98.021,"s":[168.289,186.856,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.11,"y":0.11},"o":{"x":0.89,"y":0.89},"t":115.066,"s":[162.418,187.221,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.89,"y":0},"t":120.311,"s":[162.418,187.221,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":126.867,"s":[168.289,186.856,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":138.666,"s":[163.594,187.222,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.294,"y":1},"o":{"x":0.333,"y":0},"t":166.199,"s":[163.594,187.222,0],"to":[0,0,0],"ti":[0,0,0]},{"t":178,"s":[154.802,188.156,0]}]},"a":{"a":0,"k":[147.88,185.335,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":60,"s":[83,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":69.178,"s":[90,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":77.045,"s":[90,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":84.91,"s":[80,100,100]},{"i":{"x":[0.11,0.11,0.11],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":98.021,"s":[80,100,100]},{"i":{"x":[0.11,0.11,0.11],"y":[1,1,1]},"o":{"x":[0.89,0.89,0.89],"y":[0,0,0]},"t":115.066,"s":[95,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.89,0.89,0.89],"y":[0,0,0]},"t":120.311,"s":[95,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":126.867,"s":[80,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":138.666,"s":[83,100,100]},{"i":{"x":[0.294,0.294,0.294],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":166.199,"s":[83,100,100]},{"t":178,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":84.91,"s":[{"i":[[-0.731,-4.657],[5.005,-0.786],[1.175,0.273],[0.544,3.465],[-5.005,0.786]],"o":[[0.731,4.657],[-1.281,0.201],[-3.415,-0.792],[-0.731,-4.657],[5.005,-0.786]],"v":[[8.683,1.293],[0.945,11.148],[-2.769,11.021],[-9.442,4.139],[-1.704,-5.716]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":88.844,"s":[{"i":[[-0.452,-1.863],[3.093,-0.314],[0.726,0.109],[0.336,1.386],[-3.093,0.314]],"o":[[0.452,1.863],[-0.792,0.08],[-2.111,-0.317],[-0.452,-1.863],[3.093,-0.314]],"v":[[2.407,14.924],[-2.375,18.866],[-4.67,18.815],[-8.794,16.062],[-4.012,12.12]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":92.777,"s":[{"i":[[-0.731,-4.657],[5.005,-0.786],[1.175,0.273],[0.544,3.465],[-5.005,0.786]],"o":[[0.731,4.657],[-1.281,0.201],[-3.415,-0.792],[-0.731,-4.657],[5.005,-0.786]],"v":[[8.683,1.293],[0.945,11.148],[-2.769,11.021],[-9.442,4.139],[-1.704,-5.716]],"c":true}]},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"t":96.711,"s":[{"i":[[-0.452,-1.863],[3.093,-0.314],[0.726,0.109],[0.336,1.386],[-3.093,0.314]],"o":[[0.452,1.863],[-0.792,0.08],[-2.111,-0.317],[-0.452,-1.863],[3.093,-0.314]],"v":[[2.407,14.924],[-2.375,18.866],[-4.67,18.815],[-8.794,16.062],[-4.012,12.12]],"c":true}]},{"i":{"x":0.15,"y":1},"o":{"x":0.85,"y":0},"t":100.645,"s":[{"i":[[-0.731,-4.657],[5.005,-0.786],[1.175,0.273],[0.544,3.465],[-5.005,0.786]],"o":[[0.731,4.657],[-1.281,0.201],[-3.415,-0.792],[-0.731,-4.657],[5.005,-0.786]],"v":[[8.683,1.293],[0.945,11.148],[-2.769,11.021],[-9.442,4.139],[-1.704,-5.716]],"c":true}]},{"i":{"x":0.15,"y":1},"o":{"x":0.85,"y":0},"t":115.066,"s":[{"i":[[-0.731,-4.657],[5.005,-0.786],[1.175,0.273],[0.544,3.465],[-5.005,0.786]],"o":[[0.731,4.657],[-1.281,0.201],[-3.415,-0.792],[-0.731,-4.657],[5.005,-0.786]],"v":[[8.683,1.293],[0.945,11.148],[-2.769,11.021],[-9.442,4.139],[-1.704,-5.716]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.85,"y":0},"t":120.311,"s":[{"i":[[-0.731,-4.657],[5.005,-0.786],[1.175,0.273],[0.544,3.465],[-5.005,0.786]],"o":[[0.731,4.657],[-1.281,0.201],[-3.415,-0.792],[-0.731,-4.657],[5.005,-0.786]],"v":[[8.683,1.293],[0.945,11.148],[-2.769,11.021],[-9.442,4.139],[-1.704,-5.716]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":126.867,"s":[{"i":[[1.392,-4.495],[4.105,1.414],[0.773,0.743],[-1.036,3.345],[-4.105,-1.414]],"o":[[-1.392,4.495],[-1.051,-0.362],[-2.247,-2.159],[1.392,-4.495],[4.105,1.414]],"v":[[16.114,7.058],[6.16,12.637],[3.411,10.949],[1.248,1.937],[11.202,-3.642]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":130.801,"s":[{"i":[[-0.615,-1.799],[2.523,-0.645],[0.616,0.03],[0.457,1.338],[-2.523,0.645]],"o":[[0.615,1.799],[-0.646,0.165],[-1.79,-0.087],[-0.615,-1.799],[2.523,-0.645]],"v":[[6.314,14.373],[2.859,18.798],[0.951,18.994],[-2.822,16.709],[0.633,12.284]],"c":true}]},{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0},"t":134.732,"s":[{"i":[[1.392,-4.495],[4.105,1.414],[0.773,0.743],[-1.036,3.345],[-4.105,-1.414]],"o":[[-1.392,4.495],[-1.051,-0.362],[-2.247,-2.159],[1.392,-4.495],[4.105,1.414]],"v":[[16.114,7.058],[6.16,12.637],[3.411,10.949],[1.248,1.937],[11.202,-3.642]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":138.666,"s":[{"i":[[-0.731,-4.657],[5.005,-0.786],[1.175,0.273],[0.544,3.465],[-5.005,0.786]],"o":[[0.731,4.657],[-1.281,0.201],[-3.415,-0.792],[-0.731,-4.657],[5.005,-0.786]],"v":[[8.683,1.293],[0.945,11.148],[-2.769,11.021],[-9.442,4.139],[-1.704,-5.716]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":166.199,"s":[{"i":[[-0.731,-4.657],[5.005,-0.786],[1.175,0.273],[0.544,3.465],[-5.005,0.786]],"o":[[0.731,4.657],[-1.281,0.201],[-3.415,-0.792],[-0.731,-4.657],[5.005,-0.786]],"v":[[8.683,1.293],[0.945,11.148],[-2.769,11.021],[-9.442,4.139],[-1.704,-5.716]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":170.133,"s":[{"i":[[-0.452,-1.863],[3.093,-0.314],[0.726,0.109],[0.336,1.386],[-3.093,0.314]],"o":[[0.452,1.863],[-0.792,0.08],[-2.111,-0.317],[-0.452,-1.863],[3.093,-0.314]],"v":[[2.407,14.924],[-2.375,18.866],[-4.67,18.815],[-8.794,16.062],[-4.012,12.12]],"c":true}]},{"t":174.06640625,"s":[{"i":[[-0.731,-4.657],[5.005,-0.786],[1.175,0.273],[0.544,3.465],[-5.005,0.786]],"o":[[0.731,4.657],[-1.281,0.201],[-3.415,-0.792],[-0.731,-4.657],[5.005,-0.786]],"v":[[8.683,1.293],[0.945,11.148],[-2.769,11.021],[-9.442,4.139],[-1.704,-5.716]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":84.91,"s":[1,1,1,1]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":88.844,"s":[0,0,0,1]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":92.777,"s":[1,1,1,1]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":96.711,"s":[0,0,0,1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":100.645,"s":[1,1,1,1]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":126.867,"s":[1,1,1,1]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":130.801,"s":[0,0,0,1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[1],"y":[0]},"t":134.732,"s":[1,1,1,1]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":166.199,"s":[1,1,1,1]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":170.133,"s":[0,0,0,1]},{"t":174.06640625,"s":[1,1,1,1]}]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[149.824,171.565]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":84.91,"s":[{"i":[[5.531,-16.68],[14.69,4.217],[-5.531,16.68],[-14.69,-4.217]],"o":[[-5.531,16.68],[-14.69,-4.217],[5.531,-16.68],[14.69,4.217]],"v":[[26.599,7.636],[-10.015,30.202],[-26.599,-7.636],[10.015,-30.202]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":88.844,"s":[{"i":[[5.062,-6.391],[20.249,0.534],[6.627,5.855],[-18.219,-0.566]],"o":[[-5.425,6.85],[-17.702,-0.466],[-6.809,-6.015],[20.458,0.636]],"v":[[27.893,12.284],[-0.054,7.019],[-28.57,12.484],[1.562,-4.579]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":92.777,"s":[{"i":[[5.531,-16.68],[14.69,4.217],[-5.531,16.68],[-14.69,-4.217]],"o":[[-5.531,16.68],[-14.69,-4.217],[5.531,-16.68],[14.69,4.217]],"v":[[26.599,7.636],[-10.015,30.202],[-26.599,-7.636],[10.015,-30.202]],"c":true}]},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"t":96.711,"s":[{"i":[[5.062,-6.391],[20.249,0.534],[6.627,5.855],[-18.219,-0.566]],"o":[[-5.425,6.85],[-17.702,-0.466],[-6.809,-6.015],[20.458,0.636]],"v":[[27.893,12.284],[-0.054,7.019],[-28.57,12.484],[1.562,-4.579]],"c":true}]},{"i":{"x":0.15,"y":1},"o":{"x":0.85,"y":0},"t":100.645,"s":[{"i":[[5.531,-16.68],[14.69,4.217],[-5.531,16.68],[-14.69,-4.217]],"o":[[-5.531,16.68],[-14.69,-4.217],[5.531,-16.68],[14.69,4.217]],"v":[[26.599,7.636],[-10.015,30.202],[-26.599,-7.636],[10.015,-30.202]],"c":true}]},{"i":{"x":0.15,"y":1},"o":{"x":0.85,"y":0},"t":115.066,"s":[{"i":[[5.531,-16.68],[14.69,4.217],[-5.531,16.68],[-14.69,-4.217]],"o":[[-5.531,16.68],[-14.69,-4.217],[5.531,-16.68],[14.69,4.217]],"v":[[26.599,7.636],[-10.015,30.202],[-26.599,-7.636],[10.015,-30.202]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.85,"y":0},"t":120.311,"s":[{"i":[[5.531,-16.68],[14.69,4.217],[-5.531,16.68],[-14.69,-4.217]],"o":[[-5.531,16.68],[-14.69,-4.217],[5.531,-16.68],[14.69,4.217]],"v":[[26.599,7.636],[-10.015,30.202],[-26.599,-7.636],[10.015,-30.202]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":126.867,"s":[{"i":[[11.138,-12.648],[9.326,10.014],[-11.138,12.648],[-9.326,-10.014]],"o":[[-11.138,12.648],[-9.326,-10.014],[11.138,-12.648],[9.326,10.014]],"v":[[21.715,18.132],[-15.338,22.901],[-12.056,-18.132],[24.996,-22.901]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":130.801,"s":[{"i":[[3.371,-6.883],[16.85,-1.653],[6.247,5.092],[-15.172,1.402]],"o":[[-3.613,7.377],[-14.731,1.445],[-6.418,-5.231],[17.037,-1.574]],"v":[[29.203,9.104],[5.364,6.894],[-17.564,15.386],[5.208,-4.782]],"c":true}]},{"i":{"x":0.15,"y":1},"o":{"x":0.167,"y":0},"t":134.732,"s":[{"i":[[11.138,-12.648],[9.326,10.014],[-11.138,12.648],[-9.326,-10.014]],"o":[[-11.138,12.648],[-9.326,-10.014],[11.138,-12.648],[9.326,10.014]],"v":[[21.715,18.132],[-15.338,22.901],[-12.056,-18.132],[24.996,-22.901]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":138.666,"s":[{"i":[[5.531,-16.68],[14.69,4.217],[-5.531,16.68],[-14.69,-4.217]],"o":[[-5.531,16.68],[-14.69,-4.217],[5.531,-16.68],[14.69,4.217]],"v":[[26.599,7.636],[-10.015,30.202],[-26.599,-7.636],[10.015,-30.202]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":166.199,"s":[{"i":[[5.531,-16.68],[14.69,4.217],[-5.531,16.68],[-14.69,-4.217]],"o":[[-5.531,16.68],[-14.69,-4.217],[5.531,-16.68],[14.69,4.217]],"v":[[26.599,7.636],[-10.015,30.202],[-26.599,-7.636],[10.015,-30.202]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":170.133,"s":[{"i":[[5.062,-6.391],[20.249,0.534],[6.627,5.855],[-18.219,-0.566]],"o":[[-5.425,6.85],[-17.702,-0.466],[-6.809,-6.015],[20.458,0.636]],"v":[[27.893,12.284],[-0.054,7.019],[-28.57,12.484],[1.562,-4.579]],"c":true}]},{"t":174.06640625,"s":[{"i":[[5.531,-16.68],[14.69,4.217],[-5.531,16.68],[-14.69,-4.217]],"o":[[-5.531,16.68],[-14.69,-4.217],[5.531,-16.68],[14.69,4.217]],"v":[[26.599,7.636],[-10.015,30.202],[-26.599,-7.636],[10.015,-30.202]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84.91,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":88.844,"s":[6]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":92.777,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96.711,"s":[6]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":100.645,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":126.867,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":130.801,"s":[6]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[1],"y":[0]},"t":134.732,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":166.199,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":170.133,"s":[6]},{"t":174.06640625,"s":[0]}]},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[147.88,185.335]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[147.88,185.335]},"a":{"a":0,"k":[147.88,185.335]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":0,"op":300,"st":114,"bm":0},{"ddd":0,"ind":39,"ty":4,"nm":"eye 3","parent":35,"sr":1,"ks":{"p":{"a":0,"k":[304.699,185.068,0]},"a":{"a":0,"k":[293.018,185.074,0]},"s":{"a":0,"k":[130,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":84.91,"s":[{"i":[[0,-4.505],[4.505,0],[0,4.505],[-4.505,0]],"o":[[0,4.505],[-4.505,0],[0,-4.505],[4.505,0]],"v":[[8.158,0],[0,8.158],[-8.158,0],[0,-8.158]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":88.844,"s":[{"i":[[0.393,-2.046],[1.834,0.352],[-0.393,2.046],[-1.834,-0.352]],"o":[[-0.393,2.046],[-1.834,-0.352],[0.393,-2.046],[1.834,0.352]],"v":[[7.462,7.436],[3.43,10.502],[0.819,6.161],[4.851,3.094]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":92.777,"s":[{"i":[[0,-4.505],[4.505,0],[0,4.505],[-4.505,0]],"o":[[0,4.505],[-4.505,0],[0,-4.505],[4.505,0]],"v":[[8.158,0],[0,8.158],[-8.158,0],[0,-8.158]],"c":true}]},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"t":96.711,"s":[{"i":[[0.393,-2.046],[1.834,0.352],[-0.393,2.046],[-1.834,-0.352]],"o":[[-0.393,2.046],[-1.834,-0.352],[0.393,-2.046],[1.834,0.352]],"v":[[7.462,7.436],[3.43,10.502],[0.819,6.161],[4.851,3.094]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.85,"y":0},"t":100.645,"s":[{"i":[[0,-4.505],[4.505,0],[0,4.505],[-4.505,0]],"o":[[0,4.505],[-4.505,0],[0,-4.505],[4.505,0]],"v":[[8.158,0],[0,8.158],[-8.158,0],[0,-8.158]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":126.867,"s":[{"i":[[0,-4.505],[4.505,0],[0,4.505],[-4.505,0]],"o":[[0,4.505],[-4.505,0],[0,-4.505],[4.505,0]],"v":[[8.158,0],[0,8.158],[-8.158,0],[0,-8.158]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":130.801,"s":[{"i":[[0.393,-2.046],[1.834,0.352],[-0.393,2.046],[-1.834,-0.352]],"o":[[-0.393,2.046],[-1.834,-0.352],[0.393,-2.046],[1.834,0.352]],"v":[[7.462,7.436],[3.43,10.502],[0.819,6.161],[4.851,3.094]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":134.732,"s":[{"i":[[0,-4.505],[4.505,0],[0,4.505],[-4.505,0]],"o":[[0,4.505],[-4.505,0],[0,-4.505],[4.505,0]],"v":[[8.158,0],[0,8.158],[-8.158,0],[0,-8.158]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":166.199,"s":[{"i":[[0,-4.505],[4.505,0],[0,4.505],[-4.505,0]],"o":[[0,4.505],[-4.505,0],[0,-4.505],[4.505,0]],"v":[[8.158,0],[0,8.158],[-8.158,0],[0,-8.158]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":170.133,"s":[{"i":[[0.393,-2.046],[1.834,0.352],[-0.393,2.046],[-1.834,-0.352]],"o":[[-0.393,2.046],[-1.834,-0.352],[0.393,-2.046],[1.834,0.352]],"v":[[7.462,7.436],[3.43,10.502],[0.819,6.161],[4.851,3.094]],"c":true}]},{"t":174.06640625,"s":[{"i":[[0,-4.505],[4.505,0],[0,4.505],[-4.505,0]],"o":[[0,4.505],[-4.505,0],[0,-4.505],[4.505,0]],"v":[[8.158,0],[0,8.158],[-8.158,0],[0,-8.158]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":84.91,"s":[1,1,1,1]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":88.844,"s":[0,0,0,1]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":92.777,"s":[1,1,1,1]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":96.711,"s":[0,0,0,1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":100.645,"s":[1,1,1,1]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":126.867,"s":[1,1,1,1]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":130.801,"s":[0,0,0,1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":134.732,"s":[1,1,1,1]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":166.199,"s":[1,1,1,1]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":170.133,"s":[0,0,0,1]},{"t":174.06640625,"s":[1,1,1,1]}]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[289.869,171.446]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":84.91,"s":[{"i":[[-4.428,-16.68],[-11.76,4.217],[4.428,16.68],[11.76,-4.217]],"o":[[4.428,16.68],[11.76,-4.217],[-4.428,-16.68],[-11.76,4.217]],"v":[[-21.293,7.636],[8.017,30.202],[21.293,-7.636],[-8.017,-30.202]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":88.844,"s":[{"i":[[-4.028,-4.701],[-16.852,0.144],[-3.874,5.201],[11.871,-2.293]],"o":[[4.332,5.056],[16.513,-0.141],[3.569,-4.791],[-11.871,2.293]],"v":[[-18.384,5.894],[0.65,-1.771],[20.406,5.307],[-1.229,-11.575]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":92.777,"s":[{"i":[[-4.427,-16.68],[-11.76,4.217],[4.427,16.68],[11.76,-4.217]],"o":[[4.428,16.68],[11.76,-4.217],[-4.428,-16.68],[-11.76,4.217]],"v":[[-21.293,7.636],[8.017,30.202],[21.293,-7.636],[-8.017,-30.202]],"c":true}]},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"t":96.711,"s":[{"i":[[-4.028,-4.701],[-16.852,0.144],[-3.874,5.201],[11.871,-2.293]],"o":[[4.332,5.056],[16.513,-0.141],[3.569,-4.791],[-11.871,2.293]],"v":[[-18.384,5.894],[0.65,-1.771],[20.406,5.307],[-1.229,-11.575]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.85,"y":0},"t":100.645,"s":[{"i":[[-4.427,-16.68],[-11.76,4.217],[4.427,16.68],[11.76,-4.217]],"o":[[4.428,16.68],[11.76,-4.217],[-4.428,-16.68],[-11.76,4.217]],"v":[[-21.293,7.636],[8.017,30.202],[21.293,-7.636],[-8.017,-30.202]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":126.867,"s":[{"i":[[-4.428,-16.68],[-11.76,4.217],[4.428,16.68],[11.76,-4.217]],"o":[[4.428,16.68],[11.76,-4.217],[-4.428,-16.68],[-11.76,4.217]],"v":[[-21.293,7.636],[8.017,30.202],[21.293,-7.636],[-8.017,-30.202]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":130.801,"s":[{"i":[[-4.028,-4.701],[-16.852,0.144],[-3.874,5.201],[11.871,-2.293]],"o":[[4.332,5.056],[16.513,-0.141],[3.569,-4.791],[-11.871,2.293]],"v":[[-18.384,5.894],[0.65,-1.771],[20.406,5.307],[-1.229,-11.575]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":134.732,"s":[{"i":[[-4.427,-16.68],[-11.76,4.217],[4.427,16.68],[11.76,-4.217]],"o":[[4.428,16.68],[11.76,-4.217],[-4.428,-16.68],[-11.76,4.217]],"v":[[-21.293,7.636],[8.017,30.202],[21.293,-7.636],[-8.017,-30.202]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":166.199,"s":[{"i":[[-4.428,-16.68],[-11.76,4.217],[4.428,16.68],[11.76,-4.217]],"o":[[4.428,16.68],[11.76,-4.217],[-4.428,-16.68],[-11.76,4.217]],"v":[[-21.293,7.636],[8.017,30.202],[21.293,-7.636],[-8.017,-30.202]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":170.133,"s":[{"i":[[-4.028,-4.701],[-16.852,0.144],[-3.874,5.201],[11.871,-2.293]],"o":[[4.332,5.056],[16.513,-0.141],[3.569,-4.791],[-11.871,2.293]],"v":[[-18.384,5.894],[0.65,-1.771],[20.406,5.307],[-1.229,-11.575]],"c":true}]},{"t":174.06640625,"s":[{"i":[[-4.427,-16.68],[-11.76,4.217],[4.427,16.68],[11.76,-4.217]],"o":[[4.428,16.68],[11.76,-4.217],[-4.428,-16.68],[-11.76,4.217]],"v":[[-21.293,7.636],[8.017,30.202],[21.293,-7.636],[-8.017,-30.202]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84.91,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":88.844,"s":[6]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":92.777,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96.711,"s":[6]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":100.645,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":126.867,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":130.801,"s":[6]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":134.732,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":166.199,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":170.133,"s":[6]},{"t":174.06640625,"s":[0]}]},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[293.018,185.074]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[293.018,185.074]},"a":{"a":0,"k":[293.018,185.074]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[149.824,171.565]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[147.88,185.335]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[147.88,185.335]},"a":{"a":0,"k":[147.88,185.335]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":0,"op":300,"st":114,"bm":0},{"ddd":0,"ind":40,"ty":4,"nm":"head_bl4","parent":42,"sr":1,"ks":{"p":{"a":0,"k":[121.325,22.259,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-6.461,-9.431],[0,-24.681],[19.005,-18.433]],"o":[[14.542,21.228],[0,28.584],[0,0]],"v":[[-0.106,-57.811],[22.887,12.639],[-7.452,83.863]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.988235294819,0.933333337307,0.129411771894,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":228,"s":[5]},{"t":240,"s":[5]}]},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[95]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[95]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":228,"s":[100]},{"t":240,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":0,"op":300,"st":114,"bm":0},{"ddd":0,"ind":41,"ty":4,"nm":"head_bl3","parent":42,"sr":1,"ks":{"r":{"a":0,"k":24.348},"p":{"a":0,"k":[-4.904,31.823,0]},"a":{"a":0,"k":[71.641,94.652,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-26.697,16.101]],"o":[[11.529,-27.092],[11.933,-7.196]],"v":[[-49.05,41.823],[10.169,-25.495]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":228,"s":[5]},{"t":240,"s":[5]}]},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[95]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[95]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":228,"s":[100]},{"t":240,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":0,"op":300,"st":114,"bm":0},{"ddd":0,"ind":42,"ty":4,"nm":"head","parent":64,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":126.867,"s":[-1.29]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":138.666,"s":[-10.232]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":151.777,"s":[4.499]},{"t":171.4453125,"s":[-1.29]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":60,"s":[9.583,-42.601,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":69.178,"s":[9.583,-21.198,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":77.045,"s":[9.583,-21.198,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":84.91,"s":[9.583,-42.601,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.11,"y":1},"o":{"x":0.333,"y":0},"t":98.021,"s":[9.583,-42.601,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.89,"y":0.89},"t":115.066,"s":[9.583,-7.307,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":120.311,"s":[9.583,-7.307,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":126.867,"s":[9.583,-42.601,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":138.666,"s":[-8.157,-25.077,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":151.777,"s":[21.348,-42.601,0],"to":[0,0,0],"ti":[0,0,0]},{"t":171.4453125,"s":[9.583,-42.601,0]}]},"a":{"a":0,"k":[0,131.046,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,39.247],[93.266,0],[0,-83.375],[-28.671,-23.75]],"o":[[29.034,-23.938],[0,-83.375],[-93.265,0],[0,39.353],[0,0]],"v":[[122.976,131.046],[168.871,34.404],[0,-131.046],[-168.871,34.404],[-123.254,130.814]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.980392158031,0.564705908298,0.086274512112,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.835294127464,0.152941182256,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":114,"bm":0},{"ddd":0,"ind":43,"ty":4,"nm":"wing_bl 3","parent":44,"sr":1,"ks":{"r":{"a":0,"k":-172.417},"p":{"a":0,"k":[-54.755,-111.892,0]},"s":{"a":0,"k":[-100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.306,"y":1},"o":{"x":0.167,"y":0},"t":60,"s":[{"i":[[-16.004,6.98],[2.258,-12.51]],"o":[[7.913,17.033],[-1.441,7.984]],"v":[[0.289,-31.284],[6.431,20.145]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":70.488,"s":[{"i":[[-16.004,6.98],[-8.554,-11.251]],"o":[[5.587,13.961],[4.91,6.458]],"v":[[-29.273,-32.276],[-7.735,12.813]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.8,"y":0},"t":77.045,"s":[{"i":[[-16.004,6.98],[15.44,-7.583]],"o":[[-6.944,9.239],[-7.282,3.576]],"v":[[-3.702,-9.261],[-38.775,18.099]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":94.09,"s":[{"i":[[-16.004,6.98],[15.44,-7.583]],"o":[[-6.944,9.239],[-7.282,3.576]],"v":[[-6.172,-12.202],[-38.775,18.099]],"c":false}]},{"i":{"x":0.833,"y":0.746},"o":{"x":0.333,"y":0},"t":100.645,"s":[{"i":[[-16.004,6.98],[5.012,-7.392]],"o":[[-1.203,10.209],[-4.553,6.715]],"v":[[-4.224,-29.44],[-14.131,4.559]],"c":false}]},{"i":{"x":0.833,"y":0.746},"o":{"x":0.167,"y":0.254},"t":107.199,"s":[{"i":[[-16.004,6.98],[-1.985,-4.242]],"o":[[-1.203,10.209],[3.438,7.348]],"v":[[5.092,-28.185],[11.498,-3.921]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.254},"t":113.756,"s":[{"i":[[-16.004,6.98],[-1.985,-4.242]],"o":[[-1.203,10.209],[3.438,7.348]],"v":[[5.092,-28.185],[11.498,-3.921]],"c":false}]},{"i":{"x":0.833,"y":0.746},"o":{"x":0.333,"y":0},"t":121.623,"s":[{"i":[[-16.004,6.98],[9.675,-6.89]],"o":[[-4.818,5.611],[-6.608,4.706]],"v":[[-5.66,-10.532],[-27.146,8.549]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.254},"t":126.867,"s":[{"i":[[-16.004,6.98],[-3.471,-6.564]],"o":[[-0.652,8.122],[3.792,7.172]],"v":[[8.991,-19.204],[19.316,9.51]],"c":false}]},{"i":{"x":0.4,"y":1},"o":{"x":0.333,"y":0},"t":138.666,"s":[{"i":[[-16.004,6.98],[9.001,-16.68]],"o":[[2.553,11.278],[-3.853,7.139]],"v":[[-46.639,-38.952],[-54.102,9.393]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.6,"y":0},"t":149.156,"s":[{"i":[[-11.089,-13.487],[5.43,-5.807]],"o":[[14.273,12.397],[-5.541,5.926]],"v":[[-21.398,-57.654],[-19.043,-25.948]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":160.955,"s":[{"i":[[-15.986,6.905],[-6.406,-17.7]],"o":[[4.529,15.375],[2.761,7.627]],"v":[[-26.354,-30.153],[-9.848,20.585]],"c":false}]},{"i":{"x":0.294,"y":1},"o":{"x":0.167,"y":0},"t":166.199,"s":[{"i":[[-15.986,6.905],[-6.406,-17.7]],"o":[[4.529,15.375],[2.761,7.627]],"v":[[-26.354,-30.153],[-9.848,20.585]],"c":false}]},{"t":178,"s":[{"i":[[-16.004,6.98],[-3.912,-7.86]],"o":[[2.247,20.541],[3.615,7.263]],"v":[[4.369,-35.77],[18.897,7.878]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.988235294118,0.933333333333,0.129411764706,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":228,"s":[5]},{"t":240,"s":[5]}]},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[95]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[95]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":228,"s":[100]},{"t":240,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":0,"op":300,"st":114,"bm":0},{"ddd":0,"ind":44,"ty":4,"nm":"wing_r 2","parent":64,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[-74.975]},{"i":{"x":[0.486],"y":[1]},"o":{"x":[0.617],"y":[0]},"t":69.178,"s":[-134.588]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":77.045,"s":[-64.698]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":94.09,"s":[-64.698]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":99.334,"s":[-74.975]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":107.199,"s":[-147.533]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":112.445,"s":[-147.533]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120.311,"s":[-64.698]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":126.867,"s":[-147.533]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":138.666,"s":[-134.588]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.6],"y":[0]},"t":149.156,"s":[-64.698]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":160.955,"s":[-74.975]},{"i":{"x":[0.294],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":166.199,"s":[-74.975]},{"t":178,"s":[-147.533]}]},"p":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":60,"s":[-115.902,-20.043,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.617,"y":0},"t":69.178,"s":[-99.747,30.953,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.8,"y":0.8},"t":77.045,"s":[-115.902,-20.043,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":94.09,"s":[-115.902,-20.043,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":99.334,"s":[-115.902,-20.043,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":112.445,"s":[-115.902,-20.043,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":120.311,"s":[-115.902,-20.043,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":126.867,"s":[-115.902,-20.043,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.333,"y":0},"t":138.666,"s":[-99.747,30.953,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.6,"y":0.6},"t":149.156,"s":[-115.902,-20.043,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":160.955,"s":[-115.902,-20.043,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.294,"y":0.294},"o":{"x":0.333,"y":0.333},"t":166.199,"s":[-115.902,-20.043,0],"to":[0,0,0],"ti":[0,0,0]},{"t":178,"s":[-115.902,-20.043,0]}]},"a":{"a":0,"k":[-58.809,-56.332,0]},"s":{"a":0,"k":[-100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.306,"y":1},"o":{"x":0.167,"y":0},"t":60,"s":[{"i":[[0,0],[-16.835,-6.508],[8.048,-43.787]],"o":[[61.001,-10.743],[24.823,9.596],[0,0]],"v":[[-107.655,-60.291],[-51.062,-162.155],[-27.184,-51.097]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":70.488,"s":[{"i":[[0,0],[-14.243,-11.087],[-2.262,-45.083]],"o":[[0.729,-63.214],[7.883,6.136],[0,0]],"v":[[-118.871,-29.792],[-42.247,-151.747],[-57.507,-52.802]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.8,"y":0},"t":77.045,"s":[{"i":[[0,0],[-17.608,3.967],[-9.637,-64.843]],"o":[[28.093,-40.527],[35.368,-7.969],[0,0]],"v":[[-107.655,-60.291],[-128.192,-160.615],[-27.184,-51.097]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":94.09,"s":[{"i":[[0,0],[-14.208,10.399],[8.048,-43.787]],"o":[[23.947,-67.347],[16.217,-11.869],[0,0]],"v":[[-107.655,-60.291],[-124.624,-170.638],[-28.424,-47.103]],"c":false}]},{"i":{"x":0.833,"y":0.746},"o":{"x":0.333,"y":0},"t":100.645,"s":[{"i":[[0,0],[-16.835,-6.508],[8.048,-43.787]],"o":[[61.001,-10.743],[24.823,9.596],[0,0]],"v":[[-107.655,-60.291],[-81.993,-143.354],[-27.184,-51.097]],"c":false}]},{"i":{"x":0.833,"y":0.746},"o":{"x":0.167,"y":0.254},"t":107.199,"s":[{"i":[[0,0],[-12.528,-12.993],[-0.395,-16.833]],"o":[[1.39,-62.584],[9.609,9.965],[0,0]],"v":[[-70.524,-48.518],[-17.974,-140.968],[-15.095,-81.054]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.254},"t":113.756,"s":[{"i":[[0,0],[-12.528,-12.993],[-0.395,-16.833]],"o":[[1.39,-62.584],[9.609,9.965],[0,0]],"v":[[-70.524,-48.518],[-17.974,-140.968],[-15.095,-81.054]],"c":false}]},{"i":{"x":0.833,"y":0.746},"o":{"x":0.333,"y":0},"t":121.623,"s":[{"i":[[0,0],[-14.208,10.399],[8.048,-43.787]],"o":[[23.947,-67.347],[16.217,-11.869],[0,0]],"v":[[-107.655,-60.291],[-124.624,-170.638],[-28.424,-47.103]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.254},"t":126.867,"s":[{"i":[[0,0],[-12.528,-12.993],[-0.395,-16.833]],"o":[[3.685,-73.229],[9.609,9.965],[0,0]],"v":[[-80.894,-21.493],[-17.974,-140.968],[-19.855,-66.92]],"c":false}]},{"i":{"x":0.4,"y":1},"o":{"x":0.333,"y":0},"t":138.666,"s":[{"i":[[0,0],[-17.659,3.731],[16.424,-47.842]],"o":[[27.081,-64.879],[16.051,-3.391],[0,0]],"v":[[-133.119,-41.451],[-111.216,-167.629],[-63.879,-45.654]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.6,"y":0},"t":149.156,"s":[{"i":[[0,0],[-15.939,7.479],[-4.539,-40.197]],"o":[[63.679,-16.222],[26.202,-12.294],[0,0]],"v":[[-118.31,-54.267],[-93.152,-103.707],[-29.507,-36.554]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":160.955,"s":[{"i":[[0,0],[-16.835,-6.508],[-32.435,-38.215]],"o":[[21.141,-45.681],[24.823,9.596],[0,0]],"v":[[-107.655,-60.291],[-51.062,-162.155],[-27.184,-51.097]],"c":false}]},{"i":{"x":0.294,"y":1},"o":{"x":0.167,"y":0},"t":166.199,"s":[{"i":[[0,0],[-16.835,-6.508],[-32.435,-38.215]],"o":[[21.141,-45.681],[24.823,9.596],[0,0]],"v":[[-107.655,-60.291],[-51.062,-162.155],[-27.184,-51.097]],"c":false}]},{"t":178,"s":[{"i":[[0,0],[-12.528,-12.993],[-0.395,-16.833]],"o":[[-2.853,-85.502],[9.609,9.965],[0,0]],"v":[[-77.356,-16.96],[-17.974,-140.968],[-15.095,-81.054]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.980392158031,0.564705908298,0.086274512112,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.835294127464,0.152941182256,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":114,"bm":0},{"ddd":0,"ind":45,"ty":4,"nm":"emj","parent":6,"sr":1,"ks":{"r":{"a":0,"k":380},"p":{"a":0,"k":[-10.151,-118.571,0]},"a":{"a":0,"k":[-190.48,-156.062,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0.733,1.838],[8.598,-3.023],[-2.25,0.196],[-3.256,-3.92]],"o":[[-1.86,-4.663],[-2.932,1.031],[4.938,-0.43],[1.216,1.465]],"v":[[-160.417,-168.366],[-177.721,-175.9],[-177.983,-173.095],[-162.057,-167.193]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.901,1.761],[-8.279,-3.81],[2.222,0.404],[3.606,-3.6]],"o":[[2.286,-4.47],[2.823,1.299],[-4.876,-0.887],[-1.347,1.345]],"v":[[-220.441,-162.582],[-202.511,-168.474],[-202.511,-165.657],[-218.918,-161.261]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-11.886,0],[3.505,2.54],[9.762,0],[3.027,-2.193]],"o":[[12.241,0],[-3.027,-2.193],[-9.762,0],[-3.505,2.54]],"v":[[-189.813,-127.788],[-172.695,-142.112],[-189.813,-136.474],[-206.93,-142.112]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.623,-1.999],[5.025,0],[0.923,2.113],[-6.299,0]],"o":[[-1.033,1.272],[-5.025,0],[-0.74,-1.694],[6.707,0]],"v":[[-196.014,-153.33],[-205.112,-154.388],[-214.211,-153.33],[-205.112,-159.629]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-3.944],[3.944,0],[0,3.944],[-3.944,0]],"o":[[0,3.944],[-3.944,0],[0,-3.944],[3.944,0]],"v":[[-167.163,-157.028],[-174.305,-149.886],[-181.447,-157.028],[-174.305,-164.17]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-21.673],[21.673,0],[0,21.673],[-21.673,0]],"o":[[0,21.673],[-21.673,0],[0,-21.673],[21.673,0]],"v":[[-151.238,-156.062],[-190.48,-116.82],[-229.722,-156.062],[-190.48,-195.304]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.63137254902,0.211764705882,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7.5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.996078431373,1,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":46,"ty":4,"nm":"emj","parent":6,"sr":1,"ks":{"r":{"a":0,"k":-8.934},"p":{"a":0,"k":[-73.147,-117.158,0]},"a":{"a":0,"k":[-83.624,-156.062,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.578,-3.816],[-9.017,0],[-6.49,2.864]],"o":[[6.468,2.824],[9.088,0],[1.46,-3.79]],"v":[[-107.364,-146.212],[-83.607,-141.692],[-59.697,-146.277]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-19.441,0],[4.837,4.277],[13.472,0],[4.177,-3.694]],"o":[[20.226,0],[-4.177,-3.694],[-13.472,0],[-4.837,4.277]],"v":[[-83.639,-130.843],[-60.016,-154.965],[-83.639,-153.158],[-107.261,-154.965]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.623,-1.999],[-5.025,0],[-0.923,2.113],[6.299,0]],"o":[[1.033,1.272],[5.025,0],[0.74,-1.694],[-6.707,0]],"v":[[-77.895,-163.765],[-68.797,-164.823],[-59.698,-163.765],[-68.797,-170.064]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.623,-1.999],[5.025,0],[0.923,2.113],[-6.299,0]],"o":[[-1.033,1.272],[-5.025,0],[-0.74,-1.694],[6.707,0]],"v":[[-89.836,-163.765],[-98.934,-164.823],[-108.033,-163.765],[-98.934,-170.064]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-21.673],[21.673,0],[0,21.673],[-21.673,0]],"o":[[0,21.673],[-21.673,0],[0,-21.673],[21.673,0]],"v":[[-44.382,-156.062],[-83.624,-116.82],[-122.866,-156.062],[-83.624,-195.304]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.54509806633,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7.5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.831372559071,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":47,"ty":4,"nm":"msg","parent":6,"sr":1,"ks":{"r":{"a":0,"k":-0.828},"p":{"a":0,"k":[-48.331,19.857,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[5.671,0],[0,0],[0,-5.671],[0,0],[-5.671,0],[0,0],[0,5.671],[0,0]],"o":[[0,0],[-5.671,0],[0,0],[0,5.671],[0,0],[5.671,0],[0,0],[0,-5.671]],"v":[[62.304,-38.695],[-62.304,-38.695],[-72.572,-28.427],[-72.572,7.217],[-62.304,17.485],[62.304,17.485],[72.572,7.217],[72.572,-28.427]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.476283832625,0.638979204963,0.763838465074,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.940441176471,0.974922569125,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":132,"st":0,"bm":0},{"ddd":0,"ind":48,"ty":4,"nm":"msg 5","parent":52,"sr":1,"ks":{"p":{"a":0,"k":[-44.199,-10.205,0]},"s":{"a":0,"k":[118.443,118.443,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[0.473663150563,0.725567267923,0.489048647413,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.647058823529,0.141176470588,0.917647058824,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"fl","c":{"a":0,"k":[0.647058844566,0.141176477075,0.917647063732,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":132,"op":300,"st":0,"bm":0},{"ddd":0,"ind":49,"ty":4,"nm":"msg 4","parent":50,"sr":1,"ks":{"p":{"a":0,"k":[1.573,15.417,0]},"a":{"a":0,"k":[-298.846,-251.295,0]},"s":{"a":0,"k":[99.557,99.557,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-301.221,-260.093],[-296.75,-261.047],[-298.241,-258.185]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.929411768913,0.117647059262,0.474509805441,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.303,-2.018],[1.435,-0.215],[0.303,2.018],[-1.435,0.215]],"o":[[0.303,2.018],[-1.435,0.215],[-0.303,-2.018],[1.435,-0.215]],"v":[[-289.686,-263.866],[-291.736,-259.822],[-294.882,-263.087],[-292.832,-267.131]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.303,-2.018],[1.435,-0.215],[0.303,2.018],[-1.435,0.215]],"o":[[0.303,2.018],[-1.435,0.215],[-0.303,-2.018],[1.435,-0.215]],"v":[[-303.31,-261.284],[-305.36,-257.24],[-308.506,-260.505],[-306.456,-264.549]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-2.273,5.33],[1.828,2.614],[0.157,-0.533],[0.286,-1.203],[0,0],[1.452,1.277],[0.079,-0.54],[-0.305,-3.913],[-4.174,0]],"o":[[-2.042,-6.245],[-0.318,-0.455],[-0.372,1.264],[-3.961,0.523],[0,0],[-0.41,-0.361],[-0.747,5.096],[2.707,2.764],[6.161,0]],"v":[[-286.479,-260.363],[-292.921,-275.22],[-294.118,-275.029],[-294.888,-271.227],[-306.92,-269.209],[-309.643,-272.215],[-310.774,-271.808],[-310.848,-255.779],[-300.199,-251.295]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.874478448606,0.874478448606,0.874478448606,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false}],"ip":132,"op":300,"st":0,"bm":0},{"ddd":0,"ind":50,"ty":4,"nm":"msg 3","parent":52,"sr":1,"ks":{"p":{"a":0,"k":[-44.199,-10.205,0]},"s":{"a":0,"k":[118.443,118.443,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0]],"o":[[0,0]],"v":[[21.706,6.289]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.473663150563,0.725567267923,0.489048647413,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.647058823529,0.141176470588,0.917647058824,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-8.235],[8.235,0],[0,8.235],[-8.235,0]],"o":[[0,8.235],[-8.235,0],[0,-8.235],[8.235,0]],"v":[[14.91,0],[0,14.91],[-14.91,0],[0,-14.91]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.647058844566,0.141176477075,0.917647063732,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":132,"op":300,"st":0,"bm":0},{"ddd":0,"ind":51,"ty":4,"nm":"msg 2","parent":52,"sr":1,"ks":{"p":{"a":0,"k":[15.576,-10.738,0]},"a":{"a":0,"k":[-1541.184,1009.518,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-19.665,0],[12.415,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1513.76,1000.998]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1.366,0],[20.134,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1528.516,1018.038]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-5.558,0],[20.558,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1564.215,1018.038]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-14.344,0],[3.094,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1555.429,1000.998]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false}],"ip":132,"op":300,"st":0,"bm":0},{"ddd":0,"ind":52,"ty":4,"nm":"Layer 28","parent":6,"sr":1,"ks":{"r":{"a":0,"k":-0.407},"p":{"a":0,"k":[-11.331,19.357,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[5.671,0],[0,0],[0,-5.671],[0,0],[-5.671,0],[0,0],[0,5.671],[0,0]],"o":[[0,0],[-5.671,0],[0,0],[0,5.671],[0,0],[5.671,0],[0,0],[0,-5.671]],"v":[[62.304,-38.695],[-62.304,-38.695],[-72.572,-28.427],[-72.572,7.217],[-62.304,17.485],[62.304,17.485],[72.572,7.217],[72.572,-28.427]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.473663150563,0.725567267923,0.489048647413,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":132,"op":266,"st":0,"bm":0},{"ddd":0,"ind":53,"ty":4,"nm":"m31","parent":54,"sr":1,"ks":{"p":{"a":0,"k":[-44.199,-10.205,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-8.235],[8.235,0],[0,8.235],[-8.235,0]],"o":[[0,8.235],[-8.235,0],[0,-8.235],[8.235,0]],"v":[[14.91,0],[0,14.91],[-14.91,0],[0,-14.91]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.417009091845,0.917647058824,0.141176470588,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":132,"op":300,"st":0,"bm":0},{"ddd":0,"ind":54,"ty":4,"nm":"msg7","parent":6,"sr":1,"ks":{"r":{"a":0,"k":4.609},"p":{"a":0,"k":[-36.331,12.357,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[5.671,0],[0,0],[0,-5.671],[0,0],[-5.671,0],[0,0],[0,5.671],[0,0]],"o":[[0,0],[-5.671,0],[0,0],[0,5.671],[0,0],[5.671,0],[0,0],[0,-5.671]],"v":[[62.304,-38.695],[-62.304,-38.695],[-72.572,-28.427],[-72.572,7.217],[-62.304,17.485],[62.304,17.485],[72.572,7.217],[72.572,-28.427]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.560784339905,0.729411780834,0.858823537827,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":132,"op":300,"st":0,"bm":0},{"ddd":0,"ind":55,"ty":4,"nm":"m30","parent":57,"sr":1,"ks":{"p":{"a":0,"k":[15.576,-10.738,0]},"a":{"a":0,"k":[-1541.184,1009.518,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-23.79,0],[6.79,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1513.76,1000.998]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1528.516,1018.038]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-11.183,0],[27.183,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1564.215,1018.038]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-19.969,0],[2.969,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1555.429,1000.998]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false}],"ip":132,"op":300,"st":0,"bm":0},{"ddd":0,"ind":56,"ty":4,"nm":"m29","parent":57,"sr":1,"ks":{"p":{"a":0,"k":[-44.199,-10.205,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-8.235],[8.235,0],[0,8.235],[-8.235,0]],"o":[[0,8.235],[-8.235,0],[0,-8.235],[8.235,0]],"v":[[14.91,0],[0,14.91],[-14.91,0],[0,-14.91]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.417009091845,0.917647058824,0.141176470588,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":132,"op":300,"st":0,"bm":0},{"ddd":0,"ind":57,"ty":4,"nm":"msg6","parent":6,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":69.178,"s":[-24.547]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":84.91,"s":[73.158]},{"t":94.08984375,"s":[4.609]}]},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":69.178,"s":[115.669,228.857,0],"to":[-16.439,-53.534,0],"ti":[49.354,29.091,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.8,"y":0},"t":84.91,"s":[49.305,-54.714,0],"to":[-21.676,-12.777,0],"ti":[27.888,-61.96,0]},{"t":94.08984375,"s":[-36.331,12.357,0]}]},"s":{"a":1,"k":[{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":69.178,"s":[100,80,100]},{"t":84.91015625,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[5.671,0],[0,0],[0,-5.671],[0,0],[-5.671,0],[0,0],[0,5.671],[0,0]],"o":[[0,0],[-5.671,0],[0,0],[0,5.671],[0,0],[5.671,0],[0,0],[0,-5.671]],"v":[[62.304,-38.695],[-62.304,-38.695],[-72.572,-28.427],[-72.572,7.217],[-62.304,17.485],[62.304,17.485],[72.572,7.217],[72.572,-28.427]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.560784339905,0.729411780834,0.858823537827,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":132,"op":300,"st":0,"bm":0},{"ddd":0,"ind":58,"ty":4,"nm":"msg 6","parent":6,"sr":1,"ks":{"r":{"a":0,"k":-0.828},"p":{"a":0,"k":[-48.331,19.857,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[5.671,0],[0,0],[0,-5.671],[0,0],[-5.671,0],[0,0],[0,5.671],[0,0]],"o":[[0,0],[-5.671,0],[0,0],[0,5.671],[0,0],[5.671,0],[0,0],[0,-5.671]],"v":[[62.304,-38.695],[-62.304,-38.695],[-72.572,-28.427],[-72.572,7.217],[-62.304,17.485],[62.304,17.485],[72.572,7.217],[72.572,-28.427]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.476283832625,0.638979204963,0.763838465074,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.940441176471,0.974922569125,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":132,"op":300,"st":0,"bm":0},{"ddd":0,"ind":59,"ty":4,"nm":"suit4","parent":22,"sr":1,"ks":{"o":{"a":0,"k":22},"p":{"a":0,"k":[1.828,-12.763,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[16.274,-2.509],[0,0],[0,0],[-16.274,2.509],[0,0],[0,0]],"o":[[0,0],[0,0],[11.278,3.911],[0,0],[0,0],[-7.774,-2.262]],"v":[[30.755,-14.328],[-99.853,5.808],[-80.643,12.471],[-30.756,15.01],[99.853,-5.126],[66.133,-14.764]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.521568655968,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":60,"ty":4,"nm":"suit3","parent":22,"sr":1,"ks":{"p":{"a":0,"k":[-0.001,-27.197,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[15.65,-2.413],[0,0],[10.845,3.761],[0,0],[-15.65,2.413],[0,0],[-10.845,-3.761],[0,0]],"o":[[0,0],[-15.65,2.413],[0,0],[-10.845,-3.761],[0,0],[15.65,-2.413],[0,0],[10.845,3.761]],"v":[[129.891,4.602],[-31.576,29.495],[-79.551,27.053],[-138.591,6.578],[-129.891,-4.602],[31.576,-29.495],[79.551,-27.053],[138.591,-6.578]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.521568655968,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.670588254929,0.949019610882,0.568627476692,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":61,"ty":4,"nm":"suit2","parent":22,"sr":1,"ks":{"p":{"a":0,"k":[-75.628,-68.335,0]},"a":{"a":0,"k":[207.107,377.635,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-14.019,1.984],[0,0],[-0.625,0.114],[0,0],[14.019,-1.984],[0,0],[0.625,-0.114],[0,0]],"o":[[0,0],[0.654,-0.093],[0,0],[-4.911,-6.795],[0,0],[-0.654,0.092],[0,0],[4.911,6.795]],"v":[[-49.636,33.235],[104.622,10.011],[108.722,8.594],[84.889,-24.519],[50.613,-33.23],[-102.267,-11.193],[-108.722,-10.133],[-88.035,24.464]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.521568655968,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[209.384,376.461]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":22},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[14.019,-1.984],[0,0],[17.559,24.458],[0,0],[-14.019,1.984],[0,0],[-9.688,-12.516],[0,0]],"o":[[0,0],[-14.019,1.984],[-4.4,-6.129],[-4.911,-6.795],[0,0],[14.019,-1.984],[0,0],[4.911,6.795]],"v":[[98.7,19.633],[-54.18,41.67],[-97.522,20.417],[-115.191,-4.03],[-98.7,-19.926],[54.18,-41.964],[91.219,-29.432],[115.191,3.737]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.423529411765,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.670588254929,0.949019610882,0.568627476692,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[209.806,367.965]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[2.888,3.996],[0,0],[15.194,-2.151],[0,0],[0.329,-5.855],[-14.452,-20.429],[-15.194,2.151],[0,0],[5.323,7.364]],"o":[[3.977,-3.257],[0,0],[-5.323,-7.364],[0,0],[-12.261,1.736],[-0.732,13.037],[17.335,24.505],[0,0],[15.194,-2.151],[0,0]],"v":[[118.284,9.19],[120.415,-2.158],[91.439,-42.249],[54.29,-51.689],[-102.469,-29.502],[-121.98,-16.535],[-104.231,27.675],[-54.218,51.554],[102.541,29.367],[120.415,12.138]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.423529411765,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.752941191196,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[207.107,377.681]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":62,"ty":4,"nm":"body_bl","parent":64,"sr":1,"ks":{"r":{"a":0,"k":-1.29},"p":{"a":0,"k":[102.397,8.744,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0.54,-11.419],[30.736,-6.603]],"o":[[-1.56,33.017],[0,0]],"v":[[44.275,41.845],[-25.723,88.554]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.988235294819,0.933333337307,0.129411771894,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":228,"s":[5]},{"t":240,"s":[5]}]},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[95]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[95]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":228,"s":[100]},{"t":240,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":0,"op":300,"st":114,"bm":0},{"ddd":0,"ind":63,"ty":4,"nm":"shk11","sr":1,"ks":{"p":{"a":0,"k":[89.962,180.348,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-9.538,258.633],[15.572,256.883],[15.555,-174.633],[-9.555,-174.633]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.337254901961,0.549019607843,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.113725490868,0.662745118141,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":64,"ty":4,"nm":"body","parent":6,"sr":1,"ks":{"p":{"a":0,"k":[228.195,224.14,0]},"a":{"a":0,"k":[14.534,120.082,0]},"s":{"a":1,"k":[{"i":{"x":[0.58,0.58,0.58],"y":[1,1,1]},"o":{"x":[0.42,0.42,0.42],"y":[0,0,0]},"t":62.623,"s":[85,85,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.42,0.42,0.42],"y":[0,0,0]},"t":87.533,"s":[85,85,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":108.512,"s":[82,89,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":113.756,"s":[85,85,100]},{"i":{"x":[0.16,0.16,0.16],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":122.934,"s":[82,89,100]},{"i":{"x":[0.16,0.16,0.16],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":153.09,"s":[85,85,100]},{"i":{"x":[0.334,0.334,0.334],"y":[1,1,1]},"o":{"x":[0.262,0.262,0.262],"y":[0,0,0]},"t":166.199,"s":[85,85,100]},{"i":{"x":[0.546,0.546,0.546],"y":[1,1,1]},"o":{"x":[0.229,0.229,0.229],"y":[0,0,0]},"t":171.445,"s":[87,83,100]},{"t":178,"s":[85,85,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.294,"y":1},"o":{"x":0.333,"y":0},"t":166.199,"s":[{"i":[[71.236,0],[5.951,48.89],[-2.28,8.971],[-3.181,9.755],[-80.635,0],[-6.187,-110.17]],"o":[[-70.876,0],[-1.557,-12.791],[3.674,-14.455],[26.406,-80.973],[88.008,0],[4.493,80.01]],"v":[[9.675,120.069],[-140.849,57.414],[-139.413,21.699],[-130.895,-8.477],[9.675,-96.715],[170.594,42.9]],"c":true}]},{"t":178,"s":[{"i":[[72.157,0],[6.213,48.89],[-2.381,8.971],[-3.321,9.755],[-84.181,0],[-6.267,-110.17]],"o":[[-71.791,0],[-1.626,-12.791],[3.836,-14.455],[27.567,-80.973],[91.878,0],[4.551,80.009]],"v":[[0.201,120.069],[-154.742,57.414],[-153.243,21.699],[-144.349,-8.477],[6.519,-96.995],[163.199,42.9]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.980392158031,0.564705908298,0.086274512112,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.835294127464,0.152941182256,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":158,"bm":0},{"ddd":0,"ind":65,"ty":4,"nm":"emj","parent":6,"sr":1,"ks":{"p":{"a":0,"k":[-74.051,114.539,0]},"a":{"a":0,"k":[-190.48,-156.062,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.695,1.02],[-5.02,-7.607],[1.674,1.517],[4.964,-1.153]],"o":[[4.301,-2.589],[1.712,2.594],[-3.673,-3.328],[-1.855,0.431]],"v":[[-215.802,-167.603],[-197.464,-163.141],[-198.952,-160.748],[-215.206,-165.677]],"c":true}},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[1.559,1.02],[4.618,-7.607],[-1.54,1.517],[-4.566,-1.153]],"o":[[-3.956,-2.589],[-1.575,2.594],[3.378,-3.328],[1.706,0.431]],"v":[[-166.309,-168.103],[-183.177,-163.641],[-181.809,-161.248],[-166.858,-166.177]],"c":true}},"nm":"Path 2","hd":false},{"ty":"fl","c":{"a":0,"k":[0.389981617647,0.150689472872,0.054972592522,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[11.707,0],[-3.452,-1.859],[-9.616,0],[-2.981,1.606]],"o":[[-12.057,0],[2.981,1.606],[9.616,0],[3.452,-1.86]],"v":[[-189.813,-144.844],[-206.673,-134.356],[-189.813,-137.234],[-172.952,-134.356]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.389981617647,0.150689472872,0.054972592522,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0.08,-3.716],[3.256,0],[0.055,4.63],[-4.081,0]],"o":[[-0.072,3.366],[-3.256,0],[-0.032,-2.669],[4.345,0]],"v":[[-196.58,-155.422],[-202.717,-149.004],[-208.369,-155.422],[-202.474,-163]],"c":true}},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.18,-3.712],[-3.172,0.087],[0.073,4.63],[3.976,-0.109]],"o":[[0.163,3.363],[3.172,-0.087],[-0.042,-2.669],[-4.234,0.116]],"v":[[-184.029,-156.64],[-177.873,-150.389],[-172.543,-156.955],[-178.495,-164.373]],"c":true}},"nm":"Path 2","hd":false},{"ty":"fl","c":{"a":0,"k":[0.389981617647,0.150689472872,0.054972592522,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-21.673],[21.673,0],[0,21.673],[-21.673,0]],"o":[[0,21.673],[-21.673,0],[0,-21.673],[21.673,0]],"v":[[-151.238,-156.062],[-190.48,-116.82],[-229.722,-156.062],[-190.48,-195.304]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.616896446078,0.170748123468,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7.5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.364705882353,0.121568634931,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":66,"ty":4,"nm":"shk10","parent":80,"sr":1,"ks":{"p":{"a":0,"k":[17.511,234.681,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.894,0],[0,0],[-1.275,-1.272],[0,-1.95],[0,0],[3.894,0],[0,0]],"o":[[0,0],[1.943,0],[1.28,1.276],[0,0],[0,3.894],[0,0],[-3.894,0]],"v":[[-84.727,-18.292],[77.677,-26.417],[82.655,-24.359],[84.727,-19.366],[84.727,0.991],[77.677,8.042],[-84.727,14.917]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.337254901961,0.549019607843,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.113725490868,0.662745118141,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":67,"ty":4,"nm":"shk9","parent":80,"sr":1,"ks":{"p":{"a":0,"k":[17.511,200.681,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.894,0],[0,0],[0,-3.894],[0,0],[3.894,0],[0,0]],"o":[[0,0],[3.894,0],[0,0],[0,3.894],[0,0],[-3.894,0]],"v":[[-84.727,-14.292],[77.677,-22.417],[84.727,-15.366],[84.727,0.991],[77.677,8.042],[-84.727,14.917]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.337254901961,0.549019607843,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.113725490868,0.662745118141,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":68,"ty":4,"nm":"shk8","parent":80,"sr":1,"ks":{"p":{"a":0,"k":[17.511,230.681,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.894,0],[0,0]],"o":[[0,0],[-3.894,0]],"v":[[77.677,13.042],[-84.727,20.542]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.337254901961,0.549019607843,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":69,"ty":4,"nm":"suit 3","parent":23,"sr":1,"ks":{"r":{"a":0,"k":0.197},"p":{"a":0,"k":[-134.264,161.98,0]},"a":{"a":0,"k":[-134.264,161.98,0]},"s":{"a":0,"k":[100.109,99.891,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.115,-1.142],[1.394,-0.242],[0.115,1.142],[-1.394,0.242]],"o":[[0.115,1.142],[-1.394,0.242],[-0.115,-1.142],[1.394,-0.242]],"v":[[-117.199,153.768],[-119.514,156.273],[-122.246,154.644],[-119.931,152.139]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.115,-1.142],[1.394,-0.242],[0.115,1.142],[-1.394,0.242]],"o":[[0.115,1.142],[-1.394,0.242],[-0.115,-1.142],[1.394,-0.242]],"v":[[-141.272,156.574],[-143.587,159.079],[-146.319,157.449],[-144.004,154.944]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-109.809,153.049],[-117.566,155.362]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-152.472,157.422],[-144.202,158.092]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0.751,-0.664],[0,0],[-0.95,-0.49],[0,0],[-0.751,0.664],[0,0],[0.95,0.49],[0,0]],"o":[[0,0],[-0.751,0.664],[0,0],[0.95,0.49],[0,0],[0.751,-0.664],[0,0],[-0.95,-0.49]],"v":[[-131.697,162.903],[-135.295,166.083],[-134.935,168.173],[-130.386,170.518],[-127.305,170.202],[-123.707,167.022],[-124.067,164.932],[-128.617,162.587]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.945098042488,0.352941185236,0.141176477075,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.638,-3.707],[3.062,-0.314],[0.638,3.707],[-3.062,0.314]],"o":[[0.638,3.707],[-3.062,0.314],[-0.638,-3.707],[3.062,-0.314]],"v":[[-113.302,156.443],[-117.69,163.724],[-124.389,157.58],[-120.002,150.299]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":4},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.638,-3.707],[3.062,-0.314],[0.638,3.707],[-3.062,0.314]],"o":[[0.638,3.707],[-3.062,0.314],[-0.638,-3.707],[3.062,-0.314]],"v":[[-137.478,158.921],[-141.865,166.202],[-148.564,160.057],[-144.177,152.777]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":4},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[2.724,0.432],[-0.46,-1.07],[0,0],[-0.767,0.687],[0,0],[0,0],[0.298,1.077],[0,0],[0.859,-0.622]],"o":[[-3.586,-1.037],[-1.16,-0.184],[0,0],[0.426,0.991],[0,0],[0,0],[1.11,0.272],[0,0],[-0.292,-1.056],[0,0]],"v":[[-136.574,137.954],[-147.287,135.703],[-148.837,137.671],[-145.239,146.032],[-142.755,146.663],[-135.406,140.082],[-125.53,142.499],[-123.773,140.758],[-125.934,132.936],[-128.378,132.015]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.607843137255,0.878431372549,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":4},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.607843160629,0.878431379795,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 8","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-4.308,-12.946],[13.322,-2.995],[4.308,12.946],[-13.322,2.995]],"o":[[4.308,12.946],[-13.322,2.995],[-4.308,-12.946],[13.322,-2.995]],"v":[[-106.505,156.539],[-125.068,180.315],[-154.747,167.386],[-138.426,138.522]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.831372559071,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 9","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[14.678,-0.956],[1.796,-5.903],[0,0]],"o":[[-17.964,1.169],[13.73,-2.31],[-7.827,-18.221]],"v":[[-127.893,174.295],[-152.915,198.291],[-96.712,194.826]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.831372559071,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 10","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-106.6,127.209],[-92.464,197.283],[-155.352,200.784]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.726274677351,0.599050304936,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":44},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.672,0.093],[0,0]],"o":[[0,0],[-0.331,-1.642],[0,0],[0,0]],"v":[[-161.021,200.784],[-175.839,127.331],[-173.297,124.042],[-107.753,120.393]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156863213,0.713725507259,0.584313750267,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":44},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-89.227,199.741],[-157.941,203.566],[-173.387,127],[-104.673,123.175]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.709803938866,0.505882382393,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":15},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.831372559071,0.078431375325,0.352941185236,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-89.227,199.741],[-157.941,203.566],[-173.387,127],[-104.673,123.175]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.561199592142,0.276337687174,0.162392889285,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":26},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.333,"y":0},"t":138.666,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-136.306,188.315],[-179.301,190.709],[-164.733,146.6],[-134.252,144.207]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.6,"y":0},"t":149.156,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-133.223,210.384],[-176.218,212.777],[-159.587,158.073],[-129.106,155.68]],"c":true}]},{"t":160.955078125,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-136.306,188.315],[-179.301,190.709],[-164.733,146.6],[-134.252,144.207]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.709803921569,0.505882352941,0.411764735802,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.560784313725,0.274509803922,0.160784313725,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":12},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false}],"ip":158,"op":300,"st":0,"bm":0},{"ddd":0,"ind":70,"ty":4,"nm":"shk7","parent":80,"sr":1,"ks":{"p":{"a":0,"k":[17.511,91.181,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.894,0],[0,0],[0,-3.894],[0,0],[3.894,0],[0,0]],"o":[[0,0],[3.894,0],[0,0],[0,3.894],[0,0],[-3.894,0]],"v":[[-84.727,-13.042],[77.677,-18.042],[84.727,-10.991],[84.727,0.991],[77.677,8.042],[-84.727,13.042]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.337254901961,0.549019607843,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.113725490868,0.662745118141,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":71,"ty":4,"nm":"emj","parent":6,"sr":1,"ks":{"r":{"a":0,"k":338.778},"p":{"a":0,"k":[26.669,-117.143,0]},"a":{"a":0,"k":[-190.48,-156.062,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.901,1.761],[-8.279,-3.81],[2.222,0.404],[3.606,-3.6]],"o":[[2.286,-4.47],[2.823,1.299],[-4.876,-0.887],[-1.347,1.345]],"v":[[-220.441,-162.582],[-202.511,-168.474],[-202.511,-165.657],[-218.918,-161.261]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-11.886,0],[3.505,2.54],[9.762,0],[3.027,-2.193]],"o":[[12.241,0],[-3.027,-2.193],[-9.762,0],[-3.505,2.54]],"v":[[-189.557,-134.662],[-172.695,-142.112],[-189.557,-143.348],[-206.93,-142.112]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.623,-1.999],[5.025,0],[0.923,2.113],[-6.299,0]],"o":[[-1.033,1.272],[-5.025,0],[-0.74,-1.694],[6.707,0]],"v":[[-196.014,-153.33],[-205.112,-154.388],[-214.211,-153.33],[-205.112,-159.629]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-5.919],[3.944,0],[0,5.919],[-3.944,0]],"o":[[0,5.919],[-3.944,0],[0,-5.919],[3.944,0]],"v":[[-167.163,-160.603],[-174.305,-149.886],[-181.447,-160.603],[-174.305,-171.321]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-21.673],[21.673,0],[0,21.673],[-21.673,0]],"o":[[0,21.673],[-21.673,0],[0,-21.673],[21.673,0]],"v":[[-151.238,-156.062],[-190.48,-116.82],[-229.722,-156.062],[-190.48,-195.304]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.980392216701,0.564705882353,0.086274509804,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7.5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.831372608858,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":72,"ty":4,"nm":"m19","parent":74,"sr":1,"ks":{"p":{"a":0,"k":[15.576,-10.738,0]},"a":{"a":0,"k":[-1541.184,1009.518,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-6.79,0],[6.79,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1513.76,1000.998]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-8.009,0],[8.009,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1528.516,1018.038]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-11.183,0],[11.183,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1564.215,1018.038]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-19.969,0],[19.969,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1555.429,1000.998]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":73,"ty":4,"nm":"m18","parent":74,"sr":1,"ks":{"p":{"a":0,"k":[-44.199,-10.205,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-8.235],[8.235,0],[0,8.235],[-8.235,0]],"o":[[0,8.235],[-8.235,0],[0,-8.235],[8.235,0]],"v":[[14.91,0],[0,14.91],[-14.91,0],[0,-14.91]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.647058844566,0.141176477075,0.917647063732,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":74,"ty":4,"nm":"msg5","parent":6,"sr":1,"ks":{"r":{"a":0,"k":-9.118},"p":{"a":0,"k":[-40.831,133.857,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[5.671,0],[0,0],[0,-5.671],[0,0],[-5.671,0],[0,0],[0,5.671],[0,0]],"o":[[0,0],[-5.671,0],[0,0],[0,5.671],[0,0],[5.671,0],[0,0],[0,-5.671]],"v":[[62.304,-38.695],[-62.304,-38.695],[-72.572,-28.427],[-72.572,7.217],[-62.304,17.485],[62.304,17.485],[72.572,7.217],[72.572,-28.427]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.560784339905,0.729411780834,0.858823537827,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":75,"ty":4,"nm":"shk6","parent":80,"sr":1,"ks":{"p":{"a":0,"k":[17.511,-31.381,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.894,0],[0,0],[0,-3.894],[0,0],[3.894,0],[0,0]],"o":[[0,0],[3.894,0],[0,0],[0,3.894],[0,0],[-3.894,0]],"v":[[-84.727,-13.042],[77.677,-15.542],[84.727,-8.491],[84.727,3.491],[77.677,10.542],[-84.727,13.042]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.337254901961,0.549019607843,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.113725490868,0.662745118141,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":76,"ty":4,"nm":"shk14","sr":1,"ks":{"p":{"a":0,"k":[287.462,180.348,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-9.555,188.883],[15.555,188.883],[15.555,-169.633],[-9.555,-169.633]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.337254901961,0.549019607843,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.113725490868,0.662745118141,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":77,"ty":4,"nm":"shk15","sr":1,"ks":{"p":{"a":0,"k":[178.681,21.406,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.894,0],[0,0],[0,-3.894],[0,0],[3.894,0],[0,0]],"o":[[0,0],[3.894,0],[0,0],[0,3.894],[0,0],[-3.894,0]],"v":[[-84.727,-13.042],[100.177,-8.042],[107.227,-0.991],[107.227,10.991],[100.177,18.042],[-84.727,13.042]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.337254901961,0.549019607843,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.113725490868,0.662745118141,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":78,"ty":4,"nm":"shk16","sr":1,"ks":{"p":{"a":0,"k":[180.192,175.013,0]},"a":{"a":0,"k":[209.692,192.513,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[100.238,-13.754],[62.196,12.254],[-86.238,6.754],[-86.238,-19.254]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.337254901961,0.549019607843,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[209.692,69.951]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":50},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[86.238,-15.504],[48.196,10.504],[-86.238,10.504],[-86.238,-15.504]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.337254901961,0.549019607843,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[209.692,192.513]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":50},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[86.238,-18.004],[48.196,8.004],[-86.238,13.004],[-86.238,-13.004]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.337254901961,0.549019607843,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[209.692,315.075]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":50},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":79,"ty":4,"nm":"shk2","parent":80,"sr":1,"ks":{"p":{"a":0,"k":[24.464,0,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[42.99,237.883],[93.996,237.883],[94.181,-166.133],[-91.681,-166.133],[43.175,-166.133]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.33790471694,0.547530828738,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.030181849237,0.525752886604,0.832711014093,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":80,"ty":4,"nm":"shk1","parent":6,"sr":1,"ks":{"p":{"a":0,"k":[-54.4,-29.05,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-66.829,246.883],[67.604,246.883],[67.104,-166.883],[-67.329,-166.883]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.423529441684,0.686274509804,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"_020_WHATSAPP_fin_wide_2sec","refId":"comp_0","sr":1,"ks":{"p":{"a":0,"k":[256,256,0]},"a":{"a":0,"k":[306,256,0]},"s":{"a":0,"k":[85,85,100]}},"ao":0,"w":612,"h":512,"ip":0,"op":120,"st":-60,"bm":0}]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/import_loop.tgs b/TMessagesProj/src/main/res/raw/import_loop.tgs new file mode 100644 index 00000000000..4064626c24d --- /dev/null +++ b/TMessagesProj/src/main/res/raw/import_loop.tgs @@ -0,0 +1 @@ +{"tgs":1,"v":"5.5.2.2","fr":60,"ip":0,"op":180,"w":512,"h":512,"nm":"_020_WHATSAPP_loop_OUT","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"shk13","parent":85,"sr":1,"ks":{"p":{"a":0,"k":[-71.209,0,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-9.538,258.633],[-59.428,246.598],[-59.445,-149.918],[-9.555,-174.633]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.337254901961,0.549019607843,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.03137254902,0.525490196078,0.831372608858,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"shk12","parent":85,"sr":1,"ks":{"p":{"a":0,"k":[-71.209,0,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[15.082,126.902],[15.555,-174.633],[-9.555,-174.633],[-10.027,128.402]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.337254901961,0.549019607843,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.113725490868,0.662745118141,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"p":{"a":0,"k":[306,256,0]}},"ao":0,"shapes":[],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":3,"nm":"NULL CONTROL","sr":1,"ks":{"o":{"a":0,"k":0},"p":{"a":0,"k":[250.571,269.399,0]},"a":{"a":0,"k":[60,60,0]}},"ao":0,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"wing_r 6","parent":52,"sr":1,"ks":{"p":{"a":0,"k":[-58.809,-56.332,0]},"a":{"a":0,"k":[-58.809,-56.332,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":142,"s":[{"i":[[0,0],[-12.528,-12.993],[-0.395,-16.833]],"o":[[1.39,-62.584],[9.609,9.965],[0,0]],"v":[[-70.524,-48.518],[-17.974,-140.968],[-15.095,-81.054]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":154,"s":[{"i":[[0,0],[-14.208,10.399],[8.048,-43.787]],"o":[[23.947,-67.347],[16.217,-11.869],[0,0]],"v":[[-107.655,-60.291],[-124.624,-170.638],[-28.424,-47.103]],"c":false}]},{"t":172,"s":[{"i":[[0,0],[-12.528,-12.993],[-0.395,-16.833]],"o":[[3.685,-73.229],[9.609,9.965],[0,0]],"v":[[-80.894,-21.493],[-17.974,-140.968],[-19.855,-66.92]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.980392216701,0.564705882353,0.086274509804,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.835294127464,0.152941182256,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":0,"k":25},"e":{"a":0,"k":55},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":148,"op":160,"st":114,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"wing_bl 4","parent":52,"sr":1,"ks":{"r":{"a":0,"k":-172.417},"p":{"a":0,"k":[-54.755,-111.892,0]},"s":{"a":0,"k":[-100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.306,"y":1},"o":{"x":0.167,"y":0},"t":60,"s":[{"i":[[-16.004,6.98],[2.258,-12.51]],"o":[[7.913,17.033],[-1.441,7.984]],"v":[[0.289,-31.284],[6.431,20.145]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":76,"s":[{"i":[[-16.004,6.98],[-8.554,-11.251]],"o":[[5.587,13.961],[4.91,6.458]],"v":[[-29.273,-32.276],[-7.735,12.813]],"c":false}]},{"t":86,"s":[{"i":[[-16.004,6.98],[15.44,-7.583]],"o":[[-6.944,9.239],[-7.282,3.576]],"v":[[-3.702,-9.261],[-38.775,18.099]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.988235353956,0.933333393172,0.129411764706,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[0]},{"t":84,"s":[5]}]},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[95]},{"t":84,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":60,"op":80,"st":114,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"wing_r 3","parent":52,"sr":1,"ks":{"p":{"a":0,"k":[-58.809,-56.332,0]},"a":{"a":0,"k":[-58.809,-56.332,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.306,"y":1},"o":{"x":0.167,"y":0},"t":60,"s":[{"i":[[0,0],[-16.835,-6.508],[8.048,-43.787]],"o":[[61.001,-10.743],[24.823,9.596],[0,0]],"v":[[-107.655,-60.291],[-51.062,-162.155],[-27.184,-51.097]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":76,"s":[{"i":[[0,0],[-14.243,-11.087],[-2.262,-45.083]],"o":[[0.729,-63.214],[7.883,6.136],[0,0]],"v":[[-118.871,-29.792],[-42.247,-151.747],[-57.507,-52.802]],"c":false}]},{"t":86,"s":[{"i":[[0,0],[-17.608,3.967],[-9.637,-64.843]],"o":[[28.093,-40.527],[35.368,-7.969],[0,0]],"v":[[-107.655,-60.291],[-128.192,-160.615],[-27.184,-51.097]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.980392216701,0.564705882353,0.086274509804,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.835294127464,0.152941182256,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":0,"k":17},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":62,"s":[87]},{"t":76,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":60,"op":80,"st":114,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"emj","parent":4,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.31],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":140,"s":[-24.547]},{"t":164,"s":[-8.934]}]},"p":{"a":1,"k":[{"i":{"x":0.31,"y":1},"o":{"x":0.333,"y":0},"t":140,"s":[79.216,181.16,0],"to":[-5.74,-132.756,0],"ti":[61.583,-132.25,0]},{"t":164,"s":[-73.147,-117.158,0]}]},"a":{"a":0,"k":[-83.624,-156.062,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.578,-3.816],[-9.017,0],[-6.49,2.864]],"o":[[6.468,2.824],[9.088,0],[1.46,-3.79]],"v":[[-107.364,-146.212],[-83.607,-141.692],[-59.697,-146.277]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-19.441,0],[4.837,4.277],[13.472,0],[4.177,-3.694]],"o":[[20.226,0],[-4.177,-3.694],[-13.472,0],[-4.837,4.277]],"v":[[-83.639,-130.843],[-60.016,-154.965],[-83.639,-153.158],[-107.261,-154.965]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.623,-1.999],[-5.025,0],[-0.923,2.113],[6.299,0]],"o":[[1.033,1.272],[5.025,0],[0.74,-1.694],[-6.707,0]],"v":[[-77.895,-163.765],[-68.797,-164.823],[-59.698,-163.765],[-68.797,-170.064]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.623,-1.999],[5.025,0],[0.923,2.113],[-6.299,0]],"o":[[-1.033,1.272],[-5.025,0],[-0.74,-1.694],[6.707,0]],"v":[[-89.836,-163.765],[-98.934,-164.823],[-108.033,-163.765],[-98.934,-170.064]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-21.673],[21.673,0],[0,21.673],[-21.673,0]],"o":[[0,21.673],[-21.673,0],[0,-21.673],[21.673,0]],"v":[[-44.382,-156.062],[-83.624,-116.82],[-122.866,-156.062],[-83.624,-195.304]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.980392216701,0.564705882353,0.086274509804,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7.5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.831372608858,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false}],"ip":144,"op":152,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"msg","parent":18,"sr":1,"ks":{"p":{"a":0,"k":[15.576,-10.738,0]},"a":{"a":0,"k":[-1541.184,1009.518,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-19.665,0],[12.415,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1513.76,1000.998]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[1.366,0],[20.134,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1528.516,1018.038]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-5.558,0],[20.558,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1564.215,1018.038]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-14.344,0],[3.094,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1555.429,1000.998]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"msg","parent":18,"sr":1,"ks":{"p":{"a":0,"k":[-44.199,-10.205,0]},"s":{"a":0,"k":[118.443,118.443,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[0.473663150563,0.725567267923,0.489048647413,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.647058823529,0.141176470588,0.917647058824,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"fl","c":{"a":0,"k":[0.647058844566,0.141176477075,0.917647063732,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"msg","parent":12,"sr":1,"ks":{"p":{"a":0,"k":[1.573,15.417,0]},"a":{"a":0,"k":[-298.846,-251.295,0]},"s":{"a":0,"k":[99.557,99.557,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-301.221,-260.093],[-296.75,-261.047],[-298.241,-258.185]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.929411768913,0.117647059262,0.474509805441,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.303,-2.018],[1.435,-0.215],[0.303,2.018],[-1.435,0.215]],"o":[[0.303,2.018],[-1.435,0.215],[-0.303,-2.018],[1.435,-0.215]],"v":[[-289.686,-263.866],[-291.736,-259.822],[-294.882,-263.087],[-292.832,-267.131]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.303,-2.018],[1.435,-0.215],[0.303,2.018],[-1.435,0.215]],"o":[[0.303,2.018],[-1.435,0.215],[-0.303,-2.018],[1.435,-0.215]],"v":[[-303.31,-261.284],[-305.36,-257.24],[-308.506,-260.505],[-306.456,-264.549]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-2.273,5.33],[1.828,2.614],[0.157,-0.533],[0.286,-1.203],[0,0],[1.452,1.277],[0.079,-0.54],[-0.305,-3.913],[-4.174,0]],"o":[[-2.042,-6.245],[-0.318,-0.455],[-0.372,1.264],[-3.961,0.523],[0,0],[-0.41,-0.361],[-0.747,5.096],[2.707,2.764],[6.161,0]],"v":[[-286.479,-260.363],[-292.921,-275.22],[-294.118,-275.029],[-294.888,-271.227],[-306.92,-269.209],[-309.643,-272.215],[-310.774,-271.808],[-310.848,-255.779],[-300.199,-251.295]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.874478448606,0.874478448606,0.874478448606,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"msg","parent":18,"sr":1,"ks":{"p":{"a":0,"k":[-44.199,-10.205,0]},"s":{"a":0,"k":[118.443,118.443,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0]],"o":[[0,0]],"v":[[21.706,6.289]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.473663150563,0.725567267923,0.489048647413,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.647058823529,0.141176470588,0.917647058824,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-8.235],[8.235,0],[0,8.235],[-8.235,0]],"o":[[0,8.235],[-8.235,0],[0,-8.235],[8.235,0]],"v":[[14.91,0],[0,14.91],[-14.91,0],[0,-14.91]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.647058844566,0.141176477075,0.917647063732,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"m27","parent":15,"sr":1,"ks":{"p":{"a":0,"k":[15.576,-10.738,0]},"a":{"a":0,"k":[-1541.184,1009.518,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-6.79,0],[6.79,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1513.76,1000.998]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-8.009,0],[8.009,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1528.516,1018.038]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-11.183,0],[11.183,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1564.215,1018.038]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-19.969,0],[19.969,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1555.429,1000.998]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false}],"ip":208,"op":230,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"m26","parent":15,"sr":1,"ks":{"p":{"a":0,"k":[-44.199,-10.205,0]},"s":{"a":0,"k":[118.064,118.064,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-8.235],[8.235,0],[0,8.235],[-8.235,0]],"o":[[0,8.235],[-8.235,0],[0,-8.235],[8.235,0]],"v":[[14.91,0],[0,14.91],[-14.91,0],[0,-14.91]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.460586128983,0.860314223346,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":208,"op":230,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"msg9","parent":58,"sr":1,"ks":{"r":{"a":0,"k":-0.506},"p":{"a":0,"k":[-0.063,0.217,0]},"s":{"a":0,"k":[99.529,100.515,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[5.671,0],[0,0],[0,-5.671],[0,0],[-5.671,0],[0,0],[0,5.671],[0,0]],"o":[[0,0],[-5.671,0],[0,0],[0,5.671],[0,0],[5.671,0],[0,0],[0,-5.671]],"v":[[62.304,-38.695],[-62.304,-38.695],[-72.572,-28.427],[-72.572,7.217],[-62.304,17.485],[62.304,17.485],[72.572,7.217],[72.572,-28.427]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.560784339905,0.729411780834,0.858823537827,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":208,"op":230,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"wing_bl 5","parent":52,"sr":1,"ks":{"r":{"a":0,"k":-172.417},"p":{"a":0,"k":[-54.755,-111.892,0]},"s":{"a":0,"k":[-100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":228,"s":[{"i":[[-16.004,6.98],[7.91,-5.364]],"o":[[-4.203,10.616],[-6.714,4.554]],"v":[[-10.271,-37.701],[-32.313,-7.7]],"c":false}]},{"t":238,"s":[{"i":[[-16.004,6.98],[2.258,-12.51]],"o":[[7.913,17.033],[-1.441,7.984]],"v":[[0.289,-31.284],[6.431,20.145]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.988235294118,0.933333333333,0.129411764706,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":228,"s":[5]},{"t":240,"s":[5]}]},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":228,"s":[100]},{"t":240,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":228,"op":300,"st":114,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"wing_r 4","parent":52,"sr":1,"ks":{"p":{"a":0,"k":[-58.809,-56.332,0]},"a":{"a":0,"k":[-58.809,-56.332,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":228,"s":[{"i":[[0,0],[-14.208,10.399],[8.048,-43.787]],"o":[[23.947,-67.347],[16.217,-11.869],[0,0]],"v":[[-107.655,-60.291],[-124.624,-170.638],[-28.424,-47.103]],"c":false}]},{"t":238,"s":[{"i":[[0,0],[-16.835,-6.508],[8.048,-43.787]],"o":[[61.001,-10.743],[24.823,9.596],[0,0]],"v":[[-107.655,-60.291],[-51.062,-162.155],[-27.184,-51.097]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.980392158031,0.564705908298,0.086274512112,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.835294127464,0.152941182256,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":0,"k":23},"e":{"a":0,"k":66},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":228,"op":300,"st":114,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Layer 27","parent":4,"sr":1,"ks":{"r":{"a":0,"k":-0.407},"p":{"a":0,"k":[-11.331,19.357,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[5.671,0],[0,0],[0,-5.671],[0,0],[-5.671,0],[0,0],[0,5.671],[0,0]],"o":[[0,0],[-5.671,0],[0,0],[0,5.671],[0,0],[5.671,0],[0,0],[0,-5.671]],"v":[[62.304,-38.695],[-62.304,-38.695],[-72.572,-28.427],[-72.572,7.217],[-62.304,17.485],[62.304,17.485],[72.572,7.217],[72.572,-28.427]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.473663150563,0.725567267923,0.489048647413,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":266,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"suit","parent":25,"sr":1,"ks":{"p":{"a":0,"k":[-108.873,19.402,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,4.834],[0,0]],"o":[[0,0],[-5.684,-2.682],[0,0],[0,0]],"v":[[25.795,23.042],[-19.085,7.477],[-25.795,-2.296],[-25.795,-23.042]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.04705882445,0.929411768913,0.04705882445,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"suit","parent":25,"sr":1,"ks":{"p":{"a":0,"k":[131.536,7.255,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[2.814,-0.435]],"o":[[0,0],[0,8.556],[0,0]],"v":[[3.17,-14.661],[3.146,5.131],[-3.17,14.661]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.04705882445,0.929411768913,0.04705882445,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"suit","parent":25,"sr":1,"ks":{"p":{"a":0,"k":[107.847,8.546,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,27.019],[0,-27.019]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.423529411765,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7},"lc":2,"lj":2,"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":6}},{"n":"g","nm":"gap","v":{"a":0,"k":12}},{"n":"o","nm":"offset","v":{"a":0,"k":0}}],"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"suit","parent":25,"sr":1,"ks":{"p":{"a":0,"k":[-19.938,27.88,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,27.019],[0,-27.019]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.423529411765,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7},"lc":2,"lj":2,"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":6}},{"n":"g","nm":"gap","v":{"a":0,"k":12}},{"n":"o","nm":"offset","v":{"a":0,"k":0}}],"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"suit","parent":25,"sr":1,"ks":{"p":{"a":0,"k":[55.74,34.104,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0.913,0],[0,8.399],[0,0],[-2.481,0.416],[0,0],[-0.255,0],[0,-2.447],[0,0],[-1.163,0],[-0.152,0.025],[0,0],[0,1.67],[0,0],[-2.482,0.416],[0,0],[-0.255,0],[0,-2.447],[0,0],[9.11,-1.525],[0,0]],"o":[[-8.213,0],[0,0],[0,-2.512],[0,0],[0.268,-0.045],[2.413,0],[0,0],[0,1.225],[0.146,0],[0,0],[1.654,-0.276],[0,0],[0,-2.512],[0,0],[0.268,-0.045],[2.413,0],[0,0],[0,9.213],[0,0],[-0.929,0.155]],"v":[[-20.989,23.87],[-35.396,9.136],[-35.396,-8.321],[-30.971,-13.542],[-27.049,-14.199],[-26.265,-14.265],[-21.962,-9.901],[-21.962,4.072],[-20.018,6.12],[-19.57,6.082],[18.91,-0.362],[21.962,-3.953],[21.962,-17.927],[26.388,-23.147],[30.31,-23.805],[31.094,-23.87],[35.396,-19.507],[35.396,-2.05],[18.875,17.424],[-18.214,23.636]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.439215689898,0.439215689898,0.439215689898,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.678431391716,0.678431391716,0.678431391716,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":"suit","parent":25,"sr":1,"ks":{"p":{"a":0,"k":[53.683,32.356,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0.742,0.624],[1.061,0],[0.268,-0.045],[0,0],[0,-2.512],[0,0],[1.654,-0.276],[0,0],[0,0],[0.563,0.735],[0.742,0.624],[1.061,0],[0.268,-0.045],[0,0],[0,-2.512],[0,0],[-4.412,-2.461],[-4.647,0],[-0.929,0.155],[0,0],[0,9.213],[0,0],[0.565,0.735]],"o":[[-0.742,-0.624],[-0.255,0],[0,0],[-2.482,0.416],[0,0],[0,1.67],[0,0],[0,0],[0,-1.025],[-0.761,-0.994],[-0.742,-0.624],[-0.255,0],[0,0],[-2.481,0.416],[0,0],[0,5.709],[2.598,3.282],[0.913,0],[0,0],[9.11,-1.525],[0,0],[0,-1.026],[-0.761,-0.992]],"v":[[31.8,-24.623],[29.037,-25.618],[28.253,-25.553],[24.331,-24.896],[19.905,-19.675],[19.905,-5.701],[16.853,-2.11],[-19.905,4.045],[-19.905,-8.153],[-20.8,-10.842],[-25.559,-15.018],[-28.321,-16.013],[-29.106,-15.947],[-33.027,-15.29],[-37.453,-10.069],[-37.453,7.388],[-30.175,20.306],[-18.932,25.618],[-16.158,25.384],[20.932,19.172],[37.453,-0.302],[37.453,-17.759],[36.556,-20.451]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.439215689898,0.439215689898,0.439215689898,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":8},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.439215689898,0.439215689898,0.439215689898,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":25,"ty":4,"nm":"suit","parent":4,"sr":1,"ks":{"p":{"a":0,"k":[85.164,238.571,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[18.477,-2.926],[40.473,-6.651],[10.69,2.723],[0,0],[0.365,5.001],[-0.262,-1.005],[0,0],[0,0],[-8.717,-3.989],[0,0],[-15.65,2.413],[0,0],[0,12.053]],"o":[[0,0],[0.191,-1.658],[-27.035,4.281],[-32.424,5.328],[0,0],[-5.844,-3.671],[-1.293,0.943],[0,0],[0,0],[0,9.793],[0,0],[10.845,3.761],[0,0],[9.158,-1.412],[0,0]],"v":[[144.732,-28.907],[144.714,-28.907],[130.55,-22.751],[-22.958,0.931],[-83.425,-1.193],[-132.641,-18.549],[-143.1,-27.721],[-144.668,-24.773],[-144.668,-24.773],[-144.668,17.106],[-131.71,36.161],[-79.551,54.251],[-31.576,56.693],[129.89,31.799],[144.683,12.398]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.001470178366,0.422209855622,0.001470178366,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.752941191196,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":26,"ty":4,"nm":"suit","parent":4,"sr":1,"ks":{"r":{"a":0,"k":-16.345},"p":{"a":0,"k":[-0.085,213.581,0]},"a":{"a":0,"k":[-134.264,161.98,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.115,-1.142],[1.394,-0.242],[0.115,1.142],[-1.394,0.242]],"o":[[0.115,1.142],[-1.394,0.242],[-0.115,-1.142],[1.394,-0.242]],"v":[[-117.199,153.768],[-119.514,156.273],[-122.246,154.644],[-119.931,152.139]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.115,-1.142],[1.394,-0.242],[0.115,1.142],[-1.394,0.242]],"o":[[0.115,1.142],[-1.394,0.242],[-0.115,-1.142],[1.394,-0.242]],"v":[[-141.272,156.574],[-143.587,159.079],[-146.319,157.449],[-144.004,154.944]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-109.809,153.049],[-117.566,155.362]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-152.472,157.422],[-144.202,158.092]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0.751,-0.664],[0,0],[-0.95,-0.49],[0,0],[-0.751,0.664],[0,0],[0.95,0.49],[0,0]],"o":[[0,0],[-0.751,0.664],[0,0],[0.95,0.49],[0,0],[0.751,-0.664],[0,0],[-0.95,-0.49]],"v":[[-131.697,162.903],[-135.295,166.083],[-134.935,168.173],[-130.386,170.518],[-127.305,170.202],[-123.707,167.022],[-124.067,164.932],[-128.617,162.587]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.945098042488,0.352941185236,0.141176477075,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.638,-3.707],[3.062,-0.314],[0.638,3.707],[-3.062,0.314]],"o":[[0.638,3.707],[-3.062,0.314],[-0.638,-3.707],[3.062,-0.314]],"v":[[-113.302,156.443],[-117.69,163.724],[-124.389,157.58],[-120.002,150.299]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":4},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.638,-3.707],[3.062,-0.314],[0.638,3.707],[-3.062,0.314]],"o":[[0.638,3.707],[-3.062,0.314],[-0.638,-3.707],[3.062,-0.314]],"v":[[-137.478,158.921],[-141.865,166.202],[-148.564,160.057],[-144.177,152.777]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":4},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 7","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[2.724,0.432],[-0.46,-1.07],[0,0],[-0.767,0.687],[0,0],[0,0],[0.298,1.077],[0,0],[0.859,-0.622]],"o":[[-3.586,-1.037],[-1.16,-0.184],[0,0],[0.426,0.991],[0,0],[0,0],[1.11,0.272],[0,0],[-0.292,-1.056],[0,0]],"v":[[-136.574,137.954],[-147.287,135.703],[-148.837,137.671],[-145.239,146.032],[-142.755,146.663],[-135.406,140.082],[-125.53,142.499],[-123.773,140.758],[-125.934,132.936],[-128.378,132.015]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.607843137255,0.878431372549,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":4},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.607843160629,0.878431379795,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 8","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-4.308,-12.946],[13.322,-2.995],[4.308,12.946],[-13.322,2.995]],"o":[[4.308,12.946],[-13.322,2.995],[-4.308,-12.946],[13.322,-2.995]],"v":[[-106.505,156.539],[-125.068,180.315],[-154.747,167.386],[-138.426,138.522]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.831372559071,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 9","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[14.678,-0.956],[1.796,-5.903],[0,0]],"o":[[-17.964,1.169],[13.73,-2.31],[-7.827,-18.221]],"v":[[-127.893,174.295],[-152.915,198.291],[-96.712,194.826]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.831372559071,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 10","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-106.6,127.209],[-92.464,197.283],[-155.352,200.784]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.726274677351,0.599050304936,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":44},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.672,0.093],[0,0]],"o":[[0,0],[-0.331,-1.642],[0,0],[0,0]],"v":[[-161.021,200.784],[-175.839,127.331],[-173.297,124.042],[-107.753,120.393]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.992156863213,0.713725507259,0.584313750267,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":44},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-89.227,199.741],[-157.941,203.566],[-173.387,127],[-104.673,123.175]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.709803938866,0.505882382393,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":15},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.831372559071,0.078431375325,0.352941185236,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 6","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-89.227,199.741],[-157.941,203.566],[-173.387,127],[-104.673,123.175]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.561199592142,0.276337687174,0.162392889285,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":26},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-136.306,188.315],[-179.301,190.709],[-164.733,146.6],[-134.252,144.207]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.709803938866,0.505882382393,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.992156863213,0.713725507259,0.584313750267,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":27,"ty":4,"nm":"m13","parent":29,"sr":1,"ks":{"p":{"a":0,"k":[15.576,-10.738,0]},"a":{"a":0,"k":[-1541.184,1009.518,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-23.79,0],[6.79,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1513.76,1000.998]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1528.516,1018.038]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-11.183,0],[27.183,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1564.215,1018.038]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-19.969,0],[2.969,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1555.429,1000.998]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":28,"ty":4,"nm":"m12","parent":29,"sr":1,"ks":{"p":{"a":0,"k":[-44.199,-10.205,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-8.235],[8.235,0],[0,8.235],[-8.235,0]],"o":[[0,8.235],[-8.235,0],[0,-8.235],[8.235,0]],"v":[[14.91,0],[0,14.91],[-14.91,0],[0,-14.91]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.417009091845,0.917647058824,0.141176470588,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":29,"ty":4,"nm":"msg1","parent":4,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":74,"s":[-24.547]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":98,"s":[73.158]},{"t":112,"s":[4.609]}]},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":74,"s":[95.669,228.857,0],"to":[-16.439,-53.534,0],"ti":[49.354,29.091,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.8,"y":0},"t":98,"s":[49.305,-54.714,0],"to":[-21.676,-12.777,0],"ti":[27.888,-61.96,0]},{"t":112,"s":[-36.331,12.357,0]}]},"s":{"a":1,"k":[{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":74,"s":[100,80,100]},{"t":98,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[5.671,0],[0,0],[0,-5.671],[0,0],[-5.671,0],[0,0],[0,5.671],[0,0]],"o":[[0,0],[-5.671,0],[0,0],[0,5.671],[0,0],[5.671,0],[0,0],[0,-5.671]],"v":[[62.304,-38.695],[-62.304,-38.695],[-72.572,-28.427],[-72.572,7.217],[-62.304,17.485],[62.304,17.485],[72.572,7.217],[72.572,-28.427]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.560784339905,0.729411780834,0.858823537827,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":30,"ty":4,"nm":"m21","parent":32,"sr":1,"ks":{"p":{"a":0,"k":[15.576,-10.738,0]},"a":{"a":0,"k":[-1541.184,1009.518,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-23.79,0],[6.79,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1513.76,1000.998]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1528.516,1018.038]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-11.183,0],[27.183,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1564.215,1018.038]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-19.969,0],[2.969,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1555.429,1000.998]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":31,"ty":4,"nm":"m20","parent":32,"sr":1,"ks":{"p":{"a":0,"k":[-44.199,-10.205,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-8.235],[8.235,0],[0,8.235],[-8.235,0]],"o":[[0,8.235],[-8.235,0],[0,-8.235],[8.235,0]],"v":[[14.91,0],[0,14.91],[-14.91,0],[0,-14.91]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.417009091845,0.917647058824,0.141176470588,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":32,"ty":4,"nm":"msg6","sr":1,"ks":{"r":{"a":0,"k":-24.547},"p":{"a":0,"k":[286.24,438.256,0]},"s":{"a":0,"k":[100,80,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[5.671,0],[0,0],[0,-5.671],[0,0],[-5.671,0],[0,0],[0,5.671],[0,0]],"o":[[0,0],[-5.671,0],[0,0],[0,5.671],[0,0],[5.671,0],[0,0],[0,-5.671]],"v":[[62.304,-38.695],[-62.304,-38.695],[-72.572,-28.427],[-72.572,7.217],[-62.304,17.485],[62.304,17.485],[72.572,7.217],[72.572,-28.427]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.560784339905,0.729411780834,0.858823537827,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":33,"ty":4,"nm":"emj","parent":4,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.926],"y":[0]},"t":150,"s":[-24.547]},{"i":{"x":[0.31],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":180,"s":[360]},{"i":{"x":[0.77],"y":[1]},"o":{"x":[0.69],"y":[0]},"t":190,"s":[360]},{"t":206,"s":[380]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":150,"s":[122.349,201.429,0],"to":[43.26,-236.756,0],"ti":[76.083,-116.25,0]},{"t":180,"s":[-40.151,-118.571,0],"h":1},{"i":{"x":0.77,"y":1},"o":{"x":0.69,"y":0},"t":190,"s":[-40.151,-118.571,0],"to":[3.917,0.25,0],"ti":[-0.833,0,0]},{"t":206,"s":[-10.151,-118.571,0]}]},"a":{"a":0,"k":[-190.48,-156.062,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":176,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":184,"s":[105,95,100]},{"t":192,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0.733,1.838],[8.598,-3.023],[-2.25,0.196],[-3.256,-3.92]],"o":[[-1.86,-4.663],[-2.932,1.031],[4.938,-0.43],[1.216,1.465]],"v":[[-160.417,-168.366],[-177.721,-175.9],[-177.983,-173.095],[-162.057,-167.193]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.901,1.761],[-8.279,-3.81],[2.222,0.404],[3.606,-3.6]],"o":[[2.286,-4.47],[2.823,1.299],[-4.876,-0.887],[-1.347,1.345]],"v":[[-220.441,-162.582],[-202.511,-168.474],[-202.511,-165.657],[-218.918,-161.261]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-11.886,0],[3.505,2.54],[9.762,0],[3.027,-2.193]],"o":[[12.241,0],[-3.027,-2.193],[-9.762,0],[-3.505,2.54]],"v":[[-189.813,-127.788],[-172.695,-142.112],[-189.813,-136.474],[-206.93,-142.112]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.623,-1.999],[5.025,0],[0.923,2.113],[-6.299,0]],"o":[[-1.033,1.272],[-5.025,0],[-0.74,-1.694],[6.707,0]],"v":[[-196.014,-153.33],[-205.112,-154.388],[-214.211,-153.33],[-205.112,-159.629]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-3.944],[3.944,0],[0,3.944],[-3.944,0]],"o":[[0,3.944],[-3.944,0],[0,-3.944],[3.944,0]],"v":[[-167.163,-157.028],[-174.305,-149.886],[-181.447,-157.028],[-174.305,-164.17]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-21.673],[21.673,0],[0,21.673],[-21.673,0]],"o":[[0,21.673],[-21.673,0],[0,-21.673],[21.673,0]],"v":[[-151.238,-156.062],[-190.48,-116.82],[-229.722,-156.062],[-190.48,-195.304]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.632885203642,0.209849892411,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7.5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.996139705882,1,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":150,"op":300,"st":0,"bm":0},{"ddd":0,"ind":34,"ty":4,"nm":"emj","parent":4,"sr":1,"ks":{"r":{"a":0,"k":-24.547},"p":{"a":0,"k":[122.349,201.429,0]},"a":{"a":0,"k":[-190.48,-156.062,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0.733,1.838],[8.598,-3.023],[-2.25,0.196],[-3.256,-3.92]],"o":[[-1.86,-4.663],[-2.932,1.031],[4.938,-0.43],[1.216,1.465]],"v":[[-160.417,-168.366],[-177.721,-175.9],[-177.983,-173.095],[-162.057,-167.193]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.901,1.761],[-8.279,-3.81],[2.222,0.404],[3.606,-3.6]],"o":[[2.286,-4.47],[2.823,1.299],[-4.876,-0.887],[-1.347,1.345]],"v":[[-220.441,-162.582],[-202.511,-168.474],[-202.511,-165.657],[-218.918,-161.261]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-11.886,0],[3.505,2.54],[9.762,0],[3.027,-2.193]],"o":[[12.241,0],[-3.027,-2.193],[-9.762,0],[-3.505,2.54]],"v":[[-189.813,-127.788],[-172.695,-142.112],[-189.813,-136.474],[-206.93,-142.112]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.623,-1.999],[5.025,0],[0.923,2.113],[-6.299,0]],"o":[[-1.033,1.272],[-5.025,0],[-0.74,-1.694],[6.707,0]],"v":[[-196.014,-153.33],[-205.112,-154.388],[-214.211,-153.33],[-205.112,-159.629]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-3.944],[3.944,0],[0,3.944],[-3.944,0]],"o":[[0,3.944],[-3.944,0],[0,-3.944],[3.944,0]],"v":[[-167.163,-157.028],[-174.305,-149.886],[-181.447,-157.028],[-174.305,-164.17]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-21.673],[21.673,0],[0,21.673],[-21.673,0]],"o":[[0,21.673],[-21.673,0],[0,-21.673],[21.673,0]],"v":[[-151.238,-156.062],[-190.48,-116.82],[-229.722,-156.062],[-190.48,-195.304]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.63137254902,0.211764720842,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7.5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.996078431373,1,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":35,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"p":{"a":0,"k":[306,256,0]}},"ao":0,"shapes":[],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":36,"ty":4,"nm":"emj","parent":4,"sr":1,"ks":{"r":{"a":0,"k":23.438},"p":{"a":0,"k":[-108.195,-118.461,0]},"a":{"a":0,"k":[-83.624,-156.062,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-14.641,0],[3.643,2.878],[10.146,0],[3.146,-2.485]],"o":[[15.233,0],[-3.146,-2.485],[-10.146,0],[-3.643,2.878]],"v":[[-83.639,-135.393],[-65.848,-151.623],[-83.639,-150.407],[-101.429,-151.623]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.623,-1.999],[-5.025,0],[-0.923,2.113],[6.299,0]],"o":[[1.033,1.272],[5.025,0],[0.74,-1.694],[-6.707,0]],"v":[[-77.895,-163.765],[-68.582,-160.556],[-59.698,-163.765],[-68.797,-170.064]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.623,-1.999],[5.025,0],[0.923,2.113],[-6.299,0]],"o":[[-1.033,1.272],[-5.025,0],[-0.74,-1.694],[6.707,0]],"v":[[-89.836,-163.765],[-99.217,-161.703],[-108.033,-163.765],[-98.934,-170.064]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.371,5.792],[-14.488,0],[0,-21.673],[21.673,0],[3.623,1.104]],"o":[[6.798,-11.68],[21.673,0],[0,21.673],[-3.985,0],[-16.085,-4.901]],"v":[[-117.564,-175.773],[-83.624,-195.304],[-44.382,-156.062],[-83.624,-116.82],[-95.078,-118.518]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.63137254902,0.211764705882,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7.5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.996078431373,1,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":37,"ty":4,"nm":"emj","parent":4,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.31],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":140,"s":[-24.547]},{"t":164,"s":[-8.934]}]},"p":{"a":1,"k":[{"i":{"x":0.31,"y":1},"o":{"x":0.333,"y":0},"t":140,"s":[79.216,181.16,0],"to":[-5.74,-132.756,0],"ti":[61.583,-132.25,0]},{"t":164,"s":[-73.147,-117.158,0]}]},"a":{"a":0,"k":[-83.624,-156.062,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":162,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":170,"s":[105,95,100]},{"t":178,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.578,-3.816],[-9.017,0],[-6.49,2.864]],"o":[[6.468,2.824],[9.088,0],[1.46,-3.79]],"v":[[-107.364,-146.212],[-83.607,-141.692],[-59.697,-146.277]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-19.441,0],[4.837,4.277],[13.472,0],[4.177,-3.694]],"o":[[20.226,0],[-4.177,-3.694],[-13.472,0],[-4.837,4.277]],"v":[[-83.639,-130.843],[-60.016,-154.965],[-83.639,-153.158],[-107.261,-154.965]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.623,-1.999],[-5.025,0],[-0.923,2.113],[6.299,0]],"o":[[1.033,1.272],[5.025,0],[0.74,-1.694],[-6.707,0]],"v":[[-77.895,-163.765],[-68.797,-164.823],[-59.698,-163.765],[-68.797,-170.064]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.623,-1.999],[5.025,0],[0.923,2.113],[-6.299,0]],"o":[[-1.033,1.272],[-5.025,0],[-0.74,-1.694],[6.707,0]],"v":[[-89.836,-163.765],[-98.934,-164.823],[-108.033,-163.765],[-98.934,-170.064]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-21.673],[21.673,0],[0,21.673],[-21.673,0]],"o":[[0,21.673],[-21.673,0],[0,-21.673],[21.673,0]],"v":[[-44.382,-156.062],[-83.624,-116.82],[-122.866,-156.062],[-83.624,-195.304]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.980392216701,0.564705882353,0.086274509804,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7.5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.831372608858,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false}],"ip":152,"op":300,"st":0,"bm":0},{"ddd":0,"ind":38,"ty":4,"nm":"emj","parent":4,"sr":1,"ks":{"r":{"a":0,"k":-24.547},"p":{"a":0,"k":[79.216,181.16,0]},"a":{"a":0,"k":[-83.624,-156.062,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.578,-3.816],[-9.017,0],[-6.49,2.864]],"o":[[6.468,2.824],[9.088,0],[1.46,-3.79]],"v":[[-107.364,-146.212],[-83.607,-141.692],[-59.697,-146.277]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-19.441,0],[4.837,4.277],[13.472,0],[4.177,-3.694]],"o":[[20.226,0],[-4.177,-3.694],[-13.472,0],[-4.837,4.277]],"v":[[-83.639,-130.843],[-60.016,-154.965],[-83.639,-153.158],[-107.261,-154.965]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.623,-1.999],[-5.025,0],[-0.923,2.113],[6.299,0]],"o":[[1.033,1.272],[5.025,0],[0.74,-1.694],[-6.707,0]],"v":[[-77.895,-163.765],[-68.797,-164.823],[-59.698,-163.765],[-68.797,-170.064]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.623,-1.999],[5.025,0],[0.923,2.113],[-6.299,0]],"o":[[-1.033,1.272],[-5.025,0],[-0.74,-1.694],[6.707,0]],"v":[[-89.836,-163.765],[-98.934,-164.823],[-108.033,-163.765],[-98.934,-170.064]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-21.673],[21.673,0],[0,21.673],[-21.673,0]],"o":[[0,21.673],[-21.673,0],[0,-21.673],[21.673,0]],"v":[[-44.382,-156.062],[-83.624,-116.82],[-122.866,-156.062],[-83.624,-195.304]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.545098039216,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7.5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.831372608858,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":39,"ty":4,"nm":"m28","parent":40,"sr":1,"ks":{"p":{"a":0,"k":[-44.199,-10.205,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-8.235],[8.235,0],[0,8.235],[-8.235,0]],"o":[[0,8.235],[-8.235,0],[0,-8.235],[8.235,0]],"v":[[14.91,0],[0,14.91],[-14.91,0],[0,-14.91]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.417009091845,0.917647058824,0.141176470588,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":40,"ty":4,"nm":"msg4","parent":4,"sr":1,"ks":{"r":{"a":0,"k":4.609},"p":{"a":0,"k":[-36.331,12.357,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[5.671,0],[0,0],[0,-5.671],[0,0],[-5.671,0],[0,0],[0,5.671],[0,0]],"o":[[0,0],[-5.671,0],[0,0],[0,5.671],[0,0],[5.671,0],[0,0],[0,-5.671]],"v":[[62.304,-38.695],[-62.304,-38.695],[-72.572,-28.427],[-72.572,7.217],[-62.304,17.485],[62.304,17.485],[72.572,7.217],[72.572,-28.427]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.560784339905,0.729411780834,0.858823537827,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":41,"ty":4,"nm":"mouth","parent":43,"sr":1,"ks":{"p":{"a":0,"k":[237.401,247.552,0]},"a":{"a":0,"k":[237.401,247.552,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":60,"s":[{"i":[[-14.406,5.064],[11.992,11.496],[-19.628,-0.664]],"o":[[-41.827,17.295],[8.78,3.704],[30.289,1.024]],"v":[[44.104,-3.034],[-79.426,-0.631],[-33.101,9.454]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":74,"s":[{"i":[[-13.668,3.573],[11.377,8.112],[-18.622,-0.468]],"o":[[-39.682,12.204],[8.33,2.614],[28.736,0.723]],"v":[[49.75,-0.298],[-67.448,1.397],[-23.497,8.514]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":86,"s":[{"i":[[-13.668,3.573],[11.377,8.112],[-18.622,-0.468]],"o":[[-39.682,12.204],[8.33,2.614],[28.736,0.723]],"v":[[49.75,-0.298],[-67.448,1.397],[-23.497,8.514]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":98,"s":[{"i":[[-13.967,3.573],[11.626,8.112],[-19.029,-0.468]],"o":[[-40.55,12.204],[8.512,2.614],[29.364,0.723]],"v":[[44.488,-3.059],[-75.272,-1.363],[-30.361,5.754]],"c":true}]},{"i":{"x":0.11,"y":1},"o":{"x":0.333,"y":0},"t":118,"s":[{"i":[[-13.967,3.573],[11.626,8.112],[-19.029,-0.468]],"o":[[-40.55,12.204],[8.512,2.614],[29.364,0.723]],"v":[[44.488,-3.059],[-75.272,-1.363],[-30.361,5.754]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.89,"y":0},"t":144,"s":[{"i":[[-13.668,4.916],[11.377,11.159],[-18.622,-0.644]],"o":[[-39.682,16.788],[8.33,3.596],[28.736,0.994]],"v":[[49.399,-3.034],[-67.799,-0.701],[-23.848,9.089]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":152,"s":[{"i":[[-13.668,4.916],[11.377,11.159],[-18.622,-0.644]],"o":[[-39.682,16.788],[8.33,3.596],[28.736,0.994]],"v":[[49.399,-3.034],[-67.799,-0.701],[-23.848,9.089]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":162,"s":[{"i":[[-14.74,3.991],[11.115,12.346],[-19.526,-2.105]],"o":[[-42.985,14.173],[8.484,4.34],[30.131,3.248]],"v":[[43.975,6.008],[-79.398,-0.678],[-33.939,12.786]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":188,"s":[{"i":[[-14.74,3.991],[11.115,12.346],[-19.526,-2.105]],"o":[[-42.985,14.173],[8.484,4.34],[30.131,3.248]],"v":[[43.975,6.008],[-79.398,-0.678],[-33.939,12.786]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":204,"s":[{"i":[[-14.406,5.064],[11.992,11.496],[-19.628,-0.664]],"o":[[-41.827,17.295],[8.78,3.704],[30.289,1.024]],"v":[[44.104,-3.034],[-79.426,-0.631],[-33.101,9.454]],"c":true}]},{"t":230,"s":[{"i":[[-14.406,5.064],[11.992,11.496],[-19.628,-0.664]],"o":[[-41.827,17.295],[8.78,3.704],[30.289,1.024]],"v":[[44.104,-3.034],[-79.426,-0.631],[-33.101,9.454]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.490196079016,0.035294119269,0.035294119269,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[237.401,247.552]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"fl","c":{"a":0,"k":[0.490196078431,0.035294117647,0.035294117647,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false}],"ip":0,"op":300,"st":114,"bm":0},{"ddd":0,"ind":42,"ty":4,"nm":"beak_bl","parent":41,"sr":1,"ks":{"r":{"a":0,"k":-26.335},"p":{"a":0,"k":[211.876,216.495,0]},"a":{"a":0,"k":[35.051,-0.937,0]},"s":{"a":0,"k":[-100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":60,"s":[{"i":[[0,0],[9.529,12.852]],"o":[[-9.767,3.378],[0,0]],"v":[[35.498,-14.31],[-3.543,-34.996]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":74,"s":[{"i":[[0,0],[9.529,12.852]],"o":[[-9.767,3.378],[0,0]],"v":[[32.888,-13.714],[-7.072,-32.301]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":86,"s":[{"i":[[0,0],[9.529,12.852]],"o":[[-9.767,3.378],[0,0]],"v":[[32.888,-13.714],[-7.072,-32.301]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":98,"s":[{"i":[[0,0],[9.529,12.852]],"o":[[-10.575,1.56],[0,0]],"v":[[31.846,-15.21],[-9.151,-31.298]],"c":false}]},{"i":{"x":0.11,"y":1},"o":{"x":0.333,"y":0},"t":118,"s":[{"i":[[0,0],[9.529,12.852]],"o":[[-10.575,1.56],[0,0]],"v":[[31.846,-15.21],[-9.151,-31.298]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.89,"y":0},"t":144,"s":[{"i":[[0,0],[9.529,12.852]],"o":[[-9.767,3.378],[0,0]],"v":[[35.498,-14.31],[-3.543,-34.996]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":152,"s":[{"i":[[0,0],[9.529,12.852]],"o":[[-9.767,3.378],[0,0]],"v":[[35.498,-14.31],[-3.543,-34.996]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":162,"s":[{"i":[[0,0],[9.529,12.852]],"o":[[-10.575,1.56],[0,0]],"v":[[31.846,-15.21],[-9.151,-31.298]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":188,"s":[{"i":[[0,0],[9.529,12.852]],"o":[[-10.575,1.56],[0,0]],"v":[[31.846,-15.21],[-9.151,-31.298]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":204,"s":[{"i":[[0,0],[9.529,12.852]],"o":[[-9.767,3.378],[0,0]],"v":[[35.498,-14.31],[-3.543,-34.996]],"c":false}]},{"t":230,"s":[{"i":[[0,0],[9.529,12.852]],"o":[[-9.767,3.378],[0,0]],"v":[[35.498,-14.31],[-3.543,-34.996]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.705882352941,0.517647058824,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[24.706,22.107]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":228,"s":[5]},{"t":240,"s":[0]}]},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[95]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":228,"s":[100]},{"t":240,"s":[95]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":0,"op":300,"st":124,"bm":0},{"ddd":0,"ind":43,"ty":4,"nm":"beak","parent":50,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[1.252]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":74,"s":[6.895]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":86,"s":[6.895]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":98,"s":[4.844]},{"i":{"x":[0.11],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":118,"s":[4.844]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.89],"y":[0]},"t":144,"s":[3.037]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":152,"s":[8.445]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":162,"s":[15.765]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":188,"s":[15.765]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[1.252]},{"t":230,"s":[1.252]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":60,"s":[-72.849,53.736,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":74,"s":[-56.801,63.014,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":86,"s":[-56.801,63.014,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":98,"s":[-85.992,41.664,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":118,"s":[-85.992,41.664,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":144,"s":[-63.352,95.288,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":152,"s":[-63.352,95.288,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":162,"s":[-86.64,-5.351,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":188,"s":[-86.64,-5.351,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":204,"s":[-72.849,53.736,0],"to":[0,0,0],"ti":[0,0,0]},{"t":230,"s":[-72.849,53.736,0]}]},"a":{"a":0,"k":[227.021,227.06,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":60,"s":[{"i":[[13.667,-1.115],[17.056,-0.373],[38.365,-2.028],[-6.649,-11.229],[-6.41,-3.253],[-32.636,14.5],[1.173,8.949]],"o":[[-39.27,3.204],[-20.031,0.403],[-15.118,0.953],[-7.719,5.894],[34.363,17.637],[10.394,-4.588],[-0.962,-8.435]],"v":[[53.62,-2.995],[1.921,-46.816],[-54.525,-0.174],[-71.056,18.934],[-67.488,37.524],[60.605,35.233],[75.517,11.594]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":74,"s":[{"i":[[13.739,0.037],[17.251,-3.073],[39.297,-2.513],[-0.476,-10.861],[-6.809,-2.405],[-33.199,9.861],[0.418,9.033]],"o":[[-39.477,-0.108],[-19.855,3.537],[-15.121,1.019],[0.476,10.861],[34.228,12.09],[10.939,-3.249],[-0.25,-8.502]],"v":[[56.422,-0.787],[-0.216,-46.139],[-48.254,0.979],[-68.21,21.526],[-56.424,39.141],[59.793,37.622],[76.671,15.277]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":86,"s":[{"i":[[13.739,0.037],[17.251,-3.073],[39.297,-2.513],[-0.476,-10.861],[-6.809,-2.405],[-33.199,9.861],[0.418,9.033]],"o":[[-39.477,-0.108],[-19.855,3.537],[-15.121,1.019],[0.476,10.861],[34.228,12.09],[10.939,-3.249],[-0.25,-8.502]],"v":[[56.422,-0.787],[-0.216,-46.139],[-48.254,0.979],[-68.21,21.526],[-56.424,39.141],[59.793,37.622],[76.671,15.277]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":98,"s":[{"i":[[13.739,0.037],[16.95,1.094],[45.152,-1.424],[-10.282,-11.503],[-6.809,-2.405],[-33.199,9.861],[0.418,9.033]],"o":[[-39.477,-0.108],[-20.126,-1.299],[-15.154,0.478],[-9.581,9.359],[34.228,12.09],[10.939,-3.249],[-0.25,-8.502]],"v":[[56.422,-0.787],[4.917,-45.876],[-56.562,-0.787],[-69.736,18.921],[-64.732,37.374],[59.793,37.622],[76.671,15.277]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":118,"s":[{"i":[[13.739,0.037],[16.95,1.094],[45.152,-1.424],[-10.282,-11.503],[-6.809,-2.405],[-33.199,9.861],[0.418,9.033]],"o":[[-39.477,-0.108],[-20.126,-1.299],[-15.154,0.478],[-9.581,9.359],[34.228,12.09],[10.939,-3.249],[-0.25,-8.502]],"v":[[56.422,-0.787],[4.917,-45.876],[-56.562,-0.787],[-69.736,18.921],[-64.732,37.374],[59.793,37.622],[76.671,15.277]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":144,"s":[{"i":[[13.739,0.037],[17.251,-3.073],[29.691,-4.22],[-0.476,-10.861],[-6.809,-2.405],[-33.199,9.861],[0.418,9.033]],"o":[[-39.477,-0.108],[-19.855,3.537],[-15.121,1.019],[0.476,10.861],[34.228,12.09],[10.939,-3.249],[-0.25,-8.502]],"v":[[56.422,-0.787],[-1.609,-53.14],[-48.254,0.979],[-68.21,21.526],[-56.424,39.141],[59.793,37.622],[76.671,15.277]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":152,"s":[{"i":[[13.739,0.037],[17.251,-3.073],[29.691,-4.22],[-0.476,-10.861],[-6.809,-2.405],[-33.199,9.861],[0.418,9.033]],"o":[[-39.477,-0.108],[-19.855,3.537],[-15.121,1.019],[0.476,10.861],[34.228,12.09],[10.939,-3.249],[-0.25,-8.502]],"v":[[56.422,-0.787],[-1.609,-53.14],[-48.254,0.979],[-68.21,21.526],[-56.424,39.141],[59.793,37.622],[76.671,15.277]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":162,"s":[{"i":[[13.719,0.734],[16.95,1.094],[45.152,-1.424],[-10.282,-11.503],[-6.193,-3.714],[-34.861,10.938],[-0.041,9.043]],"o":[[-39.42,-2.11],[-20.126,-1.299],[-15.154,0.478],[-11.894,4.246],[34.436,20.65],[10.888,-3.416],[0.182,-8.504]],"v":[[59.559,6.621],[4.917,-45.876],[-56.562,-0.787],[-69.736,18.921],[-72.129,36.66],[60.977,45.152],[78.967,23.692]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":188,"s":[{"i":[[13.719,0.734],[16.95,1.094],[45.152,-1.424],[-10.282,-11.503],[-6.193,-3.714],[-34.861,10.938],[-0.041,9.043]],"o":[[-39.42,-2.11],[-20.126,-1.299],[-15.154,0.478],[-11.894,4.246],[34.436,20.65],[10.888,-3.416],[0.182,-8.504]],"v":[[59.559,6.621],[4.917,-45.876],[-56.562,-0.787],[-69.736,18.921],[-72.129,36.66],[60.977,45.152],[78.967,23.692]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":204,"s":[{"i":[[13.667,-1.115],[17.056,-0.373],[38.365,-2.028],[-6.649,-11.229],[-6.41,-3.253],[-32.636,14.5],[1.173,8.949]],"o":[[-39.27,3.204],[-20.031,0.403],[-15.118,0.953],[-7.719,5.894],[34.363,17.637],[10.394,-4.588],[-0.962,-8.435]],"v":[[53.62,-2.995],[1.921,-46.816],[-54.525,-0.174],[-71.056,18.934],[-67.488,37.524],[60.605,35.233],[75.517,11.594]],"c":true}]},{"t":230,"s":[{"i":[[13.667,-1.115],[17.056,-0.373],[38.365,-2.028],[-6.649,-11.229],[-6.41,-3.253],[-32.636,14.5],[1.173,8.949]],"o":[[-39.27,3.204],[-20.031,0.403],[-15.118,0.953],[-7.719,5.894],[34.363,17.637],[10.394,-4.588],[-0.962,-8.435]],"v":[[53.62,-2.995],[1.921,-46.816],[-54.525,-0.174],[-71.056,18.934],[-67.488,37.524],[60.605,35.233],[75.517,11.594]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.811764717102,0.207843139768,0.007843137719,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.364705890417,0.121568627656,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[227.021,227.06]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":0,"op":300,"st":114,"bm":0},{"ddd":0,"ind":44,"ty":4,"nm":"wing_bl","parent":45,"sr":1,"ks":{"p":{"a":0,"k":[-9.694,-7.958,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":64,"s":[{"i":[[-16.004,6.98],[-11.131,0.538]],"o":[[14.277,-6.769],[8.103,-0.392]],"v":[[-33.42,8.12],[10.56,-5.014]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":74,"s":[{"i":[[-16.004,6.98],[-12.355,6.026]],"o":[[14.965,-1.279],[7.292,-3.556]],"v":[[-33.42,8.12],[13.663,-1.56]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":84,"s":[{"i":[[-16.004,6.98],[-14.76,-0.82]],"o":[[6.507,-6.151],[8.1,0.45]],"v":[[-33.42,8.12],[13.663,-1.56]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":94,"s":[{"i":[[-16.004,6.98],[-11.131,0.538]],"o":[[14.277,-6.769],[8.103,-0.392]],"v":[[-33.42,8.12],[10.56,-5.014]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":122,"s":[{"i":[[-16.004,6.98],[-11.131,0.538]],"o":[[14.277,-6.769],[8.103,-0.392]],"v":[[-33.42,8.12],[10.56,-5.014]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":132,"s":[{"i":[[-16.004,6.98],[-14.207,-4.426]],"o":[[16.891,-3.183],[8.059,-0.803]],"v":[[-29.932,-23.892],[13.649,-19.477]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":154,"s":[{"i":[[-16.004,6.98],[-14.207,-4.426]],"o":[[16.891,-3.183],[8.059,-0.803]],"v":[[-29.932,-23.892],[13.649,-19.477]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":160,"s":[{"i":[[-16.004,6.98],[-12.628,1.536]],"o":[[14.75,-9.741],[8.053,-0.98]],"v":[[-33.05,6.397],[11.03,-10.732]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":166,"s":[{"i":[[-16.004,6.98],[-12.531,2.49]],"o":[[15.511,-5.27],[7.957,-1.581]],"v":[[-33.05,6.397],[11.06,-4.734]],"c":false}]},{"i":{"x":0.833,"y":0.792},"o":{"x":0.167,"y":0},"t":206,"s":[{"i":[[-16.004,6.98],[-12.525,2.105]],"o":[[11.943,-6.264],[8.001,-1.344]],"v":[[-33.05,6.397],[11.819,-7.206]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":214,"s":[{"i":[[-16.004,6.98],[-10.842,5.054]],"o":[[15.262,-1.394],[7.353,-3.428]],"v":[[-33.05,6.397],[12.513,-4.703]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":224,"s":[{"i":[[-16.004,6.98],[-14.926,-1.974]],"o":[[15.511,-5.27],[8.043,1.064]],"v":[[-33.05,6.397],[12.316,-1.061]],"c":false}]},{"t":234,"s":[{"i":[[-16.004,6.98],[-12.525,2.105]],"o":[[11.943,-6.264],[8.001,-1.344]],"v":[[-33.05,6.397],[11.819,-7.206]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":228,"s":[5]},{"t":240,"s":[5]}]},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[95]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[95]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":228,"s":[100]},{"t":240,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":0,"op":300,"st":114,"bm":0},{"ddd":0,"ind":45,"ty":4,"nm":"wing_l","parent":67,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":122,"s":[77.884]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[134.158]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":154,"s":[134.158]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":160,"s":[193.817]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":166,"s":[226.511]},{"t":194,"s":[77.884]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":60,"s":[101.03,-17.712,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":70,"s":[103.971,-10.065,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":80,"s":[103.971,-10.065,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":90,"s":[101.03,-17.712,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":118,"s":[100.479,-17.712,0],"to":[0,0,0],"ti":[22.805,-65.222,0]},{"t":132,"s":[-15.9,-0.561,0],"h":1},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":154,"s":[-15.9,-0.561,0],"to":[17.258,1.985,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":160,"s":[14.547,-1.33,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.8,"y":0},"t":166,"s":[14.547,-1.33,0],"to":[0,0,0],"ti":[0,0,0]},{"t":194,"s":[101.017,-17.712,0]}]},"a":{"a":0,"k":[-54.963,0,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":64,"s":[{"i":[[0,0],[-1.39,-11.722],[58.688,-22.847]],"o":[[50.108,-27.458],[1.39,11.722],[0,0]],"v":[[-50.77,-29.247],[55.179,-15.827],[-42.467,18.766]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":74,"s":[{"i":[[0,0],[-1.39,-11.722],[72.695,-11.937]],"o":[[62.208,-0.877],[1.39,11.722],[0,0]],"v":[[-50.77,-29.247],[48.461,-28.237],[-42.467,18.766]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":84,"s":[{"i":[[0,0],[-1.39,-11.722],[58.688,-22.847]],"o":[[52.86,-16.108],[1.39,11.722],[0,0]],"v":[[-50.77,-29.247],[51.147,2.954],[-42.467,18.766]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":94,"s":[{"i":[[0,0],[-1.39,-11.722],[58.688,-22.847]],"o":[[50.108,-27.458],[1.39,11.722],[0,0]],"v":[[-50.77,-29.247],[55.179,-15.827],[-42.467,18.766]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":122,"s":[{"i":[[0,0],[-1.39,-11.722],[58.688,-22.847]],"o":[[50.108,-27.458],[1.39,11.722],[0,0]],"v":[[-50.77,-29.247],[55.179,-15.827],[-42.467,18.766]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":132,"s":[{"i":[[0,0],[3.785,-11.181],[57.848,1.311]],"o":[[61.82,4.334],[-5.316,15.707],[0,0]],"v":[[-49.094,-86.629],[76.209,-4.996],[-44.437,-17.038]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":154,"s":[{"i":[[0,0],[3.785,-11.181],[57.848,1.311]],"o":[[61.82,4.334],[-5.316,15.707],[0,0]],"v":[[-49.094,-86.629],[76.209,-4.996],[-44.437,-17.038]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":160,"s":[{"i":[[0,0],[3.785,-11.181],[40.6,-32.095]],"o":[[41.512,-43.839],[-5.316,15.707],[0,0]],"v":[[-59.509,-30.11],[58.667,-19.358],[-42.467,18.766]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.8,"y":0},"t":166,"s":[{"i":[[0,0],[3.785,-11.181],[52.717,-25.914]],"o":[[65.842,-34.834],[-5.316,15.707],[0,0]],"v":[[-59.509,-30.11],[65.578,-10.962],[-42.467,18.766]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":204,"s":[{"i":[[0,0],[-1.39,-11.722],[58.688,-22.847]],"o":[[50.108,-27.458],[1.39,11.722],[0,0]],"v":[[-50.77,-29.247],[55.179,-15.827],[-42.467,18.766]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":214,"s":[{"i":[[0,0],[-1.39,-11.722],[64.978,-17.947]],"o":[[55.542,-15.521],[1.39,11.722],[0,0]],"v":[[-50.77,-29.247],[52.162,-21.401],[-42.467,18.766]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":224,"s":[{"i":[[0,0],[-1.39,-11.722],[60.276,-21.61]],"o":[[53.537,-15.96],[1.39,11.722],[0,0]],"v":[[-50.77,-29.247],[51.403,-3.195],[-42.467,18.766]],"c":false}]},{"t":234,"s":[{"i":[[0,0],[-1.39,-11.722],[58.688,-22.847]],"o":[[50.108,-27.458],[1.39,11.722],[0,0]],"v":[[-50.77,-29.247],[55.179,-15.827],[-42.467,18.766]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.980392158031,0.564705908298,0.086274512112,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.835294127464,0.152941182256,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":110,"bm":0},{"ddd":0,"ind":46,"ty":4,"nm":"eye 4","parent":43,"sr":1,"ks":{"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":60,"s":[163.594,187.222,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":74,"s":[161.247,187.336,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":86,"s":[161.247,187.336,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":98,"s":[168.289,186.856,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.11,"y":1},"o":{"x":0.333,"y":0},"t":118,"s":[168.289,186.856,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.11,"y":0.11},"o":{"x":0.89,"y":0.89},"t":144,"s":[162.418,187.221,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.89,"y":0},"t":152,"s":[162.418,187.221,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":162,"s":[168.289,186.856,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":188,"s":[168.289,186.856,0],"to":[0,0,0],"ti":[0,0,0]},{"t":204,"s":[163.594,187.222,0]}]},"a":{"a":0,"k":[147.88,185.335,0]},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":60,"s":[83,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":74,"s":[90,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":86,"s":[90,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":98,"s":[80,100,100]},{"i":{"x":[0.11,0.11,0.11],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":118,"s":[80,100,100]},{"i":{"x":[0.11,0.11,0.11],"y":[1,1,1]},"o":{"x":[0.89,0.89,0.89],"y":[0,0,0]},"t":144,"s":[95,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.89,0.89,0.89],"y":[0,0,0]},"t":152,"s":[95,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":162,"s":[80,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":188,"s":[80,100,100]},{"t":204,"s":[83,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":98,"s":[{"i":[[-0.731,-4.657],[5.005,-0.786],[1.175,0.273],[0.544,3.465],[-5.005,0.786]],"o":[[0.731,4.657],[-1.281,0.201],[-3.415,-0.792],[-0.731,-4.657],[5.005,-0.786]],"v":[[8.683,1.293],[0.945,11.148],[-2.769,11.021],[-9.442,4.139],[-1.704,-5.716]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":104,"s":[{"i":[[-0.452,-1.863],[3.093,-0.314],[0.726,0.109],[0.336,1.386],[-3.093,0.314]],"o":[[0.452,1.863],[-0.792,0.08],[-2.111,-0.317],[-0.452,-1.863],[3.093,-0.314]],"v":[[2.407,14.924],[-2.375,18.866],[-4.67,18.815],[-8.794,16.062],[-4.012,12.12]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":110,"s":[{"i":[[-0.731,-4.657],[5.005,-0.786],[1.175,0.273],[0.544,3.465],[-5.005,0.786]],"o":[[0.731,4.657],[-1.281,0.201],[-3.415,-0.792],[-0.731,-4.657],[5.005,-0.786]],"v":[[8.683,1.293],[0.945,11.148],[-2.769,11.021],[-9.442,4.139],[-1.704,-5.716]],"c":true}]},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"t":116,"s":[{"i":[[-0.452,-1.863],[3.093,-0.314],[0.726,0.109],[0.336,1.386],[-3.093,0.314]],"o":[[0.452,1.863],[-0.792,0.08],[-2.111,-0.317],[-0.452,-1.863],[3.093,-0.314]],"v":[[2.407,14.924],[-2.375,18.866],[-4.67,18.815],[-8.794,16.062],[-4.012,12.12]],"c":true}]},{"i":{"x":0.15,"y":1},"o":{"x":0.85,"y":0},"t":122,"s":[{"i":[[-0.731,-4.657],[5.005,-0.786],[1.175,0.273],[0.544,3.465],[-5.005,0.786]],"o":[[0.731,4.657],[-1.281,0.201],[-3.415,-0.792],[-0.731,-4.657],[5.005,-0.786]],"v":[[8.683,1.293],[0.945,11.148],[-2.769,11.021],[-9.442,4.139],[-1.704,-5.716]],"c":true}]},{"i":{"x":0.15,"y":1},"o":{"x":0.85,"y":0},"t":144,"s":[{"i":[[-0.731,-4.657],[5.005,-0.786],[1.175,0.273],[0.544,3.465],[-5.005,0.786]],"o":[[0.731,4.657],[-1.281,0.201],[-3.415,-0.792],[-0.731,-4.657],[5.005,-0.786]],"v":[[8.683,1.293],[0.945,11.148],[-2.769,11.021],[-9.442,4.139],[-1.704,-5.716]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.85,"y":0},"t":152,"s":[{"i":[[-0.731,-4.657],[5.005,-0.786],[1.175,0.273],[0.544,3.465],[-5.005,0.786]],"o":[[0.731,4.657],[-1.281,0.201],[-3.415,-0.792],[-0.731,-4.657],[5.005,-0.786]],"v":[[8.683,1.293],[0.945,11.148],[-2.769,11.021],[-9.442,4.139],[-1.704,-5.716]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":162,"s":[{"i":[[1.392,-4.495],[4.105,1.414],[0.773,0.743],[-1.036,3.345],[-4.105,-1.414]],"o":[[-1.392,4.495],[-1.051,-0.362],[-2.247,-2.159],[1.392,-4.495],[4.105,1.414]],"v":[[16.114,7.058],[6.16,12.637],[3.411,10.949],[1.248,1.937],[11.202,-3.642]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":168,"s":[{"i":[[-0.615,-1.799],[2.523,-0.645],[0.616,0.03],[0.457,1.338],[-2.523,0.645]],"o":[[0.615,1.799],[-0.646,0.165],[-1.79,-0.087],[-0.615,-1.799],[2.523,-0.645]],"v":[[6.314,14.373],[2.859,18.798],[0.951,18.994],[-2.822,16.709],[0.633,12.284]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":174,"s":[{"i":[[1.392,-4.495],[4.105,1.414],[0.773,0.743],[-1.036,3.345],[-4.105,-1.414]],"o":[[-1.392,4.495],[-1.051,-0.362],[-2.247,-2.159],[1.392,-4.495],[4.105,1.414]],"v":[[16.114,7.058],[6.16,12.637],[3.411,10.949],[1.248,1.937],[11.202,-3.642]],"c":true}]},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"t":188,"s":[{"i":[[1.392,-4.495],[4.105,1.414],[0.773,0.743],[-1.036,3.345],[-4.105,-1.414]],"o":[[-1.392,4.495],[-1.051,-0.362],[-2.247,-2.159],[1.392,-4.495],[4.105,1.414]],"v":[[16.114,7.058],[6.16,12.637],[3.411,10.949],[1.248,1.937],[11.202,-3.642]],"c":true}]},{"t":204,"s":[{"i":[[-0.731,-4.657],[5.005,-0.786],[1.175,0.273],[0.544,3.465],[-5.005,0.786]],"o":[[0.731,4.657],[-1.281,0.201],[-3.415,-0.792],[-0.731,-4.657],[5.005,-0.786]],"v":[[8.683,1.293],[0.945,11.148],[-2.769,11.021],[-9.442,4.139],[-1.704,-5.716]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":98,"s":[1,1,1,1]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":104,"s":[0,0,0,1]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":110,"s":[1,1,1,1]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":116,"s":[0,0,0,1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":122,"s":[1,1,1,1]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":162,"s":[1,1,1,1]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":168,"s":[0,0,0,1]},{"t":174,"s":[1,1,1,1]}]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[149.824,171.565]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":98,"s":[{"i":[[5.531,-16.68],[14.69,4.217],[-5.531,16.68],[-14.69,-4.217]],"o":[[-5.531,16.68],[-14.69,-4.217],[5.531,-16.68],[14.69,4.217]],"v":[[26.599,7.636],[-10.015,30.202],[-26.599,-7.636],[10.015,-30.202]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":104,"s":[{"i":[[5.062,-6.391],[20.249,0.534],[6.627,5.855],[-18.219,-0.566]],"o":[[-5.425,6.85],[-17.702,-0.466],[-6.809,-6.015],[20.458,0.636]],"v":[[27.893,12.284],[-0.054,7.019],[-28.57,12.484],[1.562,-4.579]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":110,"s":[{"i":[[5.531,-16.68],[14.69,4.217],[-5.531,16.68],[-14.69,-4.217]],"o":[[-5.531,16.68],[-14.69,-4.217],[5.531,-16.68],[14.69,4.217]],"v":[[26.599,7.636],[-10.015,30.202],[-26.599,-7.636],[10.015,-30.202]],"c":true}]},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"t":116,"s":[{"i":[[5.062,-6.391],[20.249,0.534],[6.627,5.855],[-18.219,-0.566]],"o":[[-5.425,6.85],[-17.702,-0.466],[-6.809,-6.015],[20.458,0.636]],"v":[[27.893,12.284],[-0.054,7.019],[-28.57,12.484],[1.562,-4.579]],"c":true}]},{"i":{"x":0.15,"y":1},"o":{"x":0.85,"y":0},"t":122,"s":[{"i":[[5.531,-16.68],[14.69,4.217],[-5.531,16.68],[-14.69,-4.217]],"o":[[-5.531,16.68],[-14.69,-4.217],[5.531,-16.68],[14.69,4.217]],"v":[[26.599,7.636],[-10.015,30.202],[-26.599,-7.636],[10.015,-30.202]],"c":true}]},{"i":{"x":0.15,"y":1},"o":{"x":0.85,"y":0},"t":144,"s":[{"i":[[5.531,-16.68],[14.69,4.217],[-5.531,16.68],[-14.69,-4.217]],"o":[[-5.531,16.68],[-14.69,-4.217],[5.531,-16.68],[14.69,4.217]],"v":[[26.599,7.636],[-10.015,30.202],[-26.599,-7.636],[10.015,-30.202]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.85,"y":0},"t":152,"s":[{"i":[[5.531,-16.68],[14.69,4.217],[-5.531,16.68],[-14.69,-4.217]],"o":[[-5.531,16.68],[-14.69,-4.217],[5.531,-16.68],[14.69,4.217]],"v":[[26.599,7.636],[-10.015,30.202],[-26.599,-7.636],[10.015,-30.202]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":162,"s":[{"i":[[11.138,-12.648],[9.326,10.014],[-11.138,12.648],[-9.326,-10.014]],"o":[[-11.138,12.648],[-9.326,-10.014],[11.138,-12.648],[9.326,10.014]],"v":[[21.715,18.132],[-15.338,22.901],[-12.056,-18.132],[24.996,-22.901]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":168,"s":[{"i":[[3.371,-6.883],[16.85,-1.653],[6.247,5.092],[-15.172,1.402]],"o":[[-3.613,7.377],[-14.731,1.445],[-6.418,-5.231],[17.037,-1.574]],"v":[[29.203,9.104],[5.364,6.894],[-17.564,15.386],[5.208,-4.782]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":174,"s":[{"i":[[11.138,-12.648],[9.326,10.014],[-11.138,12.648],[-9.326,-10.014]],"o":[[-11.138,12.648],[-9.326,-10.014],[11.138,-12.648],[9.326,10.014]],"v":[[21.715,18.132],[-15.338,22.901],[-12.056,-18.132],[24.996,-22.901]],"c":true}]},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"t":188,"s":[{"i":[[11.138,-12.648],[9.326,10.014],[-11.138,12.648],[-9.326,-10.014]],"o":[[-11.138,12.648],[-9.326,-10.014],[11.138,-12.648],[9.326,10.014]],"v":[[21.715,18.132],[-15.338,22.901],[-12.056,-18.132],[24.996,-22.901]],"c":true}]},{"t":204,"s":[{"i":[[5.531,-16.68],[14.69,4.217],[-5.531,16.68],[-14.69,-4.217]],"o":[[-5.531,16.68],[-14.69,-4.217],[5.531,-16.68],[14.69,4.217]],"v":[[26.599,7.636],[-10.015,30.202],[-26.599,-7.636],[10.015,-30.202]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":98,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":104,"s":[6]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":110,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":116,"s":[6]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":122,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":162,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":168,"s":[6]},{"t":174,"s":[0]}]},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[147.88,185.335]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[147.88,185.335]},"a":{"a":0,"k":[147.88,185.335]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":0,"op":300,"st":114,"bm":0},{"ddd":0,"ind":47,"ty":4,"nm":"eye 3","parent":43,"sr":1,"ks":{"p":{"a":0,"k":[304.699,185.068,0]},"a":{"a":0,"k":[293.018,185.074,0]},"s":{"a":0,"k":[130,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":98,"s":[{"i":[[0,-4.505],[4.505,0],[0,4.505],[-4.505,0]],"o":[[0,4.505],[-4.505,0],[0,-4.505],[4.505,0]],"v":[[8.158,0],[0,8.158],[-8.158,0],[0,-8.158]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":104,"s":[{"i":[[0.393,-2.046],[1.834,0.352],[-0.393,2.046],[-1.834,-0.352]],"o":[[-0.393,2.046],[-1.834,-0.352],[0.393,-2.046],[1.834,0.352]],"v":[[7.462,7.436],[3.43,10.502],[0.819,6.161],[4.851,3.094]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":110,"s":[{"i":[[0,-4.505],[4.505,0],[0,4.505],[-4.505,0]],"o":[[0,4.505],[-4.505,0],[0,-4.505],[4.505,0]],"v":[[8.158,0],[0,8.158],[-8.158,0],[0,-8.158]],"c":true}]},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"t":116,"s":[{"i":[[0.393,-2.046],[1.834,0.352],[-0.393,2.046],[-1.834,-0.352]],"o":[[-0.393,2.046],[-1.834,-0.352],[0.393,-2.046],[1.834,0.352]],"v":[[7.462,7.436],[3.43,10.502],[0.819,6.161],[4.851,3.094]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.85,"y":0},"t":122,"s":[{"i":[[0,-4.505],[4.505,0],[0,4.505],[-4.505,0]],"o":[[0,4.505],[-4.505,0],[0,-4.505],[4.505,0]],"v":[[8.158,0],[0,8.158],[-8.158,0],[0,-8.158]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":162,"s":[{"i":[[0,-4.505],[4.505,0],[0,4.505],[-4.505,0]],"o":[[0,4.505],[-4.505,0],[0,-4.505],[4.505,0]],"v":[[8.158,0],[0,8.158],[-8.158,0],[0,-8.158]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":168,"s":[{"i":[[0.393,-2.046],[1.834,0.352],[-0.393,2.046],[-1.834,-0.352]],"o":[[-0.393,2.046],[-1.834,-0.352],[0.393,-2.046],[1.834,0.352]],"v":[[7.462,7.436],[3.43,10.502],[0.819,6.161],[4.851,3.094]],"c":true}]},{"t":174,"s":[{"i":[[0,-4.505],[4.505,0],[0,4.505],[-4.505,0]],"o":[[0,4.505],[-4.505,0],[0,-4.505],[4.505,0]],"v":[[8.158,0],[0,8.158],[-8.158,0],[0,-8.158]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":98,"s":[1,1,1,1]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":104,"s":[0,0,0,1]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":110,"s":[1,1,1,1]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":116,"s":[0,0,0,1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":122,"s":[1,1,1,1]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":162,"s":[1,1,1,1]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":168,"s":[0,0,0,1]},{"t":174,"s":[1,1,1,1]}]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[289.869,171.446]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":98,"s":[{"i":[[-4.428,-16.68],[-11.76,4.217],[4.428,16.68],[11.76,-4.217]],"o":[[4.428,16.68],[11.76,-4.217],[-4.428,-16.68],[-11.76,4.217]],"v":[[-21.293,7.636],[8.017,30.202],[21.293,-7.636],[-8.017,-30.202]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":104,"s":[{"i":[[-4.028,-4.701],[-16.852,0.144],[-3.874,5.201],[11.871,-2.293]],"o":[[4.332,5.056],[16.513,-0.141],[3.569,-4.791],[-11.871,2.293]],"v":[[-18.384,5.894],[0.65,-1.771],[20.406,5.307],[-1.229,-11.575]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":110,"s":[{"i":[[-4.427,-16.68],[-11.76,4.217],[4.427,16.68],[11.76,-4.217]],"o":[[4.428,16.68],[11.76,-4.217],[-4.428,-16.68],[-11.76,4.217]],"v":[[-21.293,7.636],[8.017,30.202],[21.293,-7.636],[-8.017,-30.202]],"c":true}]},{"i":{"x":0.15,"y":1},"o":{"x":0.333,"y":0},"t":116,"s":[{"i":[[-4.028,-4.701],[-16.852,0.144],[-3.874,5.201],[11.871,-2.293]],"o":[[4.332,5.056],[16.513,-0.141],[3.569,-4.791],[-11.871,2.293]],"v":[[-18.384,5.894],[0.65,-1.771],[20.406,5.307],[-1.229,-11.575]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.85,"y":0},"t":122,"s":[{"i":[[-4.427,-16.68],[-11.76,4.217],[4.427,16.68],[11.76,-4.217]],"o":[[4.428,16.68],[11.76,-4.217],[-4.428,-16.68],[-11.76,4.217]],"v":[[-21.293,7.636],[8.017,30.202],[21.293,-7.636],[-8.017,-30.202]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":162,"s":[{"i":[[-4.428,-16.68],[-11.76,4.217],[4.428,16.68],[11.76,-4.217]],"o":[[4.428,16.68],[11.76,-4.217],[-4.428,-16.68],[-11.76,4.217]],"v":[[-21.293,7.636],[8.017,30.202],[21.293,-7.636],[-8.017,-30.202]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":168,"s":[{"i":[[-4.028,-4.701],[-16.852,0.144],[-3.874,5.201],[11.871,-2.293]],"o":[[4.332,5.056],[16.513,-0.141],[3.569,-4.791],[-11.871,2.293]],"v":[[-18.384,5.894],[0.65,-1.771],[20.406,5.307],[-1.229,-11.575]],"c":true}]},{"t":174,"s":[{"i":[[-4.427,-16.68],[-11.76,4.217],[4.427,16.68],[11.76,-4.217]],"o":[[4.428,16.68],[11.76,-4.217],[-4.428,-16.68],[-11.76,4.217]],"v":[[-21.293,7.636],[8.017,30.202],[21.293,-7.636],[-8.017,-30.202]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":98,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":104,"s":[6]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":110,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":116,"s":[6]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":122,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":162,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[1],"y":[0]},"t":168,"s":[6]},{"t":174,"s":[0]}]},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[293.018,185.074]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[293.018,185.074]},"a":{"a":0,"k":[293.018,185.074]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[149.824,171.565]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[147.88,185.335]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[147.88,185.335]},"a":{"a":0,"k":[147.88,185.335]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":0,"op":300,"st":114,"bm":0},{"ddd":0,"ind":48,"ty":4,"nm":"head_bl4","parent":50,"sr":1,"ks":{"p":{"a":0,"k":[121.325,22.259,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-6.461,-9.431],[0,-24.681],[19.005,-18.433]],"o":[[14.542,21.228],[0,28.584],[0,0]],"v":[[-0.106,-57.811],[22.887,12.639],[-7.452,83.863]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.988235294819,0.933333337307,0.129411771894,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":228,"s":[5]},{"t":240,"s":[5]}]},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[95]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[95]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":228,"s":[100]},{"t":240,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":0,"op":300,"st":114,"bm":0},{"ddd":0,"ind":49,"ty":4,"nm":"head_bl3","parent":50,"sr":1,"ks":{"r":{"a":0,"k":24.348},"p":{"a":0,"k":[-4.904,31.823,0]},"a":{"a":0,"k":[71.641,94.652,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-26.697,16.101]],"o":[[11.529,-27.092],[11.933,-7.196]],"v":[[-49.05,41.823],[10.169,-25.495]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":228,"s":[5]},{"t":240,"s":[5]}]},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[95]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[95]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":228,"s":[100]},{"t":240,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":0,"op":300,"st":114,"bm":0},{"ddd":0,"ind":50,"ty":4,"nm":"head","parent":67,"sr":1,"ks":{"r":{"a":0,"k":-1.29},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":60,"s":[9.583,-42.601,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":74,"s":[9.583,-21.198,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":86,"s":[9.583,-21.198,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":98,"s":[9.583,-42.601,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.11,"y":1},"o":{"x":0.333,"y":0},"t":118,"s":[9.583,-42.601,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.89,"y":0.89},"t":144,"s":[9.583,-7.307,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":152,"s":[9.583,-7.307,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":162,"s":[9.583,-42.601,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":188,"s":[9.583,-42.601,0],"to":[0,0,0],"ti":[0,0,0]},{"t":230,"s":[9.583,-42.601,0]}]},"a":{"a":0,"k":[0,131.046,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,39.247],[93.266,0],[0,-83.375],[-28.671,-23.75]],"o":[[29.034,-23.938],[0,-83.375],[-93.265,0],[0,39.353],[0,0]],"v":[[122.976,131.046],[168.871,34.404],[0,-131.046],[-168.871,34.404],[-123.254,130.814]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.980392158031,0.564705908298,0.086274512112,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.835294127464,0.152941182256,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":114,"bm":0},{"ddd":0,"ind":51,"ty":4,"nm":"wing_bl 3","parent":52,"sr":1,"ks":{"r":{"a":0,"k":-172.417},"p":{"a":0,"k":[-54.755,-111.892,0]},"s":{"a":0,"k":[-100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.306,"y":1},"o":{"x":0.167,"y":0},"t":60,"s":[{"i":[[-16.004,6.98],[2.258,-12.51]],"o":[[7.913,17.033],[-1.441,7.984]],"v":[[0.289,-31.284],[6.431,20.145]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":76,"s":[{"i":[[-16.004,6.98],[-8.554,-11.251]],"o":[[5.587,13.961],[4.91,6.458]],"v":[[-29.273,-32.276],[-7.735,12.813]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.8,"y":0},"t":86,"s":[{"i":[[-16.004,6.98],[15.44,-7.583]],"o":[[-6.944,9.239],[-7.282,3.576]],"v":[[-3.702,-9.261],[-38.775,18.099]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":112,"s":[{"i":[[-16.004,6.98],[15.44,-7.583]],"o":[[-6.944,9.239],[-7.282,3.576]],"v":[[-6.172,-12.202],[-38.775,18.099]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":122,"s":[{"i":[[-16.004,6.98],[5.012,-7.392]],"o":[[-1.203,10.209],[-4.553,6.715]],"v":[[-4.224,-29.44],[-14.131,4.559]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":132,"s":[{"i":[[-16.004,6.98],[-1.985,-4.242]],"o":[[-1.203,10.209],[3.438,7.348]],"v":[[5.092,-28.185],[11.498,-3.921]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":142,"s":[{"i":[[-16.004,6.98],[-1.985,-4.242]],"o":[[-1.203,10.209],[3.438,7.348]],"v":[[5.092,-28.185],[11.498,-3.921]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":154,"s":[{"i":[[-16.004,6.98],[9.675,-6.89]],"o":[[-4.818,5.611],[-6.608,4.706]],"v":[[-5.66,-10.532],[-27.146,8.549]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":172,"s":[{"i":[[-16.004,6.98],[-1.985,-4.242]],"o":[[-1.203,10.209],[3.438,7.348]],"v":[[2.421,-37.481],[8.826,-13.217]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":194,"s":[{"i":[[-16.004,6.98],[-1.985,-4.242]],"o":[[-1.203,10.209],[3.438,7.348]],"v":[[2.421,-37.481],[8.826,-13.217]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":202,"s":[{"i":[[-16.004,6.98],[-1.985,-4.242]],"o":[[-1.203,10.209],[3.438,7.348]],"v":[[-39.098,-55.13],[-32.692,-30.866]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":206,"s":[{"i":[[-13.266,11.352],[-3.138,-3.477]],"o":[[1.833,10.115],[5.435,6.023]],"v":[[-23.342,-33.782],[-10.126,-12.449]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":216,"s":[{"i":[[-16.004,6.98],[7.91,-5.364]],"o":[[-4.203,10.616],[-6.714,4.554]],"v":[[-10.271,-37.701],[-32.313,-7.7]],"c":false}]},{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":228,"s":[{"i":[[-16.004,6.98],[7.91,-5.364]],"o":[[-4.203,10.616],[-6.714,4.554]],"v":[[-10.271,-37.701],[-32.313,-7.7]],"c":false}]},{"t":238,"s":[{"i":[[-16.004,6.98],[2.258,-12.51]],"o":[[7.913,17.033],[-1.441,7.984]],"v":[[0.289,-31.284],[6.431,20.145]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.988235294118,0.933333333333,0.129411764706,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":228,"s":[5]},{"t":240,"s":[5]}]},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[95]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[95]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":228,"s":[100]},{"t":240,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":0,"op":300,"st":114,"bm":0},{"ddd":0,"ind":52,"ty":4,"nm":"wing_r 2","parent":67,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[-74.975]},{"i":{"x":[0.486],"y":[1]},"o":{"x":[0.617],"y":[0]},"t":74,"s":[-134.588]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":86,"s":[-64.698]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":112,"s":[-64.698]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[-74.975]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[-147.533]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":140,"s":[-147.533]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":152,"s":[-64.698]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":170,"s":[-147.533]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[-147.533]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":200,"s":[-134.588]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.9],"y":[0]},"t":214,"s":[-64.698]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":226,"s":[-64.698]},{"t":236,"s":[-74.975]}]},"p":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":60,"s":[-115.902,-20.043,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.617,"y":0},"t":74,"s":[-99.747,30.953,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.8,"y":0.8},"t":86,"s":[-115.902,-20.043,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":112,"s":[-115.902,-20.043,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":120,"s":[-115.902,-20.043,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":140,"s":[-115.902,-20.043,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":152,"s":[-115.902,-20.043,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":170,"s":[-115.902,-20.043,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":192,"s":[-115.902,-20.043,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.333,"y":0},"t":200,"s":[-99.747,30.953,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.9,"y":0.9},"t":214,"s":[-115.902,-20.043,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":226,"s":[-115.902,-20.043,0],"to":[0,0,0],"ti":[0,0,0]},{"t":236,"s":[-115.902,-20.043,0]}]},"a":{"a":0,"k":[-58.809,-56.332,0]},"s":{"a":0,"k":[-100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.306,"y":1},"o":{"x":0.167,"y":0},"t":60,"s":[{"i":[[0,0],[-16.835,-6.508],[8.048,-43.787]],"o":[[61.001,-10.743],[24.823,9.596],[0,0]],"v":[[-107.655,-60.291],[-51.062,-162.155],[-27.184,-51.097]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":76,"s":[{"i":[[0,0],[-14.243,-11.087],[-2.262,-45.083]],"o":[[0.729,-63.214],[7.883,6.136],[0,0]],"v":[[-118.871,-29.792],[-42.247,-151.747],[-57.507,-52.802]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.8,"y":0},"t":86,"s":[{"i":[[0,0],[-17.608,3.967],[-9.637,-64.843]],"o":[[28.093,-40.527],[35.368,-7.969],[0,0]],"v":[[-107.655,-60.291],[-128.192,-160.615],[-27.184,-51.097]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":112,"s":[{"i":[[0,0],[-14.208,10.399],[8.048,-43.787]],"o":[[23.947,-67.347],[16.217,-11.869],[0,0]],"v":[[-107.655,-60.291],[-124.624,-170.638],[-28.424,-47.103]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":122,"s":[{"i":[[0,0],[-16.835,-6.508],[8.048,-43.787]],"o":[[61.001,-10.743],[24.823,9.596],[0,0]],"v":[[-107.655,-60.291],[-81.993,-143.354],[-27.184,-51.097]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":132,"s":[{"i":[[0,0],[-12.528,-12.993],[-0.395,-16.833]],"o":[[1.39,-62.584],[9.609,9.965],[0,0]],"v":[[-70.524,-48.518],[-17.974,-140.968],[-15.095,-81.054]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":142,"s":[{"i":[[0,0],[-12.528,-12.993],[-0.395,-16.833]],"o":[[1.39,-62.584],[9.609,9.965],[0,0]],"v":[[-70.524,-48.518],[-17.974,-140.968],[-15.095,-81.054]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":154,"s":[{"i":[[0,0],[-14.208,10.399],[8.048,-43.787]],"o":[[23.947,-67.347],[16.217,-11.869],[0,0]],"v":[[-107.655,-60.291],[-124.624,-170.638],[-28.424,-47.103]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":164,"s":[{"i":[[0,0],[-13.487,0.363],[4.425,-32.223]],"o":[[15.254,-69.87],[13.382,-2.501],[0,0]],"v":[[-99.685,-26.184],[-78.868,-157.909],[-28.506,-68.519]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":172,"s":[{"i":[[0,0],[-12.528,-12.993],[-0.395,-16.833]],"o":[[3.685,-73.229],[9.609,9.965],[0,0]],"v":[[-80.894,-21.493],[-17.974,-140.968],[-19.855,-66.92]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":194,"s":[{"i":[[0,0],[-12.528,-12.993],[-0.395,-16.833]],"o":[[3.685,-73.229],[9.609,9.965],[0,0]],"v":[[-80.894,-21.493],[-17.974,-140.968],[-19.855,-66.92]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":202,"s":[{"i":[[0,0],[-14.243,-11.087],[-2.262,-45.083]],"o":[[0.729,-63.214],[7.883,6.136],[0,0]],"v":[[-125.243,-22.644],[-42.247,-151.747],[-63.879,-45.654]],"c":false}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.167},"t":206,"s":[{"i":[[0,0],[-14.074,-11.087],[-20.026,-42.283]],"o":[[5.791,-50.614],[3.687,13.544],[0,0]],"v":[[-118.593,-41.915],[-36.039,-123.3],[-47.883,-28.138]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.9,"y":0},"t":216,"s":[{"i":[[0,0],[-15.939,7.479],[15.854,-49.047]],"o":[[63.679,-16.222],[26.202,-12.294],[0,0]],"v":[[-118.31,-54.267],[-93.152,-103.707],[-29.507,-36.554]],"c":false}]},{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"t":228,"s":[{"i":[[0,0],[-14.208,10.399],[8.048,-43.787]],"o":[[23.947,-67.347],[16.217,-11.869],[0,0]],"v":[[-107.655,-60.291],[-124.624,-170.638],[-28.424,-47.103]],"c":false}]},{"t":238,"s":[{"i":[[0,0],[-16.835,-6.508],[8.048,-43.787]],"o":[[61.001,-10.743],[24.823,9.596],[0,0]],"v":[[-107.655,-60.291],[-51.062,-162.155],[-27.184,-51.097]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.980392158031,0.564705908298,0.086274512112,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.835294127464,0.152941182256,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":114,"bm":0},{"ddd":0,"ind":53,"ty":4,"nm":"emj","parent":4,"sr":1,"ks":{"r":{"a":0,"k":380},"p":{"a":0,"k":[-10.151,-118.571,0]},"a":{"a":0,"k":[-190.48,-156.062,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0.733,1.838],[8.598,-3.023],[-2.25,0.196],[-3.256,-3.92]],"o":[[-1.86,-4.663],[-2.932,1.031],[4.938,-0.43],[1.216,1.465]],"v":[[-160.417,-168.366],[-177.721,-175.9],[-177.983,-173.095],[-162.057,-167.193]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.901,1.761],[-8.279,-3.81],[2.222,0.404],[3.606,-3.6]],"o":[[2.286,-4.47],[2.823,1.299],[-4.876,-0.887],[-1.347,1.345]],"v":[[-220.441,-162.582],[-202.511,-168.474],[-202.511,-165.657],[-218.918,-161.261]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-11.886,0],[3.505,2.54],[9.762,0],[3.027,-2.193]],"o":[[12.241,0],[-3.027,-2.193],[-9.762,0],[-3.505,2.54]],"v":[[-189.813,-127.788],[-172.695,-142.112],[-189.813,-136.474],[-206.93,-142.112]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.623,-1.999],[5.025,0],[0.923,2.113],[-6.299,0]],"o":[[-1.033,1.272],[-5.025,0],[-0.74,-1.694],[6.707,0]],"v":[[-196.014,-153.33],[-205.112,-154.388],[-214.211,-153.33],[-205.112,-159.629]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-3.944],[3.944,0],[0,3.944],[-3.944,0]],"o":[[0,3.944],[-3.944,0],[0,-3.944],[3.944,0]],"v":[[-167.163,-157.028],[-174.305,-149.886],[-181.447,-157.028],[-174.305,-164.17]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-21.673],[21.673,0],[0,21.673],[-21.673,0]],"o":[[0,21.673],[-21.673,0],[0,-21.673],[21.673,0]],"v":[[-151.238,-156.062],[-190.48,-116.82],[-229.722,-156.062],[-190.48,-195.304]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.63137254902,0.211764705882,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7.5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.996078431373,1,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":54,"ty":4,"nm":"emj","parent":4,"sr":1,"ks":{"r":{"a":0,"k":-8.934},"p":{"a":0,"k":[-73.147,-117.158,0]},"a":{"a":0,"k":[-83.624,-156.062,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.578,-3.816],[-9.017,0],[-6.49,2.864]],"o":[[6.468,2.824],[9.088,0],[1.46,-3.79]],"v":[[-107.364,-146.212],[-83.607,-141.692],[-59.697,-146.277]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-19.441,0],[4.837,4.277],[13.472,0],[4.177,-3.694]],"o":[[20.226,0],[-4.177,-3.694],[-13.472,0],[-4.837,4.277]],"v":[[-83.639,-130.843],[-60.016,-154.965],[-83.639,-153.158],[-107.261,-154.965]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.623,-1.999],[-5.025,0],[-0.923,2.113],[6.299,0]],"o":[[1.033,1.272],[5.025,0],[0.74,-1.694],[-6.707,0]],"v":[[-77.895,-163.765],[-68.797,-164.823],[-59.698,-163.765],[-68.797,-170.064]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.623,-1.999],[5.025,0],[0.923,2.113],[-6.299,0]],"o":[[-1.033,1.272],[-5.025,0],[-0.74,-1.694],[6.707,0]],"v":[[-89.836,-163.765],[-98.934,-164.823],[-108.033,-163.765],[-98.934,-170.064]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-21.673],[21.673,0],[0,21.673],[-21.673,0]],"o":[[0,21.673],[-21.673,0],[0,-21.673],[21.673,0]],"v":[[-44.382,-156.062],[-83.624,-116.82],[-122.866,-156.062],[-83.624,-195.304]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.54509806633,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7.5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.831372559071,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":55,"ty":4,"nm":"msg","parent":4,"sr":1,"ks":{"r":{"a":0,"k":-0.828},"p":{"a":0,"k":[-48.331,19.857,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[5.671,0],[0,0],[0,-5.671],[0,0],[-5.671,0],[0,0],[0,5.671],[0,0]],"o":[[0,0],[-5.671,0],[0,0],[0,5.671],[0,0],[5.671,0],[0,0],[0,-5.671]],"v":[[62.304,-38.695],[-62.304,-38.695],[-72.572,-28.427],[-72.572,7.217],[-62.304,17.485],[62.304,17.485],[72.572,7.217],[72.572,-28.427]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.476283832625,0.638979204963,0.763838465074,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.940441176471,0.974922569125,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":56,"ty":4,"nm":"m17","parent":58,"sr":1,"ks":{"p":{"a":0,"k":[15.576,-10.738,0]},"a":{"a":0,"k":[-1541.184,1009.518,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-6.79,0],[6.79,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1513.76,1000.998]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-8.009,0],[8.009,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1528.516,1018.038]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-11.183,0],[11.183,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1564.215,1018.038]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-19.969,0],[19.969,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1555.429,1000.998]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false}],"ip":204,"op":208,"st":0,"bm":0},{"ddd":0,"ind":57,"ty":4,"nm":"m16","parent":58,"sr":1,"ks":{"p":{"a":0,"k":[-44.199,-10.205,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-8.235],[8.235,0],[0,8.235],[-8.235,0]],"o":[[0,8.235],[-8.235,0],[0,-8.235],[8.235,0]],"v":[[14.91,0],[0,14.91],[-14.91,0],[0,-14.91]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.647058844566,0.141176477075,0.917647063732,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":204,"op":208,"st":0,"bm":0},{"ddd":0,"ind":58,"ty":4,"nm":"msg3","parent":4,"sr":1,"ks":{"r":{"a":1,"k":[{"i":{"x":[0.21],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":200,"s":[7.917]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.79],"y":[0]},"t":220,"s":[-17.3]},{"t":238,"s":[-9.118]}]},"p":{"a":1,"k":[{"i":{"x":0.21,"y":1},"o":{"x":0.333,"y":0},"t":200,"s":[50.669,228.857,0],"to":[19.792,-57.278,0],"ti":[15.789,12.94,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.79,"y":0},"t":220,"s":[28.229,79.545,0],"to":[-18.282,-14.983,0],"ti":[47.24,-52.256,0]},{"t":238,"s":[-40.831,133.857,0]}]},"s":{"a":1,"k":[{"i":{"x":[0.21,0.21,0.21],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":200,"s":[100,80,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.79,0.79,0.79],"y":[0,0,0]},"t":220,"s":[80,110,100]},{"t":238,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[5.671,0],[0,0],[0,-5.671],[0,0],[-5.671,0],[0,0],[0,5.671],[0,0]],"o":[[0,0],[-5.671,0],[0,0],[0,5.671],[0,0],[5.671,0],[0,0],[0,-5.671]],"v":[[62.304,-38.695],[-62.304,-38.695],[-72.572,-28.427],[-72.572,7.217],[-62.304,17.485],[62.304,17.485],[72.572,7.217],[72.572,-28.427]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.560784339905,0.729411780834,0.858823537827,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":204,"op":208,"st":0,"bm":0},{"ddd":0,"ind":59,"ty":4,"nm":"m23","parent":61,"sr":1,"ks":{"p":{"a":0,"k":[15.576,-10.738,0]},"a":{"a":0,"k":[-1541.184,1009.518,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-6.79,0],[6.79,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1513.76,1000.998]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-8.009,0],[8.009,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1528.516,1018.038]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-11.183,0],[11.183,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1564.215,1018.038]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-19.969,0],[19.969,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1555.429,1000.998]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":60,"ty":4,"nm":"m22","parent":61,"sr":1,"ks":{"p":{"a":0,"k":[-44.199,-10.205,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-8.235],[8.235,0],[0,8.235],[-8.235,0]],"o":[[0,8.235],[-8.235,0],[0,-8.235],[8.235,0]],"v":[[14.91,0],[0,14.91],[-14.91,0],[0,-14.91]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.647058844566,0.141176477075,0.917647063732,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":61,"ty":4,"nm":"msg7","parent":4,"sr":1,"ks":{"r":{"a":0,"k":7.917},"p":{"a":0,"k":[50.669,228.857,0]},"s":{"a":0,"k":[100,80,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[5.671,0],[0,0],[0,-5.671],[0,0],[-5.671,0],[0,0],[0,5.671],[0,0]],"o":[[0,0],[-5.671,0],[0,0],[0,5.671],[0,0],[5.671,0],[0,0],[0,-5.671]],"v":[[62.304,-38.695],[-62.304,-38.695],[-72.572,-28.427],[-72.572,7.217],[-62.304,17.485],[62.304,17.485],[72.572,7.217],[72.572,-28.427]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.560784339905,0.729411780834,0.858823537827,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":62,"ty":4,"nm":"suit4","parent":25,"sr":1,"ks":{"o":{"a":0,"k":22},"p":{"a":0,"k":[1.828,-12.763,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[16.274,-2.509],[0,0],[0,0],[-16.274,2.509],[0,0],[0,0]],"o":[[0,0],[0,0],[11.278,3.911],[0,0],[0,0],[-7.774,-2.262]],"v":[[30.755,-14.328],[-99.853,5.808],[-80.643,12.471],[-30.756,15.01],[99.853,-5.126],[66.133,-14.764]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.521568655968,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":63,"ty":4,"nm":"suit3","parent":25,"sr":1,"ks":{"p":{"a":0,"k":[-0.001,-27.197,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[15.65,-2.413],[0,0],[10.845,3.761],[0,0],[-15.65,2.413],[0,0],[-10.845,-3.761],[0,0]],"o":[[0,0],[-15.65,2.413],[0,0],[-10.845,-3.761],[0,0],[15.65,-2.413],[0,0],[10.845,3.761]],"v":[[129.891,4.602],[-31.576,29.495],[-79.551,27.053],[-138.591,6.578],[-129.891,-4.602],[31.576,-29.495],[79.551,-27.053],[138.591,-6.578]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.521568655968,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.670588254929,0.949019610882,0.568627476692,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":64,"ty":4,"nm":"suit2","parent":25,"sr":1,"ks":{"p":{"a":0,"k":[-75.628,-68.335,0]},"a":{"a":0,"k":[207.107,377.635,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-14.019,1.984],[0,0],[-0.625,0.114],[0,0],[14.019,-1.984],[0,0],[0.625,-0.114],[0,0]],"o":[[0,0],[0.654,-0.093],[0,0],[-4.911,-6.795],[0,0],[-0.654,0.092],[0,0],[4.911,6.795]],"v":[[-49.636,33.235],[104.622,10.011],[108.722,8.594],[84.889,-24.519],[50.613,-33.23],[-102.267,-11.193],[-108.722,-10.133],[-88.035,24.464]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.521568655968,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[209.384,376.461]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":22},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[14.019,-1.984],[0,0],[17.559,24.458],[0,0],[-14.019,1.984],[0,0],[-9.688,-12.516],[0,0]],"o":[[0,0],[-14.019,1.984],[-4.4,-6.129],[-4.911,-6.795],[0,0],[14.019,-1.984],[0,0],[4.911,6.795]],"v":[[98.7,19.633],[-54.18,41.67],[-97.522,20.417],[-115.191,-4.03],[-98.7,-19.926],[54.18,-41.964],[91.219,-29.432],[115.191,3.737]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.423529411765,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.670588254929,0.949019610882,0.568627476692,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[209.806,367.965]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[2.888,3.996],[0,0],[15.194,-2.151],[0,0],[0.329,-5.855],[-14.452,-20.429],[-15.194,2.151],[0,0],[5.323,7.364]],"o":[[3.977,-3.257],[0,0],[-5.323,-7.364],[0,0],[-12.261,1.736],[-0.732,13.037],[17.335,24.505],[0,0],[15.194,-2.151],[0,0]],"v":[[118.284,9.19],[120.415,-2.158],[91.439,-42.249],[54.29,-51.689],[-102.469,-29.502],[-121.98,-16.535],[-104.231,27.675],[-54.218,51.554],[102.541,29.367],[120.415,12.138]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.423529411765,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.752941191196,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[207.107,377.681]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":65,"ty":4,"nm":"body_bl","parent":67,"sr":1,"ks":{"r":{"a":0,"k":-1.29},"p":{"a":0,"k":[102.397,8.744,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0.54,-11.419],[30.736,-6.603]],"o":[[-1.56,33.017],[0,0]],"v":[[44.275,41.845],[-25.723,88.554]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.988235294819,0.933333337307,0.129411771894,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":228,"s":[5]},{"t":240,"s":[5]}]},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":72,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":96,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":108,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":120,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":132,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":144,"s":[95]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":168,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":180,"s":[95]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":192,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":204,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":216,"s":[95]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":228,"s":[100]},{"t":240,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":0,"op":300,"st":114,"bm":0},{"ddd":0,"ind":66,"ty":4,"nm":"shk11","parent":85,"sr":1,"ks":{"p":{"a":0,"k":[-71.209,0,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-9.538,258.633],[15.572,256.883],[15.555,-174.633],[-9.555,-174.633]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.337254901961,0.549019607843,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.113725490868,0.662745118141,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":67,"ty":4,"nm":"body","parent":4,"sr":1,"ks":{"p":{"a":0,"k":[228.195,224.14,0]},"a":{"a":0,"k":[14.534,120.082,0]},"s":{"a":1,"k":[{"i":{"x":[0.58,0.58,0.58],"y":[1,1,1]},"o":{"x":[0.42,0.42,0.42],"y":[0,0,0]},"t":64,"s":[85,85,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.42,0.42,0.42],"y":[0,0,0]},"t":102,"s":[85,85,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":134,"s":[82,89,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":142,"s":[85,85,100]},{"i":{"x":[0.16,0.16,0.16],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":156,"s":[82,89,100]},{"t":202,"s":[85,85,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[71.236,0],[5.951,48.89],[-2.28,8.971],[-3.181,9.755],[-80.635,0],[-6.187,-110.17]],"o":[[-70.876,0],[-1.557,-12.791],[3.674,-14.455],[26.406,-80.973],[88.008,0],[4.493,80.01]],"v":[[9.675,120.069],[-140.849,57.414],[-139.413,21.699],[-130.895,-8.477],[9.675,-96.715],[170.594,42.9]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.980392158031,0.564705908298,0.086274512112,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11.765},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.835294127464,0.152941182256,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":158,"bm":0},{"ddd":0,"ind":68,"ty":4,"nm":"emj","parent":4,"sr":1,"ks":{"p":{"a":0,"k":[-74.051,114.539,0]},"a":{"a":0,"k":[-190.48,-156.062,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.695,1.02],[-5.02,-7.607],[1.674,1.517],[4.964,-1.153]],"o":[[4.301,-2.589],[1.712,2.594],[-3.673,-3.328],[-1.855,0.431]],"v":[[-215.802,-167.603],[-197.464,-163.141],[-198.952,-160.748],[-215.206,-165.677]],"c":true}},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[1.559,1.02],[4.618,-7.607],[-1.54,1.517],[-4.566,-1.153]],"o":[[-3.956,-2.589],[-1.575,2.594],[3.378,-3.328],[1.706,0.431]],"v":[[-166.309,-168.103],[-183.177,-163.641],[-181.809,-161.248],[-166.858,-166.177]],"c":true}},"nm":"Path 2","hd":false},{"ty":"fl","c":{"a":0,"k":[0.389981617647,0.150689472872,0.054972592522,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[11.707,0],[-3.452,-1.859],[-9.616,0],[-2.981,1.606]],"o":[[-12.057,0],[2.981,1.606],[9.616,0],[3.452,-1.86]],"v":[[-189.813,-144.844],[-206.673,-134.356],[-189.813,-137.234],[-172.952,-134.356]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.389981617647,0.150689472872,0.054972592522,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0.08,-3.716],[3.256,0],[0.055,4.63],[-4.081,0]],"o":[[-0.072,3.366],[-3.256,0],[-0.032,-2.669],[4.345,0]],"v":[[-196.58,-155.422],[-202.717,-149.004],[-208.369,-155.422],[-202.474,-163]],"c":true}},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.18,-3.712],[-3.172,0.087],[0.073,4.63],[3.976,-0.109]],"o":[[0.163,3.363],[3.172,-0.087],[-0.042,-2.669],[-4.234,0.116]],"v":[[-184.029,-156.64],[-177.873,-150.389],[-172.543,-156.955],[-178.495,-164.373]],"c":true}},"nm":"Path 2","hd":false},{"ty":"fl","c":{"a":0,"k":[0.389981617647,0.150689472872,0.054972592522,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-21.673],[21.673,0],[0,21.673],[-21.673,0]],"o":[[0,21.673],[-21.673,0],[0,-21.673],[21.673,0]],"v":[[-151.238,-156.062],[-190.48,-116.82],[-229.722,-156.062],[-190.48,-195.304]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.616896446078,0.170748123468,0,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7.5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.364705882353,0.121568634931,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":69,"ty":4,"nm":"m25","parent":71,"sr":1,"ks":{"p":{"a":0,"k":[15.576,-10.738,0]},"a":{"a":0,"k":[-1541.184,1009.518,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-6.79,0],[6.79,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1513.76,1000.998]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-8.009,0],[8.009,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1528.516,1018.038]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-11.183,0],[11.183,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1564.215,1018.038]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-19.969,0],[19.969,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1555.429,1000.998]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false}],"ip":230,"op":300,"st":0,"bm":0},{"ddd":0,"ind":70,"ty":4,"nm":"m24","parent":71,"sr":1,"ks":{"p":{"a":0,"k":[-44.199,-10.205,0]},"s":{"a":0,"k":[118.064,118.064,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-8.235],[8.235,0],[0,8.235],[-8.235,0]],"o":[[0,8.235],[-8.235,0],[0,-8.235],[8.235,0]],"v":[[14.91,0],[0,14.91],[-14.91,0],[0,-14.91]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.458823529412,0.858823529412,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":230,"op":300,"st":0,"bm":0},{"ddd":0,"ind":71,"ty":4,"nm":"msg8","parent":58,"sr":1,"ks":{"r":{"a":0,"k":-1.944},"s":{"a":0,"k":[101.036,98.974,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[5.671,0],[0,0],[0,-5.671],[0,0],[-5.671,0],[0,0],[0,5.671],[0,0]],"o":[[0,0],[-5.671,0],[0,0],[0,5.671],[0,0],[5.671,0],[0,0],[0,-5.671]],"v":[[62.304,-38.695],[-62.304,-38.695],[-72.572,-28.427],[-72.572,7.217],[-62.304,17.485],[62.304,17.485],[72.572,7.217],[72.572,-28.427]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.560784339905,0.729411780834,0.858823537827,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":230,"op":300,"st":0,"bm":0},{"ddd":0,"ind":72,"ty":4,"nm":"shk10","parent":85,"sr":1,"ks":{"p":{"a":0,"k":[17.511,234.681,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.894,0],[0,0],[-1.275,-1.272],[0,-1.95],[0,0],[3.894,0],[0,0]],"o":[[0,0],[1.943,0],[1.28,1.276],[0,0],[0,3.894],[0,0],[-3.894,0]],"v":[[-84.727,-18.292],[77.677,-26.417],[82.655,-24.359],[84.727,-19.366],[84.727,0.991],[77.677,8.042],[-84.727,14.917]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.337254901961,0.549019607843,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.113725490868,0.662745118141,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":73,"ty":4,"nm":"shk9","parent":85,"sr":1,"ks":{"p":{"a":0,"k":[17.511,200.681,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.894,0],[0,0],[0,-3.894],[0,0],[3.894,0],[0,0]],"o":[[0,0],[3.894,0],[0,0],[0,3.894],[0,0],[-3.894,0]],"v":[[-84.727,-14.292],[77.677,-22.417],[84.727,-15.366],[84.727,0.991],[77.677,8.042],[-84.727,14.917]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.337254901961,0.549019607843,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.113725490868,0.662745118141,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":74,"ty":4,"nm":"shk8","parent":85,"sr":1,"ks":{"p":{"a":0,"k":[17.511,230.681,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[3.894,0],[0,0]],"o":[[0,0],[-3.894,0]],"v":[[77.677,13.042],[-84.727,20.542]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.337254901961,0.549019607843,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":75,"ty":4,"nm":"shk7","parent":85,"sr":1,"ks":{"p":{"a":0,"k":[17.511,91.181,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.894,0],[0,0],[0,-3.894],[0,0],[3.894,0],[0,0]],"o":[[0,0],[3.894,0],[0,0],[0,3.894],[0,0],[-3.894,0]],"v":[[-84.727,-13.042],[77.677,-18.042],[84.727,-10.991],[84.727,0.991],[77.677,8.042],[-84.727,13.042]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.337254901961,0.549019607843,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.113725490868,0.662745118141,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":76,"ty":4,"nm":"emj","parent":4,"sr":1,"ks":{"r":{"a":0,"k":338.778},"p":{"a":0,"k":[26.669,-117.143,0]},"a":{"a":0,"k":[-190.48,-156.062,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.901,1.761],[-8.279,-3.81],[2.222,0.404],[3.606,-3.6]],"o":[[2.286,-4.47],[2.823,1.299],[-4.876,-0.887],[-1.347,1.345]],"v":[[-220.441,-162.582],[-202.511,-168.474],[-202.511,-165.657],[-218.918,-161.261]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-11.886,0],[3.505,2.54],[9.762,0],[3.027,-2.193]],"o":[[12.241,0],[-3.027,-2.193],[-9.762,0],[-3.505,2.54]],"v":[[-189.557,-134.662],[-172.695,-142.112],[-189.557,-143.348],[-206.93,-142.112]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.623,-1.999],[5.025,0],[0.923,2.113],[-6.299,0]],"o":[[-1.033,1.272],[-5.025,0],[-0.74,-1.694],[6.707,0]],"v":[[-196.014,-153.33],[-205.112,-154.388],[-214.211,-153.33],[-205.112,-159.629]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-5.919],[3.944,0],[0,5.919],[-3.944,0]],"o":[[0,5.919],[-3.944,0],[0,-5.919],[3.944,0]],"v":[[-167.163,-160.603],[-174.305,-149.886],[-181.447,-160.603],[-174.305,-171.321]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447058826685,0.211764708161,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-21.673],[21.673,0],[0,21.673],[-21.673,0]],"o":[[0,21.673],[-21.673,0],[0,-21.673],[21.673,0]],"v":[[-151.238,-156.062],[-190.48,-116.82],[-229.722,-156.062],[-190.48,-195.304]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.980392216701,0.564705882353,0.086274509804,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7.5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.831372608858,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":77,"ty":4,"nm":"m19","parent":79,"sr":1,"ks":{"p":{"a":0,"k":[15.576,-10.738,0]},"a":{"a":0,"k":[-1541.184,1009.518,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-6.79,0],[6.79,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1513.76,1000.998]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-8.009,0],[8.009,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1528.516,1018.038]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-11.183,0],[11.183,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1564.215,1018.038]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-19.969,0],[19.969,0]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.411764711142,0.486274510622,0.411764711142,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[-1555.429,1000.998]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":78,"ty":4,"nm":"m18","parent":79,"sr":1,"ks":{"p":{"a":0,"k":[-44.199,-10.205,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-8.235],[8.235,0],[0,8.235],[-8.235,0]],"o":[[0,8.235],[-8.235,0],[0,-8.235],[8.235,0]],"v":[[14.91,0],[0,14.91],[-14.91,0],[0,-14.91]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.647058844566,0.141176477075,0.917647063732,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":79,"ty":4,"nm":"msg5","parent":4,"sr":1,"ks":{"r":{"a":0,"k":-9.118},"p":{"a":0,"k":[-40.831,133.857,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[5.671,0],[0,0],[0,-5.671],[0,0],[-5.671,0],[0,0],[0,5.671],[0,0]],"o":[[0,0],[-5.671,0],[0,0],[0,5.671],[0,0],[5.671,0],[0,0],[0,-5.671]],"v":[[62.304,-38.695],[-62.304,-38.695],[-72.572,-28.427],[-72.572,7.217],[-62.304,17.485],[62.304,17.485],[72.572,7.217],[72.572,-28.427]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.560784339905,0.729411780834,0.858823537827,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":80,"ty":4,"nm":"shk6","parent":85,"sr":1,"ks":{"p":{"a":0,"k":[17.511,-31.381,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.894,0],[0,0],[0,-3.894],[0,0],[3.894,0],[0,0]],"o":[[0,0],[3.894,0],[0,0],[0,3.894],[0,0],[-3.894,0]],"v":[[-84.727,-13.042],[77.677,-15.542],[84.727,-8.491],[84.727,3.491],[77.677,10.542],[-84.727,13.042]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.337254901961,0.549019607843,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.113725490868,0.662745118141,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":81,"ty":4,"nm":"shk5","parent":85,"sr":1,"ks":{"p":{"a":0,"k":[126.291,0,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-9.555,188.883],[15.555,188.883],[15.555,-169.633],[-9.555,-169.633]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.337254901961,0.549019607843,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.113725490868,0.662745118141,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":82,"ty":4,"nm":"shk4","parent":85,"sr":1,"ks":{"p":{"a":0,"k":[17.511,-158.942,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.894,0],[0,0],[0,-3.894],[0,0],[3.894,0],[0,0]],"o":[[0,0],[3.894,0],[0,0],[0,3.894],[0,0],[-3.894,0]],"v":[[-84.727,-13.042],[100.177,-8.042],[107.227,-0.991],[107.227,10.991],[100.177,18.042],[-84.727,13.042]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.337254901961,0.549019607843,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.113725490868,0.662745118141,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":83,"ty":4,"nm":"shk3","parent":85,"sr":1,"ks":{"p":{"a":0,"k":[19.021,-5.335,0]},"a":{"a":0,"k":[209.692,192.513,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[100.238,-13.754],[62.196,12.254],[-86.238,6.754],[-86.238,-19.254]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.337254901961,0.549019607843,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[209.692,69.951]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":50},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[86.238,-15.504],[48.196,10.504],[-86.238,10.504],[-86.238,-15.504]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.337254901961,0.549019607843,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[209.692,192.513]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":50},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[86.238,-18.004],[48.196,8.004],[-86.238,13.004],[-86.238,-13.004]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.337254901961,0.549019607843,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[209.692,315.075]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":50},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":84,"ty":4,"nm":"shk2","parent":85,"sr":1,"ks":{"p":{"a":0,"k":[24.464,0,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[42.99,237.883],[93.996,237.883],[94.181,-166.133],[-91.681,-166.133],[43.175,-166.133]],"c":true}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.33790471694,0.547530828738,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":10},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.030181849237,0.525752886604,0.832711014093,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":85,"ty":4,"nm":"shk1","parent":4,"sr":1,"ks":{"p":{"a":0,"k":[-54.4,-29.05,0]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-66.829,246.883],[67.604,246.883],[67.104,-166.883],[-67.329,-166.883]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.423529441684,0.686274509804,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"_020_WHATSAPP_loop_wide","refId":"comp_0","sr":1,"ks":{"p":{"a":0,"k":[256,256,0]},"a":{"a":0,"k":[281,256,0]},"s":{"a":0,"k":[85,85,100]}},"ao":0,"w":562,"h":512,"ip":0,"op":180,"st":-60,"bm":0}]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/import_progress.json b/TMessagesProj/src/main/res/raw/import_progress.json new file mode 100644 index 00000000000..c1c3cf84648 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/import_progress.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":""},"fr":60,"ip":0,"op":57,"w":28,"h":28,"nm":"Lottie Import","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Plane","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":1,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[13.924,5.246,0],"to":[0.013,1.848,0],"ti":[-0.013,-1.64,0]},{"t":50,"s":[14,16.333,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":0,"s":[16.667,16.667,100]},{"t":50,"s":[33.333,33.333,100]}],"ix":6}},"ao":0,"ef":[{"ty":28,"nm":"Set Matte","np":8,"mn":"ADBE Set Matte3","ix":1,"en":1,"ef":[{"ty":10,"nm":"Take Matte From Layer","mn":"ADBE Set Matte3-0001","ix":1,"v":{"a":0,"k":1,"ix":1}},{"ty":7,"nm":"Use For Matte","mn":"ADBE Set Matte3-0002","ix":2,"v":{"a":0,"k":4,"ix":2}},{"ty":7,"nm":"Invert Matte","mn":"ADBE Set Matte3-0003","ix":3,"v":{"a":0,"k":0,"ix":3}},{"ty":7,"nm":"If Layer Sizes Differ","mn":"ADBE Set Matte3-0004","ix":4,"v":{"a":0,"k":1,"ix":4}},{"ty":7,"nm":"Composite Matte with Original","mn":"ADBE Set Matte3-0005","ix":5,"v":{"a":0,"k":1,"ix":5}},{"ty":7,"nm":"Premultiply Matte Layer","mn":"ADBE Set Matte3-0006","ix":6,"v":{"a":0,"k":1,"ix":6}}]}],"shapes":[{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":31,"s":[{"i":[[-2.18,-0.36],[-2.23,-0.55],[-0.9,0],[-1.4,0.19],[-2.64,0],[0.66,-1.05],[1.36,-2.47],[1.16,-1.2],[0.31,0.33],[2.26,4.66],[1.31,2.36]],"o":[[2.65,0],[1.43,0.35],[0.9,0],[2.59,-0.36],[3.24,-0.26],[-0.67,1.05],[-2.51,4.76],[-0.38,0.4],[-1.09,-1.19],[-1.5,-2.87],[-1.32,-2.36]],"v":[[-9.104,-10.169],[-2.794,-8.579],[-0.284,-0.179],[2.536,-8.579],[9.076,-9.729],[10.156,-6.159],[6.146,1.011],[0.646,9.951],[-1.204,9.941],[-6.234,1.181],[-10.314,-6.459]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":36,"s":[{"i":[[-2.091,-0.298],[-2.197,-0.456],[-1.013,0],[-1.576,0.157],[-2.64,0],[0.547,-1.213],[1.411,-2.047],[1.448,-0.994],[0.315,0.273],[2.762,3.862],[1.086,2.283]],"o":[[2.65,0],[1.596,0.29],[1.015,0],[2.496,-0.298],[2.969,-0.215],[-0.555,1.213],[-2.957,3.945],[-0.373,0.331],[-1.397,-0.986],[-1.527,-2.378],[-1.094,-2.283]],"v":[[-9.771,-8.941],[-3.336,-7.623],[-0.237,-1.275],[3.128,-7.623],[9.748,-8.576],[11.157,-5.104],[7.32,1.352],[0.717,8.148],[-1.152,8.14],[-7.393,1.492],[-11.288,-5.353]],"c":true}]},{"t":50,"s":[{"i":[[-1.66,0],[-2.04,0],[-1.56,0],[-2.43,0],[-2.64,0],[0,-2],[1.66,0],[2.84,0],[0.34,0],[5.19,0],[0,1.91]],"o":[[2.65,0],[2.4,0],[1.57,0],[2.04,0],[1.66,0],[0,2],[-5.12,0],[-0.34,0],[-2.88,0],[-1.66,0],[0,-1.91]],"v":[[-13,-3],[-5.96,-3],[-0.01,-3],[5.99,-3],[13,-3],[16,0],[13,3],[1.06,3],[-0.9,3],[-13,3],[-16,0]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle Copy 4","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":57,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Rectangle Copy 3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":34,"s":[100]},{"t":42,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":34,"s":[14,19.333,0],"to":[0,0.278,0],"ti":[0,-0.278,0]},{"t":50,"s":[14,21,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":34,"s":[33.333,33.333,100]},{"t":46,"s":[33.333,23.667,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.66,0],[-2.04,0],[-1.56,0],[-2.43,0],[-2.64,0],[0,-2],[1.66,0],[2.84,0],[0.34,0],[5.19,0],[0,1.91]],"o":[[2.65,0],[2.4,0],[1.57,0],[2.04,0],[1.66,0],[0,2],[-5.12,0],[-0.34,0],[-2.88,0],[-1.66,0],[0,-1.91]],"v":[[-13,-3],[-5.96,-3],[-0.01,-3],[5.99,-3],[13,-3],[16,0],[13,3],[1.06,3],[-0.9,3],[-13,3],[-16,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle Copy 3","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":57,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Rectangle Copy 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":33,"s":[14,16.333,0],"to":[0,0.5,0],"ti":[0,0,0]},{"t":50,"s":[14,19.333,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[33.333,33.333,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.66,0],[-2.04,0],[-1.56,0],[-2.43,0],[-2.64,0],[0,-2],[1.66,0],[2.84,0],[0.34,0],[5.19,0],[0,1.91]],"o":[[2.65,0],[2.4,0],[1.57,0],[2.04,0],[1.66,0],[0,2],[-5.12,0],[-0.34,0],[-2.88,0],[-1.66,0],[0,-1.91]],"v":[[-13,-3],[-5.96,-3],[-0.01,-3],[5.99,-3],[13,-3],[16,0],[13,3],[1.06,3],[-0.9,3],[-13,3],[-16,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle Copy 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":57,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/imported.json b/TMessagesProj/src/main/res/raw/imported.json new file mode 100644 index 00000000000..324c0847785 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/imported.json @@ -0,0 +1 @@ +{"v":"5.7.6","fr":60,"ip":0,"op":120,"w":512,"h":512,"nm":"imported","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"scale","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[256,280.316,0],"ix":2,"l":2},"a":{"a":0,"k":[115,115,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"position2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.1,"y":1},"o":{"x":0.5,"y":0},"t":15,"s":[115,155,0],"to":[0,0,0],"ti":[0,0,0]},{"t":36.7578125,"s":[115,115,0]}],"ix":2,"l":2},"a":{"a":0,"k":[115,115,0],"ix":1,"l":2},"s":{"a":0,"k":[500,500,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":3,"nm":"position","parent":2,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.52,"y":1},"o":{"x":0.5,"y":0},"t":35.604,"s":[115,103.9,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"t":50,"s":[115,123.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.56,"y":1},"o":{"x":0.48,"y":0},"t":60.406,"s":[115,99.9,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.44,"y":0},"t":69.865,"s":[115,123.7,0],"to":[0,0,0],"ti":[0,0,0]},{"t":80.271484375,"s":[115,115.3,0]}],"ix":2,"l":2},"a":{"a":0,"k":[115,115,0],"ix":1,"l":2},"s":{"a":0,"k":[20,20,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"bubble","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.6,"y":0},"t":15,"s":[115,264.923,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.16,"y":1},"o":{"x":0.6,"y":0},"t":32.027,"s":[115,57.424,0],"to":[0,0,0],"ti":[0,0,0]},{"t":49.33984375,"s":[115,128.923,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":32.027,"s":[500,500,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":44.324,"s":[513,474,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":56.621,"s":[475,525,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":67.973,"s":[510,485,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":78.379,"s":[490,513,100]},{"i":{"x":[0.37,0.37,0.37],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":88.783,"s":[510,490,100]},{"t":100.134765625,"s":[500,500,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":22.568,"s":[{"i":[[-0.004,0],[0,0.004],[0,0],[0,0],[0,0],[0,0],[0,0.004],[0.004,0],[0,0],[0,0],[0.002,0],[0.002,-0.002],[0,0],[0,0],[0,0],[0,-0.004],[-0.004,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0.004,0],[0,0],[0,0],[0,0],[0,0],[0.004,0],[0,-0.004],[0,0],[0,0],[-0.002,-0.002],[-0.002,0],[0,0],[0,0],[0,0],[-0.004,0],[0,0.004],[0,0],[0,0],[0,0],[0,0],[0,0.004]],"v":[[0.184,-33.994],[0.191,-34.001],[0.191,-34.001],[0.191,-34.003],[0.184,-33.993],[0.184,-33.993],[0.191,-34.001],[0.184,-34.008],[0.184,-34.008],[0.189,-34.006],[0.184,-34.008],[0.178,-34.006],[0.178,-34.006],[0.183,-34.008],[0.184,-34.008],[0.176,-34.001],[0.184,-33.993],[0.184,-33.993],[0.184,-33.994],[0.176,-34.001],[0.176,-34.001]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.6,"y":0},"t":32.973,"s":[{"i":[[-0.004,0],[0,0.004],[0,0],[0,0],[0,0],[0,0],[0,0.004],[0.004,0],[0,0],[0,0],[0.002,0],[0.002,-0.002],[0,0],[0,0],[0,0],[0,-0.004],[-0.004,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0.004,0],[0,0],[0,0],[0,0],[0,0],[0.004,0],[0,-0.004],[0,0],[0,0],[-0.002,-0.002],[-0.002,0],[0,0],[0,0],[0,0],[-0.004,0],[0,0.004],[0,0],[0,0],[0,0],[0,0],[0,0.004]],"v":[[0.184,-27.994],[0.191,-28.001],[0.191,-28.001],[0.191,-28.003],[0.184,-27.993],[0.184,-27.993],[0.191,-28.001],[0.184,-28.008],[0.184,-28.008],[0.189,-28.006],[0.184,-28.008],[0.178,-28.006],[0.178,-28.006],[0.183,-28.008],[0.184,-28.008],[0.176,-28.001],[0.184,-27.993],[0.184,-27.993],[0.184,-27.994],[0.176,-28.001],[0.176,-28.001]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33.92,"s":[{"i":[[0.118,0],[0,-0.118],[0,0],[0,0],[0,0],[0,0],[0.054,-0.096],[-0.096,-0.054],[0,0],[0,0],[-0.065,0.005],[-0.048,0.051],[0,0],[0,0],[0,0],[0.051,0.091],[0.096,-0.054],[0,0],[0,0],[0,0],[0,0]],"o":[[-0.118,0],[0,0],[0,0],[0,0],[0,0],[-0.096,-0.054],[-0.054,0.096],[0,0],[0,0],[0.048,0.051],[0.067,0.004],[0,0],[0,0],[0,0],[0.086,-0.058],[-0.054,-0.096],[0,0],[0,0],[0,0],[0,0],[0,-0.118]],"v":[[0.193,-27.892],[-0.021,-27.678],[-0.021,-27.678],[-0.026,-27.386],[-0.261,-27.607],[-0.261,-27.607],[-0.534,-27.534],[-0.459,-27.262],[-0.459,-27.262],[-0.003,-26.778],[0.173,-26.713],[0.349,-26.778],[0.349,-26.778],[0.802,-27.261],[0.809,-27.269],[0.878,-27.532],[0.606,-27.607],[0.606,-27.607],[0.606,-27.607],[0.402,-27.437],[0.407,-27.678]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34.865,"s":[{"i":[[0.687,0],[0,-0.687],[0,0],[0,0],[0,0],[0,0],[0.304,-0.56],[-0.561,-0.306],[0,0],[0,0],[-0.381,0.028],[-0.28,0.295],[0,0],[0,0],[0,0],[0.291,0.535],[0.561,-0.305],[0,0],[0,0],[0,0],[0,0]],"o":[[-0.687,0],[0,0],[0,0],[0,0],[0,0],[-0.563,-0.305],[-0.305,0.562],[0,0],[0,0],[0.28,0.295],[0.388,0.022],[0,0],[0,0],[0,0],[0.502,-0.327],[-0.304,-0.56],[0,0],[0,0],[0,0],[0,0],[0,-0.687]],"v":[[0.221,-27.786],[-1.022,-26.543],[-1.022,-26.543],[-1.036,-24.513],[-2.328,-25.807],[-2.332,-25.81],[-3.912,-25.363],[-3.448,-23.792],[-3.448,-23.792],[-0.899,-21.062],[0.125,-20.685],[1.143,-21.062],[1.143,-21.062],[3.682,-23.781],[3.722,-23.827],[4.146,-25.352],[2.572,-25.81],[2.572,-25.81],[2.569,-25.806],[1.451,-24.813],[1.465,-26.543]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35.811,"s":[{"i":[[1.256,0],[0,-1.256],[0,0],[0,0],[0,0],[0,0],[0.555,-1.025],[-1.026,-0.559],[0,0],[0,0],[-0.696,0.051],[-0.511,0.54],[0,0],[0,0],[0,0],[0.53,0.979],[1.027,-0.556],[0,0],[0,0],[0,0],[0,0]],"o":[[-1.256,0],[0,0],[0,0],[0,0],[0,0],[-1.029,-0.557],[-0.556,1.028],[0,0],[0,0],[0.511,0.54],[0.71,0.039],[0,0],[0,0],[0,0],[0.918,-0.596],[-0.555,-1.025],[0,0],[0,0],[0,0],[0,0],[0,-1.256]],"v":[[0.268,-27.981],[-2.006,-25.707],[-2.006,-25.707],[-2.046,-21.64],[-4.395,-24.007],[-4.402,-24.012],[-7.289,-23.191],[-6.438,-20.321],[-6.438,-20.321],[-1.795,-15.346],[0.076,-14.658],[1.938,-15.346],[1.938,-15.346],[6.562,-20.302],[6.635,-20.384],[7.413,-23.173],[4.538,-24.013],[4.538,-24.013],[4.533,-24.005],[2.501,-22.189],[2.541,-25.707]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":39.596,"s":[{"i":[[1.49,0],[0,-1.022],[0,0],[0,0],[0,0],[0,0],[0.97,-0.756],[-1.088,-0.643],[0,0],[0,0],[-0.826,0.077],[-0.635,0.439],[0,0],[0,0],[0,0],[1.121,0.352],[0.796,-0.982],[0,0],[0,0],[0,0],[0,0]],"o":[[-1.49,0],[0,0],[0,0],[0,0],[0,0],[-1.092,-0.642],[-0.973,0.758],[0,0],[0,0],[0.635,0.439],[0.829,0.074],[0,0],[0,0],[0,0],[0.657,-0.945],[-1.173,-0.368],[0,0],[0,0],[0,0],[0,0],[0,-1.022]],"v":[[0.318,-16.778],[-2.38,-14.928],[-2.38,-14.928],[-2.369,-9.375],[-4.482,-12.173],[-4.483,-12.174],[-8.219,-11.973],[-8.011,-9.437],[-8.011,-9.437],[-2.3,-0.353],[0.019,0.178],[2.335,-0.353],[2.335,-0.353],[9.156,-9.557],[9.246,-9.692],[8.464,-12.006],[4.896,-10.894],[4.896,-10.894],[4.895,-10.89],[3.025,-8.422],[3.017,-14.928]],"c":true}]},{"i":{"x":0.11,"y":1},"o":{"x":0.7,"y":0},"t":44.324,"s":[{"i":[[1.567,0],[0,-0.946],[0,0],[0,0],[0,0],[0,0],[0.623,-1.132],[-1.125,-0.261],[0,0],[-0.739,-0.171],[-1.062,0],[-0.198,0.041],[0,0],[0,0],[0,0],[0.14,1.194],[1.235,0.393],[0,0],[0,0],[0,0],[0,0]],"o":[[-1.567,0],[0,0],[0,0],[0,0],[0,0],[-1.298,-0.024],[-0.625,1.135],[0,0],[0,0],[0.739,0.171],[1.062,0],[0.198,-0.041],[0,0],[0,0],[0.84,-0.256],[-0.15,-1.283],[0,0],[0,0],[0,0],[0,0],[0,-0.946]],"v":[[0.341,-12.261],[-2.495,-10.549],[-2.495,-10.549],[-2.495,-0.356],[-10.064,-1.483],[-10.064,-1.483],[-13.438,0.023],[-12.325,2.625],[-12.325,2.625],[-2.464,4.518],[0.001,4.685],[2.464,4.518],[2.464,4.518],[13.236,2.472],[13.41,2.52],[14.96,0.32],[12.416,-2.143],[12.416,-2.143],[12.413,-2.144],[3.179,-0.769],[3.178,-10.549]],"c":true}]},{"i":{"x":0.11,"y":1},"o":{"x":0.167,"y":0},"t":56.621,"s":[{"i":[[1.256,0],[0,-1.256],[0,0],[0,0],[0,0],[0,0],[1.106,-0.592],[-0.591,-1.11],[0,0],[0,0],[-0.696,0.113],[-0.541,0.54],[0,0],[0,0],[0,0],[1.104,0.466],[0.489,-1.158],[0,0],[0,0],[0,0],[0,0]],"o":[[-1.256,0],[0,0],[0,0],[0,0],[0,0],[-0.595,-1.11],[-1.109,0.594],[0,0],[0,0],[0.541,0.54],[0.696,0.113],[0,0],[0,0],[0,0],[0.371,-1.119],[-1.155,-0.488],[0,0],[0,0],[0,0],[0,0],[0,-1.256]],"v":[[0.273,-28.546],[-2,-26.272],[-2,-26.272],[-2.031,-8.339],[-4.634,-12.723],[-4.634,-12.723],[-7.711,-13.658],[-8.647,-10.574],[-8.647,-10.574],[-2.041,-0.267],[-0.066,0.37],[1.909,-0.267],[1.909,-0.267],[8.859,-10.439],[8.921,-10.606],[7.641,-13.423],[4.665,-12.211],[4.665,-12.211],[4.664,-12.209],[2.463,-8.488],[2.547,-26.272]],"c":true}]},{"i":{"x":0.11,"y":1},"o":{"x":0.167,"y":0},"t":67.973,"s":[{"i":[[1.256,0],[0,-1.256],[0,0],[0,0],[0,0],[0,0],[0.886,-0.888],[-0.888,-0.891],[0,0],[0,0],[-0.696,0.113],[-0.541,0.54],[0,0],[0,0],[0,0],[0.846,0.848],[0.89,-0.888],[0,0],[0,0],[0,0],[0,0]],"o":[[-1.256,0],[0,0],[0,0],[0,0],[0,0],[-0.892,-0.89],[-0.888,0.891],[0,0],[0,0],[0.541,0.54],[0.696,0.113],[0,0],[0,0],[0,0],[0.766,-0.896],[-0.886,-0.888],[0,0],[0,0],[0,0],[0,0],[0,-1.256]],"v":[[0.273,-16.746],[-2,-14.472],[-2,-14.472],[-2,-6.139],[-7.119,-11.27],[-7.119,-11.27],[-10.334,-11.27],[-10.334,-8.047],[-10.334,-8.047],[-1.975,0.333],[0,0.97],[1.975,0.333],[1.975,0.333],[10.334,-8.047],[10.455,-8.178],[10.334,-11.27],[7.121,-11.272],[7.121,-11.272],[7.119,-11.27],[2.547,-6.688],[2.547,-14.472]],"c":true}]},{"t":78.37890625,"s":[{"i":[[1.256,0],[0,-1.256],[0,0],[0,0],[0,0],[0,0],[0.886,-0.888],[-0.888,-0.891],[0,0],[0,0],[-0.696,0.113],[-0.541,0.54],[0,0],[0,0],[0,0],[0.846,0.848],[0.89,-0.888],[0,0],[0,0],[0,0],[0,0]],"o":[[-1.256,0],[0,0],[0,0],[0,0],[0,0],[-0.892,-0.89],[-0.888,0.891],[0,0],[0,0],[0.541,0.54],[0.696,0.113],[0,0],[0,0],[0,0],[0.766,-0.896],[-0.886,-0.888],[0,0],[0,0],[0,0],[0,0],[0,-1.256]],"v":[[0.273,-21.946],[-2,-19.672],[-2,-19.672],[-2,-6.139],[-7.119,-11.27],[-7.119,-11.27],[-10.334,-11.27],[-10.334,-8.047],[-10.334,-8.047],[-1.975,0.333],[0,0.97],[1.975,0.333],[1.975,0.333],[10.334,-8.047],[10.455,-8.178],[10.334,-11.27],[7.121,-11.272],[7.121,-11.272],[7.119,-11.27],[2.547,-6.688],[2.547,-19.672]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.16,"y":1},"o":{"x":0.7,"y":0},"t":15,"s":[{"i":[[0,0],[0,-0.022],[0,0],[0.021,-0.001],[0,0],[0.004,0],[0,0],[0.005,0],[0.001,0],[0,0],[0.002,0],[0,0],[0,0.019],[0,0],[-0.022,0]],"o":[[0.022,0],[0,0],[0,0.021],[0,0],[-0.003,0],[0,0],[-0.005,0],[-0.002,0],[0,0],[-0.001,0],[0,0],[-0.019,-0.001],[0,0],[0,-0.022],[0,0]],"v":[[0.286,-10.725],[0.325,-10.685],[0.325,-10.674],[0.287,-10.633],[0.285,-10.632],[0.276,-10.632],[0.276,-10.632],[0.273,-10.632],[0.271,-10.632],[0.27,-10.632],[0.266,-10.632],[0.266,-10.632],[0.231,-10.671],[0.231,-10.685],[0.271,-10.725]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.7,"y":0},"t":22.568,"s":[{"i":[[0,0],[0,-3.54],[0,0],[3.434,-0.142],[0,0],[0.658,-0.004],[0,0],[0.833,-0.002],[0.175,-0.003],[0,0],[0.404,0.026],[0,0],[0,3.17],[0,0],[-3.54,0]],"o":[[3.54,0],[0,0],[0,3.437],[0,0],[-0.556,0.023],[0,0],[-0.79,0.003],[-0.336,-0.002],[0,0],[-0.237,-0.003],[0,0],[-3.163,-0.204],[0,0],[0,-3.54],[0,0]],"v":[[10.59,-34],[17,-27.59],[17,-0.296],[10.855,6.108],[3.894,6.563],[2.367,6.556],[-2.085,6.55],[-4.933,6.555],[-5.632,6.555],[-5.719,6.555],[-6.458,6.552],[-11.375,6.216],[-17,0.217],[-17,-27.59],[-10.59,-34]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":35.811,"s":[{"i":[[0,0],[0,-3.54],[0,0],[3.434,-0.142],[0,0],[0.423,-0.362],[0,0],[0.719,0.841],[0.025,0.437],[0,0],[0.404,0.026],[0,0],[0,3.17],[0,0],[-3.54,0]],"o":[[3.54,0],[0,0],[0,3.437],[0,0],[-0.556,0.023],[0,0],[-0.841,0.719],[-0.285,-0.333],[0,0],[-0.023,-0.404],[0,0],[-3.163,-0.204],[0,0],[0,-3.54],[0,0]],"v":[[18.59,-27.943],[25,-21.533],[25.069,-13.039],[18.924,-6.635],[3.938,-6.237],[2.427,-5.644],[-6.011,1.575],[-8.835,1.355],[-9.313,0.168],[-9.641,-5.514],[-10.389,-6.267],[-19.106,-6.51],[-24.731,-12.509],[-24.8,-21.517],[-18.39,-27.926]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.7,"y":0},"t":44.324,"s":[{"i":[[0,0],[0,-3.54],[0,0],[3.434,-0.142],[0,0],[0.593,-0.103],[2.417,-0.45],[2.073,0.094],[0.104,0.561],[0,0],[0.404,0.026],[0,0],[0,3.17],[0,0],[-3.54,0]],"o":[[3.54,0],[0,0],[0,3.437],[0,0],[-0.556,0.023],[0,0],[-2.166,0.404],[-1.941,-0.088],[-0.104,-0.561],[-0.178,-0.114],[0,0],[-3.163,-0.204],[0,0],[0,-3.54],[0,0]],"v":[[18.59,-18.2],[25,-11.79],[25,-0.296],[18.855,6.108],[9.387,6.569],[7.865,6.729],[-3.667,10.414],[-11.309,11.902],[-13.446,10.475],[-13.616,6.802],[-14.358,6.591],[-19.375,6.216],[-25,0.217],[-25,-11.79],[-18.59,-18.2]],"c":true}]},{"i":{"x":0.16,"y":1},"o":{"x":0.167,"y":0.167},"t":50,"s":[{"i":[[0,0],[0,-3.54],[0,0],[3.434,-0.142],[0,0],[0.498,-0.247],[0,0],[0.755,0.572],[0.073,0.297],[0,0],[0.404,0.026],[0,0],[0,3.17],[0,0],[-3.54,0]],"o":[[3.54,0],[0,0],[0,3.437],[0,0],[-0.556,0.023],[0,0],[-0.825,0.491],[-0.301,-0.227],[0,0],[-0.092,-0.276],[0,0],[-3.163,-0.204],[0,0],[0,-3.54],[0,0]],"v":[[14.355,-28.559],[20.765,-22.149],[20.765,-1.414],[14.62,4.991],[3.877,5.445],[2.361,5.847],[-6.007,12.272],[-8.839,12.124],[-9.387,11.316],[-9.713,5.936],[-10.458,5.421],[-15.14,5.099],[-20.765,-0.9],[-20.765,-22.149],[-14.355,-28.559]],"c":true}]},{"i":{"x":0.16,"y":1},"o":{"x":0.167,"y":0},"t":56.621,"s":[{"i":[[0,0],[0,-3.54],[0,0],[3.434,-0.142],[0,0],[0.423,-0.362],[0,0],[0.989,0.496],[0.193,0.393],[0,0],[0.404,0.026],[0,0],[0,3.17],[0,0],[-3.54,0]],"o":[[3.54,0],[0,0],[0,3.437],[0,0],[-0.556,0.023],[0,0],[-0.496,0.989],[-0.391,-0.196],[0,0],[-0.023,-0.404],[0,0],[-3.163,-0.204],[0,0],[0,-3.54],[0,0]],"v":[[12.59,-32],[19,-25.59],[19,-2.296],[12.855,4.108],[3.869,4.563],[2.359,5.156],[-2.351,15.508],[-5.039,16.4],[-5.94,15.491],[-9.71,5.286],[-10.458,4.533],[-13.375,4.216],[-19,-1.783],[-19,-25.59],[-12.59,-32]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":67.973,"s":[{"i":[[0,0],[0,-3.54],[0,0],[3.434,-0.142],[0,0],[0.423,-0.362],[-0.139,-2.772],[1.106,-0.039],[0.416,0.301],[0,0],[0.404,0.026],[0,0],[0,3.17],[0,0],[-3.54,0]],"o":[[3.54,0],[0,0],[0,3.437],[0,0],[-0.556,0.023],[0,0],[0.056,1.127],[-0.438,0.015],[-3.982,-2.879],[-0.023,-0.404],[0,0],[-3.163,-0.204],[0,0],[0,-3.54],[0,0]],"v":[[17.39,-22.745],[23.8,-16.335],[23.8,-0.241],[17.655,6.163],[3.869,6.563],[2.359,7.156],[1.839,13.617],[-0.043,15.689],[-1.268,15.323],[-9.71,7.286],[-10.458,6.533],[-17.575,6.288],[-23.2,0.289],[-23.2,-16.319],[-16.79,-22.729]],"c":true}]},{"i":{"x":0.5,"y":1},"o":{"x":0.167,"y":0.167},"t":72.703,"s":[{"i":[[0,0],[0,-3.54],[0,0],[3.434,-0.142],[0,0],[0.423,-0.362],[-0.793,-5.123],[1.042,0.037],[0.317,0.196],[0,0],[0.404,0.026],[0,0],[0,3.17],[0,0],[-3.54,0]],"o":[[3.54,0],[0,0],[0,3.437],[0,0],[-0.556,0.023],[0,0],[0.157,1.017],[-0.413,-0.015],[-3.26,-2.018],[-0.023,-0.404],[0,0],[-3.163,-0.204],[0,0],[0,-3.54],[0,0]],"v":[[14.59,-28],[21,-21.59],[21,-0.296],[14.855,6.108],[3.869,6.563],[2.359,7.156],[-1.957,13.373],[-3.912,15.193],[-5.09,14.718],[-9.71,7.286],[-10.458,6.533],[-15.375,6.216],[-21,0.217],[-21,-21.59],[-14.59,-28]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.5,"y":0},"t":78.379,"s":[{"i":[[0,0],[0,-3.54],[0,0],[3.434,-0.142],[0,0],[0.423,-0.362],[5.561,-1.047],[0.372,1.042],[-0.293,0.376],[0,0],[0.404,0.026],[0,0],[0,3.17],[0,0],[-3.54,0]],"o":[[3.54,0],[0,0],[0,3.437],[0,0],[-0.556,0.023],[0,0],[-1.098,0.207],[-0.147,-0.412],[1.444,-1.855],[-0.023,-0.404],[0,0],[-3.163,-0.204],[0,0],[0,-3.54],[0,0]],"v":[[14.59,-28],[21,-21.59],[21,-0.296],[14.855,6.108],[3.869,6.563],[2.359,7.156],[-9.511,14.141],[-12.071,12.928],[-11.944,11.249],[-9.71,7.286],[-10.458,6.533],[-15.375,6.216],[-21,0.217],[-21,-21.59],[-14.59,-28]],"c":true}]},{"i":{"x":0.21,"y":1},"o":{"x":0.167,"y":0.167},"t":83.109,"s":[{"i":[[0,0],[0,-3.54],[0,0],[3.434,-0.142],[0,0],[0.423,-0.362],[3.4,-0.532],[0.371,1.025],[-0.295,0.582],[0,0],[0.404,0.026],[0,0],[0,3.17],[0,0],[-3.54,0]],"o":[[3.54,0],[0,0],[0,3.437],[0,0],[-0.556,0.023],[0,0],[-1.363,0.213],[-0.147,-0.406],[0.858,-1.694],[-0.023,-0.404],[0,0],[-3.163,-0.204],[0,0],[0,-3.54],[0,0]],"v":[[14.59,-28],[21,-21.59],[21,-0.296],[14.855,6.108],[3.869,6.563],[2.359,7.156],[-7.511,13.456],[-10.037,12.271],[-9.983,10.89],[-9.71,7.286],[-10.458,6.533],[-15.375,6.216],[-21,0.217],[-21,-21.59],[-14.59,-28]],"c":true}]},{"i":{"x":0.21,"y":1},"o":{"x":0.167,"y":0},"t":88.783,"s":[{"i":[[0,0],[0,-3.54],[0,0],[3.434,-0.142],[0,0],[0.423,-0.362],[1.595,-2.354],[0.947,0.571],[0.193,0.455],[0,0],[0.404,0.026],[0,0],[0,3.17],[0,0],[-3.54,0]],"o":[[3.54,0],[0,0],[0,3.437],[0,0],[-0.556,0.023],[0,0],[-0.516,0.762],[-0.375,-0.226],[-1.078,-2.545],[-0.023,-0.404],[0,0],[-3.163,-0.204],[0,0],[0,-3.54],[0,0]],"v":[[14.59,-28],[21,-21.59],[21,-0.296],[14.855,6.108],[3.869,6.563],[2.359,7.156],[-4.193,14.143],[-6.942,14.824],[-7.77,13.849],[-9.71,7.286],[-10.458,6.533],[-15.375,6.216],[-21,0.217],[-21,-21.59],[-14.59,-28]],"c":true}]},{"t":97.296875,"s":[{"i":[[0,0],[0,-3.54],[0,0],[3.434,-0.142],[0,0],[0.423,-0.362],[0,0],[0.719,0.841],[0.025,0.437],[0,0],[0.404,0.026],[0,0],[0,3.17],[0,0],[-3.54,0]],"o":[[3.54,0],[0,0],[0,3.437],[0,0],[-0.556,0.023],[0,0],[-0.841,0.719],[-0.285,-0.333],[0,0],[-0.023,-0.404],[0,0],[-3.163,-0.204],[0,0],[0,-3.54],[0,0]],"v":[[14.59,-28],[21,-21.59],[21,-0.296],[14.855,6.108],[3.869,6.563],[2.359,7.156],[-6.08,14.375],[-8.904,14.155],[-9.382,12.968],[-9.71,7.286],[-10.458,6.533],[-15.375,6.216],[-21,0.217],[-21,-21.59],[-14.59,-28]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Combined-Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"box","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.1,"y":1},"o":{"x":0.6,"y":0},"t":0.027,"s":[114.929,150.293,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.6,"y":0.6},"t":27.297,"s":[114.929,138.693,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.5,"y":0},"t":35.811,"s":[114.929,138.693,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.52,"y":1},"o":{"x":0.48,"y":0},"t":50,"s":[114.929,146.293,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.56,"y":1},"o":{"x":0.48,"y":0},"t":60.406,"s":[114.929,134.293,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.44,"y":0},"t":69.684,"s":[114.929,148.693,0],"to":[0,0,0],"ti":[0,0,0]},{"t":80.271484375,"s":[114.929,146.293,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-0.071,19.377,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0.027,"s":[0,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":4.758,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":32.027,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":45.271,"s":[105,95,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":57.568,"s":[97,103,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":69.865,"s":[102,98,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":80.271,"s":[99,101,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":89.73,"s":[101,99,100]},{"t":102.02734375,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.824},"o":{"x":0.6,"y":0},"t":3.811,"s":[{"i":[[0,0],[0,0],[0.149,0],[0,0],[0.419,0],[0,0]],"o":[[0,0],[-0.469,0],[0,0],[-0.499,0],[0,0],[0,0]],"v":[[0.643,19.352],[0.519,19.352],[0.151,19.368],[-0.151,19.368],[-0.661,19.377],[-0.785,19.377]],"c":false}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0.176},"t":11.379,"s":[{"i":[[0,0],[0,0],[4.467,0],[0,0],[0.063,3.407],[0,0]],"o":[[0,0],[-0.071,3.407],[0,0],[-4.519,0],[0,0],[0,0]],"v":[[25.579,13.134],[25.561,13.197],[17.458,19.368],[-17.458,19.368],[-25.582,13.2],[-25.601,13.138]],"c":false}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0},"t":27.297,"s":[{"i":[[0,0],[0,0],[5.232,0],[0,0],[0,4.011],[0,0]],"o":[[0,0],[0,4.011],[0,0],[-5.232,0],[0,0],[0,0]],"v":[[30,-19.368],[30,12.105],[20.526,19.368],[-20.526,19.368],[-30,12.105],[-30,-19.368]],"c":false}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0},"t":35.811,"s":[{"i":[[0,0],[0,0],[5.232,0],[0,0],[0,4.011],[0,0]],"o":[[0,0],[0,4.011],[0,0],[-5.232,0],[0,0],[0,0]],"v":[[30,-19.368],[30,12.105],[20.526,19.368],[-20.526,19.368],[-30,12.105],[-30,-19.368]],"c":false}]},{"i":{"x":0.1,"y":1},"o":{"x":0.7,"y":0},"t":44.324,"s":[{"i":[[0,0],[0,0],[5.232,0],[0,0],[0,4.011],[0,0]],"o":[[0,0],[0,4.011],[0,0],[-5.232,0],[0,0],[0,0]],"v":[[34,-11.368],[34,12.105],[24.526,19.368],[-24.526,19.368],[-34,12.105],[-34,-11.368]],"c":false}]},{"i":{"x":0.1,"y":1},"o":{"x":0.167,"y":0},"t":56.621,"s":[{"i":[[0,0],[0,0],[5.232,0],[0,0],[0,4.011],[0,0]],"o":[[0,0],[0,4.011],[0,0],[-5.232,0],[0,0],[0,0]],"v":[[26,-27.368],[26,12.105],[16.526,19.368],[-16.526,19.368],[-26,12.105],[-26,-27.368]],"c":false}]},{"t":67.97265625,"s":[{"i":[[0,0],[0,0],[5.232,0],[0,0],[0,4.011],[0,0]],"o":[[0,0],[0,4.011],[0,0],[-5.232,0],[0,0],[0,0]],"v":[[30,-19.368],[30,12.105],[20.526,19.368],[-20.526,19.368],[-30,12.105],[-30,-19.368]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":120,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/passcode_lock_close.json b/TMessagesProj/src/main/res/raw/passcode_lock_close.json new file mode 100644 index 00000000000..345f26f4197 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/passcode_lock_close.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":""},"fr":60,"ip":30,"op":69,"w":512,"h":512,"nm":"Lock Close","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Lines Splash","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[93.803,145.08,0],"ix":2},"a":{"a":0,"k":[-176.197,-117.92,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-234.918,-33.201],[-147.825,-63.873]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":26,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-139.243,-195.562],[-124.459,-104.914]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":26,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-213.84,-130.997],[-133.812,-83.044]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":26,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":52,"s":[100]},{"t":64,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":50,"s":[100]},{"t":62,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":4,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":52,"op":65,"st":48,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Top","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.32,"y":0},"t":30,"s":[61.647,-67.414,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.5,"y":0},"t":35,"s":[61.14,-57.326,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.72,"y":1},"o":{"x":0.68,"y":0},"t":46,"s":[62.349,-70.953,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.28,"y":0},"t":54,"s":[62.176,-33.576,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.167,"y":0},"t":62,"s":[61.228,-51.414,0],"to":[0,0,0],"ti":[0,0,0]},{"t":68,"s":[61.368,-47.417,0]}],"ix":2},"a":{"a":0,"k":[61.368,-47.417,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.32,"y":0},"t":30,"s":[{"i":[[0,0],[0,0],[35.335,4.464],[2.887,0],[2.867,-0.367],[-0.247,-34.453],[0,0]],"o":[[0,0],[-0.731,-35.171],[-2.903,-0.367],[-2.887,0],[-34.599,4.426],[0,0],[0,0]],"v":[[200.896,-61.192],[200.909,-109.215],[138.503,-178.857],[129.809,-179.412],[121.17,-178.857],[61.363,-110.094],[61.463,-30.917]],"c":false}]},{"i":{"x":0.4,"y":1},"o":{"x":0.5,"y":0},"t":36,"s":[{"i":[[0,0],[0,0],[40.628,4.464],[3.319,0],[3.296,-0.367],[-0.284,-34.453],[0,0]],"o":[[0,0],[-0.841,-35.171],[-3.337,-0.367],[-3.319,0],[-39.783,4.426],[0,0],[0,0]],"v":[[221.836,-61.192],[221.851,-109.215],[150.096,-178.857],[140.099,-179.412],[130.166,-178.857],[61.4,-110.094],[61.515,-30.917]],"c":false}]},{"i":{"x":0.72,"y":1},"o":{"x":0.68,"y":0},"t":46,"s":[{"i":[[0,0],[0,0],[-35.659,4.562],[-2.913,0],[-2.893,-0.375],[0.25,-35.208],[0,0]],"o":[[0,0],[0.738,-35.942],[2.929,-0.375],[2.913,0],[34.917,4.523],[0,0],[0,0]],"v":[[-80.085,-64.577],[-79.46,-103.926],[-16.482,-175.094],[-7.708,-175.662],[1.011,-175.094],[61.366,-104.825],[60.805,-34.417]],"c":false}]},{"i":{"x":0.7,"y":1},"o":{"x":0.28,"y":0},"t":54,"s":[{"i":[[0,0],[0,0],[-35.659,3.944],[-2.913,0],[-2.893,-0.324],[0.25,-30.438],[0,0]],"o":[[0,0],[0.738,-31.073],[2.929,-0.324],[2.913,0],[34.917,3.91],[0,0],[0,0]],"v":[[-79.499,-54.733],[-79.46,-94.51],[-16.482,-156.037],[-7.708,-156.528],[1.011,-156.037],[61.366,-95.287],[60.805,-34.417]],"c":false}]},{"t":62,"s":[{"i":[[0,0],[0,0],[-35.659,4.562],[-2.913,0],[-2.893,-0.375],[0.25,-35.208],[0,0]],"o":[[0,0],[0.738,-35.942],[2.929,-0.375],[2.913,0],[34.917,4.523],[0,0],[0,0]],"v":[[-79.29,-51.92],[-79.46,-103.926],[-16.482,-175.094],[-7.708,-175.662],[1.011,-175.094],[61.366,-104.825],[60.805,-34.417]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":36,"ix":5},"lc":1,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":210,"st":30,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200.763,-57.53,0],"ix":2},"a":{"a":0,"k":[209.042,-77.027,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.32,"y":0},"t":30,"s":[{"i":[[0.625,6.188],[0.057,-1.249],[-9.252,0.062]],"o":[[-0.133,-1.312],[-0.375,8.25],[9.375,-0.063]],"v":[[226.938,-82.563],[191.125,-82.5],[209.625,-70.563]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.5,"y":0},"t":36,"s":[{"i":[[0.424,6.205],[0.097,-1.246],[-9.249,-0.239]],"o":[[-0.09,-1.315],[-0.643,8.233],[9.372,0.242]],"v":[[248.004,-80.956],[212.209,-82.056],[230.311,-69.524]],"c":true}]},{"i":{"x":0.72,"y":1},"o":{"x":0.68,"y":0},"t":46,"s":[{"i":[[0.028,6.276],[0.071,-1.248],[-9.252,-0.042]],"o":[[-0.006,-1.318],[-0.468,8.245],[9.375,0.043]],"v":[[-53.993,-86.038],[-89.663,-86.271],[-71.299,-74.126]],"c":true}]},{"t":54,"s":[{"i":[[-0.098,6.275],[0.096,-1.246],[-9.249,-0.228]],"o":[[0.021,-1.318],[-0.633,8.234],[9.372,0.231]],"v":[[-53.447,-74.344],[-89.106,-75.292],[-70.988,-62.781]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Body","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.3],"y":[1]},"o":{"x":[0.32],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.5],"y":[0]},"t":39,"s":[-5]},{"i":{"x":[0.72],"y":[1]},"o":{"x":[0.68],"y":[0]},"t":47,"s":[7]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.28],"y":[0]},"t":55,"s":[-4]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":62,"s":[2]},{"t":68,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.32,"y":0},"t":30,"s":[255.667,384.667,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.5,"y":0},"t":35,"s":[255.667,432.667,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.72,"y":1},"o":{"x":0.68,"y":0},"t":47,"s":[255.667,348.667,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.28,"y":0},"t":54,"s":[255.667,412.667,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":61,"s":[255.667,372.667,0],"to":[0,0,0],"ti":[0,0,0]},{"t":67,"s":[255.667,384.667,0]}],"ix":2},"a":{"a":0,"k":[-8.333,125.667,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.3,0.3,0.3],"y":[1,1,1]},"o":{"x":[0.32,0.32,0.32],"y":[0,0,0]},"t":30,"s":[100,100,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.5,0.5,0.5],"y":[0,0,0]},"t":35,"s":[101,99,100]},{"i":{"x":[0.72,0.72,0.72],"y":[1,1,1]},"o":{"x":[0.68,0.68,0.68],"y":[0,0,0]},"t":47,"s":[99,101,100]},{"i":{"x":[0.7,0.7,0.7],"y":[1,1,1]},"o":{"x":[0.28,0.28,0.28],"y":[0,0,0]},"t":54,"s":[101,98,100]},{"i":{"x":[0.7,0.7,0.7],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":61,"s":[100,101,100]},{"t":67,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[19.514,0],[0,19.514],[-19.514,0],[0,-19.514]],"o":[[-19.514,0],[0,-19.514],[19.514,0],[0,19.514]],"v":[[-9.333,97],[-44.667,61.667],[-9.333,26.333],[26,61.667]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,-14.231],[0,0],[-14.543,0],[0,0],[0,14.231],[0,0],[13.543,0],[0,0]],"o":[[0,0],[0,14.231],[0,0],[14.543,0],[0,0],[0,-14.231],[0,0],[-15.543,0]],"v":[[-148.333,-33.9],[-148.333,157.233],[-122,183],[103.333,183],[129.667,157.233],[129.667,-33.9],[104.333,-59.667],[-121,-59.667]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":210,"st":30,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/passcode_lock_open.json b/TMessagesProj/src/main/res/raw/passcode_lock_open.json new file mode 100644 index 00000000000..87b3374d9b1 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/passcode_lock_open.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":""},"fr":60,"ip":31,"op":63,"w":512,"h":512,"nm":"Lock Open 2","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"Top","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.32,"y":0},"t":30,"s":[61.368,-47.417,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.32,"y":0},"t":36,"s":[60.851,-37.43,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.167,"y":0},"t":40,"s":[62.128,-79.404,0],"to":[0,0,0],"ti":[0,0,0]},{"t":45,"s":[61.647,-67.414,0]}],"ix":2},"a":{"a":0,"k":[61.368,-47.417,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.32,"y":0},"t":30,"s":[{"i":[[0,0],[0,0],[-35.659,4.562],[-2.913,0],[-2.893,-0.375],[0.25,-35.208],[0,0]],"o":[[0,0],[0.738,-35.942],[2.929,-0.375],[2.913,0],[34.917,4.523],[0,0],[0,0]],"v":[[-79.499,-57.917],[-79.46,-103.926],[-16.482,-175.094],[-7.708,-175.662],[1.011,-175.094],[61.366,-104.825],[60.805,-34.417]],"c":false}]},{"i":{"x":0.378,"y":1},"o":{"x":0.6,"y":0},"t":36,"s":[{"i":[[0,0],[0,0],[-40.979,3.366],[-3.348,0],[-3.325,-0.276],[0.287,-25.975],[0,0]],"o":[[0,0],[0.848,-26.517],[3.366,-0.276],[3.348,0],[40.126,3.337],[0,0],[0,0]],"v":[[-90.145,-42.983],[-89.974,-80.743],[-17.599,-133.248],[-7.515,-133.667],[2.504,-133.248],[71.864,-81.406],[72.02,-7.337]],"c":false}]},{"i":{"x":0.68,"y":1},"o":{"x":0.3,"y":0},"t":45,"s":[{"i":[[0,0],[0,0],[31.62,4.464],[2.583,0],[2.565,-0.367],[-0.221,-34.453],[0,0]],"o":[[0,0],[-0.654,-35.171],[-2.597,-0.367],[-2.583,0],[-30.962,4.426],[0,0],[0,0]],"v":[[182.722,-62.905],[182.928,-109.081],[127.084,-178.723],[119.303,-179.279],[111.573,-178.723],[58.054,-109.961],[57.052,-23.06]],"c":false}]},{"i":{"x":0.68,"y":1},"o":{"x":0.167,"y":0},"t":53,"s":[{"i":[[0,0],[0,0],[35.335,4.101],[2.887,0],[2.867,-0.337],[-0.247,-31.654],[0,0]],"o":[[0,0],[-0.731,-32.314],[-2.903,-0.337],[-2.887,0],[-34.599,4.066],[0,0],[0,0]],"v":[[200.896,-55.232],[200.909,-99.354],[138.503,-163.338],[129.809,-163.848],[121.17,-163.338],[61.363,-100.162],[61.463,-27.417]],"c":false}]},{"t":59,"s":[{"i":[[0,0],[0,0],[35.335,4.464],[2.887,0],[2.867,-0.367],[-0.247,-34.453],[0,0]],"o":[[0,0],[-0.731,-35.171],[-2.903,-0.367],[-2.887,0],[-34.599,4.426],[0,0],[0,0]],"v":[[200.896,-61.192],[200.909,-109.215],[138.503,-178.857],[129.809,-179.412],[121.17,-178.857],[61.363,-110.094],[61.463,-30.917]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":36,"ix":5},"lc":1,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":210,"st":30,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200.763,-57.53,0],"ix":2},"a":{"a":0,"k":[209.042,-77.027,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.32,"y":0},"t":30,"s":[{"i":[[0.119,6.275],[0.053,-1.249],[-9.251,0.092]],"o":[[-0.025,-1.318],[-0.348,8.251],[9.375,-0.093]],"v":[[-53.373,-78.093],[-89.044,-77.808],[-70.505,-65.931]],"c":true}]},{"i":{"x":0.378,"y":1},"o":{"x":0.6,"y":0},"t":36,"s":[{"i":[[-0.098,6.275],[0.096,-1.246],[-9.249,-0.228]],"o":[[0.021,-1.318],[-0.633,8.234],[9.372,0.231]],"v":[[-64.132,-63.268],[-99.791,-64.216],[-81.673,-51.705]],"c":true}]},{"i":{"x":0.68,"y":1},"o":{"x":0.3,"y":0},"t":45,"s":[{"i":[[0.548,6.454],[0.072,-1.3],[-9.252,-0.056]],"o":[[-0.116,-1.368],[-0.478,8.589],[9.375,0.057]],"v":[[208.891,-84.917],[173.081,-85.319],[191.43,-72.643]],"c":true}]},{"i":{"x":0.68,"y":1},"o":{"x":0.167,"y":0},"t":53,"s":[{"i":[[0.625,6.188],[0.057,-1.249],[-9.252,0.062]],"o":[[-0.133,-1.312],[-0.375,8.25],[9.375,-0.063]],"v":[[227.06,-75.697],[191.248,-75.634],[209.748,-63.697]],"c":true}]},{"t":59,"s":[{"i":[[0.625,6.188],[0.057,-1.249],[-9.252,0.062]],"o":[[-0.133,-1.312],[-0.375,8.25],[9.375,-0.063]],"v":[[226.938,-82.563],[191.251,-82.5],[209.625,-70.563]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":212,"st":32,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Body","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.32,"y":0},"t":30,"s":[255.667,384.667,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.378,"y":1},"o":{"x":0.6,"y":0},"t":35,"s":[255.667,440.667,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.3,"y":0},"t":45,"s":[255.667,351.667,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.68,"y":1},"o":{"x":0.32,"y":0},"t":52,"s":[255.667,417.667,0],"to":[0,0,0],"ti":[0,0,0]},{"t":57,"s":[255.667,384.667,0]}],"ix":2},"a":{"a":0,"k":[-8.333,125.667,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.3,0.3,0.3],"y":[1,1,1]},"o":{"x":[0.32,0.32,0.32],"y":[0,0,0]},"t":30,"s":[100,100,100]},{"i":{"x":[0.378,0.378,0.378],"y":[1,1,1]},"o":{"x":[0.6,0.6,0.6],"y":[0,0,0]},"t":35,"s":[103,97,100]},{"i":{"x":[0.3,0.3,0.3],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":45,"s":[98,102,100]},{"i":{"x":[0.7,0.7,0.7],"y":[1,1,1]},"o":{"x":[0.32,0.32,0.32],"y":[0,0,0]},"t":52,"s":[102,98,100]},{"i":{"x":[0.7,0.7,0.7],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":57,"s":[99,101,100]},{"t":62,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.32,"y":0},"t":30,"s":[{"i":[[19.514,0],[0,19.514],[-19.514,0],[0,-19.514]],"o":[[-19.514,0],[0,-19.514],[19.514,0],[0,19.514]],"v":[[-9.333,97],[-44.667,61.667],[-9.333,26.333],[26,61.667]],"c":true}]},{"i":{"x":0.378,"y":1},"o":{"x":0.6,"y":0},"t":36,"s":[{"i":[[20.251,0],[0,18.263],[-20.251,0],[0,-18.263]],"o":[[-20.251,0],[0,-18.263],[20.251,0],[0,18.263]],"v":[[-9.333,102.512],[-46,69.443],[-9.333,36.375],[27.334,69.443]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.3,"y":0},"t":45,"s":[{"i":[[18.249,0],[0,20.817],[-18.249,0],[0,-20.817]],"o":[[-18.249,0],[0,-20.817],[18.249,0],[0,20.817]],"v":[[-9.333,94.171],[-42.376,56.478],[-9.333,18.785],[23.71,56.478]],"c":true}]},{"i":{"x":0.68,"y":1},"o":{"x":0.32,"y":0},"t":53,"s":[{"i":[[20.036,0],[0,18.836],[-20.036,0],[0,-18.836]],"o":[[-20.036,0],[0,-18.836],[20.036,0],[0,18.836]],"v":[[-9.333,99.987],[-45.611,65.88],[-9.333,31.774],[26.945,65.88]],"c":true}]},{"t":59,"s":[{"i":[[19.514,0],[0,19.514],[-19.514,0],[0,-19.514]],"o":[[-19.514,0],[0,-19.514],[19.514,0],[0,19.514]],"v":[[-9.333,97],[-44.667,61.667],[-9.333,26.333],[26,61.667]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.32,"y":0},"t":30,"s":[{"i":[[0,-14.231],[0,0],[-14.543,0],[0,0],[0,14.231],[0,0],[13.543,0],[0,0]],"o":[[0,0],[0,14.231],[0,0],[14.543,0],[0,0],[0,-14.231],[0,0],[-15.543,0]],"v":[[-148.333,-33.9],[-148.333,157.233],[-122,183],[103.333,183],[129.667,157.233],[129.667,-33.9],[104.333,-59.667],[-121,-59.667]],"c":true}]},{"i":{"x":0.378,"y":1},"o":{"x":0.6,"y":0},"t":36,"s":[{"i":[[2.562,-13.213],[-4.644,-40.358],[-15.092,0],[0,0],[-2.776,15.994],[4.861,33.014],[14.055,0],[0,0]],"o":[[-6.102,31.47],[1.682,14.62],[0,0],[15.092,0],[9.236,-53.225],[-1.944,-13.2],[0,0],[-16.13,0]],"v":[[-153.58,-19.998],[-153.58,158.884],[-126.252,183],[107.586,183],[134.913,158.884],[134.913,-19.998],[108.624,-44.113],[-125.215,-44.113]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.3,"y":0},"t":45,"s":[{"i":[[0,-15.181],[0,0],[-13.601,0],[0,0],[0,15.181],[0,0],[12.666,0],[0,0]],"o":[[0,0],[0,15.181],[0,0],[13.601,0],[0,0],[0,-15.181],[0,0],[-14.536,0]],"v":[[-139.323,-45.471],[-139.323,158.426],[-114.697,185.914],[96.03,185.914],[120.657,158.426],[120.657,-45.471],[96.966,-72.959],[-113.762,-72.959]],"c":true}]},{"i":{"x":0.68,"y":1},"o":{"x":0.32,"y":0},"t":53,"s":[{"i":[[0,-13.737],[0,0],[-14.932,0],[0,0],[0,13.737],[0,0],[13.905,0],[0,0]],"o":[[0,0],[0,13.737],[0,0],[14.932,0],[0,0],[0,-13.737],[0,0],[-15.959,0]],"v":[[-152.049,-26.367],[-152.049,158.128],[-125.012,183],[106.345,183],[133.382,158.128],[133.382,-26.367],[107.372,-51.239],[-123.985,-51.239]],"c":true}]},{"t":59,"s":[{"i":[[0,-14.231],[0,0],[-14.543,0],[0,0],[0,14.231],[0,0],[13.543,0],[0,0]],"o":[[0,0],[0,14.231],[0,0],[14.543,0],[0,0],[0,-14.231],[0,0],[-15.543,0]],"v":[[-148.333,-33.9],[-148.333,157.233],[-122,183],[103.333,183],[129.667,157.233],[129.667,-33.9],[104.333,-59.667],[-121,-59.667]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":210,"st":30,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/qr_logo.svg b/TMessagesProj/src/main/res/raw/qr_logo.svg new file mode 100644 index 00000000000..621cb811f1a --- /dev/null +++ b/TMessagesProj/src/main/res/raw/qr_logo.svg @@ -0,0 +1,8 @@ + + + Artboard + + + + + \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/saved_messages.json b/TMessagesProj/src/main/res/raw/saved_messages.json new file mode 100644 index 00000000000..c160f8e9f57 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/saved_messages.json @@ -0,0 +1 @@ +{"v":"5.7.1","fr":60,"ip":0,"op":56,"w":512,"h":512,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"SCALE","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[256,256,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Envelope","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1.013]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[-8]},{"i":{"x":[0.494],"y":[1.113]},"o":{"x":[0.401],"y":[0.075]},"t":10,"s":[4]},{"i":{"x":[0.548],"y":[1]},"o":{"x":[0.31],"y":[0.044]},"t":29.07,"s":[-8]},{"t":43,"s":[6]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.458,"y":0},"t":3,"s":[256,410.301,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.592,"y":1},"o":{"x":0.471,"y":0},"t":25,"s":[256,112.301,0],"to":[0,0,0],"ti":[0,0,0]},{"t":45,"s":[256,431.301,0]}],"ix":2},"a":{"a":0,"k":[256,263.301,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.574,0.574,0.7],"y":[1,1,1]},"o":{"x":[0.4,0.4,0.4],"y":[0,0,0]},"t":11,"s":[92,92,100]},{"i":{"x":[0.7,0.7,0.7],"y":[1,1,1]},"o":{"x":[0.533,0.533,0.3],"y":[0,0,0]},"t":25,"s":[48,50,100]},{"t":43,"s":[10,10,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":5,"s":[{"i":[[-95.739,-30.048],[-8.8,2.689],[0,0],[3.495,0],[95.529,-0.482],[0,0],[-4.339,-4.136]],"o":[[7.886,2.475],[77.25,-23.607],[8.414,-5.864],[0,0],[-82.038,0.414],[-3.495,0],[0,0]],"v":[[-10.582,-6.073],[5.713,-5.757],[190.692,-94.149],[188.599,-105.398],[-3.407,-99.909],[-188.599,-105.398],[-189.497,-95.928]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.6,"y":0},"t":5.143,"s":[{"i":[[-95.739,-33.02],[-8.8,2.955],[0,0],[3.495,0],[95.529,-0.53],[0,0],[-4.339,-4.545]],"o":[[7.886,2.72],[77.25,-25.942],[8.414,-6.444],[0,0],[-82.038,0.455],[-3.495,0],[0,0]],"v":[[-10.582,3.748],[5.713,4.096],[190.692,-93.037],[188.599,-105.398],[-3.407,-99.367],[-188.599,-105.398],[-189.497,-94.991]],"c":true}]},{"t":19,"s":[{"i":[[0,0],[-5.245,0.041],[0,0],[3.495,0],[0,0],[0,0],[-3.285,-0.015]],"o":[[5.245,0.041],[0,0],[3.285,-0.015],[0,0],[0,0],[-3.495,0],[0,0]],"v":[[-8.566,-81.908],[8.566,-81.908],[189.666,-83.322],[188.599,-83.398],[-14.594,-83.398],[-188.599,-83.398],[-189.666,-83.322]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"t":5.143,"s":[100],"h":1},{"t":19.142578125,"s":[0],"h":1}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[256,211.162],"ix":2},"a":{"a":0,"k":[0,-44.838],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Слой 2","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.821},"o":{"x":0.6,"y":0},"t":5.143,"s":[{"i":[[92.456,-40.442],[4.685,1.858],[0,0],[3.329,-13.216],[-11.455,-33.227],[-5.625,-1.072],[-108.805,18.045],[-1.427,6.636],[6.822,54.177],[1.779,1.698]],"o":[[-8.294,3.628],[-94.764,-37.594],[-1.779,1.698],[-12.607,50.054],[2.052,5.952],[107.736,17.657],[6.388,-1.06],[10.727,-36.921],[-0.755,-5.997],[0,0]],"v":[[3.792,35.617],[-12.907,35.651],[-195.528,-64.35],[-199.531,-49.496],[-200,110.274],[-188,120],[188,120],[201.03,109.76],[201.132,-53.706],[197.574,-64.267]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.167,"y":0.179},"t":15,"s":[{"i":[[42.054,-16.587],[2.165,0.771],[0,0],[2.665,-9.889],[-8.106,-14.724],[-20.491,-0.995],[-45.296,8.755],[-1.13,4.602],[5.533,23.754],[4.663,1.142]],"o":[[-3.84,1.515],[-44.633,-15.905],[-5.856,0.779],[-8.403,19.063],[1.385,3.227],[49.127,8.051],[6.49,-0.56],[4.891,-16.836],[-0.625,-3.002],[0,0]],"v":[[8.267,-29.262],[-11.054,-29.262],[-188.575,-72.928],[-200.886,-63.031],[-214.407,25.708],[-194.022,34.856],[201.908,37.722],[214.424,28.358],[200.109,-62.214],[194.174,-73.036]],"c":true}]},{"i":{"x":0.7,"y":0.84},"o":{"x":0.3,"y":0},"t":19,"s":[{"i":[[0,0],[0,0],[0,0],[0.29,-7.725],[0,0],[-26.494,0.001],[0,0],[0,1.308],[0,0],[7.08,0.677]],"o":[[0,0],[0,0],[-9.274,0.008],[0,0],[0,1.308],[0,0],[6.6,0],[0,0],[0,-0.584],[0,0]],"v":[[9.116,-83.673],[-9.5,-83.673],[-181.512,-83.659],[-199.585,-75.04],[-199.572,-45.175],[-172.159,-36.512],[188,-36.545],[200.085,-45.175],[200.085,-74.831],[191.573,-83.859]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.428,"y":0.228},"t":27,"s":[{"i":[[0,0],[0,0],[0,0],[1.913,-10.083],[0,0],[-23.798,0.438],[0,0],[0.737,8.796],[0,0],[12.533,0.976]],"o":[[0,0],[0,0],[-16.664,0.277],[0,0],[1.022,14.814],[0,0],[24.691,-0.54],[0,0],[-0.449,-14.149],[0,0]],"v":[[8.471,-121.053],[-8.827,-121.053],[-160.579,-122.612],[-184.489,-101.127],[-187.429,20.677],[-153.244,47.283],[152.163,46.684],[185.806,24.803],[187.193,-100.39],[163.28,-121.308]],"c":true}]},{"i":{"x":0.69,"y":1},"o":{"x":0.167,"y":0.167},"t":32,"s":[{"i":[[5.154,0.125],[4.103,-1.692],[1.981,-2.459],[1.779,-7.977],[-3.379,-6.727],[-23.592,-2.083],[-6.454,1.155],[-1.706,8.172],[1.212,4.002],[10.642,1.661]],"o":[[-5.154,-0.125],[-4.103,1.692],[-11.493,2.59],[-0.687,3.197],[2.617,11.07],[6.401,1.465],[21.906,-1.654],[2.126,-4.003],[-2.073,-12.706],[-3.488,-1.198]],"v":[[6.296,-118],[-20.089,-115.725],[-119.366,-108.917],[-137.778,-90.149],[-137.51,-15.28],[-97.991,9.179],[96.688,8.437],[134.406,-12.245],[137.533,-89.361],[111.216,-114.396]],"c":true}]},{"t":37,"s":[{"i":[[12.008,0.379],[9.558,-5.11],[4.616,-7.427],[1.601,-9.656],[-7.873,-20.319],[-23.318,-6.921],[-15.037,3.49],[-4.954,12.091],[2.824,12.087],[8.127,3.62]],"o":[[-12.008,-0.379],[-9.558,5.11],[-4.616,7.427],[-1.601,9.656],[4.738,12.228],[14.913,4.426],[18.201,-4.225],[4.954,-12.091],[-4.234,-18.122],[-8.127,-3.62]],"v":[[3.403,-141.121],[-35.065,-134.249],[-64.557,-111.454],[-75.659,-85.525],[-71.123,-33.778],[-24.512,2.008],[22.912,0.623],[66.051,-30.517],[71.493,-84.203],[41.978,-129.871]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[1.465,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[256,279.25],"ix":2},"a":{"a":0,"k":[0,23.25],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Слой 1","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":37,"st":-9,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Round","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.3,"y":0},"t":33.715,"s":[256,256,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":43,"s":[256,304,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":50.43,"s":[256,258,0],"to":[0,0,0],"ti":[0,0,0]},{"t":56,"s":[256,266,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.69,0.69,0.69],"y":[1,1,1]},"o":{"x":[0.31,0.31,0.31],"y":[0,0,0]},"t":34.643,"s":[97,104,100]},{"i":{"x":[0.69,0.69,0.69],"y":[1,1,1]},"o":{"x":[0.31,0.31,0.31],"y":[0,0,0]},"t":44,"s":[102.998,96,100]},{"i":{"x":[0.69,0.69,0.69],"y":[1,1,1]},"o":{"x":[0.31,0.31,0.31],"y":[0,0,0]},"t":51.357,"s":[98,102,100]},{"t":56,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.821},"o":{"x":0.31,"y":0},"t":34.715,"s":[{"i":[[0,0],[0,-0.069],[0,0],[0.004,-0.009],[0.033,0.015],[0,0],[0.022,-0.01],[0,0],[0.009,0],[0,0.037],[0,0],[-0.069,0]],"o":[[0.069,0],[0,0],[0,0.009],[-0.015,0.034],[0,0],[-0.022,-0.01],[0,0],[-0.009,0.004],[-0.037,0],[0,0],[0,-0.069],[0,0]],"v":[[0.249,0.375],[0.373,0.5],[0.373,1.22],[0.367,1.248],[0.28,1.281],[0.032,1.169],[-0.036,1.169],[-0.279,1.281],[-0.307,1.287],[-0.373,1.22],[-0.373,0.5],[-0.249,0.375]],"c":true}]},{"i":{"x":0.69,"y":1},"o":{"x":0.167,"y":0.179},"t":39,"s":[{"i":[[0,0],[0,-1.168],[0,0],[0.083,-0.145],[0.723,0.255],[0,0],[0.469,-0.167],[0,0],[0.205,0],[0,0.623],[0,0],[-1.486,0]],"o":[[1.486,0],[0,0],[0,0.159],[-0.325,0.568],[0,0],[-0.47,-0.166],[0,0],[-0.186,0.067],[-0.793,0],[0,0],[0,-1.168],[0,0]],"v":[[0.851,0.508],[5.465,4.318],[5.719,8.707],[5.345,11.471],[3.076,13.189],[-1.173,13.968],[-3.022,13.789],[-7.661,13.118],[-8.751,12.128],[-10.311,9.668],[-10.062,4.258],[-5.696,0.629]],"c":true}]},{"i":{"x":0.69,"y":1},"o":{"x":0.31,"y":0},"t":41,"s":[{"i":[[0,0],[0,-3.238],[0,0],[0.277,-0.403],[2.416,0.707],[0,0],[1.567,-0.464],[0,0],[0.684,0],[0,1.727],[0,0],[-4.966,0]],"o":[[4.966,0],[0,0],[0,0.442],[-1.085,1.576],[0,0],[-1.57,-0.46],[0,0],[-0.623,0.185],[-2.648,0],[0,0],[0,-3.238],[0,0]],"v":[[14.034,11.723],[23.026,17.587],[23.465,45.484],[23.044,46.765],[16.705,48.337],[-1.638,48.882],[-6.573,48.889],[-24.143,47.967],[-26.127,48.247],[-30.922,45.12],[-30.922,17.587],[-21.931,11.723]],"c":true}]},{"i":{"x":0.69,"y":1},"o":{"x":0.31,"y":0},"t":48,"s":[{"i":[[0,0],[0,-13.569],[0,0],[0.752,-1.688],[6.552,2.964],[0,0],[4.25,-1.946],[0,0],[1.856,0],[0,7.237],[0,0],[-13.467,0]],"o":[[13.467,0],[0,0],[0,1.85],[-2.942,6.602],[0,0],[-4.258,-1.927],[0,0],[-1.69,0.774],[-7.182,0],[0,0],[0,-13.569],[0,0]],"v":[[47.788,-82.334],[72.172,-57.766],[72.172,83.375],[71.03,88.743],[53.84,95.329],[5.286,73.362],[-8.098,73.392],[-55.748,95.206],[-61.127,96.38],[-74.132,83.277],[-74.132,-57.766],[-49.748,-82.334]],"c":true}]},{"t":56,"s":[{"i":[[0,0],[0,-12.52],[0,0],[0.694,-1.557],[6.046,2.735],[0,0],[3.922,-1.795],[0,0],[1.712,0],[0,6.677],[0,0],[-12.426,0]],"o":[[12.426,0],[0,0],[0,1.707],[-2.715,6.092],[0,0],[-3.929,-1.778],[0,0],[-1.559,0.714],[-6.627,0],[0,0],[0,-12.52],[0,0]],"v":[[45,-82.5],[67.5,-59.83],[67.5,70.406],[66.447,75.359],[50.584,81.436],[5.782,61.167],[-6.567,61.194],[-50.536,81.323],[-55.5,82.406],[-67.5,70.315],[-67.5,-59.83],[-45,-82.5]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":1,"k":[{"i":{"x":0.524,"y":1},"o":{"x":0.418,"y":0},"t":33.715,"s":[{"i":[[-1.105,0],[0,1.105],[1.105,0],[0,-1.105]],"o":[[1.105,0],[0,-1.105],[-1.105,0],[0,1.105]],"v":[[0,2],[2,0],[0,-2],[-2,0]],"c":true}]},{"i":{"x":0.4,"y":1},"o":{"x":0.272,"y":0},"t":46,"s":[{"i":[[105.528,0],[0,-96.177],[-105.528,0],[0,96.177]],"o":[[-105.528,0],[0,96.177],[105.528,0],[0,-96.177]],"v":[[0,-174.144],[-191.076,0],[0,174.144],[191.076,0]],"c":true}]},{"t":56,"s":[{"i":[[99.411,0],[0,-99.411],[-99.411,0],[0,99.411]],"o":[[-99.411,0],[0,99.411],[99.411,0],[0,-99.411]],"v":[[0,-180],[-180,0],[0,180],[180,0]],"c":true}]}],"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":35,"op":111,"st":-9,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/shared_link_enter.json b/TMessagesProj/src/main/res/raw/shared_link_enter.json new file mode 100644 index 00000000000..5199de449de --- /dev/null +++ b/TMessagesProj/src/main/res/raw/shared_link_enter.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":""},"fr":60,"ip":0,"op":43,"w":90,"h":90,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Center 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[45.773,45.843,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":29,"s":[26.667,26.667,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":37,"s":[36,36,100]},{"t":42,"s":[33.333,33.333,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-11.786,11.559],[11.784,-11.561]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":14,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[50]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":29,"s":[50]},{"t":37,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[50]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":29,"s":[50]},{"t":37,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":43,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Top","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[100]},{"t":36,"s":[100]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"t":36,"s":[360]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[40.179,51.855,0],"to":[2.139,-2.222,0],"ti":[-2.139,2.222,0]},{"t":36,"s":[53.013,38.522,0]}],"ix":2},"a":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[-10,12.5,0],"to":[1.667,-2.083,0],"ti":[-1.667,2.083,0]},{"t":28,"s":[0,0,0]}],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[20,20,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":36,"s":[35.667,35.667,100]},{"t":42,"s":[33.333,33.333,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[12.37,12.65],[12.47,-12.19],[0.08,-0.08],[0,0],[0,0]],"o":[[0,0],[12.51,-12.51],[-12.19,-12.47],[-0.08,0.08],[0,0],[0,0],[0,0]],"v":[[14.847,30.312],[20.557,24.592],[20.807,-20.808],[-23.853,-21.308],[-24.093,-21.058],[-30.013,-15.148],[-30.013,-15.148]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":13,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path Copy","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[48]},{"t":36,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[52]},{"t":36,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":44,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Bottom","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"t":2,"s":[100]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"t":36,"s":[360]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[53.288,38.579,0],"to":[-2.417,2.361,0],"ti":[2.417,-2.361,0]},{"t":36,"s":[38.788,52.746,0]}],"ix":2},"a":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[18.333,-16.667,0],"to":[-3.056,2.778,0],"ti":[3.056,-2.778,0]},{"t":28,"s":[0,0,0]}],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[20,20,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":36,"s":[35.667,35.667,100]},{"t":42,"s":[33.333,33.333,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-12.38,-12.65],[-12.47,12.2],[-0.08,0.08],[0,0],[0,0]],"o":[[0,0],[-12.51,12.51],[12.19,12.47],[0.09,-0.08],[0,0],[0,0],[0,0]],"v":[[-14.843,-30.308],[-20.553,-24.598],[-20.803,20.812],[23.847,21.302],[24.097,21.062],[30.017,15.142],[30.017,15.142]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":13,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[48]},{"t":36,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[52]},{"t":36,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":44,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/silent_mute.json b/TMessagesProj/src/main/res/raw/silent_mute.json new file mode 100644 index 00000000000..d9dab3258dc --- /dev/null +++ b/TMessagesProj/src/main/res/raw/silent_mute.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":""},"fr":60,"ip":0,"op":58,"w":512,"h":512,"nm":"Bell Unmute","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"NULL BODY","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.504],"y":[1]},"o":{"x":[0.723],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[10]},{"i":{"x":[0.504],"y":[1]},"o":{"x":[0.723],"y":[0]},"t":40,"s":[-7]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[5]},{"i":{"x":[0.504],"y":[1]},"o":{"x":[0.723],"y":[0]},"t":52,"s":[-3]},{"t":57,"s":[0]}],"ix":10},"p":{"a":0,"k":[250.04,260.92,0],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.31,0.31,0.31],"y":[0,0,0]},"t":2,"s":[93.1,93.1,100]},{"i":{"x":[0.326,0.326,0.6],"y":[1,1,1]},"o":{"x":[0.334,0.334,0.8],"y":[0,0,0]},"t":13,"s":[96.04,96.04,100]},{"i":{"x":[0.467,0.467,0.467],"y":[1,1,1]},"o":{"x":[0.404,0.404,0.31],"y":[0,0,0]},"t":22,"s":[91.14,91.14,100]},{"i":{"x":[0.69,0.69,0.69],"y":[1,1,1]},"o":{"x":[0.31,0.31,0.31],"y":[0,0,0]},"t":30,"s":[95.06,95.06,100]},{"t":37,"s":[93.1,93.1,100]}],"ix":6}},"ao":0,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Pieces","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0.105,-2.842,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[105.263,105.263,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.22,"y":1},"o":{"x":0.167,"y":0.167},"t":23,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[93.496,48.288],[92.004,78.947],[117.064,102.373],[118.233,48.46]],"c":true}]},{"i":{"x":0.69,"y":1},"o":{"x":0.167,"y":0},"t":26,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[97.06,30.72],[96.707,46.938],[121.676,70.084],[121.778,30.914]],"c":true}]},{"i":{"x":0.69,"y":1},"o":{"x":0.31,"y":0},"t":34,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[82.137,21.142],[82.113,34.329],[107.484,56.417],[107.571,23.48]],"c":true}]},{"t":42,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[89.719,24.195],[89.408,35.856],[115.051,59.967],[114.755,24.454]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.22,"y":1},"o":{"x":0.167,"y":0.167},"t":23,"s":[{"i":[[5.941,-2.954],[0,0],[0,0],[0,0]],"o":[[-12.675,6.304],[0,0],[0,0],[0,0]],"v":[[-66.832,-129.083],[-85.64,-115.71],[-67.775,-99.18],[-60.321,-103.618]],"c":true}]},{"i":{"x":0.69,"y":1},"o":{"x":0.167,"y":0},"t":26,"s":[{"i":[[6.407,-2.422],[0,0],[0,0],[0,0]],"o":[[-11.815,4.467],[0,0],[0,0],[0,0]],"v":[[-59.713,-138.665],[-80.646,-127.669],[-63.011,-110.053],[-54.928,-114.014]],"c":true}]},{"i":{"x":0.69,"y":1},"o":{"x":0.31,"y":0},"t":34,"s":[{"i":[[6.891,-1.789],[0,0],[0,0],[0,0]],"o":[[-12.848,3.336],[0,0],[0,0],[0,0]],"v":[[-49.983,-127.91],[-71.027,-115.909],[-53.664,-99.522],[-45.357,-103.642]],"c":true}]},{"t":42,"s":[{"i":[[5.653,-1.83],[0,0],[0,0],[0,0]],"o":[[-12.458,4.034],[0,0],[0,0],[0,0]],"v":[[-55.635,-133.515],[-73.648,-123.503],[-54.953,-104.897],[-49.375,-109.357]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":23,"op":179,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"BODY","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.521],"y":[1]},"o":{"x":[0.406],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.496],"y":[1]},"o":{"x":[0.455],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.617],"y":[1]},"o":{"x":[0.555],"y":[0]},"t":20,"s":[5]},{"i":{"x":[0.69],"y":[1]},"o":{"x":[0.31],"y":[0]},"t":29,"s":[-7]},{"t":37,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.1,"y":1},"o":{"x":0.31,"y":0},"t":0,"s":[49.383,-56.666,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.473,"y":1},"o":{"x":0.52,"y":0},"t":9,"s":[47.296,-79.76,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.575,"y":0},"t":18,"s":[53.614,-26.912,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.449,"y":1},"o":{"x":0.3,"y":0},"t":26,"s":[36.454,-71.717,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.449,"y":1},"o":{"x":0.3,"y":0},"t":34,"s":[50.863,-48.274,0],"to":[0,0,0],"ti":[0,0,0]},{"t":41,"s":[49.383,-56.666,0]}],"ix":2},"a":{"a":0,"k":[-6.913,-104.224,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.69,"y":1},"o":{"x":0.167,"y":0},"t":0,"s":[{"i":[[-0.879,-20.568],[13.667,0],[-0.7,15.587],[-15.116,0]],"o":[[0.666,15.589],[-13.667,0],[1.098,-24.456],[18.819,0]],"v":[[28.316,-148.839],[-6.498,-133.539],[-38.017,-149.843],[-4.889,-184.833]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":10,"s":[{"i":[[-0.966,-22.622],[15.032,0],[-0.77,17.144],[-16.626,0]],"o":[[0.732,17.146],[-15.032,0],[1.208,-26.898],[20.698,0]],"v":[[31.734,-160.285],[-6.556,-143.457],[-41.223,-161.389],[-4.787,-199.874]],"c":true}]},{"i":{"x":0.22,"y":1},"o":{"x":0.4,"y":0},"t":20,"s":[{"i":[[-0.804,-18.813],[12.501,0],[-0.64,14.257],[-13.827,0]],"o":[[0.609,14.259],[-12.501,0],[1.005,-22.369],[17.213,0]],"v":[[25.396,-139.061],[-6.448,-125.066],[-35.278,-139.979],[-4.977,-171.984]],"c":true}]},{"i":{"x":0.69,"y":1},"o":{"x":0.167,"y":0},"t":26,"s":[{"i":[[-0.936,-21.908],[14.558,0],[-0.746,16.603],[-16.101,0]],"o":[[0.709,16.605],[-14.558,0],[1.17,-26.049],[20.045,0]],"v":[[30.546,-156.307],[-6.536,-140.01],[-40.109,-157.376],[-4.823,-194.647]],"c":true}]},{"i":{"x":0.69,"y":1},"o":{"x":0.31,"y":0},"t":34,"s":[{"i":[[-0.818,-19.153],[12.727,0],[-0.652,14.515],[-14.076,0]],"o":[[0.62,14.516],[-12.727,0],[1.023,-22.773],[17.524,0]],"v":[[25.961,-140.953],[-6.458,-126.706],[-35.808,-141.888],[-4.96,-174.471]],"c":true}]},{"t":42,"s":[{"i":[[-0.879,-20.568],[13.667,0],[-0.7,15.587],[-15.116,0]],"o":[[0.666,15.589],[-13.667,0],[1.098,-24.456],[18.819,0]],"v":[[28.316,-148.839],[-6.498,-133.539],[-38.017,-149.843],[-4.889,-184.833]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.69,"y":1},"o":{"x":0.167,"y":0},"t":0,"s":[{"i":[[-0.616,1.237],[0,0],[-16.408,-2.958],[-1.693,-65.946],[0,0],[0,0],[0,0],[13.273,0],[0,0],[-20.13,18.675],[0,0],[0,0],[-9.726,17.064]],"o":[[21.013,-42.199],[16.129,-3.01],[49.898,10.588],[0,0],[0,0],[0,0],[20.13,18.675],[0,0],[-13.273,0],[0,0],[0,0],[0,-27.005],[0,0]],"v":[[-104.858,-86.987],[-29.626,-138.617],[19.182,-138.617],[107.76,-27.145],[107.76,-27.145],[108.127,74.383],[131.143,94.801],[117.726,116.386],[-129.553,116.386],[-142.97,94.801],[-119.954,74.383],[-119.954,-22.382],[-104.626,-88.095]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":10,"s":[{"i":[[-0.677,1.361],[0,0],[-18.047,-3.253],[-1.862,-72.531],[0,0],[0,0],[0,0],[14.599,0],[0,0],[-22.14,20.54],[0,0],[0,0],[-10.697,18.768]],"o":[[23.111,-46.413],[17.739,-3.31],[54.882,11.645],[0,0],[0,0],[0,0],[22.14,20.54],[0,0],[-14.599,0],[0,0],[0,0],[0,-29.702],[0,0]],"v":[[-114.739,-92.257],[-31.995,-149.042],[21.689,-149.042],[119.112,-26.438],[119.112,-26.438],[119.515,85.229],[144.83,107.686],[130.073,131.426],[-141.9,131.426],[-156.657,107.686],[-131.342,85.229],[-131.342,-21.2],[-114.484,-93.474]],"c":false}]},{"i":{"x":0.22,"y":1},"o":{"x":0.4,"y":0},"t":20,"s":[{"i":[[-0.576,1.125],[0,0],[-15.008,-2.706],[-1.549,-60.32],[0,0],[0,0],[0,0],[12.141,0],[0,0],[-18.412,17.081],[0,0],[0,0],[-8.896,15.608]],"o":[[18.785,-36.702],[14.753,-2.753],[45.641,9.685],[0,0],[0,0],[0,0],[18.412,17.081],[0,0],[-12.141,0],[0,0],[0,0],[0,-24.701],[0,0]],"v":[[-96.089,-84.087],[-27.603,-129.711],[17.041,-129.711],[98.062,-27.749],[98.062,-27.749],[98.397,65.117],[119.45,83.793],[107.177,103.536],[-119.004,103.536],[-131.277,83.793],[-110.224,65.117],[-110.224,-23.392],[-96.204,-83.499]],"c":false}]},{"i":{"x":0.69,"y":1},"o":{"x":0.167,"y":0},"t":26,"s":[{"i":[[-1.342,0.604],[0,0],[-17.477,-3.151],[-1.804,-70.243],[0,0],[0,0],[0,0],[14.138,0],[0,0],[-21.441,19.891],[0,0],[0,0],[-10.36,18.176]],"o":[[14.162,-6.369],[17.18,-3.206],[53.15,11.278],[0,0],[0,0],[0,0],[21.441,19.891],[0,0],[-14.138,0],[0,0],[0,0],[0,-28.764],[0,0]],"v":[[-59.26,-136.605],[-31.171,-145.419],[20.818,-145.419],[115.167,-26.684],[115.167,-26.684],[115.557,81.459],[140.073,103.208],[125.782,126.199],[-137.609,126.199],[-151.9,103.208],[-127.384,81.459],[-127.384,-21.611],[-111.058,-91.605]],"c":false}]},{"i":{"x":0.69,"y":1},"o":{"x":0.31,"y":0},"t":34,"s":[{"i":[[-1.174,0.528],[0,0],[-15.279,-2.755],[-1.577,-61.408],[0,0],[0,0],[0,0],[12.36,0],[0,0],[-18.745,17.39],[0,0],[0,0],[-9.057,15.89]],"o":[[12.381,-5.568],[15.019,-2.802],[46.465,9.859],[0,0],[0,0],[0,0],[18.745,17.39],[0,0],[-12.36,0],[0,0],[0,0],[0,-25.147],[0,0]],"v":[[-52.551,-123.729],[-27.995,-131.435],[17.456,-131.435],[99.939,-27.632],[99.939,-27.632],[100.28,66.91],[121.713,85.923],[109.219,106.023],[-121.046,106.023],[-133.54,85.923],[-112.107,66.91],[-112.107,-23.197],[-97.834,-84.388]],"c":false}]},{"t":42,"s":[{"i":[[-1.26,0.567],[0,0],[-16.408,-2.958],[-1.693,-65.946],[0,0],[0,0],[0,0],[13.273,0],[0,0],[-20.13,18.675],[0,0],[0,0],[-9.726,17.064]],"o":[[13.296,-5.979],[16.129,-3.01],[49.898,10.588],[0,0],[0,0],[0,0],[20.13,18.675],[0,0],[-13.273,0],[0,0],[0,0],[0,-27.005],[0,0]],"v":[[-55.997,-130.342],[-29.626,-138.617],[19.182,-138.617],[107.76,-27.145],[107.76,-27.145],[108.127,74.383],[131.143,94.801],[117.726,116.386],[-129.553,116.386],[-142.97,94.801],[-119.954,74.383],[-119.954,-22.382],[-104.626,-88.095]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":20,"s":[100]},{"t":26,"s":[86]}],"ix":2},"o":{"a":0,"k":166,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":26,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.69,"y":1},"o":{"x":0.167,"y":0},"t":0,"s":[{"i":[[-0.839,1.098],[0,0],[-16.408,-2.958],[0,0],[0,0]],"o":[[25.076,-32.799],[16.129,-3.01],[113.039,24.604],[0,0],[0,0]],"v":[[-95.862,-97.863],[-29.626,-138.617],[19.182,-138.617],[107.76,19.579],[-116.173,-54.26]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":10,"s":[{"i":[[-0.677,1.361],[0,0],[-18.047,-3.253],[0,0],[-10.697,18.768]],"o":[[23.111,-46.413],[17.739,-3.31],[128.845,11.541],[0,0],[0,0]],"v":[[-114.739,-92.257],[-31.995,-149.042],[21.689,-149.042],[121.063,87.857],[-118.118,-87.19]],"c":false}]},{"i":{"x":0.7,"y":1},"o":{"x":0.4,"y":0},"t":20,"s":[{"i":[[-0.493,1.164],[0,0],[-15.008,-2.706],[0,0],[-8.896,15.608]],"o":[[17.846,-42.175],[14.753,-2.753],[105.351,-3.391],[0,0],[0,0]],"v":[[-98.562,-78.707],[-27.603,-129.711],[17.041,-129.711],[99.446,68.458],[-96.204,-83.499]],"c":false}]},{"i":{"x":0.22,"y":1},"o":{"x":0.3,"y":0},"t":23,"s":[{"i":[[-1.142,0.736],[0,0],[-16.895,-3.046],[0,0],[9.341,15.558]],"o":[[15.031,-14.814],[16.607,-3.099],[126.119,25.644],[0,0],[0,0]],"v":[[-68.53,-122.949],[-30.33,-141.714],[19.927,-141.714],[100.768,66.359],[-78.2,-115.498]],"c":false}]},{"i":{"x":0.69,"y":1},"o":{"x":0.167,"y":0},"t":26,"s":[{"i":[[-1.342,0.604],[0,0],[-17.477,-3.151],[0,0],[14.97,15.542]],"o":[[14.162,-6.369],[17.18,-3.206],[132.529,34.607],[0,0],[0,0]],"v":[[-59.26,-136.605],[-31.171,-145.419],[20.818,-145.419],[102.838,47.511],[-72.643,-125.376]],"c":false}]},{"i":{"x":0.69,"y":1},"o":{"x":0.31,"y":0},"t":34,"s":[{"i":[[-1.174,0.528],[0,0],[-15.279,-2.755],[0,0],[0,0]],"o":[[12.381,-5.568],[15.019,-2.802],[117.131,26.607],[0,0],[0,0]],"v":[[-52.551,-123.729],[-27.995,-131.435],[17.456,-131.435],[88.886,35.753],[-58.321,-109.53]],"c":false}]},{"t":42,"s":[{"i":[[-1.26,0.567],[0,0],[-16.408,-2.958],[0,0],[0,0]],"o":[[13.296,-5.979],[16.129,-3.01],[125.08,24.269],[0,0],[0,0]],"v":[[-55.997,-130.342],[-29.626,-138.617],[19.182,-138.617],[95.349,35.841],[-63.158,-118.59]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.69,"y":1},"o":{"x":0.167,"y":0},"t":0,"s":[{"i":[[5.561,-39.019],[0,0],[13.273,0],[0,0],[-20.13,18.675],[0,0],[0,0]],"o":[[-8.129,57.039],[20.13,18.675],[0,0],[-13.273,0],[0,0],[0,0],[0,-27.005]],"v":[[108.127,15.843],[131.143,94.801],[117.726,116.386],[-129.553,116.386],[-142.97,94.801],[-119.954,74.383],[-117.805,-61.05]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":10,"s":[{"i":[[0,0],[0,0],[14.599,0],[0,0],[-22.14,20.539],[0,0],[-24.078,59.519]],"o":[[0,0],[22.14,20.539],[0,0],[-14.599,0],[0,0],[0,0],[9.444,-23.344]],"v":[[119.515,85.229],[144.83,107.686],[130.073,131.426],[-141.9,131.426],[-156.657,107.686],[-131.342,85.229],[-117.001,-91.753]],"c":false}]},{"i":{"x":0.7,"y":1},"o":{"x":0.4,"y":0},"t":20,"s":[{"i":[[0,0],[0,0],[12.141,0],[0,0],[-18.412,17.081],[0,0],[-32.452,53.637]],"o":[[0,0],[18.412,17.081],[0,0],[-12.141,0],[0,0],[0,0],[13.178,-21.78]],"v":[[98.397,65.117],[119.45,83.793],[107.177,103.536],[-119.004,103.536],[-131.277,83.793],[-110.224,65.117],[-90.851,-93.516]],"c":false}]},{"i":{"x":0.22,"y":1},"o":{"x":0.3,"y":0},"t":23,"s":[{"i":[[0,0],[0,0],[33.938,3.468],[0,0],[-20.727,19.229],[0,0],[-30.374,47.55]],"o":[[0,0],[11.924,11.8],[0,0],[-13.667,0],[0,0],[0,0],[14.681,-22.914]],"v":[[120.695,76.373],[142.857,99.635],[122.128,132.895],[-133.221,120.854],[-147.036,98.628],[-123.337,77.605],[-107.865,-89.633]],"c":false}]},{"i":{"x":0.69,"y":1},"o":{"x":0.167,"y":0},"t":26,"s":[{"i":[[0,0],[0,0],[14.138,0],[0,0],[-21.441,19.891],[0,0],[-29.732,45.671]],"o":[[0,0],[0,0],[0,0],[-14.138,0],[0,0],[0,0],[15.145,-23.264]],"v":[[117.369,105.117],[129.481,117.545],[125.782,126.199],[-137.609,126.199],[-151.9,103.208],[-127.384,81.459],[-108.964,-96.809]],"c":false}]},{"i":{"x":0.69,"y":1},"o":{"x":0.31,"y":0},"t":34,"s":[{"i":[[0,0],[0,0],[12.36,0],[0,0],[-18.745,17.39],[0,0],[-29.971,36.024]],"o":[[0,0],[9.101,7.673],[0,0],[-12.36,0],[0,0],[0,0],[17.301,-20.795]],"v":[[92.448,78.221],[110.543,92.591],[105.827,106.765],[-121.046,106.023],[-133.54,85.923],[-112.107,66.91],[-94.491,-89.649]],"c":false}]},{"t":42,"s":[{"i":[[0,0],[0,0],[3.793,1.056],[0,0],[-20.13,18.675],[0,0],[-23.441,42.802]],"o":[[0,0],[20.13,18.675],[0,0],[-13.273,0],[0,0],[0,0],[14.627,-26.708]],"v":[[100.523,83.167],[117.015,99.515],[117.726,116.386],[-129.553,116.386],[-142.97,94.801],[-119.954,74.383],[-105.422,-90.378]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Line Cross","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-0.4,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":19,"s":[-75.036,-74.734,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":29,"s":[36.06,40.08,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":35,"s":[-20.938,-20.032,0],"to":[0,0,0],"ti":[0,0,0]},{"t":41,"s":[1.032,-0.331,0]}],"ix":2},"a":{"a":0,"k":[1.032,-0.331,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.22,"y":1},"o":{"x":0.4,"y":0},"t":19,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-155.581,-156.458],[157.645,155.795]],"c":false}]},{"t":29,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-155.581,-156.458],[157.645,155.795]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":19,"s":[0]},{"t":29,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":19,"s":[0]},{"t":29,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":26,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":19,"op":179,"st":-1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Bottom","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-5.222,172.563,0],"ix":2},"a":{"a":0,"k":[-5.222,167.73,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.69,"y":1},"o":{"x":0.167,"y":0},"t":0,"s":[{"i":[[0,0],[0.496,-3.196],[22.355,0],[3.077,19.901],[0,0],[-3.428,0.001]],"o":[[3.394,0.465],[-3.078,19.9],[-22.356,0],[0,0],[0,-3.228],[0,0]],"v":[[27.678,149.52],[32.927,156.149],[-5.222,186],[-43.372,156.148],[-43.436,155.306],[-37.229,149.459]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":10,"s":[{"i":[[0,0],[0.609,-3.939],[27.553,0],[3.793,24.528],[0,0],[-4.225,0.001]],"o":[[4.183,0.574],[-3.793,24.527],[-27.554,0],[0,0],[0,-3.979],[0,0]],"v":[[39.351,169.245],[45.82,177.415],[-1.198,214.206],[-48.217,177.413],[-48.297,176.375],[-40.646,169.17]],"c":true}]},{"i":{"x":0.22,"y":1},"o":{"x":0.4,"y":0},"t":20,"s":[{"i":[[0,0],[0.426,-2.754],[19.266,0],[2.652,17.151],[0,0],[-2.955,0.001]],"o":[[2.925,0.401],[-2.652,17.15],[-19.267,0],[0,0],[0,-2.782],[0,0]],"v":[[16.681,136.734],[21.204,142.447],[-11.673,168.173],[-44.551,142.446],[-44.607,141.72],[-39.257,136.681]],"c":true}]},{"i":{"x":0.69,"y":1},"o":{"x":0.167,"y":0},"t":27,"s":[{"i":[[0,0],[0.523,-3.382],[23.656,0],[3.256,21.059],[0,0],[-3.628,0.001]],"o":[[3.591,0.492],[-3.257,21.058],[-23.657,0],[0,0],[0,-3.416],[0,0]],"v":[[33.859,160.454],[39.413,167.469],[-0.956,199.056],[-41.325,167.467],[-41.393,166.576],[-34.824,160.39]],"c":true}]},{"i":{"x":0.69,"y":1},"o":{"x":0.31,"y":0},"t":34,"s":[{"i":[[0,0],[0.496,-3.196],[22.355,0],[3.077,19.901],[0,0],[-3.428,0.001]],"o":[[3.394,0.465],[-3.078,19.9],[-22.356,0],[0,0],[0,-3.228],[0,0]],"v":[[27.417,140.407],[32.666,147.037],[-5.484,176.887],[-43.633,147.035],[-43.698,146.193],[-37.491,140.346]],"c":true}]},{"t":42,"s":[{"i":[[0,0],[0.496,-3.196],[22.355,0],[3.077,19.901],[0,0],[-3.428,0.001]],"o":[[3.394,0.465],[-3.078,19.9],[-22.356,0],[0,0],[0,-3.228],[0,0]],"v":[[27.678,149.52],[32.927,156.149],[-5.222,186],[-43.372,156.148],[-43.436,155.306],[-37.229,149.459]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/silent_unmute.json b/TMessagesProj/src/main/res/raw/silent_unmute.json new file mode 100644 index 00000000000..376c0555c61 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/silent_unmute.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":""},"fr":60,"ip":0,"op":58,"w":512,"h":512,"nm":"Bell Unmute","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"NULL BODY","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250.04,260.92,0],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.496,0.496,0.62],"y":[1,1,1]},"o":{"x":[0.566,0.566,0.8],"y":[0,0,0]},"t":10,"s":[93,93,100]},{"i":{"x":[0.467,0.467,0.467],"y":[1,1,1]},"o":{"x":[0.404,0.404,0.404],"y":[0,0,0]},"t":21,"s":[92,92,100]},{"i":{"x":[0.69,0.69,0.69],"y":[1,1,1]},"o":{"x":[0.31,0.31,0.31],"y":[0,0,0]},"t":29,"s":[95,95,100]},{"t":36,"s":[93,93,100]}],"ix":6}},"ao":0,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"BODY","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.4],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.621],"y":[0]},"t":7,"s":[7]},{"i":{"x":[0.351],"y":[1]},"o":{"x":[0.376],"y":[0]},"t":19,"s":[-12]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.31],"y":[0]},"t":27,"s":[11]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":34,"s":[-8]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":41,"s":[7]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":48,"s":[-5]},{"t":55,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.31,"y":0},"t":0,"s":[49.383,-56.666,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.7,"y":0},"t":7,"s":[60.013,-25.299,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.625,"y":1},"o":{"x":0.509,"y":0},"t":16,"s":[37.303,-107.367,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":24,"s":[51.771,-33.907,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":31,"s":[49.758,-69.367,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":38,"s":[49.383,-48.055,0],"to":[0,0,0],"ti":[0,0,0]},{"t":44,"s":[49.383,-56.666,0]}],"ix":2},"a":{"a":0,"k":[-6.913,-104.224,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.31,"y":0},"t":0,"s":[{"i":[[-0.876,-20.517],[13.633,0],[-0.698,15.548],[-15.079,0]],"o":[[0.664,15.55],[-13.633,0],[1.095,-24.395],[18.772,0]],"v":[[28.231,-148.554],[-6.496,-133.291],[-37.937,-149.555],[-4.892,-184.458]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.7,"y":0},"t":9,"s":[{"i":[[-0.96,-22.479],[14.937,0],[-0.765,17.035],[-16.521,0]],"o":[[0.728,17.037],[-14.937,0],[1.2,-26.728],[20.567,0]],"v":[[31.363,-158.454],[-6.685,-141.732],[-41.132,-159.551],[-4.927,-197.792]],"c":true}]},{"i":{"x":0.351,"y":1},"o":{"x":0.376,"y":0},"t":18,"s":[{"i":[[-0.804,-18.813],[12.501,0],[-0.64,14.257],[-13.827,0]],"o":[[0.609,14.259],[-12.501,0],[1.005,-22.369],[17.213,0]],"v":[[25.396,-139.061],[-6.448,-125.066],[-35.278,-139.979],[-4.977,-171.984]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.31,"y":0},"t":25,"s":[{"i":[[-0.932,-21.827],[14.504,0],[-0.743,16.541],[-16.042,0]],"o":[[0.707,16.543],[-14.504,0],[1.165,-25.953],[19.971,0]],"v":[[30.411,-155.855],[-6.534,-139.618],[-39.982,-156.92],[-4.827,-194.052]],"c":true}]},{"t":32,"s":[{"i":[[-0.876,-20.517],[13.633,0],[-0.698,15.548],[-15.079,0]],"o":[[0.664,15.55],[-13.633,0],[1.095,-24.395],[18.772,0]],"v":[[28.231,-148.554],[-6.496,-133.291],[-37.937,-149.555],[-4.892,-184.458]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.31,"y":0},"t":0,"s":[{"i":[[-0.628,1.227],[0,0],[-16.367,-2.951],[-1.689,-65.781],[0,0],[0,0],[0,0],[13.24,0],[0,0],[-20.08,18.628],[0,0],[0,0],[-9.702,17.021]],"o":[[20.486,-40.026],[16.088,-3.002],[49.774,10.562],[0,0],[0,0],[0,0],[20.08,18.628],[0,0],[-13.24,0],[0,0],[0,0],[0,-26.937],[0,0]],"v":[[-104.254,-88.602],[-29.567,-138.357],[19.12,-138.357],[107.477,-27.163],[107.477,-27.163],[107.843,74.112],[130.801,94.479],[117.418,116.011],[-129.245,116.011],[-142.628,94.479],[-119.669,74.112],[-119.669,-22.412],[-104.38,-87.96]],"c":false}]},{"i":{"x":0.6,"y":1},"o":{"x":0.7,"y":0},"t":9,"s":[{"i":[[-0.773,1.298],[0,0],[-17.933,-3.233],[-1.851,-72.072],[0,0],[0,0],[0,0],[14.506,0],[0,0],[-22,20.409],[0,0],[0,0],[-10.63,18.649]],"o":[[25.717,-43.192],[17.627,-3.289],[54.534,11.572],[0,0],[0,0],[0,0],[22,20.409],[0,0],[-14.506,0],[0,0],[0,0],[0,-29.513],[0,0]],"v":[[-113.735,-92.211],[-31.962,-147.282],[21.381,-147.282],[118.187,-25.455],[118.187,-25.455],[118.588,85.505],[143.742,107.82],[129.079,131.41],[-141.172,131.41],[-155.835,107.82],[-130.681,85.505],[-130.681,-20.249],[-113.929,-92.066]],"c":false}]},{"i":{"x":0.351,"y":1},"o":{"x":0.376,"y":0},"t":18,"s":[{"i":[[-0.576,1.125],[0,0],[-15.008,-2.706],[-1.549,-60.32],[0,0],[0,0],[0,0],[12.141,0],[0,0],[-18.412,17.081],[0,0],[0,0],[-8.896,15.608]],"o":[[18.785,-36.702],[14.753,-2.753],[45.641,9.685],[0,0],[0,0],[0,0],[18.412,17.081],[0,0],[-12.141,0],[0,0],[0,0],[0,-24.701],[0,0]],"v":[[-96.089,-84.087],[-27.603,-129.711],[17.041,-129.711],[98.062,-27.749],[98.062,-27.749],[98.397,65.117],[119.45,83.793],[107.177,103.536],[-119.004,103.536],[-131.277,83.793],[-110.224,65.117],[-110.224,-23.392],[-96.204,-83.499]],"c":false}]},{"i":{"x":0.7,"y":1},"o":{"x":0.31,"y":0},"t":25,"s":[{"i":[[-0.668,1.305],[0,0],[-17.412,-3.139],[-1.797,-69.982],[0,0],[0,0],[0,0],[14.086,0],[0,0],[-21.362,19.818],[0,0],[0,0],[-10.321,18.108]],"o":[[21.794,-42.582],[17.116,-3.194],[52.953,11.236],[0,0],[0,0],[0,0],[21.362,19.818],[0,0],[-14.086,0],[0,0],[0,0],[0,-28.658],[0,0]],"v":[[-110.534,-92.074],[-31.078,-145.007],[20.719,-145.007],[114.718,-26.712],[114.718,-26.712],[115.107,81.031],[139.532,102.699],[125.294,125.605],[-137.121,125.605],[-151.359,102.699],[-126.934,81.031],[-126.934,-21.657],[-110.668,-91.392]],"c":false}]},{"t":32,"s":[{"i":[[-0.628,1.227],[0,0],[-16.367,-2.951],[-1.689,-65.781],[0,0],[0,0],[0,0],[13.24,0],[0,0],[-20.08,18.628],[0,0],[0,0],[-9.702,17.021]],"o":[[20.486,-40.026],[16.088,-3.002],[49.774,10.562],[0,0],[0,0],[0,0],[20.08,18.628],[0,0],[-13.24,0],[0,0],[0,0],[0,-26.937],[0,0]],"v":[[-104.254,-88.602],[-29.567,-138.357],[19.12,-138.357],[107.477,-27.163],[107.477,-27.163],[107.843,74.112],[130.801,94.479],[117.418,116.011],[-129.245,116.011],[-142.628,94.479],[-119.669,74.112],[-119.669,-22.412],[-104.38,-87.96]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":166,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":26,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.31,"y":0},"t":0,"s":[{"i":[[-0.839,1.098],[0,0],[-16.408,-2.958],[0,0],[0,0]],"o":[[25.076,-32.799],[16.129,-3.01],[113.039,24.604],[0,0],[0,0]],"v":[[-95.862,-97.863],[-29.626,-138.617],[19.182,-138.617],[107.76,19.579],[-116.173,-54.26]],"c":false}]},{"i":{"x":0.6,"y":1},"o":{"x":0.7,"y":0},"t":9,"s":[{"i":[[-1.375,0.618],[0,0],[-17.895,-3.226],[0,0],[0,0]],"o":[[14.5,-6.521],[17.59,-3.282],[136.413,26.468],[0,0],[0,0]],"v":[[-60.107,-141.792],[-31.347,-150.817],[21.884,-150.817],[109.156,95.202],[-107.886,-89.497]],"c":false}]},{"i":{"x":0.351,"y":1},"o":{"x":0.376,"y":0},"t":18,"s":[{"i":[[-0.762,0.996],[0,0],[-14.888,-2.684],[0,0],[0,0]],"o":[[22.753,-29.76],[14.635,-2.731],[102.567,22.325],[0,0],[0,0]],"v":[[-87.53,-89.966],[-27.43,-126.945],[16.858,-126.945],[97.23,16.596],[-105.958,-50.403]],"c":false}]},{"i":{"x":0.7,"y":1},"o":{"x":0.31,"y":0},"t":25,"s":[{"i":[[-0.889,1.163],[0,0],[-17.383,-3.134],[0,0],[0,0]],"o":[[26.566,-34.747],[17.087,-3.188],[119.754,26.066],[0,0],[0,0]],"v":[[-101.206,-102.926],[-31.035,-146.102],[20.673,-146.102],[114.513,21.491],[-122.722,-56.733]],"c":false}]},{"t":32,"s":[{"i":[[-0.839,1.098],[0,0],[-16.408,-2.958],[0,0],[0,0]],"o":[[25.076,-32.799],[16.129,-3.01],[113.039,24.604],[0,0],[0,0]],"v":[[-95.862,-97.863],[-29.626,-138.617],[19.182,-138.617],[107.76,19.579],[-116.173,-54.26]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.31,"y":0},"t":0,"s":[{"i":[[5.561,-39.019],[0,0],[13.273,0],[0,0],[-20.13,18.675],[0,0],[0,0]],"o":[[-8.129,57.039],[20.13,18.675],[0,0],[-13.273,0],[0,0],[0,0],[0,-27.005]],"v":[[108.127,15.843],[131.143,94.801],[117.726,116.386],[-129.553,116.386],[-142.97,94.801],[-119.954,74.383],[-117.805,-61.05]],"c":false}]},{"i":{"x":0.6,"y":1},"o":{"x":0.7,"y":0},"t":9,"s":[{"i":[[0,0],[0,0],[4.137,1.152],[0,0],[-21.954,20.367],[0,0],[-25.565,46.68]],"o":[[0,0],[21.954,20.367],[0,0],[-14.476,0],[0,0],[0,0],[15.952,-29.128]],"v":[[110.594,91.061],[128.581,108.89],[129.356,127.29],[-140.327,127.29],[-154.959,103.749],[-129.858,81.481],[-114.009,-98.208]],"c":false}]},{"i":{"x":0.351,"y":1},"o":{"x":0.376,"y":0},"t":18,"s":[{"i":[[5.046,-35.404],[0,0],[12.044,0],[0,0],[-18.265,16.945],[0,0],[0,0]],"o":[[-7.376,51.755],[18.265,16.945],[0,0],[-12.044,0],[0,0],[0,0],[0,-24.503]],"v":[[97.562,13.207],[118.446,84.849],[106.272,104.435],[-118.099,104.435],[-130.273,84.849],[-109.389,66.323],[-107.44,-56.564]],"c":false}]},{"i":{"x":0.7,"y":1},"o":{"x":0.31,"y":0},"t":25,"s":[{"i":[[5.891,-41.337],[0,0],[14.062,0],[0,0],[-21.326,19.784],[0,0],[0,0]],"o":[[-8.612,60.428],[21.326,19.784],[0,0],[-14.062,0],[0,0],[0,0],[0,-28.609]],"v":[[114.901,17.534],[139.284,101.182],[125.07,124.049],[-136.897,124.049],[-151.111,101.182],[-126.728,79.551],[-124.452,-63.927]],"c":false}]},{"t":32,"s":[{"i":[[5.561,-39.019],[0,0],[13.273,0],[0,0],[-20.13,18.675],[0,0],[0,0]],"o":[[-8.129,57.039],[20.13,18.675],[0,0],[-13.273,0],[0,0],[0,0],[0,-27.005]],"v":[[108.127,15.843],[131.143,94.801],[117.726,116.386],[-129.553,116.386],[-142.97,94.801],[-119.954,74.383],[-117.805,-61.05]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Waves R","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[448.023,238.522,0],"ix":2},"a":{"a":0,"k":[191.589,-21.679,0],"ix":1},"s":{"a":0,"k":[95,95,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[{"i":[[0,0],[-1.254,-7.629],[0.682,-6.14]],"o":[[2.189,4.163],[1.246,7.579],[0,0]],"v":[[113.004,-37.811],[118.92,-17.207],[120.129,3.672]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[{"i":[[0,0],[-0.562,-7.823],[4.215,-8.564]],"o":[[5.44,8.096],[0.559,7.771],[0,0]],"v":[[145.718,-42.756],[154.165,-17.687],[149.146,8.77]],"c":false}]},{"t":52,"s":[{"i":[[0,0],[-0.19,-13.63],[11.062,-14.038]],"o":[[15.569,17.791],[0.188,13.541],[0,0]],"v":[[214.943,-68.441],[233.005,-16.979],[216.819,33.388]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":22,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[178.686,-21.574],"ix":2},"a":{"a":0,"k":[178.686,-21.574],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":37,"s":[100],"h":1},{"t":51,"s":[0],"h":1}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[0,0],[0.001,-0.027],[0.008,-8.472],[-0.131,-3.258]],"o":[[-0.001,0.027],[-0.136,3.301],[-0.008,8.554],[0,0]],"v":[[108.934,-34.861],[108.932,-34.806],[108.687,-15.713],[108.897,3.454]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[{"i":[[0,0],[-0.036,-0.06],[-0.041,-18.534],[9.546,-7.119]],"o":[[0.036,0.06],[9.471,7.23],[0.042,18.713],[0,0]],"v":[[159.969,-57.629],[160.112,-57.51],[176.26,-15.726],[160.12,26.192]],"c":false}]},{"t":46,"s":[{"i":[[0,0],[-0.126,-0.135],[0,-41.723],[33.816,-16.016]],"o":[[0.126,0.135],[33.437,16.285],[0,42.126],[0,0]],"v":[[196.088,-111.898],[196.593,-111.629],[253.373,-17.551],[195.962,76.796]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":22,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[224.436,-22.297],"ix":2},"a":{"a":0,"k":[224.436,-22.297],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":28,"s":[100],"h":1},{"t":45,"s":[0],"h":1}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Waves L","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[59.977,238.522,0],"ix":2},"a":{"a":0,"k":[191.589,-21.679,0],"ix":1},"s":{"a":0,"k":[-95,95,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[{"i":[[0,0],[-1.254,-7.629],[0.682,-6.14]],"o":[[2.189,4.163],[1.246,7.579],[0,0]],"v":[[113.004,-37.811],[118.92,-17.207],[120.129,3.672]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[{"i":[[0,0],[-0.562,-7.823],[4.215,-8.564]],"o":[[5.44,8.096],[0.559,7.771],[0,0]],"v":[[145.718,-42.756],[154.165,-17.687],[149.146,8.77]],"c":false}]},{"t":52,"s":[{"i":[[0,0],[-0.19,-13.63],[11.062,-14.038]],"o":[[15.569,17.791],[0.188,13.541],[0,0]],"v":[[214.943,-68.441],[233.005,-16.979],[216.819,33.388]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":22,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[178.686,-21.574],"ix":2},"a":{"a":0,"k":[178.686,-21.574],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":37,"s":[100],"h":1},{"t":51,"s":[0],"h":1}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[0,0],[0.001,-0.027],[0.008,-8.472],[-0.131,-3.258]],"o":[[-0.001,0.027],[-0.136,3.301],[-0.008,8.554],[0,0]],"v":[[108.934,-34.861],[108.932,-34.806],[108.687,-15.713],[108.897,3.454]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[{"i":[[0,0],[-0.036,-0.06],[-0.041,-18.534],[9.546,-7.119]],"o":[[0.036,0.06],[9.471,7.23],[0.042,18.713],[0,0]],"v":[[159.969,-57.629],[160.112,-57.51],[176.26,-15.726],[160.12,26.192]],"c":false}]},{"t":46,"s":[{"i":[[0,0],[-0.126,-0.135],[0,-41.723],[33.816,-16.016]],"o":[[0.126,0.135],[33.437,16.285],[0,42.126],[0,0]],"v":[[196.088,-111.898],[196.593,-111.629],[253.373,-17.551],[195.962,76.796]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":22,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[224.436,-22.297],"ix":2},"a":{"a":0,"k":[224.436,-22.297],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"t":0,"s":[0],"h":1},{"t":28,"s":[100],"h":1},{"t":45,"s":[0],"h":1}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Bottom","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.28,"y":0},"t":0,"s":[-5.222,172.563,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.6,"y":1},"o":{"x":0.71,"y":0},"t":9,"s":[-20.182,174.233,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.376,"y":0},"t":22,"s":[48.17,174.479,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":30,"s":[-49.259,173.63,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":37,"s":[33.229,173.814,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":44,"s":[-36.478,174.152,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":51,"s":[9.631,173.475,0],"to":[0,0,0],"ti":[0,0,0]},{"t":57,"s":[-5.222,172.563,0]}],"ix":2},"a":{"a":0,"k":[-5.222,167.73,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.4,"y":1},"o":{"x":0.31,"y":0},"t":0,"s":[{"i":[[0,0],[0.496,-3.196],[22.355,0],[3.077,19.901],[0,0],[-3.428,0.001]],"o":[[3.394,0.465],[-3.078,19.9],[-22.356,0],[0,0],[0,-3.228],[0,0]],"v":[[27.678,149.52],[32.927,156.149],[-5.222,186],[-43.372,156.148],[-43.436,155.306],[-37.229,149.459]],"c":true}]},{"i":{"x":0.6,"y":1},"o":{"x":0.7,"y":0},"t":9,"s":[{"i":[[0,0],[0.551,-3.563],[24.924,0],[3.431,22.188],[0,0],[-3.822,0.001]],"o":[[3.784,0.519],[-3.431,22.187],[-24.925,0],[0,0],[0,-3.599],[0,0]],"v":[[33.168,164.472],[39.02,171.864],[-3.513,205.144],[-46.047,171.862],[-46.119,170.923],[-39.198,164.404]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.376,"y":0},"t":19,"s":[{"i":[[0,0],[0.426,-2.754],[19.266,0],[2.652,17.151],[0,0],[-2.955,0.001]],"o":[[2.925,0.401],[-2.652,17.15],[-19.267,0],[0,0],[0,-2.782],[0,0]],"v":[[16.681,136.734],[21.204,142.447],[-11.673,168.173],[-44.551,142.446],[-44.607,141.72],[-39.257,136.681]],"c":true}]},{"i":{"x":0.7,"y":1},"o":{"x":0.3,"y":0},"t":25,"s":[{"i":[[0,0],[0.523,-3.382],[23.656,0],[3.256,21.059],[0,0],[-3.628,0.001]],"o":[[3.591,0.492],[-3.257,21.058],[-23.657,0],[0,0],[0,-3.416],[0,0]],"v":[[33.859,160.454],[39.413,167.469],[-0.956,199.056],[-41.325,167.467],[-41.393,166.576],[-34.824,160.39]],"c":true}]},{"t":32,"s":[{"i":[[0,0],[0.496,-3.196],[22.355,0],[3.077,19.901],[0,0],[-3.428,0.001]],"o":[[3.394,0.465],[-3.078,19.9],[-22.356,0],[0,0],[0,-3.228],[0,0]],"v":[[27.678,149.52],[32.927,156.149],[-5.222,186],[-43.372,156.148],[-43.436,155.306],[-37.229,149.459]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/speaker.json b/TMessagesProj/src/main/res/raw/speaker.json new file mode 100644 index 00000000000..d25b58d406f --- /dev/null +++ b/TMessagesProj/src/main/res/raw/speaker.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":""},"fr":60,"ip":0,"op":34,"w":24,"h":24,"nm":"Comp 2","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"topv","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[13.142,9.641,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[33.333,33.333,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0]],"o":[[0,0]],"v":[[-105.801,1.453]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":25,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":25,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-6.66,-0.01],[-3.28,3.04],[0,0],[0,-22.97],[0,-31.66]],"o":[[3.33,0],[4.47,0.01],[0,0],[14.22,-13.2],[0,63.33],[0,0]],"v":[[-57.872,-23.732],[-42.882,-23.712],[-30.812,-28.432],[21.708,-76.362],[57.868,-59.522],[57.868,87.187]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":25,"ix":5},"lc":3,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[20,20],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":34,"st":-1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"bottom","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[11.333,13.918,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[33.333,33.333,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-20.36],[12.78,10.6],[0,0],[4.51,-0.03],[0,0],[0.57,13.33],[0,0],[-16,0.5],[-6.73,-0.01]],"o":[[0,10.17],[0,22.2],[0,0],[-3.31,-3.06],[0,0],[-16,0.06],[0,0],[0,-13.46],[13.45,0.02],[0,0]],"v":[[85,18.817],[85,64.617],[49.45,83.037],[-3.64,35.087],[-15.81,30.367],[-61,30.737],[-84.97,9.107],[-85,-65.233],[-61,-87.933],[-30.74,-87.893]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":25,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[20,20],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[21]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[21]},{"t":31,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.921],"y":[0]},"t":5,"s":[99]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[81]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[81]},{"t":25,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":34,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"dash","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":5,"s":[100]},{"i":{"x":[0.652],"y":[1]},"o":{"x":[0.157],"y":[0]},"t":16,"s":[100]},{"i":{"x":[0.802],"y":[1]},"o":{"x":[0.438],"y":[0]},"t":29,"s":[100]},{"t":32,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[4.549,3.926,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":-1,"s":[20,20,100]},{"t":6,"s":[33.333,33.333,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.693,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2.5,-3.5],[2.5,-3.5],[2.5,3.5],[-2.5,3.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.725,"y":0},"t":16,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2.5,-3.5],[2.5,-3.5],[2.32,71.912],[-2.68,71.912]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2.5,-3.321],[2.5,-3.321],[2.32,71.912],[-2.68,71.912]],"c":true}]},{"t":32,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-2.522,66.68],[2.478,66.68],[2.32,71.912],[-2.68,71.912]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":2.5,"ix":1},"ix":2,"mn":"ADBE Vector Filter - RC","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":-45,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle Copy 5","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":34,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/ticks_double.json b/TMessagesProj/src/main/res/raw/ticks_double.json new file mode 100644 index 00000000000..b94bf98fc32 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/ticks_double.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":""},"fr":60,"ip":0,"op":54,"w":24,"h":24,"nm":"Tics D","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Half","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[15.125,12.001,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":9,"s":[30,30,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":18,"s":[36.667,36.667,100]},{"t":23,"s":[33.333,33.333,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-16.277,1.618],[-6.457,11.088],[16.273,-11.092]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path 2 Copy 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":36,"s":[0]},{"t":44,"s":[23]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":23,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[100]},{"t":38,"s":[99]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":1,"ix":1},"ix":3,"mn":"ADBE Vector Filter - RC","hd":false}],"ip":0,"op":54,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Check 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[9.458,12.001,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":35,"s":[30,30,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":44,"s":[36.667,36.667,100]},{"t":50,"s":[33.333,33.333,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-16.277,1.618],[-6.457,11.088],[16.273,-11.092]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path 2 Copy","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":27,"s":[0]},{"t":46,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":1,"ix":1},"ix":3,"mn":"ADBE Vector Filter - RC","hd":false}],"ip":0,"op":54,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/raw/ticks_single.json b/TMessagesProj/src/main/res/raw/ticks_single.json new file mode 100644 index 00000000000..d42597019b1 --- /dev/null +++ b/TMessagesProj/src/main/res/raw/ticks_single.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":""},"fr":60,"ip":0,"op":25,"w":24,"h":24,"nm":"Tics S","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Half","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[15.125,12.001,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":9,"s":[30,30,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":18,"s":[36.667,36.667,100]},{"t":23,"s":[33.333,33.333,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-16.277,1.618],[-6.457,11.088],[16.273,-11.092]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path 2 Copy 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":3,"s":[0]},{"t":23,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":1,"ix":1},"ix":3,"mn":"ADBE Vector Filter - RC","hd":false}],"ip":0,"op":25,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/TMessagesProj/src/main/res/values/strings.xml b/TMessagesProj/src/main/res/values/strings.xml index 2371dd19042..596da1f4850 100644 --- a/TMessagesProj/src/main/res/values/strings.xml +++ b/TMessagesProj/src/main/res/values/strings.xml @@ -171,6 +171,7 @@ Delete chat Deleted Account Select Chat + Select Chats Forward to... Secret Photo Secret Video @@ -252,6 +253,34 @@ Chats Message pinned Message unpinned + Tap on the pencil to start a new chat + Create a New Group to Import + Import Messages + Import Error + Invalid file format. + Unknown file language. + You must be an admin in the group to import messages. + The file format is for a group, but you selected a user. + The file format is for a user, but you selected a group. + Unable to import messages due to privacy settings. + IMPORT + Do you want to import messages from **%1$s** to the chat with **%2$s**? + Do you want to import messages to the chat with **%1$s**? + Do you want to import messages from **%1$s** to the group **%2$s**? + Do you want to import messages to the group **%1$s**? + You can only import messages into private chats with users with whom you are mutual contacts. + You must be an admin in the group to import messages. + This message was imported from another app. We can\'t guarantee it\'s real. + Importing messages and media... **%d%%** + Importing chat + Please keep Telegram open\nuntil the import is completed. + %1$s of %2$s + Done + Chat imported successfully! + Save space on your device by importing more chats to Telegram. + Importing messages and media... + Import messages and media to... + Or choose one of your contacts Promote to admin Edit admin rights @@ -262,6 +291,7 @@ You will lose all messages in this group. You can add administrators to help you manage your group. Tap and hold to remove them. Wait! Deleting this group will remove all members and all messages will be lost. Delete the group anyway? + Delete the group for all members Group created un1 added you to this group Are you sure you want to leave the group? @@ -933,6 +963,7 @@ Report Report sent Spam + Fake Account Violence Pornography Child Abuse @@ -1014,6 +1045,7 @@ No previews Install Google Maps? SCAM + FAKE via Message doesn\'t exist Slow Mode is enabled. You can send\nyour next message in %1$s @@ -1059,6 +1091,7 @@ Are you sure you want to hide the selected chat? Hide Send a message or tap on the greeting below to show that you are ready to chat + Send a message or tap the greeting below. %1$s is in %2$s %1$s is %2$s The chat was moved to your main list. @@ -1089,6 +1122,20 @@ HIDE PINNED MESSAGES Pinned messages hidden You will see the bar with pinned messages only if a new message is pinned. + Imported + Audio will play at normal speed. + Audio will play two times faster. + Message copied to clipboard. + Delivered + Read + Message forwarded to **Saved Messages**. + Messages forwarded to **Saved Messages**. + Message forwarded to **%1$s**. + Messages forwarded to **%1$s**. + Message forwarded to **%1$s**. + Messages forwarded to **%1$s**. + Message forwarded to **%1$s**. + Messages forwarded to **%1$s**. %1$s set the self-destruct timer to %2$s You set the self-destruct timer to %1$s @@ -1291,6 +1338,7 @@ Email copied to clipboard Invite to Group via Link Invite Link + Invite Links Are you sure you want to revoke this link? Once the link is revoked, no one will be able to join using it. The previous invite link is now inactive. A new link has been generated. Revoke @@ -2851,6 +2899,7 @@ Sign Up Decline & Delete Next + Enable You joined the group via invite link un1 joined the group via invite link @@ -3194,6 +3243,11 @@ Ringtone You can customize the ringtone used when this contact calls you on Telegram. Calls + Delete all calls + Delete calls + Delete for everyone + Do you want to delete all recent calls? + Do you want to delete selected calls from recent? Peer-to-peer in calls will or will not be used with these users regardless of the settings above. Use peer-to-peer with Who can call me? @@ -3319,7 +3373,9 @@ Do you want to remove %1$s from the group chat? **%1$s** removed from the group. **%1$s** can now speak. + **%1$s** is now unmuted for you. **%1$s** is now muted in this chat. + **%1$s** is now muted in this chat for you. Mute New participants can speak New paricipants are muted @@ -3341,6 +3397,7 @@ Hey! Join our voice chat: %1$s Invite Members Remove + Open Profile Allow to speak Search members to invite... Copy Invite Link @@ -3351,7 +3408,50 @@ Do you want to add **%1$s** to **%2$s**? You invited **%1$s** to the voice chat. Add + Volume + Mute for me + Muted for me + Unmute for me Nobody talking + Start recording + Stop recording + + Manage Invite Links + You can create additional invite links that have limited time or number of usages + Anyone on Telegram will be able to join your group by following this link. + Edit link + Save Link + No limit + Limit by time period + Limit number of uses + New Link + Set custom duration + Enter custom limit + Your can make the link expire after a certain time. + You can make the link expire after it has been used for a certain number of times. + No one joined yet + Expired + Get QR code + Link created by + Invite by QR Code + Share QR Code + Revoked + The link expires %s + Expire after + Set Time Limit + Revoked Links + Delete Link + Revoked Link + This link is no longer active + This link is expired + Create a New Link + Delete All Revoked Links + No one joined + Limit reached + Everyone on Telegram can scan this code to join your group + This will delete link. + This will delete all revoked links. + You can generate invite links that will expire after they\'ve been used. Message %1$s Voice call %1$s @@ -3387,6 +3487,12 @@ Hey, I\'m using Telegram to chat – and so are %1$d of our other contacts. Join us! Download it here: %2$s Hey, I\'m using Telegram to chat – and so are %1$d of our other contacts. Join us! Download it here: %2$s Hey, I\'m using Telegram to chat – and so are %1$d of our other contacts. Join us! Download it here: %2$s + %1$d people joined + %1$d people joined + %1$d people joined + %1$d people joined + %1$d people joined + %1$d people joined %1$d chats %1$d chat %1$d chats @@ -3981,6 +4087,7 @@ Share in %1$d chats Share in %1$d chats Correct answer + Explanation Picture-in-Picture mode Microphone is on Microphone is off @@ -3989,6 +4096,8 @@ Camera is on Camera is off Pinned messages list + Switch to fullscreen + Exit fullscreen MMM yyyy MMM dd yyyy, h:mm a @@ -4017,5 +4126,4 @@ \'Remind today at\' HH:mm \'Remind on\' MMM d \'at\' HH:mm \'Remind on\' MMM d yyyy \'at\' HH:mm - Enable diff --git a/TMessagesProj/src/main/res/xml/feed_widget_info.xml b/TMessagesProj/src/main/res/xml/feed_widget_info.xml new file mode 100644 index 00000000000..7641a87c2f3 --- /dev/null +++ b/TMessagesProj/src/main/res/xml/feed_widget_info.xml @@ -0,0 +1,12 @@ + + + \ No newline at end of file diff --git a/TMessagesProj/src/main/res/xml/shortcut_widget_info.xml b/TMessagesProj/src/main/res/xml/shortcut_widget_info.xml new file mode 100644 index 00000000000..928a8494363 --- /dev/null +++ b/TMessagesProj/src/main/res/xml/shortcut_widget_info.xml @@ -0,0 +1,13 @@ + + + \ No newline at end of file

Up10)pYPb29r73I2bDz5)i)K( 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