From 93fa5019c3291345cf4fad44f88594873286f8c3 Mon Sep 17 00:00:00 2001 From: DrKLO Date: Thu, 26 Feb 2015 04:32:51 +0300 Subject: [PATCH] Update to 2.5.0 Photo editor Passcode Sections in shared media\files --- TMessagesProj/build.gradle | 6 +- TMessagesProj/jni/Android.mk | 2 +- TMessagesProj/jni/image.c | 107 ++ .../{libtmessages.5.so => libtmessages.6.so} | Bin 1565572 -> 1569668 bytes .../{libtmessages.5.so => libtmessages.6.so} | Bin 1114980 -> 1114980 bytes .../{libtmessages.5.so => libtmessages.6.so} | Bin 1873836 -> 1877932 bytes .../telegram/android/AndroidUtilities.java | 44 +- .../telegram/android/ContactsController.java | 91 +- .../org/telegram/android/ImageLoader.java | 85 +- .../org/telegram/android/ImageReceiver.java | 73 +- .../telegram/android/LocaleController.java | 86 +- .../org/telegram/android/MediaController.java | 2 + .../org/telegram/android/MessageObject.java | 30 +- .../telegram/android/MessagesController.java | 37 +- .../org/telegram/android/MessagesStorage.java | 69 +- .../org/telegram/android/NativeLoader.java | 2 +- .../telegram/android/NotificationCenter.java | 3 + .../android/NotificationsController.java | 80 +- .../org/telegram/android/ScreenReceiver.java | 1 + .../telegram/android/SecretChatHelper.java | 4 +- .../telegram/android/SendMessagesHelper.java | 193 +- .../telegram/android/video/MP4Builder.java | 8 +- .../telegram/messenger/ApplicationLoader.java | 80 +- .../messenger/ConnectionsManager.java | 7 +- .../org/telegram/messenger/FileLoader.java | 2 +- .../org/telegram/messenger/UserConfig.java | 24 +- .../org/telegram/messenger/Utilities.java | 1 + .../telegram/ui/AccountPasswordActivity.java | 28 +- .../org/telegram/ui/ActionBar/ActionBar.java | 20 +- .../ui/ActionBar/ActionBarLayout.java | 50 +- .../ui/ActionBar/ActionBarMenuItem.java | 6 +- .../telegram/ui/ActionBar/BaseFragment.java | 4 +- .../ui/ActionBar/DrawerLayoutContainer.java | 3 + .../ui/Adapters/ContactsSearchAdapter.java | 6 +- .../telegram/ui/Adapters/DialogsAdapter.java | 38 +- .../ui/Adapters/DialogsSearchAdapter.java | 26 +- .../telegram/ui/Adapters/StickersAdapter.java | 3 + .../telegram/ui/Animation/AnimatorSet10.java | 38 +- .../org/telegram/ui/Animation/View10.java | 4 +- .../org/telegram/ui/BlockedUsersActivity.java | 2 +- .../org/telegram/ui/Cells/ChatBaseCell.java | 6 +- .../org/telegram/ui/Cells/ChatMediaCell.java | 21 +- .../org/telegram/ui/Cells/DialogCell.java | 73 +- .../telegram/ui/Cells/GreySectionCell.java | 25 +- .../telegram/ui/Cells/PhotoEditToolCell.java | 39 +- .../ui/Cells/PhotoPickerAlbumsCell.java | 20 +- .../ui/Cells/PhotoPickerPhotoCell.java | 12 - .../ui/Cells/PhotoPickerSearchCell.java | 71 +- .../telegram/ui/Cells/SharedDocumentCell.java | 46 +- .../ui/Cells/SharedMediaSectionCell.java | 50 + .../ui/Cells/SharedPhotoVideoCell.java | 255 +++ .../telegram/ui/ChangeChatNameActivity.java | 2 +- .../org/telegram/ui/ChangeNameActivity.java | 2 +- .../org/telegram/ui/ChangePhoneActivity.java | 12 +- .../telegram/ui/ChangePhoneHelpActivity.java | 2 +- .../telegram/ui/ChangeUsernameActivity.java | 23 +- .../java/org/telegram/ui/ChatActivity.java | 729 +++++--- .../ui/Components/AvatarDrawable.java | 26 +- .../telegram/ui/Components/AvatarUpdater.java | 76 +- .../ui/Components/BackupImageView.java | 4 + .../ui/Components/ChatActivityEnterView.java | 387 ++-- .../ui/Components/ClippingImageView.java | 47 +- .../ui/Components/ForegroundDetector.java | 121 ++ .../ui/Components/LetterSectionsListView.java | 211 +++ .../telegram/ui/Components/NumberPicker.java | 2 +- .../telegram/ui/Components/PasscodeView.java | 1049 +++++++++++ .../telegram/ui/Components/PhotoCropView.java | 598 ++++++ .../ui/Components/PhotoEditorSeekBar.java | 132 ++ .../ui/Components/PhotoFilterView.java | 1647 +++++++++++++++++ .../Components/PhotoPickerBottomLayout.java | 60 +- .../ui/Components/SectionsListView.java | 127 +- .../SizeNotifierRelativeLayout.java | 33 +- .../org/telegram/ui/ContactAddActivity.java | 2 +- .../org/telegram/ui/ContactsActivity.java | 35 +- .../telegram/ui/CountrySelectActivity.java | 9 +- .../telegram/ui/DocumentSelectActivity.java | 6 +- .../org/telegram/ui/GroupCreateActivity.java | 10 +- .../telegram/ui/GroupCreateFinalActivity.java | 7 +- .../org/telegram/ui/IdenticonActivity.java | 4 +- .../telegram/ui/LanguageSelectActivity.java | 4 +- .../org/telegram/ui/LastSeenActivity.java | 2 +- .../telegram/ui/LastSeenUsersActivity.java | 2 +- .../java/org/telegram/ui/LaunchActivity.java | 931 ++++++---- .../org/telegram/ui/LocationActivity.java | 6 +- .../java/org/telegram/ui/LoginActivity.java | 9 +- .../java/org/telegram/ui/MediaActivity.java | 1401 ++++++++------ .../org/telegram/ui/MessagesActivity.java | 114 +- .../ui/NotificationsSettingsActivity.java | 2 +- .../org/telegram/ui/PasscodeActivity.java | 710 +++++++ .../telegram/ui/PhotoAlbumPickerActivity.java | 32 +- .../org/telegram/ui/PhotoCropActivity.java | 8 +- .../org/telegram/ui/PhotoEditorActivity.java | 1285 ------------- .../org/telegram/ui/PhotoPickerActivity.java | 97 +- .../java/org/telegram/ui/PhotoViewer.java | 1472 +++++++++++---- .../ui/PopupNotificationActivity.java | 40 +- .../telegram/ui/PrivacySettingsActivity.java | 16 +- .../java/org/telegram/ui/ProfileActivity.java | 9 +- .../ui/ProfileNotificationsActivity.java | 12 +- .../org/telegram/ui/SettingsActivity.java | 11 +- .../org/telegram/ui/VideoEditorActivity.java | 7 +- .../org/telegram/ui/WallpapersActivity.java | 10 +- .../main/res/drawable-hdpi/bottom_shadow.png | Bin 0 -> 968 bytes .../main/res/drawable-hdpi/doc_actions_g.png | Bin 1049 -> 1049 bytes .../main/res/drawable-hdpi/edit_cancel.png | Bin 0 -> 1246 bytes .../main/res/drawable-hdpi/edit_doneblue.png | Bin 0 -> 1306 bytes .../src/main/res/drawable-hdpi/gif_search.png | Bin 1895 -> 0 bytes .../res/drawable-hdpi/ic_ab_delete_white.png | Bin 1468 -> 0 bytes .../res/drawable-hdpi/ic_ab_share_white.png | Bin 1523 -> 0 bytes .../src/main/res/drawable-hdpi/lock_close.png | Bin 0 -> 1266 bytes .../src/main/res/drawable-hdpi/lock_open.png | Bin 0 -> 1275 bytes .../src/main/res/drawable-hdpi/msg_check.png | Bin 411 -> 1280 bytes .../main/res/drawable-hdpi/msg_check_w.png | Bin 335 -> 1225 bytes .../main/res/drawable-hdpi/msg_halfcheck.png | Bin 344 -> 1239 bytes .../res/drawable-hdpi/msg_halfcheck_w.png | Bin 313 -> 1186 bytes .../src/main/res/drawable-hdpi/msg_out.9.png | Bin 1005 -> 1871 bytes .../res/drawable-hdpi/msg_out_photo.9.png | Bin 764 -> 1625 bytes .../msg_out_photo_selected.9.png | Bin 747 -> 1611 bytes .../res/drawable-hdpi/msg_out_selected.9.png | Bin 993 -> 1869 bytes .../main/res/drawable-hdpi/passcode_check.png | Bin 0 -> 1153 bytes .../res/drawable-hdpi/passcode_delete.png | Bin 0 -> 1266 bytes .../main/res/drawable-hdpi/passcode_logo.png | Bin 0 -> 1997 bytes .../main/res/drawable-hdpi/photo_filters.png | Bin 1439 -> 0 bytes .../drawable-hdpi/photo_filters_active.png | Bin 1538 -> 0 bytes .../main/res/drawable-hdpi/photo_rotate.png | Bin 1430 -> 0 bytes .../main/res/drawable-hdpi/photo_sizes.png | Bin 1057 -> 0 bytes .../src/main/res/drawable-hdpi/photo_tune.png | Bin 1173 -> 0 bytes .../res/drawable-hdpi/photo_tune_active.png | Bin 1243 -> 0 bytes .../src/main/res/drawable-hdpi/search_gif.png | Bin 0 -> 1677 bytes .../src/main/res/drawable-hdpi/search_web.png | Bin 0 -> 1729 bytes .../res/drawable-hdpi/selectphoto_small.png | Bin 332 -> 0 bytes .../selectphoto_small_active.png | Bin 332 -> 0 bytes .../drawable-hdpi/selectphoto_small_grey.png | Bin 399 -> 0 bytes .../src/main/res/drawable-hdpi/share.png | Bin 0 -> 1343 bytes .../main/res/drawable-hdpi/sharedmedia.png | Bin 0 -> 967 bytes .../res/drawable-hdpi/tool_brightness.png | Bin 0 -> 1382 bytes .../main/res/drawable-hdpi/tool_contrast.png | Bin 0 -> 1078 bytes .../main/res/drawable-hdpi/tool_details.png | Bin 0 -> 1266 bytes .../main/res/drawable-hdpi/tool_enhance.png | Bin 0 -> 1409 bytes .../src/main/res/drawable-hdpi/tool_grain.png | Bin 0 -> 1039 bytes .../res/drawable-hdpi/tool_highlights.png | Bin 0 -> 1044 bytes .../res/drawable-hdpi/tool_saturation.png | Bin 0 -> 1414 bytes .../main/res/drawable-hdpi/tool_shadows.png | Bin 0 -> 1115 bytes .../main/res/drawable-hdpi/tool_vignette.png | Bin 0 -> 1094 bytes .../main/res/drawable-hdpi/tool_warmth.png | Bin 0 -> 1554 bytes .../src/main/res/drawable-hdpi/tune.png | Bin 0 -> 1010 bytes .../src/main/res/drawable-hdpi/web_search.png | Bin 2296 -> 0 bytes .../main/res/drawable-mdpi/bottom_shadow.png | Bin 0 -> 1035 bytes .../main/res/drawable-mdpi/doc_actions_g.png | Bin 1001 -> 1001 bytes .../main/res/drawable-mdpi/edit_cancel.png | Bin 0 -> 1144 bytes .../main/res/drawable-mdpi/edit_doneblue.png | Bin 0 -> 1259 bytes .../src/main/res/drawable-mdpi/gif_search.png | Bin 1583 -> 0 bytes .../res/drawable-mdpi/ic_ab_delete_white.png | Bin 1313 -> 0 bytes .../res/drawable-mdpi/ic_ab_share_white.png | Bin 1297 -> 0 bytes .../src/main/res/drawable-mdpi/lock_close.png | Bin 0 -> 1149 bytes .../src/main/res/drawable-mdpi/lock_open.png | Bin 0 -> 1152 bytes .../src/main/res/drawable-mdpi/msg_check.png | Bin 302 -> 1077 bytes .../main/res/drawable-mdpi/msg_check_w.png | Bin 248 -> 1061 bytes .../main/res/drawable-mdpi/msg_halfcheck.png | Bin 282 -> 1073 bytes .../res/drawable-mdpi/msg_halfcheck_w.png | Bin 244 -> 1061 bytes .../src/main/res/drawable-mdpi/msg_out.9.png | Bin 851 -> 1693 bytes .../res/drawable-mdpi/msg_out_photo.9.png | Bin 579 -> 1465 bytes .../msg_out_photo_selected.9.png | Bin 582 -> 1474 bytes .../res/drawable-mdpi/msg_out_selected.9.png | Bin 827 -> 1694 bytes .../main/res/drawable-mdpi/passcode_check.png | Bin 0 -> 1079 bytes .../res/drawable-mdpi/passcode_delete.png | Bin 0 -> 1157 bytes .../main/res/drawable-mdpi/passcode_logo.png | Bin 0 -> 1614 bytes .../main/res/drawable-mdpi/photo_filters.png | Bin 1308 -> 0 bytes .../drawable-mdpi/photo_filters_active.png | Bin 1370 -> 0 bytes .../main/res/drawable-mdpi/photo_rotate.png | Bin 1175 -> 0 bytes .../main/res/drawable-mdpi/photo_sizes.png | Bin 1017 -> 0 bytes .../src/main/res/drawable-mdpi/photo_tune.png | Bin 994 -> 0 bytes .../res/drawable-mdpi/photo_tune_active.png | Bin 1000 -> 0 bytes .../src/main/res/drawable-mdpi/search_gif.png | Bin 0 -> 1430 bytes .../src/main/res/drawable-mdpi/search_web.png | Bin 0 -> 1459 bytes .../res/drawable-mdpi/selectphoto_small.png | Bin 262 -> 0 bytes .../selectphoto_small_active.png | Bin 262 -> 0 bytes .../drawable-mdpi/selectphoto_small_grey.png | Bin 316 -> 0 bytes .../src/main/res/drawable-mdpi/share.png | Bin 0 -> 1187 bytes .../main/res/drawable-mdpi/sharedmedia.png | Bin 0 -> 955 bytes .../res/drawable-mdpi/tool_brightness.png | Bin 0 -> 1250 bytes .../main/res/drawable-mdpi/tool_contrast.png | Bin 0 -> 1036 bytes .../main/res/drawable-mdpi/tool_details.png | Bin 0 -> 1128 bytes .../main/res/drawable-mdpi/tool_enhance.png | Bin 0 -> 1216 bytes .../src/main/res/drawable-mdpi/tool_grain.png | Bin 0 -> 991 bytes .../res/drawable-mdpi/tool_highlights.png | Bin 0 -> 1013 bytes .../res/drawable-mdpi/tool_saturation.png | Bin 0 -> 1215 bytes .../main/res/drawable-mdpi/tool_shadows.png | Bin 0 -> 1053 bytes .../main/res/drawable-mdpi/tool_vignette.png | Bin 0 -> 1056 bytes .../main/res/drawable-mdpi/tool_warmth.png | Bin 0 -> 1344 bytes .../src/main/res/drawable-mdpi/tune.png | Bin 0 -> 997 bytes .../src/main/res/drawable-mdpi/web_search.png | Bin 1767 -> 0 bytes .../res/drawable-v21/bar_selector_lock.xml | 9 + .../main/res/drawable-xhdpi/bottom_shadow.png | Bin 0 -> 983 bytes .../main/res/drawable-xhdpi/doc_actions_g.png | Bin 1111 -> 0 bytes .../main/res/drawable-xhdpi/edit_cancel.png | Bin 0 -> 1276 bytes .../main/res/drawable-xhdpi/edit_doneblue.png | Bin 0 -> 1528 bytes .../main/res/drawable-xhdpi/gif_search.png | Bin 2295 -> 0 bytes .../res/drawable-xhdpi/ic_ab_delete_white.png | Bin 1611 -> 0 bytes .../res/drawable-xhdpi/ic_ab_share_white.png | Bin 1743 -> 0 bytes .../main/res/drawable-xhdpi/lock_close.png | Bin 0 -> 1321 bytes .../src/main/res/drawable-xhdpi/lock_open.png | Bin 0 -> 1348 bytes .../src/main/res/drawable-xhdpi/msg_check.png | Bin 470 -> 1333 bytes .../main/res/drawable-xhdpi/msg_check_w.png | Bin 371 -> 1218 bytes .../main/res/drawable-xhdpi/msg_halfcheck.png | Bin 419 -> 1255 bytes .../res/drawable-xhdpi/msg_halfcheck_w.png | Bin 350 -> 1199 bytes .../src/main/res/drawable-xhdpi/msg_out.9.png | Bin 1405 -> 2258 bytes .../res/drawable-xhdpi/msg_out_photo.9.png | Bin 897 -> 1799 bytes .../msg_out_photo_selected.9.png | Bin 928 -> 1782 bytes .../res/drawable-xhdpi/msg_out_selected.9.png | Bin 1409 -> 2243 bytes .../res/drawable-xhdpi/passcode_check.png | Bin 0 -> 1324 bytes .../res/drawable-xhdpi/passcode_delete.png | Bin 0 -> 1397 bytes .../main/res/drawable-xhdpi/passcode_logo.png | Bin 0 -> 2457 bytes .../main/res/drawable-xhdpi/photo_filters.png | Bin 1701 -> 0 bytes .../drawable-xhdpi/photo_filters_active.png | Bin 1830 -> 0 bytes .../main/res/drawable-xhdpi/photo_rotate.png | Bin 1505 -> 0 bytes .../main/res/drawable-xhdpi/photo_sizes.png | Bin 1118 -> 0 bytes .../main/res/drawable-xhdpi/photo_tune.png | Bin 999 -> 0 bytes .../res/drawable-xhdpi/photo_tune_active.png | Bin 1032 -> 0 bytes .../main/res/drawable-xhdpi/search_gif.png | Bin 0 -> 2015 bytes .../main/res/drawable-xhdpi/search_web.png | Bin 0 -> 2022 bytes .../res/drawable-xhdpi/selectphoto_small.png | Bin 696 -> 0 bytes .../selectphoto_small_active.png | Bin 401 -> 0 bytes .../drawable-xhdpi/selectphoto_small_grey.png | Bin 461 -> 0 bytes .../src/main/res/drawable-xhdpi/share.png | Bin 0 -> 1500 bytes .../main/res/drawable-xhdpi/sharedmedia.png | Bin 0 -> 983 bytes .../res/drawable-xhdpi/tool_brightness.png | Bin 0 -> 1607 bytes .../main/res/drawable-xhdpi/tool_contrast.png | Bin 0 -> 1155 bytes .../main/res/drawable-xhdpi/tool_details.png | Bin 0 -> 1358 bytes .../main/res/drawable-xhdpi/tool_enhance.png | Bin 0 -> 1610 bytes .../main/res/drawable-xhdpi/tool_grain.png | Bin 0 -> 1091 bytes .../res/drawable-xhdpi/tool_highlights.png | Bin 0 -> 1107 bytes .../res/drawable-xhdpi/tool_saturation.png | Bin 0 -> 1497 bytes .../main/res/drawable-xhdpi/tool_shadows.png | Bin 0 -> 1197 bytes .../main/res/drawable-xhdpi/tool_vignette.png | Bin 0 -> 1150 bytes .../main/res/drawable-xhdpi/tool_warmth.png | Bin 0 -> 1795 bytes .../src/main/res/drawable-xhdpi/tune.png | Bin 0 -> 1010 bytes .../main/res/drawable-xhdpi/web_search.png | Bin 2832 -> 0 bytes .../res/drawable-xxhdpi/bottom_shadow.png | Bin 0 -> 1014 bytes .../res/drawable-xxhdpi/doc_actions_g.png | Bin 1250 -> 1252 bytes .../main/res/drawable-xxhdpi/edit_cancel.png | Bin 0 -> 1448 bytes .../res/drawable-xxhdpi/edit_doneblue.png | Bin 0 -> 1833 bytes .../main/res/drawable-xxhdpi/gif_search.png | Bin 3108 -> 0 bytes .../drawable-xxhdpi/ic_ab_delete_white.png | Bin 1968 -> 0 bytes .../res/drawable-xxhdpi/ic_ab_share_white.png | Bin 2210 -> 0 bytes .../main/res/drawable-xxhdpi/lock_close.png | Bin 0 -> 1597 bytes .../main/res/drawable-xxhdpi/lock_open.png | Bin 0 -> 1600 bytes .../main/res/drawable-xxhdpi/msg_check.png | Bin 561 -> 1540 bytes .../main/res/drawable-xxhdpi/msg_check_w.png | Bin 474 -> 1439 bytes .../res/drawable-xxhdpi/msg_halfcheck.png | Bin 519 -> 1461 bytes .../res/drawable-xxhdpi/msg_halfcheck_w.png | Bin 460 -> 1392 bytes .../main/res/drawable-xxhdpi/msg_out.9.png | Bin 2338 -> 3076 bytes .../res/drawable-xxhdpi/msg_out_photo.9.png | Bin 1380 -> 2376 bytes .../msg_out_photo_selected.9.png | Bin 1367 -> 2375 bytes .../drawable-xxhdpi/msg_out_selected.9.png | Bin 2181 -> 3062 bytes .../res/drawable-xxhdpi/passcode_check.png | Bin 0 -> 1324 bytes .../res/drawable-xxhdpi/passcode_delete.png | Bin 0 -> 1653 bytes .../res/drawable-xxhdpi/passcode_logo.png | Bin 0 -> 3524 bytes .../drawable-xxhdpi/photo_editor_contrast.png | Bin 2358 -> 0 bytes .../drawable-xxhdpi/photo_editor_exposure.png | Bin 2300 -> 0 bytes .../drawable-xxhdpi/photo_editor_grain.png | Bin 2648 -> 0 bytes .../photo_editor_highlights.png | Bin 2889 -> 0 bytes .../photo_editor_saturation.png | Bin 2738 -> 0 bytes .../drawable-xxhdpi/photo_editor_shadows.png | Bin 2618 -> 0 bytes .../drawable-xxhdpi/photo_editor_sharpen.png | Bin 2162 -> 0 bytes .../drawable-xxhdpi/photo_editor_vignette.png | Bin 2784 -> 0 bytes .../drawable-xxhdpi/photo_editor_warmth.png | Bin 3258 -> 0 bytes .../res/drawable-xxhdpi/photo_filters.png | Bin 1870 -> 0 bytes .../drawable-xxhdpi/photo_filters_active.png | Bin 2011 -> 0 bytes .../main/res/drawable-xxhdpi/photo_rotate.png | Bin 1825 -> 0 bytes .../main/res/drawable-xxhdpi/photo_sizes.png | Bin 1203 -> 0 bytes .../main/res/drawable-xxhdpi/photo_tune.png | Bin 1021 -> 0 bytes .../res/drawable-xxhdpi/photo_tune_active.png | Bin 1076 -> 0 bytes .../main/res/drawable-xxhdpi/search_gif.png | Bin 0 -> 2592 bytes .../main/res/drawable-xxhdpi/search_web.png | Bin 0 -> 2586 bytes .../res/drawable-xxhdpi/selectphoto_small.png | Bin 1033 -> 0 bytes .../selectphoto_small_active.png | Bin 570 -> 0 bytes .../selectphoto_small_grey.png | Bin 586 -> 0 bytes .../src/main/res/drawable-xxhdpi/share.png | Bin 0 -> 1840 bytes .../main/res/drawable-xxhdpi/sharedmedia.png | Bin 0 -> 1004 bytes .../res/drawable-xxhdpi/tool_brightness.png | Bin 0 -> 1973 bytes .../res/drawable-xxhdpi/tool_contrast.png | Bin 0 -> 1302 bytes .../main/res/drawable-xxhdpi/tool_details.png | Bin 0 -> 1501 bytes .../main/res/drawable-xxhdpi/tool_enhance.png | Bin 0 -> 1822 bytes .../main/res/drawable-xxhdpi/tool_grain.png | Bin 0 -> 1207 bytes .../res/drawable-xxhdpi/tool_highlights.png | Bin 0 -> 1227 bytes .../res/drawable-xxhdpi/tool_saturation.png | Bin 0 -> 1836 bytes .../main/res/drawable-xxhdpi/tool_shadows.png | Bin 0 -> 1358 bytes .../res/drawable-xxhdpi/tool_vignette.png | Bin 0 -> 1262 bytes .../main/res/drawable-xxhdpi/tool_warmth.png | Bin 0 -> 2296 bytes .../src/main/res/drawable-xxhdpi/tune.png | Bin 0 -> 1067 bytes .../main/res/drawable-xxhdpi/web_search.png | Bin 3878 -> 0 bytes .../main/res/drawable/bar_selector_lock.xml | 27 + .../layout-ar/encrypted_chat_placeholder.xml | 127 -- .../src/main/res/layout/chat_layout.xml | 299 --- .../res/layout/encrypted_chat_placeholder.xml | 122 -- .../main/res/layout/media_photo_layout.xml | 11 - .../main/res/layout/media_video_layout.xml | 39 - .../res/layout/popup_notification_layout.xml | 167 -- .../src/main/res/values-ar/strings.xml | 60 +- .../src/main/res/values-de/strings.xml | 62 +- .../src/main/res/values-es/strings.xml | 64 +- .../src/main/res/values-it/strings.xml | 68 +- .../src/main/res/values-ko/strings.xml | 58 +- .../src/main/res/values-nl/strings.xml | 60 +- .../src/main/res/values-pt-rBR/strings.xml | 78 +- .../src/main/res/values-pt-rPT/strings.xml | 76 +- .../src/main/res/values-v21/styles.xml | 2 +- TMessagesProj/src/main/res/values/colors.xml | 1 - TMessagesProj/src/main/res/values/strings.xml | 60 +- TMessagesProj/src/main/res/values/styles.xml | 2 +- 310 files changed, 10186 insertions(+), 4632 deletions(-) rename TMessagesProj/libs/armeabi-v7a/{libtmessages.5.so => libtmessages.6.so} (84%) rename TMessagesProj/libs/armeabi/{libtmessages.5.so => libtmessages.6.so} (76%) rename TMessagesProj/libs/x86/{libtmessages.5.so => libtmessages.6.so} (72%) create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedMediaSectionCell.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedPhotoVideoCell.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Components/ForegroundDetector.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Components/LetterSectionsListView.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Components/PasscodeView.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoCropView.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoEditorSeekBar.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoFilterView.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/PasscodeActivity.java delete mode 100644 TMessagesProj/src/main/java/org/telegram/ui/PhotoEditorActivity.java create mode 100755 TMessagesProj/src/main/res/drawable-hdpi/bottom_shadow.png create mode 100755 TMessagesProj/src/main/res/drawable-hdpi/edit_cancel.png create mode 100755 TMessagesProj/src/main/res/drawable-hdpi/edit_doneblue.png delete mode 100644 TMessagesProj/src/main/res/drawable-hdpi/gif_search.png delete mode 100644 TMessagesProj/src/main/res/drawable-hdpi/ic_ab_delete_white.png delete mode 100644 TMessagesProj/src/main/res/drawable-hdpi/ic_ab_share_white.png create mode 100644 TMessagesProj/src/main/res/drawable-hdpi/lock_close.png create mode 100644 TMessagesProj/src/main/res/drawable-hdpi/lock_open.png create mode 100644 TMessagesProj/src/main/res/drawable-hdpi/passcode_check.png create mode 100644 TMessagesProj/src/main/res/drawable-hdpi/passcode_delete.png create mode 100644 TMessagesProj/src/main/res/drawable-hdpi/passcode_logo.png delete mode 100644 TMessagesProj/src/main/res/drawable-hdpi/photo_filters.png delete mode 100644 TMessagesProj/src/main/res/drawable-hdpi/photo_filters_active.png delete mode 100644 TMessagesProj/src/main/res/drawable-hdpi/photo_rotate.png delete mode 100644 TMessagesProj/src/main/res/drawable-hdpi/photo_sizes.png delete mode 100644 TMessagesProj/src/main/res/drawable-hdpi/photo_tune.png delete mode 100644 TMessagesProj/src/main/res/drawable-hdpi/photo_tune_active.png create mode 100755 TMessagesProj/src/main/res/drawable-hdpi/search_gif.png create mode 100755 TMessagesProj/src/main/res/drawable-hdpi/search_web.png delete mode 100755 TMessagesProj/src/main/res/drawable-hdpi/selectphoto_small.png delete mode 100755 TMessagesProj/src/main/res/drawable-hdpi/selectphoto_small_active.png delete mode 100755 TMessagesProj/src/main/res/drawable-hdpi/selectphoto_small_grey.png create mode 100755 TMessagesProj/src/main/res/drawable-hdpi/share.png create mode 100755 TMessagesProj/src/main/res/drawable-hdpi/sharedmedia.png create mode 100755 TMessagesProj/src/main/res/drawable-hdpi/tool_brightness.png create mode 100755 TMessagesProj/src/main/res/drawable-hdpi/tool_contrast.png create mode 100755 TMessagesProj/src/main/res/drawable-hdpi/tool_details.png create mode 100755 TMessagesProj/src/main/res/drawable-hdpi/tool_enhance.png create mode 100755 TMessagesProj/src/main/res/drawable-hdpi/tool_grain.png create mode 100755 TMessagesProj/src/main/res/drawable-hdpi/tool_highlights.png create mode 100755 TMessagesProj/src/main/res/drawable-hdpi/tool_saturation.png create mode 100755 TMessagesProj/src/main/res/drawable-hdpi/tool_shadows.png create mode 100755 TMessagesProj/src/main/res/drawable-hdpi/tool_vignette.png create mode 100755 TMessagesProj/src/main/res/drawable-hdpi/tool_warmth.png create mode 100755 TMessagesProj/src/main/res/drawable-hdpi/tune.png delete mode 100644 TMessagesProj/src/main/res/drawable-hdpi/web_search.png create mode 100755 TMessagesProj/src/main/res/drawable-mdpi/bottom_shadow.png create mode 100755 TMessagesProj/src/main/res/drawable-mdpi/edit_cancel.png create mode 100755 TMessagesProj/src/main/res/drawable-mdpi/edit_doneblue.png delete mode 100644 TMessagesProj/src/main/res/drawable-mdpi/gif_search.png delete mode 100644 TMessagesProj/src/main/res/drawable-mdpi/ic_ab_delete_white.png delete mode 100644 TMessagesProj/src/main/res/drawable-mdpi/ic_ab_share_white.png create mode 100644 TMessagesProj/src/main/res/drawable-mdpi/lock_close.png create mode 100644 TMessagesProj/src/main/res/drawable-mdpi/lock_open.png create mode 100644 TMessagesProj/src/main/res/drawable-mdpi/passcode_check.png create mode 100644 TMessagesProj/src/main/res/drawable-mdpi/passcode_delete.png create mode 100644 TMessagesProj/src/main/res/drawable-mdpi/passcode_logo.png delete mode 100644 TMessagesProj/src/main/res/drawable-mdpi/photo_filters.png delete mode 100644 TMessagesProj/src/main/res/drawable-mdpi/photo_filters_active.png delete mode 100644 TMessagesProj/src/main/res/drawable-mdpi/photo_rotate.png delete mode 100644 TMessagesProj/src/main/res/drawable-mdpi/photo_sizes.png delete mode 100644 TMessagesProj/src/main/res/drawable-mdpi/photo_tune.png delete mode 100644 TMessagesProj/src/main/res/drawable-mdpi/photo_tune_active.png create mode 100755 TMessagesProj/src/main/res/drawable-mdpi/search_gif.png create mode 100755 TMessagesProj/src/main/res/drawable-mdpi/search_web.png delete mode 100755 TMessagesProj/src/main/res/drawable-mdpi/selectphoto_small.png delete mode 100755 TMessagesProj/src/main/res/drawable-mdpi/selectphoto_small_active.png delete mode 100755 TMessagesProj/src/main/res/drawable-mdpi/selectphoto_small_grey.png create mode 100755 TMessagesProj/src/main/res/drawable-mdpi/share.png create mode 100755 TMessagesProj/src/main/res/drawable-mdpi/sharedmedia.png create mode 100755 TMessagesProj/src/main/res/drawable-mdpi/tool_brightness.png create mode 100755 TMessagesProj/src/main/res/drawable-mdpi/tool_contrast.png create mode 100755 TMessagesProj/src/main/res/drawable-mdpi/tool_details.png create mode 100755 TMessagesProj/src/main/res/drawable-mdpi/tool_enhance.png create mode 100755 TMessagesProj/src/main/res/drawable-mdpi/tool_grain.png create mode 100755 TMessagesProj/src/main/res/drawable-mdpi/tool_highlights.png create mode 100755 TMessagesProj/src/main/res/drawable-mdpi/tool_saturation.png create mode 100755 TMessagesProj/src/main/res/drawable-mdpi/tool_shadows.png create mode 100755 TMessagesProj/src/main/res/drawable-mdpi/tool_vignette.png create mode 100755 TMessagesProj/src/main/res/drawable-mdpi/tool_warmth.png create mode 100755 TMessagesProj/src/main/res/drawable-mdpi/tune.png delete mode 100644 TMessagesProj/src/main/res/drawable-mdpi/web_search.png create mode 100644 TMessagesProj/src/main/res/drawable-v21/bar_selector_lock.xml create mode 100755 TMessagesProj/src/main/res/drawable-xhdpi/bottom_shadow.png delete mode 100755 TMessagesProj/src/main/res/drawable-xhdpi/doc_actions_g.png create mode 100755 TMessagesProj/src/main/res/drawable-xhdpi/edit_cancel.png create mode 100755 TMessagesProj/src/main/res/drawable-xhdpi/edit_doneblue.png delete mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/gif_search.png delete mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/ic_ab_delete_white.png delete mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/ic_ab_share_white.png create mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/lock_close.png create mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/lock_open.png create mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/passcode_check.png create mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/passcode_delete.png create mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/passcode_logo.png delete mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/photo_filters.png delete mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/photo_filters_active.png delete mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/photo_rotate.png delete mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/photo_sizes.png delete mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/photo_tune.png delete mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/photo_tune_active.png create mode 100755 TMessagesProj/src/main/res/drawable-xhdpi/search_gif.png create mode 100755 TMessagesProj/src/main/res/drawable-xhdpi/search_web.png delete mode 100755 TMessagesProj/src/main/res/drawable-xhdpi/selectphoto_small.png delete mode 100755 TMessagesProj/src/main/res/drawable-xhdpi/selectphoto_small_active.png delete mode 100755 TMessagesProj/src/main/res/drawable-xhdpi/selectphoto_small_grey.png create mode 100755 TMessagesProj/src/main/res/drawable-xhdpi/share.png create mode 100755 TMessagesProj/src/main/res/drawable-xhdpi/sharedmedia.png create mode 100755 TMessagesProj/src/main/res/drawable-xhdpi/tool_brightness.png create mode 100755 TMessagesProj/src/main/res/drawable-xhdpi/tool_contrast.png create mode 100755 TMessagesProj/src/main/res/drawable-xhdpi/tool_details.png create mode 100755 TMessagesProj/src/main/res/drawable-xhdpi/tool_enhance.png create mode 100755 TMessagesProj/src/main/res/drawable-xhdpi/tool_grain.png create mode 100755 TMessagesProj/src/main/res/drawable-xhdpi/tool_highlights.png create mode 100755 TMessagesProj/src/main/res/drawable-xhdpi/tool_saturation.png create mode 100755 TMessagesProj/src/main/res/drawable-xhdpi/tool_shadows.png create mode 100755 TMessagesProj/src/main/res/drawable-xhdpi/tool_vignette.png create mode 100755 TMessagesProj/src/main/res/drawable-xhdpi/tool_warmth.png create mode 100755 TMessagesProj/src/main/res/drawable-xhdpi/tune.png delete mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/web_search.png create mode 100755 TMessagesProj/src/main/res/drawable-xxhdpi/bottom_shadow.png create mode 100755 TMessagesProj/src/main/res/drawable-xxhdpi/edit_cancel.png create mode 100755 TMessagesProj/src/main/res/drawable-xxhdpi/edit_doneblue.png delete mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/gif_search.png delete mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/ic_ab_delete_white.png delete mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/ic_ab_share_white.png create mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/lock_close.png create mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/lock_open.png create mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/passcode_check.png create mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/passcode_delete.png create mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/passcode_logo.png delete mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/photo_editor_contrast.png delete mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/photo_editor_exposure.png delete mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/photo_editor_grain.png delete mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/photo_editor_highlights.png delete mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/photo_editor_saturation.png delete mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/photo_editor_shadows.png delete mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/photo_editor_sharpen.png delete mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/photo_editor_vignette.png delete mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/photo_editor_warmth.png delete mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/photo_filters.png delete mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/photo_filters_active.png delete mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/photo_rotate.png delete mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/photo_sizes.png delete mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/photo_tune.png delete mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/photo_tune_active.png create mode 100755 TMessagesProj/src/main/res/drawable-xxhdpi/search_gif.png create mode 100755 TMessagesProj/src/main/res/drawable-xxhdpi/search_web.png delete mode 100755 TMessagesProj/src/main/res/drawable-xxhdpi/selectphoto_small.png delete mode 100755 TMessagesProj/src/main/res/drawable-xxhdpi/selectphoto_small_active.png delete mode 100755 TMessagesProj/src/main/res/drawable-xxhdpi/selectphoto_small_grey.png create mode 100755 TMessagesProj/src/main/res/drawable-xxhdpi/share.png create mode 100755 TMessagesProj/src/main/res/drawable-xxhdpi/sharedmedia.png create mode 100755 TMessagesProj/src/main/res/drawable-xxhdpi/tool_brightness.png create mode 100755 TMessagesProj/src/main/res/drawable-xxhdpi/tool_contrast.png create mode 100755 TMessagesProj/src/main/res/drawable-xxhdpi/tool_details.png create mode 100755 TMessagesProj/src/main/res/drawable-xxhdpi/tool_enhance.png create mode 100755 TMessagesProj/src/main/res/drawable-xxhdpi/tool_grain.png create mode 100755 TMessagesProj/src/main/res/drawable-xxhdpi/tool_highlights.png create mode 100755 TMessagesProj/src/main/res/drawable-xxhdpi/tool_saturation.png create mode 100755 TMessagesProj/src/main/res/drawable-xxhdpi/tool_shadows.png create mode 100755 TMessagesProj/src/main/res/drawable-xxhdpi/tool_vignette.png create mode 100755 TMessagesProj/src/main/res/drawable-xxhdpi/tool_warmth.png create mode 100755 TMessagesProj/src/main/res/drawable-xxhdpi/tune.png delete mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/web_search.png create mode 100644 TMessagesProj/src/main/res/drawable/bar_selector_lock.xml delete mode 100644 TMessagesProj/src/main/res/layout-ar/encrypted_chat_placeholder.xml delete mode 100644 TMessagesProj/src/main/res/layout/chat_layout.xml delete mode 100644 TMessagesProj/src/main/res/layout/encrypted_chat_placeholder.xml delete mode 100644 TMessagesProj/src/main/res/layout/media_photo_layout.xml delete mode 100644 TMessagesProj/src/main/res/layout/media_video_layout.xml delete mode 100644 TMessagesProj/src/main/res/layout/popup_notification_layout.xml diff --git a/TMessagesProj/build.gradle b/TMessagesProj/build.gradle index 5fbedf976..7ecb86372 100644 --- a/TMessagesProj/build.gradle +++ b/TMessagesProj/build.gradle @@ -3,7 +3,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:1.0.0' + classpath 'com.android.tools.build:gradle:1.1.0' } } apply plugin: 'com.android.application' @@ -82,7 +82,7 @@ android { defaultConfig { minSdkVersion 8 targetSdkVersion 21 - versionCode 423 - versionName "2.4.0" + versionCode 453 + versionName "2.5.0" } } diff --git a/TMessagesProj/jni/Android.mk b/TMessagesProj/jni/Android.mk index 88b4e6394..ae2c63233 100755 --- a/TMessagesProj/jni/Android.mk +++ b/TMessagesProj/jni/Android.mk @@ -104,7 +104,7 @@ include $(BUILD_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_PRELINK_MODULE := false LOCAL_STATIC_LIBRARIES := webp sqlite -LOCAL_MODULE := tmessages.5 +LOCAL_MODULE := tmessages.6 LOCAL_CFLAGS := -w -std=gnu99 -O2 -DNULL=0 -DSOCKLEN_T=socklen_t -DLOCALE_NOT_USED -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 LOCAL_CFLAGS += -Drestrict='' -D__EMX__ -DOPUS_BUILD -DFIXED_POINT -DUSE_ALLOCA -DHAVE_LRINT -DHAVE_LRINTF -fno-math-errno LOCAL_CFLAGS += -DANDROID_NDK -DDISABLE_IMPORTGL -fno-strict-aliasing -fprefetch-loop-arrays -DAVOID_TABLES -DANDROID_TILE_BASED_DECODE -DANDROID_ARMV6_IDCT -ffast-math diff --git a/TMessagesProj/jni/image.c b/TMessagesProj/jni/image.c index 1532095b2..06c5e9f3b 100644 --- a/TMessagesProj/jni/image.c +++ b/TMessagesProj/jni/image.c @@ -21,6 +21,9 @@ jmethodID jclass_Bitmap_createBitmap; jclass jclass_Config; jfieldID jclass_Config_ARGB_8888; +const uint32_t PGPhotoEnhanceHistogramBins = 256; +const uint32_t PGPhotoEnhanceSegments = 4; + jclass createGlobarRef(JNIEnv *env, jclass class) { if (class) { return (*env)->NewGlobalRef(env, class); @@ -312,6 +315,110 @@ JNIEXPORT void Java_org_telegram_messenger_Utilities_blurBitmap(JNIEnv *env, jcl AndroidBitmap_unlockPixels(env, bitmap); } +JNIEXPORT void Java_org_telegram_messenger_Utilities_calcCDT(JNIEnv *env, jclass class, jobject hsvBuffer, int width, int height, jobject buffer) { + float imageWidth = width; + float imageHeight = height; + float _clipLimit = 1.25f; + + uint32_t totalSegments = PGPhotoEnhanceSegments * PGPhotoEnhanceSegments; + uint32_t tileArea = (uint32_t)(floorf(imageWidth / PGPhotoEnhanceSegments) * floorf(imageHeight / PGPhotoEnhanceSegments)); + uint32_t clipLimit = (uint32_t)max(1, _clipLimit * tileArea / (float) PGPhotoEnhanceHistogramBins); + float scale = 255.0f / (float) tileArea; + + + unsigned char *bytes = (*env)->GetDirectBufferAddress(env, hsvBuffer); + + uint32_t **hist = calloc(totalSegments, sizeof(uint32_t *)); + uint32_t **cdfs = calloc(totalSegments, sizeof(uint32_t *)); + uint32_t *cdfsMin = calloc(totalSegments, sizeof(uint32_t)); + uint32_t *cdfsMax = calloc(totalSegments, sizeof(uint32_t)); + + for (uint32_t a = 0; a < totalSegments; a++) { + hist[a] = calloc(PGPhotoEnhanceHistogramBins, sizeof(uint32_t)); + cdfs[a] = calloc(PGPhotoEnhanceHistogramBins, sizeof(uint32_t)); + } + + float xMul = PGPhotoEnhanceSegments / imageWidth; + float yMul = PGPhotoEnhanceSegments / imageHeight; + + for (uint32_t y = 0; y < imageHeight; y++) { + uint32_t yOffset = y * width * 4; + for (uint32_t x = 0; x < imageWidth; x++) { + uint32_t index = x * 4 + yOffset; + + uint32_t tx = (uint32_t)(x * xMul); + uint32_t ty = (uint32_t)(y * yMul); + uint32_t t = ty * PGPhotoEnhanceSegments + tx; + + hist[t][bytes[index + 2]]++; + } + } + + for (uint32_t i = 0; i < totalSegments; i++) { + if (clipLimit > 0) { + uint32_t clipped = 0; + for (uint32_t j = 0; j < PGPhotoEnhanceHistogramBins; ++j) { + if (hist[i][j] > clipLimit) { + clipped += hist[i][j] - clipLimit; + hist[i][j] = clipLimit; + } + } + + uint32_t redistBatch = clipped / PGPhotoEnhanceHistogramBins; + uint32_t residual = clipped - redistBatch * PGPhotoEnhanceHistogramBins; + + for (uint32_t j = 0; j < PGPhotoEnhanceHistogramBins; ++j) { + hist[i][j] += redistBatch; + } + + for (uint32_t j = 0; j < residual; ++j) { + hist[i][j]++; + } + } + memcpy(cdfs[i], hist[i], PGPhotoEnhanceHistogramBins * sizeof(uint32_t)); + + uint32_t hMin = PGPhotoEnhanceHistogramBins - 1; + for (uint32_t j = 0; j < hMin; ++j) { + if (cdfs[j] != 0) { + hMin = j; + } + } + + uint32_t cdf = 0; + for (uint32_t j = hMin; j < PGPhotoEnhanceHistogramBins; ++j) { + cdf += cdfs[i][j]; + cdfs[i][j] = (uint8_t) min(255, cdf * scale); + } + + cdfsMin[i] = cdfs[i][hMin]; + cdfsMax[i] = cdfs[i][PGPhotoEnhanceHistogramBins - 1]; + } + + uint32_t resultSize = 4 * PGPhotoEnhanceHistogramBins * totalSegments; + uint32_t resultBytesPerRow = 4 * PGPhotoEnhanceHistogramBins; + + unsigned char *result = (*env)->GetDirectBufferAddress(env, buffer); + for (uint32_t tile = 0; tile < totalSegments; tile++) { + uint32_t yOffset = tile * resultBytesPerRow; + for (uint32_t i = 0; i < PGPhotoEnhanceHistogramBins; i++) { + uint32_t index = i * 4 + yOffset; + result[index] = (uint8_t)cdfs[tile][i]; + result[index + 1] = (uint8_t)cdfsMin[tile]; + result[index + 2] = (uint8_t)cdfsMax[tile]; + result[index + 3] = 255; + } + } + + for (uint32_t a = 0; a < totalSegments; a++) { + free(hist[a]); + free(cdfs[a]); + } + free(hist); + free(cdfs); + free(cdfsMax); + free(cdfsMin); +} + JNIEXPORT void Java_org_telegram_messenger_Utilities_loadBitmap(JNIEnv *env, jclass class, jstring path, jobject bitmap, int scale, int width, int height, int stride) { AndroidBitmapInfo info; diff --git a/TMessagesProj/libs/armeabi-v7a/libtmessages.5.so b/TMessagesProj/libs/armeabi-v7a/libtmessages.6.so similarity index 84% rename from TMessagesProj/libs/armeabi-v7a/libtmessages.5.so rename to TMessagesProj/libs/armeabi-v7a/libtmessages.6.so index 132154abf38191fc4c62b72fa970432035348ec9..41f66ec834d2e771514e4336c78deead9682478c 100755 GIT binary patch delta 105455 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
    T|k;EAc5r7h|sx-!I{7sPPW;O?JKMA2;Z&3?JSY ztUl3;;(vi#f!lG?|GwvQ9Ns4U2K)YGa2%QIjsK4ocp&%R*zO?wKjJ%yD<^yuVFRCI zq=2XJQN-!r95oU=2%nRPOTj)yc?sCRBF$x?r}Cm*95&$aJdxiLk&R;(ktbpM9&Khn z09!9QA6ql~-DJ{>?Cgf=%DNcz_i95^hGfvtLWxS=f`%HL%_;M+@0UgjW)$Ka-w|>g@s2-$eK+;)p|AR@Lhmn8j6L{71xkT!1Hum4y&m{aE@eSDH@p(ZqdKsJE7K={7 zUPCxq(np~cq@RNA6v7M8t?)EmLH5~U%-3xsI+n;1bPJjj%u~I9qu!p7%ysx_!n@Hs z@Eg?zwgWhTTk!pWa3bN2#Koc8*c&D7q1d)k;9t;P_+3o+PtqLX$Dp?i(W|ADiWtZ0ln!baQ-8O=r;-JZ5@fvk%XE*$9F!q+p(pg zJIQP_zD3x3*pID!^T!#h^CZOvEHl|J#^Yvey1irA@73O<{vWCJ|4-BZAxv+7Cp??B zI*;&|_$;cO_tWfsdC{%fzy3#dDOD7r;feXZ|$zvJ^s}lBeG8A^ahEyhxsJ zpl&JSJ;K`wkCVDG=&DjBM~xp4w?_D0(z+#FO!#WjzKq6WJEnH$PcxRc;k^KwkA6vx z`k${o&VD|87rWk;68|YSz1>*5@7RJV6U6*QEFagNGBzXhW9ZJ>OU4$=%O)<36j^wG zL%5DybKrK$zOVL)u?7A+p<{@>h}hrRm$Sb~`Y=4h&>!*q8vPXe4XED!L#tdzI)k{? zsNQ}fZUg!^bR}t*;PW=|$?V7Da}~C|gr8;qki06{*=mpddFK8X6Q3Vsbv@x%3G<$H zbsOPFNLPg8G{O(mZu)t~k(q>kAs4+ZBsK-lBhk;%DN@6!_=I9>7tTPRrbbWKe)RK< zd28@Y#^Ve0U+ksqKe9i>erK)gml^&a2-UG4O1eb$LCP~w{T{pX$>$&ND>?D z!t1b&p%1eEm%5ca}-_e7yFC;&`%^+LT@UWDyD_)o%fNuamK(GK_>_CF-E$M9)@_n@KdGYLP={x;#y(Bnu`NBC{h{~dmx z{TKFSRH`6sRUlvWE18v0U@;NZMBGY({YW^9Z7VjtwW3$CHxXZj-iofqeguAu|5EXOa+t>+PuvISI^wpFax+?pmZ44fos8OuH7 z(tFwK+5b%$`tzFJaz*>}g~0w4u!6{1j5p%gfIf!mZ5A0mL%2i=I*#yjl32$t!Op)s zRPzX*PIxMDdHDQ*{+Ino!k1EE^VZJ=@L4ebAVvK|_+)qO591qN9vyF*Hbv*Bw_`|` zyY?KrhH~OT`j_p^~b% z#JCnjen9X*3i;CbAjWl&f4ZX_{=uqxiRg#eKV;Y2Dd-Y>_6k4g@E;XhGPd=U93^o# za~y{geg^Gh*T40dgD)5Afi0J~S@2IGDoi~=pxf9q)pdYtsqx%Y*J9T##z#}>ollH! zr@B_nyhAd5pNw8(*W1y?YM*QIfe}PqL*5s&KTo(;T)(3(z1VIe>%-ai$No>_exGZB zE5!I4vU(1d7WN5Z`M*+XIlI2cuD73cnEgQFR}lZSjz>SH@O9X>pkuJ!PB0cubDcPI z9s~Y#qV#qX`+taj-`F(GHDliOV!nV}^yWtSA3f?ka(T~q5to^t<9#x2=VRI~mAKsa zY?|vJ*I7p7bZY&&vHx_};(1$ex z9jX1<1_?jPeva|tbk_|3vvM4RqW>mJZ~K$%S8Oqq_7AiYeU$wG;=9<-BtA-NQcW=z z;gg8%R*IgX5J6q|SN<*UhUz2Gbd3Uxy5EvDM{%43fVqA1WRR8ZXZTE;q zi0XeusO>({SkVO0MA0PCWYHAS)NX$;gETQ@ie`ysi{^;tisp&ti|T*arz=t@S|nO5 zS|VC1S|(cVmq3MRrD&CCwP=lKooKyigJ`2@lW4POi)gE8n`pbJze56@q64C%qGO`t zq8?s!s*f~6)GO)}jTMa-O%P2K%@NHFs$W%zp;EL}v`utSbVzhqbVPJibWBvgiB(r{ zLR7sUWRGZss5hWoKKR5CD;g&nFPb2lD4HaiESe&kDw-ymE}9{lDVimktyN#X~AQ?yI8TeRnWng6|F=o9T19S|K99TFWD9T6QB9TOcFoe)+0BupQuM>Imz`%jtw zJ~70K#)-y@CWt1ACW$7CriiABrirGDW{75rW{GC|C6FVUE1D;oFIpg4C|V?1ELtL3 zDq1F5E?Oa4DOx4!ua-cKXq{-iXoF~@Xp?BOXp3m8Xq#xeXoqO0XqRYrP0MC(NxL>on$M4LrhL|aAMMB7C>L_0;hM7u?Mdd&GRhCb0D(P7aM(J|3+ z(FsxYL9j(UqFzy-Xsl?QXuN2`2QvQ?#gHVLESe&kDw-ymE}9{lDVimkEt(^mCz>x> zAX?~`K#^#%Xo+a4XqjlaXoYB{XtijKXq{-iXoF~zXtSulMFOp&ZKCa>9ipA0U83Eh zJ)*s${h|Y+gQ7#C!=fWW<)4{}VN7&fbV5{pD19sH6O9#(6O9*55KR9W zXus%y=%DD3=&)5u#pEpJ=RTqG*z6vS^BEs%V;Mx@d-IrfAl` zWd3K1AxAVnVmiH?g-h^mid42VXEdPRMrv7&KW_56<) zLxO0cXp(5MXo_g6XqsrcXohH}XqITUXpU&EXdW7v|M_Al5G@of5-k=j5iJ!h6D=35 z5Umug60H`k5v>!g|48P4gBTh`n?##MTSQw$+eF(%J48E0yF|N1dqjIh`$YRclKDR% zhC$IG(P7aM(NWPc(Q(lUQT4Hm0nrFiuc%KnRy58pfq2mb(L~WC(PYsS(Nxhi(R9%a z(M-`S(QMHi(Ogk~o&@qm3q%V=OGL{>t3>NW8%0}0+eN!XdqoFChegMN%J}~z*koSO zIMGDW6w!3iEYV!i0?}g8GSN!W8qo&PX3@5QQhuixdPMt0heSt3CqyIqf)$PxO%P2M zO%u%&%@NHPEfOu&s^@=&7^+3z6>D zXufEHXrXA4Xt8LCXsKwKXt`*GXr*YCXtij)sJ}r1jiODW&7v)$t)g9`-J(6By`p`h z{h|Y+gQ7#C!$IY(?qV1f9TOcFoe)*qf?ebhjS%&U`b1+z<3!^{6GRh5lLE^8OBO?_ zXqsrcXohH}XqITUXpU&EXr5@kXn|;~AQ?yI8TeL^CSF}&GKcL2v8LkbHvHihri!<(- z;W|1pO)!1ydox_&uGO8wU83EhJ)*s$eWLxM1EPbX!^TIke6=+$IAMGp%aejnwxgK>JY5Ta+Ttizg z*~hiRHLY(TSfzf^0ppmte9bdroH>_zdyGwUU4|>im=^E4*i~s<8IQ5SxL;GR@hcMP z*&fUw!Z>rD>*#4og2|#O#y#^~`$c65W^Xs{O>pr-xShdN)uK(Jt)ktceWD|xsiGO8d7_1)<)T$V^{W;!bc^DTW-;BGFROYSDVpR?!a8KG8wZaZ%53u)uiHB+(4f?BS_Fhe9!w z7^ft=78s4mt~g^@|4BNKKPCE4JAeFzUkCk*M2khsMJq*XL>on$McYKXM0-U0MMp&^ zL}R~^77MChrHLU^G+(qxv_iC6v`Ms8v|F@KbVPJq)VEh!Of*$ABcOa)pC^VwV_J&q zw#ZJwF5_=0F2g8U?y4~o4tCWq>>mkcG$=YOIxeb=V-BIEiw<%5{Au3?eKSRKMDs<9 zL`y|0M5{&XMVmxhMLR^hMf*etMMr`iPovt!|a2nJ1NUweq-bfmWVnF4oG!G-X<6hp9@f ze34(HbswJ1Y|{areec)GlS`vodGsxUg55l55UX{5m`c{lLvU$Y6ZkLZT6r8YlSO|f zPjTmHEv8^}7GKd9YUS(sBCXT-{y;0|{}Qcpc(zOHT-K;E9pKraa;@onK+($MCzV?H z?Rk|}eh^iyl^?~_XyvCNby_cTsd}xCyHtbLCYNf|`jSgEY2^{=X05wiszvK=mul5I zBC6+-eN<&pJFrjcdco5H+FodmdrffsTeKkJjHp zRD@QZB=l-M-=ln5FYxfs>d`AbDo*QF9u=>()T0u#Zt|!^tv7j8l2#tmN!EIcN2O>@ z3+3Nuu}03~$(b~5SQ)C)wH^_wGPI_Ls!XjsNtLDbs8E%y_2^KQqm?Iya4l}9s2wK8k`V>)n7m>So5Ntl|@%8w&Fg9q;M3_h|aX7KL8h|xFp z#6L7kx!$>Z*Cp>)?~4DuV~-h*b%ec+u*VUen6UlF9O03P4#vM^I^>8LaD@9D;T}i0 z%MtEygxeh97Du?r5pJ-;{_0(I7F6%5c7!V(;c`c~)DbRrgbN+vd`CFf5zcmmGj-T6 zN1yJ9NOgph9pOYrINlMCb%ec+u*VUe_@AQ-9AW>61BM*o0Y|vc5$yBy&TN4U)q zZgGU09N~sw*dG{Bb&iN?N4U}vE_Z}W9pPd}xX=;KcZ72t;cQ1Z^M8K3S<)R5sg7{6 zBb?|6$2-EYjPae zaI7Qjb%Z^R@Wii94;sXO)_<1edRYu%4-F}AF7 zo$fyI9^<=Jt`+Wcn~Wt{@a<0+8?#(*xF5O5IBK zW6VFnb(j0AZ;j_qaLsq`_}2IkoxW?PXRo(+^RASN*N4+sXjyRdGLN@?7!ItO>Fl+Ak{^fm5w`8I#eIc8@W>0>2*=Do%nCsL>Jjm9r0 zx}KkZ1aUl+_)Qpoo`lAo$~U+>9^cW7*M}FpY`m4taeWqRe3wmqUfO8Hoa8z(UqANUmc!v2KmC(35 z#Mj7w*=gMAPHEivSh%rvjcd`IcVj(!T{*Yx@?})+8u;_iZ*-MM?|ywa>mK8-HLkzR zDIi|uH15nyd2mmhx^Isw<=9;b9BOE+@y!~ld0?zD>tqgXL9DUnWY@Ymq4tdY$&u8ODYj*E)Ax zo$+~&>(;3c;H&GO=zC~S)Sn^76{on4bl*0^c>WaEWA1Zj7;D$M*33Eqr`XPi_Gl-a zNo?olJ-^&&yt0N>tug;p*DUu7&BlsT zDg2cg#>1z&j&lERy0QIK*9q?7>BiDr*T$7!&>xXhI*iJmM5R^1<~_Q9-kR>&djcFr zT%>LY?5dM~CeBM;UY&02%B5kS#!q+3iTDN@tR|TL@#)4onKpbJl5}ip_h%iSwk)+H*O1g(fuaESPSbaJuVN_wwmR z*co(E>r=+TXD}e9;Xgg)3-g%gsDuXsY4!NKxYc;<4Ccw%w;31Y(N+&lGw#T9&2hgS zXFQq5aUcA<@nat2f9iDO^fSrRGu^o9OxKd>)1M02tLvwaPnR9@l=14B`0squ2s_KQ za{2|+sAEYmUKKR%{_sg-?OCp6vnp@#?ERSm7neXEq|kmTZ|!;gNn^`duJ7E@cNw>y z?OHk~jI{CeBTs(oLFCeHq1$2Fy~g`zyVkg4rWtecnZtuVq+;=4;!bS>smJb zz0X7ThH+e`{~xW!mUB7Y*RX4w*(al|#)s#+=J@-@|J<9{`p_P2kEFb`oXvaETQ~0s z!C#lJ$D@b3gp*cf(AVq{?CN61V#23;su_>B>iTM1PUFsa_0XQhK0W78)4#Ba(s`_! z?b)l3Uzf3_Ib?5AVEpFq=Hsz(@p-N*S3KDtve%^=cc-yvh2VI0gJ-WVr7kcqV{>la zllW|~GG@HioGK%xfR2CdJmbRxX7In(bAVKUr>MWtg+(N6*^@-&e*c%T=6q)Et3$@E z=eyRs>!%t&p3elypK6?S0Si^`RO9*!Sa3h?H$J|A0q}N=G5OYRkZs-&fYcDk(zL@;>+r9PUi(M;S z?*00Wm`kYGf_`J!CCuo3`iH@d9hZAR33ba0!obiHfN($7e%%UW&r ztd#W$_H;*C5ziZ!uXp`r{u|gSf45$ub(w*(GJ<7o-DZ49p6*u4TF)wQ|MSL@OF5qV zgK2hV>ipFGdoG>p*;|pYd6%A5nQAltx0&UexXTRV@=Ixl)i)ZqUg|n`#pMrD7G=1| zUnS)1qRbhtl(%N;JTl0`<7?bmMLvOJ&SBJ%PxU^=oML8NSiEsUF`c^mTH|u~sB3=y zla6ZKsoT#*{k89k=R@}Day6%^TLLT1FgD$J+LkW1$6hc#FLo{QFXcFN9>KWas;1j0 zo-|&3b>2GP-x}ZD^H~$KnXr!kRKmKf2??8JG{VQEY~zD`V3nVv(}Ys~oeZ}97)XiC zpfHuMS6Rb{noabgJ>v6|SRvE6FP%Wy_urmCKT&o-t}JcO|&@^BRjv zm^Z!A#vLVe=aOfPCremZ$NG(^D_u9aUyR;**OjiLT<#sajSn}_#?8^jj~iS^&0iAj z*~@EWzR~>}IOC*j-V>G(Jf$y)Hr8B4W+(WK^;a=*wnpjxtKZ|pH_CU_ZEr@jm@Qm*Bziq29lux^hsJ}+f{Jso8%xtfKtI?8z9 zYP!B6%6R{3=Kt88#)@nHkFGC|&*}L7zccrF?z80H=XvtTB0)qD1Q9_HM1-QLC6+{r zrmDnROArJRK}789v5Td4Y9Cb;MO!UJ)mAi%Sn}AZqLKXGH`4F7pU?02`{TUk&Y8J$ zXU?2CbLPyMxnT8)vnVc^o#C~uV13$Cg>Ff(sW81$F}k97V;a9$zm1q>iKlm+g#dHh# zPD0+=S=4h9%i{7Hx;qK-&D1xQMLBN{)NgQGi!n7X=jPLr!a9BFU@8kz z&f!_=EAFPU^HzSYvN$-CMKM0HvUr=tIOl)+iQ?HT+08Mmu*8+t8F!`>c}PWndPo$1 zl+~mi%h+rdDVi>4tr>exlUA^HEMJ^n!9HRvOSrGn&zIE~b5^s@89(4Fp08ndW$SPE zN}vo#O`10qdFxqU=3C3h=xP!J88rf9KKuO)X9dx!`iO*$>=` zITFjx-BDhIZ(@g4c7y)h%bMXBTm5|qj?fo+u#>j#V~yEb%GG1@snUML(kXU7Ysr#m z$$mDObrqfmSOdn5`4oK+Ecz$SJc!f+`cV&lBa6VBXXpbx5Hv*qxtUG~v~(#M53#9i zjF@?db>=LWt{+C?Me_Lu!3p~K8@#cXmguqd^qU@AMD9lrOrwrR@ct-Ta0Ha;F0`XK zl*M_j2t5XVV2QNzI4BoKZ;rDPe#Bk8J;4%WrO_WHuGb*NX^_Hiq{HZH4ms!}ne%md z@xtCYKNK28s3UvdV26nMp7|R1=XOf?2}}@gr>vjA)iHLl?I&;;KVzdy=fD+vZ6e@2 z3uJttO+^2Kd5(pObr+c%w|d~#xYv6;r1{(F;I9}cA({xf%oNUdsUq|WOXb`KL2(UJ z>}@xZbe)|w@*!3c@dp+m{6~v8lgsAHyud8t3YZt;Yt3TVUDnpfJDS8n7aPWG&lICB zr*nl%1)Fvj~~9W?8QHQ}^P6YKrLjlqJeM+DIo~uxRDNW)JDq zX5oCv!Wh4Apy)qYAuAS*UZG#uR{HucHrZ>^rBXiAPm+Ew6_>Ofcn7yI-l0yfp-i62 z6V^A(&%~x3sKuLc_P6NI`4h&oGew+%=NWt=&tnci9bXiexXb|qbM(0-Js>+boVr-} zSXN#9XyI!)n<@sW{9BGAb+zogL=Gu7h}sVRjw$Tt5?7mxBG}2#a$ZzKZ#{Tlo?k=> zo_wk8Xc5#%5W$KM94->vi(`f#QY0e0d6LZM{!M#*`3>IVZ<qJ@=RIC9_uflsUU%FL=_u|SA6du3_^9zS) zQvh$vryUZH1NeCZ2FB4EyaHQB*K6?4*>usOCZAW-RbZm0t0z5pQ6qfIA z^Bl>qfT~%R{IV?hAzchdJ8la1W_*;)O2qUCo^N3pVo-bj6~mn16V0nKH_;-RH{iC4 zMcM>vEN;IqCk{xix6@6kZP}PR~u@B}$!- zJ*7kO;!--lD=W8lmAE2%i(?sJSC&RiGkLx>t-Ghx8xYb>1kU7~c^Z((s7}k%mn#PR z`79F3RSC7o!YI2ID~hwQ#lt=no(oVrzU!6C0oN0Gbbzj#;TYsYeJRcB8rts^R6rhsKUl#Lg$%eXh^YkwER zR`9+uKXZdFt>(k{wi^_+h6ixNR!Urhp*i@5h+50LGVXapEY0Ru%*v5gp3=}Tk+hZX zl36TO*~y2qreeWP{uggFbYqE2CzGxS^sXl54@6vlu2_ZTuhg>g`XT-YLLKLiYF9+H zKc%C)(GMZwi#@!u%)NgTbNBN^rr0)=xR%u=(9n;{ALNJF4RP@xHz`W&x)Rr&n&S2m zo^0g)l||f1ewXpu7b)TtPf+@;EpZ($FV>&pyEsq0K*`T|2U_zz&*1ehh`=AXRZ;4A zK|}BoVdwcS3)@HqSNS5$nB%X3&=bUxYrM6A#fs}Uxl3hr#OVio0A~xS?n7Qfb`*Pv z9uIj(#scWeN2v81ihayivRv`(F`vr$t<(DV&hxFOMcd~*z|7@^H25t~Wq0YpTV9#n z7M8#HM_d{A$V2+sC3?Q&n>d?wfXNd$Wcnm7+Zpe1Ld=!rrDmLAuCB^MtOMp?QoP|I z^;t|mUy*tI zkCg5s2eN9k)kkj4zx_r$_K^?D{NiESR7sBJ#}3o;O7dL3;xMKA$r*gyVPUN-XUW#P zGfG@J$33Lib7)O~oX2~9Ez+yXXJvMlI@XZAdH2I2v4)&t;88;4)kXsEd{FGFhflGA z^jnDBS&5of;(EGM1l5;|E$mlOtC`%=!29f_!7b(6yyjjJ9Vv&){Np_$qqY22R<@^> zxPDke8SUg`-fXuhZYNuf&eyvPuK7LubFkBS?;4odv50&-;u{g7RY&=Erkt8s;yN@( z1a#J^(;kr!X=dq2)mg9&;`*r7S#Z8IEiV%Bw%WAPbe#q3fCaCuWBK8tOBcDE!ZYWI z#2)h9a(uvM>NG@N&m%U|^C9wJekWBV43(cVzG;)_I!wN#@{s-_aDsf$z+0~uw=H7`z;hb zzm-pN-lu}_J1K{A9^x%}o{~3N*)3wf$RDwDqT?^JowK&|$whfAt0{iFD38*wZusz5 z`CGP9ST4)$7{p?i-{fx?A3IyvuFAI=>r0QWq20a7cwHXFZ_W}a*X01lUeW3sKtB}+ zZs0X#_QxfzQ>x%MWiFe}#)DBx$_ckWWQ)uX%oJXEawpEK%oK@tbm8|x-o=#oZY8dX55=XIaO69 zXfUjBvraL%#`u@q#RVAj>G#}M6c`MR8Q+&C{1gKU>6J#QCc`maJ55BG4dF(9GgYK$ zhD$QPH;FpA8^ZauNg~S~MMA#8?%BhnxJ8$^GS86WYe?YhCWu5|Loj29#F7ezwVXHq zR)qN(0u*ITyAs##Ln5J?A%*c%zM12tIy@Pej&#F(r3p6YL|O(c7tpVqVmT-cB<-=EwVp z!s)07PwXSQ&M>Sn@GZ5)<5`AKPkz581*}8m&weaUt}{d!c}l$Cn+;aR8^@Dvi(v(K z#M8Dd;FjAxFlif-P0l-t6ZgnDao>#-x5qnim$rDj+pvxEF0o?MK7&=`yK9NP$8{bt z`IGac;S4Jj*H0Q6=*`v681%{KF@=3^*yJ^lm6NVLaQ~kLw_i!U+{+Kd^Y0C3ZPuH< zB`*JR<)p}RbmofTAQZz%SMlE_9CKLfyJJ8;bV{f0h@^LhVT`9oQC=}9(kn`&mKdBy?$wGG8jQvKN~Bn5 zG&&9ZVoR~fV#HD}A%c?Z#%-g+_Nz)tz!(}YGZM@jxmVw5%&7I$-c9tq zVGJ}XTdx(nYBHMphcQLj0+w6#K-hAO$-YYA#bVbom&kgHT)Y#fy(Pv_-inL6CB}nB z=sc^9N^NBoe!Y;^R-88~p?2k?pNd_lE(yg`$-~EfD0cau5s#}VP;PIWE_OwJEzSlh zib1*W>n>&ciYvj&bH;|yk0Hti7A3x@ul&S#_@5NsKI3DfDbhDufEU}WjN!(E!~;V#`T=PnI(ilq&e^9JRD4J>67gPSUW zGJl;d7B*Mjnz;8fF}IDfg7Mu?MNnI1n}JV%BCbR$yO?#^8h5Fp!CiX#mzdi@2{bZ4 zI?zS=l`nfFvbri>oI4+h_1#f9e(i;L9;@7i&ipmnHC^29t@z5yoI}N~4ymH}Q{}K? z$vIf;Vrq7NE}ckJR`O{%lrTW)${Xg;-T_LKCm~t44(O8F1CrW-rSNQF8K|^mxLM}I zK}tP7;t!EBNJ-FV+v|f7zjKSMLzKtROx_Gps2-p^C8E(3 zr2%V9gQh6ov#L}-UD=Ff#r1S$7Q0UUrz$mgWQdqMRf&^*?(O>Dx^Vv?IkVi;a`Zao z(z^^W<#zgU2Hu(_Vl$Oq3`Wa6GnI0z5}lrjuZB^%3UQPw-lBHCDc)=T$8#O`hY5;vX&q5aDF}$G@8dqcDPSot& zyE{Q>bQx~!u^Rl}o9iFZi7b${kSw#%L%CFUmhut1D8|oH%Avz+(A+sn1c-NTjv^Su z+w^%#RnK)hie1?q@!yqd4&1DOPD5>A!QksDw_#AFvF7J3jbhPI-q^9#G_s9}ane4LtE19#5?D6_^(~Qmb|7 zoY6Z(+&blqkrjwan-!U{*;HkV(%CX@6J#(boh-(0QQC2=XHRTXCUahRg`##U0es*( zk+@SiXygsAlHWchoL9d}J@+X=-1jPF>_Z0ktF&#O;>)d9#hHCdvVvjT;xK4kB2FAu z{R1?NhLJ>47&52aQ|NUg+mX{{ShQ^qYuw26}VxINIa_q8F-Hi zV&QqkD)Ys^(3*=1ws?LKc^8$r2IioVS1_KglFwD8hUMIfV%L3Xb-_vc@Tx+vRp(v> zB{ONkHOPR$wDp?OlFxRh!fVPJP-5nF^nM*WeO+-`|5#q^y2Bv2uhHQfO1kGs#HGlX zytUwVoj00P<@txH%kLQd*>w7M-drz&XGHP|eND?}(Pj-F>rsOw-VDg+9`8|5c$6sfy9`IU7#Xjiyl+ zudJ3DW(8<<4!w$`&RL!OvUswdnjT}rmBq1730mO@0e%k zT*xqp0hX3sZVW0}4V8UIU96^i>;*M-L$NOU*v<3=OY;v^#5U6))wG>W6rP%C2J;D= zqqh%MY21d_9`feF?Dy2TM+a=Czc7#OwBx1o;+);|J@)fxDP@Wy`x`)@pbBaOu6MvqagNTeN44kLovn2)Y|Oj zn+chZ|AGCp)2A;ydM^++s+iVbH(ZQwWV-6cZ||Y5txN&@w>=`cl?l6jJ@<&iQKp1) zrfP5TPs6u%svKu}z{l+%YY$TdAGkwA_b}a-oy(>;q?&)1l%ye45e}Rp!h0bDKawU= zJ~8>a@!1o^(t)OQ4!g0>5O9bxbPN>0BuXD@%3>dp_66AZ15y186DGE+;?^+J3|VE zc5N~Dpee)1$5j_zNA!nZ7l<_{ObX)*7SN`XrcibdYdaIHGcs1qr%b-QXuf!R%H))J z53`PgiX;gw@foQ_~qRnrV=y%dj=KX zH~Cs$&Uo*+^Lz#cJTO7=n?cbJOiTI68I<<`bw4nJyb4X7__`UCSZGS%GiT75LQ{Y< z4ev=1J-U~jz9t?$gWeXJqJ0|!f2cn6LVbU{&$0qNkH562;PV+G!DTwbSvRWw*whP* zGUc(UHLFdhADe!{B);H@i5S1&5<$;QZ54JvjQq>wV*K~1BH@iG)ySu&)9qqYUp}}r z^rJo{ruIChEb>E%DV~RxMk+69W&VhJr!SdnF61|-&@N^UpjFK5;J=hcLix!uq=5r@ zpe)ivk8CN64CUsEeEt-X#mz7`+)oohM)P5r#Z!UVJeL1HStMA@VH%&JO3Gzaq7BuZ{+UeAXlk#D5AEB8(k!y?Tv2!)F|t;}C3y!Hr+Xm5TV{CGH= zK+svbSu<1eEyzQ>l$#^7aZV&IA6`kmOlp(ohCKPhMZ$;XFwSF#i=`i#+roZ2jBa-} zXL0{wVsMOksfsN=_KA6v&RU0yJ4{_W|%lU z%$%&TbWwkzxdwN>4gu1ANkN)FeCpJUJh{FYoN9h-=6%kKo-@qB7QXn5$eM4yt1A7X z@E_7vB6&5w%$r0Ao^6gYK-v0WqqzoKAimgWZmse2v9x!OIh3D>rMr8~5nlIW-!}|D zaPW02thvYjZc&l{y|a_o&@6pxE^@rg{k*II`3gQ@G@Nxy&E+_bSD%%l`PAYk*xk z^;)A}4x6j6di3nDc@ZC2MPz(q_N`{l8I3<{kFrTrC&%1f6#ZeIZRDHUi>w0kF~-B% zi|Bhg>&gR&j%v#xjD$n16xzqBJj|i9^zGz z8T;!KqNupoe1?A*MQ2LP(L5~bfYTC(A=+IGW)_>KJW`8Y^Dl~2n`N$vi{@nWviR|@ znp3bIZf-6*d0AF)U;HuKr7K78r}tJ+S*GRab6EZ6#C&l>Yl*YeN(`4><*}uz*G}KC>x+1~32PsD0%vr~d~6!x|JV!L ztp~){RV^=!SXa`nT9)>b(7HO6_N9D~5h%3E^-RS^c@?50)e*^|OrS{OT)O^SLE} z$`7zyU?d(4u>8uQ7aSdI`35$p@k0>h(DXVDv-ryV_;5mzZN=`9mSt_Au77yYQh{T; ztp6d)3^R)pkB(cghjmyC`p)uKO>8fI_Rvzov8Ma%iN(cIMaQRl^aOQ$VR7-Pzfz~C zmIyKKrR6w0H7-%77ZzXY{+Hzf&qPE|>i1et`sw2Pq{zQf!#TpeNH639xtG9WcTr{Z813P`(DM-$DbKvfBO=5YdQ9KNp)*wc4Wy1)~bH{kW-&i^o{&sc%J{e zCbc=EO8$VFXO?7GgV@O>d#p9sp(WR?wQZTFRmpHulhP0lJWWn!4d7|Ni!f%L>&|k- zX{Xg&H;3NxwEn?huRiK+#eREJ@r93dxDlQ@xBRT1vTvzHWote6eLuVd%SBJV{@*Xw-@Uy zEML0)&9H-K-0b!pW1os2x42=?f4`Wr-R+5yXSNVYd)#&zm_<}M=(ah5|CmZ=J=9Qs z1a>A5bp>~JpU7QC$BY~YTzVKbzG5bdZQg2-!TG@iJt5exe<8mN!iXW~RdbrEOZirB^~wsGrh z7dM)!Rs$<93RT?4x7$oNQQ4_3u+!J~{SPd|Sg}rk%5uQU-jFVNg;0x8;YyCj(GW*XdSlsBH z>sr9MTz$Q_dZ0M=g?gAd3tVuR#nMIZBaXhxby3!EHPH8}OaDU_9Ba!sUY96MpttXK z(b?guU%-$5pY-i0PhT2I4mv+v_4Pgc|H+r>qKFZyA5RaWgb`|#^HnWYI;&xA1UH53 z+@K=bJ3>w5jw13MsRlaFBVDh9u8-;IyokDvRKr*^nmJOfz*k+TO(WHC$4wLV(=m}5 zp02(#y1P}P<0Dmn+l7B&J9H<%BsIa=`H+OoA=shxLgB=Bx);q&QoZ>0zO*SxO;lbE zc9X7kBj+eJA)rY&s}uu>2N-}K0fOlj)d|L9u#qCu!cl4fU$Bu5j#88PqD~Y%T5Zca zZKUMUYEa^V0-is5gE~Ts8jXg&yY-*=mK&*fv>NB@biBvw zQ?=g0rzqNrfbo^WU ze}4De20D|h201JLSN>xgh>ul+t+Q?D5PZLPLkb_OhV$N?DS52g6Q-hzV^wckUZ^ey z({k|n`>XnkS7R|c`M7Xen4%_P0r@6Ht;|iK2i$mV`h%*=- zFcRHcML$je<7f6G--*b%iq=h3dwC`!rz0dSPfCLrhNG*j(~sOIsqI)h`goGM4+bAC zRsEiQBz{X(y&2mh9!*xU85Bn2r>Hg9N?JDsBR7i*rl<|rB=SjDE3jm0l#aBa^hvr} znf0SdKzbeO>sGokQzzOgwJ$Cy844KPh<2r`!S$PeV3l?QUbnI0?+aGx6ha5WY=rR$ z(-3aap8+ocKL~BAij~?WIz3ID#|!#U+;sIWAKI59GSnMrnQA%I{DVxjn{^mc1CZO$o7QKlp^78QDwS_d zH!@XU>_YWZfQ_-Q*Qn6zH_`ZPwHqu|=d$sg7&5L?TYJu^iMpcty7|oCe_DYGK_5<^ ztOK{t6A#v@Ety|SJquc#I3l~;+sWCoZbRGcv`Pb?l$31gNNqQ$aj@dA-k>(CzNE%G z*ZszB($i{SWnIWc&WEeT;(`X~o@sDv(aBj(yxV};C80g?+zEG+mZ4kg;CYqKB?z+- z7F9*};&~&U)2djd%ZP8m^A3bN5N0CWjj$iWp@98*K7@zLa09E-l}&0Owg%sA!W7(^ zVmG7Z^=a#7bqJd+Jh!OrDq?>ArMtZ~(ZFywx-{Pp!|xed%DH3TNQ&$d<3J z2`=$@=Ne|8llKM%>IYTg-F5$QoPoeL$j)aarD=a2*Y~AX7i{vO8~N(nj|T&P1|8N0 zTPFYH^}x!lAMjrTAM!8!r@(Cmt~|aoB`vMlW&FpY&oztm`iGK|iH|H8)98_h7AXzj zA?g-D=<%*T6n$6q<(+)shXOGkD*7FwiC zz!884K=1w#gndN+`w*slXiHl0K#k^8E7RQv>R=wxlDZbE5j@zR78a_heuur^_l%uM zzSlh9$pf}BKwZ^|u+N)UC*Gius-3{Mt4Sf)7yuba2tD* z-y?OsuMPRyJ29Bc3i?M&Fnfy|kJN>XZ}6gFPoQqB^rE>>)G*&UUhiDpLAw8bVTKpo zexmwD4ZLTO8Uk+KwMd6>NJfXnfZca2(iVV6KGO0mxF^UWZ3O6*gA8N(icH@w?Cd4N zpQ>3#Kh5(U4lTsw2BW!cJoVg#W}^dDENFiI{8+O ztGoXuxB$=wF#85L1JDn!?7Bso4~PM@2i&=e=86ygR_7U=HJ$HV`sS402YNHBIhWkk z`f@iMCuCYDUfxM7nC8pfopg`^|Jq&na_ti1Q{CyYtOf8CcXArERNm7a-Vj<4@9a*; z3>r=xxr-|XjWcd`ryE8sgWq*fUqy?ko^t{81q{@~^Pn>z6R`gr;(+--TO@xvt!ORz zDhDYht&`tY$9rmj1#0_y|0i>;cTkc^>&a(1#CekzCiA0qQrz&pm3ErzhKek)(W}0 zuXdI>8@Ro5b$~3G3~F0I`Fd`2xT5CkSrd4|5u}C}tkQ7|zY8Bh`4A5(YTHe`orRWG z)BNhUw7hfeHZ3bS!nnK z-m>ZkYFk|khK*`Wb!{pv^KYta^)TPm3e;M{$!Sm^D*c0*76xijFo^vYsBPxP+2K~H z2~DY`>Gt_`wY0HNxqO1O?>G-M(d{~*qQ8k=)zRYMfzz?B=FRe`e_d^WHo7q;ip>`3 zcq6M+O2Rp##}69CjZn?Wd3_^2Zm0zW)--};kC%#%TwQ9b(yD^0z|{d!86i z8i9Y^P*@`^in|PSwvm?V{HC{5>L5@a`5aJU2Yy98!?b9a-MX$-2k)11ay zRc3}K8Jez)+l3nM6jz!cBM4C?TpPk3)0}XvH9QY5hHKrR)KqV#4TlfFl4eNzgIIH| z2h`G!n}fEVw7j|20BPr%Ycm+9*cKpv1-jls`v{6h^$4wxu;;u4sZ<#-VTc+c`{pc+tDdu$wzkr~hw*o0lva*Spy^RsW6uxtj3Mt& zhZ$o&&sj7$FlQiLjM8d&hLx3J`Bxbq3$3*VQ$i=vh3N>dzPVhl*JqBdd_;Q^s^s^ z2SA-~l_t`kowa7XOEHDUfUBY?HU|CXOJicti;HP_jMmcFJRP!M+=|ggarQfP>4pxv zL|eOQ6~MHoyJwJ=k;n|+{ zB!aW|QT+j^W}m4vcYqehN4=)I10b=J$!DN8%QL4Ihp~5c!N3u)pznU~2jLW757fR_ z*hrc(9MZ2Fy%~;9ok~?kXn!*+RT_yg=oAGbfn-0EHcA^_X-PM|GqZCSA#4tbv;biU z!a6A0jh2tnX4NX_gx{H=&APoY1gfk)>3@i9dR)irs}vnqlRA#p_CYqWF&IB>@s`ei zx`{&fNr}?q*%^7dl2UqT+kvyZj%>L(wHO0=^DT`WqYbbWcYR--BFY`3)zhxOEGj)t z4t~lvP^Dz8GC%*4B9gU098Bz=tkv^8gdFJ(^G@=IDX7Q`lTaV)wC z%72yd7=m?a{CKUhdv)Yyj2D3RYC~AV%6C2d4Cuo&@hP)_p4IFNjYCZv@14cZC9-ssLHUVUq zLGBYF<;PN&iCQ{MbH~LjF6d21Cu*PTt)2vVU!Mj|(pm;v zQ6Zgl=6_Wz9R=tW8-mc|U-Y~GoUTmL{DS|AdH>Fz2>)r!@UnN}|LdLKo>M?7X#R>~ zQ?*{0qxYoZBwCn2b=ThE56n<2p4aKc|$*njf4|mQThQ8b&^8 z+9;gRn3JY`6BzKXLRNhwx#BUJrz6x~*2j`w5Pwd?rhvZ&(vm3<$LHwlDVj?g6)m|m zv=gVc^Z%ed=~}t^H-NGs%I2r#=}A`**BPG0q~+-GONi?NSvQsF@$>X&y4JE%R%ehL z{utOMwDJ%n0si^8yIz1I^Kb{`x!Eo}Nrp;n6Y27r)o41+CMR;flXX_httwyig_P+)BuG#dj# zq7$>VkF@LUFd3m{I(a@IpE+8+x=q`cktZ!JPfu!ucqw^Cq?Ot;>Lae>brJ>Bm^s=X z_-yQ41XC`XLy7C5 zbAR)IverWj+x&oTtk=5og%2or12WEdKs`4AKk5N(+W>sR11jF24de4$(XfrEOPyA9 zX`}XvXSNb&zl1)@(;|g!GhW~!Ek(jsoF!@WN zqU|BgCi9ndMcg->t z!i!iN=70~G@wVpX$v3_f&KKHAMO=HMO*8WKmnfkG4amMrStZ&UKK#;>Ae$e5S+FG9 zmc?sbT5`o!==<(sk*iLh)dkZq2!>)1EH&^P4o}O!F47HV%i~{N6vwy?uD0U}utu_- zG0?k|#!T8hC+{?HZ9u&?R5!y`!FOi%oV=lq9tGQh?t@UDnsoWT z`2gKcvL%Hs2VQ@@1B%g$Sc15oU(csc!|DI^Ug`mnKFYQi#M>{zl5NjrW6ls%S=3Fj zl`yZq`~L3=eX@^&=Gy|@+aT@VHHf5JNw!g;p+Nt;0>Oy?y8;yu*DL(btKR#B-z4-2 zAGBAToouto#>IUtl0)1|w>6Nx9_-fNeov8pXwGU-#gMnlB^O^Ygs|C<(-b_r#H z?JkaV?WD(xY;F1cE+TBP&CiQ(X(r;f*`6~crzzCTrlQjh+hfiuiWXnlyqWXEP4COm z$4ex{{Rf*w;%?g}=KTFjC@*CP^jMwj{HtG*-(C#0i(iVcz36pkwbBf;N)Hd|8T`K# zZ};1RINyl7!-TC9ix*>rt)4-VYGb(&MBBcxo#*9)DCLN)E5Bcp&L6S0_1&=n&BUb6 zq}Y5T%!{Qf8fi-2)(sSV)aGa1h;-aXTJYrtiaTm+>o>nFz5wAhU7gWwu&BDO_dZ=u zhmYEP!zb!xhUlK_-SW%nW#aub{XHFryk>YSO)e{^6pwWM;BVRnvK@m68ia4_VZRO3 z>6p#et4CRR`YkA^W0qcCuML!nG~Q_gtvF^23~cqUZ|d$@dLG@2ug!*{!hhP-Yy;gz zxwf#fZ|mt{8_4;sEi~BwKfkf!pLZ(#3;(9n-+FO@-v&zh))pRBK`+MfhI0z*RktXIuu0_Ul_ln4&SG>z7-+T2GI^wfRO_OY@YvjQg?}%=*Z0fY1K( z^+lx%COxkXI{p!Gdibm?)W7*`Jw+e4t#IzIVfha~z=<{J)p6S}ZeCA`Cu~VdgY`v) zkJi!c6Se@jBCwM-X!<`;t?z96crwu6*^+F}zAACO{C;u43v_M6sv_Z(tta1|PrCwBU{HJAQvD#l5u!^O}z-Ll0j+qJwX3XWio8nx*(hW=VZ(rdfa6 z2FU~8nCY*-Z7qVHUPCR)ZiVR%-qE+UZvG3GU55MNnn)E8IG0VE&waB4SM7Oj@JsluyuG%;xOl8tGLW$n3eFaFE7`x{)_8DJ{8ez&74f{X-H-E! zdxbN=Ze?tvs8rQH%F=4+AhUFBr%C!5a0svikPXNjV3wLEg73DN%0|iBdwT0L!H@s; zp6w?t*0KN2SxvFCo_z*m=c!SBduuLbP)dD#@bz?BQQy9lUz#pLL+u9{?>C(a8`vXw z_vsYW(0*R=pI%gW=mZrvw9j>>?K4Y50XNs0r6vfMt)(@M>}UC})5PE~JG9G;X|$%X zeWCNSX+@<=CEbiL3D)^e(?nDgJ3Q4MO(h;~kH+bfj^XxE{OD9V8E(J9Gp5p-X7)rr zbSf#$?VI=~Q)yRodx~}cA@C$1A$n0G2sr0s` z9fujFl3yeWy_;U-vUZa4C2VbagiJ5c=LZ7@$f5ma30|eoBkd6ZzaWpEZh$P;eFq^f za;5omut!n+mrd$bUNG0?rU3LmcI~X!MOUom3=V3GKCVN>~s0vDfBqX z9>(L-DX_KuQfMIZMsh>GU5d<~Z;*0yqbSzVxmDAPN3zpQ5L@*fZ^r_0w+A}KcR#AN7|>_FS&Bqh4Itt9 z_-f(xvArz|=ra#I2eHuvVH1QZ;QlJJv}G=MAK}ndl-kptpj@6~mX6G!yq@+m&T)92 zwi3e`pyIjwN^!WC{Vwy1pN+4eVHE*C&oWE90mqk{rB#6D%jwuB=#I-NA}GNQ*QQfT z&CU;ojV30Gtl{F-5K>!^O5y_8_K2Ry0emD~KDT?aw(M zGFqG;Yqv4??vpWe05?aVndNoS`)Hi~DlZyEXU5yF@cSvWCIzEzU}M1;1zE?7 zOB3t~Sl11q&`I`U<>_Fvv|})ZrP>ek^-1(R6~ixWkno*sPi0;eA<35)IFPHVM#CdmwV9W2&wvUfG`-2>>=HhY{BdCw&E=^(mp zw|kk4uWy^AjpB>F_K%p+f#=KO=sx>*mil*Yn4~m7bHKyvCTR^W+mz^qRjo265LakWI)xAt&m$+-aG3y7!j$L&910}6ci7w##i zjwkFmc_s#(u;U7YKA|G;J4iB~6Clo?w&Q$kP#+QZqh5gcw8-V}3tEWfXYB*HQUUS( zUP3vill^o8C7!oO@f`|nJCFCX5~%Ah7+9Yrh*!UWUdFUk%(eHFEj3@@9|M4fVr0Hu z=0^V=I=RLd*uQ6dbv&+BK=B#zV$D7KQf9KnW8L=FM9m)9oATQ6l>ETH#`e$+YylVz zh;$PHh4w7G+C%JeVG0Vk+5^?b2+*6NKkFW2km$La^=E{?^`MML_9*9K#C5zGJ4U+O zlf#0|XZsm$skz=H9a)EYlD0mzSLP4m=YH&hO*i3vCYwZAcsIcX8DB znLV8Q8)(fldspAJW$9Lv1Sgnj1w&DO2+Ch2ll3`--LJ7U__@6;Pl}_x&+UDkae97# zeG=%ZpHQ-PjibO9NS_)@!(P~Z`K(yVdSMUts#}^br))yWDEJ+Ma5ty(FEHsK@ADV- zZ8oQ#2Vz54ke|iUwwI{)&yu+D(vA(=jj?q5PYm2)v2^g2eHiZ=OM!pcJMoBEN=9g_ z^8y3mIrtcm{fsXC1x9+^U3k5=L-Q%_M(J-L9(F$#$#3mWld&PV{*;)*9N5sp>MmS% zgfg$LU5Z>ss;nru#&91X6l2{w646DZ8yvXyrcGzsq&j+Xzs`bdjwGiN|1$>8Pn1&G zv4+P-3txXns?jogh)HS#s3X=@cjO!Rooyl`$Pq02N$t?D$8pgwbZfnADP%R=XJ8h? zc4=W-x>VP(f?sM&!-5@M`O&uGWUwPb?YU|XYPs7aEdz`LL<0N)2Eetipc4UB0fqwF z0IC60!0cVX0b&3(0p$Tj(3>s*B3A&nLiB9rzyQ4+C3u8mFrQovDLG)}Q-Cdi5dfXF zn;!;#JHGa{N!pKa6<`FwAMu-q!1{nAh|dPZ18Q!AgxQLB1o8pe1IiZO=vy_;y^&}{ge{r zfYD|%ok8fg>PvKY*`hT*a&18yO!tP!c{!Od_bzHh!L1#gtkd>E%pqU%eU#DKv7Ue4 zih|lWj`0Sq1l(M_7{47Ucw0wusWC65odaU1aiqA>-qDlsoR$<8jsEzlC1piBBKS8g z>1?!PlQA<3{|^ykK612VJhG)Y*ufFbcwU5f-qCS`^V$*Oe2o4uwFPbK=IG16XhF8_ zj$)HOGM}z9(aLy7B@q(q@L+s<3(+>t5x^`17ov&)?40&+jAaIT(8KW+>rTt#9V-zu z`q(h!Uj#qqTC@oBP1oGF>bU58nZ0y|)zoQUGr#hZs-UumjP5ay= zP5guoPIm;eEmSbw(T#5zA;L2p(YR_OL}bixY-9YF5DJ~?NVY5+YLf1B#NS+SzT2Vy z>MM7q1Aew4R6Nts$#Odwf41nLNCzo4%h8PI)}w`4j=fq|y&_lnc<@|n{Ln&lndN}# zZuB6G4#53^V4G+~nvJj_!bpUtXwn=v*B;PsF%Nq=b2nGrUQE3Y_mq zwlxlZFNAcBQ|eFK<~uqm{=mugsCd33l>ZV;p$otigMukzfy2+br9Zg3ts+(ICw47> z6ycu-Q{F-diVndPvB=ShHwmV>iyXd6!#EHmmUb<2c=7JRbY_vGt8YsbtXrlGuuOII zH|3AVg@r1dwe0xFVn?*G!)Is?OO4f)OR1#6CqN1WjMWq%kQ4%m>!~_!z=X1})|D4}-&hKztH=p_5&&xdX zyv^&*JmdMuW!|$SaP2m7yI_fZc8K}Y>^aW<$Jrk}@8Qi6 zJ5uZ=w#Vn1mAop_=sA;lA#hfQ=eOY#d>AF!eyYP0=~@!SauznkM^oDQkjno&Phxld zWt8WxFQZZd%U<-%4~)IwNlR!aA_rGr$~y!i^Sjum-t*;0izUKJeuaJgi=JPGHxi|Y zAA@^-Cg;{ayyW@J9dZ1ksnLu@_D5Zw6=6JMIH%jg8yvgsM|(WSnmi8t!dsq~!Y5^#*p1d*0(`7=QcDbF9mJ zHQsL9@8RCawej|X2~V4AmWQVX3inV5`@izCDK_QM`CEIc?&IRY;n@tnwms=JSP z9t_X=j2f|ToA%roW9DJqB^ENXVX9BJ3#hv5#H;f_w5I~-nKBWyD!`r ze=pn!eelzC5Gx5>81KC}yuX+41qC+5d$+NgOA@@ty5m=D3^$fwMQ?>0oxMLzM`0y_ zd**xP37}8rdtaJW^agd0W!g_1?LFERebVfy(dO6rzRy1cuO@l#46pqsA1$)aJ;r;p z8J*TmAt-R@^}w!Uy`M*vm9wk)r@b-RYr4W4UkNu|&u5hEVjLBywJ*1OTUicne)kgZ>#pz=VpiLa{?f~v0I&Lqx0rcXGF5$2!1qJA4rlMX-h0Sp-g401d!zSV z9uPiYzxaFak?>i0YZxl!w2J-8E#5!PHtY7=D=oI#bnUmd-{sxwGXM0Q{p4S~w}!cD z?D%`Vzl=0@?+e`UfcK;DJ|;do`Gem3BTU{{`oSaK8^X=dh4z_`doOjF<9YVOjoyu6 z=GwjXiYD)4QQ@gsw3Yo~i}y7iIXsc=3Ow<&_c=53gutai@2;bAGnw0#(}XY~hUR3s zLd-tl8ShKs*2dk3N1HMtjQSPyZY+qkVCk3}8#m;PqI_tl z_rW<4CF$&t((NU0d(V%FZ?q}YUUFKPz*|!dQ6Wrz*pV|)$d3hT0pP$$pzx2N9GSB^lmkxR#mLE6% z_?7oY^PYjgwO@O=Yc)5pV#M1Txp?64XxgFhz}F+*SIqbUyLFHEVVC*j$M%_{-d(0? zd>lCP4GVoA1$OQ8Ub^6=j}DK<~igxI(~E;<5(fO8Fo#&xpaZ=03V!#b@q?r-c4>Z;={m`KX|V_ zsbbu1jQzmJ>c*&j*z`4dOt_5_Eb0kb?0Y^~hYjqB@Yn45zMJ%phr*4zAHxIx_{sZ@ zx%Y#>O-H;}o9}-R_~3~5;q!KrplWvY?glnCW9DlA5I!~In;fMpu}d3(omlQcy3fOO zw*zz`o?MLi*lpzPadRg2%(Qp0+dQ6p!+cAR>YfNUcGy(J+iVEwEB1#QuRiaV>!fbq z9rG8k3gZ_%v(EWc0k0?s2pSeSsCxzUAg!eSsUIee2AP?*;Zp`!=3`>wAYs3)yda zSZ~^Ync#TVI~~hpm)G?!6FyJQ$RR-rR>mPiBNaBx@*vwNhZ=>wZleX(joP2j_HA~V zKfN1RH^=vw$qciIO9?!1@owODFGX#5&3?@5`_g4T@J`^)INz;i@<;Z8IN!rj5vRX> zcy!<$`++3i>%3U(E&H+sJ|>;ax9v-leQP4jfA<91miW$erQ6>u@f{y#9(p5?u+(>@ zx$6!4)}_7=Okd0!heuDMU8>okCBIFhzGbgD$+sfXR2%JwGkjONB0TIb$GhwUr}`KY z<=ys+r}?6}NZoC}p6R>H^bI~s#bdb~2>7w#Hhb9_zAw2I^0e(c)AxbPtk@d(YL%}w ze4s_T)FauxKbf=oSnl0SpS0u8@kP4L?v3_>U-*_r`(kz-9-YNSg$Pb5ddzJUKg#D9VFs*T&q!!+b4=tmCRomddG_-KzTcTM_x+MrL%tMv^*6rF=I$2*H(cpkWDdR z{nk}J?g(z~uoqnCyC^)O++tI!?6qaS+g)bx4twA4ebMIpn|B-@-M+B@i(Tpc@+>G1 zD&5OV=KeBt{SMn#?mIgwdT=e>87uii;L1whyJlRwz3evMvT*aG?e>*-`flL24BG>5 zS-$hl8@JmD%6GNfy!cuB_G;f!m-$1;-h7YmBG>#-=E(loo<>>D2N@gPj@RrcL=zE>m6e*^=o19bMQg7%pWKA!Fg zJRP|9ao?Hd+NbT!kNfV9FnJ5l(v7~0%&x70+c#3g$F~N~-{d=U{{34IbN~E_-SR;z zX%%@{L^LgQ&sKZmCg1jO(|@*o*;e0UVG)TJ&=thLJ9NL%roZ}V(( z2e0DY<@34Bt2f&FU-mu5JM(!1$}7GP+~(I!fvaElT{LG~)8Wyw1?*cG6h-#V*L_>U zqm5(Pm%Q#acsJoqz4X?I#G{$E=G&{^^DT&q?V874DW2mkKdIvEwIBO<+Th^hfhRxl ztucolw-0^d+t0b|NL8OeT4_BHUlfa@~t*U z8tl8jl3rWb5V&lF94~AL+&$vE)XZ!Md^FjQ_r z@vSw#S#RI8&&S&iYaX%JfA3r1GM7CP*fHVTb!x_x+vpE>8(H-FWG*od?)Ygs`|PRd z82nMud~}o9y-X}hCO;;;AHz6a+xmlV8$bEJ;(#yGH7oQHUnkug#*Xm%gTB*T;dK*X zoDw`W>AT;Y(}%wsE1=6)*grq)o44RN;~s_wm*%GW`RXY)j&%)%8U3H}wbOUQjDefn zTp7OYsJJk{8GCQw&XeL+n^WuT*H4POJ(?d_pOqQ6E$+OwyAF^3>?eL8#mx}85pp>< zLgaR7-LqjvQ;_+zIm{^C5M~5hndqQD5N7PSD$J-~A7+Fe2{STb8qBdz&x`xaZQlMD zJK>Tzy7Un%aQ3BfPnuQA{_@heTY1H-6vzX( zjy4N!v~T)b+>%sZb#9n3!55$=KB4+f3o}Meus1&+=Zia`JSEJi!J2;-W~4%~p~ciU zmV>Vgily6M^u*oaji{c>1enB&Gvf}pdE(}Z|HQG!UA`u;eJF0FxtKTn55?W*I%?+? z>@8h8fErFU&cLXx?%zgcgNikk>_Qn=M8M!9k;?9DYQS`9d{&V z!Sc6FgV&oIG1#Ol%sBFJG5|7C7-NlswF>HhiVu{rk2)BOnv=A&l@F1^@)^;rfV_pQ2! zZEZ7+Mmk{bRz4EE#WcRW*)%#^Oyl9-n?@zN>v7W#WLR@ZuqNd)ME-O!Md?dtp6I*XvZqB?6jYz^NLNQ;|{)6ye7;TzLoqi_ZYmu0pZ&z{)06w{RcrkZ%{ISYZh!D+|3|Lldh@BUYr~Ara$4vQ ztPUH*s@FoS=oV_ke#i22qTjXLUilY4SEwSE+l$uuZwOy>-^quaFGlsrWoG8`b!gdN ziI$s{cb{yx-S6KYA(!elKI~s(ww+`jdDtHvcF82`>%qFQW~>~mJd;hjo`yb`M!k+k z#*(ons;KiK$^@&}?1_tscQ(tvBadtvo3MKOiuL{*UGYOJOe5`Ts)@WhsLE7=d^CeADn_HLQOk zhiuvEW-Nv$HliR;L%!&LoL5;aw%_XX^Fren7TW7y^|LoAUTS~vntxf8S&$kqd;K5G zNli430xHMA+U+lT{l5(}k4_Gp-RFPI{Q88z=Y9UQ=CYK)rSGF(SQOazzJGx^z1WWZ zz|Z_TeyqLnU;gDT^SZ_MP5pk;W!{<+So@)Wk@@?S!1@pUE6i6G2HyS9zby91afe5D zGQ~&I`j;=Xqd)SWAI@FSUw!8PQ#8NYu;1M+rE6GhM}N%#oK=@}c$A;G?=|d`_V_QD zWhN)ux9|7g8fEsz+4~RqnaQgc1a3G&)KlgM)*bP$G^^*?uO6YQ&1)0vcU|#Z^7zRY z_%tm3UA{)msBtp_47L&rP0(-?_AYn)TU?0o+4n`nvjuLSy(=>Qt1$DAbM4Ku#%__z9w$}#v5q&KzF%ry&g~`! zL%+*N#R^(YqY(C%(9RQwr`3miK>c4XW1PX#*+)U%a~WB%>jkE^V$(=uxf5Rx);nWE zaN<2XdU5>r2=jtjfn6u?q5AS@d-c-zWoANk6bEn&@X%4mI={V^>rYmceP3EUZ?!It z46Iub|FC&Rq&@$%cy_#dBkU_P<6oR@K5p9l0(XIF-4b?qbZY0xy7OD=8=@=91(fQ?htl~Ua=P%RxUBa!7MmV2>IbO&s} zDzHqO_jSNA{GC*P%MO>tZ$oKVMDFu0cHAzbpXF+-9;?9eu?(!EnQCe0d-GTpvq2He z#1gT|=g0%=#JaFNEEP+~JlObl+8HZnx$<7-p%87(h|LcjO=5an#Wo_fxr`#%SI=;U zN%kebh_@rdR`GkR*%!y38heWC@aT(t(Ts~bU%WKUM_l6*!cqym?&A1`VaKv?|Hbh~ zEl4ER24cxm)RVj`UG5;3PH6o)ADFs0zBTMC3l{@G;=vp>$df-1j_E{-MNN_@h*?$Det88(;Ez0q9-R2y+J z?Pu(pa9l znAXASvC!`+2Bs)p3QWd^FQjGHx{Sgj0#;$dpY2;l=(_c-dBuK+zu41%N{w#dCSPDbG=GRo@8n%0c?ZTqYV4Ja! z{r*4V{}k(0zafug3VS^DcP#nXSG2|7?4C1~!n{Pfyd(->f4DvVYm;XOcRn9~zv=t+ z@F8bMTRgL)%^eP`>4;x3|2+J@^bdE-mwFKo$Hl0+D7G%?D3`H$pJBA0#TsZn&wN@O zHeemu)FhTZ!(nQ)4r}^3X}!$OewR^dZ|IBPV$MpT2J=js(!S(h@sGRBwS)G)kK=bl z{wDi$s{JI|cP>-H9GCGVPb-g|#wPwm@qaLk;u!kO3c4DWe=5~*3Ih=v!>YoFlTIJN z@*?OT>@?lj#4@UcCaSSrL-8M*@m&+drP>DZ8!YF4PxaW}d>Q|;D?F8rOtzmLj$iDa zUztjC{=~Ndu?ebh3S<9dj2yQ2jl^$saa;GHz45P^fBo3LY&8CS_rk&y>UA+Sfu&-1 zzHJz5vBuf5e=?Y^Uimiu7So&fZ!)B9+NsF_Hn7P)cRwq4dF=3s_-!sTIBxIwA%3ZA z(ewR>M#ty`IlSs2Y@zXABby(tFk#P&z3a;-kG<>5XZmgPVEj_|g8uKA2&c&rbC0t& zsw?;{^}mlz+ZQ-gxqgKb_-M=TWG9qDx)qbF7kCFQ2`>tfyki?tZNee$8 zPK>P4*}2BT%AEEC{!#bp%4cVtcN@!5qhYHPpG{re@Qd)(oHngaCg$Yc)YX|gGk3~< zM`0)J89ysxwP$tA>Uo4V@5#tftJ7C6oWFAQIq0g<@YR{mh0e~-3G0jh`J^i=`o!(HJ^Vm)`D z{oBCu=!A{t)qGANI$_wwb54QIn1l*5V_#tToP>+af_;Iz=Om<=6W;_va}pL=ec#M+ zifg>QKf<_#$Js7XUB+1nbg&m08Mn97@vv&_LF{F04K~I|`3Sp;$VAs5am1fnu_Mv$RADGd>x0wX6#%}-cjzS6RokRqb6c6jY^mk6IOk zcdZk>Q3daXRCQ5}#Pg_}zv(TD>KL^OiC6Oi{8M3aDmuUH7O( zK$DteK?261==^^QH>n1Pt*ZES-6Yv>jaqGYy{USjRAtq_C0?r>!BL0EJ zTK7R2W$7v8L(PRw)czKW1!?QDG@)DNo}>e^VJOt1DrR&Ul!RkH*WtrZbo(l;gD|ws zr~GGY9RsC6sjIb4hM{fCRc@}<*)SApQ&z_L+K~pO>O{+mYoM&afB8&?P{Kt^f%6M> zcwV^<&w)~ai3+X9prjApp>;EqVeP+D=aU6#BFo5d92-@Ib{J)%8Sev1C+vgL1TlZn z+6^V+jK{T3gQAOeXlIJDgATgX)O$MK1PpDn{HpI?IzrROI-mi{ ze2_GtGpZZX{u(H~z4=S68)0bM0+qL0>l_%`;#FmPv@U@%d?)s5JqD#&OJ@RX{X(KT?(sxZ}YP=|-0tT6PW)-6yn9B_Z*bjm&`Q)_#q)6NuJj%p|wro>1_rmFVqh*dDO?M&5v@=V51#&;-P>lPT=5~-?|Yh3}Q zCNfrNod%^T8fJ8zqn}cJr%?bIr#&o4hNY+L1jSHFJ~5-mW^~C)9bN=OL9ePiL+cv2 zZI!9~tMM~s5B&l@ovd1Nb$Aopwkk!{U#fL23~h^6F_&A~;l5lPrb;Q)ItfbKsb7EN z>;-#@w7&~V4R!xk>rNO7ZBdoQT9-qa7Y1i^Ka}`&H|p>jD7yXkS_dr_WXp4JmV_ad z1Eof?W^`yqw}_^%4E{kFrjjcp{!^+2O8h2AZ&nR|)VdDJ?zZPviPxfrp~M?>bWoN5 zN&F#YRk0ue72+Vl*d1CALs?IpKRS~kloAaHw`HiPr?lUIQe~-IwN8ejGq!1+21QTxYCQp^ zGY-G2{n`E6p9!Ua#RFOw!cd4kapR1mUL0HERQaHePzojE!q2tNhoURTv@VC+R&hl1 zt=2hE`al`RG+yo`xnyh`Y{|~CNpG(9TWt>X@ z6GT6h@mjW8C#Vu~XqI`A(4z(~6-KDC0>}}~)D@y*RpXVy7^SX))WnpK`0dy06?WgQ z3(^UtAW3&f0k#~Y`YdrgrLvU{sDe(Xgi_MJjgnEU@^8_4@Og>XqWnAHGqI}0mhfoR z_o5E(II_=b|909MH@|g;?{L_+y7xngH{=%j)Nr)*t+RsU#W={Y5XuVs&;Hg@WKeYO zx6YKAx>{$D45iBRe<2x|s_8uKZ-BBz{WH4P(VJA>`P$zCW&c0uXbOIT_?uL&V;Ah-HzU*sxK6Oi|Th6Ql5)+yh?`~Rgc4v8kx~q7fX1vYIoSG zV)8|AP<2q&XLUG^pvt^duP7aES;bs_op6>4{aO24pkx%f^INN8-?Y_C%}K!;p|j-< zn^cj~E2z3#*rXEwA`GelDDnHC)Ntl{M_WcZ3z9*Lb{I{fx6D#Ck3u@n_>-dJRl`#{ zVRom^C=-UZEmGaPv_Itw?N5TzS(A5b|G-|+rs^LRMyZ@{gfXiATf(EPXI1jJ4k-8z z(zea}bw-U)O4<=Q?vy+PrIQv!L23J0LbvLlJ?_LCh!-89#uIgTd6G_73Z=;!9EMbv zLu%?6{Ddea3q)uZa%vTGtZ0UZu+^n%leKPyGCVsMj&rbTD)%DoHypOAlo_4uaDy6l z$oaxz9dFWMlPXTpx*oEkW>tTjIG$1sON33T>UbR?1f|Vd9KA_}Qni0rNKN&epmoJk zVTH!~Eh${3tGw-=hj~PM2H+ISQ^8G8(M9Viq_z%eV@1V3Bz>q%TYeWs1B;XWW17xYf9K z+8VqOKb^9;46?<&zaO{i@WntSbISI5pNQ z+!k%AmO2*5FzO*l@6QvWgO29(`C*+wCzMXs=aA9ychMVEyO2&*UoV;|7$!s}!fjTjs@tp+HVNgRaI4md4qH|AjBbK5>^dF2LG{k)G0~j1`&)Gr z#Xu=ow?j^DVf~(It8Yg4!#eb!Xo{lJo|XiZEGP`BLMX#7Uo4N1z$)Fg@D4B3H>AUgM6b-LSc$4aL7*y47=y>B$)|1zxb?8l} z0Ie$fEuC>Dlup<2t}sCreW3jXP*zwnqYHP>49~B$zu94{N*bBT7|M80+%s-vj7(c8 zP*&UorDhwT%mZ0_8UN0fjp~HuV>&|JKAmyDkSgyO7kX6H_rh3}azMgqx`U7^Pn*=~ zQlN~2tREqVXyu0_-exr+L}yQlX2unAG@W4?-{AE)I@t9Fp)9ogihoUSSe!`D)r~%+&FEpsYCibZQ7D zpCSHMRdJ@UO|_q;(*>dA>p%NDtAh0DuoC7$m%%%Ha#)Zyj5$XlZc%f_LMSU7$)zgMrRPcfR@HO9FsKGE)GO?V5-<58U9gNxCA>`y7U+BnE<;nZ?lsV& zZ9>1+0ihxZa4X|VY4a$RS|U11wOkL`f+;AycLK@^vTndn!E1$N7%CIGRoP9#C{_0d z9lr)jAFGB^Q{$rP)J=csH3oTc*ag3RUhcSAC6s@54cK*?|r zN<|5wqb%Bt1zGobXH%)jY$LeY~CN&%?C>N*K%QSA@u1VJbf+8@^b z{=e%LmDHnUB69S)O4>ir%nwZ)g+5iZS^HzQNK?kBp*HcysGMho zoE^7A`b4w!yf{o%(4jNVgVLF@Uw}*)#V-lxDz!@(r;=ZlaL)6EglBXMIZS_D`%~W# zZcTKT+W)S^hNSJ zH4}sd|DCo{KNa1k8a|VBrkWVkH8AyW(Xq<&h0v$!c1yfgRr8foqn0wh7DtQ9bQn_E z!mwtgU>JL`i5b5!q7#Oob5QE&km`j}@YFrJcc+f(6(^5L{5DnbtuW+Jns5s3j3V(r zV{zwVoCO&!6H*gy)d^*IWdEo$^c>a+qM&4$ISrW?23-5mL6zkehB%Gi@3eJU6q?bJ z6~Eu1rX04Yv}5->B~5`+LwOEEDlK`x zv&Bh^^a|=zv`#xt>&m4%T{)D3DJV76DVi%IMQOrWDr4Dx8UJ%teY!YitC8ixxoY@S zVVnw{4mnoqSP3cMaF)(^5K0@C{~WRHRUk5=N?)%XGYqLW>15>?ssSv}*sg&M*k2${T(IImC*(O8X5c{z8W# zRVv&Xp$e}SW~eS$IK;7?X!i4^ztic8VH5X!im%bS5K4iXtn0L+0m`M6h8wl6gGppG zd9&8zP)^75{-|{h+_K86TB@{ef}t%Zs?@uL@hbQiNR13Y>Fs@@*^r!jXd?Q;_&N#a z`v3U7vJg}ie-*ZOq|_?_tqy6|-K*(QrVofcH2#E9{5m|CzSN zX7u<>_=spmS>vOS&R6uf&}FG1XJM8~dP4W!awsJ)gBfI0Eqa?@4gW(JrQ92Y5vpdB z)?-_A0fwPed2x%dRh4cPGVY;_d*f-e%z)eWTO*%OTRrXQZB~S8cwQD3D9;PRSXH)D zCvd;4GoISD-|8ko6k2L1$zez(L#fK7F7b163Z<&k9KA&iydwTh%JZ7`M?tBvvNwd> zIel}#RcT2{SdioOF(F&n@z#E;41cJPs)UvA>kP`FjEZg{@e)51nyPY0{9&r{3#}*j z>+re*T8|vo>4%`xbP?af7}Xy0J>#FM?2QwLsVWj688r&g{uCiqe!SMf6TWx0uo*h( zmI`B3ZW^Ru4MO7goUHvl%e9_7RqM%2tvkr@bOg^8dIeEXnxf}wt-GL{ z71x$)T@9rG>JK_y@t=gIDyr1F=QhavP<1F|6gov5Hy7^y~rLYFGp25D2zc44$i*&+0(q?d$IDrOht zK&4qo4NuJITI*%)7!(qrqD$*;A-d=lt%FcHSF>n3Thyys8&Ec&>YqZ6BYGu17qOu1 z){S?xzw|vJ=Mx|5aN{HGw`xCOfeh<~L>Tx|7^MovbcFKnA)Rwr$O^^|fA94Ao@vpX z$D0$*)vprwgcIH!C3LIy*;;4M5hkd_(zf-d>F|^+3E!l$95$;mA^G~xgyh#J+-5~7 z|2aD27$}EUIlmA-rMhw#^Ik&iOO6NKp8fnF#BI;i|Jn>w;RXGat~p{UKo(S3DpE>R&HxR-Oj&hpUc8 z9p3$<)>WH?vsB9#?Qd#@Y~aY#qPfBnoRIy07`IX+V2er&%>=xpb^1=NJ9lYa)g^3J zO|NKw;cMC-^}6VAHTj8<(J`oX|L0m4{#WQymAkd>`C5mUf9n)rmTI2BL6z4W&;c!z zLM}2*Y29G_KzK-XINYoX!q9}*Mv8xn%9tf=Rxz`+KX0z+4Qj+Qqy56!D(xuoZ&8!; zMKcVKvBa@i`HvNHb$gKnxK!HlIzswVVI;Ruw7>ml+Ml@c2W#V9Z>oYbv_I{vADqsc z0_CD~d7&^``LBSjvs68l;ae-3{KtL^S#Pp+wRRNUAdFPKWx_eC@n(t8qy`;woxfbi z8xyhx9e>cecCB!>iuse)DR)XZO(Yw}7WUjFq_bA*@P>6-m;4oyzt!w4aG)S0LDKy~ zI!&!acuJN3P5Ubz5WPk9J*fTZ4~gHU3jZ#8lgfNV*sP+~Yky9I=%-ZDqoQXkW0MZA zY!=P2;%4D2OQmgPfpHmnM#y3Kc1X#Jp8LT$YE@A7-$5uxEXEF9m6Oj){0LRDQ^?HM zE%b4XNa$B31HuJrVobP5dBP6BC}l)IHY8uT&GM<{$OBH>G(zcQ>9e#>g)&j}2=RBr zZL18`6D@j^DxD44`>8oPekGK6Rj~h~X{#Q}VRu%n__F zAQ76BJ6=c37IM7bKaVXXV#85rsxCWO7^PB{9B`VV97;iI9r9q2!&Z(H4p^-m<&Hqv zXEdftyf!s)f-t0vr9w8?A&2YG$uKnI2nyMP)Dv}ylcAhCRYR$fZYX`BJ56WUE2M_< zPKN9SbC(OFRR5_5tl|%+t^5@_UXw$v9na`~DEX#jS`wj6Wu2}a!z)E|vFMBgRvH;( zKq+~hL(X8bba=6l&R4uj7qk#Y5r1q(4@1dk5>E9`TmI~sf}c&zuGy|~ZarX);=P z4_G;rJRM2~15i3wpJ;|%e@K|f1q=yqRU;0AD)A* zkO!Fhh3x;6K9mKwD*Xsj^$k$As7^Eqr@qvFVd1~n^8d~ZQz-HM!@6yIpk!=}3KNz3 zR);r18FpiiZc)5y!s*0A-?1L9KNoJg6VP>1IKys&kRf zAb+vwEo#Ccr&K9u=K7@L#NVb$q0A56j^>8ql7mi-6+-DdsV4|qRguFc6%sakRLxTH zZ&Je!pHihKQUJNTHNk?cFm$qTqbf+(I`0%A6U*|0P8Fs?(P~CFJ9?uUa@eF|ex}1a zpj7$bjIPYkx)DnH%u|J%)a0oa3vAis3L%%%GKI5L)k_jL!YA>x&l;cw;)=q3r@sH$&1X!YYS`olqM09M~} z&>Dobf7J1dD-T-3Xsi9t2dxnn2JVuCO{(QDx`a(oN~o%Jh64__sJeSZZ%}FLbbNKM zaI+eB*sMxwL^ESLY*M`rH>je&YX6YK4J!LS^p;3VRo^cQ;VM`w5$J3W9JER(P~w9J zty0(r%V5)^2d#2g*CO#YtCFpdQ>@ZwA-n0scJV)@f>1i=;10bZ{ZJ0odTj~k$%+nP zld6Z#_5WIN&<7e`lmHG4I<-!HS?E*7Ot^dufe)7IHg z=8;U;{T>gaxF@Y1sA4CrUKmQ8wE8R->K09sAf$$%Bp47)jdY);{ar%lgMv)a8`UtB zc!Q4S!sF@UXP7}5|4l0=o!;LKrAD&P5VD(gxLK8EiQb}0e?Fa=~hEBRX9o~MSXgbwJ!jQ^^l3wdJ z)#CVr%73vA_dp4cy4d=E9Fk$WL||V~eu<7y3T4Xe`K8ufP*%__#6R#`VU+5=N{4qs zDe%aQ9)i*Y4Oc^Ip!s*AH>unb?H{&efhrlfMjTsIn5!` zpcEkgX7~={9=5|8*a3sE6ZSwUh^Jh~FL20n1453N(*7`MH4)FsW}%sdLMRzeIBZgC zt=3Vu2ssgPxKRyOh~}=>A1AF!(v{zdrn83bf*drHuQuzW|CqR?dQCpd9iT&5WKBwsJk- zQ5`-8W%wD7i{79LpcK$(L~{&SAtay9Cxopk>PbjjkNiUyDAc6mCvMQ;Wzeab;Tgx| zMgr*7$y=D2-lnafOg!mZb%Kmm9Uc=D9a5Q43N$vOjc4%F%M05ioClB`Zc)A4M033_ z1j(;#hiD!|gw7W9%s2)da_7U=5z?WwU2sN+9JZ>V4jrESf)1~Nl3^{B8tItv=e;;- z`PmQ!6JZ0C{KlaaF!v=H|2$lt)+vlo={w;wscK3{hMrwI!xktzm8O^RvxN;^5*}3D zufXOARrM<5iHY>rActK3Zb;wA{ij}G;p=Fcq~r}DPfo!4w-`OvjH3+J;ZQv~f+kNy ziDp<;zN!5cLaD;HCawQeM=JHUgqvzeNUu)sm3S?x#33i6Le4LW-_uPM>XY!08i&$! z*2o7q;;L2RhdN=dkc_&ZR8`u?;%`;sP!iM(=y)Sg!gD{-HPi`Z6jgkx<0pQm{h3e- zR5+u9P|`IFI`J%3{BP|DL5UdixlWh{or%UFPb~jOYvapFtKv z%DyCVw=QtzS2|olS+W0Xtvw?`_ET9bNJe#zBdC)0Xk7#)!N`ox->VZ&Lh)yfqB)%I z5YiV~zR~F>;84%B<=%&%rfCtfVI2-bD&||QbA=Y2WNKU-JfZZRke!P|o?h9nbvksm z)X~fj4w+cKmvDY|BW(4m(h1Sj)B#}|52rxRAv1pz%{^fueQ8WcQ&k>vcE6P9uteCP zdK_{Kb_z|wqNbtTG%|i!$Oz=i(n3vD(#r@_c)r)=Ecu^ zQR&kw_Q#1fRic1W>Mb6J zQWO10>G)amwGKh4k-?+UY+24R;^+JUO1>RX&il(3h@ZVHYDr+byeQ{Ks{(%=l&bHA<>)CW52@Cj3puVBhcc5^{{l^p{3c5$7=W^Z zl=F3jaVY2Q85ct0WnQFp-NjnF^C4}Xa*1e0k3$~kzf?5O6+kJ7|CeZXS{(&YI;D`& z(SDf>KdHjY#Sv6_g?dYaP%qm7G&Eow|iysWErx_&5qDeZT9 z#ZAz;Ja-Ljc6bQ7f9B)XNOV93l> zdNT~pQR!>-iYuUmdv1YS=c@`Khvn&i)CDPoQt;*(opLLhhgbc#Svo?|Z8+%7y+W!e z_jV|^(S&4NcZV*>Se0mQD*supxDQGvO}|sfFPwyATzR)>_V<5*6eRmz9lxbUuP^7X zT6bA2NE@ZyCkfaG2w8FV{aQ~tY*qQSqTAHK--NBI@d2G~3`#FAd{FzFq3EQ)qo0ma zQ&94+ub1$UDqpX42b6rQ(ts>*@yH=_IF#O5*Pt^>eN=~ML#LpR&8+Zo{LFY&|Iq$H zC>xO4q~n*t>Q_0S*`WRIjXGW?loj_tj;Ji|z!CViKf4(FG1$RHcv_$$CmB zEQV5$su|rhqsL(y=?gaN^o0(2j&Me|JEYS(+@MmnNIdrc+0Fvv*CCJLJLIPlEqcWb zPx_odwtY_vBUE#n?ju9nM4PJaS&84K%AV6Tme;OzvqP?eKaVDcDrG^o zr~y{K!lTqLO2nY5d0E)1lDmX0s@Nd~dqv03hvFZ3RX17VYueupCEd7?;W^R`88un| zggmU$FC@J7b!Ye6rt;pM5smab6-REeI2R_x|>QlzQ9QkzOkn!vO4AOQLgQB^L<*-eu zFSV{0ZjDjN|J7U40wtbMnsCI?tYBFD{64^8NM-F7P0cuD7($6(Yt1-nXB;gvx(`;p z%vG-=By5dT6R;AUIIR=rL7A{}jYCcW8XZ!lu0vK4@ls9k^TeaWCe;X?PAr-YOm=H+ zWw0PykPg#H*dv-}Ifuh_1~Cy(PC($(JP}bADd7uL-K;~-JdqSF@p#po-gF584lZ2_0hV3o@2B>L&&e@a~DANs*T4A`Tc+QLRsL~D2om``}@Qc zt&5HmGOm{hqt#fdFogpQNY&RZhYYX0pB=K?yQZxcC%C~vipIUPDXqhFxqydf8|6Dm7T^wBE&e4V}$O1#PoqyY5Bm^_Iv zOZ8j`$vEmFh=0ssv>MMBy+k!#A@r-l8}ybZ-zYjt72gb5VM)1OLE0bC6lfC4it^Wr z=FCb++vim1cM&hpoq(p`iA$vbJlEUK zg40=`T!PIyQAemw(+L|+f~=r>nULpx(;)?z5>lYjQy_=kNk7xNPe|u2&xEWf`E=1d zTavB)p>u=_)KH$Kx4h*-aq!5+MNm4|#oDj(byekFqIDOP6%7_Z+OqgpI=taBw9KT1 zlAfKGkf!UtLNs?w*Ub2#b93s~TIX3svJg};zY%g2ENtac3oPm2L1NLgdGHz`w^(j~ z)IiydxJ`USvtEvr~ zN&APPjQhM!G@W!pNWtn})_!-FXhw^W1DoU?NE42|DK*INe|z4-L1(IXTOzipmIvQ7tL3?Nrrr9HfT)OQxI}>pFgl;m6r)N~%PRRRc?PKv5c+qv3w&OsOYH zc%th18RQB^a)vNm)d?A1m8U}bjDH2BKs}j|0{d5rrfJXA1xL(48D*pyyNHsd-s+f@B*H@iWo%g%p*(2U0abA)RbuR2ZWQ_G#VqtuR_melPT^h9i1K zhVc`c=ZD>pHXezD&#;q;(t2{Xgww=xgwd+S2k9fhxSyOE*KheHfJdxOlmLEGA!N%_ zav{U4=sfLDxf^X4n~D+`QY)AkQ0bhNR`%{AUay5ogz$7?W?pdI$M~i z+!qTyYUC2gXsNywGFlpc2`%=1CBG5}TXZ?3CQ7b=yuYjVN=Rpnx=Qpcep~{n(y8A; zny9!$G{^n0VmrT=jLdiFH4~0ax zLn**8bRzoK>5TKCY+2I1dWE&n8Ru|YKkNI(-S;wsyNx z_v`q=r&ndFq*|@h9dejnYiUOZjzUV-HxnV{Z=BD~eU?|N>F|ab-3fzpwyVkq@Kcq= z59{!9_>4?2kLWEe2xxy0Noum$k z5Dv9D!KlQhLJ5ZZ*#sjIOT)6Te5@3!#2Sv8XA~yQGyKQSGkO=!GgQhvBmMY!#^4F_ zjGPna@gtgfMg`V|O=5{B5sqb@6xh`>Z~m`(bLJV&2D8zX*lcY0oOwpi+4GDEOhp<_ zc*mRbj2f&EOT{Y5qlWsNIBT9!mOantUPYdymAu@6tKOVI|JeZ!*FtI2d90VHQ@qJ;7+k zhA`u~1m2xZyI>_)H5SBrv0-cq^R!cK7{47f8nG^H5=(!cw!uoVdTbaoc2Lz=?v4b@ zC}*Jo>%#i6G0d>(99R~{_mFv~FdYKpvv5W~Hiad3P#~-VtHGMFVJzkaIue$PRbus6 zCpLt|yqI8QVue@@7JAW2Fa}tNdWit61gpoouwl&InP8+~MOY2ig7sn(Sj&8YfPZ!mK6=0QE9oCKwV#8SSD-;B) z!fLS~){Bi{QLj=^tQ2d;1~JcT_^>Rj1Z%;DvBYkCSQ%#3@UIIS!{o1O4c!^5#T3@i zFvl2we2!82=p18`<=)5U7*$w477WZW3L57aNe|62TCl8#=NLx)93%Pf@Dak-Lo9}L z9d&bz6!Iuzxsm+xu;j<*SjNOP^Nf3o<{8&rH_xcPijF)whZhsiF{-gztR8E`2Czvi zaf}sV#aI`nz9Hj%bDVUNHu<<%!?PsTC|(?EWTnLN@!(h^Z(*#FzexN4r%zt$_kaIQ z_Qo2$@5UNQeX))&_5E0*^1WE2oMx@_ZSM@ zIX2g*W7)`r2ffC?_p!zh*7Jae{x#Q_U^)96E@@ltg{`btPh+K`8VgEBT zDcS#)nT+t-|DU`vDA?f0T%-1X$;S*yXP7mznyC|t(a@nVAa_F`D-CO zgmqwDSU1*#^eb zu);5XytX?wu+@-ZP+^*Q5whT@F~oO}iBH^_<&h>1LllN#3X+h5hT}~7Kk{@TS9!<> zZO{V)Fb?xD;x+QiVaJKOe7yd+9+TmqTgD#OW$YDhHB7@SsGvHbLhedk<{RBI{S9vA zoo)%f?~)GUonLcHFY?M)87w77-Qrm034WGkfKK#%P{+btEQNoC>L#X$6>^5^v^59q zMm@FFMH@-yjS9&!TS0-klFf?ECa4(_f)40}nQC56umJ08jL>P84df|CtB3267=H#} z2u5K75-X_$vaScVj&A-lzh$r^&V=nZ(m z2aV7K0SH0}I-nD}p$B@Q4fEi2}_WIG-P4T6{B)Dl|uvgp$VEH z2yM^~ozM-v5QR95z&K1o0%l+i7GM!pAPqSXoe_iv@IwHC5Q_094BgNR5r{$@Mqmsk zU<#&T4wA40DM&*W*1^HVssax*fFAOj{0I3CJRhe3amTS5H6;=gl zE>v3bx|IQ&GQG}f9M@)fgp?1bf**aAW#59l#gf~L_Vlw0+3K0}S$ZFN2QAs5`afLE zz?CUvmsQXlvic|XRY)T1mh7Vu)s{TO2yM0GG31(pxhxmU9N?{vzSh!b(AQb^%joHU zA*|ajbaBCJ>76VtgTL;BFEw+ z>Jd~3vRs~D5M>m-`nHA&f%og=0!to8&$kuwVU;6!t2pd9f4y zj(mz+iJosbd@-L)lF0YcStdaWRpl=-V^zFNtgfvRtBIMl(rZ>)Sm#x6ZZ)rb*{F|2 zjuZ!*e~}KGVz4jY%ge+IhT0B0k1y6qUCkU-&E{z$ondGRN#;Z)4UL$&}C?^E*=Oo# zS%7h)S_ZmwnSvCB7Q+@aj*wM@5FOJExd1N6r(cFX!Uw#%u>b=beW8KWa6z_anc~2a&@jxp3mqJ z_o)WrHuQJl&`dC#Yd=Q;0T{cV-l}1yhl$Tu%M7%u4757KsEj{SD}6M0;5=QDjLrH5k?`gsg^Gr)W{M<8O_Q2@aBG~O9M>e6s_VY%|QUq&k2L;F@_z%;nT%?BM$Es z7*o+)GZ~P>T$^Lqs_MBNjKcccRDQCWkGr6wXKl=jer`|iCg#XpG^bCE4Fo$3E;Ruc?N4!mUikqPlb(u9gXulN2<2xZuhqnShShYQ#eYvp@C7 zB0XKLXNZ}QD^%>=?Uu%SDG0kD`5Ga0$R(Yx(Wn;~;!BwichH%Y8fiR5CwT(encz-C zIoQ?WP`7!-CD&xG)kV+MiuWtJbVAxwn6+x{=r~kZOM)cS%8h=f3YH@8iz+y_QUXp4R z?mlSNzhd0N5f0z%d5~|$JkJ~c*KA8U6UiaB6Zb-P3_q55p4d;^21D2_KEM`u0Y8Xz z7evtYDfzd&IUXjB+>FkPO@O$CxShBanw1^t1IDh$-(hua{8qV4_ms=zlZ@R{PD#u^RHn=3pKcAPG~DfN7Y4^*``ZOi}=HFGRpgx`((QoS?%1#9TLIXi(21Ws`50nHdTK>*sI6@n0_#VIN;uH@Ni(!8Up zxJ6s`Quzh=Ki~%yn(yWDYbnTih4sgO9p9$0h!urTD2{EkdPu4ONA4u{w4Fi*NwWE^K+#WfzgVR z+sVlSPHiE4lnt(_({l2~ZZm#XIse7Ryy%EgeTzNw;qtblfO`|TKxY$uynoeiVlqts~A0}<1M+Q~Po_T!wV$f~*n1=r`pQqAvQPCcI zSq=Z1k6lS2*lqlUd~UlgP-&QDS)(S*NdRtTF|^opWptsb{Fx&fL z*d&{sGxz_yjhDldVmRmHZOn6z8(UoR=~5+4*5lc_yQFKeba8)4*J|k&c9nD?OV?v7 zFIQ<`L+YrzQ?&ev9!3Qi>+wxDz{`{h94ag#9;_>s*t@ByVp7AXRj0v z6n^Efl^YWe1?T?%1&fbzvmaY7M-%^Ji)AjwzTsmF{`hi-ID;wM!w3%}s8JpvR!1u8 zKz@L@7)JAlHGJ$mA3J_=_gZZ%!%r7$;GmZ(tiQ-!g&&$!@Vr!-&*?)Yxz(l@e)cE^ zr%i6Q+2}UC*CzYC8%Km3h1f3i+cG!V^vyQ8)h35*a=R^W7=81P3JXw=&8BZdZsxah z5(}3XdR%48Jg{NJKG~*^qo2Ec-%alr2g=I2%-vaIdxhFlD>U;)l~h}5#jJS;$?`r< zQQ3VzkTrHxs9m`tXzu6Io}y=#Q#)}h6veAZE5}3KO5gQmc~bA1^(TyN6>=H31H9&S zC#X<4;|iboZIx91x#DH>XC%wj4t!;wx%Y&zqddP`f6hFl zd5MyHkbCx;z diff --git a/TMessagesProj/libs/armeabi/libtmessages.5.so b/TMessagesProj/libs/armeabi/libtmessages.6.so similarity index 76% rename from TMessagesProj/libs/armeabi/libtmessages.5.so rename to TMessagesProj/libs/armeabi/libtmessages.6.so index 3e08cd8f74b1d0263f190de4d913f5c9e0e15051..aa46c0891ad4ab4536372dc58f9bc7edaa6a042f 100755 GIT binary patch delta 113156 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%0A0#S%P!{!C(@B?C> zq%*8j;6X#quy%p}HY6nH3?uj!TqZQ+44V^Bn+}LK`M%xZSGOG!9U=+$Q}via$nW8#?5-}J#*9H+Y24V{J`#}b;;gXSK`f}N#EIl- zowhqGb`8-qPT-toM>RG3tk@!wZW>k2VY}EgHR~LRE%Je`E;}!7Akrewb=v=;n1|`1 zi!X}1BBMaklIFnu-vj1-f>pa_-g%mJz~cT+)QAJD>+f+5-04>Le-9c>Zei;KA6&RB zl1hXB<(wAQ&M(+ofg>{t;k)`vIR>o67WSJi;}&U0=!PDv7=v*?=_c@ck`d>|GV9a) zLJkj~*L&md_xkfWRiGPMSWEExYhZzNM+-Zl3*bJqus2Xkg{vyAqw%^W7Eqt+*_Eh@ zXV??W@F_Cz>ORu@1NOc3cI;%*}VAI5i19q zRfX6@my*NBrdscKiF3e$>Go(>hrzKym|=i!VdDVV&ebkBHuyD?hma+RZS4xpe!y*S zo&Dvt5L)z;xFDoKuZT@nzGPZ}-uwwz@|;G~u8Lh#4rp>uS=pCy*QMm;f(h#?Y+?Tb zUFx^SDpiISc1-JlcplrR@osF?=(4L~W9Up!tDI_RVXtYb;~Gw>g5N>GwXh~%3+tyb zkly1g$t4zN3%eGK-+}lPE!Q!*Bph)UgK?V>X9t07DPeIdggj7@Evz}1vI;33HM;gX zE|XZHUtAYgR=(=PQ~}~;U!KFL6e2VdG-L_h#lYfx_PhC3#vUEQiR%`Y?yI*o59yB^ zRSWCmOH>}Ln#VwGrh^OIN*{`K80LH45#{7L6MaU7S*wKntl8jawsrCnI{8-G>f>BR zpa6>k_d&fsi!6V5SH|^soEy@Ddq#H@+QLGSm9MC5UrJv0+!i(-O`n1%A64;q&1=9C z$6E992JwP>`0RNJfcz_0RP+jLRO;Fh|mu2BDAx4$hjhOU!Kw!OyB5T6eptP{5u*AU+(2+Knv*A z|4iI&Z+pap|GfVOHtfgYoFnrG?5nr?XdJNU_t`3>GeTi9jXT_2468N~3EbDob->q!s4mGZf1_RPnb z_`G8_78xIeCQm&t?MXEJkY^E+>SLdG937%rU4?wLxll|C+l69V*k;elhZS%2&_y@J z=-f3(eXuG&@vOADaPMkii#YI#e-s_rw-f=9v?_du$c(|FNR^5QlvmwQ`8r`FC_>M6fGXr8DyVC3xxY zsmwvUU(ZQU+LzRfZ((C_HO~pw^HeZ>uwxDmZ9X0I#_$!=7p>;CX7kkMKQ7IQJyz7l znW$KKkq*yGIdU*L5zWQk0x)lK2Hv|Tw6GWt-SVp#UFk%JCgPcjcwVR(L&OD2Ell!M zIo=y^!&M!738|yJ{?)+W@Fmj4Z$%nCj$XnsBeEVp4ZhS%q6wEHaG*z?2}N zlb|fcN-A;~OE~4>491OgEW+p~=kRY?S!7E_p0h(-tSDIIqPPpdK`yo@&_-DlBoTQB zta+WV9Ks=fX^k=E%d8#7T4_#>!};QZ+yX;9$;Ap$M7!pCTTNU`(YHm-(JuCCpf}=E zkbi2BVEM{5efb=yC=HXuz-sl#xpwb8yfeU|F=B1{b^UKO6U=c)PG3op<@KB9}Tad_sw)yG&JK(juaH-JB>J!+IR$YY)KmD+K!eKOI zv0qjW=2W183;atH?nJR6ersDNukyWzh5y6!r=Ds6&`{mriio4+gA z{P7^Bv0qWwOTor>RsMz4JJ{iO^WA_R?)Q)TkjDKkK3mz(zY3N1z+asBWiHn3VI{f# zE=u~-vQnR8K~-@NV;}b?DP0t6pOUAeoU#&*lo)>v@;~}8y@S8MWBw4im)tYF+sWWH z{^M~j7Vq~?oS!$_A#~>Zldm$Lp6eJ=BrChyAo&lS?;IEN==9$2qRkf2-$0QU^c*bc z>>_f?#qQ~UL(FNw@um8;PW#*yqx&7x%MiO?|8JA39K1>U^j8qS{UP)zop+?l@lvoO zA3Tgbq|@5FVz=nGbl$-EdUte(H*EI9w!8_2g}Y)#*goCG4ncG@EXu_`*J;upVs_s? zI={wXsB|M*{T4{ZHjwdjLHH+~uUHqmj5=+2U)0+`tST$nPL5q&>@l5g{R0XXGe4q7 z{t$C3+Zi7buvoMVM}Em{2R}|->>KSCT7Opi6@S0gc)7-hbGZm@>7!pq{O6!{IP4D^ z-<(aFj8g_A2WmL4J!so5K=3i$19GMs1kHsU-n-4(%J@q|&gbNV%jaTCD}&dhv$&m{ zMWOEmzs?MFPdt<7$~l75uO|wq4#u7YZ|NjpW(U7c4DwrnKTzHK+DcoM!*6vJ@voIy zeUKP&u{RJu3ms}Ma)BUwfOB5gYU1i+&kZ?R)E(uH1w^G0qr*W;9`cTT$51zw}^A^qoK0lvAS<_V%XP6f536eX@co2F zPu&+2Dm}irc{QN)ZWr=~-|;=5f4(WIiRZbl_%5T1-}|QJvHbdk+eIAzo&$^vv1feR z#Ho3g^2@X1EmmiLq@3^_wIy__6+VwmE_vUwKp1PWICBvHsZZ>gTq37_{=^N}%D8We z76r@R!OMOOOdS7226VL2#`0ak3O4v^0OVqgK3e0(alAT6{kd3!PXy2RXjjf-doX_g zMiZ(WgR=)Y5-dWzJ=lm!pZHmFFf<+T;*q0W@3{2XLWl~0b-OHVPrWOnZXT<)hQv=bM=0D9pD57q`!i%mZHL>#zCUOIoZ|;f+c5(Rz=#hD`F& zK3=h!yaVddE2d@Cc%Q_j2Z%1n8SOfVZq?je77>X*vR1bPnRHQh;^~b;MbK) z{HnEB7$Lp|l91+NPkO}VK-wN!ql^72Wu)=pGkfHoMrFW& zJ0RR%#Fh7$VR#hC51h-dx(?tj$2;;Jz9vJ2#k&EsXH3!$ntVy@!e)JE`bRpHAKxmM1Hp6}HJPRZg)I zpBf(!r;DVod*>PwNzBdc$-v4>SA29oAxEN{!F`!AA=~kOQKC|mxj-0YX%OV@&1|2a zu9nC!(%Y}zlSsH|Hv7N4+RWDJG|WKGif;OofxH{eokoT46k^S}veL{ss!NT8MJ~Pz zmvOCN0FCD)e94@`W4%ioOr(S?)~LqcBQ!eFOl+1Pe2;X_jCmru$gwm>-5Tf({$un46v$QJj5}D<}19MXd5EsK2PATaoJ$ zx$02|wjtvQ`IlSW^9ZRHIOwB#?@@Bl4oM|K;(WUKuPf2J{yl9payf{#}XMD%;1(50IzJMZ^lq)S?Jzkxz* zx}#^&CgDq#a*76Gf8aqi3VYo{(Kv!h~8pyDrm)XmT!Wy7$RE)MC42`I1fb(yESRKAHHV z8lsRr5}ElOJ<1*PK03`_65{iR$>+-PJy%c%!EB)qLm6mEV7Lc5e>1CX!5;B zO|X$r5zx2&v{xM28{Wr1ef(>vrrDAXz#e{;#FLdG8LrbcoylmDqN{QOAIcN#iGaHB zagsoY^98ZlT zykmt6I-Xz!I!*6FvZ9Z9YcQ(CxRci9SryrK%#tG%WuY5hy1EM)O57T~+l8c(i<+9$ zmH0(+(WfSLBUi+*U%dZzfPFHFm7Zc9+-h_(87q=@CuwzeteX2C^O%A`>egJudv|FNO#;i_Hjflma zazXYnC`Qs=&ywjRPlJ9cCM8Xy=bj~se2gntx}U{F*xjl%8xtOOekXP!OgUvd2Y0Hy za>#izCafAf^8zwC<^+U6{z+@BO~PwMDMk5N{ksRcFMyZhAz3F_WW`7eNv6o1(0=bbyV~)%>w!m)OpVo~}yo7SUaimFKcQ zXIK5y;v{8hSA3Z~NFLpsIHx15R3Pyb94L#?;Me+tjj*ajt11B<)ng;-F@k)3Nn%W>QnnoBMKqkdFk-Klk)`n5ot3}*DVj7 zF@szo7d*7&9{_+TZRS6)vRshH&LqjC03ykmB#o@_(XBJd4f0nvZKxzlNTg4W`P;=~ zEDL&Yl}P`?t9mQRRYJzjRIgN%)g->_4B!?m5ZH}pFPm%wDWu8sNiISk`RUC0#7fTi=$iRh+Vwta zSwO}_4tqUJ2m}I^+;TVon<<2amNZ(s01bwo!pw!(e~^*gSxDvtl`Y>Qo5&@N#xEj^ z$Z}2HzKCoSBZ@s8mbH85<7=UVc3cxWZ@<>$7(7KSUrfvrN%5*xOGq;zKAjdUC0S&> zo7OKy;m374=N*`XRnc!K*Op)jDl{LYhIVjFL=mt|C)O@d!G4H7QWKduEo&w%ujsUfq?? zK{U9XvQ3P#BMhRUc{Pb3Q6BZ`YO-A->pW`1T5^t%DLS3Hj-=%8)}@uQjntb{W0fQ9 z-+J43Wm~1dq6{^L<#t7;N7x5Cfp(=UO12$g?*Te|d4Z$z{4w*}Igi1~n-EdusIsP$ z1&%t$A$C8Y-djh$z_|-;-BJai_T zPTxhwBjz6g^~Nr;RSt{qA0{-VhY7p!tVyTqKfy`$lvh3f38@hytMw{tlOZema)%O2 zb~={~eFg>|t=dN{q%#CV`-p=)3$>ShSno+XRrX{5K-5^WABEfknX#WNZns{mvb7ir zqEB~dT_39)VyiWp`YCp6FOAAgSUHbsYHkzX#wIU4dw_groGP{v@}H)A4&wN&352TO zA0)>}yT{yIBqDSjf3eD1MGms|Zo20)lA3UUc>?pIOp0TGa4}(Uw<;2Md8A-_f8?=f zA+bXc_5iyM^m>Fi!(N=}qsnn& zvApK1MR`9IraKNq=Ln^iG^JQL%*OiYz~kfyc8(fxf*ck}Cuq-o0UgY3p0eaH!RZbJ zx^)i|X!CET2-R|u%oItwht{7W*`%XKy>bd8PRJ8#l8ZDLtcm)}GVk~v&V~$=YoDY2 z|5408gzGo`@hllk?m%?@HCZH@x@a>?r;qDFzyE@?4?V>8`ikSB-H7KwZQ3~^6QlV? zsBraX)%Y#J*90F8`JSv!8vaNC(*!8n{b3L>y#a1^yQgG_e(4 zy7dz90OW)J!2_Xm=w-4VYqxWN`Y)6D2z~EY7hWL{nnE=${6{P%IZ7S&BiSyJh3(al zt7HoyM}6w<>*SnBGNJTw11EY9A3b=3bR}E7D!W0##BPhc@7M~&wU)Mu_myl%yzL;H z?aj*j0nD|15XAT_{T&Mh3&@jCMjvG5UfT60ITGH^JK$22W99ikplfGP&}}LCmDGps z_e>kVyUdk)kbUf->whKVL#sU%<3BF@2r-Zw#@s@K_Pgm9w}7eheKhMgay|NWHy5#_ zmDZLXWRu*z^OAC>jdxoPvQjs7FibYrWMJfc^Z|A@u)VZ*soi-1T80C1QLZH`_W(N) z_@MeW5wS*p_N(*mU?a+3=W{7fYT(&N?wK1jwGd#UVeH(lCJY!9+9O!5%25$9?y*VOY{SJ!iF49H;phz z>xqMpaAZUi>-~SmcpnP{9*ps)P)rDpv5KQ?hDeUwRsAMus7SK?bZ9H-1{n_tc!;!z ztoN!~h!if8xn4CaRKoS^rdth-kh&6L0?#oLC)Zv!H$cxvN?j3}fQv#0X&V`=se3y} zcV)wAPm|*o-Kj`_=O$Dsk4Y14uYz}YJVW@(b*Z)Tbh_}>(o5^}DlPA32p8VQb^lYA z2@S@_q%owzL+vrrcVvxQHFuIGi)8l&I^8NQ#zI&fprNr+Izlr7YJRL_A-yK~_mpmT z42X#=61sJ1PFD7_u^7%wVL41Vs?$$*2v?$%eQdI~z_AHmX60CieXJB$g*a)r+|9r3 z9QDUxDu|bkkC&!LZqs9x%$Vir^C8A;6|p{hfnzV5>Q=RQX^Kb$k2*O)vWUd-HEuML zRYb=x2k2J2q!B2;Z%LH8g*klu%0J&`UbY`{PI^62DhCvFXGSMUxd>hI(``u-gurZ% zpK3{%-34CSs|)6?r&s;1iv+SHdO7X$gfx(pJfKSUv*-U0Rq_do3Q{G}C?h{em$bxO z)e={wZcSP;-Xf;*`qOQu$EPlxyL7u_KZBl3Q#WZ-bhQ?@I_2G@B~vZ&R7}m@jmIy z5po^JqR3}yil;*+#&^1x&gdbfM;85m(w_6GEj^^MMCs^>Tb=r^q$P`@#8l23O1JU; z?Q!hmmNP?pNp~aa+$rylwGjy!`&gggz-KsUkR05@gogwF342Oc zNk0ktUj`2i`wRAFnp<`MMM@RPnkKbde<_2n4Xd(geklJZG~o8HZm){+E} zrvos<{dIbE05-ZEdMFO*k|=-7G{1WDS*ei7dssw(X6H&jl7D(>w>-%bQ3Y;ZHQ2KQ zg1ii8_Q!01PK)!TXu!_!(~3N4Ohk_VNoNL-(KNVvPAoalVGm2k4CG1oNRx+NA1L)D zOFT4T5GqK~)T%+!85}vlbP-$H2!4=*V_sKB=SvY{_$M&^YjRuxgNR3Wn@Z;mk>ce~ z*dQ$TAyU6Ep9en9Li;;*OCNLfZ0``D4C!JD2OAAAK!Tv5y`GlqT)gPai zrb7)3S~V|73hCjdGhdK)k?B*^Uc;n*CQ|D8pnQZRlIw1@Vx+W)ko7C6ag;P8CfR$? zP>|6!v^MflxnpQpl5jz}yklVK(l+&b*wBEwW|VY9BK_Rd`HEB{tL$!oYOhEm5#p59 zSm`iAF9pCP-(DkxhE1&RwEA%8j;; z5if=}7kx7JW423IFHFU7kRCd{^SV?^hUn_Na!ee73EPzhq)MsYw#l6c{!gZ} z3J3mtORi(N<+aRX7GK!{VR~7S*!}@@`h;R|{uj$&#}=T{%ZOi^WW*&Xvk|g_q_^2hHcTmN(i6?sat2JZZnY zll2X#BeO>OO?!_3fu0D0q+Y)FZ<0RT{ z3CwU*s2kEvOQhlaYHO~Q7-E?3rsk?Fgi8)xBHN(V1oanH z@W+bE!)^!W+p!o4UicuID@=2Y3wx|lF?j9`y& zjmaGYZc!qjzSif*j}d;1Y7M(Nt8)~fZt0Rz7&E*7iy1NLGsn!N$KH`%ByDw?una3` z2h0uCTg#-uQjl-eAk8BOyy}q#^o_g$4Xafc%6QMR)tILvZn}3hwiGxzweL!iB8mB@ zx@iseb?Po=2)vdzDR&o}6%_Rf?6%$nZbY-N3z~|MA%LzX*n7kk^ki?s=; z``1bhB3ZOhEpC+J3HcElc0HPrtp!z{1=d$j%&{xGnBuz&flCuuEZ0$7XJ2Qq`**S1 z-n$SS>|(!qcd>E4zmJc%z`;^;r(ljB5H|{Jr%gD+_$@eXvvg1-Q^953A{{4T8a?`< zR1>nODpaV33psP8I(n;g2Fn9HiEUB>Ip|eOwqgI0u^wvq2pjsZ9@^_82`neSy8R;{ z!LTZQKBV_M*;IWeyQ8ajcSuYm|JLZ$UD84_PE)6-(o~Ub!}+*dx&j3?^^1=syGYvl z=)FC_kFR>whEJsVB3bKEn=U*kRU;G{py7vr z+!~)&2OpB=Nb+g>d>yyMMj29adSW$svmc^#*VD~k(&*xGKA+P(?iN~Z( zBB3DDPDo9pmzQ2RA(fD+J!!u$q;BL_51sgh)Ii?#s39k@MoCXM{q9Q;Is@IbrWuD} ze>Yv9i{ zoeTu-hkGU1od^(H4Rg51u+op9ut`hKN=pgUx$d2n(v(G7fuo>QR;+y+EmyC71S5o* z!$O7OcnV*jxnD~^%G=mCewuPla*+GbravcbC#!sFw{N6=Vi6Ho3V>h$x{ zSux>eSR3IKo~?Mc;aQDmC7!gMhf6bIcX?6xi2dxLe3Dp=TV7Y+6`(8+bSS! zK{sy&-We}z17g;162eO5RICIYBFD z84JG;6$-wm3qxcpIptNigveOYKX}yYP`Rs#41^ZyqjEFY!9UaL_HsJO)z!o8<$MwR zCkiJwHS!kr81PmHIRPOvNcj$OHF5jYLW`UxhL!ykDx4e-ci2T>v81c3qvUzW=~WXt z%2Ny^|2wt83NYhV7{xa^g4bJmGgjU}O1@E-+2l(SjIq^<1R3JPjKkg z5Cc9br^I~a?mb?E8p{G_h*F%{_tIm^@vA9ch6>S1p+ZX{UHGItwd*2x-|-so$69Av z*|hOxnFYdDR_*RLq3^hak{;KD_@_tBcscg!R%UU}x2s9X@A%kcAgideul#5CH=W1>*d6z`CA67{p8IFs7($wg_a;`}JqS3L>$Y+W6812_j zt{}^BCGIC@OU5m*Sx>M~V}`to)OqOs40I2sQd=|SWn@#N>d2C_3Aq59a);bxn5{KA zy!3@<-4p3xjSy@YGbzSAm;rr%H6^afwPz^k0gu2XhEI~NkAB_ z#yfPJm-DP5Y+KkcFWs9b?V;ytVr%l zU}$f~CoDIi5&fI%T*#lZ?aM4M(MSVJ$gAwp*XV z+4m@npmH2C$~@;0;$9y0{wSw1CFZ%<%`6#)`XjJPv{Lop2sxLu`=|Sd(vs4jh2oAa zLVwF<2FYhkiJU@ShN)$VJd~un>4p;78wOi+G>0=SH*s0swo!6qC45cW+qk++E1TAl zJev7P7t=*U&W6VfU@&cBcLG@%S^cfBO7HdxejyJJ1e#D$G$cOqO{*MZ5av=qj1%mp zW+OC)AH;ke$b^Rwi^7M&Kc=;C7f;$wgOaU;#>~kGIkySyb#CL8sMwTE5_H69_GmdN zdJ`1V1bbUpmOkF;&=7k`vNIND2bVM`@sku?9)@DQ(uwox&HtsydMQmZ8Y3zR|NuQaQnm2>uEY)y0f9RIy`0__r-Xz zhqJHXRGs1PYdT&3itHpep;A9qULR5q1)y{^YN<|}#>&xM zPiZeg)@CWOG>Z){Lu*4!IX{GZG-;Mu4hj!=i|uIf2QV$fVp6Kmnt%IB@OP`vTDA$6 zJT#?LP9g&!EH0J%aD9k|Qh9qsdtbGKt7}ZXlBk%w_d#2R`)Em-+^5|w=+E+$L02|L zWuQg9ARs7{K^o~^dTN|JnH+`z*?6G0MhH{K%lToqMzj_hUu-SRz%%(p`W;ULB956L zrzZ6Ys#)~CCdQA+Fsu-}Ol~%=fK9EXQ*<9FT5MwHJ$9(jW2$lMogi-`KY7${6XhzA zG{a-SBza6^*JAv>9-i_d{I(*Vn}w}~sf9FYvfL1}5ndj+HpNDmZ;f)AaHei#m551) z|BBfGdS$XaGGrr6$Sy!S((>zzLE+h1Huz)~NJEk8x`85c~>6pevaNaUqh86lX_1<)O zjmf@&eHwT>BmP1x>vaDNz}`>W-Yt{YfwVE%x1 z7en(}=Vn6ywSg@R@N3La^D$Fs=7?~fljqsMW(HJcHl~gHLvhTJN5XeSjbGg`M_y!9 z{)$bQ1OD*zoIJ<4%u$6agekaC8tON&AH8b+Tk=4W3;^qE5is9Dk9v2J3=W{=p;H!P zCZF=qO^fAdlIT&7ESA@bT#{H;1N;Ab7@4Coct+ z@d5kTpSa?!j888RmwoxHj8D$l8xpbZJHx-tIS*}G3KHN8k9uw?Kl(;#BUin&y7#-U z=M7o@%*!)hE?o6OLs7k+{{b7S4XOWtwbE#Ly}XCiVJ9z_3oKF4bP}6;ue>y>_bMU& z!!lTUzViX*iLP9ZjR!l~3(Ms*wzn{qBVC5A$%=M=nwzWEYWLp-4jsL;17UARKdj~wjfHbz@739&EbiV5Wz_d9&R`g$o_ArB;vd1=3uIQH9m z>AjV}Q2zoGYn8l-6nW^`RX7pL6KS8-at29Bq%&8`4vWiu_gY#U7e(+RPQU+?&x(4_ zy44G-&LI`&N9KnF9Bzj$PwX3GeU*QKzL@QEy|J~#HKg?Pi!>eJ-9R*o8>$kG=@f>7=5s#^HC7uO^%s> zV>_R9RPB(J`HuE6kA53!UB|BIbjJ=X+tgn4yB%^C>Rp0keJ6kDxTB9u=gYfl$^|wb(jlTzPPzB9G>_FQ(cHP?}dmXNuaHfv9?$A!2mbH!} zimiKOC1StNXz${BJiF8(*($Qs*VeJGeDu3La#~muMrj>vgzfmd-Am&?k*)n;>uf!D zEe{)qG*5`jbvz0s>UC_rkHge~kT?$fHgFW&6yxV#kK@Tkm3d0WIGuoQ`sA5-0biDT-ucuWCE#54Qlg^^P|hhmCj z>iVC#mJI({qHXiIbr7G@sh`TLW1=C(;Azd*hGIDx@CWLcT<`{_pZt46mT!B#)1(OXC4gvufMWDIlvX8d${>_y>M%ZEa- zG9YUED7zAGYh(=?Tn2Sbf$swT^@~?pR@4iPP~)|a7VM88CN`?97<1cz$bG14 z@;9+k5rUeaP#aF0phJ))Fwn^f1xhG}&CQ8_vx z8y>F`5!c8vH6iYL;g!OS^c(qdkMJ&Tn5-o##g0Z637wy#vZYs|HpCHbOT+NRYvH&i zBqG#F6Z?hRmSojr3EfV(V(NPb%Zkt>$hLW@k3a|WsGLQ(tbKGsTEBDWobm%hkvi}Jqs|W3w z@B2@CX8X7YyCqrSaoLWBtokg$e$pi^UkLXmG4(vp-+bJ|7Y|MJjkp$`lH-tSg~UGe z+2e8?fh=zPak+2kQ$FcoM^b!r$8mXP=p7&j-g&G9pyU&>g&P4Eo{*;`toLR=Y|eXL zA@0g>&+y#zD?`QL09w(740K_tkFpc;SS1^sygmHN|3LJHiY+e{Dyvhzz`x&PLdRajcD%U&>Ols`i4B-92)6))NGE45#D8OJ?i;8a#xaM_h&#m zK74)~R$mJs1dcM&+}x=X#I%{qNyks3!j*TSQ~m@vVi0Wpwa8d4s$fd!2gk z$u@*W2dMSFyf`~cvz9n3s?y$Lf6+=xHUvX`v^6EygQ1?##M>&I`E?UW` z4Z%=?wr14zU?>(`sQYq4=tW;x&U?_`evcJ`GvSt-+MSX@g@5XSz(KtKf%h&+^}2D> zfEZRS^T|mDVhikCW>7?V4Gdg9*d-do&^7E!f0N@2Zy>PPOAivmjCN~Sou5q*?8AYn zQ*+m_MSeA3G9-xbR;O0T2AKS=fJTSGP$-A#miuZyqajx&WA3O6LktZe?Ot$Wn42F_ zCXKO|Ax;#z+?h>zG7x(Y()?tzGM$C|!`VSF$o}-^UDPSZnHx#|&FU^0QY>>SX9A!aV_w z9Xtsr!@V=3)Sw(5N5d6E2er;>=r55Rzj`*#unB6WF17jz!$Al%PN|M$!&QlV>!#gO z4O_`<@DWoDLH3|K)o>+JcHfLE2I2Q*;a4!f;Et*qm^VOKPs4h-0WKZXhF*qLW5hX4 zNPOA_|A>X9PKzSeHLx#1#`iTC4e0Z-fO@mPp;08`{IoXHu#CLqR+F*}N9360tioU5 zXy@z!uS(+b6^?Lt`CHB=`k_F}034QMum`R9a|~5Vd$>u=ailrhuy9XW$=XR_D{`Ql z9$f-ok$!q6$Iy@aB8bQ}47NAvLL8~P9`{4xuYw2{8KJJF2;1S0WI0$9T#qUnq4yzL z&o!h)JM;@d1r%^I%c_Ll&RGsi8E?fL2w8FsheeVH&6R-$P@+D1exSj|<&6G;hN+|s zo^J*j&XC1h)!e~`J`(BdRp$*cR2zt@(U89y^5uHgJD`sIt04wgHlI4P&@fsg_jUD3 zkzuPu5;a;o!qA7bhK0fiLptYQhL1F4Kox@y9f|J`e014J!x65LG4drtH0cQ*D&Bn_ z_raG|qI^+|dn>&@L-@8ZCOu>LwfN=s=z13Q|4Ey4ty3@!jJH!Sp}rryYDkHppp~>$ z4^dw#HSCli(N!ZS7z!jZ`46>hvSFkcy4=&gRV$lKplqQ>J@cAjB_U6{>6EF4wK1{& z2L?0d`OBHl{~v^~oVE8ahZzn{dEHPRJ@YO6Sp4k}p#=MH3?3(*@puY;qX%C%6p{p8 zRmu%U0uyo?UtzdmZuIfZw|#!%ktD3(cVCx*1$0F+&{h@MZ2;WC#a0SW^rCX($lMN=V!n8^)7Yd}{RDhIFGm zQ@6gVj(o@9Fp^PTx_*TrIed-R3hA1(ylrv;h8XTQuC6fbH+}=zZ^I~c(@KNiOwJdn zo7NeCx=(rN7h4Qzk^lCrv2DOgZ4uU3el8T^t8B|yz@tWgXvi><#UH67KQe4J66;nq zY>y$Nm0{1*VC1Ne9WtB{Nqw4ni?eAqhtxrqZb{P$^9J?yxk4*s<|#hswCI3anMIO zW7r;92dAmr14F6b1@>3ZYx%#o66W2ZxnCI;0qS!>G!r|yotgQq6GX&hBI#vLf*$`>hu~)SIh{;AM8-`rfcxM47t)vj4zrufLS|zAE zo}oV?p3;`&)UmF?itBKIK@MHQQ!_Pj`R-A?Dg88Ic^!*GlMM=~uVXP9M`|3VyEYqn z!?bGf5cqd17%-)y%r+YLM!*{&JdD95X!(PV1$?jP^s8fc!3&rL0Jkp(>LFHSZVhv) z*kEsO!H&IR6ps_N?uxsF7x^QwLafic*r#jwM#u0*320>~O1)>S^zfHjvI9&F+=fY!0U`+8t> zCI=f*2g<3xB#18@4|72Vr)nG_}Fr&slIsR9)iCQ#%*Ab zCsPM|dn=4WvmJ$)qK8q>`ivM{UR;JR5}BStaeQo_#@KQ%t95KJd873e&u<>1q2m)W7bx;TGu9#}9N-c8-V&U797unjK>u6OI9;~vxJF%>mT?t4l z;2ky?6Y5T!Sj)Z%gfzgrYA{AZv(}(lwQ$GOdIe5P#PagGD3^kK4`oo=OExbIw=vae1COAH> zh2_nQjw*a%ERi-I7CDysR@`RS!qC7KO==(FxEnkW-*%m z4Qy~Zyod(!y7;$TBcimM{@y4fI6TN>2$pum|7z(~rx6NIJpNFyEMCi5|EtccrPa8_ zAik2RNFc!s$5EWAhIjTu{}7BZZ{`O7Yp8e?isvKyv42vIIXJRQA>8MkuScG02hX$F zKNgVlk+YVqLl{0n5nF}Qd4AsTYQKzz^CtYmU(0^?%ed%Q7CWliJUYC$Voe1n02$^Z z>1r_PL5cz6{mW~$Yz*Sh|4%$HZvD8)wQMrtPyJ845woxv@B`(WBN_`g$e$Ai}PH*dmt_1AAe!3x-{NPg;>Hv)9{u( zqOpeiP@PDO-N^eMx|$g6WU)s*N{oI9?tcFnpvR5IDJ1J9wV%m2MdIFtw}%+3xvZjB zYhygg(&_Nl#&aZWxY{e!*v>=_|E%UdYCJBI_jEO~y|JAk>7w3tMNKRl8d{%O$d8JV z&PA}^Zo4X0nfyZNsv2vT!Zc+S;*RNRLA0?!4EJeVt}!qMRy~Q_ON#4XgnQrC%0Jytsn%Bo;xbnl48D2(_S!IeH5GzAt8WotHAY z{^jM+ABHBl-PkWIL;G)>rqSd?v zTak$;>Ea&77&7=I-OAtHPSR8S9d?r5!dtwhwn;U<(m|}I{~Bcci@H6}2z3Q0!kGsd z*OM_Gb=x4grz308u|YMa&l@$7RBxtXsm4_GyBCZhDdbsAz44|Ich&} zsUBToOj1Y&SnnSi&x&Lul&}AVmVgU4b(`^wD9`2gH3PRB8xcC_SMP4;P~Snaume!l zx;k|ykATU-Kot=gntE3amIIfr9~&#OTWN-v?#(fSW1bVY%*?6;%i*z{BxNo;3I4ei z%)Rc4*)|taGQob^#eH_qg{vvS{!4TEv=H#ut@f+nIn8B8jV{__RBZRbgZ=HAZ2k4x zT;_rqh`oP^;KtpeueFtsjHi#49^YfMkr%-2+GDiXvr(3@S*S?1OAuAYl|YQM&+62` zscq`iN;rqyd-2}YiFW(M7)fUIR~?@ii$lmb*pGc?yd#onn!4!x!~8B@vEu(CL1j1PsA)Y#;xaN8XAsaw5q%9tgRu5LBC*|;~9Tgn)nnaYDD@5xUmmv;A~84iVV&E6Dm_vM^jUZ%ysgXtuWn$Hj+o3v&!_N zv9cVeT$N*TML9d}pY7O&_Yr@!gW-M9KWZFzJ5&zKU-3Ez~cM<6dUUAuYcQxN5lTD6a&! z?=k>q@DGT~F9Wb#k444l_%79B0XPwk$I9UcE*5akV0eTc3%JpGIsBhxW_;7ZoZbhf zN|sDJW*Z&S`)3^Q5T5>YG*U91nBQ{n12ZxJk={ERDVZB4^JeTpUUlp`(!|1#%rro3-_Ou_GQu)tKlz(WtLmu(avaP0Ua>cFg*lL1~Y_wY) zy3O>Rk*tNqj%xCYWRp)#{n#|jLZ(2g(`8~3ndVVver3`^;dfGddJjE z;MV!v9a9S#3xxZ-3D_H)5Aug;q#?CcE8zxxd7PrON4y7qp9QM{zYxN`;dNyPylGI-=ojL&IY@onNtm2xk2?N#T=b{+H0`O5A(c@JW>wH_Hne1|L`3U{1=XTz`a&_u^*vc zte6wRda>9*BJNAc%9G3w@3@bd)8j9?&8V@xVr(#?O+r!#ChTK-P5d{ib7pT7;BP$~qDH|s92<|P zUD!*FG3I{JUGxrc;a8FM7j^`)0egwKF%2U;9)9BJ$QW~mG3|S^P`j6|k1_X3O-6YR zJOy|fzcUL)L4>T;h`QS=FER%lQI6^QNb@U@{}>?4vMW~3Bn$6k9w9we`hRM8)=xKC{~uxR0TtEpzK_q`E!?tuDFV_&sv;@^HtdRs z1ysa_9c)<}K_qqsja{Qy;t;H{MX>~pdW}(|MvXCQ(5SJ+Ac`2VtY}<7*!?{h%;y_9 z|8xGF^YG65&fMAQ^G@fzo9+LfB>aEjs*iB}_dDH&a9of0@0Z>*mHoc_r<9A|$-Mpfwyw!IpiTUnCN_zAk`RjBWSYEW3@KTPKR+NK z&gzX5rrrD=C8$#$$>wfW&zMXcy?>MtkF#;AqytjXpZDV&?lU=nPthiui>+*a03YF` z`b)hW!sbQuUi#I^X6$*t9Kic`w3fFH}Pu4DrO`N19ES1GJ>y3gvCY(8RDRbd~m zWV5+Ss?E}Um25s+nQYFg+?|+=yN=R&q{SrTHHc*Ms>Ue`anOz|JH*Nx@+s+7=%%?(%($5#*-Xk?dztHZkNy!CRwtXgmml{`A@R7IgZL)n z;z0Wt(YH7OXCI>FnBoL)lM(;jOcS8U__gS$ zO~Os$#Q(dbln-1ExG71Yo9Qz4%)D#+`i} zk{u1_qx~kC({RCG@93^k*h&H)``h%`S=u8y!z~Hxx|6Ut!MvNI9j}*TM|^VF*rxmf zbjXFM$4z-0Zz*N#n(>!>CgF)5b#q_KqUh+Rrm=n=qq`v^p5Z2fV&H5`Wo~nR0p)Ot zOxu!w;@rNXXB27l?pjpzFs#hafYabR%-WLgRY(4#x?9kKV)Tuab~9bH+{eDj)6q}a zxCp)tSB6cI5&X;`2}7aU*KC%*-cK@5!W3~3LO-q|Y{Dc=YO3w?By&7$OqHx#E50Or zE(T;CaIMPn-#;=XVLegZV6cHCBuv7CLcaL!L^(F$#7fr$y zLzB$Wm^Gb*WrIoP?iFlN8@@d^?!9uM4UhGb)3|HAEg#DLhO^V{KsV#A@pgQO;Xt`2 z(`Tds=`#;o{o6sU!CCOj?f46B-21WhNzjIC<@J9gSw)wY*^wXL+HBd^SWbJsH5NhH zllFXo*RIm+6DY`=?bPi~*g2st9V`f?zLPLmRO)r$@hZxRO?Kq|k362jwb>5CyaO~B zbT{ZZ&;!6en0su19n85fXMr9DT>*LwGy`-ca02FIpr=7qzfNsp&pPtK+`}^F+6lD> z_hR(w#D}Z1IrBU5y|fc?fS%px#2<2cTizpE&a_|clvV4i*bNiR&&yd>B%%uq@MR=_ zRO3`w+5->6(AD}ZyDA5Nma?PK@aiXwEu(oH-@`c-x9NOZMV3IPC=UUK3D<{bs@L>aqQK zZ`y$^gmdl+-lXc!C-Uz~RiAJmFk}Gl)_ajPr27P1k0fCR+S%P_`UFfmw(^>Q$L}WM ze6df8v|(eFG!@-v1mx`@AF9f;(!8`)He){6gu$ja`*Hy9&n?9!-T}OKs~MHfMTQR% zn1UT;6UV~aNb+2i$z=Vr`awg(D0tu>r?YLyS1`r2;Uy}+qSkA6B75x;IOGs>$CL{e0|uE5HYGX zdo~n`NSoG79>#C;aDuy7r!9q~^0qah#9`~B!A-V4>fOrv%-ppxjuiA&S|;*e>NqKa zT^)n;&_=LlWB9@Jh0Zx9FU_n_G*6keXWjwi+{!=8T)nkK|}`Hg+-}&p9+_$0s9B zLUVQta%xsurSip;`>YwOmxee^Y{q(|p)ABUW0%qpr}oXP#cv&v6LHnKBz%ZdL^H+X zGoGW=!s<-r7pp;^%6ABCX0;;~m1y07r|;210w;j{ayx<-2FZysI}*!;Y3NUuHf7P% z5TdN6EPEP4w7MxfI*lL9&1|YTP3PNdxSVhnKZ~F5u{6B8&;WX`VVf56L+DFZwvg{YA1JLB@wIRcstN10nD=wdY+@~T zAd3pz92Q}()YeBniHi!BH>X=Dj&i(}e9>%GaZ1?8;KUHhd~v%I^)o7-B8fhHff! zIK8Qm$0y6|KQC}_SW$4chI}RDZjhe{VP}`|SX~KW;&R>^J|6DWZ&g3k?;XgBf=hKj zFBn}z?gsf)$cKlp)+>9kwLLpL3q|p{9Ug4A*(!<^{TKXkI}Y28&#vSByqh+%7U$Y!7apsfT^QxFsSuBh z=MRnBR5;IZVSb}VjQf%wug^ezADYHezvM&cIrjCJ{CDUi`mg6Fa3>lnXV>%ZINgoA zc4VS*@+*Fn#=|KXX@q{XaZ%TDZJkcg8ySDQF6pJ!U@7?fGnd3S4Z1 z8qVk$^j)Gai#)@R=iVM*2hQ;AbsM22XDP4G@NMiGM?nLA3r#o$Z~&Zv+#Ki=fE&zl zpriL7<#yYVG&blL6xA2Xkze?xxIxNWd3Kq%qqHe2xx%M%XX+?puksuxFW82D;cMtD zz~ir#sd;<>ZaDN(2H)VPX=w<%ejCNb-;>q5!=G}@UPX(Y9X1t`+^r9F$dYX3pF8{z zkuzs0@sD}EhFegZ4K9M#GNU$IRKyS9M%88yiue+)UTx+2Qyyp8o4K;==looEM^|fc zsXLVam3E{VkoAQf$pBU;VJ~ulSboO>yVqOl5$T_tVgm$_y$X?z5D6oUo3=z{XW4 zi~^ad6K2s0<(*FGprNHo3qe?m)=ar13K#6SqXxFdNf^#;Hn0*WA(&fhz`cjUNN%Qq z&94RiQv*9tO9IPJg%y|x3X~xN?)KvW)P1*V|!OF(R3LYLUAw$FYP#3!OVKbNyesG&|gl&!$TDye7 zpRND#|7X~n*^5}Ae)|1Ss=b3U{!sPuHo^gY5mqwhhjnZRmXCI-ZZ_Zd+tVcNP5Vi*}{~IPX>}olF z$twE@p7c6%j~D!fU*IAdA7bEa}hw32D8u=l}BM{`G(X`kBzxZ$I>^&0I zkmlY-=$hBd+4j!pNKFJ)D5ah!wED1lkm-Sb|#14)YYSn2Ak+VOPxWwuT@^4}1n{FxeVGl+$?GmWVynTsM#|mDQ?on=iB9!x7n}3w+DMAkAuDoS)Q-#HpG5r+b9XIJMvrZ9?bM4=< z<7q-YuGw3>_9*<`Xcc-k-0L?Ta06xoIOK`lg6J7N?Z^Vv3=D<2ney;6A%GK>L)(Dp z?F>bpE==oAJF-P*gcwZ+JHj%472K5PXN2!-(;#fI50G-cbtvLZ}@v9xc`z7gQIlMq3|2L41e|N3Z)(_dM{~3w@~z>+xKOrkC03=R$4nms>37x!^6HyH$x`tt&i#i(Q9xdhQ4QAn0x6 zCf^ZbBs2$ZNDCumJi_Oo$~vN%Aen_~lyDiNxDj^RP^fF9@1t6Tc&L7ERsB+B_?{S>i5m`gB;MMAeS_Cj#vmLhO31aEG^Eq3XJ;Nd#$gXa{UBmI`Cp3J(% z%3;SP-(s#WkwMpB2-yiT!9)^ z_#-w{d6+ZQh?1?3$cM~!y~W1A5_8%4hsdW#nr?~BXEYL8G!j}Aj@s81xl)**H%J&~ZPOF496fPU7HY&=oE-F(o@A`n6LW>0Jg-o8 z=|pcGx96&IK@>f(q5CQ;Fo-Lul}$E^9q2dgpiyi>3zUaOaT=xVltK35D2?Cl%az4% zU+YQTg~ffy5sDX&H8B}vR@CVPQg!?){sDX7gpDhBJKm|57#V#oNnmv*dB~)! zuGow8L8i@9=R7x5$LCuk_?ZrJig9-3qz{m=5#;$33oi71n%m zRP-j(P`nQJq{xjW1&Z!LPjQ(9?zniM#$F#od}c)rHj!X1@7_etC#$Q~^0LbQ?gO?h zP@EtXBO(9N6Tf2ST2E{Vow!#$G1%kiB`jp(N~(ULDP40un0;XO{*|q%C;mbIWaI0L zL+E{Wp}u&`e=L^o#*B9}SuNA>T%EdLS9+wbm&W9b#X2{W5f9k)XI}@2F|>>FB1p_q zwdO^Q#2=~d4?T(ggY^gz579=fGDO@$|6rS%h@MbJzHcJdZy$fXDhqp%s(UwWmXp|q z7x_U(Kghm=EVzbj4`d$KnRlqT#28;j8td{VO~^;^Mk?QhBG@#G*@q+hGgyak{8%Gp zNVvF^!w{~pnOGmQImYHX(4`&EfMfNnf)9g2D%Kf z=0<9MKNU%T$7K&|k)HvTmOhNO68)tPc)aE(9Gk4Pv}R3OiN5v?tXm`P@{UFFn6j_5 z_^}aiMIG4Zt;AoOxXtpdwR&AY zm(6J{_QhcOT5E9%)vzvY#HLUsXS5N$gkSVzAMzvR4`p*3aU`{SyAuuRk+W<>snMPJ zv=evJ;mR-V#9|FS&yI8w>v|q3*Z7g3+`I!toS(kozH2eKzd~KUt+eb`UUd>3sY|^i z)T%^1xdEE^wT{FAGIQxHj;UQx^|HbJCpy1-PYm7dK79BGTisc7X>z&D4nC7>7oMEM zs@j?@I+6y=1k^G~OetNHPgR#s^~$ut>}F>q?ANTav-k;}!p202b!*SC5g&D>ycFl2 zPooH`I~6J{32Z|YGCYwfQDS4qrnX!>@4V0No46-&`KAg>CzjMjtmWuyI|lLL|B0Ja zi|uVEAU^#+ah+;$rS&qzdH)kjRpREw)^iYF{GYfCSHqY7FFf|R=cU4O$9fxXZv4+p z5!=&6Y#MlX7;@o5uvKT@TJQTmi6egbczyV>e_>Tne_%9PtmU%7O8o9aoDT>8T7APB zM5EATSSLl={OfeyIZBP%DmExu45Q9$d9>JxW+_*q#RVMwg~fLl`#S!hCme8ex1Kyb zj!tN|a2TJ#xA-aA%}u@0YY5N#p!ot0DTQ&U*HmO-@uH`0 zSDc=#SNg<@Z8ZXXya=rPfvxW^w$#BG_XF;d5wF&HgWVkbkyx{(G}1e>Q^!c1zow&` zSGDXPc5;CDYgl9qnn-{@Qr{;QuYjp7TImrxJdfhyrSj^w7t%<3P2F%349P0?{Xns) zG^Z4e4o(Zlnx`|%K+&6i&s-D4iO%7rxK}1HF-a499Sd{vem&WJjIB=)orJxNyo5ugT?LClRX?P`g%J3Z>z8)e5wUb-A>H;#+Y4{Izz;UR2R2hPcA4uhl=wk zrUZT)CSt0&+P9cv2LsSWmk)=R$IC=JTM&8 zlb5-AauqlV4d5u~4qy$C3ZxvV*Hh~?Cu+Cpy=5WmG*ax;cxI^&4jsGnbnR6wPAz>{ zTRjfc!!|c69LI7<@XI_B^gK`fq!;^kq*%whf9ai~*6^(!AmUd_zeO1VE`E(Z@>}KE zNHI@K`>`KB5qr|cieM6#Qfgvr$BCor=Tvy3>&>3vp1jp9Yt)iR@~7KaPe^W0D7PG{ z2t`Pq!o*me@nZAPH5Ctvh~JAMRkWhwI5O!FN@KttJ(-)0rVMnZS~`K&!0z2_{&;Z~ z{fb$~i$e{1tkb^Ddx?*leZ|I35ZmaoP&%{Nt_flY{ej(_Ahz;4{66L6-tk#o-xqC# z<*r@m^?=bZPu#_VCyLV%i|rG|F)l4}tH7BeTq|3&38$XcMc%z#ZrQ}@OcLvdFMVG; zKEkV0bXHfb_pQA1MK)x`Tc#(sck0P;U?t2Mzyg?4fwnu9sguOflt!?7$)dYUCtLww zvm~M=h&bsn_DzwR6246MRBRcn-X(Cai1^$=B--xKlk6|`#0PXea#{~+0=)$s-_FK= z3Uy!=Yn%cfv&yPFTP==f*2blTvRAofIvbKAwyHh3tn}orq_IiG@G$}lt?E0Q<(4?M zH$`kf`>>lS;sow(28*05?ox}_WU&oK!hxwcd5Ekn*vgirim9|6t4tMZQ%}WZis(k` zZPk-y&`vXek-+WE2oz9?LtuLB0e3Ui_A0Z?W_{Dpt4wE$)5K9Uloh9;K%-CnObpPi zLaa8k7N0@WyEL1P|4huJrodFH{cFBRKDv$9_%Hf*rDLhUaij{IaI4UKtPlaHy? zGPh!kiQq+vQHfSdR{5AjRklnSwM;y3SL>TnY*tQjI2m!IGZHszLaAj9YqJJgMGBj+ z2K~`cwssA4oC?-=t=L6=h5m@kt=8BoQrNDw&>~V4r*+~IN^i3bUqbb|&VK(=EThAe zE9+64=uyQpOI)s}diKp`(ZA_iEcWA0OYDv2aWB-2D2t^Sl6O_NM5)~4_i7ifZhhMk zr6XCu8l`eGZavoz#iq2Yla+$6#d_*8n6MqbA5aEv7eCj~aCUE(=%8V;DoY2N3_?t54Pw?<~w)? zJoraPb^s>euyS)hGD{eZdI4nhXD<(kmxNe&?E?^Y=38-!uq;wfyxn!gjkU`~M;)vT z$`wN?CQO$dL|y)ceSc7FM^7`$LGc3ZqntVSd^2Nf=9~b|jXW0)wh|Pu5PjtlaQb(33Wj}~RIPP>uHsF-F*fCyD zRsd6hu|QK9T_#`j?KVdmc-V2tDo4^UsOW=65mgU|W6?JupXh{3o%!JguCVOi5ff zH3MUNGW|I*1I@P8Y=Em@&L^L0pd7J?Lko+HS^vM%7=-&ipJ!IJQT7j@8bIpsj(I z?U;BG<>Q_bc2O;oZIt7`h@4J$F;GvEl`~hxAMMf2&3hnrrh}C855#_)4mQgI6z_*( zimDx~DiFJ<%}RmzHI(FOkI<+6!G3up-l5~!_Q$9W9oessk)z?P=&@Kwh(50)^#E_h zSSWgGvsfozfL8SC#r!Vu^$r&tKa%&Mu}_$L&e^rV>kU z<&IfQ;gV`$boGi79`v1)o;(1q0;ho-APblcBm(__2*3*c>?4C>I)+qK~sUT zKpaqN(~U2U(%tv=dGsbPG-0Aw%r%uIQ5LEUlTao zTSpo?;V6pPa+&?5liJV&%u_FA8_-ytUO%*GJ?H~=MlX$^7nrY|#Aplly&X6cbLXY{ z^t956m%3665|#?mV#gkLwZskZ0JMNB^A)Ae+)IlxR+QG`!sU00Rg#`)r zgL3uwlG@~SFi&9fe57w^ZKZ*)B&k!q&HbbwsBZolEtdEG@t6E5ZOPmNrMk2}YZWMU z)#d%DCD+-)KxrW6BmWGPYGVNKPoT6xh&ZJs97o6l<*RzqC>r?omX6%IuTytqA-D4@ zwcRyd&P`oVQ2n5>9I&~d+ZoDygQRAt+yjE7I2zBs36f%HBzqGi?NLYV4e+ynvXc#@ z?X)vX3YL0{$;Y)M3wZW~9S@egoh!cA;v%Vqx!yQhZI7+l?Qty$dmbzW3BxzT2DZ_x zPD5$AW8ClPiEv=()FI?d3L#UK?;A?fX<(s_h}gYteyk(ezzQJwn3hBU9x#`u;mI0> z4QMQF&|=~;iv80VA)LiJg-Fx=3UpO>0G~!NUPrXV?;(p0l}=MLvkQ}&pc8Ky zCWSTq@jbyk>ZT;;DUH%-?2)2kwq3w7#kpVKfV2t`VNo_pHV-W<&~gh>q@ zahnQm*pPeJEM=9B`R&b1*dJk12#>C#Cz4l-F+WpK)ZV<0t!gTT zxc#Xkv*GmOK`og8D&oaB5fA>HU^kmeT`)`H*-RQn)0G*`q%*YE5^MKpVSIdaOmv^b z1e3?e7ia@}wveKN;EVb=(?t{@5wp=z>$GJ3Jsr7tKubgyLVlhCU-7<-tMYvdX*3PE zi#8QjZGr4N)mfUlA5Jl`-2hJA0T0$GLR#W@8|npYB7xicwB+eNb~gew=`I`IO7f=b zlsT;=#b_LU9Qr~*W3u!-ftJy!tEAQP7j@+6&pHypdd5f{ble6l31zEer0vF$*(j7i z98iySij_LhXf`iaYKoreNUYREmk5hs_IIr0S=ax4qnK^uvm?1{k0z3ap7&gQeN1JR zMeqGhw@uG2!OXuW63LE@>xq&Q%1-u_KBL=|roALPidBO)y`|1j{?dC(EonYedP|+K zwpi9%D(0T<{3P0KT^6!jUF)XTZo?m?knv^OPeU2$nK3nT6Sl?W5JfQAID1X>1+%u z5r}c@;U`je8pRr#5WN64!6dB~4lU4V|%J~V>ADUJ#XKM+Wi&hcz_8fc`t0A z#lS5DsZwv3%;q{W9fN%cW69?HF`7qqXEUqr{n=TrPd5Tc4^U zE!bx(&>g-Tg~%#rR-o{TK`>V!0iI1^b5}~+^if_I#!O-LR!J)Z8@{L5S8msx`URnS z#79~zJIb#V(cMoi&&u^)7mB(iA+MD?t0YHCA1lR~Xd{iLWL?$#ey>C=$yNHVkvui- z?}ls1Tcp`jU?_0ah+!0vrY!wZ>Z+-86)Ch0*a$=eD&VFW&am6grJlyja=0u*xdC`(;X(BLy3-wyYV7+%(i^%=+5es7qV9S6 z>8P|!qESk(v(jL_u+BwGZZtp}qa3^_#b`0ks=O>+qqIc%?W(lj4y)vIZb?7u^lPp` z6Z%c*abJ3*p#e%rzSKlZec15F(koh5=~XCs^SU&hmV_viU*P9-cQslvm5qBPP0_5= z=-6Mcq)G00HIyu?)R0S{0e3W{2h5FtaAk}cjq>0{D1zitcAKpf9Rh$?C~>*p z-^>L~1X=(gfGa`RfvZ3_z#E7Mp4l`c4%GTyLpp+1ykfy`rTOk_Am41&kQ;zE?A(B( zFt1R~zm=GVPG-YOrH1;q5I=pdtSpssIGXWItM`(ibHISvL20iwU`HwD^L2(Mbh^@5 zZ>X(vO2J;m;AdKr|F@PLz$uK1zm)-!A%_$4pJ>Qq;E*E7SV_R{nZ7QDcGzLD+Ql#< zaI1C7xLi}qaaqxSS#qtUvBy1suZErL=DBtwzJ564*U;-PO95-*YN(B^TU}iZfsQ{} z|0<$BxR2QDWl>6nmYigBTn*E>eB96LYPiQ4UZ4v7sUc&Rp=VJ3bT>#`pwB%Gxpfz* z@eU0l=v=@72>1tG9C9EZXv>UVhB`EpHS{w4LmM*RI)@y6b1gakhlYd#FK=mxUirGNVHIYQPij!|n)@1>LT?!7Yxo(X zsW3l7SL}$I;b&;VJ^P*I_!-*MF!r~fAzjr~{0)KFtGmkI;DY^bJN*q)oQ~hqk|ht( z;+WAp0k>Z%!2yP7+F-zaG!V~Gh5%hqeI>np!B zFzn?fc-+*I*!Otk^E9pn#78ghpgLdHkb1yqjE)YYyU4(rKDKO=Lxt#xfcW#s2;lA| z4H+~Ic6fSF{kQwEmi%SuRq;iPoFlBkBJjj~lOxU(lAxJ+A!e=eS0lrZ6#B%L5W~nI zxYgoY9yH-e_1I_){8j_32Q7j8;dDY0lm<-7NLAq7X2L%j{JC_Suf>w_8uJ@I|EAsNnn9GjJBoE0KE@Hu2aTOHb7fm ztE8qHEPCM!C?UYp6-w$1!y2B8PG|c0hI90}^6Pv83KyrJY1^5=wr-YgH|h`=RE$8hC~cd zQoluDb^W2C^k)MO8V1uV?BGFzOZ~H@4NWh{rPigvE_X;stvvNE;oGKLmdmBP$33tt zEuAn<<<2WF4jOi79MOZSgPTL>HAe&Q;*@Pi47~*%ettzi_U@G7H=!@OcHnH(H&=f& zP}-jTb{f?WtIekkU7%_=JY#ToU5_59M{5nSK^fc886N;E`YMCZ7_v0A8ri~PdPH}O zo)tCd)4`wg8GXajis{Z9dQ(T%|2%5@aklBa!Apm3Xl8Ha6pWPiV)rf>_SltG+GpLc zyi=C{Y9G02y1?(-6~NXuDiB zB$W-iVrWBGDPLYOC`P@{4Gk&vRpRd%4sgab-e}7l(JjUE8NQcL2M=Y~-_WNuiAp{2mRq_`>6VAasE$~c>0hK|Fr{l{A44WqV< zBdPB=vP?$5sGQds`*K{mm3i>SV_ZQQyTKdBav9~UtzcZKjj}Aq!%>29E9dN2$@!C@ z{&^%Id|fDRjE%D3EZ2O4vFZ`*-3DWj%OhL6qJq~Pi9E@XMz1)s8^~sb24i#V@$xhp z|KieYN`=vw!s(vB|h*4e^zcf7-O_97xFbE?FdIgo^m7@SXRUlFQvJQ@efJp zcOU#cj^rpVzQ#B$?w%PNXuQYKVkI)jSj&zUDg&ArbBy$kLfaV&IYhargR!|rcl`uM z<|@9Ojeqds!~y6_4|2r1P2pmVr?^0QD@R&<%aIFPIC2Ze+Bn>-V^T)D^ zfO_<+r2#7&Y5WE&5nqoo?!+WR*U`o>Ew7i)c?aG6Wh(1)h%N za0p@lSmS4uu4DctV^egc15L&TG>6SI8N2Cn(8cB`S53xjJHJzdIg+>v9|9_M0RMa? zM_fA+auwr$F?6yq++VM;AL)fkO2=8RNhQsp%3TawgU2 zg3;U`sm4HzuPRfGzSs>?cZ%^ldV>8v#n_1+R9w=G_cUCKWlG63V|$IUbSetu7aZ{$ z!;y7LyIIB`HFT;{IoD`YHNDD3#@{tgsdKrihGWSrG@dgxBzLA#u*?{*)t#%W!4a8O ztBfPGx)4td#!H*l8Z&Sn8yzaNw#;!Hi2}+^97&#}A#W$5;T^w*VI2KUvF`+Yc4Pf5x}OkJkOafHKUQBI_WED$M4h~da(rO#oM zbzyiA5*^=7S9TsVPSCphwc^Mz)SS_9r_MR5zcaW8hXtbsCyo9(-R@3m&h|NLWEx$T zJ4enbFU}jgXz3c(^pf$sZ~>p+0Ol+7R|L0#=mhV=IAV%Guw6Lv7}(m9BWFPufKCVE zftAX<-;5)4#ujjYy`u(GO{lcWiyOvoG{${sa_TkUNH-u)`TDkTmIg!KI`@r%+)Jwx zb>D~sD~~Icga<~R);S)CLV+iHmI2R!?D`xj1?D22xyqcsi~;I`&$fJHkh;c^kMhu5 zF+Mc5(Yt4tQeyB$N+H&2YNZ)9WLI4deQr{b(O%Q3J7w$t)fh%G z`RXYjp~0m{(AiiXa^um&BB4#7et-|;$>2+2z6)Azr<7B9K8J;aIa=A5ipmzP+#gpm zzgOPb$z!#`0>q^~kiy0o0@sf_$b& zOFpHc$;us9ScS1bc%H$Cmg zq(<_7;SwNusi|wTuNBPd2BmJWm^D!Ck^!JNYo3%anF- zBHGIxgSXp~o|NXnzipJX0G)Uo74mzI#9gPP-fxtA7HqTW;a^FfvaP+`OGlH~>&|k^ zz@fiV(i&(6h(P#d&`Xp&`vqY-gbI8SMOWz=B~PH3x%s|}Tq$2F)B44C?-o5HD%5hW zjGc>?S8~~9tY24oUDwnFl%(R*bDyB8`k9hnx>eei4duvfc#{l%8#-;g_-Bg-%^u4U z`)tF8{^(BCCob<)Zs~5o@$M6rNTo?P8IOfVmn+S>%PG`l*Evesq6g~t6D2Y#BN@nH z761Dla!;xawctK+F&1Uj$)?1{%9knaskrx&J!zdTHmgO0%hu!Y*$zae;v^CVxD8~m zKE34;P-_nMmTOaEI7ALRIPwhLL7s9mPX0;bV#LNiic1MDm&phi7oY}B!}j-+{f$FU zP_pqjB~iyHiBSIRCl_n#SYf^oyj3Wfe;B_6s5AvID1`~~P7RlDRaOj@MXr{N=^=Wp z(voRwQ5ESQEIPJlxco`FwGW4TMUYXT6$dG?gjd>*Mx$l@j#iC0ydgWB3wvM*Q1C4! z3qVJ&sg`ep`7LDkflI(~U>A@D5LMumikBj!p_TMlgD#Y@#l08n6Gt`4jV@Jw9+}rnT$w)aReN<(o z#kbzK>;UEh?Sa8SH=r31 z036*wN&ajEZ!gNX3DL|!!U7$^%fLn8D6nfU^&o3tcn(W-bjEGw$WWN|0AZ^~$+b8m zuBR9!w{Y-%Kcu^QFUyRmxabhevkLZnld;sudY%&(ieO~$!<1ojGS(qxt1fndUE6v3J=!m#>msSlCDbfSUFW_kTC>($uN%G z@6C~UD7jAC5%BI%WjjI{Kq6cOdO>zu5mMyOHO4rYPb@*(j7W>hS5xHQ1v-FDnj^nZ zH}}q!`)C~9{PF5uCMp!LdpO0$#*_2pAGOp+nX^b1MCz(6&XgUg(P=(<(F{t~FQJ&R z+PPZpK(Vu}aE%$o@GRtq0TZCQ>xO=2 z-5^wOm}3*rZp}d+DL1p_<(hUE(;s0wd{Oyw zn_SG%E^OXT`P;C(-YD@vTR2yPkb+cKfBG2seE{DR%0x1fZ6u-tFGed#yW~}z?_uaE z$HpNkAkzZsH}O5dcSrI~K)a1ek-a`BkHdztA&2C4*wOjbA-Om0%Kkni+qj?@ z_Ut=(r7#l;<%Q8|*_wA)UM}2jM@bOaOvU909Meh4n4|J`sxGx0le;!{hIRHRv|R|4 z47#WdCAo;)@z&Lm2u-3S7%+iPQ|26#zoRr$2|F%hu0o@<`T?Dlqd6W4)|irz5vXrK zGiB!qnL$fo?M}&m>7F!)cZ%TCqjH2NMv;~?0 z|8~C4FuStApJab*Jn8U)+CQo*;U` zvRfTWO8YB*7i3x6_$-RU?S5$4@a3}x_+3g#D0qDs^4J+g60*>~Xhwh(W!NS8o(26HT*a74KYSx;3Q4)J0sKBxSc+mv|&M1zAb^wneGE!;$o7|Zi(~$k`gE?}m zfjY>YlPA}uIQZ8byLvFEdH-LuRWt4cxPjg!i7mY$@2TZy z3-VI0DRc2XZAr7`o4&KSvo1H~7_4xvzA4|qB>99}@(eEUdRP1^&<{}6P&d%quL-#h z9BzX8;);67gga2}99Y9U^5^t1`}U5!P*oxC%0D?KYbm)Ng)X9&sw+azP=tF31vZoU z-iIc_xdtjN{*(t(Dk!TT$e&S{ZDs!Bh;Oi00(J=gV0l%p1`V51^5si`^)Os%fhygc zBNKt~Fh@dm79)v60T@L!<;bEyCO(wwVUJeWL%B~-Io=(s-W*tcO2f|UQW0tV`r3mc zyLvB+I->15jSO2C#&RCY-oa-|XGbNPj#>V}8#_VRoamqUo#jet#L4P!bzbV8&m2EY zHH5K}hw|P)7>5JVKzkq@@B*AeF{1H>Qh;%Y=&hVBfZ~Pe^WsOch4xS$J(kDPVX(H@ zDs4sNo$aX)hAvLiVzz=hl_LLVv@vJ@2u%pQ+Hu5@O!9Erds~7?Nvjd>Z56dq4qKrw zD6L-q_lCJwCHjsw9`25)q!!C~FZ0~mwQSjY`B~l9csQP#A5`!?gcxcrue$kH z-8w^Yr!_Sfu(cI(VBO!U9G$2TdSK(a`SyPtMZ(c(<&O%qJz_5{M`D2|l8|$tG?55^z<)n#ttyaE$2zOiM z*MK+VX<^#LjC%XE?r+NCivG1MEF(?GwQfbK^(*Cjy?rg6-5m8{P+So3yJUaRE<8W1 z#5TR_>1c9#OQF4aMgIL7{Oub2jWBk!mc2K3I*i>?>Ao=bt`>f7Nf@i=Z13%qR>OTt z7#jdNH#Ce*b+!+2il|}V4E{kL=}<#%sKN6!cx?@y;P+kZL(=buejK0MHTWAf_`DkY z#$2@!FYTwDp+~nibe%^$&sBQ1K<@tZ@*&z>mC$`SR-l6JW z`t6TwSLD}>{`2Dhe!U|9|1bJcHT+vqgTMH(e=hmEKNjR41JCk;?A>vW(_T_mc-nXK zR`Off$GN5(%3r7N;SXkng68hwGDd^$1-}6F{wrJhQ&paulhN({>-5oYakK_BH-~1# zR=iH{X0fGbg68hgW}F6%0zb48{9b)V9_TUf6Roe)^FbZBlJv)*22Dx&Q_vOKlJvay zw)FH&eMx#yg)KeSt|UDT^s-P=6(C+LNq4KXrQa}?r0>no$ml4Sq(^{1=2Vi7shIR! z=aTdU&t%+dd`fxnx1cThKJ{h5+!pH5mb*syi=G6XZ8QCtgao zrB4rm1H^o{O80UZs0CFiPzuWBa2d_QO48%-fl5`6Q$SCRe-N2J(;CJgX zd_beXUsidzFI6d0FrYai0C^)&H6SXVi(k&jf}s&CDq2*>JgOxEkdl#cBcdeT2lCl% zO40*BecIsz1hgNhDv#&@cMcgD&q2MwUyQ5{ctU5mLl#^Hb%1wY(o_E&{xIbnO?EjU=uCDfQI;iUYK4?w{`wZtbCFvKz?*>)n zX=|&0XCkPYVgX;4q@RX-cKZ5~^m8!u+gtsCc3-u_3h=6Y$$@G<15}OSMbKlAZ#`Ts z&jLLRzS)s#`DIWwLgzr$tb6`}e+;?IY&*l)a1ZNCmwwa)@o+n2PPsD7|d zANsi3K|fHF>fzH59)gYrzwdc9zXLQ8e89_U`F+r;dJd|___@mG?#*y`Rn7CD-Qa%u z>uNp)Gzxswn`*u-Xvber|MR&wRUX_1Z3_nuwcfzOmTvN`mM4O$@^!&)s$y^vGy=SH z;}7zXYIiF@Rr!g~YI(n=)$&+SHO3o3Lt)>xRkgesDC&PshN<<39|HA)gMhZxyceh& z_>1kU`O~0k;c@6#&GVpI*!y&@=G{Q|nlm!8KJb|;k80=@Rc-GKntu_czFRfF5j6ci z1YSKpH~>{Ycn+Eec}9G-d^+f5@Q?dd^Y=m3cHnvcYW^{(8nD{~s`)%nwNEh&tmd_# zS@=F8;Z6ER(9+@6ax-Z9-q4JUVFi3qv{Vp4Vy?D6$3IDvohx3sVvwn{?r#=UYJqvn!47Ovpb2n?n3~a+N_kCZ7t>~e4)zhGK(B$h4Py(ghvdh-v z7rRycW}*1icI>jX*r&SHJ^@7!{lt$4w=`JirYXp!HLGWrt-zu59(5>&<>)h;RiA=o z67W7hAe3|6e7`1A73F+W-@9GwyI}!()>FRy8Q%`YUh;Ev{tpdPL_v0Er5Mo5VKxrg zW2%Q>7JB3Js@KC1dd_cD&w@b-_=4(1Fb&ObxB;!M7+e&f(Po=|2eYnSSUQ1(O^%0O$N z9VTG!yc)XU5PIdJ>g7;w8WAD($po7Z#&>I=$R4$izoYgB6ZbkE^B8rLFoJ*4in#5E zHHT0S8&cz5oYHg~w}TjZf^o0o_Em8&p}^|69l<`lCT>TeIX3QPoH&L6JQ)?EOQP-T z;@;_)fnqnuO9D|BfHJ})_8$CVC&g_q%s)jFsy$5;8nUNrMy2nQh7nf>CDYjZ)!z02 z&9v?ExLvj-#g&KE9)r@sEENCtE7TspQvF97G+snow?4IcYko3Ho#`h-Vr%Qw)TwQq*faU*1p zST{#OI?BFL3_N;4acuJRJ{N&fKkVxV zr1s>UYLCM$AFYU*-u(mKO zs`elhze-;(haJ>UKM=QFaB_f|w-hEGVd`P+V;X39SOW|~u{S=c_L^t4gV--vbL@q` zRKI*E9oOzqyL*9-(W_o$FTlE&*yJ!d$)<(%JK5w?|8H??M<}%ZRs%UG6*+%WJqyZ( zqF>08#GrIs`nq;dKBpa2zo{LVzi0>1ziRskl%*Sil8{GE$ppH@5qeXdAHzY86_gPR zWeF-g_PN}*bm|JAOsRQ0Zrkw-LP>BEMk6UMZCBj3U>AyCHgxDh(c3+;8RO{mR}ts@ z%jR(y!Z-@0q6^ld3uV`r&ud4)1@&+D$b|`(;U_HjDVw<0w+m&DbVEtBby3%Y<73+}P)BtJu@EK@XHoI0vQU z>rC$7lF;NK6BnW*Z^h34vM|uP))E7%FU_E)4Bh)Q>eqC@i48(%F>2qutox| zowv1c;t1_H0ma^ttqBz#i9g>PG{8#iv7C8Z1;fY8+iF;Utk&lor}qAJYR}6fj>REP zLB3LHI8iH_Ptp#er)bB6r_I|ienqEipdly;4Si4(nuC&1tYqGrmVnDSOXCcENaMzY zoQ~YHRj(4VXBwdQV9@FtdOe5bZV1X0Pm3;_#$!~;X3Z@X`)1bylTUG6&q2pt4-@DO zqSJ1~w~s^FgnHwEo9g| zPs8d<=4}HkxfDBVAHGcOHJ{Qr&9IJoSEKEcFpOUFS+&QY#Hq5i+Mo@3Q|{|EmuuiD zAsv@|PRKJH6u%))XH7q^31&lCf_x}b-6T2#YJnj-D!xMW&8`Yc{eY+UIUDl|5to0Z zIP|&FFKEDGIP)ZHv|--P!n}I5=RjGSTsVbYIPFtrYQ|}t#&6Es3GBj2pOQc?y3FkC zw>&@Va=$%qM{vl8l5riBK(){tso0r;sus;W4!tFTGUD7Dyg;rWwi2h}J6tbd*-czv zVBz;zb2tX2-3SzWYn#}4|F655z+6bCp;SzKUo#B-Km)b4O9xTc3MHYsA8Md5Y{I{+ zgA0ssBNrawkJN7xN{8c6;&*kj=F}J7#@>O&Kc2UZmO}Ur4b;@5fyVCCK*_u3Z433| zy^=u01vY8Gq_4O6dJC+>ujn4_APi-V$Dt%J3Z;GAW1maAR}&hA-dZ$7bPCfp&)Z@G z&A}2_w?*w;Q0zjPfsuXvsLvjC>^%LEc}yE^>289O^BX&P~#0er1t!WNgzN) z(<9oj0ZOL*FtMHQdSMcd`t`$5rm}EQ{I<9zD0P0!8S zLF|QN*cnI-lo_dl(oZw&rG5ZLV8TAHff|3Mfnwv@U>3@zn}O1xe1|ru{WS^1oa_CK z+Rckp%e}E*^4J)PnYux?d6qF@s_@kGQbwd=ykoPAI zm;)u#LMRT+Ijy;7w{uk~g z+d2Ppv3VOHv*6qFHVux&=WP%+%(H7@)gE>;EKO=h#ZVHSfa2e^PyK86tAE5Sc>ZO} z7redF4<*iAKQR!-p(*tGGbwQcI1e~P4>Cgo`1xF8C;Co>D$y%^>hC+Dlf}Mr^M`)nr zQPMEtDvu^0BOQaHC!ho>%+WxtP!enN*yqNe_{X6nFz43?j#==Qv;;9F{C4O9rd22lL-P9zZDHgm%{YH#(pnJ1wI+eo_^`w?|0F4GKKKB^6yp(G%>tYI&#lmtGuV5=m7 ze_F8B65zZATLbGW7HlnS|HOg~!{!SXY#l7TP-md!B0nyac+*hg*wRZhP}(OoP}OA` zD7!`jB|ohV8b71Nu#Kmy8jq5gB8 zzcpbBGSUWEf@9t1Rj-G|=us&4hVX(dg)LVs*fN-VrFPH;rGvIQO`ruzLTMXxd{8sm=rc2;wtNfMXp_lLyt$EdZCPL1}2|i%CAy=3MSC&uU0(_RZ%43+3h&zE$nh8##WmR`DNc2Xkg=b8lOHc=1TH*+0;g?(HfU}Hbm8CZ6|`WHt1waAZZ zg90IIUnJyaQViwN9EROAtcN|Y0m_K$pd{4%fN--bdr<8qum!&v*b18m7Hk`=_^Eb0 z1ZCzYECokJ)g#)VY@0TifzrVglqZ|4#}{m~1bjmMN4Kkg|5NH;@w9d@_YD4A8C#xJ zd){+uANl!$ZKr+h*n;hV$>$er7qnf!(vjuv(2+%c%@vM{@d>Vou>M7z(zHoU$Uw0t zcd9)!MTh8lujo`)PwP~-{a&ZKe@54S?2o$kb+ekFgR)m_?i*S${AXSJnm7GT_ZMCJ zj+pM=mbbb2&>%OiiDX0B?Ncz?m+2z&kSU#lvUvvzaJC0uX0UcQGnL4o02X$cPEFDF)%@tZ-0p$WUa=vzu^UpeS;Y#(Nyg=i(T;vb< z5)zOps=idG&ehOCB-M?3T<*-LRj>58+&Nz#_jU6bzuqJDP)<#g=p5gEU+;yosYh!U z?UpFNOY*rz?-&n%-r~sJXf_PlJULg$rdZ~xp`6#jD;K?E(^0qR9h-(Ps$VZ`r@rP( zYM-sg9!+s^DE73g)Sh?sqIb+n|7Fp;e$-r}9hZJh6UwvKEqcc(?OzwYD_46nfe4WO z4Kn3g-9UnJMay;CaTv<+Gv88s_qWx*_=ZLAO4oJcqIad6{LZ3xrR%?G(K}}2-(B=B z?ImrxS0Xp-Ua|E*(9M#2i*A;xjk;M1I(024x^yi&eoROFcFP=;H6HHv*Z2-yi)xWL{rr*G^!MUkFYr~;A7~{w2Z)$*^ zzo+tC&Q*Im zl=!yvJZ;!fp@z{&TbcDq6KUMQP);)@A8i@o5>8Ycl~(1Q(Px4eaZHDTv4Y7eu=B!1;LHGV~lCR+KO1T|DN{xD&a zFnCA88fGHzCkY#XB|Rjvd6jE{VjsIxJ05{@cN@G*^(d5^SKw~#SSSfapIG2NzFf#%vI7p&unUUcB$V6jIF$A?Q0|^t_aJ5>|GDD0y1@TzJvQII$yEGpzP+EN2CGofKW!9 zKbWv-G%SFkSHl3hQ0!4C2}gYU9F+K3kE(w^Ol;#A!z8S*k1=I5tl6f4CZ3QE`DM{z zwHHFkxKYTOH^Dd!>$Yp4!Y4IQ$@z|8~M|&3e#<;}Rg^280Cc-jlHR z2Oo4T%XVY$bp?Ul-qh#8X!LG3BfLM&O{ML&B_x`bF7}9vLT`ygzuz9}>O)eL zy{YOrQXKo;*ipOfR;F$?N9_g2h&}4cg#<2Jr-4df^nQN+cf9Zr*K>mE!+DUU%sElW zZ%hdB%RfmNbdCAMw{(!b9s`e7twK6Z2=C8uiBp7GF8*HOGM85*OmlM{1Fq!#=pq70Q9Y*g>by=54yP%u7Ot{Pqe@Yl~l~?Yz_t!q?@~#p+!!=z4Nwi0}l{c*v~hfLIO>GOA{D}GJ?hy?9qE&_6@>b*CM=^pO)Py`hBhy z$^d6Py~nxlX!|B8{uSS~Qs{H;yTTqfA>6du^?XnCyIn_{@Gh5oGbC{HEov|Pq3V^l ziq4NzI{ZBXMQ`=>eqSHlsP$9O>+eUZ_gV^KDD4#9?MxS>qol_buH?s}r#sgzOm*=) zgln9+OSqQDXkn%cZBcv9eZnJL;vr$W>lzfMy2PWxyd#)!W5>r|a>!$<;n7`du#cl(5I;k7&DkkDJ`I$6i$h*=nSafW5QI|aGvTN=c_(bsd`owv^dm!k^)m- zEoAr4dHP+hxmp7@LaC2?ywlZOy2so7wU_Pjj%f>&nJ}MHzjBZFxcnN??{#^f);Kv( z_FAP!e$ooPjB9;^^T-~6a^;&5eQU1E{Ve3lmj5|nn(Gg1z+NcViQFqx&xSI!V^=~F z8veo_@A&0x5S?$uJ>KUgJ#v%#qMtwx1qoCRCBs=b@(3>yo*r>!^;+NbWvTCR!LJCT zE(^+(tA3wr^z8j^+OMDT>nE1zl8CvA_V))|+0|A9lw2)_3^(yFs*geGU`ps+c+@`r zEwOKMt>1=>w4+7zyIt`OYM&6Y$tG_U{a)Ah9cJL{G*@$zwy%QspM9E({6O^{OF?d% zaUmTh;p9)bTea`8Q!ooo!#p?x3!%(Z4HW-oDEfU3A;K&`=dF`(F2^|#jOQSvFx7nFHwZkUZgI_!B zg%K!UKxW+~eo>d>G2%*my&SgUSE0If^7V?;=pe{ zZ`Hs}P@aB=g*fKirvW^ooBLHydiFk7h+aU)-LMd*MRkUTpv0Z?_524^uY$5k2VoHZ zvH=nZQK+Jj1(Q(j>unG3@$ADtr6Cm-i-*UktAt)) zC?o8LUBnxM-Edm$v=0qyf90?p`?#ghL7`{6Hb{F?8)QRi&QI=EfH_p_Z4_ziiU$z=ef$*b8N8dUlGPyWqbGZN!aJ2otF0 zx7wiFW1pLXGQylGZ7>IAjgy`palw~WFM;AW4D*Ro@d~E`=KoIHbqhIFqfq=}zP(@? zU7r7|Daa;lfYL#$r}MvDzN&gPl#B3r< zt^~BiscD1~uuF6}UwdX=fv=mC9Cg@$!e0%m^ zvG=WUjj)1v6R|zE5|+KCiA_VX2X|SmDBL9tmb-e7DQ*as;m{M;4hErg7!#cfQpLR3 z`PB-K{G!6b9-E7QT4ImQgA*{i`6!pRTicfkw;bhqq0C@#&mNnGU#_JPq)-k+umNVl z7?hC(_iBSWC=FVm_`9U~yZ!!>K}l%B*W*w+%6muaE8yINd@1GY{ZQiDm{;I9n7y8% z7mni?5uMv-0*;~ArKml$O#O_e-%0-s~56I zdZ75Z)#ArHVo2)KTro5)yahw={5uL+1PHIu%sZfTIOdVB%MKNNi);6|*`*z(^%ZdT z0oF82N8Sr((CgP~#}OejQE)hna#Iqb7ap zv4$`!m$ij?>-Kv8Gf51}k_C^~gbIX=ybAW>R|g}o4T@jXw~zVuvJ*(a`%PpD-ZeZ= z9Y>+)%_r`)Z3L)4NfU~~R`jO#Xrdh+`CSeu9mHWH^;osOJqE+* zfdY%6Z>8%mV9ha9pDGS~K`7*!Jp#o(cbYcnI9&tg6>35qu$ubeGyIO;OFQ;JGpxYg zU8MG580|aKrM+*jEyZ5@eoeT^QjjU@^$l@YfWvgLI;5Ss*XE;FLkZj?B(Vu0OO=2! z!rFh_YlHZ;d{FG{9VqrdiTag7nb83li}E`nXRF-~QJBLp{9$d-^%3oO7D|AEGSwTQ z?1^z-&pMaAK)VhoiHyP_^oftEUiLA+9h5jxD1KA02fxaHLf?|c_x}`R?MlxR2aX{W zJ?G=vpxI-DFR55t8V*7kNqL0^?t;>;7fQQ=^VOb!mH78ps(l7Z0$CTRUIOX=0XI#d z2*-+5ze#SLg`Mm6~v# z$3EBX>qB4Q5{_Seowo0V9q5f4@aLY=>v4rkKyRvJU)*aQ4#Qv4z_U;~HubDI_FO1S zQVqr4;p-77GZ6kV#}L0}D1IXz*-O5j`xR|h1!b=^!Xo_Zud-S(e3e#&8gz=$gcP6<9>Y-%8b|AYqdcglm-=F zQ@s&Nz%C(EKMEuF@j}t0_89C%k2kA5aJ~2iT?O=J2zFE7w4B+z`T+D(V2 zTbE5i8kR$ux&~NBgYu2i0l(7?mu=>y6xLvOKhi*5Lf&*HU|-6EuC9~YF!jkU-4nI9 zi66fs21~G4{aEcIP!cKnUwdugeU_g_Q;;{4K`5JP8s^bprkiu_Q#W3 zcc`BA6E3~@HQp`yk``}*=s|vp`Ygkn6q`S&4xqwu{mMQL)t;}!)l*{V$c7nCejSWe-z3< z%_AH?nfd|>(m^$pU0E=w9gjd+f^i`;5chTSsOp76>Pw)s8-Y^{WE4u=NwLH1pW(;M zbqIM1o`Wg;N=MmaBrr&W*&%Kouzi~ZT;U=@eu!iqhu9q)fIUx$eVLmS((#P17Z2+L zNi&p=d!clgwOtcy5n|7IlFdn+A=nI?p0eyt3dyImVa|v;_QFQ7Lup{1As{o53&lPR z#hx>&ff}FJIPr2p63UX1|{>*yaeF*KyRvH74-uPs*gYkT(QV;#GZiS7fkH6W$0PUlf*A@ z4wjG=%Aq8fvj%&F@Bd3F$FG?+U^D{78S+93KQ6nh{qX|rJ7 z`lQW5sJO0LhS|T zlYmS~F$Jj@hqA_VpU{~Y{b!xx7?cq>h(KBU*3WClaVQ<+Y|uarUrgEx^ooY0 zt%MU$j$i-PIzxqD)tM{$7nsZca12YSZ@Wg~2Y3+C`krfbrmg#$PT>TUC1`8HflZTu zGPU{FX~!`rYh3nq>RF00C^Inu#a{fcy7pC2;*>b;VD#I1TytCWSXSJi18uv}i*H?& zf;7l))duZ1X@laMwL#XcI)dJgq+UQelir1;5XwwUbm>eK-KH}Uz9VU?v4`$V+8S8D zDQRnA+h#guk5u%jz56~%fam{$`=x?sH7HY>{}4J$QY~aj24ER>^RU{(P^L8hr)uwp z<>=LenotSNnfFMV9~dKjYN z@Kbt@6C=8b+Mm`AV?vg0`Wf9rjbrLR1|^}Q=hYsVP2hAwiU^bo zPJE|!F!fvAj5V+5W~~36B*xcnP%cE_SJhtlw(g0VUAiYq7j$4fP!gDg;va{(uy&CI zWD^za)&_I10KIn)4cKJed(~e3j@pgc=PgYMlz^ov`@ETIhH_lnms8ISwgj|(0?JH= zR_yc6eOEg5{48h`8vKJ9Rx3I(_IVeC7?hcq3TmLpO0`dh)IM~m2AqR(0m;u+d*yNa zyrn71)s6$})INN&B)r@eoTBzAp$x1*<4jr#l5ybFeRj5=DLG9Yd*F=dXQ;jVz5DDO z`p75u*%&PP>OLEX`Pc5V2{`pl;&5Tf`Ig#yzODA08}`{G^}!o8q3KplbnXY*kDY4Q zimVQ;DE`qtZ|%pROzCXbK5xyke!S0Hn*7`MdB=4O%B4E%j(y&3I=oc}(gelso=|(~ zu-dD(@AFPU{7Kcjp4#V~0{#&It>}Pq%(|egZ9>RyZhu+>bv&aDMxRyx>QUB^_k}Q& zHSU1Yam^0Z>wc{rwLytf{2O#G*|kvohhS){JpY&O_eNZN-hOXw@;|=cyHs{TS>xFG z=&WJmC-!@rD0%^Y1gyRgyPN_jOE7$~wBz@CF3~v6P?jwJa&$VZfwE*(UseD3HT!MS zVraN_zqjcopd63sZ|wJ`I&0&8Z>l?P+wYC6a%8_Z)$vp=ulO})a^rzBtGFz~`qjL~ zvAdh0*drm;2ch^6ui+xbj7`I0bayC^Us4e|3`cGb-B2o`+1em-yasB|(+)aL<*A7J zsnfUt!P3)tV1;p51p{Yr6@&xtm3YhC*gvSf_ycM$Jd@>-cK=8{Guj2cj?D)#a0*JG zbkGQ;gTUGEcuUd+Wz8a`8aNIm(UNmD(NZWQ7D~s%LcYKlg7W(T1($M-p}q)iNqxY5 z7s}ENT*~@O;5pCG=Nd0lhjA!h%S{V;5jpQusyD*E#+qpr$hpSuxm zx%NR<`f2ftx)QkM>|*yV(OL5Ed-gu}b4#Hg!<1);x))&t{S{A-xQx%BujUmBO2%cr zUIn+Tde9Ato&Q&)=yJaOpxyhSgT=4~{v+IS_94!FUT32G3j9gDNQDlyf|d0t3oCSU8?cwXI>AP0i*?~LfVPZ%8Ul_Yq>DQU-s(! z#Lm#khg5xpe$VUthLp#&e4mtu$~^lklx_D%r5rMEJ{T}(BHNKyk-)R7O%76xG$B36 z5Hf`%k-X8>rVOb;8j)6H6iFai&#gAaNCOf$2kS=5h8AF1&BUPOLU1NG;Ne^de(O3`u)owJAWVkQ$^5nLy%5;6;`IDMP}DL%NY^ zBj6yClb0Y z-Q<3qq^?ajb6+EoegOKtokX5OH^|MaJ17`Hsbj0gDBZhWRzWS9cV_57)~ z;a6BML{8_+MVV&haE7_y;tX@-X_@AhQ!~xBCn!IeVQ!*)OjU-teO=I8aD0Zj6nXXZ zOmp+r408qL=T6Qvm#)t=D_n*b>rs2k-w(D9=M#}5k)^>TvA-8guBW&C2eGzq&oJ9A z$}sEyPAvQPg1x+&tdSMlGR*wd8RpRoGt4IBcI3ckJM~W^&mqqvJCGNUoydWYB=u!! ze{P1kb3VhINqO_B8D=Zue{Ov}vEFv&g-isI&lsFV(oSUmA;o`Yf5OIPAyW$*kPak* zj36^e0x3#zFn-6SFlRB4O$`}l-whe&nmpQ2KEFQ0+(LOByc0R+#tf751}B&URn9ugEO>SIDCjMO8I z$oL7|VUTGgi_Syo%o61hX2((AhIAplNE8`DMv)0*3YkIXkOab?%``zI>)4PrITZ4c z0;C8jM#_NI*=YDiVP!T$P_Y*#E=AHa@ki%2+2nBkV2#wDMQMU3Zxnd zBlSol(u_FEe_D`Mqz!3DI*=YDf<%!aWE2@gCXpFr4oM(p9i1Z~Bpb;?ijY#I9H~UA zky@kNGu8vy|oJ#2|m~ z%Os)qXv2vRJp@J1hVsev=_&lD{5@)yN1;)PsmIWoYAPfEAxs@*2_m0*ocN1B-lxg; zkq|AESE$)^`F05!rF@8QAEwNsmG>FWEqLNRNpvP&^WaE?Tm+OeL&M%MP zFCW<#CD@PmG?o(k30|Ch{w)s_Z$0XXof zWV2TzwMZDLL+X(Rq!DRGT9G(;w!_PKx5$TuNHJ0><>j;`W}_ds#pg}j#SDEYb zGt9=1Wty{SzYjTacBOgYWCr&YyV7j?0v&&u(U9pH8m)XuS7`^MNJqAx%_9r4p2w4Y zhX&1tKdds>Bb)nInPcu>W%l87Gjh!W$y~M4ycM7m5?qs#X|^xVG^hTa89*LIzRaC{ z!y%dGI^-r~w+&)oBs&Xv=J^~>>oU#esg-8s3#-hTAI>mq3A|I}cO;2l3JE^Vo&QXx z^3%xcw=x^Z24vqxI>NS-5#F>l(`-auXOy>)^of-$)7Dky3=+QP71o~_+Qw4aV|dVd z_$w>Ty7#U!8_9kv^1=m7^DXlHLMO<>JlCAhv(A~wb;#w&HO#3f7x@%Z|}1?*y$;myylG;3aFt=Zk% zkTX8Onq~*hrL6NUYgo$!9Z-K8>-aRX;r*I`+-_?2>lL67MJ|fL52ctaxW<-yd2C8{p;S&1lc>%NI;{o&f3oFb`|F*)sHMzo!T@f;8ZCYV&czcC; zGrq#CePxAt-(Oak^JiC>oByB>4ta0zgvRQwZBI3KekRrI_-v}#Set5sUkI6VUP(1u zf1hfuv%gC7y9Aa{5ftgNb%uoOc7Foly$!E z&Cox;e^RQx&!cG@%ZNFQ)FHJy1`G-3X`Ag_n8+VdFP$`{u;XI@PgOVP1hTI zBLoXz?#{l|m32NFwn<+`+6Url74x73(ou*LL}7CiU98})B} zI#1gZI(*gBn+~>{J-T!MuFw%HmzZKltJ}Uq4!R{gx5HPh=W*iQPmVM_eASu91m86U zayq{sC*0qfJh$~rx(NDBxAh(jm!-DO(0nMkEGMV)*!j@$C*|ZET(@`LNqP7A_2DHG zimwdejPD+dmA|AJ^Y?d~736f@H&3%Ak&6Dd*}KD9+FPkMTeYNFMNX*m)ptUNk?NT| zY907g<#c{%fet1Qnri;0gLUt&(rd3B%)QPV`r)gVcG}?EZeP-?%jx_j;a4u1!VZ60 zuU}&8Ibd7TbVzNhFTLwvx0C)LcucyJ=gI@0>4WACOU!ZKTx84zOU%h7<6F85U+y{B zQSg|~zbuk>;Gik%7~M&mj(&H_P3|$?CSUdMY~M(Pj!x(O=(%N?rtp}~1L_V;MXH`k zaU)W~7i0%NDNB#5xt#iQkkVs1SMAn-OH@m?C$jm=mqb|l^`At&{O|g#Ol$v%_PU-| zrURb_URDo$mYEf4rG5XWPa$6g9QYiy{6BQklljfAgTc$a(|W|pC8jF>0N>Pk(5=RI zTVe|PZqF@g+Hka-yTe!QTjJO3+pb??YdgC0@jWc!lBPX+Ra&*}CkJ~C_*bfwCARGU z;7aw}?FZWx9^Ltgy`iIQ9$)L^@j!k4i9z!|zNkOf@tSs8rdj(*UM6@?NQe6_;XUz` zOtS;tf^0mV_epr^&v=pHePSIVcaut)UjOz~K-}E_Ixhcc@Bd@qVgl#<*Ma{pgOmXyOw%5_WHHeg@(9^Ha&iBIdh(h=t^Y25X$6Mu$siMRitp^X50=u zpiXVvvF5mp+>fRhk>VX2_pCWKz4{2=%#fkZbt(ADBf3bW^PfZ==BeG2&Z|*Z$opqn z=f;#ZC#;Y+)%?zFQY@rc*!h|i8+P+eSLe!Q6dNfvcD|2ddh;H>_j-eGq#wC_*_!1k F{~P<4Rr~+| diff --git a/TMessagesProj/libs/x86/libtmessages.5.so b/TMessagesProj/libs/x86/libtmessages.6.so similarity index 72% rename from TMessagesProj/libs/x86/libtmessages.5.so rename to TMessagesProj/libs/x86/libtmessages.6.so index 326a064f8481b40e98fa011124423944ef89925d..e455cf5adf2e60b02842e4cf070aaced635bb4bd 100755 GIT binary patch delta 184559 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 RCf*$vpZztBfx)Zn{{ipw4v_!= diff --git a/TMessagesProj/src/main/java/org/telegram/android/AndroidUtilities.java b/TMessagesProj/src/main/java/org/telegram/android/AndroidUtilities.java index 4455445f2..c7e2065ac 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/AndroidUtilities.java +++ b/TMessagesProj/src/main/java/org/telegram/android/AndroidUtilities.java @@ -23,6 +23,7 @@ import android.os.Environment; import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text.Spanned; +import android.util.DisplayMetrics; import android.util.StateSet; import android.view.Display; import android.view.Surface; @@ -33,12 +34,16 @@ import android.widget.AbsListView; import android.widget.EdgeEffect; import android.widget.EditText; import android.widget.ListView; +import android.widget.ProgressBar; import android.widget.TextView; +import org.telegram.messenger.ConnectionsManager; import org.telegram.messenger.FileLog; import org.telegram.messenger.R; import org.telegram.messenger.TLRPC; import org.telegram.messenger.ApplicationLoader; +import org.telegram.messenger.UserConfig; +import org.telegram.ui.Components.ForegroundDetector; import org.telegram.ui.Components.NumberPicker; import org.telegram.ui.Components.TypefaceSpan; @@ -59,6 +64,7 @@ public class AndroidUtilities { public static float density = 1; public static Point displaySize = new Point(); public static Integer photoSize = null; + public static DisplayMetrics displayMetrics = new DisplayMetrics(); private static Boolean isTablet = null; static { @@ -67,7 +73,7 @@ public class AndroidUtilities { } public static void lockOrientation(Activity activity) { - if (activity == null || prevOrientation != -10) { + if (activity == null || prevOrientation != -10 || Build.VERSION.SDK_INT < 9) { return; } try { @@ -115,7 +121,7 @@ public class AndroidUtilities { } public static void unlockOrientation(Activity activity) { - if (activity == null) { + if (activity == null || Build.VERSION.SDK_INT < 9) { return; } try { @@ -228,12 +234,13 @@ public class AndroidUtilities { if (manager != null) { Display display = manager.getDefaultDisplay(); if (display != null) { + display.getMetrics(displayMetrics); if(android.os.Build.VERSION.SDK_INT < 13) { displaySize.set(display.getWidth(), display.getHeight()); } else { display.getSize(displaySize); } - FileLog.e("tmessages", "display size = " + displaySize.x + " " + displaySize.y); + FileLog.e("tmessages", "display size = " + displaySize.x + " " + displaySize.y + " " + displayMetrics.xdpi + "x" + displayMetrics.ydpi); } } } catch (Exception e) { @@ -241,6 +248,10 @@ public class AndroidUtilities { } } + public static float getPixelsInCM(float cm, boolean isX) { + return (cm / 2.54f) * (isX ? displayMetrics.xdpi : displayMetrics.ydpi); + } + public static long makeBroadcastId(int id) { return 0x0000000100000000L | ((long)id & 0x00000000FFFFFFFFL); } @@ -421,6 +432,19 @@ public class AndroidUtilities { } } + public static void setProgressBarAnimationDuration(ProgressBar progressBar, int duration) { + if (progressBar == null) { + return; + } + try { + Field mCursorDrawableRes = ProgressBar.class.getDeclaredField("mDuration"); + mCursorDrawableRes.setAccessible(true); + mCursorDrawableRes.setInt(progressBar, duration); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + public static int getViewInset(View view) { if (view == null || Build.VERSION.SDK_INT < 21) { return 0; @@ -530,4 +554,18 @@ public class AndroidUtilities { } return stringBuilder; } + + public static boolean needShowPasscode(boolean reset) { + boolean wasInBackground; + if (Build.VERSION.SDK_INT >= 14) { + wasInBackground = ForegroundDetector.getInstance().isWasInBackground(reset); + if (reset) { + ForegroundDetector.getInstance().resetBackgroundVar(); + } + } else { + wasInBackground = UserConfig.lastPauseTime != 0; + } + return UserConfig.passcodeHash.length() > 0 && wasInBackground && + (UserConfig.appLocked || UserConfig.autoLockIn != 0 && UserConfig.lastPauseTime != 0 && !UserConfig.appLocked && (UserConfig.lastPauseTime + UserConfig.autoLockIn) <= ConnectionsManager.getInstance().getCurrentTime()); + } } diff --git a/TMessagesProj/src/main/java/org/telegram/android/ContactsController.java b/TMessagesProj/src/main/java/org/telegram/android/ContactsController.java index 75cb7bcbc..4894e628e 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/ContactsController.java +++ b/TMessagesProj/src/main/java/org/telegram/android/ContactsController.java @@ -54,6 +54,7 @@ public class ContactsController { private ArrayList delayedContactsUpdate = new ArrayList<>(); private String inviteText; private boolean updatingInviteText = false; + private HashMap sectionsToReplace = new HashMap<>(); private int loadingDeleteInfo = 0; private int deleteAccountTTL; @@ -114,6 +115,28 @@ public class ContactsController { if (preferences.getBoolean("needGetStatuses", false)) { reloadContactsStatuses(); } + + sectionsToReplace.put("À", "A"); + sectionsToReplace.put("Á", "A"); + sectionsToReplace.put("Ä", "A"); + sectionsToReplace.put("Ù", "U"); + sectionsToReplace.put("Ú", "U"); + sectionsToReplace.put("Ü", "U"); + sectionsToReplace.put("Ì", "I"); + sectionsToReplace.put("Í", "I"); + sectionsToReplace.put("Ï", "I"); + sectionsToReplace.put("È", "E"); + sectionsToReplace.put("É", "E"); + sectionsToReplace.put("Ê", "E"); + sectionsToReplace.put("Ë", "E"); + sectionsToReplace.put("Ò", "O"); + sectionsToReplace.put("Ó", "O"); + sectionsToReplace.put("Ö", "O"); + sectionsToReplace.put("Ç", "C"); + sectionsToReplace.put("Ñ", "N"); + sectionsToReplace.put("Ÿ", "Y"); + sectionsToReplace.put("Ý", "Y"); + sectionsToReplace.put("Ţ", "Y"); } public void cleanup() { @@ -514,10 +537,10 @@ public class ContactsController { checkContactsInternal(); } final HashMap contactsMap = readContactsFromPhoneBook(); - final HashMap contactsBookShort = new HashMap(); + final HashMap contactsBookShort = new HashMap<>(); int oldCount = contactHashMap.size(); - ArrayList toImport = new ArrayList(); + ArrayList toImport = new ArrayList<>(); if (!contactHashMap.isEmpty()) { for (HashMap.Entry pair : contactsMap.entrySet()) { Integer id = pair.getKey(); @@ -619,10 +642,10 @@ public class ContactsController { } } - final ArrayList toDelete = new ArrayList(); + final ArrayList toDelete = new ArrayList<>(); if (contactHashMap != null && !contactHashMap.isEmpty()) { try { - final HashMap contactsPhonesShort = new HashMap(); + final HashMap contactsPhonesShort = new HashMap<>(); for (TLRPC.TL_contact value : contacts) { TLRPC.User user = MessagesController.getInstance().getUser(value.user_id); @@ -692,7 +715,7 @@ public class ContactsController { } final int count = (int)Math.ceil(toImport.size() / 500.0f); for (int a = 0; a < count; a++) { - ArrayList finalToImport = new ArrayList(); + ArrayList finalToImport = new ArrayList<>(); finalToImport.addAll(toImport.subList(a * 500, Math.min((a + 1) * 500, toImport.size()))); TLRPC.TL_contacts_importContacts req = new TLRPC.TL_contacts_importContacts(); req.contacts = finalToImport; @@ -713,7 +736,7 @@ public class ContactsController { // } } MessagesStorage.getInstance().putUsersAndChats(res.users, null, true, true); - ArrayList cArr = new ArrayList(); + ArrayList cArr = new ArrayList<>(); for (TLRPC.TL_importedContact c : res.imported) { TLRPC.TL_contact contact = new TLRPC.TL_contact(); contact.user_id = c.user_id; @@ -848,7 +871,7 @@ public class ContactsController { public void run() { MessagesController.getInstance().putUsers(usersArr, from == 1); - final HashMap usersDict = new HashMap(); + final HashMap usersDict = new HashMap<>(); final boolean isEmpty = contactsArr.isEmpty(); @@ -933,9 +956,9 @@ public class ContactsController { } }); - final SparseArray contactsDictionary = new SparseArray(); - final HashMap> sectionsDict = new HashMap>(); - final ArrayList sortedSectionsArray = new ArrayList(); + final SparseArray contactsDictionary = new SparseArray<>(); + final HashMap> sectionsDict = new HashMap<>(); + final ArrayList sortedSectionsArray = new ArrayList<>(); HashMap contactsByPhonesDict = null; if (!contactsBookLoaded) { @@ -958,13 +981,17 @@ public class ContactsController { if (key == null || key.length() == 0) { key = user.last_name; } + if (key.length() > 1) { + key = key.substring(0, 1); + } if (key.length() == 0) { key = "#"; } else { key = key.toUpperCase(); } - if (key.length() > 1) { - key = key.substring(0, 1); + String replace = sectionsToReplace.get(key); + if (replace != null) { + key = replace; } ArrayList arr = sectionsDict.get(key); if (arr == null) { @@ -1067,7 +1094,7 @@ public class ContactsController { } private void updateUnregisteredContacts(final ArrayList contactsArr) { - final HashMap contactsPhonesShort = new HashMap(); + final HashMap contactsPhonesShort = new HashMap<>(); for (TLRPC.TL_contact value : contactsArr) { TLRPC.User user = MessagesController.getInstance().getUser(value.user_id); @@ -1077,7 +1104,7 @@ public class ContactsController { contactsPhonesShort.put(user.phone, value); } - final ArrayList sortedPhoneBookContacts = new ArrayList(); + final ArrayList sortedPhoneBookContacts = new ArrayList<>(); for (HashMap.Entry pair : contactsBook.entrySet()) { Contact value = pair.getValue(); int id = pair.getKey(); @@ -1135,8 +1162,8 @@ public class ContactsController { } StringBuilder ids = new StringBuilder(); - final HashMap> sectionsDict = new HashMap>(); - final ArrayList sortedSectionsArray = new ArrayList(); + final HashMap> sectionsDict = new HashMap<>(); + final ArrayList sortedSectionsArray = new ArrayList<>(); for (TLRPC.TL_contact value : contacts) { TLRPC.User user = MessagesController.getInstance().getUser(value.user_id); @@ -1148,17 +1175,21 @@ public class ContactsController { if (key == null || key.length() == 0) { key = user.last_name; } + if (key.length() > 1) { + key = key.substring(0, 1); + } if (key.length() == 0) { key = "#"; } else { key = key.toUpperCase(); } - if (key.length() > 1) { - key = key.substring(0, 1); + String replace = sectionsToReplace.get(key); + if (replace != null) { + key = replace; } ArrayList arr = sectionsDict.get(key); if (arr == null) { - arr = new ArrayList(); + arr = new ArrayList<>(); sectionsDict.put(key, arr); sortedSectionsArray.add(key); } @@ -1193,7 +1224,7 @@ public class ContactsController { try { Uri rawContactUri = ContactsContract.RawContacts.CONTENT_URI.buildUpon().appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_NAME, currentAccount.name).appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_TYPE, currentAccount.type).build(); Cursor c1 = ApplicationLoader.applicationContext.getContentResolver().query(rawContactUri, new String[]{BaseColumns._ID, ContactsContract.RawContacts.SYNC2}, null, null, null); - HashMap bookContacts = new HashMap(); + HashMap bookContacts = new HashMap<>(); if (c1 != null) { while (c1.moveToNext()) { bookContacts.put(c1.getInt(1), c1.getLong(0)); @@ -1213,7 +1244,7 @@ public class ContactsController { } private void performWriteContactsToPhoneBook() { - final ArrayList contactsArray = new ArrayList(); + final ArrayList contactsArray = new ArrayList<>(); contactsArray.addAll(contacts); Utilities.photoBookQueue.postRunnable(new Runnable() { @Override @@ -1225,8 +1256,8 @@ public class ContactsController { private void applyContactsUpdates(ArrayList ids, ConcurrentHashMap userDict, ArrayList newC, ArrayList contactsTD) { if (newC == null || contactsTD == null) { - newC = new ArrayList(); - contactsTD = new ArrayList(); + newC = new ArrayList<>(); + contactsTD = new ArrayList<>(); for (Integer uid : ids) { if (uid > 0) { TLRPC.TL_contact contact = new TLRPC.TL_contact(); @@ -1351,8 +1382,8 @@ public class ContactsController { } public void processContactsUpdates(ArrayList ids, ConcurrentHashMap userDict) { - final ArrayList newContacts = new ArrayList(); - final ArrayList contactsToDelete = new ArrayList(); + final ArrayList newContacts = new ArrayList<>(); + final ArrayList contactsToDelete = new ArrayList<>(); for (Integer uid : ids) { if (uid > 0) { TLRPC.TL_contact contact = new TLRPC.TL_contact(); @@ -1406,7 +1437,7 @@ public class ContactsController { } } - ArrayList query = new ArrayList(); + ArrayList query = new ArrayList<>(); ContentProviderOperation.Builder builder = ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI); builder.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, currentAccount.name); @@ -1471,7 +1502,7 @@ public class ContactsController { } TLRPC.TL_contacts_importContacts req = new TLRPC.TL_contacts_importContacts(); - ArrayList contactsParams = new ArrayList(); + ArrayList contactsParams = new ArrayList<>(); TLRPC.TL_inputPhoneContact c = new TLRPC.TL_inputPhoneContact(); c.phone = user.phone; if (!c.phone.startsWith("+")) { @@ -1510,7 +1541,7 @@ public class ContactsController { }); TLRPC.TL_contact newContact = new TLRPC.TL_contact(); newContact.user_id = u.id; - ArrayList arrayList = new ArrayList(); + ArrayList arrayList = new ArrayList<>(); arrayList.add(newContact); MessagesStorage.getInstance().putContacts(arrayList, false); @@ -1552,7 +1583,7 @@ public class ContactsController { return; } TLRPC.TL_contacts_deleteContacts req = new TLRPC.TL_contacts_deleteContacts(); - final ArrayList uids = new ArrayList(); + final ArrayList uids = new ArrayList<>(); for (TLRPC.User user : users) { TLRPC.InputUser inputUser = MessagesController.getInputUser(user); if (inputUser == null) { @@ -1631,7 +1662,7 @@ public class ContactsController { editor.remove("needGetStatuses").commit(); TLRPC.Vector vector = (TLRPC.Vector) response; if (!vector.objects.isEmpty()) { - ArrayList dbUsersStatus = new ArrayList(); + ArrayList dbUsersStatus = new ArrayList<>(); for (Object object : vector.objects) { TLRPC.User toDbUser = new TLRPC.User(); TLRPC.TL_contactStatus status = (TLRPC.TL_contactStatus) object; diff --git a/TMessagesProj/src/main/java/org/telegram/android/ImageLoader.java b/TMessagesProj/src/main/java/org/telegram/android/ImageLoader.java index 1e9a454a7..997488ed5 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/ImageLoader.java +++ b/TMessagesProj/src/main/java/org/telegram/android/ImageLoader.java @@ -344,7 +344,7 @@ public class ImageLoader { }); } }); - AndroidUtilities.runOnUIThread(new Runnable() { + imageLoadQueue.postRunnable(new Runnable() { @Override public void run() { runHttpTasks(true); @@ -354,7 +354,7 @@ public class ImageLoader { @Override protected void onCancelled() { - AndroidUtilities.runOnUIThread(new Runnable() { + imageLoadQueue.postRunnable(new Runnable() { @Override public void run() { runHttpTasks(true); @@ -633,7 +633,7 @@ public class ImageLoader { } } - if (cacheImage.filter == null || blur) { + if (cacheImage.filter == null || blur || cacheImage.httpUrl != null) { opts.inPreferredConfig = Bitmap.Config.ARGB_8888; } else { opts.inPreferredConfig = Bitmap.Config.RGB_565; @@ -1057,6 +1057,12 @@ public class ImageLoader { FileLog.e("tmessages", e); } } + try { + new File(cachePath, ".nomedia").createNewFile(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + mediaDirs.put(FileLoader.MEDIA_DIR_CACHE, cachePath); FileLog.e("tmessages", "cache path = " + cachePath); @@ -1678,42 +1684,47 @@ public class ImageLoader { runHttpFileLoadTasks(null, 0); } - private void runHttpFileLoadTasks(HttpFileTask oldTask, int reason) { - if (oldTask != null) { - currentHttpFileLoadTasksCount--; - } - if (oldTask != null) { - if (reason == 1) { - if (oldTask.canRetry) { - final HttpFileTask newTask = new HttpFileTask(oldTask.url, oldTask.tempFile, oldTask.ext); - Runnable runnable = new Runnable() { - @Override - public void run() { - httpFileLoadTasks.add(newTask); - runHttpFileLoadTasks(null, 0); - } - }; - retryHttpsTasks.put(oldTask.url, runnable); - AndroidUtilities.runOnUIThread(runnable, 1000); - } else { - NotificationCenter.getInstance().postNotificationName(NotificationCenter.httpFileDidFailedLoad, oldTask.url); + private void runHttpFileLoadTasks(final HttpFileTask oldTask, final int reason) { + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + if (oldTask != null) { + currentHttpFileLoadTasksCount--; + } + if (oldTask != null) { + if (reason == 1) { + if (oldTask.canRetry) { + final HttpFileTask newTask = new HttpFileTask(oldTask.url, oldTask.tempFile, oldTask.ext); + Runnable runnable = new Runnable() { + @Override + public void run() { + httpFileLoadTasks.add(newTask); + runHttpFileLoadTasks(null, 0); + } + }; + retryHttpsTasks.put(oldTask.url, runnable); + AndroidUtilities.runOnUIThread(runnable, 1000); + } else { + NotificationCenter.getInstance().postNotificationName(NotificationCenter.httpFileDidFailedLoad, oldTask.url); + } + } else if (reason == 2) { + httpFileLoadTasksByKeys.remove(oldTask.url); + File file = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), Utilities.MD5(oldTask.url) + "." + oldTask.ext); + String result = oldTask.tempFile.renameTo(file) ? file.toString() : oldTask.tempFile.toString(); + NotificationCenter.getInstance().postNotificationName(NotificationCenter.httpFileDidLoaded, oldTask.url, result); + } + } + while (currentHttpFileLoadTasksCount < 2 && !httpFileLoadTasks.isEmpty()) { + HttpFileTask task = httpFileLoadTasks.poll(); + if (android.os.Build.VERSION.SDK_INT >= 11) { + task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null, null, null); + } else { + task.execute(null, null, null); + } + currentHttpFileLoadTasksCount++; } - } else if (reason == 2) { - httpFileLoadTasksByKeys.remove(oldTask.url); - File file = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), Utilities.MD5(oldTask.url) + "." + oldTask.ext); - String result = oldTask.tempFile.renameTo(file) ? file.toString() : oldTask.tempFile.toString(); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.httpFileDidLoaded, oldTask.url, result); } - } - while (currentHttpFileLoadTasksCount < 2 && !httpFileLoadTasks.isEmpty()) { - HttpFileTask task = httpFileLoadTasks.poll(); - if (android.os.Build.VERSION.SDK_INT >= 11) { - task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null, null, null); - } else { - task.execute(null, null, null); - } - currentHttpFileLoadTasksCount++; - } + }); } public static Bitmap loadBitmap(String path, Uri uri, float maxWidth, float maxHeight, boolean useMaxScale) { diff --git a/TMessagesProj/src/main/java/org/telegram/android/ImageReceiver.java b/TMessagesProj/src/main/java/org/telegram/android/ImageReceiver.java index 9c467f72b..6ecff83d1 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/ImageReceiver.java +++ b/TMessagesProj/src/main/java/org/telegram/android/ImageReceiver.java @@ -69,6 +69,8 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg private int alpha = 255; private boolean isPressed; private boolean disableRecycle; + private int orientation; + private boolean centerRotation; private ImageReceiverDelegate delegate; public ImageReceiver() { @@ -209,6 +211,15 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg return isPressed; } + public void setOrientation(int angle, boolean center) { + orientation = angle; + centerRotation = center; + } + + public int getOrientation() { + return orientation; + } + public void setImageBitmap(Bitmap bitmap) { setImageBitmap(bitmap != null ? new BitmapDrawable(null, bitmap) : null); } @@ -280,8 +291,17 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg canvas.drawRoundRect(roundRect, roundRadius, roundRadius, roundPaint); } } else { - int bitmapW = bitmapDrawable.getIntrinsicWidth(); - int bitmapH = bitmapDrawable.getIntrinsicHeight(); + int bitmapW; + int bitmapH; + int originalW = bitmapDrawable.getIntrinsicWidth(); + int originalH = bitmapDrawable.getIntrinsicHeight(); + if (orientation == 90 || orientation == 270) { + bitmapW = bitmapDrawable.getIntrinsicHeight(); + bitmapH = bitmapDrawable.getIntrinsicWidth(); + } else { + bitmapW = bitmapDrawable.getIntrinsicWidth(); + bitmapH = bitmapDrawable.getIntrinsicHeight(); + } float scaleW = bitmapW / (float) imageW; float scaleH = bitmapH / (float) imageH; @@ -312,14 +332,32 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg canvas.save(); canvas.clipRect(imageX, imageY, imageX + imageW, imageY + imageH); + if (orientation != 0) { + if (centerRotation) { + canvas.rotate(orientation, imageW / 2, imageH / 2); + } else { + canvas.rotate(orientation, 0, 0); + } + } + if (bitmapW / scaleH > imageW) { bitmapW /= scaleH; + originalW /= scaleH; drawRegion.set(imageX - (bitmapW - imageW) / 2, imageY, imageX + (bitmapW + imageW) / 2, imageY + imageH); } else { bitmapH /= scaleW; + originalH /= scaleW; drawRegion.set(imageX, imageY - (bitmapH - imageH) / 2, imageX + imageW, imageY + (bitmapH + imageH) / 2); } - bitmapDrawable.setBounds(drawRegion); + if (orientation == 90 || orientation == 270) { + int width = (drawRegion.right - drawRegion.left) / 2; + int height = (drawRegion.bottom - drawRegion.top) / 2; + int centerX = (drawRegion.right + drawRegion.left) / 2; + int centerY = (drawRegion.top + drawRegion.bottom) / 2; + bitmapDrawable.setBounds(centerX - height, centerY - width, centerX + height, centerY + width); + } else { + bitmapDrawable.setBounds(drawRegion); + } if (isVisible) { try { bitmapDrawable.setAlpha(alpha); @@ -339,8 +377,24 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg canvas.restore(); } else { + canvas.save(); + if (orientation != 0) { + if (centerRotation) { + canvas.rotate(orientation, imageW / 2, imageH / 2); + } else { + canvas.rotate(orientation, 0, 0); + } + } drawRegion.set(imageX, imageY, imageX + imageW, imageY + imageH); - bitmapDrawable.setBounds(drawRegion); + if (orientation == 90 || orientation == 270) { + int width = (drawRegion.right - drawRegion.left) / 2; + int height = (drawRegion.bottom - drawRegion.top) / 2; + int centerX = (drawRegion.right + drawRegion.left) / 2; + int centerY = (drawRegion.top + drawRegion.bottom) / 2; + bitmapDrawable.setBounds(centerX - height, centerY - width, centerX + height, centerY + width); + } else { + bitmapDrawable.setBounds(drawRegion); + } if (isVisible) { try { bitmapDrawable.setAlpha(alpha); @@ -357,6 +411,7 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg FileLog.e("tmessages", e); } } + canvas.restore(); } } } @@ -391,6 +446,16 @@ public class ImageReceiver implements NotificationCenter.NotificationCenterDeleg return null; } + public int getBitmapWidth() { + Bitmap bitmap = getBitmap(); + return orientation == 0 || orientation == 180 ? bitmap.getWidth() : bitmap.getHeight(); + } + + public int getBitmapHeight() { + Bitmap bitmap = getBitmap(); + return orientation == 0 || orientation == 180 ? bitmap.getHeight() : bitmap.getWidth(); + } + public void setVisible(boolean value, boolean invalidate) { if (isVisible == value) { return; diff --git a/TMessagesProj/src/main/java/org/telegram/android/LocaleController.java b/TMessagesProj/src/main/java/org/telegram/android/LocaleController.java index db7b228b3..3fffe63d0 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/LocaleController.java +++ b/TMessagesProj/src/main/java/org/telegram/android/LocaleController.java @@ -54,6 +54,7 @@ public class LocaleController { public static FastDateFormat formatterWeek; public static FastDateFormat formatterMonth; public static FastDateFormat formatterYear; + public static FastDateFormat formatterMonthYear; public static FastDateFormat formatterYearMax; public static FastDateFormat chatDate; public static FastDateFormat chatFullDate; @@ -135,7 +136,7 @@ public class LocaleController { addRules(new String[]{"bem", "brx", "da", "de", "el", "en", "eo", "es", "et", "fi", "fo", "gl", "he", "iw", "it", "nb", "nl", "nn", "no", "sv", "af", "bg", "bn", "ca", "eu", "fur", "fy", "gu", "ha", "is", "ku", "lb", "ml", "mr", "nah", "ne", "om", "or", "pa", "pap", "ps", "so", "sq", "sw", "ta", "te", - "tk", "ur", "zu", "mn", "gsw", "chr", "rm", "pt"}, new PluralRules_One()); + "tk", "ur", "zu", "mn", "gsw", "chr", "rm", "pt", "an", "ast"}, new PluralRules_One()); addRules(new String[]{"cs", "sk"}, new PluralRules_Czech()); addRules(new String[]{"ff", "fr", "kab"}, new PluralRules_French()); addRules(new String[]{"hr", "ru", "sr", "uk", "be", "bs", "sh"}, new PluralRules_Balkan()); @@ -544,6 +545,9 @@ public class LocaleController { currentLocale = newLocale; currentLocaleInfo = localeInfo; currentPluralRules = allRules.get(currentLocale.getLanguage()); + if (currentPluralRules == null) { + currentPluralRules = allRules.get("en"); + } changingConfiguration = true; Locale.setDefault(currentLocale); android.content.res.Configuration config = new android.content.res.Configuration(); @@ -571,6 +575,9 @@ public class LocaleController { if (value == null) { value = ApplicationLoader.applicationContext.getString(res); } + if (value == null) { + value = "LOC_ERR:" + key; + } return value; } @@ -638,6 +645,9 @@ public class LocaleController { } currentLocale = newLocale; currentPluralRules = allRules.get(currentLocale.getLanguage()); + if (currentPluralRules == null) { + currentPluralRules = allRules.get("en"); + } } } } @@ -695,6 +705,20 @@ public class LocaleController { } } + private FastDateFormat createFormatter(Locale locale, String format, String defaultFormat) { + if (format == null || format.length() == 0) { + format = defaultFormat; + } + FastDateFormat formatter = null; + try { + formatter = FastDateFormat.getInstance(format, locale); + } catch (Exception e) { + format = defaultFormat; + formatter = FastDateFormat.getInstance(format, locale); + } + return formatter; + } + public void recreateFormatters() { Locale locale = currentLocale; if (locale == null) { @@ -706,59 +730,15 @@ public class LocaleController { } isRTL = lang.toLowerCase().equals("ar"); nameDisplayOrder = lang.toLowerCase().equals("ko") ? 2 : 1; - String formatString = getStringInternal("formatterMonth", R.string.formatterMonth); - if (formatString == null || formatString.length() == 0) { - formatString = "dd MMM"; - } - formatterMonth = FastDateFormat.getInstance(formatString, locale); - formatString = getStringInternal("formatterYear", R.string.formatterYear); - if (formatString == null || formatString.length() == 0) { - formatString = "dd.MM.yy"; - } - formatterYear = FastDateFormat.getInstance(formatString, locale); - - formatString = getStringInternal("formatterYearMax", R.string.formatterYearMax); - if (formatString == null || formatString.length() == 0) { - formatString = "dd.MM.yyyy"; - } - formatterYearMax = FastDateFormat.getInstance(formatString, locale); - - formatString = getStringInternal("chatDate", R.string.chatDate); - if (formatString == null || formatString.length() == 0) { - formatString = "d MMMM"; - } - chatDate = FastDateFormat.getInstance(formatString, locale); - - formatString = getStringInternal("chatFullDate", R.string.chatFullDate); - if (formatString == null || formatString.length() == 0) { - formatString = "d MMMM yyyy"; - } - chatFullDate = FastDateFormat.getInstance(formatString, locale); - - formatString = getStringInternal("formatterWeek", R.string.formatterWeek); - if (formatString == null || formatString.length() == 0) { - formatString = "EEE"; - } - formatterWeek = FastDateFormat.getInstance(formatString, locale); - - if (is24HourFormat) { - formatString = getStringInternal("formatterDay24H", R.string.formatterDay24H); - } else { - formatString = getStringInternal("formatterDay12H", R.string.formatterDay12H); - } - if (formatString == null || formatString.length() == 0) { - if (is24HourFormat) { - formatString = "HH:mm"; - } else { - formatString = "h:mm a"; - } - } - if (lang.toLowerCase().equals("ar") || lang.toLowerCase().equals("ko")) { - formatterDay = FastDateFormat.getInstance(formatString, locale); - } else { - formatterDay = FastDateFormat.getInstance(formatString, Locale.US); - } + formatterMonth = createFormatter(locale, getStringInternal("formatterMonth", R.string.formatterMonth), "dd MMM"); + formatterYear = createFormatter(locale, getStringInternal("formatterYear", R.string.formatterYear), "dd.MM.yy"); + formatterYearMax = createFormatter(locale, getStringInternal("formatterYearMax", R.string.formatterYearMax), "dd.MM.yyyy"); + chatDate = createFormatter(locale, getStringInternal("chatDate", R.string.chatDate), "d MMMM"); + chatFullDate = createFormatter(locale, getStringInternal("chatFullDate", R.string.chatFullDate), "d MMMM yyyy"); + formatterWeek = createFormatter(locale, getStringInternal("formatterWeek", R.string.formatterWeek), "EEE"); + formatterMonthYear = createFormatter(locale, getStringInternal("formatterMonthYear", R.string.formatterMonthYear), "MMMM yyyy"); + formatterDay = createFormatter(lang.toLowerCase().equals("ar") || lang.toLowerCase().equals("ko") ? locale : Locale.US, is24HourFormat ? getStringInternal("formatterDay24H", R.string.formatterDay24H) : getStringInternal("formatterDay12H", R.string.formatterDay12H), is24HourFormat ? "HH:mm" : "h:mm a"); } public static String stringForMessageListDate(long date) { diff --git a/TMessagesProj/src/main/java/org/telegram/android/MediaController.java b/TMessagesProj/src/main/java/org/telegram/android/MediaController.java index efa53b092..b520f8b8f 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/MediaController.java +++ b/TMessagesProj/src/main/java/org/telegram/android/MediaController.java @@ -165,6 +165,8 @@ public class MediaController implements NotificationCenter.NotificationCenterDel public int size; public int type; public int date; + public String thumbPath; + public String imagePath; } public final static String MIME_TYPE = "video/avc"; diff --git a/TMessagesProj/src/main/java/org/telegram/android/MessageObject.java b/TMessagesProj/src/main/java/org/telegram/android/MessageObject.java index 1c6c0dd48..86db4605c 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/MessageObject.java +++ b/TMessagesProj/src/main/java/org/telegram/android/MessageObject.java @@ -42,6 +42,7 @@ public class MessageObject { public int type; public int contentType; public String dateKey; + public String monthKey; public boolean deleted = false; public float audioProgress; public int audioProgressSec; @@ -199,7 +200,7 @@ public class MessageObject { } } } else if (message.action instanceof TLRPC.TL_messageActionLoginUnknownLocation) { - String date = LocaleController.formatString("formatDateAtTime", R.string.formatDateAtTime, LocaleController.formatterYear.format(((long)message.date) * 1000), LocaleController.formatterDay.format(((long)message.date) * 1000)); + String date = LocaleController.formatString("formatDateAtTime", R.string.formatDateAtTime, LocaleController.formatterYear.format(((long) message.date) * 1000), LocaleController.formatterDay.format(((long) message.date) * 1000)); TLRPC.User to_user = UserConfig.getCurrentUser(); if (to_user == null) { if (users != null) { @@ -346,11 +347,14 @@ public class MessageObject { } Calendar rightNow = new GregorianCalendar(); - rightNow.setTimeInMillis((long)(messageOwner.date) * 1000); + rightNow.setTimeInMillis((long) (messageOwner.date) * 1000); int dateDay = rightNow.get(Calendar.DAY_OF_YEAR); int dateYear = rightNow.get(Calendar.YEAR); int dateMonth = rightNow.get(Calendar.MONTH); dateKey = String.format("%d_%02d_%02d", dateYear, dateMonth, dateDay); + if (contentType == 1 || contentType == 2) { + monthKey = String.format("%d_%02d", dateYear, dateMonth); + } if (generateLayout) { generateLayout(); @@ -556,7 +560,7 @@ public class MessageObject { textHeight = textLayout.getHeight(); int linesCount = textLayout.getLineCount(); - int blocksCount = (int)Math.ceil((float)linesCount / LINES_PER_BLOCK); + int blocksCount = (int) Math.ceil((float) linesCount / LINES_PER_BLOCK); int linesOffset = 0; float prevOffset = 0; @@ -581,7 +585,7 @@ public class MessageObject { block.textLayout = new StaticLayout(str, textPaint, maxWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); block.textYOffset = textLayout.getLineTop(linesOffset); if (a != 0) { - blockHeight = Math.min(blockHeight, (int)(block.textYOffset - prevOffset)); + blockHeight = Math.min(blockHeight, (int) (block.textYOffset - prevOffset)); } prevOffset = block.textYOffset; /*if (a != blocksCount - 1) { @@ -613,7 +617,7 @@ public class MessageObject { FileLog.e("tmessages", e); } - int linesMaxWidth = (int)Math.ceil(lastLine); + int linesMaxWidth = (int) Math.ceil(lastLine); int lastLineWidthWithLeft; int linesMaxWidthWithLeft; boolean hasNonRTL = false; @@ -622,7 +626,7 @@ public class MessageObject { lastLineWidth = linesMaxWidth; } - linesMaxWidthWithLeft = lastLineWidthWithLeft = (int)Math.ceil(lastLine + lastLeft); + linesMaxWidthWithLeft = lastLineWidthWithLeft = (int) Math.ceil(lastLine + lastLeft); if (lastLeft == 0) { hasNonRTL = true; } @@ -655,8 +659,8 @@ public class MessageObject { } textRealMaxWidth = Math.max(textRealMaxWidth, lineWidth); textRealMaxWidthWithLeft = Math.max(textRealMaxWidthWithLeft, lineWidth + lineLeft); - linesMaxWidth = Math.max(linesMaxWidth, (int)Math.ceil(lineWidth)); - linesMaxWidthWithLeft = Math.max(linesMaxWidthWithLeft, (int)Math.ceil(lineWidth + lineLeft)); + linesMaxWidth = Math.max(linesMaxWidth, (int) Math.ceil(lineWidth)); + linesMaxWidthWithLeft = Math.max(linesMaxWidthWithLeft, (int) Math.ceil(lineWidth + lineLeft)); } if (hasNonRTL) { textRealMaxWidth = textRealMaxWidthWithLeft; @@ -667,7 +671,7 @@ public class MessageObject { } else if (a == blocksCount - 1) { lastLineWidth = linesMaxWidth; } - textWidth = Math.max(textWidth, (int)Math.ceil(textRealMaxWidth)); + textWidth = Math.max(textWidth, (int) Math.ceil(textRealMaxWidth)); } else { textWidth = Math.max(textWidth, Math.min(maxWidth, linesMaxWidth)); } @@ -696,7 +700,7 @@ public class MessageObject { } public void setIsRead() { - messageOwner.flags &=~ TLRPC.MESSAGE_FLAG_UNREAD; + messageOwner.flags &= ~TLRPC.MESSAGE_FLAG_UNREAD; } public boolean isSecretPhoto() { @@ -706,15 +710,15 @@ public class MessageObject { public boolean isSecretMedia() { return messageOwner instanceof TLRPC.TL_message_secret && (messageOwner.media instanceof TLRPC.TL_messageMediaPhoto && messageOwner.ttl != 0 && messageOwner.ttl <= 60 || - messageOwner.media instanceof TLRPC.TL_messageMediaAudio || - messageOwner.media instanceof TLRPC.TL_messageMediaVideo); + messageOwner.media instanceof TLRPC.TL_messageMediaAudio || + messageOwner.media instanceof TLRPC.TL_messageMediaVideo); } public static void setIsUnread(TLRPC.Message message, boolean unread) { if (unread) { message.flags |= TLRPC.MESSAGE_FLAG_UNREAD; } else { - message.flags &=~ TLRPC.MESSAGE_FLAG_UNREAD; + message.flags &= ~TLRPC.MESSAGE_FLAG_UNREAD; } } diff --git a/TMessagesProj/src/main/java/org/telegram/android/MessagesController.java b/TMessagesProj/src/main/java/org/telegram/android/MessagesController.java index 71bd216e9..1eea13dc7 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/MessagesController.java +++ b/TMessagesProj/src/main/java/org/telegram/android/MessagesController.java @@ -102,6 +102,8 @@ public class MessagesController implements NotificationCenter.NotificationCenter public static final int UPDATE_MASK_READ_DIALOG_MESSAGE = 256; public static final int UPDATE_MASK_SELECT_DIALOG = 512; public static final int UPDATE_MASK_PHONE = 1024; + public static final int UPDATE_MASK_NEW_MESSAGE = 2048; + public static final int UPDATE_MASK_SEND_STATE = 4096; public static final int UPDATE_MASK_ALL = UPDATE_MASK_AVATAR | UPDATE_MASK_STATUS | UPDATE_MASK_NAME | UPDATE_MASK_CHAT_AVATAR | UPDATE_MASK_CHAT_NAME | UPDATE_MASK_CHAT_MEMBERS | UPDATE_MASK_USER_PRINT | UPDATE_MASK_USER_PHONE | UPDATE_MASK_READ_DIALOG_MESSAGE | UPDATE_MASK_PHONE; public static class PrintingUser { @@ -863,6 +865,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter AndroidUtilities.runOnUIThread(new Runnable() { @Override public void run() { + NotificationCenter.getInstance().postNotificationName(NotificationCenter.mainUserInfoChanged); NotificationCenter.getInstance().postNotificationName(NotificationCenter.updateInterfaces, MessagesController.UPDATE_MASK_ALL); UserConfig.saveConfig(true); } @@ -944,10 +947,6 @@ public class MessagesController implements NotificationCenter.NotificationCenter } public void deleteDialog(final long did, int offset, final boolean onlyHistory) { - if (offset == 0) { - MessagesStorage.getInstance().deleteDialog(did, onlyHistory); - } - int lower_part = (int)did; int high_id = (int)(did >> 32); @@ -963,7 +962,10 @@ public class MessagesController implements NotificationCenter.NotificationCenter dialog.unread_count = 0; } dialogMessage.remove(dialog.top_message); + dialog.top_message = 0; } + NotificationCenter.getInstance().postNotificationName(NotificationCenter.dialogsNeedReload); + NotificationCenter.getInstance().postNotificationName(NotificationCenter.removeAllMessagesFromDialog, did); MessagesStorage.getInstance().getStorageQueue().postRunnable(new Runnable() { @Override public void run() { @@ -978,8 +980,8 @@ public class MessagesController implements NotificationCenter.NotificationCenter }); } }); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.removeAllMessagesFromDialog, did); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.dialogsNeedReload); + + MessagesStorage.getInstance().deleteDialog(did, onlyHistory); } if (high_id == 1) { @@ -1437,8 +1439,8 @@ public class MessagesController implements NotificationCenter.NotificationCenter currentDialog.unread_count = entry.getValue(); } } - NotificationsController.getInstance().processDialogsUpdateRead(dialogsToUpdate); NotificationCenter.getInstance().postNotificationName(NotificationCenter.dialogsNeedReload); + NotificationsController.getInstance().processDialogsUpdateRead(dialogsToUpdate); } }); } @@ -1533,8 +1535,8 @@ public class MessagesController implements NotificationCenter.NotificationCenter dialogsServerOnly.add(d); } } - NotificationsController.getInstance().processDialogsUpdateRead(dialogsToUpdate); NotificationCenter.getInstance().postNotificationName(NotificationCenter.dialogsNeedReload); + NotificationsController.getInstance().processDialogsUpdateRead(dialogsToUpdate); } }); } @@ -1554,8 +1556,8 @@ public class MessagesController implements NotificationCenter.NotificationCenter if (resetEnd) { dialogsEndReached = false; } - loadDialogs(offset, serverOffset, count, false); NotificationCenter.getInstance().postNotificationName(NotificationCenter.dialogsNeedReload); + loadDialogs(offset, serverOffset, count, false); } }); return; @@ -1713,6 +1715,9 @@ public class MessagesController implements NotificationCenter.NotificationCenter req.peer.chat_id = -lower_part; } else { TLRPC.User user = getUser(lower_part); + if (user == null) { + return; + } if (user instanceof TLRPC.TL_userForeign || user instanceof TLRPC.TL_userRequest) { req.peer = new TLRPC.TL_inputPeerForeign(); req.peer.user_id = user.id; @@ -1865,8 +1870,8 @@ public class MessagesController implements NotificationCenter.NotificationCenter arr.add(newMsg); MessagesStorage.getInstance().putMessages(arr, false, true, false, 0); updateInterfaceWithMessages(newMsg.dialog_id, objArr); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.chatDidCreated, chat.id); NotificationCenter.getInstance().postNotificationName(NotificationCenter.dialogsNeedReload); + NotificationCenter.getInstance().postNotificationName(NotificationCenter.chatDidCreated, chat.id); return 0; } else { @@ -1903,8 +1908,8 @@ public class MessagesController implements NotificationCenter.NotificationCenter messagesObj.add(new MessageObject(res.message, users, true)); TLRPC.Chat chat = res.chats.get(0); updateInterfaceWithMessages(-chat.id, messagesObj); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.chatDidCreated, chat.id); NotificationCenter.getInstance().postNotificationName(NotificationCenter.dialogsNeedReload); + NotificationCenter.getInstance().postNotificationName(NotificationCenter.chatDidCreated, chat.id); if (uploadedAvatar != null) { changeChatAvatar(chat.id, uploadedAvatar); } @@ -1950,8 +1955,8 @@ public class MessagesController implements NotificationCenter.NotificationCenter messagesObj.add(new MessageObject(res.message, users, true)); TLRPC.Chat chat = res.chats.get(0); updateInterfaceWithMessages(-chat.id, messagesObj); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.updateInterfaces, UPDATE_MASK_CHAT_MEMBERS); NotificationCenter.getInstance().postNotificationName(NotificationCenter.dialogsNeedReload); + NotificationCenter.getInstance().postNotificationName(NotificationCenter.updateInterfaces, UPDATE_MASK_CHAT_MEMBERS); if (info != null) { for (TLRPC.TL_chatParticipant p : info.participants) { @@ -2032,8 +2037,8 @@ public class MessagesController implements NotificationCenter.NotificationCenter messagesObj.add(new MessageObject(res.message, users, true)); TLRPC.Chat chat = res.chats.get(0); updateInterfaceWithMessages(-chat.id, messagesObj); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.updateInterfaces, UPDATE_MASK_CHAT_MEMBERS); NotificationCenter.getInstance().postNotificationName(NotificationCenter.dialogsNeedReload); + NotificationCenter.getInstance().postNotificationName(NotificationCenter.updateInterfaces, UPDATE_MASK_CHAT_MEMBERS); } boolean changed = false; if (info != null) { @@ -2851,10 +2856,10 @@ public class MessagesController implements NotificationCenter.NotificationCenter } public boolean isDialogMuted(long dialog_id) { - TLRPC.TL_dialog dialog = dialogs_dict.get(dialog_id); + /*TLRPC.TL_dialog dialog = dialogs_dict.get(dialog_id); if (dialog != null) { return isNotifySettingsMuted(dialog.notify_settings); - } else { + } else {*/ SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); int mute_type = preferences.getInt("notify2_" + dialog_id, 0); if (mute_type == 2) { @@ -2865,7 +2870,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter return true; } } - } + //} return false; } diff --git a/TMessagesProj/src/main/java/org/telegram/android/MessagesStorage.java b/TMessagesProj/src/main/java/org/telegram/android/MessagesStorage.java index 87f0e1982..160447dec 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/MessagesStorage.java +++ b/TMessagesProj/src/main/java/org/telegram/android/MessagesStorage.java @@ -838,6 +838,59 @@ public class MessagesStorage { //database.executeFast("DELETE FROM secret_holes WHERE uid = " + high_id).stepThis().dispose(); } } + + if ((int) did == 0) { + SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT data FROM messages WHERE uid = " + did)); + ArrayList filesToDelete = new ArrayList<>(); + try { + while (cursor.next()) { + ByteBufferDesc data = buffersStorage.getFreeBuffer(cursor.byteArrayLength(0)); + if (data != null && cursor.byteBufferValue(0, data.buffer) != 0) { + TLRPC.Message message = (TLRPC.Message) TLClassStore.Instance().TLdeserialize(data, data.readInt32()); + if (message == null || message.media == null) { + continue; + } + if (message.media instanceof TLRPC.TL_messageMediaAudio) { + File file = FileLoader.getPathToAttach(message.media.audio); + if (file != null && file.toString().length() > 0) { + filesToDelete.add(file); + } + } else if (message.media instanceof TLRPC.TL_messageMediaPhoto) { + for (TLRPC.PhotoSize photoSize : message.media.photo.sizes) { + File file = FileLoader.getPathToAttach(photoSize); + if (file != null && file.toString().length() > 0) { + filesToDelete.add(file); + } + } + } else if (message.media instanceof TLRPC.TL_messageMediaVideo) { + File file = FileLoader.getPathToAttach(message.media.video); + if (file != null && file.toString().length() > 0) { + filesToDelete.add(file); + } + file = FileLoader.getPathToAttach(message.media.video.thumb); + if (file != null && file.toString().length() > 0) { + filesToDelete.add(file); + } + } else if (message.media instanceof TLRPC.TL_messageMediaDocument) { + File file = FileLoader.getPathToAttach(message.media.document); + if (file != null && file.toString().length() > 0) { + filesToDelete.add(file); + } + file = FileLoader.getPathToAttach(message.media.document.thumb); + if (file != null && file.toString().length() > 0) { + filesToDelete.add(file); + } + } + } + buffersStorage.reuseFreeBuffer(data); + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + cursor.dispose(); + FileLoader.getInstance().deleteFiles(filesToDelete); + } + database.executeFast("UPDATE dialogs SET unread_count = 0 WHERE did = " + did).stepThis().dispose(); database.executeFast("DELETE FROM messages WHERE uid = " + did).stepThis().dispose(); database.executeFast("DELETE FROM media_counts_v2 WHERE uid = " + did).stepThis().dispose(); @@ -3178,6 +3231,7 @@ public class MessagesStorage { NotificationCenter.getInstance().postNotificationName(NotificationCenter.messagesDeleted, mids); } }); + MessagesStorage.getInstance().updateDialogsWithReadedMessagesInternal(mids); MessagesStorage.getInstance().markMessagesAsDeletedInternal(mids); MessagesStorage.getInstance().updateDialogsWithDeletedMessagesInternal(mids); } @@ -3189,9 +3243,6 @@ public class MessagesStorage { } private void markMessagesAsDeletedInternal(final ArrayList messages) { - if (Thread.currentThread().getId() != storageQueue.getId()) { - throw new RuntimeException("wrong db thread"); - } try { String ids = TextUtils.join(",", messages); SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT uid, data FROM messages WHERE mid IN(%s)", ids)); @@ -3287,7 +3338,7 @@ public class MessagesStorage { ArrayList usersToLoad = new ArrayList<>(); ArrayList chatsToLoad = new ArrayList<>(); ArrayList encryptedToLoad = new ArrayList<>(); - 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 FROM dialogs as d LEFT JOIN messages as m ON d.last_mid = m.mid WHERE d.did IN(%s)", ids)); + 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)", ids)); while (cursor.next()) { TLRPC.TL_dialog dialog = new TLRPC.TL_dialog(); dialog.id = cursor.longValue(0); @@ -3302,6 +3353,10 @@ public class MessagesStorage { MessageObject.setIsUnread(message, cursor.intValue(5) != 1); message.id = cursor.intValue(6); message.send_state = cursor.intValue(7); + int date = cursor.intValue(8); + if (date != 0) { + dialog.last_message_date = date; + } dialogs.messages.add(message); if (!usersToLoad.contains(message.from_id)) { @@ -3471,7 +3526,7 @@ public class MessagesStorage { usersToLoad.add(UserConfig.getClientUserId()); ArrayList chatsToLoad = new ArrayList<>(); ArrayList encryptedToLoad = new ArrayList<>(); - SQLiteCursor 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, s.flags FROM dialogs as d LEFT JOIN messages as m ON d.last_mid = m.mid LEFT JOIN dialog_settings as s ON d.did = s.did ORDER BY d.date DESC LIMIT %d,%d", offset, count)); + SQLiteCursor 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, s.flags, m.date FROM dialogs as d LEFT JOIN messages as m ON d.last_mid = m.mid LEFT JOIN dialog_settings as s ON d.did = s.did ORDER BY d.date DESC LIMIT %d,%d", offset, count)); while (cursor.next()) { TLRPC.TL_dialog dialog = new TLRPC.TL_dialog(); dialog.id = cursor.longValue(0); @@ -3495,6 +3550,10 @@ public class MessagesStorage { if (message != null) { MessageObject.setIsUnread(message, cursor.intValue(5) != 1); message.id = cursor.intValue(6); + int date = cursor.intValue(9); + if (date != 0) { + dialog.last_message_date = date; + } message.send_state = cursor.intValue(7); dialogs.messages.add(message); diff --git a/TMessagesProj/src/main/java/org/telegram/android/NativeLoader.java b/TMessagesProj/src/main/java/org/telegram/android/NativeLoader.java index eecbbb175..17e55ea26 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/NativeLoader.java +++ b/TMessagesProj/src/main/java/org/telegram/android/NativeLoader.java @@ -23,7 +23,7 @@ import java.util.zip.ZipFile; public class NativeLoader { - private final static int LIB_VERSION = 5; + private final static int LIB_VERSION = 6; private final static String LIB_NAME = "tmessages." + LIB_VERSION; private final static String LIB_SO_NAME = "lib" + LIB_NAME + ".so"; private final static String LOCALE_LIB_SO_NAME = "lib" + LIB_NAME + "loc.so"; diff --git a/TMessagesProj/src/main/java/org/telegram/android/NotificationCenter.java b/TMessagesProj/src/main/java/org/telegram/android/NotificationCenter.java index 6e045c321..5ae1cae0b 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/NotificationCenter.java +++ b/TMessagesProj/src/main/java/org/telegram/android/NotificationCenter.java @@ -48,6 +48,9 @@ public class NotificationCenter { public static final int updateMessageMedia = totalEvents++; public static final int recentImagesDidLoaded = totalEvents++; public static final int replaceMessagesObjects = totalEvents++; + public static final int didSetPasscode = totalEvents++; + public static final int screenStateChanged = totalEvents++; + public static final int appSwitchedToForeground = totalEvents++; public static final int httpFileDidLoaded = totalEvents++; public static final int httpFileDidFailedLoad = totalEvents++; diff --git a/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java b/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java index c0cc5d4f9..f90fcef75 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java +++ b/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java @@ -11,6 +11,7 @@ package org.telegram.android; import android.app.Activity; import android.app.AlarmManager; import android.app.PendingIntent; +import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; @@ -29,6 +30,7 @@ import android.support.v4.app.RemoteInput; import org.json.JSONArray; import org.json.JSONObject; import org.telegram.messenger.ConnectionsManager; +import org.telegram.messenger.DispatchQueue; import org.telegram.messenger.FileLog; import org.telegram.messenger.R; import org.telegram.messenger.RPCRequest; @@ -48,6 +50,7 @@ public class NotificationsController { public static final String EXTRA_VOICE_REPLY = "extra_voice_reply"; + private DispatchQueue notificationsQueue = new DispatchQueue("notificationsQueue"); private ArrayList pushMessages = new ArrayList<>(); private HashMap pushMessagesDict = new HashMap<>(); private NotificationManagerCompat notificationManager = null; @@ -130,7 +133,9 @@ public class NotificationsController { } String msg = null; - if ((int)dialog_id != 0) { + if ((int)dialog_id == 0 || AndroidUtilities.needShowPasscode(false) || UserConfig.isWaitingForPasscodeEnter) { + msg = LocaleController.getString("YouHaveNewMessage", R.string.YouHaveNewMessage); + } else { if (chat_id == 0 && user_id != 0) { SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Context.MODE_PRIVATE); if (preferences.getBoolean("EnablePreviewAll", true)) { @@ -237,8 +242,6 @@ public class NotificationsController { msg = LocaleController.formatString("NotificationMessageGroupNoText", R.string.NotificationMessageGroupNoText, ContactsController.formatName(user.first_name, user.last_name), chat.title); } } - } else { - msg = LocaleController.getString("YouHaveNewMessage", R.string.YouHaveNewMessage); } return msg; } @@ -250,7 +253,7 @@ public class NotificationsController { SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); int minutes = preferences.getInt("repeat_messages", 60); if (minutes > 0 && personal_count > 0) { - alarm.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + minutes * 60 * 1000, pintent); + alarm.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + minutes * 60 * 1000, pintent); } else { alarm.cancel(pintent); } @@ -266,9 +269,9 @@ public class NotificationsController { PendingIntent pintent = PendingIntent.getService(ApplicationLoader.applicationContext, 0, new Intent(ApplicationLoader.applicationContext, NotificationDelay.class), 0); SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); if (onlineReason) { - alarm.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 3 * 1000, pintent); + alarm.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 3 * 1000, pintent); } else { - alarm.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 500, pintent); + alarm.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 500, pintent); } } catch (Exception e) { FileLog.e("tmessages", e); @@ -416,14 +419,18 @@ public class NotificationsController { intent.putExtra("userId", user_id); } } - if (pushDialogs.size() == 1) { - if (chat != null) { - 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; - } - } else { - if (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; + if (AndroidUtilities.needShowPasscode(false) || UserConfig.isWaitingForPasscodeEnter) { + photoPath = null; + } else { + if (pushDialogs.size() == 1) { + if (chat != null) { + 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; + } + } else { + if (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; + } } } } @@ -436,7 +443,7 @@ public class NotificationsController { String name = null; boolean replace = true; - if ((int)dialog_id == 0 || pushDialogs.size() > 1) { + if ((int)dialog_id == 0 || pushDialogs.size() > 1 || AndroidUtilities.needShowPasscode(false) || UserConfig.isWaitingForPasscodeEnter) { name = LocaleController.getString("AppName", R.string.AppName); replace = false; } else { @@ -451,7 +458,7 @@ public class NotificationsController { if (pushDialogs.size() == 1) { detailText = LocaleController.formatPluralString("NewMessages", total_unread_count); } else { - detailText = LocaleController.formatString("NotificationMessagesPeopleDisplayOrder", R.string.NotificationMessagesPeopleDisplayOrder, LocaleController.formatPluralString("NewMessages", total_unread_count), LocaleController.formatPluralString("FromContacts", pushDialogs.size())); + detailText = LocaleController.formatString("NotificationMessagesPeopleDisplayOrder", R.string.NotificationMessagesPeopleDisplayOrder, LocaleController.formatPluralString("NewMessages", total_unread_count), LocaleController.formatPluralString("FromChats", pushDialogs.size())); } NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(ApplicationLoader.applicationContext) @@ -834,7 +841,7 @@ public class NotificationsController { notifyCheck = isLast; } - if (!popupMessages.isEmpty() && oldCount != popupMessages.size()) { + if (!popupMessages.isEmpty() && oldCount != popupMessages.size() && !AndroidUtilities.needShowPasscode(false)) { if (ApplicationLoader.mainInterfacePaused || !ApplicationLoader.isScreenOn) { MessageObject messageObject = messageObjects.get(0); if (popup == 3 || popup == 1 && ApplicationLoader.isScreenOn || popup == 2 && !ApplicationLoader.isScreenOn) { @@ -988,20 +995,33 @@ public class NotificationsController { setBadge(ApplicationLoader.applicationContext, enabled ? total_unread_count : 0); } - private void setBadge(Context context, int count) { - try { - String launcherClassName = getLauncherClassName(context); - if (launcherClassName == null) { - return; + private void setBadge(final Context context, final int count) { + notificationsQueue.postRunnable(new Runnable() { + @Override + public void run() { + try { + ContentValues cv = new ContentValues(); + cv.put("tag", "org.telegram.messenger/org.telegram.ui.LaunchActivity"); + cv.put("count", count); + context.getContentResolver().insert(Uri.parse("content://com.teslacoilsw.notifier/unread_count"), cv); + } catch (Throwable e) { + //ignore + } + try { + String launcherClassName = getLauncherClassName(context); + if (launcherClassName == null) { + return; + } + Intent intent = new Intent("android.intent.action.BADGE_COUNT_UPDATE"); + intent.putExtra("badge_count", count); + intent.putExtra("badge_count_package_name", context.getPackageName()); + intent.putExtra("badge_count_class_name", launcherClassName); + context.sendBroadcast(intent); + } catch (Throwable e) { + FileLog.e("tmessages", e); + } } - Intent intent = new Intent("android.intent.action.BADGE_COUNT_UPDATE"); - intent.putExtra("badge_count", count); - intent.putExtra("badge_count_package_name", context.getPackageName()); - intent.putExtra("badge_count_class_name", launcherClassName); - context.sendBroadcast(intent); - } catch (Throwable e) { - FileLog.e("tmessages", e); - } + }); } public static String getLauncherClassName(Context context) { diff --git a/TMessagesProj/src/main/java/org/telegram/android/ScreenReceiver.java b/TMessagesProj/src/main/java/org/telegram/android/ScreenReceiver.java index e6b6c7572..d7824f18b 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/ScreenReceiver.java +++ b/TMessagesProj/src/main/java/org/telegram/android/ScreenReceiver.java @@ -28,5 +28,6 @@ public class ScreenReceiver extends BroadcastReceiver { ConnectionsManager.getInstance().setAppPaused(false, true); ApplicationLoader.isScreenOn = true; } + NotificationCenter.getInstance().postNotificationName(NotificationCenter.screenStateChanged); } } diff --git a/TMessagesProj/src/main/java/org/telegram/android/SecretChatHelper.java b/TMessagesProj/src/main/java/org/telegram/android/SecretChatHelper.java index 6a1140245..1cc95296d 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/SecretChatHelper.java +++ b/TMessagesProj/src/main/java/org/telegram/android/SecretChatHelper.java @@ -1072,8 +1072,8 @@ public class SecretChatHelper { } }); MessagesStorage.getInstance().deleteDialog(did, true); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.removeAllMessagesFromDialog, did); NotificationCenter.getInstance().postNotificationName(NotificationCenter.dialogsNeedReload); + NotificationCenter.getInstance().postNotificationName(NotificationCenter.removeAllMessagesFromDialog, did); } }); return null; @@ -1616,7 +1616,7 @@ public class SecretChatHelper { } public void startSecretChat(final Context context, final TLRPC.User user) { - if (user == null) { + if (user == null || context == null) { return; } startingSecretChat = true; diff --git a/TMessagesProj/src/main/java/org/telegram/android/SendMessagesHelper.java b/TMessagesProj/src/main/java/org/telegram/android/SendMessagesHelper.java index b7dc050d7..4cb3e851d 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/SendMessagesHelper.java +++ b/TMessagesProj/src/main/java/org/telegram/android/SendMessagesHelper.java @@ -481,6 +481,10 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter sendMessage(null, null, null, null, null, null, user, null, null, null, peer, false, null); } + public void sendMessage(ArrayList messages) { + + } + public void sendMessage(MessageObject message) { sendMessage(null, null, null, null, null, message, null, null, null, null, message.getDialogId(), true, message.messageOwner.attachPath); } @@ -1610,6 +1614,7 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter try { Bitmap bitmap = ImageLoader.loadBitmap(f.getAbsolutePath(), null, 90, 90, true); if (bitmap != null) { + fileName.file_name = "animation.gif"; document.thumb = ImageLoader.scaleAndSaveImage(bitmap, 90, 90, 55, isEncrypted); } } catch (Exception e) { @@ -1744,7 +1749,7 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter document.id = 0; document.date = ConnectionsManager.getInstance().getCurrentTime(); TLRPC.TL_documentAttributeFilename fileName = new TLRPC.TL_documentAttributeFilename(); - fileName.file_name = md5; + fileName.file_name = "animation.gif"; document.attributes.add(fileName); document.size = searchImage.size; document.dc_id = 0; @@ -1940,112 +1945,116 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter new Thread(new Runnable() { @Override public void run() { + boolean isEncrypted = (int)dialog_id == 0; - String path = videoPath; - String originalPath = videoPath; - File temp = new File(originalPath); - originalPath += temp.length() + "_" + temp.lastModified(); - if (videoEditedInfo != null) { - originalPath += duration + "_" + videoEditedInfo.startTime + "_" + videoEditedInfo.endTime; - } - TLRPC.TL_video video = null; - if (!isEncrypted) { - video = (TLRPC.TL_video) MessagesStorage.getInstance().getSentFile(originalPath, !isEncrypted ? 2 : 5); - } - if (video == null) { - Bitmap thumb = ThumbnailUtils.createVideoThumbnail(videoPath, MediaStore.Video.Thumbnails.MINI_KIND); - TLRPC.PhotoSize size = ImageLoader.scaleAndSaveImage(thumb, 90, 90, 55, isEncrypted); - video = new TLRPC.TL_video(); - video.thumb = size; - if (video.thumb == null) { - video.thumb = new TLRPC.TL_photoSizeEmpty(); - video.thumb.type = "s"; - } else { - video.thumb.type = "s"; - } - video.caption = ""; - video.mime_type = "video/mp4"; - video.id = 0; - UserConfig.saveConfig(false); - + if (videoEditedInfo != null || videoPath.endsWith("mp4")) { + String path = videoPath; + String originalPath = videoPath; + File temp = new File(originalPath); + originalPath += temp.length() + "_" + temp.lastModified(); if (videoEditedInfo != null) { - video.duration = (int)(duration / 1000); - if (videoEditedInfo.rotationValue == 90 || videoEditedInfo.rotationValue == 270) { - video.w = height; - video.h = width; + originalPath += duration + "_" + videoEditedInfo.startTime + "_" + videoEditedInfo.endTime; + } + TLRPC.TL_video video = null; + if (!isEncrypted) { + video = (TLRPC.TL_video) MessagesStorage.getInstance().getSentFile(originalPath, !isEncrypted ? 2 : 5); + } + if (video == null) { + Bitmap thumb = ThumbnailUtils.createVideoThumbnail(videoPath, MediaStore.Video.Thumbnails.MINI_KIND); + TLRPC.PhotoSize size = ImageLoader.scaleAndSaveImage(thumb, 90, 90, 55, isEncrypted); + video = new TLRPC.TL_video(); + video.thumb = size; + if (video.thumb == null) { + video.thumb = new TLRPC.TL_photoSizeEmpty(); + video.thumb.type = "s"; } else { - video.w = width; - video.h = height; + video.thumb.type = "s"; } - video.size = (int)estimatedSize; - video.videoEditedInfo = videoEditedInfo; - String fileName = Integer.MIN_VALUE + "_" + UserConfig.lastLocalId + ".mp4"; - UserConfig.lastLocalId--; - File cacheFile = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), fileName); + video.caption = ""; + video.mime_type = "video/mp4"; + video.id = 0; UserConfig.saveConfig(false); - path = cacheFile.getAbsolutePath(); - } else { - if (temp != null && temp.exists()) { - video.size = (int) temp.length(); - } - boolean infoObtained = false; - if (Build.VERSION.SDK_INT >= 14) { - MediaMetadataRetriever mediaMetadataRetriever = null; - try { - mediaMetadataRetriever = new MediaMetadataRetriever(); - mediaMetadataRetriever.setDataSource(videoPath); - String width = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH); - if (width != null) { - video.w = Integer.parseInt(width); - } - String height = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT); - if (height != null) { - video.h = Integer.parseInt(height); - } - String duration = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); - if (duration != null) { - video.duration = (int) Math.ceil(Long.parseLong(duration) / 1000.0f); - } - infoObtained = true; - } catch (Exception e) { - FileLog.e("tmessages", e); - } finally { + + if (videoEditedInfo != null) { + video.duration = (int) (duration / 1000); + if (videoEditedInfo.rotationValue == 90 || videoEditedInfo.rotationValue == 270) { + video.w = height; + video.h = width; + } else { + video.w = width; + video.h = height; + } + video.size = (int) estimatedSize; + video.videoEditedInfo = videoEditedInfo; + String fileName = Integer.MIN_VALUE + "_" + UserConfig.lastLocalId + ".mp4"; + UserConfig.lastLocalId--; + File cacheFile = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), fileName); + UserConfig.saveConfig(false); + path = cacheFile.getAbsolutePath(); + } else { + if (temp != null && temp.exists()) { + video.size = (int) temp.length(); + } + boolean infoObtained = false; + if (Build.VERSION.SDK_INT >= 14) { + MediaMetadataRetriever mediaMetadataRetriever = null; try { - if (mediaMetadataRetriever != null) { - mediaMetadataRetriever.release(); - mediaMetadataRetriever = null; + mediaMetadataRetriever = new MediaMetadataRetriever(); + mediaMetadataRetriever.setDataSource(videoPath); + String width = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH); + if (width != null) { + video.w = Integer.parseInt(width); + } + String height = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT); + if (height != null) { + video.h = Integer.parseInt(height); + } + String duration = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); + if (duration != null) { + video.duration = (int) Math.ceil(Long.parseLong(duration) / 1000.0f); + } + infoObtained = true; + } catch (Exception e) { + FileLog.e("tmessages", e); + } finally { + try { + if (mediaMetadataRetriever != null) { + mediaMetadataRetriever.release(); + mediaMetadataRetriever = null; + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + } + if (!infoObtained) { + try { + MediaPlayer mp = MediaPlayer.create(ApplicationLoader.applicationContext, Uri.fromFile(new File(videoPath))); + if (mp != null) { + video.duration = (int) Math.ceil(mp.getDuration() / 1000.0f); + video.w = mp.getVideoWidth(); + video.h = mp.getVideoHeight(); + mp.release(); } } catch (Exception e) { FileLog.e("tmessages", e); } } } - if (!infoObtained) { - try { - MediaPlayer mp = MediaPlayer.create(ApplicationLoader.applicationContext, Uri.fromFile(new File(videoPath))); - if (mp != null) { - video.duration = (int) Math.ceil(mp.getDuration() / 1000.0f); - video.w = mp.getVideoWidth(); - video.h = mp.getVideoHeight(); - mp.release(); - } - } catch (Exception e) { - FileLog.e("tmessages", e); - } + } + final TLRPC.TL_video videoFinal = video; + final String originalPathFinal = originalPath; + final String finalPath = path; + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + SendMessagesHelper.getInstance().sendMessage(videoFinal, originalPathFinal, finalPath, dialog_id); } - } + }); + } else { + prepareSendingDocumentInternal(videoPath, videoPath, null, null, dialog_id); } - - final TLRPC.TL_video videoFinal = video; - final String originalPathFinal = originalPath; - final String finalPath = path; - AndroidUtilities.runOnUIThread(new Runnable() { - @Override - public void run() { - SendMessagesHelper.getInstance().sendMessage(videoFinal, originalPathFinal, finalPath, dialog_id); - } - }); } }).start(); } diff --git a/TMessagesProj/src/main/java/org/telegram/android/video/MP4Builder.java b/TMessagesProj/src/main/java/org/telegram/android/video/MP4Builder.java index 9d9eca96d..cdb693328 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/video/MP4Builder.java +++ b/TMessagesProj/src/main/java/org/telegram/android/video/MP4Builder.java @@ -59,7 +59,7 @@ public class MP4Builder { private long dataOffset = 0; private long writedSinceLastMdat = 0; private boolean writeNewMdat = true; - private HashMap track2SampleSizes = new HashMap(); + private HashMap track2SampleSizes = new HashMap<>(); private ByteBuffer sizeBuffer = null; public MP4Builder createMovie(Mp4Movie mp4Movie) throws Exception { @@ -158,7 +158,7 @@ public class MP4Builder { } protected FileTypeBox createFileTypeBox() { - LinkedList minorBrands = new LinkedList(); + LinkedList minorBrands = new LinkedList<>(); minorBrands.add("isom"); minorBrands.add("3gp4"); return new FileTypeBox("isom", 0, minorBrands); @@ -347,7 +347,7 @@ public class MP4Builder { protected void createStts(Track track, SampleTableBox stbl) { TimeToSampleBox.Entry lastEntry = null; - List entries = new ArrayList(); + List entries = new ArrayList<>(); for (long delta : track.getSampleDurations()) { if (lastEntry != null && lastEntry.getDelta() == delta) { @@ -418,7 +418,7 @@ public class MP4Builder { } protected void createStco(Track track, SampleTableBox stbl) { - ArrayList chunksOffsets = new ArrayList(); + ArrayList chunksOffsets = new ArrayList<>(); long lastOffset = -1; for (Sample sample : track.getSamples()) { long offset = sample.getOffset(); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ApplicationLoader.java b/TMessagesProj/src/main/java/org/telegram/messenger/ApplicationLoader.java index b788712c3..481be8415 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ApplicationLoader.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ApplicationLoader.java @@ -8,6 +8,7 @@ package org.telegram.messenger; +import android.app.Activity; import android.app.AlarmManager; import android.app.Application; import android.app.PendingIntent; @@ -19,6 +20,7 @@ import android.content.SharedPreferences; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.res.Configuration; +import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Build; @@ -38,10 +40,13 @@ import org.telegram.android.LocaleController; import org.telegram.android.MessagesController; import org.telegram.android.NativeLoader; import org.telegram.android.ScreenReceiver; +import org.telegram.ui.Components.ForegroundDetector; +import java.io.File; import java.util.concurrent.atomic.AtomicInteger; public class ApplicationLoader extends Application { + private GoogleCloudMessaging gcm; private AtomicInteger msgId = new AtomicInteger(); private String regid; @@ -49,15 +54,80 @@ public class ApplicationLoader extends Application { public static final String PROPERTY_REG_ID = "registration_id"; private static final String PROPERTY_APP_VERSION = "appVersion"; private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000; - public static Drawable cachedWallpaper = null; + private static Drawable cachedWallpaper; + private static int selectedColor; + private static boolean isCustomTheme; + private static final Object sync = new Object(); - public static volatile Context applicationContext = null; - public static volatile Handler applicationHandler = null; + public static volatile Context applicationContext; + public static volatile Handler applicationHandler; private static volatile boolean applicationInited = false; public static volatile boolean isScreenOn = false; public static volatile boolean mainInterfacePaused = true; + public static boolean isCustomTheme() { + return isCustomTheme; + } + + public static int getSelectedColor() { + return selectedColor; + } + + public static void reloadWallpaper() { + cachedWallpaper = null; + loadWallpaper(); + } + + public static void loadWallpaper() { + if (cachedWallpaper != null) { + return; + } + Utilities.searchQueue.postRunnable(new Runnable() { + @Override + public void run() { + synchronized (sync) { + int selectedColor = 0; + try { + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); + int selectedBackground = preferences.getInt("selectedBackground", 1000001); + selectedColor = preferences.getInt("selectedColor", 0); + int cacheColorHint = 0; + if (selectedColor == 0) { + if (selectedBackground == 1000001) { + cachedWallpaper = applicationContext.getResources().getDrawable(R.drawable.background_hd); + isCustomTheme = false; + } else { + File toFile = new File(ApplicationLoader.applicationContext.getFilesDir(), "wallpaper.jpg"); + if (toFile.exists()) { + cachedWallpaper = Drawable.createFromPath(toFile.getAbsolutePath()); + isCustomTheme = true; + } else { + cachedWallpaper = applicationContext.getResources().getDrawable(R.drawable.background_hd); + isCustomTheme = false; + } + } + } + } catch (Throwable throwable) { + //ignore + } + if (cachedWallpaper == null) { + if (selectedColor == 0) { + selectedColor = -2693905; + } + cachedWallpaper = new ColorDrawable(selectedColor); + } + } + } + }); + } + + public static Drawable getCachedWallpaper() { + synchronized (sync) { + return cachedWallpaper; + } + } + public static void postInitApplication() { if (applicationInited) { return; @@ -117,6 +187,10 @@ public class ApplicationLoader extends Application { applicationContext = getApplicationContext(); NativeLoader.initNativeLibs(ApplicationLoader.applicationContext); + if (Build.VERSION.SDK_INT >= 14) { + new ForegroundDetector(this); + } + applicationHandler = new Handler(applicationContext.getMainLooper()); startPushService(); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ConnectionsManager.java b/TMessagesProj/src/main/java/org/telegram/messenger/ConnectionsManager.java index bc3dd2995..4661c8b0a 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ConnectionsManager.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ConnectionsManager.java @@ -452,7 +452,7 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection. datacenter = new Datacenter(); datacenter.datacenterId = 3; - datacenter.addAddressAndPort("174.140.142.6", 443); + datacenter.addAddressAndPort("149.154.175.100", 443); datacenters.put(datacenter.datacenterId, datacenter); datacenter = new Datacenter(); @@ -488,7 +488,7 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection. datacenter = new Datacenter(); datacenter.datacenterId = 3; - datacenter.addAddressAndPort("174.140.142.6", 443); + datacenter.addAddressAndPort("149.154.175.100", 443); datacenters.put(datacenter.datacenterId, datacenter); datacenter = new Datacenter(); @@ -1406,6 +1406,7 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection. if (rawRequest != null && (rawRequest instanceof TLRPC.TL_messages_sendMessage || rawRequest instanceof TLRPC.TL_messages_sendMedia || rawRequest instanceof TLRPC.TL_messages_forwardMessages || + rawRequest instanceof TLRPC.TL_messages_forwardMessage || rawRequest instanceof TLRPC.TL_messages_sendEncrypted || rawRequest instanceof TLRPC.TL_messages_sendEncryptedFile || rawRequest instanceof TLRPC.TL_messages_sendEncryptedService)) { @@ -1426,6 +1427,7 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection. if (currentRawRequest instanceof TLRPC.TL_messages_sendMessage || currentRawRequest instanceof TLRPC.TL_messages_sendMedia || currentRawRequest instanceof TLRPC.TL_messages_forwardMessages || + currentRawRequest instanceof TLRPC.TL_messages_forwardMessage || currentRawRequest instanceof TLRPC.TL_messages_sendEncrypted || currentRawRequest instanceof TLRPC.TL_messages_sendEncryptedFile || currentRawRequest instanceof TLRPC.TL_messages_sendEncryptedService) { @@ -1438,6 +1440,7 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection. if (request.rawRequest instanceof TLRPC.TL_messages_sendMessage || request.rawRequest instanceof TLRPC.TL_messages_sendMedia || request.rawRequest instanceof TLRPC.TL_messages_forwardMessages || + request.rawRequest instanceof TLRPC.TL_messages_forwardMessage || request.rawRequest instanceof TLRPC.TL_messages_sendEncrypted || request.rawRequest instanceof TLRPC.TL_messages_sendEncryptedFile || request.rawRequest instanceof TLRPC.TL_messages_sendEncryptedService) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java index b0e1ac4e9..74afae274 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java @@ -638,7 +638,7 @@ public class FileLoader { continue; } int currentSide = obj.w >= obj.h ? obj.w : obj.h; - if (closestObject == null || obj instanceof TLRPC.TL_photoCachedSize || currentSide <= side && lastSide < currentSide) { + if (closestObject == null || side > 100 && closestObject.location != null && closestObject.location.dc_id == Integer.MIN_VALUE || obj instanceof TLRPC.TL_photoCachedSize || currentSide <= side && lastSide < currentSide) { closestObject = obj; lastSide = currentSide; } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java b/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java index 0cd098656..6094e479c 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/UserConfig.java @@ -31,6 +31,12 @@ public class UserConfig { public static boolean saveIncomingPhotos = false; public static int contactsVersion = 1; public static boolean waitingForPasswordEnter = false; + public static String passcodeHash = ""; + public static boolean appLocked = false; + public static int passcodeType = 0; + public static int autoLockIn = 60 * 60; + public static int lastPauseTime = 0; + public static boolean isWaitingForPasscodeEnter = false; public static int getNewMessageId() { int id; @@ -62,6 +68,12 @@ public class UserConfig { editor.putBoolean("registeredForInternalPush", registeredForInternalPush); editor.putBoolean("blockedUsersLoaded", blockedUsersLoaded); editor.putBoolean("waitingForPasswordEnter", waitingForPasswordEnter); + editor.putString("passcodeHash1", passcodeHash); + editor.putBoolean("appLocked", appLocked); + editor.putInt("passcodeType", passcodeType); + editor.putInt("autoLockIn", autoLockIn); + editor.putInt("lastPauseTime", lastPauseTime); + if (currentUser != null) { if (withFile) { SerializedData data = new SerializedData(); @@ -195,6 +207,11 @@ public class UserConfig { registeredForInternalPush = preferences.getBoolean("registeredForInternalPush", false); blockedUsersLoaded = preferences.getBoolean("blockedUsersLoaded", false); waitingForPasswordEnter = preferences.getBoolean("waitingForPasswordEnter", false); + passcodeHash = preferences.getString("passcodeHash1", ""); + appLocked = preferences.getBoolean("appLocked", false); + passcodeType = preferences.getInt("passcodeType", 0); + autoLockIn = preferences.getInt("autoLockIn", 60 * 60); + lastPauseTime = preferences.getInt("lastPauseTime", 0); String user = preferences.getString("user", null); if (user != null) { byte[] userBytes = Base64.decode(user, Base64.DEFAULT); @@ -214,12 +231,17 @@ public class UserConfig { waitingForPasswordEnter = false; contactsHash = ""; importHash = ""; - lastLocalId = -210000; lastSendMessageId = -210000; contactsVersion = 1; lastBroadcastId = -1; saveIncomingPhotos = false; blockedUsersLoaded = false; + appLocked = false; + passcodeType = 0; + passcodeHash = ""; + autoLockIn = 60 * 60; + lastPauseTime = 0; + isWaitingForPasscodeEnter = false; saveConfig(true); } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/Utilities.java b/TMessagesProj/src/main/java/org/telegram/messenger/Utilities.java index f1c865a9d..770b439af 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/Utilities.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/Utilities.java @@ -109,6 +109,7 @@ public class Utilities { public native static long doPQNative(long _what); public native static void loadBitmap(String path, Bitmap bitmap, int scale, int width, int height, int stride); public native static void blurBitmap(Object bitmap, int radius); + public native static void calcCDT(ByteBuffer hsvBuffer, int width, int height, ByteBuffer buffer); public native static Bitmap loadWebpImage(ByteBuffer buffer, int len, BitmapFactory.Options options); public native static Bitmap loadBpgImage(ByteBuffer buffer, int len, BitmapFactory.Options options); public native static int convertVideoFrame(ByteBuffer src, ByteBuffer dest, int destFormat, int width, int height, int padding, int swap); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/AccountPasswordActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/AccountPasswordActivity.java index 348d20ee9..a7c4f6b2c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/AccountPasswordActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/AccountPasswordActivity.java @@ -94,7 +94,7 @@ public class AccountPasswordActivity extends BaseFragment { } @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { if (fragmentView == null) { if (type == 0) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); @@ -271,7 +271,7 @@ public class AccountPasswordActivity extends BaseFragment { listAdapter.notifyDataSetChanged(); } - private void needShowAlert(final String text) { + private void ShowAlert(final String text) { if (text == null || getParentActivity() == null) { return; } @@ -355,20 +355,20 @@ public class AccountPasswordActivity extends BaseFragment { String hint = hintPasswordCell.getFieldText(); if (hasPassword) { if (oldPassword.length() == 0) { - needShowAlert(LocaleController.getString("PasswordOldIncorrect", R.string.PasswordOldIncorrect)); + ShowAlert(LocaleController.getString("PasswordOldIncorrect", R.string.PasswordOldIncorrect)); return; } } if (newPassword.length() == 0) { - needShowAlert(LocaleController.getString("PasswordNewIncorrect", R.string.PasswordNewIncorrect)); + ShowAlert(LocaleController.getString("PasswordNewIncorrect", R.string.PasswordNewIncorrect)); return; } if (!newPassword.equals(verifyPasswrod)) { - needShowAlert(LocaleController.getString("PasswordDoNotMatch", R.string.PasswordDoNotMatch)); + ShowAlert(LocaleController.getString("PasswordDoNotMatch", R.string.PasswordDoNotMatch)); return; } if (hint.toLowerCase().contains(newPassword.toLowerCase())) { - needShowAlert(LocaleController.getString("HintIncorrect", R.string.HintIncorrect)); + ShowAlert(LocaleController.getString("HintIncorrect", R.string.HintIncorrect)); return; } byte[] oldPasswordBytes = null; @@ -418,13 +418,13 @@ public class AccountPasswordActivity extends BaseFragment { finishFragment(); } else { if (error.text.contains("PASSWORD_HASH_INVALID")) { - needShowAlert(LocaleController.getString("PasswordOldIncorrect", R.string.PasswordOldIncorrect)); + ShowAlert(LocaleController.getString("PasswordOldIncorrect", R.string.PasswordOldIncorrect)); } else if (error.text.contains("NEW_PASSWORD_BAD")) { - needShowAlert(LocaleController.getString("PasswordNewIncorrect", R.string.PasswordNewIncorrect)); + ShowAlert(LocaleController.getString("PasswordNewIncorrect", R.string.PasswordNewIncorrect)); } else if (error.text.startsWith("FLOOD_WAIT")) { - needShowAlert(LocaleController.getString("FloodWait", R.string.FloodWait)); + ShowAlert(LocaleController.getString("FloodWait", R.string.FloodWait)); } else { - needShowAlert(error.text); + ShowAlert(error.text); } } } @@ -434,7 +434,7 @@ public class AccountPasswordActivity extends BaseFragment { } else if (type == 1) { String oldPassword = oldPasswordCell.getFieldText(); if (oldPassword.length() == 0) { - needShowAlert(LocaleController.getString("PasswordIncorrect", R.string.PasswordIncorrect)); + ShowAlert(LocaleController.getString("PasswordIncorrect", R.string.PasswordIncorrect)); return; } byte[] oldPasswordBytes = null; @@ -486,11 +486,11 @@ public class AccountPasswordActivity extends BaseFragment { } } else { if (error.text.contains("PASSWORD_HASH_INVALID")) { - needShowAlert(LocaleController.getString("PasswordOldIncorrect", R.string.PasswordOldIncorrect)); + ShowAlert(LocaleController.getString("PasswordOldIncorrect", R.string.PasswordOldIncorrect)); } else if (error.text.startsWith("FLOOD_WAIT")) { - needShowAlert(LocaleController.getString("FloodWait", R.string.FloodWait)); + ShowAlert(LocaleController.getString("FloodWait", R.string.FloodWait)); } else { - needShowAlert(error.text); + ShowAlert(error.text); } } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBar.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBar.java index 188fdf767..732ba6f74 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBar.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBar.java @@ -13,6 +13,7 @@ import android.content.res.Configuration; import android.graphics.drawable.Drawable; import android.os.Build; import android.text.TextUtils; +import android.util.TypedValue; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; @@ -91,9 +92,9 @@ public class ActionBar extends FrameLayout { if (titleTextView != null && titleTextView.getVisibility() == VISIBLE) { if (!AndroidUtilities.isTablet() && getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { - titleTextView.setTextSize(18); + titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); } else { - titleTextView.setTextSize(20); + titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); } layoutParams = (LayoutParams) titleTextView.getLayoutParams(); @@ -106,9 +107,9 @@ public class ActionBar extends FrameLayout { } if (subTitleTextView != null && subTitleTextView.getVisibility() == VISIBLE) { if (!AndroidUtilities.isTablet() && getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { - subTitleTextView.setTextSize(14); + subTitleTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); } else { - subTitleTextView.setTextSize(16); + subTitleTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); } layoutParams = (LayoutParams) subTitleTextView.getLayoutParams(); @@ -136,7 +137,7 @@ public class ActionBar extends FrameLayout { } if (menu != null) { - maxTextWidth = Math.min(maxTextWidth, width - menu.getMeasuredWidth() - AndroidUtilities.dp(16)); + maxTextWidth = Math.min(maxTextWidth, width - menu.getMeasuredWidth() - AndroidUtilities.dp(16) - x); } if (titleTextView != null && titleTextView.getVisibility() == VISIBLE) { @@ -173,7 +174,7 @@ public class ActionBar extends FrameLayout { FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams)menu.getLayoutParams(); layoutParams.width = isSearchFieldVisible ? LayoutParams.MATCH_PARENT : LayoutParams.WRAP_CONTENT; layoutParams.height = height; - layoutParams.leftMargin = isSearchFieldVisible ? AndroidUtilities.dp(54) : 0; + layoutParams.leftMargin = isSearchFieldVisible ? AndroidUtilities.dp(AndroidUtilities.isTablet() ? 74 : 66) : 0; layoutParams.topMargin = occupyStatusBar ? AndroidUtilities.statusBarHeight : 0; menu.setLayoutParams(layoutParams); menu.measure(width, height); @@ -366,7 +367,7 @@ public class ActionBar extends FrameLayout { return; } actionMode.setVisibility(VISIBLE); - if (actionModeTop != null) { + if (occupyStatusBar && actionModeTop != null) { actionModeTop.setVisibility(VISIBLE); } if (titleFrameLayout != null) { @@ -382,7 +383,7 @@ public class ActionBar extends FrameLayout { return; } actionMode.setVisibility(GONE); - if (actionModeTop != null) { + if (occupyStatusBar && actionModeTop != null) { actionModeTop.setVisibility(GONE); } if (titleFrameLayout != null) { @@ -473,6 +474,9 @@ public class ActionBar extends FrameLayout { public void setOccupyStatusBar(boolean value) { occupyStatusBar = value; + if (actionMode != null) { + actionMode.setPadding(0, occupyStatusBar ? AndroidUtilities.statusBarHeight : 0, 0, 0); + } } public boolean getOccupyStatusBar() { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarLayout.java index bf295a531..398ecde2c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarLayout.java @@ -225,7 +225,7 @@ public class ActionBarLayout extends FrameLayout { @Override public boolean dispatchKeyEventPreIme(KeyEvent event) { - if (event != null && event.getKeyCode() == KeyEvent.KEYCODE_BACK) { + if (event != null && event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) { return delegate != null && delegate.onPreIme() || super.dispatchKeyEventPreIme(event); } return super.dispatchKeyEventPreIme(event); @@ -321,7 +321,7 @@ public class ActionBarLayout extends FrameLayout { beginTrackingSent = false; BaseFragment lastFragment = fragmentsStack.get(fragmentsStack.size() - 2); - View fragmentView = lastFragment.createView(parentActivity.getLayoutInflater(), null); + View fragmentView = lastFragment.createView(parentActivity.getLayoutInflater()); ViewGroup parent = (ViewGroup) fragmentView.getParent(); if (parent != null) { parent.removeView(fragmentView); @@ -502,8 +502,7 @@ public class ActionBarLayout extends FrameLayout { } public boolean checkTransitionAnimation() { - if (transitionAnimationInProgress && transitionAnimationStartTime < System.currentTimeMillis() - 400) { - transitionAnimationInProgress = false; + if (transitionAnimationInProgress && transitionAnimationStartTime < System.currentTimeMillis() - 1000) { onAnimationEndCheck(true); } return transitionAnimationInProgress; @@ -556,7 +555,7 @@ public class ActionBarLayout extends FrameLayout { final BaseFragment currentFragment = !fragmentsStack.isEmpty() ? fragmentsStack.get(fragmentsStack.size() - 1) : null; fragment.setParentLayout(this); - View fragmentView = fragment.createView(parentActivity.getLayoutInflater(), null); + View fragmentView = fragment.createView(parentActivity.getLayoutInflater()); if (fragment.needAddActionBar() && fragment.actionBar != null) { if (removeActionBarExtraHeight) { fragment.actionBar.setOccupyStatusBar(false); @@ -585,6 +584,7 @@ public class ActionBarLayout extends FrameLayout { containerView = containerViewBack; containerViewBack = temp; containerView.setVisibility(View.VISIBLE); + setInnerTranslationX(0); bringChildToFront(containerView); @@ -633,6 +633,8 @@ public class ActionBarLayout extends FrameLayout { ViewProxy.setTranslationX(containerView, 0); } }; + ViewProxy.setAlpha(containerView, 0.0f); + ViewProxy.setTranslationX(containerView, 48.0f); currentAnimation = new AnimatorSetProxy(); currentAnimation.playTogether( ObjectAnimatorProxy.ofFloat(containerView, "alpha", 0.0f, 1.0f), @@ -640,6 +642,11 @@ public class ActionBarLayout extends FrameLayout { currentAnimation.setInterpolator(new DecelerateInterpolator(1.5f)); currentAnimation.setDuration(200); currentAnimation.addListener(new AnimatorListenerAdapterProxy() { + @Override + public void onAnimationStart(Object animation) { + transitionAnimationStartTime = System.currentTimeMillis(); + } + @Override public void onAnimationEnd(Object animation) { onAnimationEndCheck(false); @@ -672,6 +679,22 @@ public class ActionBarLayout extends FrameLayout { } fragment.setParentLayout(this); if (position == -1) { + if (!fragmentsStack.isEmpty()) { + BaseFragment previousFragment = fragmentsStack.get(fragmentsStack.size() - 1); + previousFragment.onPause(); + if (previousFragment.actionBar != null) { + ViewGroup parent = (ViewGroup) previousFragment.actionBar.getParent(); + if (parent != null) { + parent.removeView(previousFragment.actionBar); + } + } + if (previousFragment.fragmentView != null) { + ViewGroup parent = (ViewGroup) previousFragment.fragmentView.getParent(); + if (parent != null) { + parent.removeView(previousFragment.fragmentView); + } + } + } fragmentsStack.add(fragment); } else { fragmentsStack.add(position, fragment); @@ -689,12 +712,13 @@ public class ActionBarLayout extends FrameLayout { } public void closeLastFragment(boolean animated) { - if (delegate != null && !delegate.needCloseLastFragment(this) || checkTransitionAnimation()) { + if (delegate != null && !delegate.needCloseLastFragment(this) || checkTransitionAnimation() || fragmentsStack.isEmpty()) { return; } if (parentActivity.getCurrentFocus() != null) { AndroidUtilities.hideKeyboard(parentActivity.getCurrentFocus()); } + setInnerTranslationX(0); boolean needAnimation = Build.VERSION.SDK_INT > 10 && animated && parentActivity.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE).getBoolean("view_animations", true); final BaseFragment currentFragment = fragmentsStack.get(fragmentsStack.size() - 1); BaseFragment previousFragment = null; @@ -709,7 +733,7 @@ public class ActionBarLayout extends FrameLayout { containerView.setVisibility(View.VISIBLE); previousFragment.setParentLayout(this); - View fragmentView = previousFragment.createView(parentActivity.getLayoutInflater(), null); + View fragmentView = previousFragment.createView(parentActivity.getLayoutInflater()); if (previousFragment.needAddActionBar() && previousFragment.actionBar != null) { if (removeActionBarExtraHeight) { previousFragment.actionBar.setOccupyStatusBar(false); @@ -754,6 +778,11 @@ public class ActionBarLayout extends FrameLayout { currentAnimation.setInterpolator(new DecelerateInterpolator(1.5f)); currentAnimation.setDuration(200); currentAnimation.addListener(new AnimatorListenerAdapterProxy() { + @Override + public void onAnimationStart(Object animation) { + transitionAnimationStartTime = System.currentTimeMillis(); + } + @Override public void onAnimationEnd(Object animation) { onAnimationEndCheck(false); @@ -796,6 +825,11 @@ public class ActionBarLayout extends FrameLayout { currentAnimation.setInterpolator(new AccelerateDecelerateInterpolator()); currentAnimation.setDuration(200); currentAnimation.addListener(new AnimatorListenerAdapterProxy() { + @Override + public void onAnimationStart(Object animation) { + transitionAnimationStartTime = System.currentTimeMillis(); + } + @Override public void onAnimationEnd(Object animation) { onAnimationEndCheck(false); @@ -823,7 +857,7 @@ public class ActionBarLayout extends FrameLayout { } BaseFragment previousFragment = fragmentsStack.get(fragmentsStack.size() - 1); previousFragment.setParentLayout(this); - View fragmentView = previousFragment.createView(parentActivity.getLayoutInflater(), null); + View fragmentView = previousFragment.createView(parentActivity.getLayoutInflater()); if (previousFragment.needAddActionBar() && previousFragment.actionBar != null) { if (removeActionBarExtraHeight) { previousFragment.actionBar.setOccupyStatusBar(false); 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 966505486..fa19aa490 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenuItem.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenuItem.java @@ -348,6 +348,10 @@ public class ActionBarMenuItem extends FrameLayoutFixed { } } + public void setIcon(int resId) { + iconView.setImageResource(resId); + } + public EditText getSearchField() { return searchField; } @@ -399,7 +403,7 @@ public class ActionBarMenuItem extends FrameLayoutFixed { searchField.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - if (actionId == EditorInfo.IME_ACTION_SEARCH || event != null && event.getAction() == KeyEvent.ACTION_UP && event.getKeyCode() == KeyEvent.KEYCODE_SEARCH) { + if (actionId == EditorInfo.IME_ACTION_SEARCH || event != null && (event.getAction() == KeyEvent.ACTION_UP && event.getKeyCode() == KeyEvent.KEYCODE_SEARCH || event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) { AndroidUtilities.hideKeyboard(searchField); if (listener != null) { listener.onSearchPressed(searchField); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BaseFragment.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BaseFragment.java index 9270ca1ca..46d04896f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BaseFragment.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BaseFragment.java @@ -41,7 +41,7 @@ public class BaseFragment { classGuid = ConnectionsManager.getInstance().generateClassGuid(); } - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { return null; } @@ -76,7 +76,7 @@ public class BaseFragment { if (parentLayout != null) { actionBar = new ActionBar(parentLayout.getContext()); actionBar.parentFragment = this; - actionBar.setBackgroundResource(R.color.header); + actionBar.setBackgroundColor(0xff54759e); actionBar.setItemsBackground(R.drawable.bar_selector); } } 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 1c607dd5f..600807d1f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/DrawerLayoutContainer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/DrawerLayoutContainer.java @@ -165,6 +165,9 @@ public class DrawerLayoutContainer extends FrameLayout { } public void openDrawer(boolean fast) { + if (!allowOpenDrawer) { + return; + } if (AndroidUtilities.isTablet() && parentActionBarLayout != null && parentActionBarLayout.parentActivity != null) { AndroidUtilities.hideKeyboard(parentActionBarLayout.parentActivity.getCurrentFocus()); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/ContactsSearchAdapter.java b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/ContactsSearchAdapter.java index e68e9be57..17dd2fe2e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/ContactsSearchAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/ContactsSearchAdapter.java @@ -124,10 +124,14 @@ public class ContactsSearchAdapter extends BaseContactsSearchAdapter { } String name = ContactsController.formatName(user.first_name, user.last_name).toLowerCase(); + 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)) { + if (name.startsWith(q) || name.contains(" " + q) || tName != null && (tName.startsWith(q) || tName.contains(" " + q))) { found = 1; } else if (user.username != null && user.username.startsWith(q)) { found = 2; 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 6031ed215..e8884689c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DialogsAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DialogsAdapter.java @@ -13,7 +13,6 @@ import android.view.View; import android.view.ViewGroup; import org.telegram.android.AndroidUtilities; -import org.telegram.android.MessageObject; import org.telegram.android.MessagesController; import org.telegram.messenger.TLRPC; import org.telegram.ui.Cells.DialogCell; @@ -24,6 +23,7 @@ public class DialogsAdapter extends BaseFragmentAdapter { private Context mContext; private boolean serverOnly; private long openedDialogId; + private int currentCount; public DialogsAdapter(Context context, boolean onlyFromServer) { mContext = context; @@ -34,6 +34,11 @@ public class DialogsAdapter extends BaseFragmentAdapter { openedDialogId = id; } + public boolean isDataSetChanged() { + int current = currentCount; + return current != getCount(); + } + @Override public boolean areAllItemsEnabled() { return true; @@ -58,6 +63,7 @@ public class DialogsAdapter extends BaseFragmentAdapter { if (!MessagesController.getInstance().dialogsEndReached) { count++; } + currentCount = count; return count; } @@ -97,22 +103,23 @@ public class DialogsAdapter extends BaseFragmentAdapter { if (view == null) { view = new DialogCell(mContext); } - ((DialogCell) view).useSeparator = (i != getCount() - 1); - TLRPC.TL_dialog dialog = null; - if (serverOnly) { - dialog = MessagesController.getInstance().dialogsServerOnly.get(i); - } else { - dialog = MessagesController.getInstance().dialogs.get(i); - if (AndroidUtilities.isTablet()) { - if (dialog.id == openedDialogId) { - view.setBackgroundColor(0x0f000000); - } else { - view.setBackgroundColor(0); + if (view instanceof DialogCell) { //TODO finally i need to find this crash + ((DialogCell) view).useSeparator = (i != getCount() - 1); + TLRPC.TL_dialog dialog = null; + if (serverOnly) { + dialog = MessagesController.getInstance().dialogsServerOnly.get(i); + } else { + dialog = MessagesController.getInstance().dialogs.get(i); + if (AndroidUtilities.isTablet()) { + if (dialog.id == openedDialogId) { + view.setBackgroundColor(0x0f000000); + } else { + view.setBackgroundColor(0); + } } } + ((DialogCell) view).setDialog(dialog, i, serverOnly); } - MessageObject message = MessagesController.getInstance().dialogMessage.get(dialog.top_message); - ((DialogCell) view).setDialog(dialog.id, message, true, dialog.last_message_date, dialog.unread_count, MessagesController.getInstance().isDialogMuted(dialog.id)); } return view; @@ -133,9 +140,6 @@ public class DialogsAdapter extends BaseFragmentAdapter { @Override public boolean isEmpty() { - if (MessagesController.getInstance().loadingDialogs && MessagesController.getInstance().dialogs.isEmpty()) { - return true; - } int count; if (serverOnly) { count = MessagesController.getInstance().dialogsServerOnly.size(); 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 2424062cd..551bf48ed 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DialogsSearchAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DialogsSearchAdapter.java @@ -215,6 +215,10 @@ public class DialogsSearchAdapter extends BaseContactsSearchAdapter { cursor = MessagesStorage.getInstance().getDatabase().queryFinalized(String.format(Locale.US, "SELECT data, status, name FROM users WHERE uid IN(%s)", TextUtils.join(",", usersToLoad))); while (cursor.next()) { String name = cursor.stringValue(2); + String tName = LocaleController.getInstance().getTranslitString(name); + if (name.equals(tName)) { + tName = null; + } String username = null; int usernamePos = name.lastIndexOf(";;;"); if (usernamePos != -1) { @@ -222,7 +226,7 @@ public class DialogsSearchAdapter extends BaseContactsSearchAdapter { } int found = 0; for (String q : search) { - if (name.startsWith(q) || name.contains(" " + q)) { + 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; @@ -257,8 +261,12 @@ public class DialogsSearchAdapter extends BaseContactsSearchAdapter { cursor = MessagesStorage.getInstance().getDatabase().queryFinalized(String.format(Locale.US, "SELECT data, name FROM chats WHERE uid IN(%s)", TextUtils.join(",", chatsToLoad))); while (cursor.next()) { String name = cursor.stringValue(1); + String tName = LocaleController.getInstance().getTranslitString(name); + if (name.equals(tName)) { + tName = null; + } for (String q : search) { - if (name.startsWith(q) || name.contains(" " + q)) { + if (name.startsWith(q) || name.contains(" " + q) || tName != null && (tName.startsWith(q) || tName.contains(" " + q))) { ByteBufferDesc data = MessagesStorage.getInstance().getBuffersStorage().getFreeBuffer(cursor.byteArrayLength(0)); if (data != null && cursor.byteBufferValue(0, data.buffer) != 0) { TLRPC.Chat chat = (TLRPC.Chat) TLClassStore.Instance().TLdeserialize(data, data.readInt32()); @@ -285,6 +293,10 @@ public class DialogsSearchAdapter extends BaseContactsSearchAdapter { cursor = MessagesStorage.getInstance().getDatabase().queryFinalized(String.format(Locale.US, "SELECT q.data, u.name, q.user, q.g, q.authkey, q.ttl, u.data, u.status, q.layer, q.seq_in, q.seq_out, q.use_count, q.exchange_id, q.key_date, q.fprint, q.fauthkey, q.khash FROM enc_chats as q INNER JOIN users as u ON q.user = u.uid WHERE q.uid IN(%s)", TextUtils.join(",", encryptedToLoad))); while (cursor.next()) { String name = cursor.stringValue(1); + String tName = LocaleController.getInstance().getTranslitString(name); + if (name.equals(tName)) { + tName = null; + } String username = null; int usernamePos = name.lastIndexOf(";;;"); @@ -293,7 +305,7 @@ public class DialogsSearchAdapter extends BaseContactsSearchAdapter { } int found = 0; for (String q : search) { - if (name.startsWith(q) || name.contains(" " + q)) { + 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; @@ -378,6 +390,10 @@ public class DialogsSearchAdapter extends BaseContactsSearchAdapter { continue; } String name = cursor.stringValue(2); + String tName = LocaleController.getInstance().getTranslitString(name); + if (name.equals(tName)) { + tName = null; + } String username = null; int usernamePos = name.lastIndexOf(";;;"); if (usernamePos != -1) { @@ -385,7 +401,7 @@ public class DialogsSearchAdapter extends BaseContactsSearchAdapter { } int found = 0; for (String q : search) { - if (name.startsWith(q) || name.contains(" " + q)) { + 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; @@ -618,7 +634,7 @@ public class DialogsSearchAdapter extends BaseContactsSearchAdapter { } ((DialogCell) view).useSeparator = (i != getCount() - 1); MessageObject messageObject = (MessageObject)getItem(i); - ((DialogCell) view).setDialog(messageObject.getDialogId(), messageObject, false, messageObject.messageOwner.date, 0, false); + ((DialogCell) view).setDialog(messageObject.getDialogId(), messageObject, messageObject.messageOwner.date); } else if (type == 3) { if (view == null) { 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 2d52263fc..538756f76 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/StickersAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/StickersAdapter.java @@ -203,6 +203,9 @@ public class StickersAdapter extends RecyclerView.Adapter implements Notificatio } HashMap documents = new HashMap<>(); for (TLRPC.Document document : res.documents) { + if (document == null) { + continue; + } documents.put(document.id, document); if (document.thumb != null && document.thumb.location != null) { document.thumb.location.ext = "webp"; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Animation/AnimatorSet10.java b/TMessagesProj/src/main/java/org/telegram/ui/Animation/AnimatorSet10.java index 0f91b93b1..274dd6041 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Animation/AnimatorSet10.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Animation/AnimatorSet10.java @@ -25,10 +25,10 @@ import java.util.List; public final class AnimatorSet10 extends Animator10 { - private ArrayList mPlayingSet = new ArrayList(); - private HashMap mNodeMap = new HashMap(); - private ArrayList mNodes = new ArrayList(); - private ArrayList mSortedNodes = new ArrayList(); + private ArrayList mPlayingSet = new ArrayList<>(); + private HashMap mNodeMap = new HashMap<>(); + private ArrayList mNodes = new ArrayList<>(); + private ArrayList mSortedNodes = new ArrayList<>(); private boolean mNeedsSort = true; private AnimatorSetListener mSetListener = null; boolean mTerminated = false; @@ -89,7 +89,7 @@ public final class AnimatorSet10 extends Animator10 { } public ArrayList getChildAnimations() { - ArrayList childList = new ArrayList(); + ArrayList childList = new ArrayList<>(); for (Node node : mNodes) { childList.add(node.animation); } @@ -295,7 +295,7 @@ public final class AnimatorSet10 extends Animator10 { ArrayList oldListeners = node.animation.getListeners(); if (oldListeners != null && oldListeners.size() > 0) { final ArrayList clonedListeners = new - ArrayList(oldListeners); + ArrayList<>(oldListeners); for (AnimatorListener listener : clonedListeners) { if (listener instanceof DependencyListener || @@ -306,7 +306,7 @@ public final class AnimatorSet10 extends Animator10 { } } - final ArrayList nodesToStart = new ArrayList(); + final ArrayList nodesToStart = new ArrayList<>(); for (Node node : mSortedNodes) { if (mSetListener == null) { mSetListener = new AnimatorSetListener(this); @@ -379,12 +379,12 @@ public final class AnimatorSet10 extends Animator10 { anim.mNeedsSort = true; anim.mTerminated = false; anim.mStarted = false; - anim.mPlayingSet = new ArrayList(); - anim.mNodeMap = new HashMap(); - anim.mNodes = new ArrayList(); - anim.mSortedNodes = new ArrayList(); + anim.mPlayingSet = new ArrayList<>(); + anim.mNodeMap = new HashMap<>(); + anim.mNodes = new ArrayList<>(); + anim.mSortedNodes = new ArrayList<>(); - HashMap nodeCloneMap = new HashMap(); + HashMap nodeCloneMap = new HashMap<>(); for (Node node : mNodes) { Node nodeClone = node.clone(); nodeCloneMap.put(node, nodeClone); @@ -400,7 +400,7 @@ public final class AnimatorSet10 extends Animator10 { for (AnimatorListener listener : cloneListeners) { if (listener instanceof AnimatorSetListener) { if (listenersToRemove == null) { - listenersToRemove = new ArrayList(); + listenersToRemove = new ArrayList<>(); } listenersToRemove.add(listener); } @@ -543,14 +543,14 @@ public final class AnimatorSet10 extends Animator10 { private void sortNodes() { if (mNeedsSort) { mSortedNodes.clear(); - ArrayList roots = new ArrayList(); + ArrayList roots = new ArrayList<>(); int numNodes = mNodes.size(); for (Node node : mNodes) { if (node.dependencies == null || node.dependencies.size() == 0) { roots.add(node); } } - ArrayList tmpRoots = new ArrayList(); + ArrayList tmpRoots = new ArrayList<>(); while (roots.size() > 0) { int numRoots = roots.size(); for (Node root : roots) { @@ -582,7 +582,7 @@ public final class AnimatorSet10 extends Animator10 { for (int j = 0; j < numDependencies; ++j) { Dependency dependency = node.dependencies.get(j); if (node.nodeDependencies == null) { - node.nodeDependencies = new ArrayList(); + node.nodeDependencies = new ArrayList<>(); } if (!node.nodeDependencies.contains(dependency.node)) { node.nodeDependencies.add(dependency.node); @@ -620,8 +620,8 @@ public final class AnimatorSet10 extends Animator10 { public void addDependency(Dependency dependency) { if (dependencies == null) { - dependencies = new ArrayList(); - nodeDependencies = new ArrayList(); + dependencies = new ArrayList<>(); + nodeDependencies = new ArrayList<>(); } dependencies.add(dependency); if (!nodeDependencies.contains(dependency.node)) { @@ -629,7 +629,7 @@ public final class AnimatorSet10 extends Animator10 { } Node dependencyNode = dependency.node; if (dependencyNode.nodeDependents == null) { - dependencyNode.nodeDependents = new ArrayList(); + dependencyNode.nodeDependents = new ArrayList<>(); } dependencyNode.nodeDependents.add(this); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Animation/View10.java b/TMessagesProj/src/main/java/org/telegram/ui/Animation/View10.java index 0863204d0..4a89fe9c5 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Animation/View10.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Animation/View10.java @@ -31,7 +31,7 @@ public class View10 extends Animation { public static boolean NEED_PROXY = Build.VERSION.SDK_INT < 11; - private static final WeakHashMap PROXIES = new WeakHashMap(); + private static final WeakHashMap PROXIES = new WeakHashMap<>(); public static View10 wrap(View view) { View10 proxy = PROXIES.get(view); @@ -68,7 +68,7 @@ public class View10 extends Animation { setDuration(0); setFillAfter(true); view.setAnimation(this); - mView = new WeakReference(view); + mView = new WeakReference<>(view); } public float getAlpha() { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/BlockedUsersActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/BlockedUsersActivity.java index 0f0eb843d..ef1e5475f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/BlockedUsersActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/BlockedUsersActivity.java @@ -64,7 +64,7 @@ public class BlockedUsersActivity extends BaseFragment implements NotificationCe } @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { if (fragmentView == null) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatBaseCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatBaseCell.java index ec5ac969d..8258de3f7 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatBaseCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatBaseCell.java @@ -574,9 +574,9 @@ public class ChatBaseCell extends BaseCell { if (drawCheck2) { if (!media) { if (drawCheck1) { - setDrawableBounds(checkDrawable, layoutWidth - AndroidUtilities.dp(22.5f) - checkDrawable.getIntrinsicWidth(), layoutHeight - AndroidUtilities.dp(8.5f) - checkDrawable.getIntrinsicHeight()); + setDrawableBounds(checkDrawable, layoutWidth - AndroidUtilities.dp(22.5f) - checkDrawable.getIntrinsicWidth(), layoutHeight - AndroidUtilities.dp(8.0f) - checkDrawable.getIntrinsicHeight()); } else { - setDrawableBounds(checkDrawable, layoutWidth - AndroidUtilities.dp(18.5f) - checkDrawable.getIntrinsicWidth(), layoutHeight - AndroidUtilities.dp(8.5f) - checkDrawable.getIntrinsicHeight()); + setDrawableBounds(checkDrawable, layoutWidth - AndroidUtilities.dp(18.5f) - checkDrawable.getIntrinsicWidth(), layoutHeight - AndroidUtilities.dp(8.0f) - checkDrawable.getIntrinsicHeight()); } checkDrawable.draw(canvas); } else { @@ -590,7 +590,7 @@ public class ChatBaseCell extends BaseCell { } if (drawCheck1) { if (!media) { - setDrawableBounds(halfCheckDrawable, layoutWidth - AndroidUtilities.dp(18) - halfCheckDrawable.getIntrinsicWidth(), layoutHeight - AndroidUtilities.dp(8.5f) - halfCheckDrawable.getIntrinsicHeight()); + setDrawableBounds(halfCheckDrawable, layoutWidth - AndroidUtilities.dp(18) - halfCheckDrawable.getIntrinsicWidth(), layoutHeight - AndroidUtilities.dp(8.0f) - halfCheckDrawable.getIntrinsicHeight()); halfCheckDrawable.draw(canvas); } else { setDrawableBounds(halfCheckMediaDrawable, layoutWidth - AndroidUtilities.dp(20.5f) - halfCheckMediaDrawable.getIntrinsicWidth(), layoutHeight - AndroidUtilities.dp(13.0f) - halfCheckMediaDrawable.getIntrinsicHeight()); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMediaCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMediaCell.java index 87825a1c6..db40b041c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMediaCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMediaCell.java @@ -530,19 +530,14 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD break; } } - float maxWidth; - if (AndroidUtilities.isTablet()) { - maxWidth = (int) (AndroidUtilities.getMinTabletSide() * 0.5f); - } else { - maxWidth = (int) (Math.min(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y) * 0.5f); - } + float maxHeight = AndroidUtilities.displaySize.y * 0.4f; if (photoWidth == 0) { - photoWidth = (int)maxWidth; - photoHeight = photoWidth + AndroidUtilities.dp(100); + photoHeight = (int) maxHeight; + photoWidth = photoHeight + AndroidUtilities.dp(100); } - if (photoWidth > maxWidth) { - photoHeight *= maxWidth / photoWidth; - photoWidth = (int)maxWidth; + if (photoHeight > maxHeight) { + photoWidth *= maxHeight / photoHeight; + photoHeight = (int)maxHeight; } backgroundWidth = photoWidth + AndroidUtilities.dp(12); currentPhotoObjectThumb = FileLoader.getClosestPhotoSizeWithSize(messageObject.photoThumbs, 80); @@ -870,8 +865,8 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD if (currentMessageObject.type == 9) { Drawable menuDrawable = null; if (currentMessageObject.isOut()) { - infoPaint.setColor(0xff75b166); - docBackPaint.setColor(0xffd0f3b3); + infoPaint.setColor(0xff70b15c); + docBackPaint.setColor(0xffdaf5c3); menuDrawable = docMenuOutDrawable; } else { infoPaint.setColor(0xffa1adbb); 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 d04e80cc4..4c74c471a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java @@ -55,12 +55,15 @@ public class DialogCell extends BaseCell { private static Paint linePaint; private long currentDialogId; - private boolean allowPrintStrings; + private boolean isDialogCell; private int lastMessageDate; private int unreadCount; private boolean lastUnreadState; + private int lastSendState; private boolean dialogMuted; private MessageObject message; + private int index; + private boolean isServerOnly; private ImageReceiver avatarImage; private AvatarDrawable avatarDrawable; @@ -166,14 +169,24 @@ public class DialogCell extends BaseCell { avatarDrawable = new AvatarDrawable(); } - public void setDialog(long dialog_id, MessageObject messageObject, boolean usePrintStrings, int date, int unread, boolean muted) { + public void setDialog(TLRPC.TL_dialog dialog, int i, boolean server) { + currentDialogId = dialog.id; + isDialogCell = true; + index = i; + isServerOnly = server; + update(0); + } + + public void setDialog(long dialog_id, MessageObject messageObject, int date) { currentDialogId = dialog_id; message = messageObject; - allowPrintStrings = usePrintStrings; + isDialogCell = false; lastMessageDate = date; - unreadCount = unread; - dialogMuted = muted; + unreadCount = 0; lastUnreadState = messageObject != null && messageObject.isUnread(); + if (message != null) { + lastSendState = message.messageOwner.send_state; + } update(0); } @@ -211,7 +224,7 @@ public class DialogCell extends BaseCell { String countString = null; CharSequence messageString = ""; CharSequence printingString = null; - if (allowPrintStrings) { + if (isDialogCell) { printingString = MessagesController.getInstance().printingStrings.get(currentDialogId); } TextPaint currentNamePaint = namePaint; @@ -543,15 +556,15 @@ public class DialogCell extends BaseCell { if (LocaleController.isRTL) { if (nameLayout != null && nameLayout.getLineCount() > 0) { left = nameLayout.getLineLeft(0); + widthpx = Math.ceil(nameLayout.getLineWidth(0)); + if (dialogMuted) { + nameMuteLeft = (int) (nameLeft + (nameWidth - widthpx) - AndroidUtilities.dp(6) - muteDrawable.getIntrinsicWidth()); + } if (left == 0) { - widthpx = Math.ceil(nameLayout.getLineWidth(0)); if (widthpx < nameWidth) { nameLeft += (nameWidth - widthpx); } } - if (dialogMuted) { - nameMuteLeft = (nameLeft - AndroidUtilities.dp(6) - muteDrawable.getIntrinsicWidth()); - } } if (messageLayout != null && messageLayout.getLineCount() > 0) { left = messageLayout.getLineLeft(0); @@ -587,10 +600,37 @@ public class DialogCell extends BaseCell { } } + public void checkCurrentDialogIndex() { + TLRPC.TL_dialog dialog = null; + if (isServerOnly) { + dialog = MessagesController.getInstance().dialogsServerOnly.get(index); + } else { + dialog = MessagesController.getInstance().dialogs.get(index); + } + boolean update = true; + if (currentDialogId != dialog.id || message != null && message.messageOwner.id != dialog.top_message || unreadCount != dialog.unread_count) { + currentDialogId = dialog.id; + update(0); + } + } + public void update(int mask) { + if (isDialogCell) { + TLRPC.TL_dialog dialog = MessagesController.getInstance().dialogs_dict.get(currentDialogId); + if (dialog != null && mask == 0) { + message = MessagesController.getInstance().dialogMessage.get(dialog.top_message); + lastUnreadState = message != null && message.isUnread(); + unreadCount = dialog.unread_count; + lastMessageDate = dialog.last_message_date; + if (message != null) { + lastSendState = message.messageOwner.send_state; + } + } + } + if (mask != 0) { boolean continueUpdate = false; - if (allowPrintStrings && (mask & MessagesController.UPDATE_MASK_USER_PRINT) != 0) { + if (isDialogCell && (mask & MessagesController.UPDATE_MASK_USER_PRINT) != 0) { CharSequence printString = MessagesController.getInstance().printingStrings.get(currentDialogId); if (lastPrintString != null && printString == null || lastPrintString == null && printString != null || lastPrintString != null && printString != null && !lastPrintString.equals(printString)) { continueUpdate = true; @@ -618,8 +658,9 @@ public class DialogCell extends BaseCell { } if (!continueUpdate && (mask & MessagesController.UPDATE_MASK_READ_DIALOG_MESSAGE) != 0) { if (message != null && lastUnreadState != message.isUnread()) { + lastUnreadState = message.isUnread(); continueUpdate = true; - } else if (allowPrintStrings) { + } else if (isDialogCell) { TLRPC.TL_dialog dialog = MessagesController.getInstance().dialogs_dict.get(currentDialogId); if (dialog != null && unreadCount != dialog.unread_count) { unreadCount = dialog.unread_count; @@ -627,11 +668,19 @@ public class DialogCell extends BaseCell { } } } + if (!continueUpdate && (mask & MessagesController.UPDATE_MASK_SEND_STATE) != 0) { + if (message != null && lastSendState != message.messageOwner.send_state) { + lastSendState = message.messageOwner.send_state; + continueUpdate = true; + } + } if (!continueUpdate) { return; } } + + dialogMuted = isDialogCell && MessagesController.getInstance().isDialogMuted(currentDialogId); user = null; chat = null; encryptedChat = null; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/GreySectionCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/GreySectionCell.java index b13f3de75..633e02c8e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/GreySectionCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/GreySectionCell.java @@ -9,7 +9,6 @@ package org.telegram.ui.Cells; import android.content.Context; -import android.util.AttributeSet; import android.util.TypedValue; import android.view.Gravity; import android.widget.FrameLayout; @@ -21,7 +20,9 @@ import org.telegram.android.LocaleController; public class GreySectionCell extends FrameLayout { private TextView textView; - private void init() { + public GreySectionCell(Context context) { + super(context); + setBackgroundColor(0xfff2f2f2); textView = new TextView(getContext()); @@ -39,26 +40,6 @@ public class GreySectionCell extends FrameLayout { textView.setLayoutParams(layoutParams); } - public GreySectionCell(Context context) { - super(context); - init(); - } - - public GreySectionCell(Context context, AttributeSet attrs) { - super(context, attrs); - init(); - } - - public GreySectionCell(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - init(); - } - - public GreySectionCell(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - init(); - } - @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(36), MeasureSpec.EXACTLY)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/PhotoEditToolCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/PhotoEditToolCell.java index b6be0e98c..faf3b1630 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/PhotoEditToolCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/PhotoEditToolCell.java @@ -9,6 +9,7 @@ package org.telegram.ui.Cells; import android.content.Context; +import android.text.TextUtils; import android.util.TypedValue; import android.view.Gravity; import android.widget.ImageView; @@ -32,28 +33,54 @@ public class PhotoEditToolCell extends FrameLayoutFixed { LayoutParams layoutParams = (LayoutParams) iconImage.getLayoutParams(); layoutParams.width = LayoutParams.MATCH_PARENT; layoutParams.height = LayoutParams.MATCH_PARENT; - layoutParams.bottomMargin = AndroidUtilities.dp(20); + layoutParams.bottomMargin = AndroidUtilities.dp(12); iconImage.setLayoutParams(layoutParams); nameTextView = new TextView(context); nameTextView.setGravity(Gravity.CENTER); nameTextView.setTextColor(0xffffffff); - nameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 12); + nameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 10); + nameTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + nameTextView.setMaxLines(1); + nameTextView.setSingleLine(true); + nameTextView.setEllipsize(TextUtils.TruncateAt.END); addView(nameTextView); layoutParams = (LayoutParams) nameTextView.getLayoutParams(); layoutParams.width = LayoutParams.MATCH_PARENT; - layoutParams.height = AndroidUtilities.dp(20); + layoutParams.height = LayoutParams.WRAP_CONTENT; layoutParams.gravity = Gravity.LEFT | Gravity.BOTTOM; + layoutParams.leftMargin = AndroidUtilities.dp(4); + layoutParams.rightMargin = AndroidUtilities.dp(4); nameTextView.setLayoutParams(layoutParams); + + valueTextView = new TextView(context); + valueTextView.setTextColor(0xff6cc3ff); + valueTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 11); + valueTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + addView(valueTextView); + layoutParams = (LayoutParams) valueTextView.getLayoutParams(); + layoutParams.width = LayoutParams.WRAP_CONTENT; + layoutParams.height = LayoutParams.WRAP_CONTENT; + layoutParams.gravity = Gravity.LEFT | Gravity.TOP; + layoutParams.leftMargin = AndroidUtilities.dp(57); + layoutParams.topMargin = AndroidUtilities.dp(3); + valueTextView.setLayoutParams(layoutParams); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(80), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(60), MeasureSpec.EXACTLY)); + super.onMeasure(MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(86), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(60), MeasureSpec.EXACTLY)); } - public void setIconAndText(int resId, String text) { + public void setIconAndTextAndValue(int resId, String text, float value) { iconImage.setImageResource(resId); - nameTextView.setText(text); + nameTextView.setText(text.toUpperCase()); + if (value == 0) { + valueTextView.setText(""); + } else if (value > 0) { + valueTextView.setText("+" + (int) value); + } else { + valueTextView.setText("" + (int) value); + } } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/PhotoPickerAlbumsCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/PhotoPickerAlbumsCell.java index 15a240371..2fe47d9e0 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/PhotoPickerAlbumsCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/PhotoPickerAlbumsCell.java @@ -15,7 +15,7 @@ import android.util.TypedValue; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; -import android.widget.FrameLayout; +import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; @@ -23,8 +23,9 @@ import org.telegram.android.AndroidUtilities; import org.telegram.android.MediaController; import org.telegram.messenger.R; import org.telegram.ui.Components.BackupImageView; +import org.telegram.ui.Components.FrameLayoutFixed; -public class PhotoPickerAlbumsCell extends FrameLayout { +public class PhotoPickerAlbumsCell extends FrameLayoutFixed { public static interface PhotoPickerAlbumsCellDelegate { public abstract void didSelectAlbum(MediaController.AlbumEntry albumEntry); @@ -35,7 +36,7 @@ public class PhotoPickerAlbumsCell extends FrameLayout { private int albumsCount; private PhotoPickerAlbumsCellDelegate delegate; - private class AlbumView extends FrameLayout { + private class AlbumView extends FrameLayoutFixed { private BackupImageView imageView; private TextView nameTextView; @@ -146,7 +147,9 @@ public class PhotoPickerAlbumsCell extends FrameLayout { if (albumEntry != null) { AlbumView albumView = albumViews[a]; + albumView.imageView.setOrientation(0, true); if (albumEntry.coverPhoto != null && albumEntry.coverPhoto.path != null) { + albumView.imageView.setOrientation(albumEntry.coverPhoto.orientation, true); albumView.imageView.setImage("thumb://" + albumEntry.coverPhoto.imageId + ":" + albumEntry.coverPhoto.path, null, getContext().getResources().getDrawable(R.drawable.nophotos)); } else { albumView.imageView.setImageResource(R.drawable.nophotos); @@ -167,16 +170,21 @@ public class PhotoPickerAlbumsCell extends FrameLayout { itemWidth = (AndroidUtilities.displaySize.x - ((albumsCount + 1) * AndroidUtilities.dp(4))) / albumsCount; } - setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(4) + itemWidth, MeasureSpec.EXACTLY)); - for (int a = 0; a < albumsCount; a++) { LayoutParams layoutParams = (LayoutParams) albumViews[a].getLayoutParams(); layoutParams.topMargin = AndroidUtilities.dp(4); layoutParams.leftMargin = (itemWidth + AndroidUtilities.dp(4)) * a; layoutParams.width = itemWidth; layoutParams.height = itemWidth; + layoutParams.gravity = Gravity.LEFT | Gravity.TOP; albumViews[a].setLayoutParams(layoutParams); - albumViews[a].measure(MeasureSpec.makeMeasureSpec(itemWidth, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(itemWidth, MeasureSpec.EXACTLY)); } + + ViewGroup.LayoutParams layoutParams = getLayoutParams(); + if (layoutParams != null) { + layoutParams.height = AndroidUtilities.dp(4) + itemWidth; + setLayoutParams(layoutParams); + } + super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/PhotoPickerPhotoCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/PhotoPickerPhotoCell.java index 4879a0c09..f00434920 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/PhotoPickerPhotoCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/PhotoPickerPhotoCell.java @@ -11,7 +11,6 @@ package org.telegram.ui.Cells; import android.content.Context; import android.view.Gravity; import android.widget.FrameLayout; -import android.widget.ImageView; import org.telegram.android.AndroidUtilities; import org.telegram.messenger.R; @@ -23,7 +22,6 @@ public class PhotoPickerPhotoCell extends FrameLayout { public BackupImageView photoImage; public FrameLayout checkFrame; public CheckBox checkBox; - public ImageView editedImage; public int itemWidth; public PhotoPickerPhotoCell(Context context) { @@ -57,16 +55,6 @@ public class PhotoPickerPhotoCell extends FrameLayout { layoutParams.topMargin = AndroidUtilities.dp(6); layoutParams.rightMargin = AndroidUtilities.dp(6); checkBox.setLayoutParams(layoutParams); - - editedImage = new ImageView(context); - editedImage.setImageResource(R.drawable.photo_edit); - editedImage.setScaleType(ImageView.ScaleType.CENTER); - addView(editedImage); - layoutParams = (LayoutParams) editedImage.getLayoutParams(); - layoutParams.width = AndroidUtilities.dp(42); - layoutParams.height = AndroidUtilities.dp(42); - layoutParams.gravity = Gravity.LEFT | Gravity.TOP; - editedImage.setLayoutParams(layoutParams); } @Override diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/PhotoPickerSearchCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/PhotoPickerSearchCell.java index ecd88357d..30c1fe4c6 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/PhotoPickerSearchCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/PhotoPickerSearchCell.java @@ -10,6 +10,7 @@ package org.telegram.ui.Cells; import android.content.Context; import android.os.Build; +import android.text.TextUtils; import android.util.TypedValue; import android.view.Gravity; import android.view.MotionEvent; @@ -39,62 +40,57 @@ public class PhotoPickerSearchCell extends LinearLayout { public SearchButton(Context context) { super(context); - setBackgroundColor(0xff292929); + setBackgroundColor(0xff1a1a1a); selector = new View(context); selector.setBackgroundResource(R.drawable.list_selector); addView(selector); FrameLayout.LayoutParams layoutParams1 = (FrameLayout.LayoutParams) selector.getLayoutParams(); - layoutParams1.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams1.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams1.width = LayoutParams.MATCH_PARENT; + layoutParams1.height = LayoutParams.MATCH_PARENT; selector.setLayoutParams(layoutParams1); - LinearLayout linearLayout = new LinearLayout(context); - linearLayout.setOrientation(HORIZONTAL); - addView(linearLayout); - layoutParams1 = (FrameLayout.LayoutParams) linearLayout.getLayoutParams(); - layoutParams1.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams1.height = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams1.gravity = Gravity.CENTER; - linearLayout.setLayoutParams(layoutParams1); - imageView = new ImageView(context); - linearLayout.addView(imageView); - LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) imageView.getLayoutParams(); - layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT; - layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT; + imageView.setScaleType(ImageView.ScaleType.CENTER); + addView(imageView); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) imageView.getLayoutParams(); + layoutParams.height = AndroidUtilities.dp(48); + layoutParams.width = AndroidUtilities.dp(48); + layoutParams1.gravity = Gravity.LEFT | Gravity.TOP; imageView.setLayoutParams(layoutParams); - FrameLayout frameLayout = new FrameLayout(context); - frameLayout.setPadding(AndroidUtilities.dp(4), 0, 0, 0); - linearLayout.addView(frameLayout); - layoutParams = (LinearLayout.LayoutParams) frameLayout.getLayoutParams(); - layoutParams.height = LinearLayout.LayoutParams.MATCH_PARENT; - layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT; - frameLayout.setLayoutParams(layoutParams); - textView1 = new TextView(context); textView1.setGravity(Gravity.CENTER_VERTICAL); - textView1.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); - textView1.setPadding(0, 0, AndroidUtilities.dp(8), 0); + textView1.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); textView1.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); textView1.setTextColor(0xffffffff); - frameLayout.addView(textView1); + textView1.setSingleLine(true); + textView1.setEllipsize(TextUtils.TruncateAt.END); + addView(textView1); layoutParams1 = (FrameLayout.LayoutParams) textView1.getLayoutParams(); - layoutParams1.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams1.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams1.width = LayoutParams.MATCH_PARENT; + layoutParams1.height = LayoutParams.WRAP_CONTENT; + layoutParams1.gravity = Gravity.TOP | Gravity.LEFT; + layoutParams1.rightMargin = AndroidUtilities.dp(4); + layoutParams1.leftMargin = AndroidUtilities.dp(51); + layoutParams1.topMargin = AndroidUtilities.dp(8); textView1.setLayoutParams(layoutParams1); textView2 = new TextView(context); textView2.setGravity(Gravity.CENTER_VERTICAL); - textView2.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 9); - textView2.setPadding(0, AndroidUtilities.dp(24), AndroidUtilities.dp(8), 0); + textView2.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 10); textView2.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); - textView2.setTextColor(0xff464646); - frameLayout.addView(textView2); + textView2.setTextColor(0xff666666); + textView2.setSingleLine(true); + textView2.setEllipsize(TextUtils.TruncateAt.END); + addView(textView2); layoutParams1 = (FrameLayout.LayoutParams) textView2.getLayoutParams(); - layoutParams1.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams1.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams1.width = LayoutParams.MATCH_PARENT; + layoutParams1.height = LayoutParams.WRAP_CONTENT; + layoutParams1.gravity = Gravity.TOP | Gravity.LEFT; + layoutParams1.leftMargin = AndroidUtilities.dp(51); + layoutParams1.rightMargin = AndroidUtilities.dp(4); + layoutParams1.topMargin = AndroidUtilities.dp(26); textView2.setLayoutParams(layoutParams1); } @@ -115,7 +111,8 @@ public class PhotoPickerSearchCell extends LinearLayout { SearchButton searchButton = new SearchButton(context); searchButton.textView1.setText(LocaleController.getString("SearchImages", R.string.SearchImages)); - searchButton.imageView.setImageResource(R.drawable.web_search); + searchButton.textView2.setText(LocaleController.getString("SearchImagesInfo", R.string.SearchImagesInfo)); + searchButton.imageView.setImageResource(R.drawable.search_web); addView(searchButton); LayoutParams layoutParams = (LayoutParams) searchButton.getLayoutParams(); layoutParams.weight = 0.5f; @@ -144,7 +141,7 @@ public class PhotoPickerSearchCell extends LinearLayout { searchButton = new SearchButton(context); searchButton.textView1.setText(LocaleController.getString("SearchGifs", R.string.SearchGifs)); searchButton.textView2.setText("GIPHY"); - searchButton.imageView.setImageResource(R.drawable.gif_search); + searchButton.imageView.setImageResource(R.drawable.search_gif); addView(searchButton); layoutParams = (LayoutParams) searchButton.getLayoutParams(); layoutParams.weight = 0.5f; 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 2ddd7307b..1938fea35 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedDocumentCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedDocumentCell.java @@ -249,6 +249,12 @@ public class SharedDocumentCell extends FrameLayout implements MediaController. } } + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + MediaController.getInstance().removeLoadingFileObserver(this); + } + public void setChecked(boolean checked, boolean animated) { if (checkBox.getVisibility() != VISIBLE) { checkBox.setVisibility(VISIBLE); @@ -262,30 +268,40 @@ public class SharedDocumentCell extends FrameLayout implements MediaController. loaded = false; loading = false; - int idx = -1; - String name = FileLoader.getDocumentFileName(document.messageOwner.media.document); - placeholderImabeView.setVisibility(VISIBLE); - extTextView.setVisibility(VISIBLE); - placeholderImabeView.setImageResource(getThumbForNameOrMime(name, document.messageOwner.media.document.mime_type)); - nameTextView.setText(name); - extTextView.setText((idx = name.lastIndexOf(".")) == -1 ? "" : name.substring(idx + 1).toLowerCase()); - if (document.messageOwner.media.document.thumb instanceof TLRPC.TL_photoSizeEmpty) { + if (document != null && document.messageOwner.media != null) { + int idx = -1; + String name = FileLoader.getDocumentFileName(document.messageOwner.media.document); + placeholderImabeView.setVisibility(VISIBLE); + extTextView.setVisibility(VISIBLE); + placeholderImabeView.setImageResource(getThumbForNameOrMime(name, document.messageOwner.media.document.mime_type)); + nameTextView.setText(name); + extTextView.setText((idx = name.lastIndexOf(".")) == -1 ? "" : name.substring(idx + 1).toLowerCase()); + if (document.messageOwner.media.document.thumb instanceof TLRPC.TL_photoSizeEmpty) { + thumbImageView.setVisibility(GONE); + thumbImageView.setImageBitmap(null); + } else { + thumbImageView.setVisibility(VISIBLE); + thumbImageView.setImage(document.messageOwner.media.document.thumb.location, "40_40", (Drawable) null); + } + long date = (long) document.messageOwner.date * 1000; + dateTextView.setText(String.format("%s, %s", Utilities.formatFileSize(document.messageOwner.media.document.size), LocaleController.formatString("formatDateAtTime", R.string.formatDateAtTime, LocaleController.formatterYear.format(new Date(date)), LocaleController.formatterDay.format(new Date(date))))); + } else { + nameTextView.setText(""); + extTextView.setText(""); + dateTextView.setText(""); + placeholderImabeView.setVisibility(VISIBLE); + extTextView.setVisibility(VISIBLE); thumbImageView.setVisibility(GONE); thumbImageView.setImageBitmap(null); - } else { - thumbImageView.setVisibility(VISIBLE); - thumbImageView.setImage(document.messageOwner.media.document.thumb.location, "40_40", (Drawable) null); } - long date = (long) document.messageOwner.date * 1000; - dateTextView.setText(String.format("%s, %s", Utilities.formatFileSize(document.messageOwner.media.document.size), LocaleController.formatString("formatDateAtTime", R.string.formatDateAtTime, LocaleController.formatterYear.format(new Date(date)), LocaleController.formatterDay.format(new Date(date))))); + setWillNotDraw(!needDivider); progressView.setProgress(0, false); - updateFileExistIcon(); } public void updateFileExistIcon() { - if (message != null) { + if (message != null && message.messageOwner.media != null) { String fileName = null; File cacheFile = null; if (message.messageOwner.attachPath == null || message.messageOwner.attachPath.length() == 0 || !(new File(message.messageOwner.attachPath).exists())) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedMediaSectionCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedMediaSectionCell.java new file mode 100644 index 000000000..4b7d29c58 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedMediaSectionCell.java @@ -0,0 +1,50 @@ +/* + * This is the source code of Telegram for Android v. 2.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-2015. + */ + +package org.telegram.ui.Cells; + +import android.content.Context; +import android.util.TypedValue; +import android.view.Gravity; +import android.widget.FrameLayout; +import android.widget.TextView; + +import org.telegram.android.AndroidUtilities; +import org.telegram.android.LocaleController; + +public class SharedMediaSectionCell extends FrameLayout { + + private TextView textView; + + public SharedMediaSectionCell(Context context) { + super(context); + + textView = new TextView(getContext()); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + textView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + textView.setTextColor(0xff222222); + textView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL); + addView(textView); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams)textView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.leftMargin = AndroidUtilities.dp(13); + layoutParams.rightMargin = AndroidUtilities.dp(13); + layoutParams.gravity = LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT; + textView.setLayoutParams(layoutParams); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(40), MeasureSpec.EXACTLY)); + } + + public void setText(String text) { + textView.setText(text); + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedPhotoVideoCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedPhotoVideoCell.java new file mode 100644 index 000000000..90f3d4f54 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedPhotoVideoCell.java @@ -0,0 +1,255 @@ +/* + * This is the source code of Telegram for Android v. 2.0.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-2014. + */ + +package org.telegram.ui.Cells; + +import android.content.Context; +import android.os.Build; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import org.telegram.android.AndroidUtilities; +import org.telegram.android.MessageObject; +import org.telegram.messenger.ApplicationLoader; +import org.telegram.messenger.FileLoader; +import org.telegram.messenger.R; +import org.telegram.messenger.TLRPC; +import org.telegram.ui.Components.BackupImageView; +import org.telegram.ui.Components.CheckBox; +import org.telegram.ui.Components.FrameLayoutFixed; +import org.telegram.ui.PhotoViewer; + +public class SharedPhotoVideoCell extends FrameLayoutFixed { + + private PhotoVideoView[] photoVideoViews; + private MessageObject[] messageObjects; + private int[] indeces; + private SharedPhotoVideoCellDelegate delegate; + private int itemsCount; + private boolean isFirst; + + public static interface SharedPhotoVideoCellDelegate { + public abstract void didClickItem(SharedPhotoVideoCell cell, int index, MessageObject messageObject, int a); + public abstract boolean didLongClickItem(SharedPhotoVideoCell cell, int index, MessageObject messageObject, int a); + } + + private class PhotoVideoView extends FrameLayoutFixed { + + private BackupImageView imageView; + private TextView videoTextView; + private LinearLayout videoInfoContainer; + private View selector; + private CheckBox checkBox; + + public PhotoVideoView(Context context) { + super(context); + + imageView = new BackupImageView(context); + imageView.imageReceiver.setNeedsQualityThumb(true); + imageView.imageReceiver.setShouldGenerateQualityThumb(true); + addView(imageView); + LayoutParams layoutParams = (LayoutParams) imageView.getLayoutParams(); + layoutParams.width = LayoutParams.MATCH_PARENT; + layoutParams.height = LayoutParams.MATCH_PARENT; + imageView.setLayoutParams(layoutParams); + + videoInfoContainer = new LinearLayout(context); + videoInfoContainer.setOrientation(LinearLayout.HORIZONTAL); + videoInfoContainer.setBackgroundResource(R.drawable.phototime); + videoInfoContainer.setPadding(AndroidUtilities.dp(3), 0, AndroidUtilities.dp(3), 0); + videoInfoContainer.setGravity(Gravity.CENTER_VERTICAL); + addView(videoInfoContainer); + layoutParams = (LayoutParams) videoInfoContainer.getLayoutParams(); + layoutParams.width = LayoutParams.MATCH_PARENT; + layoutParams.height = AndroidUtilities.dp(16); + layoutParams.gravity = Gravity.BOTTOM | Gravity.LEFT; + videoInfoContainer.setLayoutParams(layoutParams); + + ImageView imageView1 = new ImageView(context); + imageView1.setImageResource(R.drawable.ic_video); + videoInfoContainer.addView(imageView1); + LinearLayout.LayoutParams layoutParams1 = (LinearLayout.LayoutParams) imageView1.getLayoutParams(); + layoutParams1.width = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams1.height = LinearLayout.LayoutParams.WRAP_CONTENT; + imageView1.setLayoutParams(layoutParams1); + + videoTextView = new TextView(context); + videoTextView.setTextColor(0xffffffff); + videoTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 12); + videoTextView.setGravity(Gravity.CENTER_VERTICAL); + videoInfoContainer.addView(videoTextView); + layoutParams1 = (LinearLayout.LayoutParams) videoTextView.getLayoutParams(); + layoutParams1.width = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams1.height = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams1.leftMargin = AndroidUtilities.dp(4); + layoutParams1.gravity = Gravity.CENTER_VERTICAL; + layoutParams1.bottomMargin = AndroidUtilities.dp(1); + videoTextView.setLayoutParams(layoutParams1); + + selector = new View(context); + selector.setBackgroundResource(R.drawable.list_selector); + addView(selector); + layoutParams = (LayoutParams) selector.getLayoutParams(); + layoutParams.width = LayoutParams.MATCH_PARENT; + layoutParams.height = LayoutParams.MATCH_PARENT; + selector.setLayoutParams(layoutParams); + + checkBox = new CheckBox(context, R.drawable.round_check2); + checkBox.setVisibility(GONE); + addView(checkBox); + layoutParams = (LayoutParams) checkBox.getLayoutParams(); + layoutParams.width = AndroidUtilities.dp(22); + layoutParams.height = AndroidUtilities.dp(22); + layoutParams.gravity = Gravity.RIGHT | Gravity.TOP; + layoutParams.topMargin = AndroidUtilities.dp(6); + layoutParams.rightMargin = AndroidUtilities.dp(6); + checkBox.setLayoutParams(layoutParams); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (Build.VERSION.SDK_INT >= 21) { + selector.drawableHotspotChanged(event.getX(), event.getY()); + } + return super.onTouchEvent(event); + } + } + + public SharedPhotoVideoCell(Context context) { + super(context); + + messageObjects = new MessageObject[6]; + photoVideoViews = new PhotoVideoView[6]; + indeces = new int[6]; + for (int a = 0; a < 6; a++) { + photoVideoViews[a] = new PhotoVideoView(context); + addView(photoVideoViews[a]); + photoVideoViews[a].setVisibility(GONE); + photoVideoViews[a].setTag(a); + photoVideoViews[a].setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + if (delegate != null) { + int a = (Integer) v.getTag(); + delegate.didClickItem(SharedPhotoVideoCell.this, indeces[a], messageObjects[a], a); + } + } + }); + photoVideoViews[a].setOnLongClickListener(new OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + if (delegate != null) { + int a = (Integer) v.getTag(); + return delegate.didLongClickItem(SharedPhotoVideoCell.this, indeces[a], messageObjects[a], a); + } + return false; + } + }); + } + } + + public void setDelegate(SharedPhotoVideoCellDelegate delegate) { + this.delegate = delegate; + } + + public void setItemsCount(int count) { + for (int a = 0; a < photoVideoViews.length; a++) { + photoVideoViews[a].setVisibility(a < count ? VISIBLE : GONE); + } + itemsCount = count; + } + + public BackupImageView getImageView(int a) { + if (a >= itemsCount) { + return null; + } + return photoVideoViews[a].imageView; + } + + public MessageObject getMessageObject(int a) { + if (a >= itemsCount) { + return null; + } + return messageObjects[a]; + } + + public void setIsFirst(boolean first) { + isFirst = first; + } + + public void setChecked(int a, boolean checked, boolean animated) { + if (photoVideoViews[a].checkBox.getVisibility() != VISIBLE) { + photoVideoViews[a].checkBox.setVisibility(VISIBLE); + } + photoVideoViews[a].checkBox.setChecked(checked, animated); + } + + public void setItem(int a, int index, MessageObject messageObject) { + messageObjects[a] = messageObject; + indeces[a] = index; + + if (messageObject != null) { + photoVideoViews[a].setVisibility(VISIBLE); + + PhotoVideoView photoVideoView = photoVideoViews[a]; + photoVideoView.imageView.imageReceiver.setParentMessageObject(messageObject); + photoVideoView.imageView.imageReceiver.setVisible(!PhotoViewer.getInstance().isShowingImage(messageObject), false); + if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaVideo && messageObject.messageOwner.media.video != null) { + photoVideoView.videoInfoContainer.setVisibility(VISIBLE); + int duration = messageObject.messageOwner.media.video.duration; + int minutes = duration / 60; + int seconds = duration - minutes * 60; + photoVideoView.videoTextView.setText(String.format("%d:%02d", minutes, seconds)); + if (messageObject.messageOwner.media.video.thumb != null) { + TLRPC.FileLocation location = messageObject.messageOwner.media.video.thumb.location; + photoVideoView.imageView.setImage(null, null, null, ApplicationLoader.applicationContext.getResources().getDrawable(R.drawable.photo_placeholder_in), null, location, "b", 0); + } else { + photoVideoView.imageView.setImageResource(R.drawable.photo_placeholder_in); + } + } else if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaPhoto && messageObject.messageOwner.media.photo != null && !messageObject.photoThumbs.isEmpty()) { + photoVideoView.videoInfoContainer.setVisibility(GONE); + TLRPC.PhotoSize photoSize = FileLoader.getClosestPhotoSizeWithSize(messageObject.photoThumbs, 80); + photoVideoView.imageView.setImage(null, null, null, ApplicationLoader.applicationContext.getResources().getDrawable(R.drawable.photo_placeholder_in), null, photoSize.location, "b", 0); + } else { + photoVideoView.videoInfoContainer.setVisibility(GONE); + photoVideoView.imageView.setImageResource(R.drawable.photo_placeholder_in); + } + } else { + photoVideoViews[a].setVisibility(GONE); + messageObjects[a] = null; + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int itemWidth; + if (AndroidUtilities.isTablet()) { + itemWidth = (AndroidUtilities.dp(490) - ((itemsCount + 1) * AndroidUtilities.dp(4))) / itemsCount; + } else { + itemWidth = (AndroidUtilities.displaySize.x - ((itemsCount + 1) * AndroidUtilities.dp(4))) / itemsCount; + } + + for (int a = 0; a < itemsCount; a++) { + LayoutParams layoutParams = (LayoutParams) photoVideoViews[a].getLayoutParams(); + layoutParams.topMargin = isFirst ? 0 : AndroidUtilities.dp(4); + layoutParams.leftMargin = (itemWidth + AndroidUtilities.dp(4)) * a + AndroidUtilities.dp(4); + layoutParams.width = itemWidth; + layoutParams.height = itemWidth; + layoutParams.gravity = Gravity.TOP | Gravity.LEFT; + photoVideoViews[a].setLayoutParams(layoutParams); + } + + super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec((isFirst ? 0 : AndroidUtilities.dp(4)) + itemWidth, MeasureSpec.EXACTLY)); + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChangeChatNameActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChangeChatNameActivity.java index ddecb6b5a..5213e61c9 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChangeChatNameActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChangeChatNameActivity.java @@ -55,7 +55,7 @@ public class ChangeChatNameActivity extends BaseFragment { } @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { if (fragmentView == null) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChangeNameActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChangeNameActivity.java index 666525aa4..465b38ff1 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChangeNameActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChangeNameActivity.java @@ -48,7 +48,7 @@ public class ChangeNameActivity extends BaseFragment { private final static int done_button = 1; @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { if (fragmentView == null) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChangePhoneActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChangePhoneActivity.java index d0dc19b26..181158062 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChangePhoneActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChangePhoneActivity.java @@ -101,7 +101,7 @@ public class ChangePhoneActivity extends BaseFragment { } @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { if (fragmentView == null) { actionBar.setTitle(LocaleController.getString("AppName", R.string.AppName)); actionBar.setBackButtonImage(R.drawable.ic_ab_back); @@ -289,9 +289,9 @@ public class ChangePhoneActivity extends BaseFragment { private int countryState = 0; - private ArrayList countriesArray = new ArrayList(); - private HashMap countriesMap = new HashMap(); - private HashMap codesMap = new HashMap(); + private ArrayList countriesArray = new ArrayList<>(); + private HashMap countriesMap = new HashMap<>(); + private HashMap codesMap = new HashMap<>(); private boolean ignoreSelection = false; private boolean ignoreOnTextChange = false; @@ -533,7 +533,7 @@ public class ChangePhoneActivity extends BaseFragment { layoutParams.gravity = Gravity.LEFT; textView.setLayoutParams(layoutParams); - HashMap languageMap = new HashMap(); + HashMap languageMap = new HashMap<>(); try { BufferedReader reader = new BufferedReader(new InputStreamReader(getResources().getAssets().open("countries.txt"))); String line; @@ -1013,7 +1013,7 @@ public class ChangePhoneActivity extends BaseFragment { destroyCodeTimer(); UserConfig.setCurrentUser(user); UserConfig.saveConfig(true); - ArrayList users = new ArrayList(); + ArrayList users = new ArrayList<>(); users.add(user); MessagesStorage.getInstance().putUsersAndChats(users, null, true, true); MessagesController.getInstance().putUser(user, false); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChangePhoneHelpActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChangePhoneHelpActivity.java index e2c2b2cb5..a2f952728 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChangePhoneHelpActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChangePhoneHelpActivity.java @@ -35,7 +35,7 @@ import org.telegram.ui.ActionBar.BaseFragment; public class ChangePhoneHelpActivity extends BaseFragment { @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { if (fragmentView == null) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChangeUsernameActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChangeUsernameActivity.java index 42c811344..0f5d84290 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChangeUsernameActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChangeUsernameActivity.java @@ -61,7 +61,7 @@ public class ChangeUsernameActivity extends BaseFragment { private final static int done_button = 1; @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { if (fragmentView == null) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); @@ -205,14 +205,19 @@ public class ChangeUsernameActivity extends BaseFragment { } AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - if (error.equals("USERNAME_INVALID")) { - builder.setMessage(LocaleController.getString("UsernameInvalid", R.string.UsernameInvalid)); - } else if (error.equals("USERNAME_OCCUPIED")) { - builder.setMessage(LocaleController.getString("UsernameInUse", R.string.UsernameInUse)); - } else if (error.equals("USERNAMES_UNAVAILABLE")) { - builder.setMessage(LocaleController.getString("FeatureUnavailable", R.string.FeatureUnavailable)); - } else { - builder.setMessage(LocaleController.getString("ErrorOccurred", R.string.ErrorOccurred)); + switch (error) { + case "USERNAME_INVALID": + builder.setMessage(LocaleController.getString("UsernameInvalid", R.string.UsernameInvalid)); + break; + case "USERNAME_OCCUPIED": + builder.setMessage(LocaleController.getString("UsernameInUse", R.string.UsernameInUse)); + break; + case "USERNAMES_UNAVAILABLE": + builder.setMessage(LocaleController.getString("FeatureUnavailable", R.string.FeatureUnavailable)); + break; + default: + builder.setMessage(LocaleController.getString("ErrorOccurred", R.string.ErrorOccurred)); + break; } builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null); showAlertDialog(builder); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index 7b4590106..adbcd76d9 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -19,7 +19,7 @@ import android.content.pm.PackageManager; import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.Rect; -import android.graphics.drawable.Drawable; +import android.media.ExifInterface; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -42,6 +42,8 @@ import android.widget.AdapterView; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; @@ -107,8 +109,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not private TLRPC.EncryptedChat currentEncryptedChat; private boolean userBlocked = false; - private View progressView; - private View bottomOverlay; + private FrameLayout progressView; + private FrameLayout bottomOverlay; private ChatAdapter chatAdapter; private ChatActivityEnterView chatActivityEnterView; private ImageView timeItem; @@ -121,9 +123,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not private LayoutListView chatListView; private BackupImageView avatarImageView; private TextView bottomOverlayChatText; - private View bottomOverlayChat; + private FrameLayout bottomOverlayChat; private TypingDotsDrawable typingDotsDrawable; - private View emptyViewContainer; + private FrameLayout emptyViewContainer; private ArrayList actionModeViews = new ArrayList<>(); private TextView nameTextView; private TextView onlineTextView; @@ -133,8 +135,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not private TextView selectedMessagesCountTextView; private RecyclerListView stickersListView; private StickersAdapter stickersAdapter; - private View stickersPanel; + private FrameLayout stickersPanel; private TextView muteItem; + private ImageView pagedownButton; private boolean allowStickersPanel; private AnimatorSetProxy runningAnimation; @@ -151,7 +154,6 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not private boolean scrollToTopOnResume = false; private boolean scrollToTopUnReadOnResume = false; private boolean isCustomTheme = false; - private View pagedownButton; private long dialog_id; private boolean isBroadcast = false; private HashMap selectedMessagesIds = new HashMap<>(); @@ -216,6 +218,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not private final static int share_contact = 13; private final static int mute = 14; + private final static int id_chat_compose_panel = 1000; + AdapterView.OnItemLongClickListener onItemLongClickListener = new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView adapter, View view, int position, long id) { @@ -362,68 +366,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } else { return false; } - chatActivityEnterView = new ChatActivityEnterView(); - chatActivityEnterView.setDialogId(dialog_id); - chatActivityEnterView.setDelegate(new ChatActivityEnterView.ChatActivityEnterViewDelegate() { - @Override - public void onMessageSend() { - chatListView.post(new Runnable() { - @Override - public void run() { - chatListView.setSelectionFromTop(messages.size() - 1, -100000 - chatListView.getPaddingTop()); - } - }); - } - @Override - public void onTextChanged(CharSequence text) { - if (stickersAdapter != null) { - stickersAdapter.loadStikersForEmoji(text); - } - } - - @Override - public void needSendTyping() { - MessagesController.getInstance().sendTyping(dialog_id, classGuid); - } - - @Override - public void onAttachButtonHidden() { - if (attachItem != null) { - attachItem.setVisibility(View.VISIBLE); - } - if (headerItem != null) { - headerItem.setVisibility(View.INVISIBLE); - } - } - - @Override - public void onAttachButtonShow() { - if (attachItem != null) { - attachItem.setVisibility(View.INVISIBLE); - } - if (headerItem != null) { - headerItem.setVisibility(View.VISIBLE); - } - } - - @Override - public void onWindowSizeChanged(int size) { - if (size < AndroidUtilities.dp(72) + AndroidUtilities.getCurrentActionBarHeight()) { - allowStickersPanel = false; - if (stickersPanel.getVisibility() == View.VISIBLE) { - stickersPanel.clearAnimation(); - stickersPanel.setVisibility(View.INVISIBLE); - } - } else { - allowStickersPanel = true; - if (stickersPanel.getVisibility() == View.INVISIBLE) { - stickersPanel.clearAnimation(); - stickersPanel.setVisibility(View.VISIBLE); - } - } - } - }); NotificationCenter.getInstance().addObserver(this, NotificationCenter.messagesDidLoaded); NotificationCenter.getInstance().addObserver(this, NotificationCenter.emojiDidLoaded); NotificationCenter.getInstance().addObserver(this, NotificationCenter.updateInterfaces); @@ -528,7 +471,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not MediaController.getInstance().stopAudio(); } - public View createView(LayoutInflater inflater, ViewGroup container) { + @Override + public View createView(LayoutInflater inflater) { if (fragmentView == null) { lastPrintString = null; lastStatus = null; @@ -557,7 +501,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not FileLog.e("tmessages", e); } } else if (id == attach_gallery) { - PhotoAlbumPickerActivity fragment = new PhotoAlbumPickerActivity(); + PhotoAlbumPickerActivity fragment = new PhotoAlbumPickerActivity(false); fragment.setDelegate(new PhotoAlbumPickerActivity.PhotoAlbumPickerActivityDelegate() { @Override public void didSelectPhotos(ArrayList photos) { @@ -586,17 +530,17 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not Intent pickIntent = new Intent(); pickIntent.setType("video/*"); pickIntent.setAction(Intent.ACTION_GET_CONTENT); - pickIntent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, (long) (1024 * 1024 * 1000)); + pickIntent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, (long) (1024 * 1024 * 1536)); Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); File video = Utilities.generateVideoPath(); if (video != null) { if (Build.VERSION.SDK_INT >= 18) { takeVideoIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(video)); } - takeVideoIntent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, (long) (1024 * 1024 * 1000)); + takeVideoIntent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, (long) (1024 * 1024 * 1536)); currentPicturePath = video.getAbsolutePath(); } - Intent chooserIntent = Intent.createChooser(pickIntent, ""); + Intent chooserIntent = Intent.createChooser(pickIntent, null); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[]{takeVideoIntent}); startActivityForResult(chooserIntent, 2); @@ -782,7 +726,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not CharSequence[] items = new CharSequence[]{ LocaleController.formatString("MuteFor", R.string.MuteFor, LocaleController.formatPluralString("Hours", 1)), LocaleController.formatString("MuteFor", R.string.MuteFor, LocaleController.formatPluralString("Hours", 8)), - LocaleController.formatString("MuteFor", R.string.MuteFor, LocaleController.formatPluralString("Days", 2)) + LocaleController.formatString("MuteFor", R.string.MuteFor, LocaleController.formatPluralString("Days", 2)), + LocaleController.getString("MuteDisable", R.string.MuteDisable) }; builder.setItems(items, new DialogInterface.OnClickListener() { @Override @@ -794,13 +739,21 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not untilTime += 60 * 60 * 8; } else if (i == 2) { untilTime += 60 * 60 * 48; + } else if (i == 3) { + untilTime = Integer.MAX_VALUE; } SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); - editor.putInt("notify2_" + dialog_id, 3); - editor.putInt("notifyuntil_" + dialog_id, untilTime); - long flags = ((long)untilTime << 32) | 1; + long flags = 0; + if (i == 3) { + editor.putInt("notify2_" + dialog_id, 2); + flags = 1; + } else { + editor.putInt("notify2_" + dialog_id, 3); + editor.putInt("notifyuntil_" + dialog_id, untilTime); + flags = ((long)untilTime << 32) | 1; + } MessagesStorage.getInstance().setDialogFlags(dialog_id, flags); editor.commit(); TLRPC.TL_dialog dialog = MessagesController.getInstance().dialogs_dict.get(dialog_id); @@ -1025,92 +978,170 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not actionMode.getItem(copy).setVisibility(selectedMessagesCanCopyIds.size() != 0 ? View.VISIBLE : View.GONE); checkActionBarMenu(); - fragmentView = inflater.inflate(R.layout.chat_layout, container, false); + fragmentView = new SizeNotifierRelativeLayout(getParentActivity()); + SizeNotifierRelativeLayout contentView = (SizeNotifierRelativeLayout) fragmentView; - View contentView = fragmentView.findViewById(R.id.chat_layout); - TextView emptyView = (TextView) fragmentView.findViewById(R.id.searchEmptyView); - emptyViewContainer = fragmentView.findViewById(R.id.empty_view); + contentView.setBackgroundImage(ApplicationLoader.getCachedWallpaper()); + isCustomTheme = ApplicationLoader.isCustomTheme(); + + emptyViewContainer = new FrameLayout(getParentActivity()); + emptyViewContainer.setPadding(0, 0, 0, AndroidUtilities.dp(48)); emptyViewContainer.setVisibility(View.INVISIBLE); + contentView.addView(emptyViewContainer); + RelativeLayout.LayoutParams layoutParams3 = (RelativeLayout.LayoutParams) emptyViewContainer.getLayoutParams(); + layoutParams3.width = RelativeLayout.LayoutParams.MATCH_PARENT; + layoutParams3.height = RelativeLayout.LayoutParams.MATCH_PARENT; + emptyViewContainer.setLayoutParams(layoutParams3); emptyViewContainer.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return true; } }); - emptyView.setText(LocaleController.getString("NoMessages", R.string.NoMessages)); - chatListView = (LayoutListView)fragmentView.findViewById(R.id.chat_list_view); - chatListView.setAdapter(chatAdapter = new ChatAdapter(getParentActivity())); - bottomOverlay = fragmentView.findViewById(R.id.bottom_overlay); - bottomOverlayText = (TextView)fragmentView.findViewById(R.id.bottom_overlay_text); - bottomOverlayChat = fragmentView.findViewById(R.id.bottom_overlay_chat); - progressView = fragmentView.findViewById(R.id.progressLayout); - pagedownButton = fragmentView.findViewById(R.id.pagedown_button); - pagedownButton.setVisibility(View.GONE); - View progressViewInner = progressView.findViewById(R.id.progressLayoutInner); - - updateContactStatus(); - - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); - int selectedBackground = preferences.getInt("selectedBackground", 1000001); - int selectedColor = preferences.getInt("selectedColor", 0); - if (selectedColor != 0) { - contentView.setBackgroundColor(selectedColor); - chatListView.setCacheColorHint(selectedColor); + if (currentEncryptedChat == null) { + TextView emptyView = new TextView(getParentActivity()); + if (currentUser != null && (currentUser.id / 1000 == 333 || currentUser.id % 1000 == 0)) { + emptyView.setText(LocaleController.getString("GotAQuestion", R.string.GotAQuestion)); + } else { + emptyView.setText(LocaleController.getString("NoMessages", R.string.NoMessages)); + } + emptyView.setPadding(AndroidUtilities.dp(7), AndroidUtilities.dp(1), AndroidUtilities.dp(7), AndroidUtilities.dp(1)); + emptyView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + emptyView.setGravity(Gravity.CENTER); + emptyView.setTextColor(0xffffffff); + emptyView.setBackgroundResource(isCustomTheme ? R.drawable.system_black : R.drawable.system_blue); + emptyViewContainer.addView(emptyView); + layoutParams2 = (FrameLayout.LayoutParams) emptyView.getLayoutParams(); + layoutParams2.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.gravity = Gravity.CENTER; + emptyView.setLayoutParams(layoutParams2); } else { - chatListView.setCacheColorHint(0); - try { - if (ApplicationLoader.cachedWallpaper != null) { - isCustomTheme = selectedBackground != 1000001; - ((SizeNotifierRelativeLayout) contentView).setBackgroundImage(ApplicationLoader.cachedWallpaper); + LinearLayout secretChatPlaceholder = new LinearLayout(getParentActivity()); + secretChatPlaceholder.setBackgroundResource(isCustomTheme ? R.drawable.system_black : R.drawable.system_blue); + secretChatPlaceholder.setPadding(AndroidUtilities.dp(16), AndroidUtilities.dp(12), AndroidUtilities.dp(16), AndroidUtilities.dp(12)); + secretChatPlaceholder.setOrientation(LinearLayout.VERTICAL); + emptyViewContainer.addView(secretChatPlaceholder); + layoutParams2 = (FrameLayout.LayoutParams) secretChatPlaceholder.getLayoutParams(); + layoutParams2.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.gravity = Gravity.CENTER; + secretChatPlaceholder.setLayoutParams(layoutParams2); + + secretViewStatusTextView = new TextView(getParentActivity()); + secretViewStatusTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); + secretViewStatusTextView.setTextColor(0xffffffff); + secretViewStatusTextView.setGravity(Gravity.CENTER_HORIZONTAL); + secretViewStatusTextView.setMaxWidth(AndroidUtilities.dp(210)); + if (currentEncryptedChat.admin_id == UserConfig.getClientUserId()) { + if (currentUser.first_name.length() > 0) { + secretViewStatusTextView.setText(LocaleController.formatString("EncryptedPlaceholderTitleOutgoing", R.string.EncryptedPlaceholderTitleOutgoing, currentUser.first_name)); } else { - if (selectedBackground == 1000001) { - ((SizeNotifierRelativeLayout) contentView).setBackgroundImage(R.drawable.background_hd); - ApplicationLoader.cachedWallpaper = ((SizeNotifierRelativeLayout) contentView).getBackgroundImage(); - } else { - File toFile = new File(ApplicationLoader.applicationContext.getFilesDir(), "wallpaper.jpg"); - if (toFile.exists()) { - Drawable drawable = Drawable.createFromPath(toFile.getAbsolutePath()); - if (drawable != null) { - ((SizeNotifierRelativeLayout) contentView).setBackgroundImage(drawable); - ApplicationLoader.cachedWallpaper = drawable; - } else { - contentView.setBackgroundColor(-2693905); - chatListView.setCacheColorHint(-2693905); - } - isCustomTheme = true; - } else { - ((SizeNotifierRelativeLayout) contentView).setBackgroundImage(R.drawable.background_hd); - ApplicationLoader.cachedWallpaper = ((SizeNotifierRelativeLayout) contentView).getBackgroundImage(); - isCustomTheme = false; - } - } + secretViewStatusTextView.setText(LocaleController.formatString("EncryptedPlaceholderTitleOutgoing", R.string.EncryptedPlaceholderTitleOutgoing, currentUser.last_name)); } - } catch (Throwable e) { - contentView.setBackgroundColor(-2693905); - chatListView.setCacheColorHint(-2693905); - FileLog.e("tmessages", e); + } else { + if (currentUser.first_name.length() > 0) { + secretViewStatusTextView.setText(LocaleController.formatString("EncryptedPlaceholderTitleIncoming", R.string.EncryptedPlaceholderTitleIncoming, currentUser.first_name)); + } else { + secretViewStatusTextView.setText(LocaleController.formatString("EncryptedPlaceholderTitleIncoming", R.string.EncryptedPlaceholderTitleIncoming, currentUser.last_name)); + } + } + secretChatPlaceholder.addView(secretViewStatusTextView); + layoutParams = (LinearLayout.LayoutParams) secretViewStatusTextView.getLayoutParams(); + layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams.gravity = Gravity.CENTER_HORIZONTAL; + secretViewStatusTextView.setLayoutParams(layoutParams); + + TextView textView = new TextView(getParentActivity()); + textView.setText(LocaleController.getString("EncryptedDescriptionTitle", R.string.EncryptedDescriptionTitle)); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); + textView.setTextColor(0xffffffff); + textView.setGravity(Gravity.CENTER_HORIZONTAL); + textView.setMaxWidth(AndroidUtilities.dp(260)); + secretChatPlaceholder.addView(textView); + layoutParams = (LinearLayout.LayoutParams) textView.getLayoutParams(); + layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams.topMargin = AndroidUtilities.dp(8); + layoutParams.gravity = LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT; + textView.setLayoutParams(layoutParams); + + for (int a = 0; a < 4; a++) { + LinearLayout linearLayout = new LinearLayout(getParentActivity()); + linearLayout.setOrientation(LinearLayout.HORIZONTAL); + secretChatPlaceholder.addView(linearLayout); + layoutParams = (LinearLayout.LayoutParams) linearLayout.getLayoutParams(); + layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams.topMargin = AndroidUtilities.dp(8); + layoutParams.gravity = LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT; + linearLayout.setLayoutParams(layoutParams); + + ImageView imageView = new ImageView(getParentActivity()); + imageView.setImageResource(R.drawable.ic_lock_white); + + textView = new TextView(getParentActivity()); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); + textView.setTextColor(0xffffffff); + textView.setGravity(Gravity.CENTER_VERTICAL | (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT)); + textView.setMaxWidth(AndroidUtilities.dp(260)); + + switch (a) { + case 0: + textView.setText(LocaleController.getString("EncryptedDescription1", R.string.EncryptedDescription1)); + break; + case 1: + textView.setText(LocaleController.getString("EncryptedDescription2", R.string.EncryptedDescription2)); + break; + case 2: + textView.setText(LocaleController.getString("EncryptedDescription3", R.string.EncryptedDescription3)); + break; + case 3: + textView.setText(LocaleController.getString("EncryptedDescription4", R.string.EncryptedDescription4)); + break; + } + + if (LocaleController.isRTL) { + linearLayout.addView(textView); + linearLayout.addView(imageView); + } else { + linearLayout.addView(imageView); + linearLayout.addView(textView); + } + layoutParams = (LinearLayout.LayoutParams) imageView.getLayoutParams(); + layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams.rightMargin = LocaleController.isRTL ? 0 : AndroidUtilities.dp(8); + layoutParams.leftMargin = LocaleController.isRTL ? AndroidUtilities.dp(8) : 0; + layoutParams.topMargin = AndroidUtilities.dp(LocaleController.isRTL ? 3 : 4); + imageView.setLayoutParams(layoutParams); + + layoutParams = (LinearLayout.LayoutParams) textView.getLayoutParams(); + layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT; + textView.setLayoutParams(layoutParams); } } - if (isCustomTheme) { - progressViewInner.setBackgroundResource(R.drawable.system_loader2); - emptyView.setBackgroundResource(R.drawable.system_black); - } else { - progressViewInner.setBackgroundResource(R.drawable.system_loader1); - emptyView.setBackgroundResource(R.drawable.system_blue); - } - emptyView.setPadding(AndroidUtilities.dp(7), AndroidUtilities.dp(1), AndroidUtilities.dp(7), AndroidUtilities.dp(1)); - - if (currentUser != null && (currentUser.id / 1000 == 333 || currentUser.id % 1000 == 0)) { - emptyView.setText(LocaleController.getString("GotAQuestion", R.string.GotAQuestion)); - } - + chatListView = new LayoutListView(getParentActivity()); + chatListView.setAdapter(chatAdapter = new ChatAdapter(getParentActivity())); + chatListView.setCacheColorHint(ApplicationLoader.getSelectedColor()); + chatListView.setClipToPadding(false); + chatListView.setStackFromBottom(true); + chatListView.setPadding(0, AndroidUtilities.dp(4), 0, AndroidUtilities.dp(3)); + chatListView.setDivider(null); + chatListView.setSelector(R.drawable.transparent); chatListView.setOnItemLongClickListener(onItemLongClickListener); chatListView.setOnItemClickListener(onItemClickListener); - - final Rect scrollRect = new Rect(); - + contentView.addView(chatListView); + layoutParams3 = (RelativeLayout.LayoutParams) chatListView.getLayoutParams(); + layoutParams3.width = RelativeLayout.LayoutParams.MATCH_PARENT; + layoutParams3.height = RelativeLayout.LayoutParams.MATCH_PARENT; + layoutParams3.bottomMargin = -AndroidUtilities.dp(3); + layoutParams3.addRule(RelativeLayout.ABOVE, id_chat_compose_panel); + chatListView.setLayoutParams(layoutParams3); chatListView.setOnInterceptTouchEventListener(new LayoutListView.OnInterceptTouchEventListener() { @Override public boolean onInterceptTouchEvent(MotionEvent event) { @@ -1169,7 +1200,6 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not return false; } }); - chatListView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { @@ -1220,8 +1250,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not return false; } }); - chatListView.setOnScrollListener(new AbsListView.OnScrollListener() { + Rect scrollRect = new Rect(); + @Override public void onScrollStateChanged(AbsListView absListView, int i) { if (i == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL || i == AbsListView.OnScrollListener.SCROLL_STATE_FLING && highlightMessageId != Integer.MAX_VALUE) { @@ -1264,22 +1295,129 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } }); - stickersListView = (RecyclerListView) fragmentView.findViewById(R.id.stickers_listview); + progressView = new FrameLayout(getParentActivity()); + progressView.setVisibility(View.INVISIBLE); + progressView.setBackgroundResource(isCustomTheme ? R.drawable.system_loader2 : R.drawable.system_loader1); + contentView.addView(progressView); + layoutParams3 = (RelativeLayout.LayoutParams) progressView.getLayoutParams(); + layoutParams3.width = AndroidUtilities.dp(36); + layoutParams3.height = AndroidUtilities.dp(36); + layoutParams3.bottomMargin = AndroidUtilities.dp(48); + layoutParams3.addRule(RelativeLayout.CENTER_IN_PARENT); + progressView.setLayoutParams(layoutParams3); + + ProgressBar progressBar = new ProgressBar(getParentActivity()); + progressBar.setIndeterminateDrawable(getParentActivity().getResources().getDrawable(R.drawable.loading_animation)); + progressBar.setIndeterminate(true); + AndroidUtilities.setProgressBarAnimationDuration(progressBar, 1500); + progressView.addView(progressBar); + layoutParams2 = (FrameLayout.LayoutParams) progressBar.getLayoutParams(); + layoutParams2.width = AndroidUtilities.dp(32); + layoutParams2.height = AndroidUtilities.dp(32); + layoutParams2.gravity = Gravity.CENTER; + progressBar.setLayoutParams(layoutParams2); + + if (chatActivityEnterView != null) { + chatActivityEnterView.onDestroy(); + } + chatActivityEnterView = new ChatActivityEnterView(getParentActivity(), contentView, true); + chatActivityEnterView.setDialogId(dialog_id); + chatActivityEnterView.addToAttachLayout(menuItem); + chatActivityEnterView.setId(id_chat_compose_panel); + contentView.addView(chatActivityEnterView); + layoutParams3 = (RelativeLayout.LayoutParams) chatActivityEnterView.getLayoutParams(); + layoutParams3.width = RelativeLayout.LayoutParams.MATCH_PARENT; + layoutParams3.height = RelativeLayout.LayoutParams.WRAP_CONTENT; + layoutParams3.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); + chatActivityEnterView.setLayoutParams(layoutParams3); + chatActivityEnterView.setDelegate(new ChatActivityEnterView.ChatActivityEnterViewDelegate() { + @Override + public void onMessageSend() { + chatListView.post(new Runnable() { + @Override + public void run() { + chatListView.setSelectionFromTop(messages.size() - 1, -100000 - chatListView.getPaddingTop()); + } + }); + } + + @Override + public void onTextChanged(CharSequence text) { + if (stickersAdapter != null) { + stickersAdapter.loadStikersForEmoji(text); + } + } + + @Override + public void needSendTyping() { + MessagesController.getInstance().sendTyping(dialog_id, classGuid); + } + + @Override + public void onAttachButtonHidden() { + if (attachItem != null) { + attachItem.setVisibility(View.VISIBLE); + } + if (headerItem != null) { + headerItem.setVisibility(View.INVISIBLE); + } + } + + @Override + public void onAttachButtonShow() { + if (attachItem != null) { + attachItem.setVisibility(View.INVISIBLE); + } + if (headerItem != null) { + headerItem.setVisibility(View.VISIBLE); + } + } + + @Override + public void onWindowSizeChanged(int size) { + if (size < AndroidUtilities.dp(72) + AndroidUtilities.getCurrentActionBarHeight()) { + allowStickersPanel = false; + if (stickersPanel.getVisibility() == View.VISIBLE) { + stickersPanel.clearAnimation(); + stickersPanel.setVisibility(View.INVISIBLE); + } + } else { + allowStickersPanel = true; + if (stickersPanel.getVisibility() == View.INVISIBLE) { + stickersPanel.clearAnimation(); + stickersPanel.setVisibility(View.VISIBLE); + } + } + } + }); + + stickersPanel = new FrameLayout(getParentActivity()); + stickersPanel.setVisibility(View.GONE); + contentView.addView(stickersPanel); + layoutParams3 = (RelativeLayout.LayoutParams) stickersPanel.getLayoutParams(); + layoutParams3.width = RelativeLayout.LayoutParams.WRAP_CONTENT; + layoutParams3.height = AndroidUtilities.dp(81.5f); + layoutParams3.bottomMargin = AndroidUtilities.dp(38); + layoutParams3.addRule(RelativeLayout.ALIGN_BOTTOM, id_chat_compose_panel); + stickersPanel.setLayoutParams(layoutParams3); + + stickersListView = new RecyclerListView(getParentActivity()); LinearLayoutManager layoutManager = new LinearLayoutManager(getParentActivity()); layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); stickersListView.setLayoutManager(layoutManager); - stickersPanel = fragmentView.findViewById(R.id.stickers_panel); - stickersPanel.setVisibility(View.GONE); stickersListView.setClipToPadding(false); if (Build.VERSION.SDK_INT >= 9) { stickersListView.setOverScrollMode(RecyclerListView.OVER_SCROLL_NEVER); } - - if (stickersAdapter != null) { - stickersAdapter.destroy(); - } - + stickersPanel.addView(stickersListView); + layoutParams2 = (FrameLayout.LayoutParams) stickersListView.getLayoutParams(); + layoutParams2.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams2.height = AndroidUtilities.dp(78); + stickersListView.setLayoutParams(layoutParams2); if (currentEncryptedChat == null || currentEncryptedChat != null && AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) >= 23) { + if (stickersAdapter != null) { + stickersAdapter.destroy(); + } stickersListView.setPadding(AndroidUtilities.dp(18), 0, AndroidUtilities.dp(18), 0); stickersListView.setAdapter(stickersAdapter = new StickersAdapter(getParentActivity(), new StickersAdapter.StickersAdapterDelegate() { @Override @@ -1363,33 +1501,48 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not })); } - bottomOverlayChatText = (TextView)fragmentView.findViewById(R.id.bottom_overlay_chat_text); - TextView textView = (TextView)fragmentView.findViewById(R.id.secret_title); - textView.setText(LocaleController.getString("EncryptedDescriptionTitle", R.string.EncryptedDescriptionTitle)); - textView = (TextView)fragmentView.findViewById(R.id.secret_description1); - textView.setText(LocaleController.getString("EncryptedDescription1", R.string.EncryptedDescription1)); - textView = (TextView)fragmentView.findViewById(R.id.secret_description2); - textView.setText(LocaleController.getString("EncryptedDescription2", R.string.EncryptedDescription2)); - textView = (TextView)fragmentView.findViewById(R.id.secret_description3); - textView.setText(LocaleController.getString("EncryptedDescription3", R.string.EncryptedDescription3)); - textView = (TextView)fragmentView.findViewById(R.id.secret_description4); - textView.setText(LocaleController.getString("EncryptedDescription4", R.string.EncryptedDescription4)); + ImageView imageView = new ImageView(getParentActivity()); + imageView.setImageResource(R.drawable.stickers_back_arrow); + stickersPanel.addView(imageView); + layoutParams2 = (FrameLayout.LayoutParams) imageView.getLayoutParams(); + layoutParams2.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.gravity = Gravity.BOTTOM; + layoutParams2.leftMargin = AndroidUtilities.dp(53); + imageView.setLayoutParams(layoutParams2); - if (loading && messages.isEmpty()) { - progressView.setVisibility(View.VISIBLE); - chatListView.setEmptyView(null); - } else { - progressView.setVisibility(View.INVISIBLE); - chatListView.setEmptyView(emptyViewContainer); - } + bottomOverlay = new FrameLayout(getParentActivity()); + bottomOverlay.setBackgroundColor(0xffffffff); + bottomOverlay.setVisibility(View.INVISIBLE); + bottomOverlay.setFocusable(true); + bottomOverlay.setFocusableInTouchMode(true); + bottomOverlay.setClickable(true); + contentView.addView(bottomOverlay); + layoutParams3 = (RelativeLayout.LayoutParams) bottomOverlay.getLayoutParams(); + layoutParams3.width = RelativeLayout.LayoutParams.MATCH_PARENT; + layoutParams3.height = AndroidUtilities.dp(48); + layoutParams3.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); + bottomOverlay.setLayoutParams(layoutParams3); - pagedownButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - scrollToLastMessage(); - } - }); + bottomOverlayText = new TextView(getParentActivity()); + bottomOverlayText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + bottomOverlayText.setTextColor(0xff7f7f7f); + bottomOverlay.addView(bottomOverlayText); + layoutParams2 = (FrameLayout.LayoutParams) bottomOverlayText.getLayoutParams(); + layoutParams2.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.gravity = Gravity.CENTER; + bottomOverlayText.setLayoutParams(layoutParams2); + bottomOverlayChat = new FrameLayout(getParentActivity()); + bottomOverlayChat.setBackgroundColor(0xfffbfcfd); + bottomOverlayChat.setVisibility(View.INVISIBLE); + contentView.addView(bottomOverlayChat); + layoutParams3 = (RelativeLayout.LayoutParams) bottomOverlayChat.getLayoutParams(); + layoutParams3.width = RelativeLayout.LayoutParams.MATCH_PARENT; + layoutParams3.height = AndroidUtilities.dp(48); + layoutParams3.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); + bottomOverlayChat.setLayoutParams(layoutParams3); bottomOverlayChat.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { @@ -1421,42 +1574,46 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } }); - updateBottomOverlay(); + bottomOverlayChatText = new TextView(getParentActivity()); + bottomOverlayChatText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); + bottomOverlayChatText.setTextColor(0xff3e6fa1); + bottomOverlayChat.addView(bottomOverlayChatText); + layoutParams2 = (FrameLayout.LayoutParams) bottomOverlayChatText.getLayoutParams(); + layoutParams2.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams2.gravity = Gravity.CENTER; + bottomOverlayChatText.setLayoutParams(layoutParams2); - chatActivityEnterView.setContainerView(getParentActivity(), fragmentView); - chatActivityEnterView.addToAttachLayout(menuItem); - - if (currentEncryptedChat != null) { - emptyView.setVisibility(View.INVISIBLE); - View secretChatPlaceholder = contentView.findViewById(R.id.secret_placeholder); - secretChatPlaceholder.setVisibility(View.VISIBLE); - if (isCustomTheme) { - secretChatPlaceholder.setBackgroundResource(R.drawable.system_black); - } else { - secretChatPlaceholder.setBackgroundResource(R.drawable.system_blue); + pagedownButton = new ImageView(getParentActivity()); + pagedownButton.setVisibility(View.INVISIBLE); + pagedownButton.setImageResource(R.drawable.pagedown); + contentView.addView(pagedownButton); + layoutParams3 = (RelativeLayout.LayoutParams) pagedownButton.getLayoutParams(); + layoutParams3.width = RelativeLayout.LayoutParams.WRAP_CONTENT; + layoutParams3.height = RelativeLayout.LayoutParams.WRAP_CONTENT; + layoutParams3.rightMargin = AndroidUtilities.dp(6); + layoutParams3.bottomMargin = AndroidUtilities.dp(4); + layoutParams3.addRule(RelativeLayout.ABOVE, id_chat_compose_panel); + layoutParams3.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); + pagedownButton.setLayoutParams(layoutParams3); + pagedownButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + scrollToLastMessage(); } - secretViewStatusTextView = (TextView) contentView.findViewById(R.id.invite_text); - secretChatPlaceholder.setPadding(AndroidUtilities.dp(16), AndroidUtilities.dp(12), AndroidUtilities.dp(16), AndroidUtilities.dp(12)); + }); - View v = contentView.findViewById(R.id.secret_placeholder); - v.setVisibility(View.VISIBLE); - - if (currentEncryptedChat.admin_id == UserConfig.getClientUserId()) { - if (currentUser.first_name.length() > 0) { - secretViewStatusTextView.setText(LocaleController.formatString("EncryptedPlaceholderTitleOutgoing", R.string.EncryptedPlaceholderTitleOutgoing, currentUser.first_name)); - } else { - secretViewStatusTextView.setText(LocaleController.formatString("EncryptedPlaceholderTitleOutgoing", R.string.EncryptedPlaceholderTitleOutgoing, currentUser.last_name)); - } - } else { - if (currentUser.first_name.length() > 0) { - secretViewStatusTextView.setText(LocaleController.formatString("EncryptedPlaceholderTitleIncoming", R.string.EncryptedPlaceholderTitleIncoming, currentUser.first_name)); - } else { - secretViewStatusTextView.setText(LocaleController.formatString("EncryptedPlaceholderTitleIncoming", R.string.EncryptedPlaceholderTitleIncoming, currentUser.last_name)); - } - } - - updateSecretStatus(); + if (loading && messages.isEmpty()) { + progressView.setVisibility(View.VISIBLE); + chatListView.setEmptyView(null); + } else { + progressView.setVisibility(View.INVISIBLE); + chatListView.setEmptyView(emptyViewContainer); } + + updateContactStatus(); + updateBottomOverlay(); + updateSecretStatus(); } else { ViewGroup parent = (ViewGroup)fragmentView.getParent(); if (parent != null) { @@ -1506,7 +1663,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not return; } if (show) { - if (pagedownButton.getVisibility() == View.GONE) { + if (pagedownButton.getVisibility() == View.INVISIBLE) { if (animated) { pagedownButton.setVisibility(View.VISIBLE); ViewProxy.setAlpha(pagedownButton, 0); @@ -1521,11 +1678,11 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not ObjectAnimatorProxy.ofFloatProxy(pagedownButton, "alpha", 0.0f).setDuration(200).addListener(new AnimatorListenerAdapterProxy() { @Override public void onAnimationEnd(Object animation) { - pagedownButton.setVisibility(View.GONE); + pagedownButton.setVisibility(View.INVISIBLE); } }).start(); } else { - pagedownButton.setVisibility(View.GONE); + pagedownButton.setVisibility(View.INVISIBLE); } } } @@ -1536,7 +1693,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not return; } if (currentEncryptedChat == null || secretViewStatusTextView == null) { - bottomOverlay.setVisibility(View.GONE); + bottomOverlay.setVisibility(View.INVISIBLE); return; } boolean hideKeyboard = false; @@ -1556,11 +1713,13 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not preferences.edit().remove("dialog_" + dialog_id).commit(); hideKeyboard = true; } else if (currentEncryptedChat instanceof TLRPC.TL_encryptedChat) { - bottomOverlay.setVisibility(View.GONE); + bottomOverlay.setVisibility(View.INVISIBLE); } if (hideKeyboard) { chatActivityEnterView.hideEmojiPopup(); - AndroidUtilities.hideKeyboard(getParentActivity().getCurrentFocus()); + if (getParentActivity() != null) { + AndroidUtilities.hideKeyboard(getParentActivity().getCurrentFocus()); + } } checkActionBarMenu(); } @@ -1624,7 +1783,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (!(messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaEmpty)) { return 0; } else { - return 6; + return 7; } } else { return -1; @@ -1658,8 +1817,12 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (canSave) { if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument) { String mime = messageObject.messageOwner.media.document.mime_type; - if (mime != null && mime.endsWith("/xml")) { - return 5; + if (mime != null) { + if (mime.endsWith("/xml")) { + return 5; + } else if (mime.endsWith("/png") || mime.endsWith("/jpg") || mime.endsWith("/jpeg")) { + return 6; + } } } return 4; @@ -1681,7 +1844,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (!(messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaEmpty)) { return 0; } else { - return 6; + return 7; } } else if (messageObject.type == 10 || messageObject.type == 11) { if (messageObject.isSending()) { @@ -1757,7 +1920,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not int type = getMessageType(message); - if (type < 2 || type == 6) { + if (type < 2 || type == 7) { return; } addToSelectedMessages(message); @@ -1795,12 +1958,6 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not nameTextView.setText(ContactsController.formatName(currentUser.first_name, currentUser.last_name)); } } - TLRPC.TL_dialog dialog = MessagesController.getInstance().dialogs_dict.get(dialog_id); - if (dialog != null && dialog.notify_settings != null) { - - } else { - nameTextView.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.mute_blue, 0); - } } private void updateTitleIcons() { @@ -1960,8 +2117,40 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not public void onActivityResultFragment(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK) { if (requestCode == 0) { + PhotoViewer.getInstance().setParentActivity(getParentActivity()); + final ArrayList arrayList = new ArrayList<>(); + int orientation = 0; + try { + ExifInterface ei = new ExifInterface(currentPicturePath); + int exif = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); + switch(exif) { + case ExifInterface.ORIENTATION_ROTATE_90: + orientation = 90; + break; + case ExifInterface.ORIENTATION_ROTATE_180: + orientation = 180; + break; + case ExifInterface.ORIENTATION_ROTATE_270: + orientation = 270; + break; + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + arrayList.add(new MediaController.PhotoEntry(0, 0, 0, currentPicturePath, orientation)); + + PhotoViewer.getInstance().openPhotoForSelect(arrayList, 0, 2, new PhotoViewer.EmptyPhotoViewerProvider() { + @Override + public void sendButtonPressed(int index) { + MediaController.PhotoEntry photoEntry = (MediaController.PhotoEntry) arrayList.get(0); + if (photoEntry.imagePath != null) { + SendMessagesHelper.prepareSendingPhoto(photoEntry.imagePath, null, dialog_id); + } else if (photoEntry.path != null) { + SendMessagesHelper.prepareSendingPhoto(photoEntry.path, null, dialog_id); + } + } + }); Utilities.addMediaToGallery(currentPicturePath); - SendMessagesHelper.prepareSendingPhoto(currentPicturePath, null, dialog_id); currentPicturePath = null; } else if (requestCode == 1) { if (data == null || data.getData() == null) { @@ -2828,7 +3017,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not chatActivityEnterView.setFieldFocused(false); } else { muteItem.setVisibility(View.VISIBLE); - bottomOverlayChat.setVisibility(View.GONE); + bottomOverlayChat.setVisibility(View.INVISIBLE); } } @@ -2946,19 +3135,20 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (menuItem != null) { menuItem.closeSubMenu(); } - chatActivityEnterView.hideEmojiPopup(); paused = true; NotificationsController.getInstance().setOpennedDialogId(0); - - String text = chatActivityEnterView.getFieldText(); - if (text != null) { - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - editor.putString("dialog_" + dialog_id, text); - editor.commit(); + if (chatActivityEnterView != null) { + chatActivityEnterView.hideEmojiPopup(); + String text = chatActivityEnterView.getFieldText(); + if (text != null) { + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + editor.putString("dialog_" + dialog_id, text); + editor.commit(); + } + chatActivityEnterView.setFieldFocused(false); } - chatActivityEnterView.setFieldFocused(false); MessagesController.getInstance().cancelTyping(dialog_id); if (currentEncryptedChat != null) { @@ -3071,7 +3261,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not selectedMessagesIds.clear(); actionBar.hideActionMode(); - if (single || type < 2 || type == 6) { + if (single || type < 2 || type == 7) { if (type >= 0) { selectedObject = message; if (getParentActivity() == null) { @@ -3085,7 +3275,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not items = new CharSequence[] {LocaleController.getString("Retry", R.string.Retry), LocaleController.getString("Delete", R.string.Delete)}; } else if (type == 1) { items = new CharSequence[] {LocaleController.getString("Delete", R.string.Delete)}; - } else if (type == 6) { + } else if (type == 7) { items = new CharSequence[] {LocaleController.getString("Retry", R.string.Retry), LocaleController.getString("Copy", R.string.Copy), LocaleController.getString("Delete", R.string.Delete)}; } else { if (currentEncryptedChat == null) { @@ -3098,6 +3288,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not selectedObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument ? R.string.ShareFile : R.string.SaveToGallery), LocaleController.getString("Forward", R.string.Forward), LocaleController.getString("Delete", R.string.Delete)}; } else if (type == 5) { items = new CharSequence[]{LocaleController.getString("ApplyLocalizationFile", R.string.ApplyLocalizationFile), LocaleController.getString("ShareFile", R.string.ShareFile), LocaleController.getString("Forward", R.string.Forward), LocaleController.getString("Delete", R.string.Delete)}; + } else if (type == 6) { + items = new CharSequence[]{LocaleController.getString("SaveToGallery", R.string.SaveToGallery), LocaleController.getString("ShareFile", R.string.ShareFile), LocaleController.getString("Forward", R.string.Forward), LocaleController.getString("Delete", R.string.Delete)}; } } else { if (type == 2) { @@ -3188,6 +3380,16 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } } } else if (type == 6) { + if (i == 0) { + processSelectedOption(7); + } else if (i == 1) { + processSelectedOption(6); + } else if (i == 2) { + processSelectedOption(2); + } else if (i == 3) { + processSelectedOption(1); + } + } else if (type == 7) { if (i == 0) { processSelectedOption(0); } else if (i == 1) { @@ -3296,7 +3498,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not Intent intent = new Intent(Intent.ACTION_SEND); intent.setType(selectedObject.messageOwner.media.document.mime_type); intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(path))); - getParentActivity().startActivity(Intent.createChooser(intent, "")); + getParentActivity().startActivityForResult(Intent.createChooser(intent, LocaleController.getString("ShareFile", R.string.ShareFile)), 500); } } else if (option == 5) { File locFile = null; @@ -3326,6 +3528,28 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not showAlertDialog(builder); } } + } else if (option == 6 || option == 7) { + String fileName = selectedObject.getFileName(); + String path = selectedObject.messageOwner.attachPath; + if (path != null && path.length() > 0) { + File temp = new File(path); + if (!temp.exists()) { + path = null; + } + } + if (path == null || path.length() == 0) { + path = FileLoader.getPathToMessage(selectedObject.messageOwner).toString(); + } + if (selectedObject.type == 8 || selectedObject.type == 9) { + if (option == 6) { + Intent intent = new Intent(Intent.ACTION_SEND); + intent.setType(selectedObject.messageOwner.media.document.mime_type); + intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(path))); + getParentActivity().startActivityForResult(Intent.createChooser(intent, LocaleController.getString("ShareFile", R.string.ShareFile)), 500); + } else if (option == 7) { + MediaController.saveFile(path, getParentActivity(), 0, null); + } + } } selectedObject = null; } @@ -3374,7 +3598,6 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } else if (lower_part < 0) { args.putInt("chat_id", -lower_part); } - forwardSelectedMessages(did, param); ChatActivity chatActivity = new ChatActivity(args); presentFragment(chatActivity, true); if (!AndroidUtilities.isTablet()) { @@ -3387,6 +3610,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not parentActivity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); } } + forwardSelectedMessages(did, param); } else { activity.finishFragment(); } @@ -3433,7 +3657,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not public void onClick(DialogInterface dialogInterface, int i) { try { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.google.android.apps.maps")); - getParentActivity().startActivity(intent); + getParentActivity().startActivityForResult(intent, 500); } catch (Exception e) { FileLog.e("tmessages", e); } @@ -3495,6 +3719,11 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not showAlertDialog(builder); } + @Override + public void updatePhotoAtIndex(int index) { + + } + @Override public PhotoViewer.PlaceProviderObject getPlaceForPhoto(MessageObject messageObject, TLRPC.FileLocation fileLocation, int index) { if (messageObject == null) { @@ -3715,7 +3944,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(f), "video/mp4"); - getParentActivity().startActivity(intent); + getParentActivity().startActivityForResult(intent, 500); } catch (Exception e) { alertUserOpenError(message); } @@ -3762,13 +3991,13 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } if (realMimeType != null) { try { - getParentActivity().startActivity(intent); + getParentActivity().startActivityForResult(intent, 500); } catch (Exception e) { intent.setDataAndType(Uri.fromFile(f), "text/plain"); - getParentActivity().startActivity(intent); + getParentActivity().startActivityForResult(intent, 500); } } else { - getParentActivity().startActivity(intent); + getParentActivity().startActivityForResult(intent, 500); } } catch (Exception e) { alertUserOpenError(message); @@ -3816,7 +4045,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not try { Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + messageObject.messageOwner.media.phone_number)); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - getParentActivity().startActivity(intent); + getParentActivity().startActivityForResult(intent, 500); } catch (Exception e) { FileLog.e("tmessages", e); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarDrawable.java index ec5c9fd8d..5538b2233 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarDrawable.java @@ -13,6 +13,7 @@ import android.graphics.ColorFilter; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.drawable.Drawable; +import android.os.Build; import android.text.Layout; import android.text.StaticLayout; import android.text.TextPaint; @@ -164,6 +165,11 @@ public class AvatarDrawable extends Drawable { drawBrodcast = isBroadcast; + if (firstName == null || firstName.length() == 0) { + firstName = lastName; + lastName = null; + } + String text = ""; if (firstName != null && firstName.length() > 0) { text += firstName.substring(0, 1); @@ -176,8 +182,26 @@ public class AvatarDrawable extends Drawable { } lastch = lastName.substring(a, a + 1); } - text += lastch; + if (Build.VERSION.SDK_INT >= 14) { + text += "\u200C" + lastch; + } else { + text += lastch; + } + } else if (firstName != null && firstName.length() > 0) { + for (int a = firstName.length() - 1; a >= 0; a--) { + if (firstName.charAt(a) == ' ') { + if (a != firstName.length() - 1 && firstName.charAt(a + 1) != ' ') { + if (Build.VERSION.SDK_INT >= 14) { + text += "\u200C" + firstName.substring(a + 1, a + 2); + } else { + text += firstName.substring(a + 1, a + 2); + } + break; + } + } + } } + if (text.length() > 0) { text = text.toUpperCase(); try { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarUpdater.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarUpdater.java index 2b0150e50..0073edba1 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarUpdater.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarUpdater.java @@ -11,12 +11,14 @@ package org.telegram.ui.Components; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; +import android.media.ExifInterface; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import org.telegram.android.AndroidUtilities; import org.telegram.android.ImageLoader; +import org.telegram.android.MediaController; import org.telegram.messenger.TLRPC; import org.telegram.messenger.FileLoader; import org.telegram.messenger.FileLog; @@ -24,10 +26,13 @@ import org.telegram.android.NotificationCenter; import org.telegram.messenger.UserConfig; import org.telegram.messenger.Utilities; import org.telegram.ui.LaunchActivity; +import org.telegram.ui.PhotoAlbumPickerActivity; import org.telegram.ui.PhotoCropActivity; import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.PhotoViewer; import java.io.File; +import java.util.ArrayList; public class AvatarUpdater implements NotificationCenter.NotificationCenterDelegate, PhotoCropActivity.PhotoEditActivityDelegate { public String currentPicturePath; @@ -68,13 +73,33 @@ public class AvatarUpdater implements NotificationCenter.NotificationCenterDeleg } public void openGallery() { - try { - Intent photoPickerIntent = new Intent(Intent.ACTION_GET_CONTENT); - photoPickerIntent.setType("image/*"); - parentFragment.startActivityForResult(photoPickerIntent, 14); - } catch (Exception e) { - FileLog.e("tmessages", e); - } + PhotoAlbumPickerActivity fragment = new PhotoAlbumPickerActivity(true); + fragment.setDelegate(new PhotoAlbumPickerActivity.PhotoAlbumPickerActivityDelegate() { + @Override + public void didSelectPhotos(ArrayList photos) { + if (!photos.isEmpty()) { + Bitmap bitmap = ImageLoader.loadBitmap(photos.get(0), null, 800, 800, true); + processBitmap(bitmap); + } + } + + @Override + public void didSelectWebPhotos(ArrayList photos) { + + } + + @Override + public void startPhotoSelectActivity() { + try { + Intent photoPickerIntent = new Intent(Intent.ACTION_GET_CONTENT); + photoPickerIntent.setType("image/*"); + parentFragment.startActivityForResult(photoPickerIntent, 14); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + }); + parentFragment.presentFragment(fragment); } private void startCrop(String path, Uri uri) { @@ -102,9 +127,42 @@ public class AvatarUpdater implements NotificationCenter.NotificationCenterDeleg public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK) { if (requestCode == 13) { + PhotoViewer.getInstance().setParentActivity(parentFragment.getParentActivity()); + int orientation = 0; + try { + ExifInterface ei = new ExifInterface(currentPicturePath); + int exif = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); + switch(exif) { + case ExifInterface.ORIENTATION_ROTATE_90: + orientation = 90; + break; + case ExifInterface.ORIENTATION_ROTATE_180: + orientation = 180; + break; + case ExifInterface.ORIENTATION_ROTATE_270: + orientation = 270; + break; + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + final ArrayList arrayList = new ArrayList<>(); + arrayList.add(new MediaController.PhotoEntry(0, 0, 0, currentPicturePath, orientation)); + PhotoViewer.getInstance().openPhotoForSelect(arrayList, 0, 1, new PhotoViewer.EmptyPhotoViewerProvider() { + @Override + public void sendButtonPressed(int index) { + String path = null; + MediaController.PhotoEntry photoEntry = (MediaController.PhotoEntry) arrayList.get(0); + if (photoEntry.imagePath != null) { + path = photoEntry.imagePath; + } else if (photoEntry.path != null) { + path = photoEntry.path; + } + Bitmap bitmap = ImageLoader.loadBitmap(path, null, 800, 800, true); + processBitmap(bitmap); + } + }); Utilities.addMediaToGallery(currentPicturePath); - startCrop(currentPicturePath, null); - currentPicturePath = null; } else if (requestCode == 14) { if (data == null || data.getData() == null) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/BackupImageView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/BackupImageView.java index 7f30f2658..ad0478dec 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/BackupImageView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/BackupImageView.java @@ -68,6 +68,10 @@ public class BackupImageView extends View { setImage(null, path, filter, thumb, null, null, null, 0); } + public void setOrientation(int angle, boolean center) { + imageReceiver.setOrientation(angle, center); + } + public void setImage(TLObject path, String httpUrl, String filter, Drawable thumb, Bitmap thumbBitmap, TLRPC.FileLocation thumbLocation, String thumbFilter, int size) { if (thumbBitmap != null) { thumb = new BitmapDrawable(null, thumbBitmap); 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 556827700..7c8a41843 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java @@ -18,6 +18,7 @@ import android.os.PowerManager; import android.text.Editable; import android.text.TextWatcher; import android.text.style.ImageSpan; +import android.util.TypedValue; import android.view.Gravity; import android.view.KeyEvent; import android.view.MotionEvent; @@ -29,8 +30,8 @@ import android.view.animation.AccelerateDecelerateInterpolator; import android.view.inputmethod.EditorInfo; import android.widget.EditText; import android.widget.FrameLayout; -import android.widget.ImageButton; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.PopupWindow; import android.widget.TextView; @@ -54,7 +55,7 @@ import org.telegram.messenger.ApplicationLoader; import java.lang.reflect.Field; -public class ChatActivityEnterView implements NotificationCenter.NotificationCenterDelegate, SizeNotifierRelativeLayout.SizeNotifierRelativeLayoutDelegate { +public class ChatActivityEnterView extends LinearLayout implements NotificationCenter.NotificationCenterDelegate, SizeNotifierRelativeLayout.SizeNotifierRelativeLayoutDelegate { public static interface ChatActivityEnterViewDelegate { public abstract void onMessageSend(); @@ -66,17 +67,18 @@ public class ChatActivityEnterView implements NotificationCenter.NotificationCen } private EditText messsageEditText; - private ImageButton sendButton; + private ImageView sendButton; private PopupWindow emojiPopup; private ImageView emojiButton; private EmojiView emojiView; private TextView recordTimeText; - private ImageButton audioSendButton; - private View recordPanel; - private View slideText; - private PowerManager.WakeLock mWakeLock; + private ImageView audioSendButton; + private FrameLayout recordPanel; + private LinearLayout slideText; private SizeNotifierRelativeLayout sizeNotifierRelativeLayout; private FrameLayout attachButton; + + private PowerManager.WakeLock mWakeLock; private AnimatorSetProxy runningAnimation; private AnimatorSetProxy runningAnimation2; private ObjectAnimatorProxy runningAnimationAudio; @@ -98,7 +100,13 @@ public class ChatActivityEnterView implements NotificationCenter.NotificationCen private boolean ignoreTextChange; private ChatActivityEnterViewDelegate delegate; - public ChatActivityEnterView() { + public ChatActivityEnterView(Activity context, SizeNotifierRelativeLayout parent, boolean isChat) { + super(context); + setOrientation(HORIZONTAL); + setBackgroundResource(R.drawable.compose_panel); + setFocusable(true); + setFocusableInTouchMode(true); + NotificationCenter.getInstance().addObserver(this, NotificationCenter.recordStarted); NotificationCenter.getInstance().addObserver(this, NotificationCenter.recordStartError); NotificationCenter.getInstance().addObserver(this, NotificationCenter.recordStopped); @@ -108,64 +116,31 @@ public class ChatActivityEnterView implements NotificationCenter.NotificationCen NotificationCenter.getInstance().addObserver(this, NotificationCenter.emojiDidLoaded); NotificationCenter.getInstance().addObserver(this, NotificationCenter.hideEmojiKeyboard); NotificationCenter.getInstance().addObserver(this, NotificationCenter.audioRouteChanged); + parentActivity = context; + sizeNotifierRelativeLayout = parent; + sizeNotifierRelativeLayout.setDelegate(this); SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); sendByEnter = preferences.getBoolean("send_by_enter", false); - } - public void onDestroy() { - NotificationCenter.getInstance().removeObserver(this, NotificationCenter.recordStarted); - NotificationCenter.getInstance().removeObserver(this, NotificationCenter.recordStartError); - NotificationCenter.getInstance().removeObserver(this, NotificationCenter.recordStopped); - NotificationCenter.getInstance().removeObserver(this, NotificationCenter.recordProgressChanged); - NotificationCenter.getInstance().removeObserver(this, NotificationCenter.closeChats); - NotificationCenter.getInstance().removeObserver(this, NotificationCenter.audioDidSent); - NotificationCenter.getInstance().removeObserver(this, NotificationCenter.emojiDidLoaded); - NotificationCenter.getInstance().removeObserver(this, NotificationCenter.hideEmojiKeyboard); - NotificationCenter.getInstance().removeObserver(this, NotificationCenter.audioRouteChanged); - if (mWakeLock != null) { - try { - mWakeLock.release(); - mWakeLock = null; - } catch (Exception e) { - FileLog.e("tmessages", e); - } - } - if (sizeNotifierRelativeLayout != null) { - sizeNotifierRelativeLayout.delegate = null; - } - } - - public void setContainerView(Activity activity, View containerView) { - parentActivity = activity; - - sizeNotifierRelativeLayout = (SizeNotifierRelativeLayout) containerView.findViewById(R.id.chat_layout); - sizeNotifierRelativeLayout.delegate = this; - - messsageEditText = (EditText) containerView.findViewById(R.id.chat_text_edit); - messsageEditText.setHint(LocaleController.getString("TypeMessage", R.string.TypeMessage)); - - attachButton = (FrameLayout) containerView.findViewById(R.id.chat_attach_button); - if (attachButton != null) { - ViewProxy.setPivotX(attachButton, AndroidUtilities.dp(48)); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) messsageEditText.getLayoutParams(); - layoutParams.rightMargin = AndroidUtilities.dp(50); - messsageEditText.setLayoutParams(layoutParams); - } - - sendButton = (ImageButton) containerView.findViewById(R.id.chat_send_button); - sendButton.setVisibility(View.INVISIBLE); - ViewProxy.setScaleX(sendButton, 0.1f); - ViewProxy.setScaleY(sendButton, 0.1f); - ViewProxy.setAlpha(sendButton, 0.0f); - sendButton.clearAnimation(); - emojiButton = (ImageView) containerView.findViewById(R.id.chat_smile_button); - audioSendButton = (ImageButton) containerView.findViewById(R.id.chat_audio_send_button); - recordPanel = containerView.findViewById(R.id.record_panel); - recordTimeText = (TextView) containerView.findViewById(R.id.recording_time_text); - slideText = containerView.findViewById(R.id.slideText); - TextView textView = (TextView) containerView.findViewById(R.id.slideToCancelTextView); - textView.setText(LocaleController.getString("SlideToCancel", R.string.SlideToCancel)); + FrameLayoutFixed frameLayout = new FrameLayoutFixed(context); + addView(frameLayout); + LayoutParams layoutParams = (LayoutParams) frameLayout.getLayoutParams(); + layoutParams.width = 0; + layoutParams.height = LayoutParams.WRAP_CONTENT; + layoutParams.weight = 1; + frameLayout.setLayoutParams(layoutParams); + emojiButton = new ImageView(context); + emojiButton.setImageResource(R.drawable.ic_msg_panel_smiles); + emojiButton.setScaleType(ImageView.ScaleType.CENTER_INSIDE); + emojiButton.setPadding(AndroidUtilities.dp(4), AndroidUtilities.dp(1), 0, 0); + frameLayout.addView(emojiButton); + FrameLayout.LayoutParams layoutParams1 = (FrameLayout.LayoutParams) emojiButton.getLayoutParams(); + layoutParams1.width = AndroidUtilities.dp(48); + layoutParams1.height = AndroidUtilities.dp(48); + layoutParams1.gravity = Gravity.BOTTOM; + layoutParams1.topMargin = AndroidUtilities.dp(2); + emojiButton.setLayoutParams(layoutParams1); emojiButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { @@ -173,6 +148,41 @@ public class ChatActivityEnterView implements NotificationCenter.NotificationCen } }); + /* + + */ + + messsageEditText = new EditText(context); + messsageEditText.setHint(LocaleController.getString("TypeMessage", R.string.TypeMessage)); + messsageEditText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI); + messsageEditText.setInputType(messsageEditText.getInputType() | EditorInfo.TYPE_TEXT_FLAG_CAP_SENTENCES | EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE); + messsageEditText.setSingleLine(false); + messsageEditText.setMaxLines(4); + messsageEditText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); + messsageEditText.setGravity(Gravity.BOTTOM); + messsageEditText.setPadding(0, AndroidUtilities.dp(11), 0, AndroidUtilities.dp(12)); + messsageEditText.setBackgroundDrawable(null); + AndroidUtilities.clearCursorDrawable(messsageEditText); + messsageEditText.setTextColor(0xff000000); + messsageEditText.setHintTextColor(0xffb2b2b2); + frameLayout.addView(messsageEditText); + layoutParams1 = (FrameLayout.LayoutParams) messsageEditText.getLayoutParams(); + layoutParams1.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams1.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams1.gravity = Gravity.BOTTOM; + layoutParams1.leftMargin = AndroidUtilities.dp(52); + layoutParams1.rightMargin = AndroidUtilities.dp(isChat ? 50 : 2); + messsageEditText.setLayoutParams(layoutParams1); messsageEditText.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View view, int i, KeyEvent keyEvent) { @@ -188,7 +198,6 @@ public class ChatActivityEnterView implements NotificationCenter.NotificationCen return false; } }); - messsageEditText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { @@ -197,7 +206,6 @@ public class ChatActivityEnterView implements NotificationCenter.NotificationCen } } }); - messsageEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { @@ -213,14 +221,164 @@ public class ChatActivityEnterView implements NotificationCenter.NotificationCen return false; } }); - - sendButton.setOnClickListener(new View.OnClickListener() { + messsageEditText.addTextChangedListener(new TextWatcher() { @Override - public void onClick(View view) { - sendMessage(); + public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { + String message = getTrimmedString(charSequence.toString()); + checkSendButton(true); + + if (delegate != null) { + delegate.onTextChanged(charSequence); + } + + if (message.length() != 0 && lastTypingTimeSend < System.currentTimeMillis() - 5000 && !ignoreTextChange) { + int currentTime = ConnectionsManager.getInstance().getCurrentTime(); + TLRPC.User currentUser = null; + if ((int) dialog_id > 0) { + currentUser = MessagesController.getInstance().getUser((int) dialog_id); + } + if (currentUser != null && (currentUser.id == UserConfig.getClientUserId() || currentUser.status != null && currentUser.status.expires < currentTime)) { + return; + } + lastTypingTimeSend = System.currentTimeMillis(); + if (delegate != null) { + delegate.needSendTyping(); + } + } + } + + @Override + public void afterTextChanged(Editable editable) { + if (sendByEnter && editable.length() > 0 && editable.charAt(editable.length() - 1) == '\n') { + sendMessage(); + } + int i = 0; + ImageSpan[] arrayOfImageSpan = editable.getSpans(0, editable.length(), ImageSpan.class); + int j = arrayOfImageSpan.length; + while (true) { + if (i >= j) { + Emoji.replaceEmoji(editable, messsageEditText.getPaint().getFontMetricsInt(), AndroidUtilities.dp(20)); + return; + } + editable.removeSpan(arrayOfImageSpan[i]); + i++; + } } }); + if (isChat) { + attachButton = new FrameLayout(context); + attachButton.setEnabled(false); + ViewProxy.setPivotX(attachButton, AndroidUtilities.dp(48)); + frameLayout.addView(attachButton); + layoutParams1 = (FrameLayout.LayoutParams) attachButton.getLayoutParams(); + layoutParams1.width = AndroidUtilities.dp(48); + layoutParams1.height = AndroidUtilities.dp(48); + layoutParams1.gravity = Gravity.BOTTOM | Gravity.RIGHT; + layoutParams1.topMargin = AndroidUtilities.dp(2); + attachButton.setLayoutParams(layoutParams1); + } + + recordPanel = new FrameLayoutFixed(context); + recordPanel.setVisibility(GONE); + recordPanel.setBackgroundColor(0xffffffff); + frameLayout.addView(recordPanel); + layoutParams1 = (FrameLayout.LayoutParams) recordPanel.getLayoutParams(); + layoutParams1.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams1.height = AndroidUtilities.dp(48); + layoutParams1.gravity = Gravity.BOTTOM; + layoutParams1.topMargin = AndroidUtilities.dp(2); + recordPanel.setLayoutParams(layoutParams1); + + slideText = new LinearLayout(context); + slideText.setOrientation(HORIZONTAL); + recordPanel.addView(slideText); + layoutParams1 = (FrameLayout.LayoutParams) slideText.getLayoutParams(); + layoutParams1.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams1.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams1.gravity = Gravity.CENTER; + layoutParams1.leftMargin = AndroidUtilities.dp(30); + slideText.setLayoutParams(layoutParams1); + + ImageView imageView = new ImageView(context); + imageView.setImageResource(R.drawable.slidearrow); + slideText.addView(imageView); + layoutParams = (LayoutParams) imageView.getLayoutParams(); + layoutParams.width = LayoutParams.WRAP_CONTENT; + layoutParams.height = LayoutParams.WRAP_CONTENT; + layoutParams.gravity = Gravity.CENTER_VERTICAL; + layoutParams.topMargin = AndroidUtilities.dp(1); + imageView.setLayoutParams(layoutParams); + + TextView textView = new TextView(context); + textView.setText(LocaleController.getString("SlideToCancel", R.string.SlideToCancel)); + textView.setTextColor(0xff999999); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 12); + slideText.addView(textView); + layoutParams = (LayoutParams) textView.getLayoutParams(); + layoutParams.width = LayoutParams.WRAP_CONTENT; + layoutParams.height = LayoutParams.WRAP_CONTENT; + layoutParams.gravity = Gravity.CENTER_VERTICAL; + layoutParams.leftMargin = AndroidUtilities.dp(6); + textView.setLayoutParams(layoutParams); + + LinearLayout linearLayout = new LinearLayout(context); + linearLayout.setOrientation(HORIZONTAL); + linearLayout.setPadding(AndroidUtilities.dp(13), 0, 0, 0); + linearLayout.setBackgroundColor(0xffffffff); + recordPanel.addView(linearLayout); + layoutParams1 = (FrameLayout.LayoutParams) linearLayout.getLayoutParams(); + layoutParams1.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams1.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams1.gravity = Gravity.CENTER_VERTICAL; + linearLayout.setLayoutParams(layoutParams1); + + imageView = new ImageView(context); + imageView.setImageResource(R.drawable.rec); + linearLayout.addView(imageView); + layoutParams = (LayoutParams) imageView.getLayoutParams(); + layoutParams.width = LayoutParams.WRAP_CONTENT; + layoutParams.height = LayoutParams.WRAP_CONTENT; + layoutParams.gravity = Gravity.CENTER_VERTICAL; + layoutParams.topMargin = AndroidUtilities.dp(1); + imageView.setLayoutParams(layoutParams); + + recordTimeText = new TextView(context); + recordTimeText.setText("00:00"); + recordTimeText.setTextColor(0xff4d4c4b); + recordTimeText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); + linearLayout.addView(recordTimeText); + layoutParams = (LayoutParams) recordTimeText.getLayoutParams(); + layoutParams.width = LayoutParams.WRAP_CONTENT; + layoutParams.height = LayoutParams.WRAP_CONTENT; + layoutParams.gravity = Gravity.CENTER_VERTICAL; + layoutParams.leftMargin = AndroidUtilities.dp(6); + recordTimeText.setLayoutParams(layoutParams); + + FrameLayout frameLayout1 = new FrameLayout(context); + addView(frameLayout1); + layoutParams = (LayoutParams) frameLayout1.getLayoutParams(); + layoutParams.width = AndroidUtilities.dp(48); + layoutParams.height = AndroidUtilities.dp(48); + layoutParams.gravity = Gravity.BOTTOM; + layoutParams.topMargin = AndroidUtilities.dp(2); + frameLayout1.setLayoutParams(layoutParams); + + audioSendButton = new ImageView(context); + audioSendButton.setScaleType(ImageView.ScaleType.CENTER_INSIDE); + audioSendButton.setImageResource(R.drawable.mic_button_states); + audioSendButton.setBackgroundColor(0xffffffff); + audioSendButton.setPadding(0, 0, AndroidUtilities.dp(4), 0); + frameLayout1.addView(audioSendButton); + layoutParams1 = (FrameLayout.LayoutParams) audioSendButton.getLayoutParams(); + layoutParams1.width = AndroidUtilities.dp(48); + layoutParams1.height = AndroidUtilities.dp(48); + audioSendButton.setLayoutParams(layoutParams1); audioSendButton.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { @@ -279,59 +437,56 @@ public class ChatActivityEnterView implements NotificationCenter.NotificationCen } }); - messsageEditText.addTextChangedListener(new TextWatcher() { + sendButton = new ImageView(context); + sendButton.setVisibility(View.INVISIBLE); + sendButton.setScaleType(ImageView.ScaleType.CENTER_INSIDE); + sendButton.setImageResource(R.drawable.ic_send); + ViewProxy.setScaleX(sendButton, 0.1f); + ViewProxy.setScaleY(sendButton, 0.1f); + ViewProxy.setAlpha(sendButton, 0.0f); + sendButton.clearAnimation(); + frameLayout1.addView(sendButton); + layoutParams1 = (FrameLayout.LayoutParams) sendButton.getLayoutParams(); + layoutParams1.width = AndroidUtilities.dp(48); + layoutParams1.height = AndroidUtilities.dp(48); + sendButton.setLayoutParams(layoutParams1); + sendButton.setOnClickListener(new View.OnClickListener() { @Override - public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { - - } - - @Override - public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { - String message = getTrimmedString(charSequence.toString()); - checkSendButton(true); - - if (delegate != null) { - delegate.onTextChanged(charSequence); - } - - if (message.length() != 0 && lastTypingTimeSend < System.currentTimeMillis() - 5000 && !ignoreTextChange) { - int currentTime = ConnectionsManager.getInstance().getCurrentTime(); - TLRPC.User currentUser = null; - if ((int) dialog_id > 0) { - currentUser = MessagesController.getInstance().getUser((int) dialog_id); - } - if (currentUser != null && (currentUser.id == UserConfig.getClientUserId() || currentUser.status != null && currentUser.status.expires < currentTime)) { - return; - } - lastTypingTimeSend = System.currentTimeMillis(); - if (delegate != null) { - delegate.needSendTyping(); - } - } - } - - @Override - public void afterTextChanged(Editable editable) { - if (sendByEnter && editable.length() > 0 && editable.charAt(editable.length() - 1) == '\n') { - sendMessage(); - } - int i = 0; - ImageSpan[] arrayOfImageSpan = editable.getSpans(0, editable.length(), ImageSpan.class); - int j = arrayOfImageSpan.length; - while (true) { - if (i >= j) { - Emoji.replaceEmoji(editable, messsageEditText.getPaint().getFontMetricsInt(), AndroidUtilities.dp(20)); - return; - } - editable.removeSpan(arrayOfImageSpan[i]); - i++; - } + public void onClick(View view) { + sendMessage(); } }); checkSendButton(false); } + public void onDestroy() { + NotificationCenter.getInstance().removeObserver(this, NotificationCenter.recordStarted); + NotificationCenter.getInstance().removeObserver(this, NotificationCenter.recordStartError); + NotificationCenter.getInstance().removeObserver(this, NotificationCenter.recordStopped); + NotificationCenter.getInstance().removeObserver(this, NotificationCenter.recordProgressChanged); + NotificationCenter.getInstance().removeObserver(this, NotificationCenter.closeChats); + NotificationCenter.getInstance().removeObserver(this, NotificationCenter.audioDidSent); + NotificationCenter.getInstance().removeObserver(this, NotificationCenter.emojiDidLoaded); + NotificationCenter.getInstance().removeObserver(this, NotificationCenter.hideEmojiKeyboard); + NotificationCenter.getInstance().removeObserver(this, NotificationCenter.audioRouteChanged); + if (mWakeLock != null) { + try { + mWakeLock.release(); + mWakeLock = null; + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + if (sizeNotifierRelativeLayout != null) { + sizeNotifierRelativeLayout.setDelegate(null); + } + } + + public void setDialogId(long id) { + dialog_id = id; + } + private void sendMessage() { if (processSendingText(messsageEditText.getText().toString())) { messsageEditText.setText(""); @@ -725,10 +880,6 @@ public class ChatActivityEnterView implements NotificationCenter.NotificationCen this.delegate = delegate; } - public void setDialogId(long id) { - dialog_id = id; - } - public void setFieldText(String text) { if (messsageEditText == null) { return; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ClippingImageView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ClippingImageView.java index a288647f5..d5441b706 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ClippingImageView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ClippingImageView.java @@ -14,7 +14,6 @@ import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; -import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Shader; import android.view.View; @@ -27,9 +26,11 @@ public class ClippingImageView extends View { private int clipLeft; private int clipRight; private int clipTop; - private Rect drawRect; + private int orientation; + private RectF drawRect; private Paint paint; private Bitmap bmp; + private Matrix matrix; private onDrawListener drawListener; private boolean needRadius; @@ -48,7 +49,9 @@ public class ClippingImageView extends View { super(context); paint = new Paint(); paint.setFilterBitmap(true); - drawRect = new Rect(); + matrix = new Matrix(); + drawRect = new RectF(); + bitmapRect = new RectF(); } public int getClipBottom() { @@ -85,6 +88,7 @@ public class ClippingImageView extends View { drawListener.onDraw(); } canvas.save(); + if (needRadius) { roundRect.set(0, 0, getWidth(), getHeight()); shaderMatrix.reset(); @@ -92,10 +96,24 @@ public class ClippingImageView extends View { bitmapShader.setLocalMatrix(shaderMatrix); canvas.drawRoundRect(roundRect, radius, radius, roundPaint); } else { + if (orientation == 90 || orientation == 270) { + drawRect.set(-getHeight() / 2, -getWidth() / 2, getHeight() / 2, getWidth() / 2); + matrix.setRectToRect(bitmapRect, drawRect, Matrix.ScaleToFit.FILL); + matrix.postRotate(orientation, 0, 0); + matrix.postTranslate(getWidth() / 2, getHeight() / 2); + } else if (orientation == 180) { + drawRect.set(-getWidth() / 2, -getHeight() / 2, getWidth() / 2, getHeight() / 2); + matrix.setRectToRect(bitmapRect, drawRect, Matrix.ScaleToFit.FILL); + matrix.postRotate(orientation, 0, 0); + matrix.postTranslate(getWidth() / 2, getHeight() / 2); + } else { + drawRect.set(0, 0, getWidth(), getHeight()); + matrix.setRectToRect(bitmapRect, drawRect, Matrix.ScaleToFit.FILL); + } + canvas.clipRect(clipLeft / scaleY, clipTop / scaleY, getWidth() - clipRight / scaleY, getHeight() - clipBottom / scaleY); - drawRect.set(0, 0, getWidth(), getHeight()); try { - canvas.drawBitmap(bmp, null, drawRect, paint); + canvas.drawBitmap(bmp, matrix, paint); } catch (Exception e) { FileLog.e("tmessages", e); } @@ -136,16 +154,21 @@ public class ClippingImageView extends View { invalidate(); } + public void setOrientation(int angle) { + orientation = angle; + } + public void setImageBitmap(Bitmap bitmap) { bmp = bitmap; - if (bitmap != null && needRadius) { - roundRect = new RectF(); - shaderMatrix = new Matrix(); - bitmapRect = new RectF(); + if (bitmap != null) { bitmapRect.set(0, 0, bitmap.getWidth(), bitmap.getHeight()); - bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); - roundPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - roundPaint.setShader(bitmapShader); + if (needRadius) { + roundRect = new RectF(); + shaderMatrix = new Matrix(); + bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); + roundPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + roundPaint.setShader(bitmapShader); + } } invalidate(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ForegroundDetector.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ForegroundDetector.java new file mode 100644 index 000000000..b158dcac3 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ForegroundDetector.java @@ -0,0 +1,121 @@ +/* + * This is the source code of Telegram for Android v. 2.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-2015. + */ + +package org.telegram.ui.Components; + +import android.app.Activity; +import android.app.Application; +import android.os.Build; +import android.os.Bundle; + +import org.telegram.messenger.FileLog; + +import java.util.concurrent.CopyOnWriteArrayList; + +public class ForegroundDetector implements Application.ActivityLifecycleCallbacks { + + public interface Listener { + public void onBecameForeground(); + public void onBecameBackground(); + } + + private int refs; + private boolean wasInBackground = true; + private long enterBackgroundTime = 0; + private CopyOnWriteArrayList listeners = new CopyOnWriteArrayList<>(); + private static ForegroundDetector Instance = null; + + public static ForegroundDetector getInstance() { + return Instance; + } + + public ForegroundDetector(Application application) { + Instance = this; + application.registerActivityLifecycleCallbacks(this); + } + + public boolean isForeground() { + return refs > 0; + } + + public boolean isBackground() { + return refs == 0; + } + + public void addListener(Listener listener) { + listeners.add(listener); + } + + public void removeListener(Listener listener) { + listeners.remove(listener); + } + + @Override + public void onActivityStarted(Activity activity) { + if (++refs == 1) { + if (System.currentTimeMillis() - enterBackgroundTime < 200) { + wasInBackground = false; + } + FileLog.e("tmessages", "switch to foreground"); + for (Listener listener : listeners) { + try { + listener.onBecameForeground(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + } + } + + public boolean isWasInBackground(boolean reset) { + if (reset && Build.VERSION.SDK_INT >= 21 && (System.currentTimeMillis() - enterBackgroundTime < 200)) { + wasInBackground = false; + } + return wasInBackground; + } + + public void resetBackgroundVar() { + wasInBackground = false; + } + + @Override + public void onActivityStopped(Activity activity) { + if (--refs == 0) { + enterBackgroundTime = System.currentTimeMillis(); + wasInBackground = true; + FileLog.e("tmessages", "switch to background"); + for (Listener listener : listeners) { + try { + listener.onBecameBackground(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + } + } + + @Override + public void onActivityCreated(Activity activity, Bundle savedInstanceState) { + } + + @Override + public void onActivityResumed(Activity activity) { + } + + @Override + public void onActivityPaused(Activity activity) { + } + + @Override + public void onActivitySaveInstanceState(Activity activity, Bundle outState) { + } + + @Override + public void onActivityDestroyed(Activity activity) { + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/LetterSectionsListView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/LetterSectionsListView.java new file mode 100644 index 000000000..aedc5bcd6 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/LetterSectionsListView.java @@ -0,0 +1,211 @@ +/* + * This is the source code of Telegram for Android v. 1.7.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-2014. + */ + +package org.telegram.ui.Components; + +import android.content.Context; +import android.graphics.Canvas; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AbsListView; +import android.widget.ListAdapter; +import android.widget.ListView; + +import org.telegram.android.AndroidUtilities; +import org.telegram.android.LocaleController; +import org.telegram.messenger.FileLog; +import org.telegram.ui.Adapters.BaseSectionsAdapter; + +import java.util.ArrayList; + +public class LetterSectionsListView extends ListView implements AbsListView.OnScrollListener { + + private ArrayList headers = new ArrayList<>(); + private ArrayList headersCache = new ArrayList<>(); + private OnScrollListener mOnScrollListener; + private BaseSectionsAdapter mAdapter; + private int currentFirst = -1; + private int currentVisible = -1; + private int startSection; + private int sectionsCount; + + public LetterSectionsListView(Context context) { + super(context); + super.setOnScrollListener(this); + } + + public LetterSectionsListView(Context context, AttributeSet attrs) { + super(context, attrs); + super.setOnScrollListener(this); + } + + public LetterSectionsListView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + super.setOnScrollListener(this); + } + + @Override + public void setAdapter(ListAdapter adapter) { + if (mAdapter == adapter) { + return; + } + headers.clear(); + headersCache.clear(); + if (adapter instanceof BaseSectionsAdapter) { + mAdapter = (BaseSectionsAdapter) adapter; + } else { + mAdapter = null; + } + super.setAdapter(adapter); + } + + @Override + public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { + if (mOnScrollListener != null) { + mOnScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount); + } + if (mAdapter == null) { + return; + } + + headersCache.addAll(headers); + headers.clear(); + + if (mAdapter.getCount() == 0) { + return; + } + + if (currentFirst != firstVisibleItem || currentVisible != visibleItemCount) { + currentFirst = firstVisibleItem; + currentVisible = visibleItemCount; + + sectionsCount = 1; + startSection = mAdapter.getSectionForPosition(firstVisibleItem); + int itemNum = firstVisibleItem + mAdapter.getCountForSection(startSection) - mAdapter.getPositionInSectionForPosition(firstVisibleItem); + while (true) { + if (itemNum >= firstVisibleItem + visibleItemCount) { + break; + } + itemNum += mAdapter.getCountForSection(startSection + sectionsCount); + sectionsCount++; + } + } + + int itemNum = firstVisibleItem; + for (int a = startSection; a < startSection + sectionsCount; a++) { + View header = null; + if (!headersCache.isEmpty()) { + header = headersCache.get(0); + headersCache.remove(0); + } + header = getSectionHeaderView(a, header); + headers.add(header); + int count = mAdapter.getCountForSection(a); + if (a == startSection) { + int pos = mAdapter.getPositionInSectionForPosition(itemNum); + if (pos == count - 1) { + header.setTag(-header.getHeight()); + } else if (pos == count - 2) { + View child = getChildAt(itemNum - firstVisibleItem); + int headerTop = 0; + if (child != null) { + headerTop = child.getTop(); + } else { + headerTop = -AndroidUtilities.dp(100); + } + if (headerTop < 0) { + header.setTag(headerTop); + } else { + header.setTag(0); + } + } else { + header.setTag(0); + } + itemNum += count - mAdapter.getPositionInSectionForPosition(firstVisibleItem); + } else { + View child = getChildAt(itemNum - firstVisibleItem); + if (child != null) { + header.setTag(child.getTop()); + } else { + header.setTag(-AndroidUtilities.dp(100)); + } + itemNum += count; + } + } + } + + @Override + public void onScrollStateChanged(AbsListView view, int scrollState) { + if (mOnScrollListener != null) { + mOnScrollListener.onScrollStateChanged(view, scrollState); + } + } + + private View getSectionHeaderView(int section, View oldView) { + boolean shouldLayout = oldView == null; + View view = mAdapter.getSectionHeaderView(section, oldView, this); + if (shouldLayout) { + ensurePinnedHeaderLayout(view, false); + } + return view; + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + if (mAdapter == null || headers.isEmpty()) { + return; + } + for (View header : headers) { + ensurePinnedHeaderLayout(header, true); + } + } + + private void ensurePinnedHeaderLayout(View header, boolean forceLayout) { + if (header.isLayoutRequested() || forceLayout) { + ViewGroup.LayoutParams layoutParams = header.getLayoutParams(); + int heightSpec = MeasureSpec.makeMeasureSpec(layoutParams.height, MeasureSpec.EXACTLY); + int widthSpec = MeasureSpec.makeMeasureSpec(layoutParams.width, MeasureSpec.EXACTLY); + try { + header.measure(widthSpec, heightSpec); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + header.layout(0, 0, header.getMeasuredWidth(), header.getMeasuredHeight()); + } + } + + @Override + protected void dispatchDraw(Canvas canvas) { + super.dispatchDraw(canvas); + if (mAdapter == null || headers.isEmpty()) { + return; + } + for (View header : headers) { + int saveCount = canvas.save(); + int top = (Integer)header.getTag(); + canvas.translate(LocaleController.isRTL ? getWidth() - header.getWidth() : 0, top); + canvas.clipRect(0, 0, getWidth(), header.getMeasuredHeight()); + if (top < 0) { + canvas.saveLayerAlpha(0, top, header.getWidth(), top + canvas.getHeight(), (int)(255 * (1.0f + (float)top / (float)header.getMeasuredHeight())), Canvas.HAS_ALPHA_LAYER_SAVE_FLAG); + } + header.draw(canvas); + canvas.restoreToCount(saveCount); + } + } + + @Override + public void setOnScrollListener(OnScrollListener l) { + mOnScrollListener = l; + } + + public void setOnItemClickListener(LetterSectionsListView.OnItemClickListener listener) { + super.setOnItemClickListener(listener); + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/NumberPicker.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/NumberPicker.java index a0c15f5f2..37efc31a6 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/NumberPicker.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/NumberPicker.java @@ -73,7 +73,7 @@ public class NumberPicker extends LinearLayout { private OnScrollListener mOnScrollListener; private Formatter mFormatter; private long mLongPressUpdateInterval = DEFAULT_LONG_PRESS_UPDATE_INTERVAL; - private final SparseArray mSelectorIndexToStringCache = new SparseArray(); + private final SparseArray mSelectorIndexToStringCache = new SparseArray<>(); private final int[] mSelectorIndices = new int[SELECTOR_WHEEL_ITEM_COUNT]; private Paint mSelectorWheelPaint; private Drawable mVirtualButtonPressedDrawable; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/PasscodeView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/PasscodeView.java new file mode 100644 index 000000000..dfd03904d --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/PasscodeView.java @@ -0,0 +1,1049 @@ +/* + * This is the source code of Telegram for Android v. 2.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-2015. + */ + +package org.telegram.ui.Components; + +import android.app.Activity; +import android.content.Context; +import android.content.SharedPreferences; +import android.content.res.Configuration; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.Typeface; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.os.Vibrator; +import android.text.Editable; +import android.text.InputFilter; +import android.text.InputType; +import android.text.TextWatcher; +import android.text.method.PasswordTransformationMethod; +import android.util.TypedValue; +import android.view.ActionMode; +import android.view.ContextMenu; +import android.view.Gravity; +import android.view.HapticFeedbackConstants; +import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.View; +import android.view.inputmethod.EditorInfo; +import android.widget.EditText; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import org.telegram.android.AndroidUtilities; +import org.telegram.android.LocaleController; +import org.telegram.android.NotificationCenter; +import org.telegram.messenger.ApplicationLoader; +import org.telegram.messenger.FileLog; +import org.telegram.messenger.R; +import org.telegram.messenger.UserConfig; +import org.telegram.messenger.Utilities; +import org.telegram.ui.AnimationCompat.AnimatorListenerAdapterProxy; +import org.telegram.ui.AnimationCompat.AnimatorSetProxy; +import org.telegram.ui.AnimationCompat.ObjectAnimatorProxy; +import org.telegram.ui.AnimationCompat.ViewProxy; + +import java.util.ArrayList; +import java.util.Locale; + +public class PasscodeView extends FrameLayout { + + public static interface PasscodeViewDelegate { + public abstract void didAcceptedPassword(); + } + + private class AnimatingTextView extends FrameLayout { + + private ArrayList characterTextViews; + private ArrayList dotTextViews; + private StringBuilder stringBuilder; + private String DOT = "\u2022"; + private AnimatorSetProxy currentAnimation; + private Runnable dotRunnable; + + public AnimatingTextView(Context context) { + super(context); + characterTextViews = new ArrayList<>(4); + dotTextViews = new ArrayList<>(4); + stringBuilder = new StringBuilder(4); + + for (int a = 0; a < 4; a++) { + TextView textView = new TextView(context); + textView.setTextColor(0xffffffff); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 36); + textView.setGravity(Gravity.CENTER); + ViewProxy.setAlpha(textView, 0); + ViewProxy.setPivotX(textView, AndroidUtilities.dp(25)); + ViewProxy.setPivotY(textView, AndroidUtilities.dp(25)); + addView(textView); + LayoutParams layoutParams = (LayoutParams) textView.getLayoutParams(); + layoutParams.width = AndroidUtilities.dp(50); + layoutParams.height = AndroidUtilities.dp(50); + layoutParams.gravity = Gravity.TOP | Gravity.LEFT; + textView.setLayoutParams(layoutParams); + characterTextViews.add(textView); + + textView = new TextView(context); + textView.setTextColor(0xffffffff); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 36); + textView.setGravity(Gravity.CENTER); + ViewProxy.setAlpha(textView, 0); + textView.setText(DOT); + ViewProxy.setPivotX(textView, AndroidUtilities.dp(25)); + ViewProxy.setPivotY(textView, AndroidUtilities.dp(25)); + addView(textView); + layoutParams = (LayoutParams) textView.getLayoutParams(); + layoutParams.width = AndroidUtilities.dp(50); + layoutParams.height = AndroidUtilities.dp(50); + layoutParams.gravity = Gravity.TOP | Gravity.LEFT; + textView.setLayoutParams(layoutParams); + dotTextViews.add(textView); + } + } + + private int getXForTextView(int pos) { + return (getMeasuredWidth() - stringBuilder.length() * AndroidUtilities.dp(30)) / 2 + pos * AndroidUtilities.dp(30) - AndroidUtilities.dp(10); + } + + public void appendCharacter(String c) { + if (stringBuilder.length() == 4) { + return; + } + try { + performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + + + ArrayList animators = new ArrayList<>(); + final int newPos = stringBuilder.length(); + stringBuilder.append(c); + + TextView textView = characterTextViews.get(newPos); + textView.setText(c); + ViewProxy.setTranslationX(textView, getXForTextView(newPos)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "scaleX", 0, 1)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "scaleY", 0, 1)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "alpha", 0, 1)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "translationY", AndroidUtilities.dp(20), 0)); + textView = dotTextViews.get(newPos); + ViewProxy.setTranslationX(textView, getXForTextView(newPos)); + ViewProxy.setAlpha(textView, 0); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "scaleX", 0, 1)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "scaleY", 0, 1)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "translationY", AndroidUtilities.dp(20), 0)); + + for (int a = newPos + 1; a < 4; a++) { + textView = characterTextViews.get(a); + if (ViewProxy.getAlpha(textView) != 0) { + animators.add(ObjectAnimatorProxy.ofFloat(textView, "scaleX", 0)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "scaleY", 0)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "alpha", 0)); + } + + textView = dotTextViews.get(a); + if (ViewProxy.getAlpha(textView) != 0) { + animators.add(ObjectAnimatorProxy.ofFloat(textView, "scaleX", 0)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "scaleY", 0)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "alpha", 0)); + } + } + + if (dotRunnable != null) { + AndroidUtilities.cancelRunOnUIThread(dotRunnable); + } + dotRunnable = new Runnable() { + @Override + public void run() { + if (dotRunnable != this) { + return; + } + ArrayList animators = new ArrayList<>(); + + TextView textView = characterTextViews.get(newPos); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "scaleX", 0)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "scaleY", 0)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "alpha", 0)); + textView = dotTextViews.get(newPos); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "scaleX", 1)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "scaleY", 1)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "alpha", 1)); + + currentAnimation = new AnimatorSetProxy(); + currentAnimation.setDuration(150); + currentAnimation.playTogether(animators); + currentAnimation.addListener(new AnimatorListenerAdapterProxy() { + @Override + public void onAnimationEnd(Object animation) { + if (animation.equals(currentAnimation)) { + currentAnimation = null; + } + } + }); + currentAnimation.start(); + } + }; + AndroidUtilities.runOnUIThread(dotRunnable, 1500); + + for (int a = 0; a < newPos; a++) { + textView = characterTextViews.get(a); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "translationX", getXForTextView(a))); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "scaleX", 0)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "scaleY", 0)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "alpha", 0)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "translationY", 0)); + textView = dotTextViews.get(a); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "translationX", getXForTextView(a))); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "scaleX", 1)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "scaleY", 1)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "alpha", 1)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "translationY", 0)); + } + + if (currentAnimation != null) { + currentAnimation.cancel(); + } + currentAnimation = new AnimatorSetProxy(); + currentAnimation.setDuration(150); + currentAnimation.playTogether(animators); + currentAnimation.addListener(new AnimatorListenerAdapterProxy() { + @Override + public void onAnimationEnd(Object animation) { + if (animation.equals(currentAnimation)) { + currentAnimation = null; + } + } + }); + currentAnimation.start(); + } + + public String getString() { + return stringBuilder.toString(); + } + + public int lenght() { + return stringBuilder.length(); + } + + public void eraseLastCharacter() { + if (stringBuilder.length() == 0) { + return; + } + try { + performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + + ArrayList animators = new ArrayList<>(); + int deletingPos = stringBuilder.length() - 1; + if (deletingPos != 0) { + stringBuilder.deleteCharAt(deletingPos); + } + + for (int a = deletingPos; a < 4; a++) { + TextView textView = characterTextViews.get(a); + if (ViewProxy.getAlpha(textView) != 0) { + animators.add(ObjectAnimatorProxy.ofFloat(textView, "scaleX", 0)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "scaleY", 0)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "alpha", 0)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "translationY", 0)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "translationX", getXForTextView(a))); + } + + textView = dotTextViews.get(a); + if (ViewProxy.getAlpha(textView) != 0) { + animators.add(ObjectAnimatorProxy.ofFloat(textView, "scaleX", 0)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "scaleY", 0)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "alpha", 0)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "translationY", 0)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "translationX", getXForTextView(a))); + } + } + + if (deletingPos == 0) { + stringBuilder.deleteCharAt(deletingPos); + } + + for (int a = 0; a < deletingPos; a++) { + TextView textView = characterTextViews.get(a); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "translationX", getXForTextView(a))); + textView = dotTextViews.get(a); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "translationX", getXForTextView(a))); + } + + if (dotRunnable != null) { + AndroidUtilities.cancelRunOnUIThread(dotRunnable); + dotRunnable = null; + } + + if (currentAnimation != null) { + currentAnimation.cancel(); + } + currentAnimation = new AnimatorSetProxy(); + currentAnimation.setDuration(150); + currentAnimation.playTogether(animators); + currentAnimation.addListener(new AnimatorListenerAdapterProxy() { + @Override + public void onAnimationEnd(Object animation) { + if (animation.equals(currentAnimation)) { + currentAnimation = null; + } + } + }); + currentAnimation.start(); + } + + private void eraseAllCharacters(boolean animated) { + if (stringBuilder.length() == 0) { + return; + } + if (dotRunnable != null) { + AndroidUtilities.cancelRunOnUIThread(dotRunnable); + dotRunnable = null; + } + if (currentAnimation != null) { + currentAnimation.cancel(); + currentAnimation = null; + } + stringBuilder.delete(0, stringBuilder.length()); + if (animated) { + ArrayList animators = new ArrayList<>(); + + for (int a = 0; a < 4; a++) { + TextView textView = characterTextViews.get(a); + if (ViewProxy.getAlpha(textView) != 0) { + animators.add(ObjectAnimatorProxy.ofFloat(textView, "scaleX", 0)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "scaleY", 0)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "alpha", 0)); + } + + textView = dotTextViews.get(a); + if (ViewProxy.getAlpha(textView) != 0) { + animators.add(ObjectAnimatorProxy.ofFloat(textView, "scaleX", 0)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "scaleY", 0)); + animators.add(ObjectAnimatorProxy.ofFloat(textView, "alpha", 0)); + } + } + + currentAnimation = new AnimatorSetProxy(); + currentAnimation.setDuration(150); + currentAnimation.playTogether(animators); + currentAnimation.addListener(new AnimatorListenerAdapterProxy() { + @Override + public void onAnimationEnd(Object animation) { + if (animation.equals(currentAnimation)) { + currentAnimation = null; + } + } + }); + currentAnimation.start(); + } else { + for (int a = 0; a < 4; a++) { + TextView textView = characterTextViews.get(a); + ViewProxy.setAlpha(textView, 0); + textView = dotTextViews.get(a); + ViewProxy.setAlpha(textView, 0); + } + } + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + if (dotRunnable != null) { + AndroidUtilities.cancelRunOnUIThread(dotRunnable); + dotRunnable = null; + } + if (currentAnimation != null) { + currentAnimation.cancel(); + currentAnimation = null; + } + + for (int a = 0; a < 4; a++) { + if (a < stringBuilder.length()) { + TextView textView = characterTextViews.get(a); + ViewProxy.setAlpha(textView, 0); + ViewProxy.setScaleX(textView, 1); + ViewProxy.setScaleY(textView, 1); + ViewProxy.setTranslationY(textView, 0); + ViewProxy.setTranslationX(textView, getXForTextView(a)); + + textView = dotTextViews.get(a); + ViewProxy.setAlpha(textView, 1); + ViewProxy.setScaleX(textView, 1); + ViewProxy.setScaleY(textView, 1); + ViewProxy.setTranslationY(textView, 0); + ViewProxy.setTranslationX(textView, getXForTextView(a)); + } else { + TextView textView = characterTextViews.get(a); + ViewProxy.setAlpha(textView, 0); + textView = dotTextViews.get(a); + ViewProxy.setAlpha(textView, 0); + } + } + super.onLayout(changed, left, top, right, bottom); + } + } + + private Drawable backgroundDrawable; + private FrameLayout numbersFrameLayout; + private ArrayList numberTextViews; + private ArrayList lettersTextViews; + private ArrayList numberFrameLayouts; + private FrameLayout passwordFrameLayout; + private ImageView eraseView; + private EditText passwordEditText; + private AnimatingTextView passwordEditText2; + private FrameLayout backgroundFrameLayout; + private TextView passcodeTextView; + private ImageView checkImage; + private int keyboardHeight = 0; + + private Rect rect = new Rect(); + + private PasscodeViewDelegate delegate; + + public PasscodeView(final Context context) { + super(context); + + setWillNotDraw(false); + setVisibility(GONE); + + backgroundFrameLayout = new FrameLayout(context); + addView(backgroundFrameLayout); + LayoutParams layoutParams = (LayoutParams) backgroundFrameLayout.getLayoutParams(); + layoutParams.width = LayoutParams.MATCH_PARENT; + layoutParams.height = LayoutParams.MATCH_PARENT; + backgroundFrameLayout.setLayoutParams(layoutParams); + + passwordFrameLayout = new FrameLayout(context); + addView(passwordFrameLayout); + layoutParams = (LayoutParams) passwordFrameLayout.getLayoutParams(); + layoutParams.width = LayoutParams.MATCH_PARENT; + layoutParams.height = LayoutParams.MATCH_PARENT; + layoutParams.gravity = Gravity.TOP | Gravity.LEFT; + passwordFrameLayout.setLayoutParams(layoutParams); + + ImageView imageView = new ImageView(context); + imageView.setScaleType(ImageView.ScaleType.FIT_XY); + imageView.setImageResource(R.drawable.passcode_logo); + passwordFrameLayout.addView(imageView); + layoutParams = (LayoutParams) imageView.getLayoutParams(); + if (AndroidUtilities.density < 1) { + layoutParams.width = AndroidUtilities.dp(30); + layoutParams.height = AndroidUtilities.dp(30); + } else { + layoutParams.width = AndroidUtilities.dp(40); + layoutParams.height = AndroidUtilities.dp(40); + } + layoutParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM; + layoutParams.bottomMargin = AndroidUtilities.dp(100); + imageView.setLayoutParams(layoutParams); + + passcodeTextView = new TextView(context); + passcodeTextView.setTextColor(0xffffffff); + passcodeTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + passcodeTextView.setGravity(Gravity.CENTER_HORIZONTAL); + passwordFrameLayout.addView(passcodeTextView); + layoutParams = (LayoutParams) passcodeTextView.getLayoutParams(); + layoutParams.width = LayoutParams.WRAP_CONTENT; + layoutParams.height = LayoutParams.WRAP_CONTENT; + layoutParams.bottomMargin = AndroidUtilities.dp(62); + layoutParams.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL; + passcodeTextView.setLayoutParams(layoutParams); + + passwordEditText2 = new AnimatingTextView(context); + passwordFrameLayout.addView(passwordEditText2); + layoutParams = (FrameLayout.LayoutParams) passwordEditText2.getLayoutParams(); + layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; + layoutParams.leftMargin = AndroidUtilities.dp(70); + layoutParams.rightMargin = AndroidUtilities.dp(70); + layoutParams.bottomMargin = AndroidUtilities.dp(6); + layoutParams.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL; + passwordEditText2.setLayoutParams(layoutParams); + + passwordEditText = new EditText(context); + passwordEditText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 36); + passwordEditText.setTextColor(0xffffffff); + passwordEditText.setMaxLines(1); + passwordEditText.setLines(1); + passwordEditText.setGravity(Gravity.CENTER_HORIZONTAL); + passwordEditText.setSingleLine(true); + passwordEditText.setImeOptions(EditorInfo.IME_ACTION_DONE); + passwordEditText.setTypeface(Typeface.DEFAULT); + passwordEditText.setBackgroundDrawable(null); + AndroidUtilities.clearCursorDrawable(passwordEditText); + passwordFrameLayout.addView(passwordEditText); + layoutParams = (FrameLayout.LayoutParams) passwordEditText.getLayoutParams(); + layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT; + layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; + layoutParams.leftMargin = AndroidUtilities.dp(70); + layoutParams.rightMargin = AndroidUtilities.dp(70); + layoutParams.bottomMargin = AndroidUtilities.dp(6); + layoutParams.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL; + passwordEditText.setLayoutParams(layoutParams); + passwordEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { + if (i == EditorInfo.IME_ACTION_DONE) { + processDone(); + return true; + } + return false; + } + }); + passwordEditText.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) { + if (passwordEditText.length() == 4 && UserConfig.passcodeType == 0) { + processDone(); + } + } + }); + if (android.os.Build.VERSION.SDK_INT < 11) { + passwordEditText.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() { + public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { + menu.clear(); + } + }); + } else { + passwordEditText.setCustomSelectionActionModeCallback(new ActionMode.Callback() { + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + return false; + } + + public void onDestroyActionMode(ActionMode mode) { + } + + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + return false; + } + + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + return false; + } + }); + } + + checkImage = new ImageView(context); + checkImage.setImageResource(R.drawable.passcode_check); + checkImage.setScaleType(ImageView.ScaleType.CENTER); + checkImage.setBackgroundResource(R.drawable.bar_selector_lock); + passwordFrameLayout.addView(checkImage); + layoutParams = (LayoutParams) checkImage.getLayoutParams(); + layoutParams.width = AndroidUtilities.dp(60); + layoutParams.height = AndroidUtilities.dp(60); + layoutParams.bottomMargin = AndroidUtilities.dp(4); + layoutParams.rightMargin = AndroidUtilities.dp(10); + layoutParams.gravity = Gravity.BOTTOM | Gravity.RIGHT; + checkImage.setLayoutParams(layoutParams); + checkImage.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + processDone(); + } + }); + + FrameLayout lineFrameLayout = new FrameLayout(context); + lineFrameLayout.setBackgroundColor(0x26ffffff); + passwordFrameLayout.addView(lineFrameLayout); + layoutParams = (LayoutParams) lineFrameLayout.getLayoutParams(); + layoutParams.width = LayoutParams.MATCH_PARENT; + layoutParams.height = AndroidUtilities.dp(1); + layoutParams.gravity = Gravity.BOTTOM | Gravity.LEFT; + layoutParams.leftMargin = AndroidUtilities.dp(20); + layoutParams.rightMargin = AndroidUtilities.dp(20); + lineFrameLayout.setLayoutParams(layoutParams); + + numbersFrameLayout = new FrameLayout(context); + addView(numbersFrameLayout); + layoutParams = (LayoutParams) numbersFrameLayout.getLayoutParams(); + layoutParams.width = LayoutParams.MATCH_PARENT; + layoutParams.height = LayoutParams.MATCH_PARENT; + layoutParams.gravity = Gravity.TOP | Gravity.LEFT; + numbersFrameLayout.setLayoutParams(layoutParams); + + lettersTextViews = new ArrayList<>(10); + numberTextViews = new ArrayList<>(10); + numberFrameLayouts = new ArrayList<>(10); + for (int a = 0; a < 10; a++) { + TextView textView = new TextView(context); + textView.setTextColor(0xffffffff); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 36); + textView.setGravity(Gravity.CENTER); + textView.setText(String.format(Locale.US, "%d", a)); + numbersFrameLayout.addView(textView); + layoutParams = (LayoutParams) textView.getLayoutParams(); + layoutParams.width = AndroidUtilities.dp(50); + layoutParams.height = AndroidUtilities.dp(50); + layoutParams.gravity = Gravity.TOP | Gravity.LEFT; + textView.setLayoutParams(layoutParams); + numberTextViews.add(textView); + + textView = new TextView(context); + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 12); + textView.setTextColor(0x7fffffff); + textView.setGravity(Gravity.CENTER); + numbersFrameLayout.addView(textView); + layoutParams = (LayoutParams) textView.getLayoutParams(); + layoutParams.width = AndroidUtilities.dp(50); + layoutParams.height = AndroidUtilities.dp(20); + layoutParams.gravity = Gravity.TOP | Gravity.LEFT; + textView.setLayoutParams(layoutParams); + switch (a) { + case 0: + textView.setText("+"); + break; + case 2: + textView.setText("ABC"); + break; + case 3: + textView.setText("DEF"); + break; + case 4: + textView.setText("GHI"); + break; + case 5: + textView.setText("JKL"); + break; + case 6: + textView.setText("MNO"); + break; + case 7: + textView.setText("PRQS"); + break; + case 8: + textView.setText("TUV"); + break; + case 9: + textView.setText("WXYZ"); + break; + default: + break; + } + lettersTextViews.add(textView); + } + eraseView = new ImageView(context); + eraseView.setScaleType(ImageView.ScaleType.CENTER); + eraseView.setImageResource(R.drawable.passcode_delete); + numbersFrameLayout.addView(eraseView); + layoutParams = (LayoutParams) eraseView.getLayoutParams(); + layoutParams.width = AndroidUtilities.dp(50); + layoutParams.height = AndroidUtilities.dp(50); + layoutParams.gravity = Gravity.TOP | Gravity.LEFT; + eraseView.setLayoutParams(layoutParams); + for (int a = 0; a < 11; a++) { + FrameLayout frameLayout = new FrameLayout(context); + frameLayout.setBackgroundResource(R.drawable.bar_selector_lock); + frameLayout.setTag(a); + if (a == 10) { + frameLayout.setOnLongClickListener(new OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + passwordEditText.setText(""); + passwordEditText2.eraseAllCharacters(true); + return true; + } + }); + } + frameLayout.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + int tag = (Integer) v.getTag(); + int key = KeyEvent.KEYCODE_DEL; + switch (tag) { + case 0: + key = KeyEvent.KEYCODE_0; + passwordEditText2.appendCharacter("0"); + break; + case 1: + key = KeyEvent.KEYCODE_1; + passwordEditText2.appendCharacter("1"); + break; + case 2: + key = KeyEvent.KEYCODE_2; + passwordEditText2.appendCharacter("2"); + break; + case 3: + key = KeyEvent.KEYCODE_3; + passwordEditText2.appendCharacter("3"); + break; + case 4: + key = KeyEvent.KEYCODE_4; + passwordEditText2.appendCharacter("4"); + break; + case 5: + key = KeyEvent.KEYCODE_5; + passwordEditText2.appendCharacter("5"); + break; + case 6: + key = KeyEvent.KEYCODE_6; + passwordEditText2.appendCharacter("6"); + break; + case 7: + key = KeyEvent.KEYCODE_7; + passwordEditText2.appendCharacter("7"); + break; + case 8: + key = KeyEvent.KEYCODE_8; + passwordEditText2.appendCharacter("8"); + break; + case 9: + key = KeyEvent.KEYCODE_9; + passwordEditText2.appendCharacter("9"); + break; + case 10: + key = KeyEvent.KEYCODE_DEL; + passwordEditText2.eraseLastCharacter(); + break; + } + if (passwordEditText2.lenght() == 4) { + processDone(); + } + //passwordEditText.dispatchKeyEvent(new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, key, 0)); + //passwordEditText.dispatchKeyEvent(new KeyEvent(0, 0, KeyEvent.ACTION_UP, key, 0)); + } + }); + numberFrameLayouts.add(frameLayout); + } + for (int a = 10; a >= 0; a--) { + FrameLayout frameLayout = numberFrameLayouts.get(a); + numbersFrameLayout.addView(frameLayout); + layoutParams = (LayoutParams) frameLayout.getLayoutParams(); + layoutParams.width = AndroidUtilities.dp(100); + layoutParams.height = AndroidUtilities.dp(100); + layoutParams.gravity = Gravity.TOP | Gravity.LEFT; + frameLayout.setLayoutParams(layoutParams); + } + } + + public void setDelegate(PasscodeViewDelegate delegate) { + this.delegate = delegate; + } + + private void processDone() { + String password = ""; + if (UserConfig.passcodeType == 0) { + password = passwordEditText2.getString(); + } else if (UserConfig.passcodeType == 1) { + password = passwordEditText.getText().toString(); + } + if (password.length() == 0) { + onPasscodeError(); + return; + } + if (!Utilities.MD5(password).equals(UserConfig.passcodeHash)) { + passwordEditText.setText(""); + passwordEditText2.eraseAllCharacters(true); + onPasscodeError(); + return; + } + passwordEditText.clearFocus(); + AndroidUtilities.hideKeyboard(passwordEditText); + + if (Build.VERSION.SDK_INT >= 14) { + AnimatorSetProxy animatorSetProxy = new AnimatorSetProxy(); + animatorSetProxy.setDuration(200); + animatorSetProxy.playTogether( + ObjectAnimatorProxy.ofFloat(this, "translationY", AndroidUtilities.dp(20)), + ObjectAnimatorProxy.ofFloat(this, "alpha", AndroidUtilities.dp(0.0f))); + animatorSetProxy.addListener(new AnimatorListenerAdapterProxy() { + @Override + public void onAnimationEnd(Object animation) { + PasscodeView.this.clearAnimation(); + setVisibility(View.GONE); + } + }); + animatorSetProxy.start(); + } else { + setVisibility(View.GONE); + } + + UserConfig.appLocked = false; + UserConfig.saveConfig(false); + NotificationCenter.getInstance().postNotificationName(NotificationCenter.didSetPasscode); + setOnTouchListener(null); + if (delegate != null) { + delegate.didAcceptedPassword(); + } + } + + private void shakeTextView(final float x, final int num) { + if (num == 6) { + passcodeTextView.clearAnimation(); + return; + } + AnimatorSetProxy animatorSetProxy = new AnimatorSetProxy(); + animatorSetProxy.playTogether(ObjectAnimatorProxy.ofFloat(passcodeTextView, "translationX", AndroidUtilities.dp(x))); + animatorSetProxy.setDuration(50); + animatorSetProxy.addListener(new AnimatorListenerAdapterProxy() { + @Override + public void onAnimationEnd(Object animation) { + shakeTextView(num == 5 ? 0 : -x, num + 1); + } + }); + animatorSetProxy.start(); + } + + private void onPasscodeError() { + Vibrator v = (Vibrator) getContext().getSystemService(Context.VIBRATOR_SERVICE); + if (v != null) { + v.vibrate(200); + } + shakeTextView(2, 0); + } + + public void onResume() { + if (UserConfig.passcodeType == 1) { + if (passwordEditText != null) { + passwordEditText.requestFocus(); + AndroidUtilities.showKeyboard(passwordEditText); + } + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + if (passwordEditText != null) { + passwordEditText.requestFocus(); + AndroidUtilities.showKeyboard(passwordEditText); + } + } + }, 200); + } + } + + public void onShow() { + if (UserConfig.passcodeType == 1) { + if (passwordEditText != null) { + passwordEditText.requestFocus(); + AndroidUtilities.showKeyboard(passwordEditText); + } + } else { + Activity parentActivity = (Activity) getContext(); + if (parentActivity != null) { + View currentFocus = parentActivity.getCurrentFocus(); + if (currentFocus != null) { + currentFocus.clearFocus(); + AndroidUtilities.hideKeyboard(((Activity) getContext()).getCurrentFocus()); + } + } + } + if (getVisibility() == View.VISIBLE) { + return; + } + if (Build.VERSION.SDK_INT >= 14) { + ViewProxy.setAlpha(this, 1.0f); + ViewProxy.setTranslationY(this, 0); + this.clearAnimation(); + } + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); + int selectedBackground = preferences.getInt("selectedBackground", 1000001); + boolean customTheme = false; + if (selectedBackground == 1000001) { + backgroundFrameLayout.setBackgroundColor(0xff517c9e); + } else { + backgroundDrawable = ApplicationLoader.getCachedWallpaper(); + if (backgroundDrawable != null) { + backgroundFrameLayout.setBackgroundColor(0xbf000000); + customTheme = true; + } else { + backgroundFrameLayout.setBackgroundColor(0xff517c9e); + } + } + + passcodeTextView.setText(LocaleController.getString("EnterYourPasscode", R.string.EnterYourPasscode)); + + if (UserConfig.passcodeType == 0) { + //InputFilter[] filterArray = new InputFilter[1]; + //filterArray[0] = new InputFilter.LengthFilter(4); + //passwordEditText.setFilters(filterArray); + //passwordEditText.setInputType(InputType.TYPE_CLASS_PHONE); + //passwordEditText.setFocusable(false); + //passwordEditText.setFocusableInTouchMode(false); + numbersFrameLayout.setVisibility(VISIBLE); + passwordEditText.setVisibility(GONE); + passwordEditText2.setVisibility(VISIBLE); + checkImage.setVisibility(GONE); + } else if (UserConfig.passcodeType == 1) { + passwordEditText.setFilters(new InputFilter[0]); + passwordEditText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); + numbersFrameLayout.setVisibility(GONE); + passwordEditText.setFocusable(true); + passwordEditText.setFocusableInTouchMode(true); + passwordEditText.setVisibility(VISIBLE); + passwordEditText2.setVisibility(GONE); + checkImage.setVisibility(VISIBLE); + } + setVisibility(VISIBLE); + passwordEditText.setTransformationMethod(PasswordTransformationMethod.getInstance()); + passwordEditText.setText(""); + passwordEditText2.eraseAllCharacters(false); + + setOnTouchListener(new OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + return true; + } + }); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = AndroidUtilities.displaySize.y - (Build.VERSION.SDK_INT >= 21 ? 0 : AndroidUtilities.statusBarHeight); + + LayoutParams layoutParams; + + if (!AndroidUtilities.isTablet() && getContext().getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { + layoutParams = (LayoutParams) passwordFrameLayout.getLayoutParams(); + layoutParams.width = UserConfig.passcodeType == 0 ? width / 2 : width; + layoutParams.height = AndroidUtilities.dp(140); + layoutParams.topMargin = (height - AndroidUtilities.dp(140)) / 2; + passwordFrameLayout.setLayoutParams(layoutParams); + + layoutParams = (LayoutParams) numbersFrameLayout.getLayoutParams(); + layoutParams.height = height; + layoutParams.leftMargin = width / 2; + layoutParams.topMargin = height - layoutParams.height; + layoutParams.width = width / 2; + numbersFrameLayout.setLayoutParams(layoutParams); + } else { + int top = 0; + int left = 0; + if (AndroidUtilities.isTablet()) { + if (width > AndroidUtilities.dp(498)) { + left = (width - AndroidUtilities.dp(498)) / 2; + width = AndroidUtilities.dp(498); + } + if (height > AndroidUtilities.dp(528)) { + top = (height - AndroidUtilities.dp(528)) / 2; + height = AndroidUtilities.dp(528); + } + } + layoutParams = (LayoutParams) passwordFrameLayout.getLayoutParams(); + layoutParams.height = height / 3; + layoutParams.width = width; + layoutParams.topMargin = top; + layoutParams.leftMargin = left; + passwordFrameLayout.setTag(top); + passwordFrameLayout.setLayoutParams(layoutParams); + + layoutParams = (LayoutParams) numbersFrameLayout.getLayoutParams(); + layoutParams.height = height / 3 * 2; + layoutParams.leftMargin = left; + layoutParams.topMargin = height - layoutParams.height + top; + layoutParams.width = width; + numbersFrameLayout.setLayoutParams(layoutParams); + } + + int sizeBetweenNumbersX = (layoutParams.width - AndroidUtilities.dp(50) * 3) / 4; + int sizeBetweenNumbersY = (layoutParams.height - AndroidUtilities.dp(50) * 4) / 5; + + for (int a = 0; a < 11; a++) { + LayoutParams layoutParams1; + int num; + if (a == 0) { + num = 10; + } else if (a == 10) { + num = 11; + } else { + num = a - 1; + } + int row = num / 3; + int col = num % 3; + int top; + if (a < 10) { + TextView textView = numberTextViews.get(a); + TextView textView1 = lettersTextViews.get(a); + layoutParams = (LayoutParams) textView.getLayoutParams(); + layoutParams1 = (LayoutParams) textView1.getLayoutParams(); + top = layoutParams1.topMargin = layoutParams.topMargin = sizeBetweenNumbersY + (sizeBetweenNumbersY + AndroidUtilities.dp(50)) * row; + layoutParams1.leftMargin = layoutParams.leftMargin = sizeBetweenNumbersX + (sizeBetweenNumbersX + AndroidUtilities.dp(50)) * col; + layoutParams1.topMargin += AndroidUtilities.dp(40); + textView.setLayoutParams(layoutParams); + textView1.setLayoutParams(layoutParams1); + } else { + layoutParams = (LayoutParams) eraseView.getLayoutParams(); + top = layoutParams.topMargin = sizeBetweenNumbersY + (sizeBetweenNumbersY + AndroidUtilities.dp(50)) * row + AndroidUtilities.dp(8); + layoutParams.leftMargin = sizeBetweenNumbersX + (sizeBetweenNumbersX + AndroidUtilities.dp(50)) * col; + top -= AndroidUtilities.dp(8); + eraseView.setLayoutParams(layoutParams); + } + + FrameLayout frameLayout = numberFrameLayouts.get(a); + layoutParams1 = (LayoutParams) frameLayout.getLayoutParams(); + layoutParams1.topMargin = top - AndroidUtilities.dp(17); + layoutParams1.leftMargin = layoutParams.leftMargin - AndroidUtilities.dp(25); + frameLayout.setLayoutParams(layoutParams1); + } + + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + View rootView = getRootView(); + int usableViewHeight = rootView.getHeight() - AndroidUtilities.statusBarHeight - AndroidUtilities.getViewInset(rootView); + getWindowVisibleDisplayFrame(rect); + keyboardHeight = usableViewHeight - (rect.bottom - rect.top); + + if (UserConfig.passcodeType == 1 && (AndroidUtilities.isTablet() || getContext().getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE)) { + int t = 0; + if (passwordFrameLayout.getTag() != 0) { + t = (Integer) passwordFrameLayout.getTag(); + } + LayoutParams layoutParams = (LayoutParams) passwordFrameLayout.getLayoutParams(); + layoutParams.topMargin = t + layoutParams.height - keyboardHeight / 2 - (Build.VERSION.SDK_INT >= 21 ? AndroidUtilities.statusBarHeight : 0); + passwordFrameLayout.setLayoutParams(layoutParams); + } + + super.onLayout(changed, left, top, right, bottom); + } + + @Override + protected void onDraw(Canvas canvas) { + if (getVisibility() != VISIBLE) { + return; + } + if (backgroundDrawable != null) { + if (backgroundDrawable instanceof ColorDrawable) { + backgroundDrawable.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight()); + backgroundDrawable.draw(canvas); + } else { + float scaleX = (float) getMeasuredWidth() / (float) backgroundDrawable.getIntrinsicWidth(); + float scaleY = (float) (getMeasuredHeight() + keyboardHeight) / (float) backgroundDrawable.getIntrinsicHeight(); + float scale = scaleX < scaleY ? scaleY : scaleX; + int width = (int) Math.ceil(backgroundDrawable.getIntrinsicWidth() * scale); + int height = (int) Math.ceil(backgroundDrawable.getIntrinsicHeight() * scale); + int x = (getMeasuredWidth() - width) / 2; + int y = (getMeasuredHeight() - height + keyboardHeight) / 2; + backgroundDrawable.setBounds(x, y, x + width, y + height); + backgroundDrawable.draw(canvas); + } + } else { + super.onDraw(canvas); + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoCropView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoCropView.java new file mode 100644 index 000000000..4bd9ba572 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoCropView.java @@ -0,0 +1,598 @@ +/* + * This is the source code of Telegram for Android v. 2.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-2015. + */ + +package org.telegram.ui.Components; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.RectF; +import android.view.MotionEvent; +import android.widget.FrameLayout; + +import org.telegram.android.AndroidUtilities; +import org.telegram.messenger.FileLog; + +public class PhotoCropView extends FrameLayout { + + public static interface PhotoCropViewDelegate { + public abstract void needMoveImageTo(float x, float y, float s, boolean animated); + } + + private boolean freeformCrop = true; + private Paint rectPaint; + private Paint circlePaint; + private Paint halfPaint; + private Paint shadowPaint; + private float rectSizeX = 600; + private float rectSizeY = 600; + private int draggingState = 0; + private int orientation; + private float oldX = 0, oldY = 0; + private int bitmapWidth = 1, bitmapHeight = 1, bitmapX, bitmapY; + private float rectX = -1, rectY = -1; + private Bitmap bitmapToEdit; + private float bitmapGlobalScale = 1; + private float bitmapGlobalX = 0; + private float bitmapGlobalY = 0; + private PhotoCropViewDelegate delegate; + + private RectF animationStartValues; + private RectF animationEndValues; + private Runnable animationRunnable; + + public PhotoCropView(Context context) { + super(context); + + rectPaint = new Paint(); + rectPaint.setColor(0xb2ffffff); + rectPaint.setStrokeWidth(AndroidUtilities.dp(2)); + rectPaint.setStyle(Paint.Style.STROKE); + circlePaint = new Paint(); + circlePaint.setColor(0xffffffff); + halfPaint = new Paint(); + halfPaint.setColor(0x7f000000); + shadowPaint = new Paint(); + shadowPaint.setColor(0x1a000000); + setWillNotDraw(false); + } + + public void setBitmap(Bitmap bitmap, int rotation, boolean freeform) { + bitmapToEdit = bitmap; + rectSizeX = 600; + rectSizeY = 600; + draggingState = 0; + oldX = 0; + oldY = 0; + bitmapWidth = 1; + bitmapHeight = 1; + rectX = -1; + rectY = -1; + freeformCrop = freeform; + orientation = rotation; + requestLayout(); + } + + public boolean onTouch(MotionEvent motionEvent) { + if (motionEvent == null) { + draggingState = 0; + return false; + } + float x = motionEvent.getX(); + float y = motionEvent.getY(); + int cornerSide = AndroidUtilities.dp(20); + if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { + if (rectX - cornerSide < x && rectX + cornerSide > x && rectY - cornerSide < y && rectY + cornerSide > y) { + draggingState = 1; + } else if (rectX - cornerSide + rectSizeX < x && rectX + cornerSide + rectSizeX > x && rectY - cornerSide < y && rectY + cornerSide > y) { + draggingState = 2; + } else if (rectX - cornerSide < x && rectX + cornerSide > x && rectY - cornerSide + rectSizeY < y && rectY + cornerSide + rectSizeY > y) { + draggingState = 3; + } else if (rectX - cornerSide + rectSizeX < x && rectX + cornerSide + rectSizeX > x && rectY - cornerSide + rectSizeY < y && rectY + cornerSide + rectSizeY > y) { + draggingState = 4; + } else { + if (freeformCrop) { + if (rectX + cornerSide < x && rectX - cornerSide + rectSizeX > x && rectY - cornerSide < y && rectY + cornerSide > y) { + draggingState = 5; + } else if (rectY + cornerSide < y && rectY - cornerSide + rectSizeY > y && rectX - cornerSide + rectSizeX < x && rectX + cornerSide + rectSizeX > x) { + draggingState = 6; + } else if (rectY + cornerSide < y && rectY - cornerSide + rectSizeY > y && rectX - cornerSide < x && rectX + cornerSide > x) { + draggingState = 7; + } else if (rectX + cornerSide < x && rectX - cornerSide + rectSizeX > x && rectY - cornerSide + rectSizeY < y && rectY + cornerSide + rectSizeY > y) { + draggingState = 8; + } + } else { + draggingState = 0; + } + } + if (draggingState != 0) { + cancelAnimationRunnable(); + PhotoCropView.this.requestDisallowInterceptTouchEvent(true); + } + oldX = x; + oldY = y; + } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) { + if (draggingState != 0) { + draggingState = 0; + startAnimationRunnable(); + return true; + } + } else if (motionEvent.getAction() == MotionEvent.ACTION_MOVE && draggingState != 0) { + float diffX = x - oldX; + float diffY = y - oldY; + float bitmapScaledWidth = bitmapWidth * bitmapGlobalScale; + float bitmapScaledHeight = bitmapHeight * bitmapGlobalScale; + float bitmapStartX = (getWidth() - AndroidUtilities.dp(28) - bitmapScaledWidth) / 2 + bitmapGlobalX + AndroidUtilities.dp(14); + float bitmapStartY = (getHeight() - AndroidUtilities.dp(28) - bitmapScaledHeight) / 2 + bitmapGlobalY + AndroidUtilities.dp(14); + float bitmapEndX = bitmapStartX + bitmapScaledWidth; + float bitmapEndY = bitmapStartY + bitmapScaledHeight; + + float minSide = AndroidUtilities.getPixelsInCM(0.9f, true); + + if (draggingState == 1 || draggingState == 5) { + if (draggingState != 5) { + if (rectSizeX - diffX < minSide) { + diffX = rectSizeX - minSide; + } + if (rectX + diffX < bitmapX) { + diffX = bitmapX - rectX; + } + if (rectX + diffX < bitmapStartX) { + bitmapGlobalX -= bitmapStartX - rectX - diffX; + delegate.needMoveImageTo(bitmapGlobalX, bitmapGlobalY, bitmapGlobalScale, false); + } + } + if (!freeformCrop) { + if (rectY + diffX < bitmapY) { + diffX = bitmapY - rectY; + } + if (rectY + diffX < bitmapStartY) { + bitmapGlobalY -= bitmapStartY - rectY - diffX; + delegate.needMoveImageTo(bitmapGlobalX, bitmapGlobalY, bitmapGlobalScale, false); + } + rectX += diffX; + rectY += diffX; + rectSizeX -= diffX; + rectSizeY -= diffX; + } else { + if (rectSizeY - diffY < minSide) { + diffY = rectSizeY - minSide; + } + if (rectY + diffY < bitmapY) { + diffY = bitmapY - rectY; + } + if (rectY + diffY < bitmapStartY) { + bitmapGlobalY -= bitmapStartY - rectY - diffY; + delegate.needMoveImageTo(bitmapGlobalX, bitmapGlobalY, bitmapGlobalScale, false); + } + if (draggingState != 5) { + rectX += diffX; + rectSizeX -= diffX; + } + rectY += diffY; + rectSizeY -= diffY; + } + } else if (draggingState == 2 || draggingState == 6) { + if (rectSizeX + diffX < minSide) { + diffX = -(rectSizeX - minSide); + } + if (rectX + rectSizeX + diffX > bitmapX + bitmapWidth) { + diffX = bitmapX + bitmapWidth - rectX - rectSizeX; + } + if (rectX + rectSizeX + diffX > bitmapEndX) { + bitmapGlobalX -= bitmapEndX - rectX - rectSizeX - diffX; + delegate.needMoveImageTo(bitmapGlobalX, bitmapGlobalY, bitmapGlobalScale, false); + } + if (!freeformCrop) { + if (rectY - diffX < bitmapY) { + diffX = rectY - bitmapY; + } + if (rectY - diffX < bitmapStartY) { + bitmapGlobalY -= bitmapStartY - rectY + diffX; + delegate.needMoveImageTo(bitmapGlobalX, bitmapGlobalY, bitmapGlobalScale, false); + } + rectY -= diffX; + rectSizeX += diffX; + rectSizeY += diffX; + } else { + if (draggingState != 6) { + if (rectSizeY - diffY < minSide) { + diffY = rectSizeY - minSide; + } + if (rectY + diffY < bitmapY) { + diffY = bitmapY - rectY; + } + if (rectY + diffY < bitmapStartY) { + bitmapGlobalY -= bitmapStartY - rectY - diffY; + delegate.needMoveImageTo(bitmapGlobalX, bitmapGlobalY, bitmapGlobalScale, false); + } + rectY += diffY; + rectSizeY -= diffY; + } + rectSizeX += diffX; + } + } else if (draggingState == 3 || draggingState == 7) { + if (rectSizeX - diffX < minSide) { + diffX = rectSizeX - minSide; + } + if (rectX + diffX < bitmapX) { + diffX = bitmapX - rectX; + } + if (rectX + diffX < bitmapStartX) { + bitmapGlobalX -= bitmapStartX - rectX - diffX; + delegate.needMoveImageTo(bitmapGlobalX, bitmapGlobalY, bitmapGlobalScale, false); + } + if (!freeformCrop) { + if (rectY + rectSizeX - diffX > bitmapY + bitmapHeight) { + diffX = rectY + rectSizeX - bitmapY - bitmapHeight; + } + if (rectY + rectSizeX - diffX > bitmapEndY) { + bitmapGlobalY -= bitmapEndY - rectY - rectSizeX + diffX; + delegate.needMoveImageTo(bitmapGlobalX, bitmapGlobalY, bitmapGlobalScale, false); + } + rectX += diffX; + rectSizeX -= diffX; + rectSizeY -= diffX; + } else { + if (draggingState != 7) { + if (rectY + rectSizeY + diffY > bitmapY + bitmapHeight) { + diffY = bitmapY + bitmapHeight - rectY - rectSizeY; + } + if (rectY + rectSizeY + diffY > bitmapEndY) { + bitmapGlobalY -= bitmapEndY - rectY - rectSizeY - diffY; + delegate.needMoveImageTo(bitmapGlobalX, bitmapGlobalY, bitmapGlobalScale, false); + } + rectSizeY += diffY; + if (rectSizeY < minSide) { + rectSizeY = minSide; + } + } + rectX += diffX; + rectSizeX -= diffX; + } + } else if (draggingState == 4 || draggingState == 8) { + if (draggingState != 8) { + if (rectX + rectSizeX + diffX > bitmapX + bitmapWidth) { + diffX = bitmapX + bitmapWidth - rectX - rectSizeX; + } + if (rectX + rectSizeX + diffX > bitmapEndX) { + bitmapGlobalX -= bitmapEndX - rectX - rectSizeX - diffX; + delegate.needMoveImageTo(bitmapGlobalX, bitmapGlobalY, bitmapGlobalScale, false); + } + } + if (!freeformCrop) { + if (rectY + rectSizeX + diffX > bitmapY + bitmapHeight) { + diffX = bitmapY + bitmapHeight - rectY - rectSizeX; + } + if (rectY + rectSizeX + diffX > bitmapEndY) { + bitmapGlobalY -= bitmapEndY - rectY - rectSizeX - diffX; + delegate.needMoveImageTo(bitmapGlobalX, bitmapGlobalY, bitmapGlobalScale, false); + } + rectSizeX += diffX; + rectSizeY += diffX; + } else { + if (rectY + rectSizeY + diffY > bitmapY + bitmapHeight) { + diffY = bitmapY + bitmapHeight - rectY - rectSizeY; + } + if (rectY + rectSizeY + diffY > bitmapEndY) { + bitmapGlobalY -= bitmapEndY - rectY - rectSizeY - diffY; + delegate.needMoveImageTo(bitmapGlobalX, bitmapGlobalY, bitmapGlobalScale, false); + } + if (draggingState != 8) { + rectSizeX += diffX; + } + rectSizeY += diffY; + } + if (rectSizeX < minSide) { + rectSizeX = minSide; + } + if (rectSizeY < minSide) { + rectSizeY = minSide; + } + } + + oldX = x; + oldY = y; + invalidate(); + } + return draggingState != 0; + } + + public float getRectX() { + return rectX - AndroidUtilities.dp(14); + } + + public float getRectY() { + return rectY - AndroidUtilities.dp(14); + } + + public float getRectSizeX() { + return rectSizeX; + } + + public float getRectSizeY() { + return rectSizeY; + } + + public float getBitmapX() { + return bitmapX - AndroidUtilities.dp(14); + } + + public float getBitmapY() { + return bitmapY - AndroidUtilities.dp(14); + } + + public float getLimitX() { + return rectX - ((int) Math.max(0, Math.ceil((getWidth() - AndroidUtilities.dp(28) - bitmapWidth * bitmapGlobalScale) / 2)) + AndroidUtilities.dp(14)); + } + + public float getLimitY() { + return rectY - ((int) Math.max(0, Math.ceil((getHeight() - AndroidUtilities.dp(28) - bitmapHeight * bitmapGlobalScale) / 2)) + AndroidUtilities.dp(14)); + } + + public float getLimitWidth() { + return getWidth() - AndroidUtilities.dp(14) - rectX - (int) Math.max(0, Math.ceil((getWidth() - AndroidUtilities.dp(28) - bitmapWidth * bitmapGlobalScale) / 2)) - rectSizeX; + } + + public float getLimitHeight() { + return getHeight() - AndroidUtilities.dp(14) - rectY - (int) Math.max(0, Math.ceil((getHeight() - AndroidUtilities.dp(28) - bitmapHeight * bitmapGlobalScale) / 2)) - rectSizeY; + } + + private Bitmap createBitmap(int x, int y, int w, int h) { + Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(bitmap); + Paint paint = new Paint(); + paint.setFilterBitmap(true); + + Matrix matrix = new Matrix(); + matrix.setTranslate(-bitmapToEdit.getWidth() / 2, -bitmapToEdit.getHeight() / 2); + matrix.postRotate(orientation); + if (orientation == 90 || orientation == 270) { + matrix.postTranslate(bitmapToEdit.getHeight() / 2 - x, bitmapToEdit.getWidth() / 2 - y); + } else { + matrix.postTranslate(bitmapToEdit.getWidth() / 2 - x, bitmapToEdit.getHeight() / 2 - y); + } + canvas.drawBitmap(bitmapToEdit, matrix, paint); + try { + canvas.setBitmap(null); + } catch (Exception e) { + //don't promt, this will crash on 2.x + } + + return bitmap; + } + + public Bitmap getBitmap() { + float bitmapScaledWidth = bitmapWidth * bitmapGlobalScale; + float bitmapScaledHeight = bitmapHeight * bitmapGlobalScale; + float bitmapStartX = (getWidth() - AndroidUtilities.dp(28) - bitmapScaledWidth) / 2 + bitmapGlobalX + AndroidUtilities.dp(14); + float bitmapStartY = (getHeight() - AndroidUtilities.dp(28) - bitmapScaledHeight) / 2 + bitmapGlobalY + AndroidUtilities.dp(14); + + float percX = (rectX - bitmapStartX) / bitmapScaledWidth; + float percY = (rectY - bitmapStartY) / bitmapScaledHeight; + float percSizeX = rectSizeX / bitmapScaledWidth; + float percSizeY = rectSizeY / bitmapScaledHeight; + + int width; + int height; + if (orientation == 90 || orientation == 270) { + width = bitmapToEdit.getHeight(); + height = bitmapToEdit.getWidth(); + } else { + width = bitmapToEdit.getWidth(); + height = bitmapToEdit.getHeight(); + } + + int x = (int) (percX * width); + int y = (int) (percY * height); + int sizeX = (int) (percSizeX * width); + int sizeY = (int) (percSizeY * height); + if (x < 0) { + x = 0; + } + if (y < 0) { + y = 0; + } + if (x + sizeX > width) { + sizeX = width - x; + } + if (y + sizeY > height) { + sizeY = height - y; + } + try { + return createBitmap(x, y, sizeX, sizeY); + } catch (Throwable e) { + FileLog.e("tmessags", e); + System.gc(); + try { + return createBitmap(x, y, sizeX, sizeY); + } catch (Throwable e2) { + FileLog.e("tmessages", e2); + } + } + return null; + } + + @Override + protected void onDraw(Canvas canvas) { + canvas.drawRect(0, 0, getWidth(), rectY, halfPaint); + canvas.drawRect(0, rectY, rectX, rectY + rectSizeY, halfPaint); + canvas.drawRect(rectX + rectSizeX, rectY, getWidth(), rectY + rectSizeY, halfPaint); + canvas.drawRect(0, rectY + rectSizeY, getWidth(), getHeight(), halfPaint); + + int side = AndroidUtilities.dp(1); + canvas.drawRect(rectX - side * 2, rectY - side * 2, rectX - side * 2 + AndroidUtilities.dp(20), rectY, circlePaint); + canvas.drawRect(rectX - side * 2, rectY - side * 2, rectX, rectY - side * 2 + AndroidUtilities.dp(20), circlePaint); + + canvas.drawRect(rectX + rectSizeX + side * 2 - AndroidUtilities.dp(20), rectY - side * 2, rectX + rectSizeX + side * 2, rectY, circlePaint); + canvas.drawRect(rectX + rectSizeX, rectY - side * 2, rectX + rectSizeX + side * 2, rectY - side * 2 + AndroidUtilities.dp(20), circlePaint); + + canvas.drawRect(rectX - side * 2, rectY + rectSizeY + side * 2 - AndroidUtilities.dp(20), rectX, rectY + rectSizeY + side * 2, circlePaint); + canvas.drawRect(rectX - side * 2, rectY + rectSizeY, rectX - side * 2 + AndroidUtilities.dp(20), rectY + rectSizeY + side * 2, circlePaint); + + canvas.drawRect(rectX + rectSizeX + side * 2 - AndroidUtilities.dp(20), rectY + rectSizeY, rectX + rectSizeX + side * 2, rectY + rectSizeY + side * 2, circlePaint); + canvas.drawRect(rectX + rectSizeX, rectY + rectSizeY + side * 2 - AndroidUtilities.dp(20), rectX + rectSizeX + side * 2, rectY + rectSizeY + side * 2, circlePaint); + + for (int a = 1; a < 3; a++) { + canvas.drawRect(rectX + rectSizeX / 3 * a - side, rectY, rectX + side * 2 + rectSizeX / 3 * a, rectY + rectSizeY, shadowPaint); + canvas.drawRect(rectX, rectY + rectSizeY / 3 * a - side, rectX + rectSizeX, rectY + rectSizeY / 3 * a + side * 2, shadowPaint); + } + + for (int a = 1; a < 3; a++) { + canvas.drawRect(rectX + rectSizeX / 3 * a, rectY, rectX + side + rectSizeX / 3 * a, rectY + rectSizeY, circlePaint); + canvas.drawRect(rectX, rectY + rectSizeY / 3 * a, rectX + rectSizeX, rectY + rectSizeY / 3 * a + side, circlePaint); + } + + canvas.drawRect(rectX, rectY, rectX + rectSizeX, rectY + rectSizeY, rectPaint); + } + + public void setBitmapParams(float scale, float x, float y) { + bitmapGlobalScale = scale; + bitmapGlobalX = x; + bitmapGlobalY = y; + } + + public void startAnimationRunnable() { + if (animationRunnable != null) { + return; + } + animationRunnable = new Runnable() { + @Override + public void run() { + if (animationRunnable == this) { + animationRunnable = null; + animateToFill(); + } + } + }; + AndroidUtilities.runOnUIThread(animationRunnable, 1500); + } + + public void cancelAnimationRunnable() { + if (animationRunnable != null) { + AndroidUtilities.cancelRunOnUIThread(animationRunnable); + animationRunnable = null; + animationStartValues = null; + animationEndValues = null; + } + } + + public void setAnimationProgress(float animationProgress) { + if (animationStartValues != null) { + if (animationProgress == 1) { + rectX = animationEndValues.left; + rectY = animationEndValues.top; + rectSizeX = animationEndValues.right; + rectSizeY = animationEndValues.bottom; + animationStartValues = null; + animationEndValues = null; + } else { + rectX = animationStartValues.left + (animationEndValues.left - animationStartValues.left) * animationProgress; + rectY = animationStartValues.top + (animationEndValues.top - animationStartValues.top) * animationProgress; + rectSizeX = animationStartValues.right + (animationEndValues.right - animationStartValues.right) * animationProgress; + rectSizeY = animationStartValues.bottom + (animationEndValues.bottom - animationStartValues.bottom) * animationProgress; + } + invalidate(); + } + } + + public void animateToFill() { + float scaleToX = bitmapWidth / rectSizeX; + float scaleToY = bitmapHeight / rectSizeY; + float scaleTo = scaleToX > scaleToY ? scaleToY : scaleToX; + if (scaleTo > 1 && scaleTo * bitmapGlobalScale > 3) { + scaleTo = 3 / bitmapGlobalScale; + } else if (scaleTo < 1 && scaleTo * bitmapGlobalScale < 1) { + scaleTo = 1 / bitmapGlobalScale; + } + float newSizeX = rectSizeX * scaleTo; + float newSizeY = rectSizeY * scaleTo; + float newX = (getWidth() - AndroidUtilities.dp(28) - newSizeX) / 2 + AndroidUtilities.dp(14); + float newY = (getHeight() - AndroidUtilities.dp(28) - newSizeY) / 2 + AndroidUtilities.dp(14); + animationStartValues = new RectF(rectX, rectY, rectSizeX, rectSizeY); + animationEndValues = new RectF(newX, newY, newSizeX, newSizeY); + + float newBitmapGlobalX = newX + getWidth() / 2 * (scaleTo - 1) + (bitmapGlobalX - rectX) * scaleTo; + float newBitmapGlobalY = newY + getHeight() / 2 * (scaleTo - 1) + (bitmapGlobalY - rectY) * scaleTo; + + delegate.needMoveImageTo(newBitmapGlobalX, newBitmapGlobalY, bitmapGlobalScale * scaleTo, true); + } + + public void setDelegate(PhotoCropViewDelegate delegate) { + this.delegate = delegate; + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + + if (bitmapToEdit == null) { + return; + } + + int viewWidth = getWidth() - AndroidUtilities.dp(28); + int viewHeight = getHeight() - AndroidUtilities.dp(28); + + float bitmapW; + float bitmapH; + if (orientation == 90 || orientation == 270) { + bitmapW = bitmapToEdit.getHeight(); + bitmapH = bitmapToEdit.getWidth(); + } else { + bitmapW = bitmapToEdit.getWidth(); + bitmapH = bitmapToEdit.getHeight(); + } + float scaleX = viewWidth / bitmapW; + float scaleY = viewHeight / bitmapH; + if (scaleX > scaleY) { + bitmapH = viewHeight; + bitmapW = (int) Math.ceil(bitmapW * scaleY); + } else { + bitmapW = viewWidth; + bitmapH = (int) Math.ceil(bitmapH * scaleX); + } + + float percX = (rectX - bitmapX) / bitmapWidth; + float percY = (rectY - bitmapY) / bitmapHeight; + float percSizeX = rectSizeX / bitmapWidth; + float percSizeY = rectSizeY / bitmapHeight; + bitmapWidth = (int) bitmapW; + bitmapHeight = (int) bitmapH; + + bitmapX = (int) Math.ceil((viewWidth - bitmapWidth) / 2 + AndroidUtilities.dp(14)); + bitmapY = (int) Math.ceil((viewHeight - bitmapHeight) / 2 + AndroidUtilities.dp(14)); + + if (rectX == -1 && rectY == -1) { + if (freeformCrop) { + rectY = bitmapY; + rectX = bitmapX; + rectSizeX = bitmapWidth; + rectSizeY = bitmapHeight; + } else { + if (bitmapWidth > bitmapHeight) { + rectY = bitmapY; + rectX = (viewWidth - bitmapHeight) / 2 + AndroidUtilities.dp(14); + rectSizeX = bitmapHeight; + rectSizeY = bitmapHeight; + } else { + rectX = bitmapX; + rectY = (viewHeight - bitmapWidth) / 2 + AndroidUtilities.dp(14); + rectSizeX = bitmapWidth; + rectSizeY = bitmapWidth; + } + } + } else { + rectX = percX * bitmapWidth + bitmapX; + rectY = percY * bitmapHeight + bitmapY; + rectSizeX = percSizeX * bitmapWidth; + rectSizeY = percSizeY * bitmapHeight; + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoEditorSeekBar.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoEditorSeekBar.java new file mode 100644 index 000000000..1d7687df3 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoEditorSeekBar.java @@ -0,0 +1,132 @@ +/* + * This is the source code of Telegram for Android v. 2.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-2015. + */ + +package org.telegram.ui.Components; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.view.MotionEvent; +import android.view.View; + +import org.telegram.android.AndroidUtilities; + +public class PhotoEditorSeekBar extends View { + + private Paint innerPaint = new Paint(); + private Paint outerPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private int thumbSize = AndroidUtilities.dp(16); + private int thumbDX = 0; + private float progress = 0; + private boolean pressed = false; + private int minValue; + private int maxValue; + private PhotoEditorSeekBarDelegate delegate; + + public abstract interface PhotoEditorSeekBarDelegate { + public void onProgressChanged(); + } + + public PhotoEditorSeekBar(Context context) { + super(context); + + innerPaint.setColor(0x99383838); + outerPaint.setColor(0xff53aeef); + } + + public void setDelegate(PhotoEditorSeekBarDelegate delegate) { + this.delegate = delegate; + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (event == null) { + return false; + } + float x = event.getX(); + float y = event.getY(); + float thumbX = (int)((getMeasuredWidth() - thumbSize) * progress); + if (event.getAction() == MotionEvent.ACTION_DOWN) { + int additionWidth = (getMeasuredHeight() - thumbSize) / 2; + if (thumbX - additionWidth <= x && x <= thumbX + thumbSize + additionWidth && y >= 0 && y <= getMeasuredHeight()) { + pressed = true; + thumbDX = (int)(x - thumbX); + getParent().requestDisallowInterceptTouchEvent(true); + invalidate(); + return true; + } + } else if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) { + if (pressed) { + pressed = false; + invalidate(); + return true; + } + } else if (event.getAction() == MotionEvent.ACTION_MOVE) { + if (pressed) { + thumbX = (int)(x - thumbDX); + if (thumbX < 0) { + thumbX = 0; + } else if (thumbX > getMeasuredWidth() - thumbSize) { + thumbX = getMeasuredWidth() - thumbSize; + } + progress = thumbX / (getMeasuredWidth() - thumbSize); + if (delegate != null) { + delegate.onProgressChanged(); + } + invalidate(); + return true; + } + } + return false; + } + + public void setProgress(int progress) { + setProgress(progress, true); + } + + public void setProgress(int progress, boolean notify) { + if (progress < minValue) { + progress = minValue; + } else if (progress > maxValue) { + progress = maxValue; + } + this.progress = (progress - minValue) / (float) (maxValue - minValue); + invalidate(); + if (notify && delegate != null) { + delegate.onProgressChanged(); + } + } + + public int getProgress() { + return (int) (minValue + progress * (maxValue - minValue)); + } + + public void setMinMax(int min, int max) { + minValue = min; + maxValue = max; + } + + @Override + protected void onDraw(Canvas canvas) { + int y = (getMeasuredHeight() - thumbSize) / 2; + int thumbX = (int)((getMeasuredWidth() - thumbSize) * progress); + canvas.drawRect(thumbSize / 2, getMeasuredHeight() / 2 - AndroidUtilities.dp(1), getMeasuredWidth() - thumbSize / 2, getMeasuredHeight() / 2 + AndroidUtilities.dp(1), innerPaint); + if (minValue == 0) { + canvas.drawRect(thumbSize / 2, getMeasuredHeight() / 2 - AndroidUtilities.dp(1), thumbX, getMeasuredHeight() / 2 + AndroidUtilities.dp(1), outerPaint); + } else { + if (progress > 0.5f) { + canvas.drawRect(getMeasuredWidth() / 2 - AndroidUtilities.dp(1), (getMeasuredHeight() - thumbSize) / 2, getMeasuredWidth() / 2, (getMeasuredHeight() + thumbSize) / 2, outerPaint); + canvas.drawRect(getMeasuredWidth() / 2, getMeasuredHeight() / 2 - AndroidUtilities.dp(1), thumbX, getMeasuredHeight() / 2 + AndroidUtilities.dp(1), outerPaint); + } else { + canvas.drawRect(getMeasuredWidth() / 2, (getMeasuredHeight() - thumbSize) / 2, getMeasuredWidth() / 2 + AndroidUtilities.dp(1), (getMeasuredHeight() + thumbSize) / 2, outerPaint); + canvas.drawRect(thumbX, getMeasuredHeight() / 2 - AndroidUtilities.dp(1), getMeasuredWidth() / 2, getMeasuredHeight() / 2 + AndroidUtilities.dp(1), outerPaint); + } + } + canvas.drawCircle(thumbX + thumbSize / 2, y + thumbSize / 2, thumbSize / 2, outerPaint); + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoFilterView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoFilterView.java new file mode 100644 index 000000000..5730ea768 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoFilterView.java @@ -0,0 +1,1647 @@ +/* + * This is the source code of Telegram for Android v. 2.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-2015. + */ + +package org.telegram.ui.Components; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.SurfaceTexture; +import android.opengl.GLES20; +import android.opengl.GLUtils; +import android.os.Build; +import android.os.Looper; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.MotionEvent; +import android.view.TextureView; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.TextView; + +import org.telegram.android.AndroidUtilities; +import org.telegram.android.LocaleController; +import org.telegram.messenger.DispatchQueue; +import org.telegram.messenger.FileLog; +import org.telegram.messenger.R; +import org.telegram.messenger.Utilities; +import org.telegram.ui.AnimationCompat.AnimatorListenerAdapterProxy; +import org.telegram.ui.AnimationCompat.AnimatorSetProxy; +import org.telegram.ui.AnimationCompat.ObjectAnimatorProxy; +import org.telegram.ui.AnimationCompat.ViewProxy; +import org.telegram.ui.Cells.PhotoEditToolCell; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; +import java.util.concurrent.Semaphore; + +import javax.microedition.khronos.egl.EGL10; +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.egl.EGLContext; +import javax.microedition.khronos.egl.EGLDisplay; +import javax.microedition.khronos.egl.EGLSurface; +import javax.microedition.khronos.opengles.GL; +import javax.microedition.khronos.opengles.GL10; + +public class PhotoFilterView extends FrameLayout { + + private boolean showOriginal; + + private float previousValue; + + private int selectedTool = -1; + private int enhanceTool = 0; + private int exposureTool = 1; + private int contrastTool = 2; + private int warmthTool = 3; + private int saturationTool = 4; + private int highlightsTool = 5; + private int shadowsTool = 6; + private int vignetteTool = 7; + private int grainTool = 8; + private int sharpenTool = 9; + + private float highlightsValue = 0; //0 100 + private float contrastValue = 0; //-100 100 + private float shadowsValue = 0; //0 100 + private float exposureValue = 0; //-100 100 + private float enhanceValue = 0; //0 100 + private float saturationValue = 0; //-100 100 + private float warmthValue = 0; //-100 100 + private float vignetteValue = 0; //0 100 + private float grainValue = 0; //0 100 + private float sharpenValue = 0; //0 100 + + private ToolsAdapter toolsAdapter; + private PhotoEditorSeekBar valueSeekBar; + private FrameLayout toolsView; + private FrameLayout editView; + private TextView paramTextView; + private TextView valueTextView; + private TextView doneTextView; + private TextView cancelTextView; + private TextureView textureView; + private EGLThread eglThread; + private RecyclerListView recyclerListView; + + private Bitmap bitmapToEdit; + private int orientation; + + public class EGLThread extends DispatchQueue { + + private final int EGL_CONTEXT_CLIENT_VERSION = 0x3098; + private final int EGL_OPENGL_ES2_BIT = 4; + private SurfaceTexture surfaceTexture; + private EGL10 egl10; + private EGLDisplay eglDisplay; + private EGLConfig eglConfig; + private EGLContext eglContext; + private EGLSurface eglSurface; + private GL gl; + private boolean initied; + + private Bitmap currentBitmap; + + private int rgbToHsvShaderProgram; + private int rgbToHsvPositionHandle; + private int rgbToHsvInputTexCoordHandle; + private int rgbToHsvSourceImageHandle; + + private int enhanceShaderProgram; + private int enhancePositionHandle; + private int enhanceInputTexCoordHandle; + private int enhanceSourceImageHandle; + private int enhanceIntensityHandle; + private int enhanceInputImageTexture2Handle; + + private int toolsShaderProgram; + private int positionHandle; + private int inputTexCoordHandle; + private int sourceImageHandle; + private int shadowsHandle; + private int highlightsHandle; + private int exposureHandle; + private int contrastHandle; + private int saturationHandle; + private int warmthHandle; + private int vignetteHandle; + private int grainHandle; + private int widthHandle; + private int heightHandle; + + private int sharpenShaderProgram; + private int sharpenHandle; + private int sharpenWidthHandle; + private int sharpenHeightHandle; + private int sharpenPositionHandle; + private int sharpenInputTexCoordHandle; + private int sharpenSourceImageHandle; + + private int simpleShaderProgram; + private int simplePositionHandle; + private int simpleInputTexCoordHandle; + private int simpleSourceImageHandle; + + private int[] enhanceTextures = new int[2]; + private int[] renderTexture = new int[2]; + private int[] renderFrameBuffer = new int[2]; + private boolean hsvGenerated; + private int renderBufferWidth; + private int renderBufferHeight; + private volatile int surfaceWidth; + private volatile int surfaceHeight; + + private FloatBuffer vertexBuffer; + private FloatBuffer textureBuffer; + private FloatBuffer vertexInvertBuffer; + + private final static int PGPhotoEnhanceHistogramBins = 256; + private final static int PGPhotoEnhanceSegments = 4; + + private static final String rgbToHsvFragmentShaderCode = + "precision highp float;" + + "varying vec2 texCoord;" + + "uniform sampler2D sourceImage;" + + "vec3 rgb_to_hsv(vec3 c) {" + + "vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);" + + "vec4 p = c.g < c.b ? vec4(c.bg, K.wz) : vec4(c.gb, K.xy);" + + "vec4 q = c.r < p.x ? vec4(p.xyw, c.r) : vec4(c.r, p.yzx);" + + "float d = q.x - min(q.w, q.y);" + + "float e = 1.0e-10;" + + "return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);" + + "}" + + "void main() {" + + "vec4 texel = texture2D(sourceImage, texCoord);" + + "gl_FragColor = vec4(rgb_to_hsv(texel.rgb), texel.a);" + + "}"; + + private static final String enhanceFragmentShaderCode = + "precision highp float;" + + "varying vec2 texCoord;" + + "uniform sampler2D sourceImage;" + + "uniform sampler2D inputImageTexture2;" + + "uniform float intensity;" + + "float enhance(float value) {" + + "const vec2 offset = vec2(0.001953125, 0.03125);" + + "value = value + offset.x;" + + "vec2 coord = (clamp(texCoord, 0.125, 1.0 - 0.125001) - 0.125) * 4.0;" + + "vec2 frac = fract(coord);" + + "coord = floor(coord);" + + "float p00 = float(coord.y * 4.0 + coord.x) * 0.0625 + offset.y;" + + "float p01 = float(coord.y * 4.0 + coord.x + 1.0) * 0.0625 + offset.y;" + + "float p10 = float((coord.y + 1.0) * 4.0 + coord.x) * 0.0625 + offset.y;" + + "float p11 = float((coord.y + 1.0) * 4.0 + coord.x + 1.0) * 0.0625 + offset.y;" + + "vec3 c00 = texture2D(inputImageTexture2, vec2(value, p00)).rgb;" + + "vec3 c01 = texture2D(inputImageTexture2, vec2(value, p01)).rgb;" + + "vec3 c10 = texture2D(inputImageTexture2, vec2(value, p10)).rgb;" + + "vec3 c11 = texture2D(inputImageTexture2, vec2(value, p11)).rgb;" + + "float c1 = ((c00.r - c00.g) / (c00.b - c00.g));" + + "float c2 = ((c01.r - c01.g) / (c01.b - c01.g));" + + "float c3 = ((c10.r - c10.g) / (c10.b - c10.g));" + + "float c4 = ((c11.r - c11.g) / (c11.b - c11.g));" + + "float c1_2 = mix(c1, c2, frac.x);" + + "float c3_4 = mix(c3, c4, frac.x);" + + "return mix(c1_2, c3_4, frac.y);" + + "}" + + "vec3 hsv_to_rgb(vec3 c) {" + + "vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);" + + "vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);" + + "return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);" + + "}" + + "void main() {" + + "vec4 texel = texture2D(sourceImage, texCoord);" + + "vec4 hsv = texel;" + + "hsv.y = min(1.0, hsv.y * 1.2);" + + "hsv.z = min(1.0, enhance(hsv.z) * 1.1);" + + "gl_FragColor = vec4(hsv_to_rgb(mix(texel.xyz, hsv.xyz, intensity)), texel.w);" + + "}"; + + private static final String simpleVertexShaderCode = + "attribute vec4 position;" + + "attribute vec2 inputTexCoord;" + + "varying vec2 texCoord;" + + "void main() {" + + "gl_Position = position;" + + "texCoord = inputTexCoord;" + + "}"; + + private static final String simpleFragmentShaderCode = + "varying highp vec2 texCoord;" + + "uniform sampler2D sourceImage;" + + "void main() {" + + "gl_FragColor = texture2D(sourceImage, texCoord);" + + "}"; + + private static final String sharpenVertexShaderCode = + "attribute vec4 position;" + + "attribute vec2 inputTexCoord;" + + "varying vec2 texCoord;" + + + "uniform highp float inputWidth;" + + "uniform highp float inputHeight;" + + "varying vec2 leftTexCoord;" + + "varying vec2 rightTexCoord;" + + "varying vec2 topTexCoord;" + + "varying vec2 bottomTexCoord;" + + + "void main() {" + + "gl_Position = position;" + + "texCoord = inputTexCoord;" + + "highp vec2 widthStep = vec2(1.0 / inputWidth, 0.0);" + + "highp vec2 heightStep = vec2(0.0, 1.0 / inputHeight);" + + "leftTexCoord = inputTexCoord - widthStep;" + + "rightTexCoord = inputTexCoord + widthStep;" + + "topTexCoord = inputTexCoord + heightStep;" + + "bottomTexCoord = inputTexCoord - heightStep;" + + "}"; + + private static final String sharpenFragmentShaderCode = + "precision highp float;" + + "varying vec2 texCoord;" + + "varying vec2 leftTexCoord;" + + "varying vec2 rightTexCoord;" + + "varying vec2 topTexCoord;" + + "varying vec2 bottomTexCoord;" + + "uniform sampler2D sourceImage;" + + "uniform float sharpen;" + + + "void main() {" + + "vec4 result = texture2D(sourceImage, texCoord);" + + + "vec3 leftTextureColor = texture2D(sourceImage, leftTexCoord).rgb;" + + "vec3 rightTextureColor = texture2D(sourceImage, rightTexCoord).rgb;" + + "vec3 topTextureColor = texture2D(sourceImage, topTexCoord).rgb;" + + "vec3 bottomTextureColor = texture2D(sourceImage, bottomTexCoord).rgb;" + + "result.rgb = result.rgb * (1.0 + 4.0 * sharpen) - (leftTextureColor + rightTextureColor + topTextureColor + bottomTextureColor) * sharpen;" + + + "gl_FragColor = result;" + + "}"; + + private static final String toolsFragmentShaderCode = + "precision highp float;" + + "varying vec2 texCoord;" + + "uniform float inputWidth;" + + "uniform float inputHeight;" + + "uniform sampler2D sourceImage;" + + "uniform float shadows;" + + "uniform float width;" + + "uniform float height;" + + "const vec3 hsLuminanceWeighting = vec3(0.3, 0.3, 0.3);" + + "uniform float highlights;" + + "uniform float exposure;" + + "uniform float contrast;" + + "const vec3 satLuminanceWeighting = vec3(0.2126, 0.7152, 0.0722);" + + "uniform float saturation;" + + "uniform float warmth;" + + "uniform float grain;" + + "const float permTexUnit = 1.0 / 256.0;" + + "const float permTexUnitHalf = 0.5 / 256.0;" + + "const float grainsize = 2.3;" + + "uniform float vignette;" + + "float getLuma(vec3 rgbP) { " + + "return (0.299 * rgbP.r) + (0.587 * rgbP.g) + (0.114 * rgbP.b); " + + "}" + + "vec3 rgbToYuv(vec3 inP) {" + + "vec3 outP;" + + "outP.r = getLuma(inP);" + + "outP.g = (1.0 / 1.772) * (inP.b - outP.r);" + + "outP.b = (1.0 / 1.402) * (inP.r - outP.r);" + + "return outP; " + + "}" + + "vec3 yuvToRgb(vec3 inP) {" + + "return vec3(1.402 * inP.b + inP.r, (inP.r - (0.299 * 1.402 / 0.587) * inP.b - (0.114 * 1.772 / 0.587) * inP.g), 1.772 * inP.g + inP.r);" + + "}" + + "float easeInOutSigmoid(float value, float strength) {" + + "float t = 1.0 / (1.0 - strength);" + + "if (value > 0.5) {" + + "return 1.0 - pow(2.0 - 2.0 * value, t) * 0.5;" + + "} else {" + + "return pow(2.0 * value, t) * 0.5; " + + "}" + + "}" + + "vec4 rnm(in vec2 tc) {" + + "float noise = sin(dot(tc,vec2(12.9898,78.233))) * 43758.5453;" + + "float noiseR = fract(noise)*2.0-1.0;" + + "float noiseG = fract(noise*1.2154)*2.0-1.0;" + + "float noiseB = fract(noise*1.3453)*2.0-1.0;" + + "float noiseA = fract(noise*1.3647)*2.0-1.0;" + + "return vec4(noiseR,noiseG,noiseB,noiseA);" + + "}" + + "float fade(in float t) {" + + "return t*t*t*(t*(t*6.0-15.0)+10.0);" + + "}" + + "float pnoise3D(in vec3 p) {" + + "vec3 pi = permTexUnit*floor(p)+permTexUnitHalf;" + + "vec3 pf = fract(p);" + + "float perm00 = rnm(pi.xy).a;" + + "vec3 grad000 = rnm(vec2(perm00, pi.z)).rgb * 4.0 - 1.0;" + + "float n000 = dot(grad000, pf);" + + "vec3 grad001 = rnm(vec2(perm00, pi.z + permTexUnit)).rgb * 4.0 - 1.0;" + + "float n001 = dot(grad001, pf - vec3(0.0, 0.0, 1.0));" + + "float perm01 = rnm(pi.xy + vec2(0.0, permTexUnit)).a;" + + "vec3 grad010 = rnm(vec2(perm01, pi.z)).rgb * 4.0 - 1.0;" + + "float n010 = dot(grad010, pf - vec3(0.0, 1.0, 0.0));" + + "vec3 grad011 = rnm(vec2(perm01, pi.z + permTexUnit)).rgb * 4.0 - 1.0;" + + "float n011 = dot(grad011, pf - vec3(0.0, 1.0, 1.0));" + + "float perm10 = rnm(pi.xy + vec2(permTexUnit, 0.0)).a;" + + "vec3 grad100 = rnm(vec2(perm10, pi.z)).rgb * 4.0 - 1.0;" + + "float n100 = dot(grad100, pf - vec3(1.0, 0.0, 0.0));" + + "vec3 grad101 = rnm(vec2(perm10, pi.z + permTexUnit)).rgb * 4.0 - 1.0;" + + "float n101 = dot(grad101, pf - vec3(1.0, 0.0, 1.0));" + + "float perm11 = rnm(pi.xy + vec2(permTexUnit, permTexUnit)).a;" + + "vec3 grad110 = rnm(vec2(perm11, pi.z)).rgb * 4.0 - 1.0;" + + "float n110 = dot(grad110, pf - vec3(1.0, 1.0, 0.0));" + + "vec3 grad111 = rnm(vec2(perm11, pi.z + permTexUnit)).rgb * 4.0 - 1.0;" + + "float n111 = dot(grad111, pf - vec3(1.0, 1.0, 1.0));" + + "vec4 n_x = mix(vec4(n000, n001, n010, n011), vec4(n100, n101, n110, n111), fade(pf.x));" + + "vec2 n_xy = mix(n_x.xy, n_x.zw, fade(pf.y));" + + "float n_xyz = mix(n_xy.x, n_xy.y, fade(pf.z));" + + "return n_xyz;" + + "}" + + "vec2 coordRot(in vec2 tc, in float angle) {" + + "float rotX = ((tc.x * 2.0 - 1.0) * cos(angle)) - ((tc.y * 2.0 - 1.0) * sin(angle));" + + "float rotY = ((tc.y * 2.0 - 1.0) * cos(angle)) + ((tc.x * 2.0 - 1.0) * sin(angle));" + + "return vec2(rotX * 0.5 + 0.5, rotY * 0.5 + 0.5);" + + "}" + + "void main() {" + + "vec4 result = texture2D(sourceImage, texCoord);" + + "const float toolEpsilon = 0.005;" + + + "float hsLuminance = dot(result.rgb, hsLuminanceWeighting);" + + "float shadow = clamp((pow(hsLuminance, 1.0 / (shadows + 1.0)) + (-0.76) * pow(hsLuminance, 2.0 / (shadows + 1.0))) - hsLuminance, 0.0, 1.0);" + + "float highlight = clamp((1.0 - (pow(1.0 - hsLuminance, 1.0 / (2.0 - highlights)) + (-0.8) * pow(1.0 - hsLuminance, 2.0 / (2.0 - highlights)))) - hsLuminance, -1.0, 0.0);" + + "vec3 shresult = (hsLuminance + shadow + highlight) * (result.rgb / hsLuminance);" + + "result = vec4(shresult.rgb, result.a);" + + + "if (abs(exposure) > toolEpsilon) {" + + "float mag = exposure * 1.045;" + + "float exppower = 1.0 + abs(mag);" + + "if (mag < 0.0) {" + + "exppower = 1.0 / exppower;" + + "}" + + "result.r = 1.0 - pow((1.0 - result.r), exppower);" + + "result.g = 1.0 - pow((1.0 - result.g), exppower);" + + "result.b = 1.0 - pow((1.0 - result.b), exppower);" + + "}" + + "result = vec4(((result.rgb - vec3(0.5)) * contrast + vec3(0.5)), result.a);" + + "float satLuminance = dot(result.rgb, satLuminanceWeighting);" + + "vec3 greyScaleColor = vec3(satLuminance);" + + "result = vec4(mix(greyScaleColor, result.rgb, saturation), result.a);" + + "if (abs(warmth) > toolEpsilon) {" + + "vec3 yuvVec; if (warmth > 0.0 ) {" + + "yuvVec = vec3(0.1765, -0.1255, 0.0902);" + + "} else {" + + "yuvVec = -vec3(0.0588, 0.1569, -0.1255);" + + "}" + + "vec3 yuvColor = rgbToYuv(result.rgb);" + + "float luma = yuvColor.r;" + + "float curveScale = sin(luma * 3.14159);" + + "yuvColor += 0.375 * warmth * curveScale * yuvVec;" + + "result.rgb = yuvToRgb(yuvColor);" + + "}" + + "if (abs(grain) > toolEpsilon) {" + + "vec3 rotOffset = vec3(1.425, 3.892, 5.835);" + + "vec2 rotCoordsR = coordRot(texCoord, rotOffset.x);" + + "vec3 noise = vec3(pnoise3D(vec3(rotCoordsR * vec2(width / grainsize, height / grainsize),0.0)));" + + "vec3 lumcoeff = vec3(0.299,0.587,0.114);" + + "float luminance = dot(result.rgb, lumcoeff);" + + "float lum = smoothstep(0.2, 0.0, luminance);" + + "lum += luminance;" + + "noise = mix(noise,vec3(0.0),pow(lum,4.0));" + + "result.rgb = result.rgb + noise * grain;" + + "}" + + "if (abs(vignette) > toolEpsilon) {" + + "const float midpoint = 0.7;" + + "const float fuzziness = 0.62;" + + "float radDist = length(texCoord - 0.5) / sqrt(0.5);" + + "float mag = easeInOutSigmoid(radDist * midpoint, fuzziness) * vignette * 0.645;" + + "result.rgb = mix(pow(result.rgb, vec3(1.0 / (1.0 - mag))), vec3(0.0), mag * mag);" + + "}" + + + "gl_FragColor = result;" + + "}"; + + public EGLThread(SurfaceTexture surface, Bitmap bitmap) { + super("EGLThread"); + surfaceTexture = surface; + currentBitmap = bitmap; + } + + private int loadShader(int type, String shaderCode) { + int shader = GLES20.glCreateShader(type); + GLES20.glShaderSource(shader, shaderCode); + GLES20.glCompileShader(shader); + int[] compileStatus = new int[1]; + GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compileStatus, 0); + if (compileStatus[0] == 0) { + GLES20.glDeleteShader(shader); + shader = 0; + } + return shader; + } + + private boolean initGL() { + egl10 = (EGL10) EGLContext.getEGL(); + + eglDisplay = egl10.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); + if (eglDisplay == EGL10.EGL_NO_DISPLAY) { + FileLog.e("tmessages", "eglGetDisplay failed " + GLUtils.getEGLErrorString(egl10.eglGetError())); + finish(); + return false; + } + + int[] version = new int[2]; + if (!egl10.eglInitialize(eglDisplay, version)) { + FileLog.e("tmessages", "eglInitialize failed " + GLUtils.getEGLErrorString(egl10.eglGetError())); + finish(); + return false; + } + + int[] configsCount = new int[1]; + EGLConfig[] configs = new EGLConfig[1]; + int[] configSpec = new int[] { + EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, + EGL10.EGL_RED_SIZE, 8, + EGL10.EGL_GREEN_SIZE, 8, + EGL10.EGL_BLUE_SIZE, 8, + EGL10.EGL_ALPHA_SIZE, 8, + EGL10.EGL_DEPTH_SIZE, 0, + EGL10.EGL_STENCIL_SIZE, 0, + EGL10.EGL_NONE + }; + if (!egl10.eglChooseConfig(eglDisplay, configSpec, configs, 1, configsCount)) { + FileLog.e("tmessages", "eglChooseConfig failed " + GLUtils.getEGLErrorString(egl10.eglGetError())); + finish(); + return false; + } else if (configsCount[0] > 0) { + eglConfig = configs[0]; + } else { + FileLog.e("tmessages", "eglConfig not initialized"); + finish(); + return false; + } + + int[] attrib_list = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE }; + eglContext = egl10.eglCreateContext(eglDisplay, eglConfig, EGL10.EGL_NO_CONTEXT, attrib_list); + if (eglContext == null) { + FileLog.e("tmessages", "eglCreateContext failed " + GLUtils.getEGLErrorString(egl10.eglGetError())); + finish(); + return false; + } + + if (surfaceTexture instanceof SurfaceTexture) { + eglSurface = egl10.eglCreateWindowSurface(eglDisplay, eglConfig, surfaceTexture, null); + } else { + finish(); + return false; + } + + if (eglSurface == null || eglSurface == EGL10.EGL_NO_SURFACE) { + FileLog.e("tmessages", "createWindowSurface failed " + GLUtils.getEGLErrorString(egl10.eglGetError())); + finish(); + return false; + } + if (!egl10.eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext)) { + FileLog.e("tmessages", "eglMakeCurrent failed " + GLUtils.getEGLErrorString(egl10.eglGetError())); + finish(); + return false; + } + gl = eglContext.getGL(); + + + float squareCoordinates[] = { + -1.0f, 1.0f, + 1.0f, 1.0f, + -1.0f, -1.0f, + 1.0f, -1.0f}; + + ByteBuffer bb = ByteBuffer.allocateDirect(squareCoordinates.length * 4); + bb.order(ByteOrder.nativeOrder()); + vertexBuffer = bb.asFloatBuffer(); + vertexBuffer.put(squareCoordinates); + vertexBuffer.position(0); + + float squareCoordinates2[] = { + -1.0f, -1.0f, + 1.0f, -1.0f, + -1.0f, 1.0f, + 1.0f, 1.0f}; + + bb = ByteBuffer.allocateDirect(squareCoordinates2.length * 4); + bb.order(ByteOrder.nativeOrder()); + vertexInvertBuffer = bb.asFloatBuffer(); + vertexInvertBuffer.put(squareCoordinates2); + vertexInvertBuffer.position(0); + + float textureCoordinates[] = { + 0.0f, 0.0f, + 1.0f, 0.0f, + 0.0f, 1.0f, + 1.0f, 1.0f, + }; + + bb = ByteBuffer.allocateDirect(textureCoordinates.length * 4); + bb.order(ByteOrder.nativeOrder()); + textureBuffer = bb.asFloatBuffer(); + textureBuffer.put(textureCoordinates); + textureBuffer.position(0); + + GLES20.glGenTextures(2, enhanceTextures, 0); + + int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, simpleVertexShaderCode); + int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, toolsFragmentShaderCode); + + if (vertexShader != 0 && fragmentShader != 0) { + toolsShaderProgram = GLES20.glCreateProgram(); + GLES20.glAttachShader(toolsShaderProgram, vertexShader); + GLES20.glAttachShader(toolsShaderProgram, fragmentShader); + GLES20.glBindAttribLocation(toolsShaderProgram, 0, "position"); + GLES20.glBindAttribLocation(toolsShaderProgram, 1, "inputTexCoord"); + + GLES20.glLinkProgram(toolsShaderProgram); + int[] linkStatus = new int[1]; + GLES20.glGetProgramiv(toolsShaderProgram, GLES20.GL_LINK_STATUS, linkStatus, 0); + if (linkStatus[0] == 0) { + /*String infoLog = GLES20.glGetProgramInfoLog(toolsShaderProgram); + FileLog.e("tmessages", "link error = " + infoLog);*/ + GLES20.glDeleteProgram(toolsShaderProgram); + toolsShaderProgram = 0; + } else { + positionHandle = GLES20.glGetAttribLocation(toolsShaderProgram, "position"); + inputTexCoordHandle = GLES20.glGetAttribLocation(toolsShaderProgram, "inputTexCoord"); + sourceImageHandle = GLES20.glGetUniformLocation(toolsShaderProgram, "sourceImage"); + shadowsHandle = GLES20.glGetUniformLocation(toolsShaderProgram, "shadows"); + highlightsHandle = GLES20.glGetUniformLocation(toolsShaderProgram, "highlights"); + exposureHandle = GLES20.glGetUniformLocation(toolsShaderProgram, "exposure"); + contrastHandle = GLES20.glGetUniformLocation(toolsShaderProgram, "contrast"); + saturationHandle = GLES20.glGetUniformLocation(toolsShaderProgram, "saturation"); + warmthHandle = GLES20.glGetUniformLocation(toolsShaderProgram, "warmth"); + vignetteHandle = GLES20.glGetUniformLocation(toolsShaderProgram, "vignette"); + grainHandle = GLES20.glGetUniformLocation(toolsShaderProgram, "grain"); + widthHandle = GLES20.glGetUniformLocation(toolsShaderProgram, "width"); + heightHandle = GLES20.glGetUniformLocation(toolsShaderProgram, "height"); + } + } else { + finish(); + return false; + } + + vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, sharpenVertexShaderCode); + fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, sharpenFragmentShaderCode); + + if (vertexShader != 0 && fragmentShader != 0) { + sharpenShaderProgram = GLES20.glCreateProgram(); + GLES20.glAttachShader(sharpenShaderProgram, vertexShader); + GLES20.glAttachShader(sharpenShaderProgram, fragmentShader); + GLES20.glBindAttribLocation(sharpenShaderProgram, 0, "position"); + GLES20.glBindAttribLocation(sharpenShaderProgram, 1, "inputTexCoord"); + + GLES20.glLinkProgram(sharpenShaderProgram); + int[] linkStatus = new int[1]; + GLES20.glGetProgramiv(sharpenShaderProgram, GLES20.GL_LINK_STATUS, linkStatus, 0); + if (linkStatus[0] == 0) { + GLES20.glDeleteProgram(sharpenShaderProgram); + sharpenShaderProgram = 0; + } else { + sharpenPositionHandle = GLES20.glGetAttribLocation(sharpenShaderProgram, "position"); + sharpenInputTexCoordHandle = GLES20.glGetAttribLocation(sharpenShaderProgram, "inputTexCoord"); + sharpenSourceImageHandle = GLES20.glGetUniformLocation(sharpenShaderProgram, "sourceImage"); + sharpenWidthHandle = GLES20.glGetUniformLocation(sharpenShaderProgram, "inputWidth"); + sharpenHeightHandle = GLES20.glGetUniformLocation(sharpenShaderProgram, "inputHeight"); + sharpenHandle = GLES20.glGetUniformLocation(sharpenShaderProgram, "sharpen"); + } + } else { + finish(); + return false; + } + + vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, simpleVertexShaderCode); + fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, rgbToHsvFragmentShaderCode); + if (vertexShader != 0 && fragmentShader != 0) { + rgbToHsvShaderProgram = GLES20.glCreateProgram(); + GLES20.glAttachShader(rgbToHsvShaderProgram, vertexShader); + GLES20.glAttachShader(rgbToHsvShaderProgram, fragmentShader); + GLES20.glBindAttribLocation(rgbToHsvShaderProgram, 0, "position"); + GLES20.glBindAttribLocation(rgbToHsvShaderProgram, 1, "inputTexCoord"); + + GLES20.glLinkProgram(rgbToHsvShaderProgram); + int[] linkStatus = new int[1]; + GLES20.glGetProgramiv(rgbToHsvShaderProgram, GLES20.GL_LINK_STATUS, linkStatus, 0); + if (linkStatus[0] == 0) { + GLES20.glDeleteProgram(rgbToHsvShaderProgram); + rgbToHsvShaderProgram = 0; + } else { + rgbToHsvPositionHandle = GLES20.glGetAttribLocation(rgbToHsvShaderProgram, "position"); + rgbToHsvInputTexCoordHandle = GLES20.glGetAttribLocation(rgbToHsvShaderProgram, "inputTexCoord"); + rgbToHsvSourceImageHandle = GLES20.glGetUniformLocation(rgbToHsvShaderProgram, "sourceImage"); + } + } else { + finish(); + return false; + } + + vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, simpleVertexShaderCode); + fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, enhanceFragmentShaderCode); + if (vertexShader != 0 && fragmentShader != 0) { + enhanceShaderProgram = GLES20.glCreateProgram(); + GLES20.glAttachShader(enhanceShaderProgram, vertexShader); + GLES20.glAttachShader(enhanceShaderProgram, fragmentShader); + GLES20.glBindAttribLocation(enhanceShaderProgram, 0, "position"); + GLES20.glBindAttribLocation(enhanceShaderProgram, 1, "inputTexCoord"); + + GLES20.glLinkProgram(enhanceShaderProgram); + int[] linkStatus = new int[1]; + GLES20.glGetProgramiv(enhanceShaderProgram, GLES20.GL_LINK_STATUS, linkStatus, 0); + if (linkStatus[0] == 0) { + GLES20.glDeleteProgram(enhanceShaderProgram); + enhanceShaderProgram = 0; + } else { + enhancePositionHandle = GLES20.glGetAttribLocation(enhanceShaderProgram, "position"); + enhanceInputTexCoordHandle = GLES20.glGetAttribLocation(enhanceShaderProgram, "inputTexCoord"); + enhanceSourceImageHandle = GLES20.glGetUniformLocation(enhanceShaderProgram, "sourceImage"); + enhanceIntensityHandle = GLES20.glGetUniformLocation(enhanceShaderProgram, "intensity"); + enhanceInputImageTexture2Handle = GLES20.glGetUniformLocation(enhanceShaderProgram, "inputImageTexture2"); + } + } else { + finish(); + return false; + } + + vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, simpleVertexShaderCode); + fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, simpleFragmentShaderCode); + if (vertexShader != 0 && fragmentShader != 0) { + simpleShaderProgram = GLES20.glCreateProgram(); + GLES20.glAttachShader(simpleShaderProgram, vertexShader); + GLES20.glAttachShader(simpleShaderProgram, fragmentShader); + GLES20.glBindAttribLocation(simpleShaderProgram, 0, "position"); + GLES20.glBindAttribLocation(simpleShaderProgram, 1, "inputTexCoord"); + + GLES20.glLinkProgram(simpleShaderProgram); + int[] linkStatus = new int[1]; + GLES20.glGetProgramiv(simpleShaderProgram, GLES20.GL_LINK_STATUS, linkStatus, 0); + if (linkStatus[0] == 0) { + GLES20.glDeleteProgram(simpleShaderProgram); + simpleShaderProgram = 0; + } else { + simplePositionHandle = GLES20.glGetAttribLocation(simpleShaderProgram, "position"); + simpleInputTexCoordHandle = GLES20.glGetAttribLocation(simpleShaderProgram, "inputTexCoord"); + simpleSourceImageHandle = GLES20.glGetUniformLocation(simpleShaderProgram, "sourceImage"); + } + } else { + finish(); + return false; + } + + if (currentBitmap != null) { + loadTexture(currentBitmap); + } + + return true; + } + + public void finish() { + if (eglSurface != null) { + egl10.eglMakeCurrent(eglDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT); + egl10.eglDestroySurface(eglDisplay, eglSurface); + eglSurface = null; + } + if (eglContext != null) { + egl10.eglDestroyContext(eglDisplay, eglContext); + eglContext = null; + } + if (eglDisplay != null) { + egl10.eglTerminate(eglDisplay); + eglDisplay = null; + } + } + + private Runnable drawRunnable = new Runnable() { + @Override + public void run() { + if (!initied) { + return; + } + + if (!eglContext.equals(egl10.eglGetCurrentContext()) || !eglSurface.equals(egl10.eglGetCurrentSurface(EGL10.EGL_DRAW))) { + if (!egl10.eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext)) { + FileLog.e("tmessages", "eglMakeCurrent failed " + GLUtils.getEGLErrorString(egl10.eglGetError())); + return; + } + } + + GLES20.glViewport(0, 0, renderBufferWidth, renderBufferHeight); + //enhance draw + if (!hsvGenerated) { + GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, renderFrameBuffer[0]); + GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, renderTexture[0], 0); + GLES20.glClear(0); + + GLES20.glUseProgram(rgbToHsvShaderProgram); + GLES20.glActiveTexture(GLES20.GL_TEXTURE0); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, renderTexture[1]); + GLES20.glUniform1i(rgbToHsvSourceImageHandle, 0); + GLES20.glEnableVertexAttribArray(rgbToHsvInputTexCoordHandle); + GLES20.glVertexAttribPointer(rgbToHsvInputTexCoordHandle, 2, GLES20.GL_FLOAT, false, 8, textureBuffer); + GLES20.glEnableVertexAttribArray(rgbToHsvPositionHandle); + GLES20.glVertexAttribPointer(rgbToHsvPositionHandle, 2, GLES20.GL_FLOAT, false, 8, vertexBuffer); + GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); + + ByteBuffer hsvBuffer = ByteBuffer.allocateDirect(renderBufferWidth * renderBufferHeight * 4); + GLES20.glReadPixels(0, 0, renderBufferWidth, renderBufferHeight, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, hsvBuffer); + + GLES20.glBindTexture(GL10.GL_TEXTURE_2D, enhanceTextures[0]); + GLES20.glTexParameteri(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); + GLES20.glTexParameteri(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); + GLES20.glTexParameteri(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE); + GLES20.glTexParameteri(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE); + GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, renderBufferWidth, renderBufferHeight, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, hsvBuffer); + + ByteBuffer buffer = null; + try { + buffer = ByteBuffer.allocateDirect(PGPhotoEnhanceSegments * PGPhotoEnhanceSegments * PGPhotoEnhanceHistogramBins * 4); + Utilities.calcCDT(hsvBuffer, renderBufferWidth, renderBufferHeight, buffer); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + + GLES20.glBindTexture(GL10.GL_TEXTURE_2D, enhanceTextures[1]); + GLES20.glTexParameteri(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); + GLES20.glTexParameteri(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); + GLES20.glTexParameteri(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE); + GLES20.glTexParameteri(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE); + GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, 256, 16, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, buffer); + + hsvGenerated = true; + } + + GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, renderFrameBuffer[1]); + GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, renderTexture[1], 0); + GLES20.glClear(0); + + GLES20.glUseProgram(enhanceShaderProgram); + GLES20.glActiveTexture(GLES20.GL_TEXTURE0); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, enhanceTextures[0]); + GLES20.glUniform1i(enhanceSourceImageHandle, 0); + GLES20.glActiveTexture(GLES20.GL_TEXTURE1); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, enhanceTextures[1]); + GLES20.glUniform1i(enhanceInputImageTexture2Handle, 1); + if (showOriginal) { + GLES20.glUniform1f(enhanceIntensityHandle, 0); + } else { + GLES20.glUniform1f(enhanceIntensityHandle, getEnhanceValue()); + } + + GLES20.glEnableVertexAttribArray(enhanceInputTexCoordHandle); + GLES20.glVertexAttribPointer(enhanceInputTexCoordHandle, 2, GLES20.GL_FLOAT, false, 8, textureBuffer); + GLES20.glEnableVertexAttribArray(enhancePositionHandle); + GLES20.glVertexAttribPointer(enhancePositionHandle, 2, GLES20.GL_FLOAT, false, 8, vertexBuffer); + GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); + + //sharpen draw + GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, renderFrameBuffer[0]); + GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, renderTexture[0], 0); + GLES20.glClear(0); + + GLES20.glUseProgram(sharpenShaderProgram); + GLES20.glActiveTexture(GLES20.GL_TEXTURE0); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, renderTexture[1]); + GLES20.glUniform1i(sharpenSourceImageHandle, 0); + if (showOriginal) { + GLES20.glUniform1f(sharpenHandle, 0); + } else { + GLES20.glUniform1f(sharpenHandle, getSharpenValue()); + } + GLES20.glUniform1f(sharpenWidthHandle, renderBufferWidth); + GLES20.glUniform1f(sharpenHeightHandle, renderBufferHeight); + GLES20.glEnableVertexAttribArray(sharpenInputTexCoordHandle); + GLES20.glVertexAttribPointer(sharpenInputTexCoordHandle, 2, GLES20.GL_FLOAT, false, 8, textureBuffer); + GLES20.glEnableVertexAttribArray(sharpenPositionHandle); + GLES20.glVertexAttribPointer(sharpenPositionHandle, 2, GLES20.GL_FLOAT, false, 8, vertexInvertBuffer); + GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); + + //custom params draw + GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, renderFrameBuffer[1]); + GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, renderTexture[1], 0); + GLES20.glClear(0); + + GLES20.glUseProgram(toolsShaderProgram); + GLES20.glActiveTexture(GLES20.GL_TEXTURE0); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, renderTexture[0]); + GLES20.glUniform1i(sourceImageHandle, 0); + if (showOriginal) { + GLES20.glUniform1f(shadowsHandle, 0); + GLES20.glUniform1f(highlightsHandle, 1); + GLES20.glUniform1f(exposureHandle, 0); + GLES20.glUniform1f(contrastHandle, 1); + GLES20.glUniform1f(saturationHandle, 1); + GLES20.glUniform1f(warmthHandle, 0); + GLES20.glUniform1f(vignetteHandle, 0); + GLES20.glUniform1f(grainHandle, 0); + } else { + GLES20.glUniform1f(shadowsHandle, getShadowsValue()); + GLES20.glUniform1f(highlightsHandle, getHighlightsValue()); + GLES20.glUniform1f(exposureHandle, getExposureValue()); + GLES20.glUniform1f(contrastHandle, getContrastValue()); + GLES20.glUniform1f(saturationHandle, getSaturationValue()); + GLES20.glUniform1f(warmthHandle, getWarmthValue()); + GLES20.glUniform1f(vignetteHandle, getVignetteValue()); + GLES20.glUniform1f(grainHandle, getGrainValue()); + } + GLES20.glUniform1f(widthHandle, renderBufferWidth); + GLES20.glUniform1f(heightHandle, renderBufferHeight); + GLES20.glEnableVertexAttribArray(inputTexCoordHandle); + GLES20.glVertexAttribPointer(inputTexCoordHandle, 2, GLES20.GL_FLOAT, false, 8, textureBuffer); + GLES20.glEnableVertexAttribArray(positionHandle); + GLES20.glVertexAttribPointer(positionHandle, 2, GLES20.GL_FLOAT, false, 8, vertexInvertBuffer); + GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); + + //onscreen draw + GLES20.glViewport(0, 0, surfaceWidth, surfaceHeight); + GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0); + GLES20.glClear(0); + + GLES20.glUseProgram(simpleShaderProgram); + GLES20.glActiveTexture(GLES20.GL_TEXTURE0); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, renderTexture[1]); + GLES20.glUniform1i(simpleSourceImageHandle, 0); + GLES20.glEnableVertexAttribArray(simpleInputTexCoordHandle); + GLES20.glVertexAttribPointer(simpleInputTexCoordHandle, 2, GLES20.GL_FLOAT, false, 8, textureBuffer); + GLES20.glEnableVertexAttribArray(simplePositionHandle); + GLES20.glVertexAttribPointer(simplePositionHandle, 2, GLES20.GL_FLOAT, false, 8, vertexBuffer); + GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); + egl10.eglSwapBuffers(eglDisplay, eglSurface); + } + }; + + private Bitmap getRenderBufferBitmap() { + ByteBuffer buffer = ByteBuffer.allocateDirect(renderBufferWidth * renderBufferHeight * 4); + GLES20.glReadPixels(0, 0, renderBufferWidth, renderBufferHeight, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, buffer); + Bitmap bitmap = Bitmap.createBitmap(renderBufferWidth, renderBufferHeight, Bitmap.Config.ARGB_8888); + bitmap.copyPixelsFromBuffer(buffer); + return bitmap; + } + + public Bitmap getTexture() { + if (!initied) { + return null; + } + final Semaphore semaphore = new Semaphore(0); + final Bitmap object[] = new Bitmap[1]; + try { + postRunnable(new Runnable() { + @Override + public void run() { + GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, renderFrameBuffer[1]); + GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, renderTexture[1], 0); + GLES20.glClear(0); + object[0] = getRenderBufferBitmap(); + semaphore.release(); + GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0); + GLES20.glClear(0); + } + }); + semaphore.acquire(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + return object[0]; + } + + private Bitmap createBitmap(Bitmap bitmap, int w, int h, float scale) { + Bitmap result = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(result); + Paint paint = new Paint(); + paint.setFilterBitmap(true); + + Matrix matrix = new Matrix(); + matrix.setScale(scale, scale); + matrix.postTranslate(-bitmap.getWidth() / 2, -bitmap.getHeight() / 2); + matrix.postRotate(orientation); + if (orientation == 90 || orientation == 270) { + matrix.postTranslate(bitmap.getHeight() / 2, bitmap.getWidth() / 2); + } else { + matrix.postTranslate(bitmap.getWidth() / 2, bitmap.getHeight() / 2); + } + canvas.drawBitmap(bitmap, matrix, paint); + try { + canvas.setBitmap(null); + } catch (Exception e) { + //don't promt, this will crash on 2.x + } + + return result; + } + + private void loadTexture(Bitmap bitmap) { + renderBufferWidth = bitmap.getWidth(); + renderBufferHeight = bitmap.getHeight(); + float maxSize = AndroidUtilities.getPhotoSize(); + if (renderBufferWidth > maxSize || renderBufferHeight > maxSize || orientation != 0) { + float scale = 1; + if (renderBufferWidth > maxSize || renderBufferHeight > maxSize) { + float scaleX = maxSize / bitmap.getWidth(); + float scaleY = maxSize / bitmap.getHeight(); + if (scaleX < scaleY) { + renderBufferWidth = (int) maxSize; + renderBufferHeight = (int) (bitmap.getHeight() * scaleX); + scale = scaleX; + } else { + renderBufferHeight = (int) maxSize; + renderBufferWidth = (int) (bitmap.getWidth() * scaleY); + scale = scaleY; + } + } + + if (orientation == 90 || orientation == 270) { + int temp = renderBufferWidth; + renderBufferWidth = renderBufferHeight; + renderBufferHeight = temp; + } + + currentBitmap = createBitmap(bitmap, renderBufferWidth, renderBufferHeight, scale); + } + GLES20.glGenFramebuffers(2, renderFrameBuffer, 0); + GLES20.glGenTextures(2, renderTexture, 0); + + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, renderTexture[0]); + GLES20.glTexParameteri(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); + GLES20.glTexParameteri(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); + GLES20.glTexParameteri(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE); + GLES20.glTexParameteri(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE); + GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, renderBufferWidth, renderBufferHeight, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null); + + GLES20.glBindTexture(GL10.GL_TEXTURE_2D, renderTexture[1]); + GLES20.glTexParameteri(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); + GLES20.glTexParameteri(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); + GLES20.glTexParameteri(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE); + GLES20.glTexParameteri(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE); + GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, currentBitmap, 0); + } + + public void shutdown() { + postRunnable(new Runnable() { + @Override + public void run() { + finish(); + currentBitmap = null; + Looper looper = Looper.myLooper(); + if (looper != null) { + looper.quit(); + } + } + }); + } + + public void setSurfaceTextureSize(int width, int height) { + surfaceWidth = width; + surfaceHeight = height; + } + + @Override + public void run() { + initied = initGL(); + super.run(); + } + + public void requestRender() { + cancelRunnable(drawRunnable); + postRunnable(drawRunnable); + } + } + + public PhotoFilterView(Context context, Bitmap bitmap, int rotation) { + super(context); + + bitmapToEdit = bitmap; + orientation = rotation; + + textureView = new TextureView(context); + addView(textureView); + textureView.setVisibility(INVISIBLE); + LayoutParams layoutParams = (LayoutParams) textureView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.gravity = Gravity.TOP | Gravity.LEFT; + textureView.setLayoutParams(layoutParams); + textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { + @Override + public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { + if (eglThread == null && surface != null) { + eglThread = new EGLThread(surface, bitmapToEdit); + eglThread.setSurfaceTextureSize(width, height); + eglThread.requestRender(); + } + } + + @Override + public void onSurfaceTextureSizeChanged(SurfaceTexture surface, final int width, final int height) { + if (eglThread != null) { + eglThread.setSurfaceTextureSize(width, height); + eglThread.requestRender(); + eglThread.postRunnable(new Runnable() { + @Override + public void run() { + eglThread.requestRender(); + } + }); + } + } + + @Override + public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { + if (eglThread != null) { + eglThread.shutdown(); + eglThread = null; + } + return true; + } + + @Override + public void onSurfaceTextureUpdated(SurfaceTexture surface) { + + } + }); + + toolsView = new FrameLayout(context); + addView(toolsView); + layoutParams = (LayoutParams) toolsView.getLayoutParams(); + layoutParams.width = LayoutParams.MATCH_PARENT; + layoutParams.height = AndroidUtilities.dp(126); + layoutParams.gravity = Gravity.LEFT | Gravity.BOTTOM; + toolsView.setLayoutParams(layoutParams); + + FrameLayout frameLayout = new FrameLayout(context); + frameLayout.setBackgroundColor(0xff1a1a1a); + toolsView.addView(frameLayout); + layoutParams = (LayoutParams) frameLayout.getLayoutParams(); + layoutParams.width = LayoutParams.MATCH_PARENT; + layoutParams.height = AndroidUtilities.dp(48); + layoutParams.gravity = Gravity.BOTTOM | Gravity.LEFT; + frameLayout.setLayoutParams(layoutParams); + + cancelTextView = new TextView(context); + cancelTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + cancelTextView.setTextColor(0xffffffff); + cancelTextView.setGravity(Gravity.CENTER); + cancelTextView.setBackgroundResource(R.drawable.bar_selector_picker); + cancelTextView.setPadding(AndroidUtilities.dp(29), 0, AndroidUtilities.dp(29), 0); + cancelTextView.setText(LocaleController.getString("Cancel", R.string.Cancel).toUpperCase()); + cancelTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + frameLayout.addView(cancelTextView); + layoutParams = (LayoutParams) cancelTextView.getLayoutParams(); + layoutParams.width = LayoutParams.WRAP_CONTENT; + layoutParams.height = LayoutParams.MATCH_PARENT; + layoutParams.gravity = Gravity.TOP | Gravity.LEFT; + cancelTextView.setLayoutParams(layoutParams); + + doneTextView = new TextView(context); + doneTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + doneTextView.setTextColor(0xff51bdf3); + doneTextView.setGravity(Gravity.CENTER); + doneTextView.setBackgroundResource(R.drawable.bar_selector_picker); + doneTextView.setPadding(AndroidUtilities.dp(29), 0, AndroidUtilities.dp(29), 0); + doneTextView.setText(LocaleController.getString("Done", R.string.Done).toUpperCase()); + doneTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + frameLayout.addView(doneTextView); + layoutParams = (LayoutParams) doneTextView.getLayoutParams(); + layoutParams.width = LayoutParams.WRAP_CONTENT; + layoutParams.height = LayoutParams.MATCH_PARENT; + layoutParams.gravity = Gravity.TOP | Gravity.RIGHT; + doneTextView.setLayoutParams(layoutParams); + + recyclerListView = new RecyclerListView(context); + LinearLayoutManager layoutManager = new LinearLayoutManager(context); + layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); + recyclerListView.setLayoutManager(layoutManager); + recyclerListView.setClipToPadding(false); + if (Build.VERSION.SDK_INT >= 9) { + recyclerListView.setOverScrollMode(RecyclerListView.OVER_SCROLL_NEVER); + } + recyclerListView.setAdapter(toolsAdapter = new ToolsAdapter(context)); + toolsView.addView(recyclerListView); + layoutParams = (FrameLayout.LayoutParams) recyclerListView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = AndroidUtilities.dp(60); + layoutParams.gravity = Gravity.LEFT | Gravity.TOP; + recyclerListView.setLayoutParams(layoutParams); + recyclerListView.addOnItemTouchListener(new RecyclerListView.RecyclerListViewItemClickListener(context, new RecyclerListView.OnItemClickListener() { + @Override + public void onItemClick(View view, int i) { + selectedTool = i; + if (i == enhanceTool) { + previousValue = enhanceValue; + valueSeekBar.setMinMax(0, 100); + paramTextView.setText(LocaleController.getString("Enhance", R.string.Enhance)); + } else if (i == highlightsTool) { + previousValue = highlightsValue; + valueSeekBar.setMinMax(0, 100); + paramTextView.setText(LocaleController.getString("Highlights", R.string.Highlights)); + } else if (i == contrastTool) { + previousValue = contrastValue; + valueSeekBar.setMinMax(-100, 100); + paramTextView.setText(LocaleController.getString("Contrast", R.string.Contrast)); + } else if (i == exposureTool) { + previousValue = exposureValue; + valueSeekBar.setMinMax(-100, 100); + paramTextView.setText(LocaleController.getString("Exposure", R.string.Exposure)); + } else if (i == warmthTool) { + previousValue = warmthValue; + valueSeekBar.setMinMax(-100, 100); + paramTextView.setText(LocaleController.getString("Warmth", R.string.Warmth)); + } else if (i == saturationTool) { + previousValue = saturationValue; + valueSeekBar.setMinMax(-100, 100); + paramTextView.setText(LocaleController.getString("Saturation", R.string.Saturation)); + } else if (i == vignetteTool) { + previousValue = vignetteValue; + valueSeekBar.setMinMax(0, 100); + paramTextView.setText(LocaleController.getString("Vignette", R.string.Vignette)); + } else if (i == shadowsTool) { + previousValue = shadowsValue; + valueSeekBar.setMinMax(0, 100); + paramTextView.setText(LocaleController.getString("Shadows", R.string.Shadows)); + } else if (i == grainTool) { + previousValue = grainValue; + valueSeekBar.setMinMax(0, 100); + paramTextView.setText(LocaleController.getString("Grain", R.string.Grain)); + } else if (i == sharpenTool) { + previousValue = sharpenValue; + valueSeekBar.setMinMax(0, 100); + paramTextView.setText(LocaleController.getString("Sharpen", R.string.Sharpen)); + } + valueSeekBar.setProgress((int) previousValue, false); + updateValueTextView(); + switchToOrFromEditMode(); + } + })); + + editView = new FrameLayout(context); + editView.setVisibility(GONE); + addView(editView); + layoutParams = (LayoutParams) editView.getLayoutParams(); + layoutParams.width = LayoutParams.MATCH_PARENT; + layoutParams.height = AndroidUtilities.dp(126); + layoutParams.gravity = Gravity.LEFT | Gravity.BOTTOM; + editView.setLayoutParams(layoutParams); + + frameLayout = new FrameLayout(context); + frameLayout.setBackgroundColor(0xff1a1a1a); + editView.addView(frameLayout); + layoutParams = (LayoutParams) frameLayout.getLayoutParams(); + layoutParams.width = LayoutParams.MATCH_PARENT; + layoutParams.height = AndroidUtilities.dp(48); + layoutParams.gravity = Gravity.BOTTOM | Gravity.LEFT; + frameLayout.setLayoutParams(layoutParams); + + ImageView imageView = new ImageView(context); + imageView.setImageResource(R.drawable.edit_cancel); + imageView.setBackgroundResource(R.drawable.bar_selector_picker); + imageView.setPadding(AndroidUtilities.dp(22), 0, AndroidUtilities.dp(22), 0); + frameLayout.addView(imageView); + layoutParams = (LayoutParams) imageView.getLayoutParams(); + layoutParams.width = LayoutParams.WRAP_CONTENT; + layoutParams.height = LayoutParams.MATCH_PARENT; + layoutParams.gravity = Gravity.TOP | Gravity.LEFT; + imageView.setLayoutParams(layoutParams); + imageView.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + if (selectedTool == enhanceTool) { + enhanceValue = previousValue; + } else if (selectedTool == highlightsTool) { + highlightsValue = previousValue; + } else if (selectedTool == contrastTool) { + contrastValue = previousValue; + } else if (selectedTool == exposureTool) { + exposureValue = previousValue; + } else if (selectedTool == warmthTool) { + warmthValue = previousValue; + } else if (selectedTool == saturationTool) { + saturationValue = previousValue; + } else if (selectedTool == vignetteTool) { + vignetteValue = previousValue; + } else if (selectedTool == shadowsTool) { + shadowsValue = previousValue; + } else if (selectedTool == grainTool) { + grainValue = previousValue; + } else if (selectedTool == sharpenTool) { + sharpenValue = previousValue; + } + eglThread.requestRender(); + switchToOrFromEditMode(); + } + }); + + imageView = new ImageView(context); + imageView.setImageResource(R.drawable.edit_doneblue); + imageView.setBackgroundResource(R.drawable.bar_selector_picker); + imageView.setPadding(AndroidUtilities.dp(22), AndroidUtilities.dp(1), AndroidUtilities.dp(22), 0); + frameLayout.addView(imageView); + layoutParams = (LayoutParams) imageView.getLayoutParams(); + layoutParams.width = LayoutParams.WRAP_CONTENT; + layoutParams.height = LayoutParams.MATCH_PARENT; + layoutParams.gravity = Gravity.TOP | Gravity.RIGHT; + imageView.setLayoutParams(layoutParams); + imageView.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + toolsAdapter.notifyDataSetChanged(); + switchToOrFromEditMode(); + } + }); + + paramTextView = new TextView(context); + paramTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 12); + paramTextView.setTextColor(0xff808080); + frameLayout.addView(paramTextView); + layoutParams = (LayoutParams) paramTextView.getLayoutParams(); + layoutParams.width = LayoutParams.WRAP_CONTENT; + layoutParams.height = LayoutParams.WRAP_CONTENT; + layoutParams.gravity = Gravity.CENTER_HORIZONTAL; + layoutParams.topMargin = AndroidUtilities.dp(26); + paramTextView.setLayoutParams(layoutParams); + + valueTextView = new TextView(context); + valueTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); + valueTextView.setTextColor(0xffffffff); + frameLayout.addView(valueTextView); + layoutParams = (LayoutParams) valueTextView.getLayoutParams(); + layoutParams.width = LayoutParams.WRAP_CONTENT; + layoutParams.height = LayoutParams.WRAP_CONTENT; + layoutParams.gravity = Gravity.CENTER_HORIZONTAL; + layoutParams.topMargin = AndroidUtilities.dp(3); + valueTextView.setLayoutParams(layoutParams); + + valueSeekBar = new PhotoEditorSeekBar(context); + valueSeekBar.setDelegate(new PhotoEditorSeekBar.PhotoEditorSeekBarDelegate() { + @Override + public void onProgressChanged() { + int progress = valueSeekBar.getProgress(); + if (selectedTool == enhanceTool) { + enhanceValue = progress; + } else if (selectedTool == highlightsTool) { + highlightsValue = progress; + } else if (selectedTool == contrastTool) { + contrastValue = progress; + } else if (selectedTool == exposureTool) { + exposureValue = progress; + } else if (selectedTool == warmthTool) { + warmthValue = progress; + } else if (selectedTool == saturationTool) { + saturationValue = progress; + } else if (selectedTool == vignetteTool) { + vignetteValue = progress; + } else if (selectedTool == shadowsTool) { + shadowsValue = progress; + } else if (selectedTool == grainTool) { + grainValue = progress; + } else if (selectedTool == sharpenTool) { + sharpenValue = progress; + } + updateValueTextView(); + if (eglThread != null) { + eglThread.requestRender(); + } + } + }); + editView.addView(valueSeekBar); + layoutParams = (FrameLayout.LayoutParams) valueSeekBar.getLayoutParams(); + layoutParams.height = AndroidUtilities.dp(60); + layoutParams.leftMargin = AndroidUtilities.dp(14); + layoutParams.rightMargin = AndroidUtilities.dp(14); + layoutParams.topMargin = AndroidUtilities.dp(10); + if (AndroidUtilities.isTablet()) { + layoutParams.width = AndroidUtilities.dp(498); + layoutParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP; + } else { + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.gravity = Gravity.LEFT | Gravity.TOP; + } + valueSeekBar.setLayoutParams(layoutParams); + } + + private void updateValueTextView() { + int value = 0; + if (selectedTool == enhanceTool) { + value = (int) enhanceValue; + } else if (selectedTool == highlightsTool) { + value = (int) highlightsValue; + } else if (selectedTool == contrastTool) { + value = (int) contrastValue; + } else if (selectedTool == exposureTool) { + value = (int) exposureValue; + } else if (selectedTool == warmthTool) { + value = (int) warmthValue; + } else if (selectedTool == saturationTool) { + value = (int) saturationValue; + } else if (selectedTool == vignetteTool) { + value = (int) vignetteValue; + } else if (selectedTool == shadowsTool) { + value = (int) shadowsValue; + } else if (selectedTool == grainTool) { + value = (int) grainValue; + } else if (selectedTool == sharpenTool) { + value = (int) sharpenValue; + } + if (value > 0) { + valueTextView.setText("+" + value); + } else { + valueTextView.setText("" + value); + } + } + + public boolean hasChanges() { + return enhanceValue != 0 || contrastValue != 0 || highlightsValue != 0 || exposureValue != 0 || warmthValue != 0 || saturationValue != 0 || vignetteValue != 0 || + shadowsValue != 0 || grainValue != 0 || sharpenValue != 0; + } + + public void onTouch(MotionEvent event) { + if (event.getActionMasked() == MotionEvent.ACTION_DOWN || event.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN) { + LayoutParams layoutParams = (LayoutParams) textureView.getLayoutParams(); + if (layoutParams != null && event.getX() >= layoutParams.leftMargin && event.getY() >= layoutParams.topMargin && event.getX() <= layoutParams.leftMargin + layoutParams.width && event.getY() <= layoutParams.topMargin + layoutParams.height) { + setShowOriginal(true); + } + } else if (event.getActionMasked() == MotionEvent.ACTION_UP || event.getActionMasked() == MotionEvent.ACTION_POINTER_UP) { + setShowOriginal(false); + } + } + + public void setShowOriginal(boolean value) { + if (showOriginal == value) { + return; + } + showOriginal = value; + if (eglThread != null) { + eglThread.requestRender(); + } + } + + public void switchToOrFromEditMode() { + final View viewFrom; + final View viewTo; + if (editView.getVisibility() == GONE) { + viewFrom = toolsView; + viewTo = editView; + } else { + selectedTool = -1; + viewFrom = editView; + viewTo = toolsView; + } + + AnimatorSetProxy animatorSet = new AnimatorSetProxy(); + animatorSet.playTogether( + ObjectAnimatorProxy.ofFloat(viewFrom, "translationY", 0, AndroidUtilities.dp(126)) + ); + animatorSet.addListener(new AnimatorListenerAdapterProxy() { + @Override + public void onAnimationEnd(Object animation) { + viewFrom.clearAnimation(); + viewFrom.setVisibility(GONE); + viewTo.setVisibility(VISIBLE); + ViewProxy.setTranslationY(viewTo, AndroidUtilities.dp(126)); + + AnimatorSetProxy animatorSet = new AnimatorSetProxy(); + animatorSet.playTogether( + ObjectAnimatorProxy.ofFloat(viewTo, "translationY", 0) + ); + animatorSet.addListener(new AnimatorListenerAdapterProxy() { + @Override + public void onAnimationEnd(Object animation) { + viewTo.clearAnimation(); + if (selectedTool == enhanceTool) { + checkEnhance(); + } + } + }); + animatorSet.setDuration(200); + animatorSet.start(); + } + }); + animatorSet.setDuration(200); + animatorSet.start(); + } + + public void shutdown() { + if (eglThread != null) { + eglThread.shutdown(); + eglThread = null; + } + textureView.setVisibility(GONE); + } + + public void init() { + textureView.setVisibility(VISIBLE); + } + + public Bitmap getBitmap() { + return eglThread.getTexture(); + } + + private void fixLayout(int viewWidth, int viewHeight) { + if (bitmapToEdit == null) { + return; + } + + viewWidth -= AndroidUtilities.dp(28); + viewHeight -= AndroidUtilities.dp(14 + 140); + + float bitmapW = bitmapToEdit.getWidth(); + float bitmapH = bitmapToEdit.getHeight(); + if (orientation == 90 || orientation == 270) { + bitmapW = bitmapToEdit.getHeight(); + bitmapH = bitmapToEdit.getWidth(); + } else { + bitmapW = bitmapToEdit.getWidth(); + bitmapH = bitmapToEdit.getHeight(); + } + float scaleX = viewWidth / bitmapW; + float scaleY = viewHeight / bitmapH; + if (scaleX > scaleY) { + bitmapH = viewHeight; + bitmapW = (int) Math.ceil(bitmapW * scaleY); + } else { + bitmapW = viewWidth; + bitmapH = (int) Math.ceil(bitmapH * scaleX); + } + + int bitmapX = (int) Math.ceil((viewWidth - bitmapW) / 2 + AndroidUtilities.dp(14)); + int bitmapY = (int) Math.ceil((viewHeight - bitmapH) / 2 + AndroidUtilities.dp(14)); + + LayoutParams layoutParams = (LayoutParams) textureView.getLayoutParams(); + layoutParams.leftMargin = bitmapX; + layoutParams.topMargin = bitmapY; + layoutParams.width = (int) bitmapW; + layoutParams.height = (int) bitmapH; + textureView.setLayoutParams(layoutParams); + + if (AndroidUtilities.isTablet()) { + int total = AndroidUtilities.dp(86) * 10; + layoutParams = (FrameLayout.LayoutParams) recyclerListView.getLayoutParams(); + if (total < viewWidth) { + layoutParams.width = total; + layoutParams.leftMargin = (viewWidth - total) / 2; + } else { + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.leftMargin = 0; + } + recyclerListView.setLayoutParams(layoutParams); + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + fixLayout(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec)); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + + private float getShadowsValue() { + return (shadowsValue / 100.0f) * 0.65f; + } + + private float getHighlightsValue() { + return 1 - (highlightsValue / 100.0f); + } + + private float getEnhanceValue() { + return (enhanceValue / 100.0f); + } + + private float getExposureValue() { + return (exposureValue / 100.0f); + } + + private float getContrastValue() { + return (contrastValue / 100.0f) * 0.3f + 1; + } + + private float getWarmthValue() { + return warmthValue / 100.0f; + } + + private float getVignetteValue() { + return vignetteValue / 100.0f; + } + + private float getSharpenValue() { + return 0.11f + sharpenValue / 100.0f * 0.6f; + } + + private float getGrainValue() { + return grainValue / 100.0f * 0.04f; + } + + private float getSaturationValue() { + float parameterValue = (saturationValue / 100.0f); + if (parameterValue > 0) { + parameterValue *= 1.05f; + } + return parameterValue += 1; + } + + public FrameLayout getToolsView() { + return toolsView; + } + + public FrameLayout getEditView() { + return editView; + } + + public TextView getDoneTextView() { + return doneTextView; + } + + public TextView getCancelTextView() { + return cancelTextView; + } + + public void setEditViewFirst() { + selectedTool = 0; + previousValue = enhanceValue; + enhanceValue = 50; + valueSeekBar.setMinMax(0, 100); + paramTextView.setText(LocaleController.getString("Enhance", R.string.Enhance)); + editView.setVisibility(VISIBLE); + toolsView.setVisibility(GONE); + valueSeekBar.setProgress(50, false); + updateValueTextView(); + } + + private void checkEnhance() { + if (enhanceValue == 0) { + AnimatorSetProxy animatorSetProxy = new AnimatorSetProxy(); + animatorSetProxy.setDuration(200); + animatorSetProxy.playTogether(ObjectAnimatorProxy.ofInt(valueSeekBar, "progress", 50)); + animatorSetProxy.start(); + } + } + + public class ToolsAdapter extends RecyclerView.Adapter { + + private Context mContext; + + private class Holder extends RecyclerView.ViewHolder { + + public Holder(View itemView) { + super(itemView); + } + } + + public ToolsAdapter(Context context) { + mContext = context; + } + + @Override + public int getItemCount() { + return 10; + } + + @Override + public long getItemId(int i) { + return i; + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { + PhotoEditToolCell view = new PhotoEditToolCell(mContext); + return new Holder(view); + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) { + Holder holder = (Holder) viewHolder; + if (i == enhanceTool) { + ((PhotoEditToolCell) holder.itemView).setIconAndTextAndValue(R.drawable.tool_enhance, LocaleController.getString("Enhance", R.string.Enhance), enhanceValue); + } else if (i == highlightsTool) { + ((PhotoEditToolCell) holder.itemView).setIconAndTextAndValue(R.drawable.tool_highlights, LocaleController.getString("Highlights", R.string.Highlights), highlightsValue); + } else if (i == contrastTool) { + ((PhotoEditToolCell) holder.itemView).setIconAndTextAndValue(R.drawable.tool_contrast, LocaleController.getString("Contrast", R.string.Contrast), contrastValue); + } else if (i == exposureTool) { + ((PhotoEditToolCell) holder.itemView).setIconAndTextAndValue(R.drawable.tool_brightness, LocaleController.getString("Exposure", R.string.Exposure), exposureValue); + } else if (i == warmthTool) { + ((PhotoEditToolCell) holder.itemView).setIconAndTextAndValue(R.drawable.tool_warmth, LocaleController.getString("Warmth", R.string.Warmth), warmthValue); + } else if (i == saturationTool) { + ((PhotoEditToolCell) holder.itemView).setIconAndTextAndValue(R.drawable.tool_saturation, LocaleController.getString("Saturation", R.string.Saturation), saturationValue); + } else if (i == vignetteTool) { + ((PhotoEditToolCell) holder.itemView).setIconAndTextAndValue(R.drawable.tool_vignette, LocaleController.getString("Vignette", R.string.Vignette), vignetteValue); + } else if (i == shadowsTool) { + ((PhotoEditToolCell) holder.itemView).setIconAndTextAndValue(R.drawable.tool_shadows, LocaleController.getString("Shadows", R.string.Shadows), shadowsValue); + } else if (i == grainTool) { + ((PhotoEditToolCell) holder.itemView).setIconAndTextAndValue(R.drawable.tool_grain, LocaleController.getString("Grain", R.string.Grain), grainValue); + } else if (i == sharpenTool) { + ((PhotoEditToolCell) holder.itemView).setIconAndTextAndValue(R.drawable.tool_details, LocaleController.getString("Sharpen", R.string.Sharpen), sharpenValue); + } + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoPickerBottomLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoPickerBottomLayout.java index 97fc7e756..fb6db0a09 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoPickerBottomLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoPickerBottomLayout.java @@ -20,52 +20,43 @@ import org.telegram.android.AndroidUtilities; import org.telegram.android.LocaleController; import org.telegram.messenger.R; -public class PhotoPickerBottomLayout extends LinearLayout { +public class PhotoPickerBottomLayout extends FrameLayout { - public FrameLayout doneButton; + public LinearLayout doneButton; public TextView cancelButton; public TextView doneButtonTextView; public TextView doneButtonBadgeTextView; public PhotoPickerBottomLayout(Context context) { super(context); - setBackgroundColor(0xff333333); - setOrientation(HORIZONTAL); + setBackgroundColor(0xff1a1a1a); cancelButton = new TextView(context); cancelButton.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); cancelButton.setTextColor(0xffffffff); cancelButton.setGravity(Gravity.CENTER); cancelButton.setBackgroundResource(R.drawable.bar_selector_picker); - cancelButton.setPadding(AndroidUtilities.dp(3), 0, 0, 0); + cancelButton.setPadding(AndroidUtilities.dp(29), 0, AndroidUtilities.dp(29), 0); cancelButton.setText(LocaleController.getString("Cancel", R.string.Cancel).toUpperCase()); cancelButton.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); addView(cancelButton); LayoutParams layoutParams = (LayoutParams) cancelButton.getLayoutParams(); - layoutParams.width = 0; + layoutParams.width = LayoutParams.WRAP_CONTENT; layoutParams.height = LayoutParams.MATCH_PARENT; - layoutParams.weight = 1; + layoutParams.gravity = Gravity.TOP | Gravity.LEFT; cancelButton.setLayoutParams(layoutParams); - doneButton = new FrameLayout(context); + doneButton = new LinearLayout(context); + doneButton.setOrientation(LinearLayout.HORIZONTAL); doneButton.setBackgroundResource(R.drawable.bar_selector_picker); - doneButton.setPadding(0, 0, AndroidUtilities.dp(3), 0); + doneButton.setPadding(AndroidUtilities.dp(29), 0, AndroidUtilities.dp(29), 0); addView(doneButton); layoutParams = (LayoutParams) doneButton.getLayoutParams(); - layoutParams.width = 0; + layoutParams.width = LayoutParams.WRAP_CONTENT; layoutParams.height = LayoutParams.MATCH_PARENT; - layoutParams.weight = 1; + layoutParams.gravity = Gravity.TOP | Gravity.RIGHT; doneButton.setLayoutParams(layoutParams); - LinearLayout linearLayout = new LinearLayout(context); - linearLayout.setOrientation(HORIZONTAL); - doneButton.addView(linearLayout); - FrameLayout.LayoutParams layoutParams1 = (FrameLayout.LayoutParams) linearLayout.getLayoutParams(); - layoutParams1.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams1.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams1.gravity = Gravity.CENTER; - linearLayout.setLayoutParams(layoutParams1); - doneButtonBadgeTextView = new TextView(context); doneButtonBadgeTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); doneButtonBadgeTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); @@ -74,28 +65,27 @@ public class PhotoPickerBottomLayout extends LinearLayout { doneButtonBadgeTextView.setBackgroundResource(R.drawable.photobadge); doneButtonBadgeTextView.setMinWidth(AndroidUtilities.dp(23)); doneButtonBadgeTextView.setPadding(AndroidUtilities.dp(8), 0, AndroidUtilities.dp(8), AndroidUtilities.dp(1)); - linearLayout.addView(doneButtonBadgeTextView); - layoutParams = (LayoutParams) doneButtonBadgeTextView.getLayoutParams(); - layoutParams.width = LayoutParams.WRAP_CONTENT; - layoutParams.height = AndroidUtilities.dp(23); - layoutParams.rightMargin = AndroidUtilities.dp(10); - doneButtonBadgeTextView.setLayoutParams(layoutParams); + doneButton.addView(doneButtonBadgeTextView); + LinearLayout.LayoutParams layoutParams1 = (LinearLayout.LayoutParams) doneButtonBadgeTextView.getLayoutParams(); + layoutParams1.width = LayoutParams.WRAP_CONTENT; + layoutParams1.height = AndroidUtilities.dp(23); + layoutParams1.rightMargin = AndroidUtilities.dp(10); + layoutParams1.gravity = Gravity.CENTER_VERTICAL; + doneButtonBadgeTextView.setLayoutParams(layoutParams1); doneButtonTextView = new TextView(context); doneButtonTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); doneButtonTextView.setTextColor(0xffffffff); doneButtonTextView.setGravity(Gravity.CENTER); doneButtonTextView.setCompoundDrawablePadding(AndroidUtilities.dp(8)); - doneButtonTextView.setBackgroundResource(R.drawable.bar_selector_picker); - doneButtonTextView.setPadding(AndroidUtilities.dp(3), 0, 0, 0); doneButtonTextView.setText(LocaleController.getString("Send", R.string.Send).toUpperCase()); doneButtonTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); - linearLayout.addView(doneButtonTextView); - layoutParams = (LayoutParams) doneButtonTextView.getLayoutParams(); - layoutParams.width = LayoutParams.WRAP_CONTENT; - layoutParams.gravity = Gravity.CENTER_VERTICAL; - layoutParams.height = LayoutParams.WRAP_CONTENT; - doneButtonTextView.setLayoutParams(layoutParams); + doneButton.addView(doneButtonTextView); + layoutParams1 = (LinearLayout.LayoutParams) doneButtonTextView.getLayoutParams(); + layoutParams1.width = LayoutParams.WRAP_CONTENT; + layoutParams1.gravity = Gravity.CENTER_VERTICAL; + layoutParams1.height = LayoutParams.WRAP_CONTENT; + doneButtonTextView.setLayoutParams(layoutParams1); } public void updateSelectedCount(int count, boolean disable) { @@ -103,12 +93,10 @@ public class PhotoPickerBottomLayout extends LinearLayout { doneButtonBadgeTextView.setVisibility(View.GONE); if (disable) { - doneButtonTextView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.selectphoto_small_grey, 0, 0, 0); doneButtonTextView.setTextColor(0xff999999); doneButton.setEnabled(false); } else { doneButtonTextView.setTextColor(0xffffffff); - doneButtonTextView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.selectphoto_small_active, 0, 0, 0); } } else { doneButtonTextView.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/SectionsListView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/SectionsListView.java index 0d833ee41..a9d4daf79 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/SectionsListView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SectionsListView.java @@ -1,9 +1,9 @@ /* - * This is the source code of Telegram for Android v. 1.7.x. + * This is the source code of Telegram for Android v. 2.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-2014. + * Copyright Nikolai Kudashov, 2013-2015. */ package org.telegram.ui.Components; @@ -12,7 +12,6 @@ import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; import android.view.View; -import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.ListAdapter; import android.widget.ListView; @@ -22,18 +21,12 @@ import org.telegram.android.LocaleController; import org.telegram.messenger.FileLog; import org.telegram.ui.Adapters.BaseSectionsAdapter; -import java.util.ArrayList; - public class SectionsListView extends ListView implements AbsListView.OnScrollListener { - private ArrayList headers = new ArrayList(); - private ArrayList headersCache = new ArrayList(); + private View pinnedHeader; private OnScrollListener mOnScrollListener; private BaseSectionsAdapter mAdapter; - private int currentFirst = -1; - private int currentVisible = -1; - private int startSection; - private int sectionsCount; + private int currentStartSection = -1; public SectionsListView(Context context) { super(context); @@ -55,8 +48,7 @@ public class SectionsListView extends ListView implements AbsListView.OnScrollLi if (mAdapter == adapter) { return; } - headers.clear(); - headersCache.clear(); + pinnedHeader = null; if (adapter instanceof BaseSectionsAdapter) { mAdapter = (BaseSectionsAdapter) adapter; } else { @@ -74,69 +66,38 @@ public class SectionsListView extends ListView implements AbsListView.OnScrollLi return; } - headersCache.addAll(headers); - headers.clear(); - if (mAdapter.getCount() == 0) { return; } - if (currentFirst != firstVisibleItem || currentVisible != visibleItemCount) { - currentFirst = firstVisibleItem; - currentVisible = visibleItemCount; - - sectionsCount = 1; - startSection = mAdapter.getSectionForPosition(firstVisibleItem); - int itemNum = firstVisibleItem + mAdapter.getCountForSection(startSection) - mAdapter.getPositionInSectionForPosition(firstVisibleItem); - while (true) { - if (itemNum >= firstVisibleItem + visibleItemCount) { - break; - } - itemNum += mAdapter.getCountForSection(startSection + sectionsCount); - sectionsCount++; - } + int startSection = mAdapter.getSectionForPosition(firstVisibleItem); + if (currentStartSection != startSection || pinnedHeader == null) { + pinnedHeader = getSectionHeaderView(startSection, pinnedHeader); + currentStartSection = startSection; } - int itemNum = firstVisibleItem; - for (int a = startSection; a < startSection + sectionsCount; a++) { - View header = null; - if (!headersCache.isEmpty()) { - header = headersCache.get(0); - headersCache.remove(0); - } - header = getSectionHeaderView(a, header); - headers.add(header); - int count = mAdapter.getCountForSection(a); - if (a == startSection) { - int pos = mAdapter.getPositionInSectionForPosition(itemNum); - if (pos == count - 1) { - header.setTag(-header.getHeight()); - } else if (pos == count - 2) { - View child = getChildAt(itemNum - firstVisibleItem); - int headerTop = 0; - if (child != null) { - headerTop = child.getTop(); - } else { - headerTop = -AndroidUtilities.dp(100); - } - if (headerTop < 0) { - header.setTag(headerTop); - } else { - header.setTag(0); - } - } else { - header.setTag(0); + int count = mAdapter.getCountForSection(startSection); + + int pos = mAdapter.getPositionInSectionForPosition(firstVisibleItem); + if (pos == count - 1) { + View child = getChildAt(0); + int headerHeight = pinnedHeader.getHeight(); + int headerTop = 0; + if (child != null) { + int available = child.getTop() + child.getHeight(); + if (available < headerHeight) { + headerTop = available - headerHeight; } - itemNum += count - mAdapter.getPositionInSectionForPosition(firstVisibleItem); } else { - View child = getChildAt(itemNum - firstVisibleItem); - if (child != null) { - header.setTag(child.getTop()); - } else { - header.setTag(-AndroidUtilities.dp(100)); - } - itemNum += count; + headerTop = -AndroidUtilities.dp(100); } + if (headerTop < 0) { + pinnedHeader.setTag(headerTop); + } else { + pinnedHeader.setTag(0); + } + } else { + pinnedHeader.setTag(0); } invalidate(); @@ -161,19 +122,16 @@ public class SectionsListView extends ListView implements AbsListView.OnScrollLi @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); - if (mAdapter == null || headers.isEmpty()) { + if (mAdapter == null || pinnedHeader == null) { return; } - for (View header : headers) { - ensurePinnedHeaderLayout(header, true); - } + ensurePinnedHeaderLayout(pinnedHeader, true); } private void ensurePinnedHeaderLayout(View header, boolean forceLayout) { if (header.isLayoutRequested() || forceLayout) { - ViewGroup.LayoutParams layoutParams = header.getLayoutParams(); - int heightSpec = MeasureSpec.makeMeasureSpec(layoutParams.height, MeasureSpec.EXACTLY); - int widthSpec = MeasureSpec.makeMeasureSpec(layoutParams.width, MeasureSpec.EXACTLY); + int widthSpec = MeasureSpec.makeMeasureSpec(getMeasuredWidth(), MeasureSpec.EXACTLY); + int heightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); try { header.measure(widthSpec, heightSpec); } catch (Exception e) { @@ -186,20 +144,15 @@ public class SectionsListView extends ListView implements AbsListView.OnScrollLi @Override protected void dispatchDraw(Canvas canvas) { super.dispatchDraw(canvas); - if (mAdapter == null || headers.isEmpty()) { + if (mAdapter == null || pinnedHeader == null) { return; } - for (View header : headers) { - int saveCount = canvas.save(); - int top = (Integer)header.getTag(); - canvas.translate(LocaleController.isRTL ? getWidth() - header.getWidth() : 0, top); - canvas.clipRect(0, 0, getWidth(), header.getMeasuredHeight()); - if (top < 0) { - canvas.saveLayerAlpha(0, top, header.getWidth(), top + canvas.getHeight(), (int)(255 * (1.0f + (float)top / (float)header.getMeasuredHeight())), Canvas.HAS_ALPHA_LAYER_SAVE_FLAG); - } - header.draw(canvas); - canvas.restoreToCount(saveCount); - } + int saveCount = canvas.save(); + int top = (Integer)pinnedHeader.getTag(); + canvas.translate(LocaleController.isRTL ? getWidth() - pinnedHeader.getWidth() : 0, top); + canvas.clipRect(0, 0, getWidth(), pinnedHeader.getMeasuredHeight()); + pinnedHeader.draw(canvas); + canvas.restoreToCount(saveCount); } @Override @@ -207,7 +160,7 @@ public class SectionsListView extends ListView implements AbsListView.OnScrollLi mOnScrollListener = l; } - public void setOnItemClickListener(SectionsListView.OnItemClickListener listener) { + public void setOnItemClickListener(OnItemClickListener listener) { super.setOnItemClickListener(listener); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/SizeNotifierRelativeLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/SizeNotifierRelativeLayout.java index 214f320f8..61e685895 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/SizeNotifierRelativeLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SizeNotifierRelativeLayout.java @@ -11,6 +11,7 @@ package org.telegram.ui.Components; import android.content.Context; import android.graphics.Canvas; import android.graphics.Rect; +import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.view.View; import android.widget.RelativeLayout; @@ -22,7 +23,8 @@ public class SizeNotifierRelativeLayout extends RelativeLayout { private Rect rect = new Rect(); private Drawable backgroundDrawable; - public SizeNotifierRelativeLayoutDelegate delegate; + private int keyboardHeight; + private SizeNotifierRelativeLayoutDelegate delegate; public abstract interface SizeNotifierRelativeLayoutDelegate { public abstract void onSizeChanged(int keyboardHeight); @@ -56,6 +58,10 @@ public class SizeNotifierRelativeLayout extends RelativeLayout { return backgroundDrawable; } + public void setDelegate(SizeNotifierRelativeLayoutDelegate delegate) { + this.delegate = delegate; + } + @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); @@ -63,7 +69,7 @@ public class SizeNotifierRelativeLayout extends RelativeLayout { View rootView = this.getRootView(); int usableViewHeight = rootView.getHeight() - AndroidUtilities.statusBarHeight - AndroidUtilities.getViewInset(rootView); this.getWindowVisibleDisplayFrame(rect); - int keyboardHeight = usableViewHeight - (rect.bottom - rect.top); + keyboardHeight = usableViewHeight - (rect.bottom - rect.top); delegate.onSizeChanged(keyboardHeight); } } @@ -71,15 +77,20 @@ public class SizeNotifierRelativeLayout extends RelativeLayout { @Override protected void onDraw(Canvas canvas) { if (backgroundDrawable != null) { - float scaleX = (float)getMeasuredWidth() / (float)backgroundDrawable.getIntrinsicWidth(); - float scaleY = (float)getMeasuredHeight() / (float)backgroundDrawable.getIntrinsicHeight(); - float scale = scaleX < scaleY ? scaleY : scaleX; - int width = (int)Math.ceil(backgroundDrawable.getIntrinsicWidth() * scale); - int height = (int)Math.ceil(backgroundDrawable.getIntrinsicHeight() * scale); - int x = (getMeasuredWidth() - width) / 2; - int y = (getMeasuredHeight() - height) / 2; - backgroundDrawable.setBounds(x, y, x + width, y + height); - backgroundDrawable.draw(canvas); + if (backgroundDrawable instanceof ColorDrawable) { + backgroundDrawable.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight()); + backgroundDrawable.draw(canvas); + } else { + float scaleX = (float) getMeasuredWidth() / (float) backgroundDrawable.getIntrinsicWidth(); + float scaleY = (float) (getMeasuredHeight() + keyboardHeight) / (float) backgroundDrawable.getIntrinsicHeight(); + float scale = scaleX < scaleY ? scaleY : scaleX; + int width = (int) Math.ceil(backgroundDrawable.getIntrinsicWidth() * scale); + int height = (int) Math.ceil(backgroundDrawable.getIntrinsicHeight() * scale); + int x = (getMeasuredWidth() - width) / 2; + int y = (getMeasuredHeight() - height + keyboardHeight) / 2; + backgroundDrawable.setBounds(x, y, x + width, y + height); + backgroundDrawable.draw(canvas); + } } else { super.onDraw(canvas); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ContactAddActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ContactAddActivity.java index 19e7c29d6..b41814bdd 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ContactAddActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ContactAddActivity.java @@ -78,7 +78,7 @@ public class ContactAddActivity extends BaseFragment implements NotificationCent } @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { if (fragmentView == null) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java index 97dbea03b..9e44dcc0d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java @@ -15,6 +15,7 @@ import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.text.InputType; +import android.util.TypedValue; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; @@ -47,7 +48,7 @@ import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.ActionBarMenu; import org.telegram.ui.ActionBar.ActionBarMenuItem; import org.telegram.ui.ActionBar.BaseFragment; -import org.telegram.ui.Components.SectionsListView; +import org.telegram.ui.Components.LetterSectionsListView; import java.util.ArrayList; import java.util.HashMap; @@ -56,7 +57,7 @@ public class ContactsActivity extends BaseFragment implements NotificationCenter private BaseSectionsAdapter listViewAdapter; private TextView emptyTextView; - private SectionsListView listView; + private LetterSectionsListView listView; private ContactsSearchAdapter searchListViewAdapter; private boolean searchWas; @@ -87,6 +88,7 @@ public class ContactsActivity extends BaseFragment implements NotificationCenter NotificationCenter.getInstance().addObserver(this, NotificationCenter.contactsDidLoaded); NotificationCenter.getInstance().addObserver(this, NotificationCenter.updateInterfaces); NotificationCenter.getInstance().addObserver(this, NotificationCenter.encryptedChatCreated); + NotificationCenter.getInstance().addObserver(this, NotificationCenter.closeChats); if (arguments != null) { onlyUsers = getArguments().getBoolean("onlyUsers", false); destroyAfterSelect = arguments.getBoolean("destroyAfterSelect", false); @@ -109,11 +111,12 @@ public class ContactsActivity extends BaseFragment implements NotificationCenter NotificationCenter.getInstance().removeObserver(this, NotificationCenter.contactsDidLoaded); NotificationCenter.getInstance().removeObserver(this, NotificationCenter.updateInterfaces); NotificationCenter.getInstance().removeObserver(this, NotificationCenter.encryptedChatCreated); + NotificationCenter.getInstance().removeObserver(this, NotificationCenter.closeChats); delegate = null; } @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { if (fragmentView == null) { searching = false; searchWas = false; @@ -124,7 +127,11 @@ public class ContactsActivity extends BaseFragment implements NotificationCenter if (returnAsResult) { actionBar.setTitle(LocaleController.getString("SelectContact", R.string.SelectContact)); } else { - actionBar.setTitle(LocaleController.getString("NewMessageTitle", R.string.NewMessageTitle)); + if (createSecretChat) { + actionBar.setTitle(LocaleController.getString("NewSecretChat", R.string.NewSecretChat)); + } else { + actionBar.setTitle(LocaleController.getString("NewMessageTitle", R.string.NewMessageTitle)); + } } } else { actionBar.setTitle(LocaleController.getString("Contacts", R.string.Contacts)); @@ -151,7 +158,6 @@ public class ContactsActivity extends BaseFragment implements NotificationCenter searchListViewAdapter.searchDialogs(null); searching = false; searchWas = false; - ViewGroup group = (ViewGroup) listView.getParent(); listView.setAdapter(listViewAdapter); listViewAdapter.notifyDataSetChanged(); if (android.os.Build.VERSION.SDK_INT >= 11) { @@ -211,7 +217,7 @@ public class ContactsActivity extends BaseFragment implements NotificationCenter emptyTextView = new TextView(getParentActivity()); emptyTextView.setTextColor(0xff808080); - emptyTextView.setTextSize(20); + emptyTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); emptyTextView.setGravity(Gravity.CENTER); emptyTextView.setText(LocaleController.getString("NoContacts", R.string.NoContacts)); emptyTextLayout.addView(emptyTextView); @@ -229,7 +235,7 @@ public class ContactsActivity extends BaseFragment implements NotificationCenter layoutParams1.weight = 0.5f; frameLayout.setLayoutParams(layoutParams1); - listView = new SectionsListView(getParentActivity()); + listView = new LetterSectionsListView(getParentActivity()); listView.setEmptyView(emptyTextLayout); listView.setVerticalScrollBarEnabled(false); listView.setDivider(null); @@ -289,24 +295,24 @@ public class ContactsActivity extends BaseFragment implements NotificationCenter Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TEXT, ContactsController.getInstance().getInviteText()); - getParentActivity().startActivity(Intent.createChooser(intent, "")); + getParentActivity().startActivityForResult(Intent.createChooser(intent, LocaleController.getString("InviteFriends", R.string.InviteFriends)), 500); } catch (Exception e) { FileLog.e("tmessages", e); } } } else { if (row == 0) { - presentFragment(new GroupCreateActivity(), true); + presentFragment(new GroupCreateActivity(), false); } else if (row == 1) { Bundle args = new Bundle(); args.putBoolean("onlyUsers", true); args.putBoolean("destroyAfterSelect", true); args.putBoolean("createSecretChat", true); - presentFragment(new ContactsActivity(args), true); + presentFragment(new ContactsActivity(args), false); } else if (row == 2) { Bundle args = new Bundle(); args.putBoolean("broadcast", true); - presentFragment(new GroupCreateActivity(args), true); + presentFragment(new GroupCreateActivity(args), false); } } } else { @@ -348,7 +354,7 @@ public class ContactsActivity extends BaseFragment implements NotificationCenter try { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.fromParts("sms", arg1, null)); intent.putExtra("sms_body", LocaleController.getString("InviteText", R.string.InviteText)); - getParentActivity().startActivity(intent); + getParentActivity().startActivityForResult(intent, 500); } catch (Exception e) { FileLog.e("tmessages", e); } @@ -462,8 +468,13 @@ public class ContactsActivity extends BaseFragment implements NotificationCenter TLRPC.EncryptedChat encryptedChat = (TLRPC.EncryptedChat)args[0]; Bundle args2 = new Bundle(); args2.putInt("enc_id", encryptedChat.id); + NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats); presentFragment(new ChatActivity(args2), true); } + } else if (id == NotificationCenter.closeChats) { + if (!creatingChat) { + removeSelfFromStack(); + } } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/CountrySelectActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/CountrySelectActivity.java index e1607f583..3b48f411e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/CountrySelectActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/CountrySelectActivity.java @@ -32,7 +32,7 @@ import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.ActionBarMenu; import org.telegram.ui.ActionBar.ActionBarMenuItem; import org.telegram.ui.ActionBar.BaseFragment; -import org.telegram.ui.Components.SectionsListView; +import org.telegram.ui.Components.LetterSectionsListView; public class CountrySelectActivity extends BaseFragment { @@ -40,7 +40,7 @@ public class CountrySelectActivity extends BaseFragment { public abstract void didSelectCountry(String name); } - private SectionsListView listView; + private LetterSectionsListView listView; private TextView emptyTextView; private CountryAdapter listViewAdapter; private CountrySearchAdapter searchListViewAdapter; @@ -61,7 +61,7 @@ public class CountrySelectActivity extends BaseFragment { } @Override - public View createView(LayoutInflater inflater, final ViewGroup container) { + public View createView(LayoutInflater inflater) { if (fragmentView == null) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); @@ -88,7 +88,6 @@ public class CountrySelectActivity extends BaseFragment { searchListViewAdapter.search(null); searching = false; searchWas = false; - ViewGroup group = (ViewGroup) listView.getParent(); listView.setAdapter(listViewAdapter); if (android.os.Build.VERSION.SDK_INT >= 11) { listView.setFastScrollAlwaysVisible(true); @@ -165,7 +164,7 @@ public class CountrySelectActivity extends BaseFragment { layoutParams1.weight = 0.5f; frameLayout.setLayoutParams(layoutParams1); - listView = new SectionsListView(getParentActivity()); + listView = new LetterSectionsListView(getParentActivity()); listView.setEmptyView(emptyTextLayout); listView.setVerticalScrollBarEnabled(false); listView.setDivider(null); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/DocumentSelectActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/DocumentSelectActivity.java index 177c9ae0b..b2229753d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/DocumentSelectActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/DocumentSelectActivity.java @@ -65,7 +65,7 @@ public class DocumentSelectActivity extends BaseFragment { private ArrayList items = new ArrayList<>(); private boolean receiverRegistered = false; private ArrayList history = new ArrayList<>(); - private long sizeLimit = 1024 * 1024 * 1024; + private long sizeLimit = 1024 * 1024 * 1536; private DocumentSelectActivityDelegate delegate; private HashMap selectedFiles = new HashMap<>(); private ArrayList actionModeViews = new ArrayList<>(); @@ -125,7 +125,7 @@ public class DocumentSelectActivity extends BaseFragment { } @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { if (!receiverRegistered) { receiverRegistered = true; IntentFilter filter = new IntentFilter(); @@ -194,7 +194,7 @@ public class DocumentSelectActivity extends BaseFragment { actionModeViews.add(actionMode.addItem(done, R.drawable.ic_ab_done_gray, R.drawable.bar_selector_mode, null, AndroidUtilities.dp(54))); - fragmentView = inflater.inflate(R.layout.document_select_layout, container, false); + fragmentView = inflater.inflate(R.layout.document_select_layout, null, false); listAdapter = new ListAdapter(getParentActivity()); emptyView = (TextView)fragmentView.findViewById(R.id.searchEmptyView); emptyView.setOnTouchListener(new View.OnTouchListener() { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java index 07dc0a608..02ee365c1 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java @@ -54,7 +54,7 @@ import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.ActionBarMenu; import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.Cells.UserCell; -import org.telegram.ui.Components.SectionsListView; +import org.telegram.ui.Components.LetterSectionsListView; import java.util.ArrayList; import java.util.HashMap; @@ -93,7 +93,7 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen private ContactsAdapter listViewAdapter; private TextView emptyTextView; private EditText userSelectEditText; - private SectionsListView listView; + private LetterSectionsListView listView; private ContactsSearchAdapter searchListViewAdapter; private GroupCreateActivityDelegate delegate; @@ -141,7 +141,7 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen } @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { if (fragmentView == null) { searching = false; searchWas = false; @@ -307,7 +307,6 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen searchListViewAdapter.searchDialogs(null); searching = false; searchWas = false; - ViewGroup group = (ViewGroup) listView.getParent(); listView.setAdapter(listViewAdapter); listViewAdapter.notifyDataSetChanged(); if (android.os.Build.VERSION.SDK_INT >= 11) { @@ -357,7 +356,7 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen layoutParams.weight = 0.5f; frameLayout2.setLayoutParams(layoutParams); - listView = new SectionsListView(getParentActivity()); + listView = new LetterSectionsListView(getParentActivity()); listView.setEmptyView(emptyTextLayout); listView.setVerticalScrollBarEnabled(false); listView.setDivider(null); @@ -434,7 +433,6 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen searchListViewAdapter.searchDialogs(null); searching = false; searchWas = false; - ViewGroup group = (ViewGroup) listView.getParent(); listView.setAdapter(listViewAdapter); listViewAdapter.notifyDataSetChanged(); if (android.os.Build.VERSION.SDK_INT >= 11) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java index ab3fd663f..c5974180b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java @@ -85,7 +85,7 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati avatarUpdater.parentFragment = this; avatarUpdater.delegate = this; selectedContacts = getArguments().getIntegerArrayList("result"); - final ArrayList usersToLoad = new ArrayList(); + final ArrayList usersToLoad = new ArrayList<>(); for (Integer uid : selectedContacts) { if (MessagesController.getInstance().getUser(uid) == null) { usersToLoad.add(uid); @@ -93,7 +93,7 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati } if (!usersToLoad.isEmpty()) { final Semaphore semaphore = new Semaphore(0); - final ArrayList users = new ArrayList(); + final ArrayList users = new ArrayList<>(); MessagesStorage.getInstance().getStorageQueue().postRunnable(new Runnable() { @Override public void run() { @@ -138,7 +138,7 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati } @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { if (fragmentView == null) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); @@ -402,6 +402,7 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati FileLog.e("tmessages", e); } } + NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats); Bundle args2 = new Bundle(); args2.putInt("chat_id", (Integer)args[0]); presentFragment(new ChatActivity(args2), true); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/IdenticonActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/IdenticonActivity.java index a4a591998..88ae3a8b7 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/IdenticonActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/IdenticonActivity.java @@ -45,7 +45,7 @@ public class IdenticonActivity extends BaseFragment { } @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { if (fragmentView == null) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); @@ -60,7 +60,7 @@ public class IdenticonActivity extends BaseFragment { } }); - fragmentView = inflater.inflate(R.layout.identicon_layout, container, false); + fragmentView = inflater.inflate(R.layout.identicon_layout, null, false); ImageView identiconView = (ImageView) fragmentView.findViewById(R.id.identicon_view); TextView textView = (TextView)fragmentView.findViewById(R.id.identicon_text); TLRPC.EncryptedChat encryptedChat = MessagesController.getInstance().getEncryptedChat(chat_id); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LanguageSelectActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LanguageSelectActivity.java index 0744b1ab3..e73f58576 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LanguageSelectActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LanguageSelectActivity.java @@ -52,7 +52,7 @@ public class LanguageSelectActivity extends BaseFragment { public ArrayList searchResult; @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { if (fragmentView == null) { searching = false; searchWas = false; @@ -285,7 +285,7 @@ public class LanguageSelectActivity extends BaseFragment { return; } long time = System.currentTimeMillis(); - ArrayList resultArray = new ArrayList(); + ArrayList resultArray = new ArrayList<>(); for (LocaleController.LocaleInfo c : LocaleController.getInstance().sortedLanguages) { if (c.name.toLowerCase().startsWith(query) || c.nameEnglish.toLowerCase().startsWith(query)) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LastSeenActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LastSeenActivity.java index daefea9ca..79cd7c00f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LastSeenActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LastSeenActivity.java @@ -99,7 +99,7 @@ public class LastSeenActivity extends BaseFragment implements NotificationCenter } @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { if (fragmentView == null) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LastSeenUsersActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LastSeenUsersActivity.java index 4f8347b18..a80b2d774 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LastSeenUsersActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LastSeenUsersActivity.java @@ -75,7 +75,7 @@ public class LastSeenUsersActivity extends BaseFragment implements NotificationC } @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { if (fragmentView == null) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java index ea916e6af..952492d01 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java @@ -59,6 +59,7 @@ import org.telegram.ui.Adapters.DrawerLayoutAdapter; import org.telegram.ui.ActionBar.ActionBarLayout; import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.DrawerLayoutContainer; +import org.telegram.ui.Components.PasscodeView; import java.io.BufferedReader; import java.io.InputStream; @@ -89,9 +90,16 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa private ImageView backgroundTablet; private DrawerLayoutContainer drawerLayoutContainer; private DrawerLayoutAdapter drawerLayoutAdapter; + private PasscodeView passcodeView; + + private Intent passcodeSaveIntent; + private boolean passcodeSaveIntentIsNew; + private boolean passcodeSaveIntentIsRestore; private boolean tabletFullSize; + private Runnable lockRunnable; + @Override protected void onCreate(Bundle savedInstanceState) { ApplicationLoader.postInitApplication(); @@ -122,6 +130,10 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa super.onCreate(savedInstanceState); + if (UserConfig.passcodeHash.length() != 0 && UserConfig.appLocked) { + UserConfig.lastPauseTime = ConnectionsManager.getInstance().getCurrentTime(); + } + int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { AndroidUtilities.statusBarHeight = getResources().getDimensionPixelSize(resourceId); @@ -276,7 +288,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TEXT, ContactsController.getInstance().getInviteText()); - startActivity(Intent.createChooser(intent, "")); + startActivityForResult(Intent.createChooser(intent, LocaleController.getString("InviteFriends", R.string.InviteFriends)), 500); } catch (Exception e) { FileLog.e("tmessages", e); } @@ -287,7 +299,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa } else if (position == 9) { try { Intent pickIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(LocaleController.getString("TelegramFaqUrl", R.string.TelegramFaqUrl))); - startActivity(pickIntent); + startActivityForResult(pickIntent, 500); } catch (Exception e) { FileLog.e("tmessages", e); } @@ -301,6 +313,15 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa actionBarLayout.init(mainFragmentsStack); actionBarLayout.setDelegate(this); + ApplicationLoader.loadWallpaper(); + + passcodeView = new PasscodeView(this); + drawerLayoutContainer.addView(passcodeView); + FrameLayout.LayoutParams layoutParams1 = (FrameLayout.LayoutParams) passcodeView.getLayoutParams(); + layoutParams1.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams1.height = FrameLayout.LayoutParams.MATCH_PARENT; + passcodeView.setLayoutParams(layoutParams1); + NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeOtherAppActivities, this); currentConnectionState = ConnectionsManager.getInstance().getConnectionState(); @@ -309,6 +330,11 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa NotificationCenter.getInstance().addObserver(this, NotificationCenter.closeOtherAppActivities); NotificationCenter.getInstance().addObserver(this, NotificationCenter.didUpdatedConnectionState); NotificationCenter.getInstance().addObserver(this, NotificationCenter.needPasswordEnter); + if (Build.VERSION.SDK_INT < 14) { + NotificationCenter.getInstance().addObserver(this, NotificationCenter.screenStateChanged); + } else { + NotificationCenter.getInstance().addObserver(this, NotificationCenter.appSwitchedToForeground); + } if (actionBarLayout.fragmentsStack.isEmpty()) { if (!UserConfig.isClientActivated() && !UserConfig.isWaitingForPasswordEnter()) { @@ -385,113 +411,242 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa drawerLayoutContainer.setAllowOpenDrawer(allowOpen); } - handleIntent(getIntent(), false, savedInstanceState != null); + handleIntent(getIntent(), false, savedInstanceState != null, false); needLayout(); } - private void handleIntent(Intent intent, boolean isNew, boolean restore) { - boolean pushOpened = false; + private void showPasscodeActivity() { + if (passcodeView == null) { + return; + } + UserConfig.appLocked = true; + if (PhotoViewer.getInstance().isVisible()) { + PhotoViewer.getInstance().closePhoto(false, true); + } + passcodeView.onShow(); + UserConfig.isWaitingForPasscodeEnter = true; + drawerLayoutContainer.setAllowOpenDrawer(false); + passcodeView.setDelegate(new PasscodeView.PasscodeViewDelegate() { + @Override + public void didAcceptedPassword() { + UserConfig.isWaitingForPasscodeEnter = false; + if (passcodeSaveIntent != null) { + handleIntent(passcodeSaveIntent, passcodeSaveIntentIsNew, passcodeSaveIntentIsRestore, true); + passcodeSaveIntent = null; + } + drawerLayoutContainer.setAllowOpenDrawer(true); + actionBarLayout.showLastFragment(); + if (AndroidUtilities.isTablet()) { + layersActionBarLayout.showLastFragment(); + rightActionBarLayout.showLastFragment(); + } + } + }); + } - Integer push_user_id = 0; - Integer push_chat_id = 0; - Integer push_enc_id = 0; - Integer open_settings = 0; - boolean showDialogsList = false; + private boolean handleIntent(Intent intent, boolean isNew, boolean restore, boolean fromPassword) { + int flags = intent.getFlags(); + if (!fromPassword && (AndroidUtilities.needShowPasscode(true) || UserConfig.isWaitingForPasscodeEnter)) { + showPasscodeActivity(); + passcodeSaveIntent = intent; + passcodeSaveIntentIsNew = isNew; + passcodeSaveIntentIsRestore = restore; + UserConfig.saveConfig(false); + } else { + boolean pushOpened = false; - photoPathsArray = null; - videoPath = null; - sendingText = null; - documentsPathsArray = null; - documentsOriginalPathsArray = null; - documentsMimeType = null; - documentsUrisArray = null; - contactsToSend = null; + Integer push_user_id = 0; + Integer push_chat_id = 0; + Integer push_enc_id = 0; + Integer open_settings = 0; + boolean showDialogsList = false; - if (UserConfig.isClientActivated() && !UserConfig.isWaitingForPasswordEnter() && (intent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) { - if (intent != null && intent.getAction() != null && !restore) { - if (Intent.ACTION_SEND.equals(intent.getAction())) { - boolean error = false; - String type = intent.getType(); - if (type != null && (type.equals("text/plain") || type.equals("message/rfc822")) && (intent.getStringExtra(Intent.EXTRA_TEXT) != null || intent.getCharSequenceExtra(Intent.EXTRA_TEXT) != null)) { - String text = intent.getStringExtra(Intent.EXTRA_TEXT); - if (text == null) { - text = intent.getCharSequenceExtra(Intent.EXTRA_TEXT).toString(); - } - String subject = intent.getStringExtra(Intent.EXTRA_SUBJECT); + photoPathsArray = null; + videoPath = null; + sendingText = null; + documentsPathsArray = null; + documentsOriginalPathsArray = null; + documentsMimeType = null; + documentsUrisArray = null; + contactsToSend = null; - if (text != null && text.length() != 0) { - if ((text.startsWith("http://") || text.startsWith("https://")) && subject != null && subject.length() != 0) { - text = subject + "\n" + text; + if (UserConfig.isClientActivated() && !UserConfig.isWaitingForPasswordEnter() && (flags & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) { + if (intent != null && intent.getAction() != null && !restore) { + if (Intent.ACTION_SEND.equals(intent.getAction())) { + boolean error = false; + String type = intent.getType(); + if (type != null && (type.equals("text/plain") || type.equals("message/rfc822")) && (intent.getStringExtra(Intent.EXTRA_TEXT) != null || intent.getCharSequenceExtra(Intent.EXTRA_TEXT) != null)) { + String text = intent.getStringExtra(Intent.EXTRA_TEXT); + if (text == null) { + text = intent.getCharSequenceExtra(Intent.EXTRA_TEXT).toString(); } - sendingText = text; - } else { - error = true; - } - } else if (type != null && type.equals(ContactsContract.Contacts.CONTENT_VCARD_TYPE)) { - try { - Uri uri = (Uri) intent.getExtras().get(Intent.EXTRA_STREAM); - if (uri != null) { - ContentResolver cr = getContentResolver(); - InputStream stream = cr.openInputStream(uri); + String subject = intent.getStringExtra(Intent.EXTRA_SUBJECT); - String name = null; - String nameEncoding = null; - String nameCharset = null; - ArrayList phones = new ArrayList<>(); - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(stream, "UTF-8")); - String line = null; - while ((line = bufferedReader.readLine()) != null) { - String[] args = line.split(":"); - if (args.length != 2) { - continue; + if (text != null && text.length() != 0) { + if ((text.startsWith("http://") || text.startsWith("https://")) && subject != null && subject.length() != 0) { + text = subject + "\n" + text; + } + sendingText = text; + } else { + error = true; + } + } else if (type != null && type.equals(ContactsContract.Contacts.CONTENT_VCARD_TYPE)) { + try { + Uri uri = (Uri) intent.getExtras().get(Intent.EXTRA_STREAM); + if (uri != null) { + ContentResolver cr = getContentResolver(); + InputStream stream = cr.openInputStream(uri); + + String name = null; + String nameEncoding = null; + String nameCharset = null; + ArrayList phones = new ArrayList<>(); + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(stream, "UTF-8")); + String line = null; + while ((line = bufferedReader.readLine()) != null) { + String[] args = line.split(":"); + if (args.length != 2) { + continue; + } + if (args[0].startsWith("FN")) { + String[] params = args[0].split(";"); + for (String param : params) { + String[] args2 = param.split("="); + if (args2.length != 2) { + continue; + } + if (args2[0].equals("CHARSET")) { + nameCharset = args2[1]; + } else if (args2[0].equals("ENCODING")) { + nameEncoding = args2[1]; + } + } + name = args[1]; + if (nameEncoding != null && nameEncoding.equalsIgnoreCase("QUOTED-PRINTABLE")) { + while (name.endsWith("=") && nameEncoding != null) { + name = name.substring(0, name.length() - 1); + line = bufferedReader.readLine(); + if (line == null) { + break; + } + name += line; + } + byte[] bytes = Utilities.decodeQuotedPrintable(name.getBytes()); + if (bytes != null && bytes.length != 0) { + String decodedName = new String(bytes, nameCharset); + if (decodedName != null) { + name = decodedName; + } + } + } + } else if (args[0].startsWith("TEL")) { + String phone = PhoneFormat.stripExceptNumbers(args[1], true); + if (phone.length() > 0) { + phones.add(phone); + } + } } - if (args[0].startsWith("FN")) { - String[] params = args[0].split(";"); - for (String param : params) { - String[] args2 = param.split("="); - if (args2.length != 2) { - continue; - } - if (args2[0].equals("CHARSET")) { - nameCharset = args2[1]; - } else if (args2[0].equals("ENCODING")) { - nameEncoding = args2[1]; - } + if (name != null && !phones.isEmpty()) { + contactsToSend = new ArrayList<>(); + for (String phone : phones) { + TLRPC.User user = new TLRPC.TL_userContact(); + user.phone = phone; + user.first_name = name; + user.last_name = ""; + user.id = 0; + contactsToSend.add(user); } - name = args[1]; - if (nameEncoding != null && nameEncoding.equalsIgnoreCase("QUOTED-PRINTABLE")) { - while (name.endsWith("=") && nameEncoding != null) { - name = name.substring(0, name.length() - 1); - line = bufferedReader.readLine(); - if (line == null) { - break; - } - name += line; - } - byte[] bytes = Utilities.decodeQuotedPrintable(name.getBytes()); - if (bytes != null && bytes.length != 0) { - String decodedName = new String(bytes, nameCharset); - if (decodedName != null) { - name = decodedName; - } - } + } + } else { + error = true; + } + } catch (Exception e) { + FileLog.e("tmessages", e); + error = true; + } + } else { + Parcelable parcelable = intent.getParcelableExtra(Intent.EXTRA_STREAM); + if (parcelable != null) { + String path = null; + if (!(parcelable instanceof Uri)) { + parcelable = Uri.parse(parcelable.toString()); + } + Uri uri = (Uri) parcelable; + if (uri != null && type != null && type.startsWith("image/")) { + String tempPath = Utilities.getPath(uri); + if (photoPathsArray == null) { + photoPathsArray = new ArrayList<>(); + } + photoPathsArray.add(uri); + } else { + path = Utilities.getPath(uri); + if (path != null) { + if (path.startsWith("file:")) { + path = path.replace("file://", ""); } - } else if (args[0].startsWith("TEL")) { - String phone = PhoneFormat.stripExceptNumbers(args[1], true); - if (phone.length() > 0) { - phones.add(phone); + 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; } } - if (name != null && !phones.isEmpty()) { - contactsToSend = new ArrayList<>(); - for (String phone : phones) { - TLRPC.User user = new TLRPC.TL_userContact(); - user.phone = phone; - user.first_name = name; - user.last_name = ""; - user.id = 0; - contactsToSend.add(user); + } else { + error = true; + } + if (error) { + Toast.makeText(this, "Unsupported content", Toast.LENGTH_SHORT).show(); + } + } + } else if (intent.getAction().equals(Intent.ACTION_SEND_MULTIPLE)) { + boolean error = false; + try { + ArrayList uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); + String type = intent.getType(); + if (uris != null) { + if (type != null && type.startsWith("image/")) { + for (Parcelable parcelable : uris) { + if (!(parcelable instanceof Uri)) { + parcelable = Uri.parse(parcelable.toString()); + } + Uri uri = (Uri) parcelable; + if (photoPathsArray == null) { + photoPathsArray = new ArrayList<>(); + } + photoPathsArray.add(uri); + } + } else { + for (Parcelable parcelable : uris) { + if (!(parcelable instanceof Uri)) { + parcelable = Uri.parse(parcelable.toString()); + } + String path = Utilities.getPath((Uri) parcelable); + String originalPath = parcelable.toString(); + if (originalPath == null) { + originalPath = path; + } + if (path != null) { + if (path.startsWith("file:")) { + path = path.replace("file://", ""); + } + if (documentsPathsArray == null) { + documentsPathsArray = new ArrayList<>(); + documentsOriginalPathsArray = new ArrayList<>(); + } + documentsPathsArray.add(path); + documentsOriginalPathsArray.add(originalPath); + } } } } else { @@ -501,335 +656,247 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa FileLog.e("tmessages", e); error = true; } - } else { - Parcelable parcelable = intent.getParcelableExtra(Intent.EXTRA_STREAM); - if (parcelable != null) { - String path = null; - if (!(parcelable instanceof Uri)) { - parcelable = Uri.parse(parcelable.toString()); - } - Uri uri = (Uri) parcelable; - if (uri != null && type != null && type.startsWith("image/")) { - String tempPath = Utilities.getPath(uri); - if (photoPathsArray == null) { - photoPathsArray = new ArrayList<>(); - } - photoPathsArray.add(uri); - } else { - path = Utilities.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; - } - } - } else { - error = true; - } if (error) { Toast.makeText(this, "Unsupported content", Toast.LENGTH_SHORT).show(); } - } - } else if (intent.getAction().equals(Intent.ACTION_SEND_MULTIPLE)) { - boolean error = false; - try { - ArrayList uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); - String type = intent.getType(); - if (uris != null) { - if (type != null && type.startsWith("image/")) { - for (Parcelable parcelable : uris) { - if (!(parcelable instanceof Uri)) { - parcelable = Uri.parse(parcelable.toString()); - } - Uri uri = (Uri) parcelable; - if (photoPathsArray == null) { - photoPathsArray = new ArrayList<>(); - } - photoPathsArray.add(uri); - } - } else { - for (Parcelable parcelable : uris) { - if (!(parcelable instanceof Uri)) { - parcelable = Uri.parse(parcelable.toString()); - } - String path = Utilities.getPath((Uri) parcelable); - String originalPath = parcelable.toString(); - if (originalPath == null) { - originalPath = path; - } - if (path != null) { - if (path.startsWith("file:")) { - path = path.replace("file://", ""); + } else if (Intent.ACTION_VIEW.equals(intent.getAction())) { + Uri data = intent.getData(); + if (data != null) { + String username = null; + String scheme = data.getScheme(); + if (scheme != null) { + if ((scheme.equals("http") || scheme.equals("https"))) { + String host = data.getHost().toLowerCase(); + if (host.equals("telegram.me")) { + String path = data.getPath(); + if (path != null && path.length() >= 6) { + username = path.substring(1); } - if (documentsPathsArray == null) { - documentsPathsArray = new ArrayList<>(); - documentsOriginalPathsArray = new ArrayList<>(); - } - documentsPathsArray.add(path); - documentsOriginalPathsArray.add(originalPath); + } + } else if (scheme.equals("tg")) { + String url = data.toString().toLowerCase(); + if (url.startsWith("tg:resolve") || url.startsWith("tg://resolve")) { + url = url.replace("tg:resolve", "tg://telegram.org").replace("tg://resolve", "tg://telegram.org"); + data = Uri.parse(url); + username = data.getQueryParameter("domain"); } } } - } else { - error = true; - } - } catch (Exception e) { - FileLog.e("tmessages", e); - error = true; - } - if (error) { - Toast.makeText(this, "Unsupported content", Toast.LENGTH_SHORT).show(); - } - } else if (Intent.ACTION_VIEW.equals(intent.getAction())) { - Uri data = intent.getData(); - if (data != null) { - String username = null; - String scheme = data.getScheme(); - if (scheme != null) { - if ((scheme.equals("http") || scheme.equals("https"))) { - String host = data.getHost().toLowerCase(); - if (host.equals("telegram.me")) { - String path = data.getPath(); - if (path != null && path.length() >= 6) { - username = path.substring(1); - } - } - } else if (scheme.equals("tg")) { - String url = data.toString().toLowerCase(); - if (url.startsWith("tg:resolve") || url.startsWith("tg://resolve")) { - url = url.replace("tg:resolve", "tg://telegram.org").replace("tg://resolve", "tg://telegram.org"); - data = Uri.parse(url); - username = data.getQueryParameter("domain"); - } - } - } - if (username != null) { - final ProgressDialog progressDialog = new ProgressDialog(this); - progressDialog.setMessage(LocaleController.getString("Loading", R.string.Loading)); - progressDialog.setCanceledOnTouchOutside(false); - progressDialog.setCancelable(false); + if (username != null) { + final ProgressDialog progressDialog = new ProgressDialog(this); + progressDialog.setMessage(LocaleController.getString("Loading", R.string.Loading)); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.setCancelable(false); - TLRPC.TL_contacts_resolveUsername req = new TLRPC.TL_contacts_resolveUsername(); - req.username = username; - final long reqId = ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { - @Override - public void run(final TLObject response, final TLRPC.TL_error error) { - AndroidUtilities.runOnUIThread(new Runnable() { - @Override - public void run() { - if (!LaunchActivity.this.isFinishing()) { - try { - progressDialog.dismiss(); - } catch (Exception e) { - FileLog.e("tmessages", e); - } - if (error == null && actionBarLayout != null) { - TLRPC.User user = (TLRPC.User) response; - MessagesController.getInstance().putUser(user, false); - ArrayList users = new ArrayList<>(); - users.add(user); - MessagesStorage.getInstance().putUsersAndChats(users, null, false, true); - Bundle args = new Bundle(); - args.putInt("user_id", user.id); - ChatActivity fragment = new ChatActivity(args); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats); - actionBarLayout.presentFragment(fragment, false, true, true); + TLRPC.TL_contacts_resolveUsername req = new TLRPC.TL_contacts_resolveUsername(); + req.username = username; + final long reqId = ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { + @Override + public void run(final TLObject response, final TLRPC.TL_error error) { + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + if (!LaunchActivity.this.isFinishing()) { + try { + progressDialog.dismiss(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + if (error == null && actionBarLayout != null) { + TLRPC.User user = (TLRPC.User) response; + MessagesController.getInstance().putUser(user, false); + ArrayList users = new ArrayList<>(); + users.add(user); + MessagesStorage.getInstance().putUsersAndChats(users, null, false, true); + Bundle args = new Bundle(); + args.putInt("user_id", user.id); + ChatActivity fragment = new ChatActivity(args); + NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats); + actionBarLayout.presentFragment(fragment, false, true, true); + } } } - } - }); - } - }); + }); + } + }); - progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, LocaleController.getString("Cancel", R.string.Cancel), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - ConnectionsManager.getInstance().cancelRpc(reqId, true); - try { - dialog.dismiss(); - } catch (Exception e) { - FileLog.e("tmessages", e); + progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, LocaleController.getString("Cancel", R.string.Cancel), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + ConnectionsManager.getInstance().cancelRpc(reqId, true); + try { + dialog.dismiss(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } } - } - }); - progressDialog.show(); - } else { - try { - Cursor cursor = getContentResolver().query(intent.getData(), null, null, null, null); - if (cursor != null) { - if (cursor.moveToFirst()) { - int userId = cursor.getInt(cursor.getColumnIndex("DATA4")); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats); - push_user_id = userId; + }); + progressDialog.show(); + } else { + try { + Cursor cursor = getContentResolver().query(intent.getData(), null, null, null, null); + if (cursor != null) { + if (cursor.moveToFirst()) { + int userId = cursor.getInt(cursor.getColumnIndex("DATA4")); + NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats); + push_user_id = userId; + } + cursor.close(); } - cursor.close(); + } catch (Exception e) { + FileLog.e("tmessages", e); } - } catch (Exception e) { - FileLog.e("tmessages", e); } } - } - } else if (intent.getAction().equals("org.telegram.messenger.OPEN_ACCOUNT")) { - open_settings = 1; - } else if (intent.getAction().startsWith("com.tmessages.openchat")) { - int chatId = intent.getIntExtra("chatId", 0); - int userId = intent.getIntExtra("userId", 0); - int encId = intent.getIntExtra("encId", 0); - if (chatId != 0) { - NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats); - push_chat_id = chatId; - } else if (userId != 0) { - NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats); - push_user_id = userId; - } else if (encId != 0) { - NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats); - push_enc_id = encId; - } else { - showDialogsList = true; + } else if (intent.getAction().equals("org.telegram.messenger.OPEN_ACCOUNT")) { + open_settings = 1; + } else if (intent.getAction().startsWith("com.tmessages.openchat")) { + int chatId = intent.getIntExtra("chatId", 0); + int userId = intent.getIntExtra("userId", 0); + int encId = intent.getIntExtra("encId", 0); + if (chatId != 0) { + NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats); + push_chat_id = chatId; + } else if (userId != 0) { + NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats); + push_user_id = userId; + } else if (encId != 0) { + NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats); + push_enc_id = encId; + } else { + showDialogsList = true; + } } } } - } - if (push_user_id != 0) { - if (push_user_id == UserConfig.getClientUserId()) { - open_settings = 1; - } else { + if (push_user_id != 0) { + if (push_user_id == UserConfig.getClientUserId()) { + open_settings = 1; + } else { + Bundle args = new Bundle(); + args.putInt("user_id", push_user_id); + ChatActivity fragment = new ChatActivity(args); + if (actionBarLayout.presentFragment(fragment, false, true, true)) { + pushOpened = true; + } + } + } else if (push_chat_id != 0) { Bundle args = new Bundle(); - args.putInt("user_id", push_user_id); + args.putInt("chat_id", push_chat_id); ChatActivity fragment = new ChatActivity(args); if (actionBarLayout.presentFragment(fragment, false, true, true)) { pushOpened = true; } - } - } else if (push_chat_id != 0) { - Bundle args = new Bundle(); - args.putInt("chat_id", push_chat_id); - ChatActivity fragment = new ChatActivity(args); - if (actionBarLayout.presentFragment(fragment, false, true, true)) { - pushOpened = true; - } - } else if (push_enc_id != 0) { - Bundle args = new Bundle(); - args.putInt("enc_id", push_enc_id); - ChatActivity fragment = new ChatActivity(args); - if (actionBarLayout.presentFragment(fragment, false, true, true)) { - pushOpened = true; - } - } else if (showDialogsList) { - if (!AndroidUtilities.isTablet()) { - actionBarLayout.removeAllFragments(); - } else { - if (!layersActionBarLayout.fragmentsStack.isEmpty()) { - for (int a = 0; a < layersActionBarLayout.fragmentsStack.size() - 1; a++) { - layersActionBarLayout.removeFragmentFromStack(layersActionBarLayout.fragmentsStack.get(0)); - a--; - } - layersActionBarLayout.closeLastFragment(false); + } else if (push_enc_id != 0) { + Bundle args = new Bundle(); + args.putInt("enc_id", push_enc_id); + ChatActivity fragment = new ChatActivity(args); + if (actionBarLayout.presentFragment(fragment, false, true, true)) { + pushOpened = true; } - } - pushOpened = false; - isNew = false; - } else if (videoPath != null || photoPathsArray != null || sendingText != null || documentsPathsArray != null || contactsToSend != null || documentsUrisArray != null) { - if (!AndroidUtilities.isTablet()) { - NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats); - } - Bundle args = new Bundle(); - args.putBoolean("onlySelect", true); - args.putString("selectAlertString", LocaleController.getString("SendMessagesTo", R.string.SendMessagesTo)); - args.putString("selectAlertStringGroup", LocaleController.getString("SendMessagesToGroup", R.string.SendMessagesToGroup)); - MessagesActivity fragment = new MessagesActivity(args); - fragment.setDelegate(this); - boolean removeLast = false; - if (AndroidUtilities.isTablet()) { - removeLast = layersActionBarLayout.fragmentsStack.size() > 0 && layersActionBarLayout.fragmentsStack.get(layersActionBarLayout.fragmentsStack.size() - 1) instanceof MessagesActivity; - } else { - removeLast = actionBarLayout.fragmentsStack.size() > 1 && actionBarLayout.fragmentsStack.get(actionBarLayout.fragmentsStack.size() - 1) instanceof MessagesActivity; - } - actionBarLayout.presentFragment(fragment, removeLast, true, true); - pushOpened = true; - if (PhotoViewer.getInstance().isVisible()) { - PhotoViewer.getInstance().closePhoto(false); + } else if (showDialogsList) { + if (!AndroidUtilities.isTablet()) { + actionBarLayout.removeAllFragments(); + } else { + if (!layersActionBarLayout.fragmentsStack.isEmpty()) { + for (int a = 0; a < layersActionBarLayout.fragmentsStack.size() - 1; a++) { + layersActionBarLayout.removeFragmentFromStack(layersActionBarLayout.fragmentsStack.get(0)); + a--; + } + layersActionBarLayout.closeLastFragment(false); + } + } + pushOpened = false; + isNew = false; + } else if (videoPath != null || photoPathsArray != null || sendingText != null || documentsPathsArray != null || contactsToSend != null || documentsUrisArray != null) { + if (!AndroidUtilities.isTablet()) { + NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats); + } + Bundle args = new Bundle(); + args.putBoolean("onlySelect", true); + args.putString("selectAlertString", LocaleController.getString("SendMessagesTo", R.string.SendMessagesTo)); + args.putString("selectAlertStringGroup", LocaleController.getString("SendMessagesToGroup", R.string.SendMessagesToGroup)); + MessagesActivity fragment = new MessagesActivity(args); + fragment.setDelegate(this); + boolean removeLast = false; + if (AndroidUtilities.isTablet()) { + removeLast = layersActionBarLayout.fragmentsStack.size() > 0 && layersActionBarLayout.fragmentsStack.get(layersActionBarLayout.fragmentsStack.size() - 1) instanceof MessagesActivity; + } else { + removeLast = actionBarLayout.fragmentsStack.size() > 1 && actionBarLayout.fragmentsStack.get(actionBarLayout.fragmentsStack.size() - 1) instanceof MessagesActivity; + } + actionBarLayout.presentFragment(fragment, removeLast, true, true); + pushOpened = true; + if (PhotoViewer.getInstance().isVisible()) { + PhotoViewer.getInstance().closePhoto(false, true); + } + + if (AndroidUtilities.isTablet()) { + actionBarLayout.showLastFragment(); + rightActionBarLayout.showLastFragment(); + } + drawerLayoutContainer.setAllowOpenDrawer(false); + } else if (open_settings != 0) { + actionBarLayout.presentFragment(new SettingsActivity(), false, true, true); + drawerLayoutContainer.setAllowOpenDrawer(false); + if (AndroidUtilities.isTablet()) { + actionBarLayout.showLastFragment(); + rightActionBarLayout.showLastFragment(); + } + pushOpened = true; } - if (AndroidUtilities.isTablet()) { - actionBarLayout.showLastFragment(); - rightActionBarLayout.showLastFragment(); - } - drawerLayoutContainer.setAllowOpenDrawer(false); - } else if (open_settings != 0) { - actionBarLayout.presentFragment(new SettingsActivity(), false, true, true); - drawerLayoutContainer.setAllowOpenDrawer(false); - if (AndroidUtilities.isTablet()) { - actionBarLayout.showLastFragment(); - rightActionBarLayout.showLastFragment(); - } - pushOpened = true; - } - if (!pushOpened && !isNew) { - if (AndroidUtilities.isTablet()) { - if (!UserConfig.isClientActivated() && !UserConfig.isWaitingForPasswordEnter()) { - if (layersActionBarLayout.fragmentsStack.isEmpty()) { - layersActionBarLayout.addFragmentToStack(new LoginActivity()); - drawerLayoutContainer.setAllowOpenDrawer(false); + if (!pushOpened && !isNew) { + if (AndroidUtilities.isTablet()) { + if (!UserConfig.isClientActivated() && !UserConfig.isWaitingForPasswordEnter()) { + if (layersActionBarLayout.fragmentsStack.isEmpty()) { + layersActionBarLayout.addFragmentToStack(new LoginActivity()); + drawerLayoutContainer.setAllowOpenDrawer(false); + } + } else { + if (actionBarLayout.fragmentsStack.isEmpty()) { + if (UserConfig.isWaitingForPasswordEnter()) { + layersActionBarLayout.addFragmentToStack(new AccountPasswordActivity(1)); + drawerLayoutContainer.setAllowOpenDrawer(false); + } else { + actionBarLayout.addFragmentToStack(new MessagesActivity(null)); + drawerLayoutContainer.setAllowOpenDrawer(true); + } + } } } else { if (actionBarLayout.fragmentsStack.isEmpty()) { - if (UserConfig.isWaitingForPasswordEnter()) { - layersActionBarLayout.addFragmentToStack(new AccountPasswordActivity(1)); + if (!UserConfig.isClientActivated() && !UserConfig.isWaitingForPasswordEnter()) { + actionBarLayout.addFragmentToStack(new LoginActivity()); drawerLayoutContainer.setAllowOpenDrawer(false); } else { - actionBarLayout.addFragmentToStack(new MessagesActivity(null)); - drawerLayoutContainer.setAllowOpenDrawer(true); + if (UserConfig.isWaitingForPasswordEnter()) { + actionBarLayout.addFragmentToStack(new AccountPasswordActivity(1)); + drawerLayoutContainer.setAllowOpenDrawer(false); + } else { + actionBarLayout.addFragmentToStack(new MessagesActivity(null)); + drawerLayoutContainer.setAllowOpenDrawer(true); + } } } } - } else { - if (actionBarLayout.fragmentsStack.isEmpty()) { - if (!UserConfig.isClientActivated() && !UserConfig.isWaitingForPasswordEnter()) { - actionBarLayout.addFragmentToStack(new LoginActivity()); - drawerLayoutContainer.setAllowOpenDrawer(false); - } else { - if (UserConfig.isWaitingForPasswordEnter()) { - actionBarLayout.addFragmentToStack(new AccountPasswordActivity(1)); - drawerLayoutContainer.setAllowOpenDrawer(false); - } else { - actionBarLayout.addFragmentToStack(new MessagesActivity(null)); - drawerLayoutContainer.setAllowOpenDrawer(true); - } - } + actionBarLayout.showLastFragment(); + if (AndroidUtilities.isTablet()) { + layersActionBarLayout.showLastFragment(); + rightActionBarLayout.showLastFragment(); } } - actionBarLayout.showLastFragment(); - if (AndroidUtilities.isTablet()) { - layersActionBarLayout.showLastFragment(); - rightActionBarLayout.showLastFragment(); - } - } - intent.setAction(null); + intent.setAction(null); + return pushOpened; + } + return false; } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); - handleIntent(intent, true, false); + handleIntent(intent, true, false, false); } @Override @@ -910,11 +977,20 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa return; } finished = true; + if (lockRunnable != null) { + AndroidUtilities.cancelRunOnUIThread(lockRunnable); + lockRunnable = null; + } NotificationCenter.getInstance().removeObserver(this, NotificationCenter.appDidLogout); NotificationCenter.getInstance().removeObserver(this, NotificationCenter.mainUserInfoChanged); NotificationCenter.getInstance().removeObserver(this, NotificationCenter.closeOtherAppActivities); NotificationCenter.getInstance().removeObserver(this, NotificationCenter.didUpdatedConnectionState); NotificationCenter.getInstance().removeObserver(this, NotificationCenter.needPasswordEnter); + if (Build.VERSION.SDK_INT < 14) { + NotificationCenter.getInstance().removeObserver(this, NotificationCenter.screenStateChanged); + } else { + NotificationCenter.getInstance().removeObserver(this, NotificationCenter.appSwitchedToForeground); + } } public void presentFragment(BaseFragment fragment) { @@ -960,9 +1036,11 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa BaseFragment chatFragment = actionBarLayout.fragmentsStack.get(1); chatFragment.onPause(); actionBarLayout.fragmentsStack.remove(1); - actionBarLayout.showLastFragment(); rightActionBarLayout.fragmentsStack.add(chatFragment); - rightActionBarLayout.showLastFragment(); + if (passcodeView.getVisibility() != View.VISIBLE) { + actionBarLayout.showLastFragment(); + rightActionBarLayout.showLastFragment(); + } } rightActionBarLayout.setVisibility(rightActionBarLayout.fragmentsStack.isEmpty() ? View.GONE : View.VISIBLE); @@ -984,7 +1062,10 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa BaseFragment chatFragment = rightActionBarLayout.fragmentsStack.get(0); chatFragment.onPause(); rightActionBarLayout.fragmentsStack.remove(0); - actionBarLayout.presentFragment(chatFragment, false, true, false); + actionBarLayout.addFragmentToStack(chatFragment); + if (passcodeView.getVisibility() != View.VISIBLE) { + actionBarLayout.showLastFragment(); + } } } } @@ -1013,6 +1094,10 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (UserConfig.passcodeHash.length() != 0 && UserConfig.lastPauseTime != 0) { + UserConfig.lastPauseTime = 0; + UserConfig.saveConfig(false); + } super.onActivityResult(requestCode, resultCode, data); if (actionBarLayout.fragmentsStack.size() != 0) { BaseFragment fragment = actionBarLayout.fragmentsStack.get(actionBarLayout.fragmentsStack.size() - 1); @@ -1033,6 +1118,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa @Override protected void onPause() { super.onPause(); + onPasscodePause(); actionBarLayout.onPause(); if (AndroidUtilities.isTablet()) { rightActionBarLayout.onPause(); @@ -1053,10 +1139,15 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa @Override protected void onResume() { super.onResume(); - actionBarLayout.onResume(); - if (AndroidUtilities.isTablet()) { - rightActionBarLayout.onResume(); - layersActionBarLayout.onResume(); + onPasscodeResume(); + if (passcodeView.getVisibility() != View.VISIBLE) { + actionBarLayout.onResume(); + if (AndroidUtilities.isTablet()) { + rightActionBarLayout.onResume(); + layersActionBarLayout.onResume(); + } + } else { + passcodeView.onResume(); } Utilities.checkForCrashes(this); Utilities.checkForUpdates(this); @@ -1100,6 +1191,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa } else if (id == NotificationCenter.closeOtherAppActivities) { if (args[0] != this) { onFinish(); + finish(); } } else if (id == NotificationCenter.didUpdatedConnectionState) { int state = (Integer)args[0]; @@ -1132,6 +1224,62 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa actionBarLayout.presentFragment(new AccountPasswordActivity(1), true); drawerLayoutContainer.setAllowOpenDrawer(false); } + } else if (id == NotificationCenter.screenStateChanged) { + if (!ApplicationLoader.mainInterfacePaused) { + if (!ApplicationLoader.isScreenOn) { + onPasscodePause(); + } else { + onPasscodeResume(); + } + } + } else if (id == NotificationCenter.appSwitchedToForeground) { + onPasscodeResume(); + } + } + + private void onPasscodePause() { + if (lockRunnable != null) { + AndroidUtilities.cancelRunOnUIThread(lockRunnable); + lockRunnable = null; + } + if (UserConfig.passcodeHash.length() != 0) { + UserConfig.lastPauseTime = ConnectionsManager.getInstance().getCurrentTime(); + lockRunnable = new Runnable() { + @Override + public void run() { + if (lockRunnable == this) { + if (AndroidUtilities.needShowPasscode(true)) { + FileLog.e("tmessages", "lock app"); + showPasscodeActivity(); + } else { + FileLog.e("tmessages", "didn't pass lock check"); + } + lockRunnable = null; + } + } + }; + if (UserConfig.appLocked) { + AndroidUtilities.runOnUIThread(lockRunnable, 1000); + } else if (UserConfig.autoLockIn != 0) { + AndroidUtilities.runOnUIThread(lockRunnable, (long) UserConfig.autoLockIn * 1000 + 1000); + } + } else { + UserConfig.lastPauseTime = 0; + } + UserConfig.saveConfig(false); + } + + private void onPasscodeResume() { + if (lockRunnable != null) { + AndroidUtilities.cancelRunOnUIThread(lockRunnable); + lockRunnable = null; + } + if (AndroidUtilities.needShowPasscode(true)) { + showPasscodeActivity(); + } + if (UserConfig.lastPauseTime != 0) { + UserConfig.lastPauseTime = 0; + UserConfig.saveConfig(false); } } @@ -1191,8 +1339,12 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa @Override public void onBackPressed() { + if (passcodeView.getVisibility() == View.VISIBLE) { + finish(); + return; + } if (PhotoViewer.getInstance().isVisible()) { - PhotoViewer.getInstance().closePhoto(true); + PhotoViewer.getInstance().closePhoto(true, false); } else if (drawerLayoutContainer.isDrawerOpened()) { drawerLayoutContainer.closeDrawer(false); } else if (AndroidUtilities.isTablet()) { @@ -1246,7 +1398,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa @Override public boolean onPreIme() { if (PhotoViewer.getInstance().isVisible()) { - PhotoViewer.getInstance().closePhoto(true); + PhotoViewer.getInstance().closePhoto(true, false); return true; } return false; @@ -1266,6 +1418,9 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa } else { if (actionBarLayout.fragmentsStack.size() == 1) { if (!drawerLayoutContainer.isDrawerOpened()) { + if (getCurrentFocus() != null) { + AndroidUtilities.hideKeyboard(getCurrentFocus()); + } drawerLayoutContainer.openDrawer(false); } else { drawerLayoutContainer.closeDrawer(false); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java index 195ebf11e..c3efdf404 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java @@ -91,7 +91,7 @@ public class LocationActivity extends BaseFragment implements NotificationCenter } @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { if (fragmentView == null) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); @@ -139,9 +139,9 @@ public class LocationActivity extends BaseFragment implements NotificationCenter item.addSubItem(map_list_menu_hybrid, LocaleController.getString("Hybrid", R.string.Hybrid), 0); if (messageObject != null) { - fragmentView = inflater.inflate(R.layout.location_view_layout, container, false); + fragmentView = inflater.inflate(R.layout.location_view_layout, null, false); } else { - fragmentView = inflater.inflate(R.layout.location_attach_layout, container, false); + fragmentView = inflater.inflate(R.layout.location_attach_layout, null, false); } avatarImageView = (BackupImageView)fragmentView.findViewById(R.id.location_avatar_view); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java index 2814c8b32..67f329f65 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java @@ -103,7 +103,7 @@ public class LoginActivity extends BaseFragment { } @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { if (fragmentView == null) { actionBar.setTitle(LocaleController.getString("AppName", R.string.AppName)); @@ -829,9 +829,6 @@ public class LoginActivity extends BaseFragment { final TLRPC.TL_auth_sentCode res = (TLRPC.TL_auth_sentCode)response; params.putString("phoneHash", res.phone_code_hash); params.putInt("calltime", res.send_call_timeout * 1000); - if (res.phone_registered) { - params.putString("registered", "true"); - } setPage(1, true, params, false); } else { if (error.text != null) { @@ -898,7 +895,6 @@ public class LoginActivity extends BaseFragment { private String phoneHash; private String requestPhone; - private String registered; private EditText codeField; private TextView confirmTextView; private TextView timeText; @@ -1067,7 +1063,6 @@ public class LoginActivity extends BaseFragment { String phone = params.getString("phone"); requestPhone = params.getString("phoneFormated"); phoneHash = params.getString("phoneHash"); - registered = params.getString("registered"); time = params.getInt("calltime"); if (phone == null) { @@ -1241,7 +1236,7 @@ public class LoginActivity extends BaseFragment { } else { lastError = error.text; - if (error.text.contains("PHONE_NUMBER_UNOCCUPIED") && registered == null) { + if (error.text.contains("PHONE_NUMBER_UNOCCUPIED")) { Bundle params = new Bundle(); params.putString("phoneFormated", requestPhone); params.putString("phoneHash", phoneHash); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/MediaActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/MediaActivity.java index 811f0f3e4..b0b16d52f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/MediaActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/MediaActivity.java @@ -33,10 +33,8 @@ import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.EditText; import android.widget.FrameLayout; -import android.widget.GridView; import android.widget.ImageView; import android.widget.LinearLayout; -import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView; @@ -46,34 +44,46 @@ import org.telegram.android.MessagesController; import org.telegram.android.SendMessagesHelper; import org.telegram.android.query.SharedMediaQuery; import org.telegram.messenger.ApplicationLoader; +import org.telegram.messenger.ConnectionsManager; import org.telegram.messenger.FileLoader; +import org.telegram.messenger.FileLog; +import org.telegram.messenger.RPCRequest; +import org.telegram.messenger.TLObject; import org.telegram.messenger.TLRPC; import org.telegram.android.MessageObject; import org.telegram.android.NotificationCenter; import org.telegram.messenger.R; +import org.telegram.messenger.Utilities; import org.telegram.ui.ActionBar.ActionBarMenu; import org.telegram.ui.ActionBar.ActionBarMenuItem; import org.telegram.ui.ActionBar.ActionBarPopupWindow; -import org.telegram.ui.Adapters.BaseFragmentAdapter; import org.telegram.ui.ActionBar.ActionBar; +import org.telegram.ui.Adapters.BaseFragmentAdapter; +import org.telegram.ui.Adapters.BaseSectionsAdapter; import org.telegram.ui.AnimationCompat.AnimatorSetProxy; import org.telegram.ui.AnimationCompat.ObjectAnimatorProxy; +import org.telegram.ui.Cells.GreySectionCell; import org.telegram.ui.Cells.LoadingCell; import org.telegram.ui.Cells.SharedDocumentCell; +import org.telegram.ui.Cells.SharedMediaSectionCell; +import org.telegram.ui.Cells.SharedPhotoVideoCell; import org.telegram.ui.Components.BackupImageView; import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.Components.SectionsListView; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.Timer; +import java.util.TimerTask; public class MediaActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate, PhotoViewer.PhotoViewerProvider { - private GridView listView; - private ListView mediaListView; - private ListAdapter listAdapter; + private SharedPhotoVideoAdapter photoVideoAdapter; private SharedDocumentsAdapter documentsAdapter; + private DocumentsSearchAdapter documentsSearchAdapter; + private SectionsListView listView; private LinearLayout progressView; private TextView emptyTextView; private ImageView emptyImageView; @@ -83,6 +93,10 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No private ActionBarMenuItem searchItem; private TextView selectedMessagesCountTextView; private ActionBarPopupWindow.ActionBarPopupWindowLayout popupLayout; + private ArrayList cellCache = new ArrayList<>(6); + + private boolean searchWas; + private boolean searching; private HashMap selectedFiles = new HashMap<>(); private ArrayList actionModeViews = new ArrayList<>(); @@ -90,16 +104,79 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No private long dialog_id; private int selectedMode; - private int itemWidth = 100; + private int columnsCount = 4; private class SharedMediaData { private ArrayList messages = new ArrayList<>(); private HashMap messagesDict = new HashMap<>(); + private ArrayList sections = new ArrayList<>(); + private HashMap> sectionArrays = new HashMap<>(); private int totalCount; private boolean loading; private boolean endReached; private boolean cacheEndReached; private int max_id; + + public boolean addMessage(MessageObject messageObject, boolean isNew, boolean enc) { + if (messagesDict.containsKey(messageObject.messageOwner.id)) { + return false; + } + ArrayList messageObjects = sectionArrays.get(messageObject.monthKey); + if (messageObjects == null) { + messageObjects = new ArrayList<>(); + sectionArrays.put(messageObject.monthKey, messageObjects); + if (isNew) { + sections.add(0, messageObject.monthKey); + } else { + sections.add(messageObject.monthKey); + } + } + if (isNew) { + messageObjects.add(0, messageObject); + messages.add(0, messageObject); + } else { + messageObjects.add(messageObject); + messages.add(messageObject); + } + messagesDict.put(messageObject.messageOwner.id, messageObject); + if (!enc) { + if (messageObject.messageOwner.id > 0) { + max_id = Math.min(messageObject.messageOwner.id, max_id); + } + } else { + max_id = Math.max(messageObject.messageOwner.id, max_id); + } + return true; + } + + public boolean deleteMessage(int mid) { + MessageObject messageObject = messagesDict.get(mid); + if (messageObject == null) { + return false; + } + ArrayList messageObjects = sectionArrays.get(messageObject.monthKey); + if (messageObjects == null) { + return false; + } + messageObjects.remove(messageObject); + messages.remove(messageObject); + messagesDict.remove(messageObject.messageOwner.id); + if (messageObjects.isEmpty()) { + sectionArrays.remove(messageObject.monthKey); + sections.remove(messageObject.monthKey); + } + totalCount--; + return true; + } + + public void replaceMid(int oldMid, int newMid) { + MessageObject obj = messagesDict.get(oldMid); + if (obj != null) { + messagesDict.remove(oldMid); + messagesDict.put(newMid, obj); + obj.messageOwner.id = newMid; + } + } } private SharedMediaData sharedMediaData[] = new SharedMediaData[3]; @@ -140,7 +217,7 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No } @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { if (fragmentView == null) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setTitle(""); @@ -152,13 +229,14 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No if (Build.VERSION.SDK_INT < 11 && listView != null) { listView.setAdapter(null); listView = null; - listAdapter = null; + photoVideoAdapter = null; + documentsAdapter = null; } finishFragment(); } else if (id == -2) { selectedFiles.clear(); actionBar.hideActionMode(); - mediaListView.invalidateViews(); + listView.invalidateViews(); } else if (id == shared_media_item) { if (selectedMode == 0) { return; @@ -176,7 +254,7 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No return; } AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setMessage(LocaleController.formatString("AreYouSureDeleteMessages", R.string.AreYouSureDeleteMessages, LocaleController.formatPluralString("files", selectedFiles.size()))); + builder.setMessage(LocaleController.formatString("AreYouSureDeleteMessages", R.string.AreYouSureDeleteMessages, LocaleController.formatPluralString("items", selectedFiles.size()))); builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { @Override @@ -265,16 +343,29 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No @Override public void onSearchExpand() { dropDownContainer.setVisibility(View.GONE); + searching = true; } @Override public void onSearchCollapse() { dropDownContainer.setVisibility(View.VISIBLE); + documentsSearchAdapter.searchDocuments(null); + searching = false; + searchWas = false; + switchToCurrentSelectedMode(); } @Override public void onTextChanged(EditText editText) { - + if (documentsSearchAdapter == null) { + return; + } + String text = editText.getText().toString(); + if (text.length() != 0) { + searchWas = true; + switchToCurrentSelectedMode(); + } + documentsSearchAdapter.searchDocuments(text); } }); searchItem.getSearchField().setHint(LocaleController.getString("Search", R.string.Search)); @@ -282,7 +373,7 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No dropDownContainer = new ActionBarMenuItem(getParentActivity(), menu, R.drawable.bar_selector); dropDownContainer.setSubMenuOpenSide(1); - dropDownContainer.addSubItem(shared_media_item, LocaleController.getString("SharedMedia", R.string.SharedMedia), 0); + dropDownContainer.addSubItem(shared_media_item, LocaleController.getString("SharedMediaTitle", R.string.SharedMediaTitle), 0); dropDownContainer.addSubItem(files_item, LocaleController.getString("DocumentsTitle", R.string.DocumentsTitle), 0); actionBar.addView(dropDownContainer); FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) dropDownContainer.getLayoutParams(); @@ -348,206 +439,83 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No } actionModeViews.add(actionMode.addItem(delete, R.drawable.ic_ab_fwd_delete, R.drawable.bar_selector_mode, null, AndroidUtilities.dp(54))); + photoVideoAdapter = new SharedPhotoVideoAdapter(getParentActivity()); + documentsAdapter = new SharedDocumentsAdapter(getParentActivity()); + documentsSearchAdapter = new DocumentsSearchAdapter(getParentActivity()); FrameLayout frameLayout; fragmentView = frameLayout = new FrameLayout(getParentActivity()); - fragmentView.setBackgroundColor(0xfff0f0f0); - mediaListView = new ListView(getParentActivity()); - mediaListView.setDivider(null); - mediaListView.setDividerHeight(0); - mediaListView.setVerticalScrollBarEnabled(false); - mediaListView.setDrawSelectorOnTop(true); - frameLayout.addView(mediaListView); - layoutParams = (FrameLayout.LayoutParams) mediaListView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.gravity = Gravity.TOP; - mediaListView.setLayoutParams(layoutParams); - mediaListView.setAdapter(documentsAdapter = new SharedDocumentsAdapter(getParentActivity())); - mediaListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView adapterView, View view, final int i, long l) { - if (view instanceof SharedDocumentCell) { - SharedDocumentCell cell = (SharedDocumentCell) view; - MessageObject message = cell.getDocument(); - if (actionBar.isActionModeShowed()) { - if (selectedFiles.containsKey(message.messageOwner.id)) { - selectedFiles.remove(message.messageOwner.id); - } else { - selectedFiles.put(message.messageOwner.id, message); - } - if (selectedFiles.isEmpty()) { - actionBar.hideActionMode(); - } else { - selectedMessagesCountTextView.setText(String.format("%d", selectedFiles.size())); - } - scrolling = false; - if (view instanceof SharedDocumentCell) { - ((SharedDocumentCell) view).setChecked(selectedFiles.containsKey(message.messageOwner.id), true); - } - } else { - if (cell.isLoaded()) { - File f = null; - String fileName = FileLoader.getAttachFileName(message.messageOwner.media.document); - if (message.messageOwner.attachPath != null && message.messageOwner.attachPath.length() != 0) { - f = new File(message.messageOwner.attachPath); - } - if (f == null || f != null && !f.exists()) { - f = FileLoader.getPathToMessage(message.messageOwner); - } - if (f != null && f.exists()) { - String realMimeType = null; - try { - Intent intent = new Intent(Intent.ACTION_VIEW); - MimeTypeMap myMime = MimeTypeMap.getSingleton(); - int idx = fileName.lastIndexOf("."); - if (idx != -1) { - String ext = fileName.substring(idx + 1); - realMimeType = myMime.getMimeTypeFromExtension(ext.toLowerCase()); - if (realMimeType == null) { - realMimeType = message.messageOwner.media.document.mime_type; - if (realMimeType == null || realMimeType.length() == 0) { - realMimeType = null; - } - } - if (realMimeType != null) { - intent.setDataAndType(Uri.fromFile(f), realMimeType); - } else { - intent.setDataAndType(Uri.fromFile(f), "text/plain"); - } - } else { - intent.setDataAndType(Uri.fromFile(f), "text/plain"); - } - if (realMimeType != null) { - try { - getParentActivity().startActivity(intent); - } catch (Exception e) { - intent.setDataAndType(Uri.fromFile(f), "text/plain"); - getParentActivity().startActivity(intent); - } - } else { - getParentActivity().startActivity(intent); - } - } catch (Exception e) { - if (getParentActivity() == null) { - return; - } - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null); - builder.setMessage(LocaleController.formatString("NoHandleAppInstalled", R.string.NoHandleAppInstalled, message.messageOwner.media.document.mime_type)); - showAlertDialog(builder); - } - } - } else if (!cell.isLoading()) { - FileLoader.getInstance().loadFile(cell.getDocument().messageOwner.media.document, true, false); - cell.updateFileExistIcon(); - } else { - FileLoader.getInstance().cancelLoadFile(cell.getDocument().messageOwner.media.document); - cell.updateFileExistIcon(); - } - } - } - } - }); - mediaListView.setOnScrollListener(new AbsListView.OnScrollListener() { - @Override - public void onScrollStateChanged(AbsListView view, int scrollState) { - scrolling = scrollState != SCROLL_STATE_IDLE; - } - - @Override - public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - if (visibleItemCount != 0 && firstVisibleItem + visibleItemCount > totalItemCount - 2 && !sharedMediaData[1].loading && !sharedMediaData[1].endReached) { - sharedMediaData[1].loading = true; - SharedMediaQuery.loadMedia(dialog_id, 0, 50, sharedMediaData[1].max_id, SharedMediaQuery.MEDIA_FILE, !sharedMediaData[1].cacheEndReached, classGuid); - } - } - }); - mediaListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { - @Override - public boolean onItemLongClick(AdapterView parent, View view, int i, long id) { - if (actionBar.isActionModeShowed() || i < 0 || i >= sharedMediaData[1].messages.size()) { - return false; - } - MessageObject item = sharedMediaData[1].messages.get(i); - selectedFiles.put(item.messageOwner.id, item); - selectedMessagesCountTextView.setText(String.format("%d", selectedFiles.size())); - if (Build.VERSION.SDK_INT >= 11) { - AnimatorSetProxy animatorSet = new AnimatorSetProxy(); - ArrayList animators = new ArrayList<>(); - for (int a = 0; a < actionModeViews.size(); a++) { - View view2 = actionModeViews.get(a); - AndroidUtilities.clearDrawableAnimation(view2); - if (a < 1) { - animators.add(ObjectAnimatorProxy.ofFloat(view2, "translationX", -AndroidUtilities.dp(56), 0)); - } else { - animators.add(ObjectAnimatorProxy.ofFloat(view2, "scaleY", 0.1f, 1.0f)); - } - } - animatorSet.playTogether(animators); - animatorSet.setDuration(250); - animatorSet.start(); - } - scrolling = false; - if (view instanceof SharedDocumentCell) { - ((SharedDocumentCell) view).setChecked(true, true); - } - actionBar.showActionMode(); - return true; - } - }); - - listView = new GridView(getParentActivity()); - listView.setPadding(AndroidUtilities.dp(2), 0, AndroidUtilities.dp(2), AndroidUtilities.dp(2)); - listView.setClipToPadding(false); + listView = new SectionsListView(getParentActivity()); + listView.setDivider(null); + listView.setDividerHeight(0); listView.setDrawSelectorOnTop(true); - listView.setVerticalSpacing(AndroidUtilities.dp(4)); - listView.setHorizontalSpacing(AndroidUtilities.dp(4)); - listView.setSelector(R.drawable.list_selector); - listView.setGravity(Gravity.CENTER); - listView.setNumColumns(GridView.AUTO_FIT); - listView.setStretchMode(GridView.STRETCH_COLUMN_WIDTH); + listView.setClipToPadding(false); frameLayout.addView(listView); layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.gravity = Gravity.TOP; listView.setLayoutParams(layoutParams); - listView.setAdapter(listAdapter = new ListAdapter(getParentActivity())); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override - public void onItemClick(AdapterView adapterView, View view, int i, long l) { - if (i < 0 || i >= sharedMediaData[selectedMode].messages.size()) { - return; - } - if (selectedMode == 0) { - PhotoViewer.getInstance().setParentActivity(getParentActivity()); - PhotoViewer.getInstance().openPhoto(sharedMediaData[selectedMode].messages, i, MediaActivity.this); - } else if (selectedMode == 1) { - + public void onItemClick(AdapterView adapterView, View view, final int i, long l) { + if (selectedMode == 1 && view instanceof SharedDocumentCell) { + SharedDocumentCell cell = (SharedDocumentCell) view; + MessageObject message = cell.getDocument(); + MediaActivity.this.onItemClick(i, view, message, 0); } } }); listView.setOnScrollListener(new AbsListView.OnScrollListener() { @Override - public void onScrollStateChanged(AbsListView absListView, int i) { - + public void onScrollStateChanged(AbsListView view, int scrollState) { + if (scrollState == SCROLL_STATE_TOUCH_SCROLL && searching && searchWas) { + AndroidUtilities.hideKeyboard(getParentActivity().getCurrentFocus()); + } + scrolling = scrollState != SCROLL_STATE_IDLE; } @Override - public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - if (visibleItemCount != 0 && firstVisibleItem + visibleItemCount > totalItemCount - 2 && !sharedMediaData[0].loading && !sharedMediaData[0].endReached) { - sharedMediaData[0].loading = true; - SharedMediaQuery.loadMedia(dialog_id, 0, 50, sharedMediaData[0].max_id, SharedMediaQuery.MEDIA_PHOTOVIDEO, !sharedMediaData[0].cacheEndReached, classGuid); + public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { + if (searching && searchWas) { + return; + } + if (visibleItemCount != 0 && firstVisibleItem + visibleItemCount > totalItemCount - 2 && !sharedMediaData[selectedMode].loading && !sharedMediaData[selectedMode].endReached) { + sharedMediaData[selectedMode].loading = true; + int type; + if (selectedMode == 0) { + type = SharedMediaQuery.MEDIA_PHOTOVIDEO; + } else if (selectedMode == 1) { + type = SharedMediaQuery.MEDIA_FILE; + } else { + type = SharedMediaQuery.MEDIA_AUDIO; + } + SharedMediaQuery.loadMedia(dialog_id, 0, 50, sharedMediaData[selectedMode].max_id, type, !sharedMediaData[selectedMode].cacheEndReached, classGuid); } } }); + listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { + @Override + public boolean onItemLongClick(AdapterView parent, View view, int i, long id) { + if (selectedMode == 1 && view instanceof SharedDocumentCell) { + SharedDocumentCell cell = (SharedDocumentCell) view; + MessageObject message = cell.getDocument(); + return MediaActivity.this.onItemLongClick(message, view, 0); + } + return false; + } + }); + + for (int a = 0; a < 6; a++) { + cellCache.add(new SharedPhotoVideoCell(getParentActivity())); + } emptyView = new LinearLayout(getParentActivity()); emptyView.setOrientation(LinearLayout.VERTICAL); emptyView.setGravity(Gravity.CENTER); emptyView.setVisibility(View.GONE); + emptyView.setBackgroundColor(0xfff0f0f0); frameLayout.addView(emptyView); layoutParams = (FrameLayout.LayoutParams) emptyView.getLayoutParams(); layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; @@ -584,6 +552,7 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No progressView.setGravity(Gravity.CENTER); progressView.setOrientation(LinearLayout.VERTICAL); progressView.setVisibility(View.GONE); + progressView.setBackgroundColor(0xfff0f0f0); frameLayout.addView(progressView); layoutParams = (FrameLayout.LayoutParams) progressView.getLayoutParams(); layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; @@ -621,16 +590,7 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No boolean added = false; boolean enc = ((int) dialog_id) == 0; for (MessageObject message : arr) { - if (!sharedMediaData[type].messagesDict.containsKey(message.messageOwner.id)) { - if (!enc) { - if (message.messageOwner.id > 0) { - sharedMediaData[type].max_id = Math.min(message.messageOwner.id, sharedMediaData[type].max_id); - } - } else { - sharedMediaData[type].max_id = Math.max(message.messageOwner.id, sharedMediaData[type].max_id); - } - sharedMediaData[type].messagesDict.put(message.messageOwner.id, message); - sharedMediaData[type].messages.add(message); + if (sharedMediaData[type].addMessage(message, false, enc)) { added = true; } } @@ -641,25 +601,23 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No if (progressView != null) { progressView.setVisibility(View.GONE); } - if (type == 0) { - if (listView != null) { - if (listView.getEmptyView() == null) { - listView.setEmptyView(emptyView); - } - } - } else if (type == 1) { - if (mediaListView != null) { - if (mediaListView.getEmptyView() == null) { - mediaListView.setEmptyView(emptyView); - } + if (selectedMode == type && listView != null) { + if (listView.getEmptyView() == null) { + listView.setEmptyView(emptyView); } } - if (listAdapter != null) { - listAdapter.notifyDataSetChanged(); + scrolling = true; + if (selectedMode == 0 && type == 0) { + if (photoVideoAdapter != null) { + photoVideoAdapter.notifyDataSetChanged(); + } + } else if (selectedMode == 1 && type == 1) { + if (documentsAdapter != null) { + documentsAdapter.notifyDataSetChanged(); + } } - if (documentsAdapter != null) { - scrolling = true; - documentsAdapter.notifyDataSetChanged(); + if (selectedMode == 1) { + searchItem.setVisibility(!sharedMediaData[selectedMode].messages.isEmpty() && !searching ? View.VISIBLE : View.GONE); } } } else if (id == NotificationCenter.messagesDeleted) { @@ -667,28 +625,30 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No boolean updated = false; for (Integer ids : markAsDeletedMessages) { for (SharedMediaData data : sharedMediaData) { - MessageObject obj = data.messagesDict.get(ids); - if (obj != null) { - data.messages.remove(obj); - data.messagesDict.remove(ids); - data.totalCount--; + if (data.deleteMessage(ids)) { updated = true; } } } - if (updated && listAdapter != null) { - listAdapter.notifyDataSetChanged(); - } - if (documentsAdapter != null) { + if (updated) { scrolling = true; - documentsAdapter.notifyDataSetChanged(); + if (photoVideoAdapter != null) { + photoVideoAdapter.notifyDataSetChanged(); + } + if (documentsAdapter != null) { + documentsAdapter.notifyDataSetChanged(); + } + if (selectedMode == 1) { + searchItem.setVisibility(!sharedMediaData[selectedMode].messages.isEmpty() && !searching ? View.VISIBLE : View.GONE); + } } } else if (id == NotificationCenter.didReceivedNewMessages) { long uid = (Long) args[0]; if (uid == dialog_id) { boolean markAsRead = false; ArrayList arr = (ArrayList) args[1]; - + boolean enc = ((int) dialog_id) == 0; + boolean updated = false; for (MessageObject obj : arr) { if (obj.messageOwner.media == null) { continue; @@ -697,38 +657,28 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No if (type == -1) { return; } - if (sharedMediaData[type].messagesDict.containsKey(obj.messageOwner.id)) { - continue; + if (sharedMediaData[type].addMessage(obj, true, enc)) { + updated = true; } - boolean enc = ((int) dialog_id) == 0; - if (!enc) { - if (obj.messageOwner.id > 0) { - sharedMediaData[type].max_id = Math.min(obj.messageOwner.id, sharedMediaData[type].max_id); - } - } else { - sharedMediaData[type].max_id = Math.max(obj.messageOwner.id, sharedMediaData[type].max_id); - } - sharedMediaData[type].messagesDict.put(obj.messageOwner.id, obj); - sharedMediaData[type].messages.add(0, obj); } - if (listAdapter != null) { - listAdapter.notifyDataSetChanged(); - } - if (documentsAdapter != null) { + if (updated) { scrolling = true; - documentsAdapter.notifyDataSetChanged(); + if (photoVideoAdapter != null) { + photoVideoAdapter.notifyDataSetChanged(); + } + if (documentsAdapter != null) { + documentsAdapter.notifyDataSetChanged(); + } + if (selectedMode == 1) { + searchItem.setVisibility(!sharedMediaData[selectedMode].messages.isEmpty() && !searching ? View.VISIBLE : View.GONE); + } } } } else if (id == NotificationCenter.messageReceivedByServer) { Integer msgId = (Integer) args[0]; + Integer newMsgId = (Integer) args[1]; for (SharedMediaData data : sharedMediaData) { - MessageObject obj = data.messagesDict.get(msgId); - if (obj != null) { - Integer newMsgId = (Integer) args[1]; - data.messagesDict.remove(msgId); - data.messagesDict.put(newMsgId, obj); - obj.messageOwner.id = newMsgId; - } + data.replaceMid(msgId, newMsgId); } } } @@ -736,48 +686,65 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No @Override public void onResume() { super.onResume(); - if (listAdapter != null) { - listAdapter.notifyDataSetChanged(); + scrolling = true; + if (photoVideoAdapter != null) { + photoVideoAdapter.notifyDataSetChanged(); } if (documentsAdapter != null) { - scrolling = true; documentsAdapter.notifyDataSetChanged(); } - fixLayout(); + fixLayoutInternal(); } @Override public void onConfigurationChanged(android.content.res.Configuration newConfig) { super.onConfigurationChanged(newConfig); - fixLayout(); + if (listView != null) { + ViewTreeObserver obs = listView.getViewTreeObserver(); + obs.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + listView.getViewTreeObserver().removeOnPreDrawListener(this); + fixLayoutInternal(); + return false; + } + }); + } + } + + @Override + public void updatePhotoAtIndex(int index) { + } @Override public PhotoViewer.PlaceProviderObject getPlaceForPhoto(MessageObject messageObject, TLRPC.FileLocation fileLocation, int index) { - if (messageObject == null || listView == null) { + if (messageObject == null || listView == null || selectedMode != 0) { return null; } int count = listView.getChildCount(); for (int a = 0; a < count; a++) { View view = listView.getChildAt(a); - BackupImageView imageView = (BackupImageView)view.findViewById(R.id.media_photo_image); - if (imageView != null) { - int num = (Integer)imageView.getTag(); - if (num < 0 || num >= sharedMediaData[0].messages.size()) { - continue; - } - MessageObject message = sharedMediaData[0].messages.get(num); - if (message != null && message.messageOwner.id == messageObject.messageOwner.id) { - int coords[] = new int[2]; - imageView.getLocationInWindow(coords); - PhotoViewer.PlaceProviderObject object = new PhotoViewer.PlaceProviderObject(); - object.viewX = coords[0]; - object.viewY = coords[1] - AndroidUtilities.statusBarHeight; - object.parentView = listView; - object.imageReceiver = imageView.imageReceiver; - object.thumb = object.imageReceiver.getBitmap(); - return object; + if (view instanceof SharedPhotoVideoCell) { + SharedPhotoVideoCell cell = (SharedPhotoVideoCell) view; + for (int i = 0; i < 6; i++) { + MessageObject message = cell.getMessageObject(i); + if (message == null) { + break; + } + BackupImageView imageView = cell.getImageView(i); + if (message.messageOwner.id == messageObject.messageOwner.id) { + int coords[] = new int[2]; + imageView.getLocationInWindow(coords); + PhotoViewer.PlaceProviderObject object = new PhotoViewer.PlaceProviderObject(); + object.viewX = coords[0]; + object.viewY = coords[1] - AndroidUtilities.statusBarHeight; + object.parentView = listView; + object.imageReceiver = imageView.imageReceiver; + object.thumb = object.imageReceiver.getBitmap(); + return object; + } } } } @@ -811,106 +778,222 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No public int getSelectedCount() { return 0; } private void switchToCurrentSelectedMode() { - if (selectedMode == 0) { - mediaListView.setEmptyView(null); - mediaListView.setVisibility(View.GONE); - mediaListView.setAdapter(null); - - listView.setAdapter(listAdapter); - - dropDown.setText(LocaleController.getString("SharedMedia", R.string.SharedMedia)); - emptyImageView.setImageResource(R.drawable.tip1); - emptyTextView.setText(LocaleController.getString("NoMedia", R.string.NoMedia)); - searchItem.setVisibility(View.GONE); - if (sharedMediaData[selectedMode].loading && sharedMediaData[selectedMode].messages.isEmpty()) { - progressView.setVisibility(View.VISIBLE); - listView.setEmptyView(null); - emptyView.setVisibility(View.GONE); - } else { - progressView.setVisibility(View.GONE); - listView.setEmptyView(emptyView); + if (searching && searchWas) { + if (listView != null) { + listView.setAdapter(documentsSearchAdapter); + documentsSearchAdapter.notifyDataSetChanged(); } - listView.setVisibility(View.VISIBLE); - } else if (selectedMode == 1) { - listView.setEmptyView(null); - listView.setVisibility(View.GONE); - listView.setAdapter(null); - - mediaListView.setAdapter(documentsAdapter); - - dropDown.setText(LocaleController.getString("DocumentsTitle", R.string.DocumentsTitle)); - int lower_id = (int) dialog_id; - emptyImageView.setImageResource(R.drawable.tip2); - emptyTextView.setText(LocaleController.getString("NoSharedFiles", R.string.NoSharedFiles)); - //searchItem.setVisibility(View.VISIBLE); - if (!sharedMediaData[1].loading && !sharedMediaData[1].endReached && sharedMediaData[1].messages.isEmpty()) { - sharedMediaData[selectedMode].loading = true; - SharedMediaQuery.loadMedia(dialog_id, 0, 50, 0, SharedMediaQuery.MEDIA_FILE, true, classGuid); + if (emptyTextView != null) { + emptyTextView.setText(LocaleController.getString("NoResult", R.string.NoResult)); + emptyTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); + emptyImageView.setVisibility(View.GONE); } - mediaListView.setVisibility(View.VISIBLE); - - if (sharedMediaData[selectedMode].loading && sharedMediaData[selectedMode].messages.isEmpty()) { - progressView.setVisibility(View.VISIBLE); - mediaListView.setEmptyView(null); - emptyView.setVisibility(View.GONE); - } else { - progressView.setVisibility(View.GONE); - mediaListView.setEmptyView(emptyView); - } - } - } - - private void fixLayout() { - if (listView != null) { - ViewTreeObserver obs = listView.getViewTreeObserver(); - obs.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { - @Override - public boolean onPreDraw() { - WindowManager manager = (WindowManager) ApplicationLoader.applicationContext.getSystemService(Activity.WINDOW_SERVICE); - int rotation = manager.getDefaultDisplay().getRotation(); - - if (AndroidUtilities.isTablet()) { - listView.setNumColumns(4); - itemWidth = AndroidUtilities.dp(490) / 4 - AndroidUtilities.dp(2) * 3; - listView.setColumnWidth(itemWidth); - emptyTextView.setPadding(AndroidUtilities.dp(40), 0, AndroidUtilities.dp(40), AndroidUtilities.dp(128)); - } else { - if (rotation == Surface.ROTATION_270 || rotation == Surface.ROTATION_90) { - listView.setNumColumns(6); - itemWidth = AndroidUtilities.displaySize.x / 6 - AndroidUtilities.dp(2) * 5; - listView.setColumnWidth(itemWidth); - emptyTextView.setPadding(AndroidUtilities.dp(40), 0, AndroidUtilities.dp(40), 0); - } else { - listView.setNumColumns(4); - itemWidth = AndroidUtilities.displaySize.x / 4 - AndroidUtilities.dp(2) * 3; - listView.setColumnWidth(itemWidth); - emptyTextView.setPadding(AndroidUtilities.dp(40), 0, AndroidUtilities.dp(40), AndroidUtilities.dp(128)); - } - } - listView.setPadding(listView.getPaddingLeft(), AndroidUtilities.dp(4), listView.getPaddingRight(), listView.getPaddingBottom()); - listAdapter.notifyDataSetChanged(); - listView.getViewTreeObserver().removeOnPreDrawListener(this); - - if (dropDownContainer != null) { - if (!AndroidUtilities.isTablet()) { - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) dropDownContainer.getLayoutParams(); - layoutParams.topMargin = (Build.VERSION.SDK_INT >= 21 ? AndroidUtilities.statusBarHeight : 0); - dropDownContainer.setLayoutParams(layoutParams); - } - - if (!AndroidUtilities.isTablet() && ApplicationLoader.applicationContext.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { - dropDown.setTextSize(18); - } else { - dropDown.setTextSize(20); - } - } - return false; + } else { + emptyTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 17); + emptyImageView.setVisibility(View.VISIBLE); + if (selectedMode == 0) { + listView.setAdapter(photoVideoAdapter); + dropDown.setText(LocaleController.getString("SharedMedia", R.string.SharedMedia)); + emptyImageView.setImageResource(R.drawable.tip1); + emptyTextView.setText(LocaleController.getString("NoMedia", R.string.NoMedia)); + searchItem.setVisibility(View.GONE); + if (sharedMediaData[selectedMode].loading && sharedMediaData[selectedMode].messages.isEmpty()) { + progressView.setVisibility(View.VISIBLE); + listView.setEmptyView(null); + emptyView.setVisibility(View.GONE); + } else { + progressView.setVisibility(View.GONE); + listView.setEmptyView(emptyView); } - }); + listView.setVisibility(View.VISIBLE); + listView.setPadding(0, 0, 0, AndroidUtilities.dp(4)); + } else if (selectedMode == 1) { + listView.setAdapter(documentsAdapter); + dropDown.setText(LocaleController.getString("DocumentsTitle", R.string.DocumentsTitle)); + int lower_id = (int) dialog_id; + emptyImageView.setImageResource(R.drawable.tip2); + emptyTextView.setText(LocaleController.getString("NoSharedFiles", R.string.NoSharedFiles)); + searchItem.setVisibility(!sharedMediaData[1].messages.isEmpty() ? View.VISIBLE : View.GONE); + if (!sharedMediaData[1].loading && !sharedMediaData[1].endReached && sharedMediaData[1].messages.isEmpty()) { + sharedMediaData[selectedMode].loading = true; + SharedMediaQuery.loadMedia(dialog_id, 0, 50, 0, SharedMediaQuery.MEDIA_FILE, true, classGuid); + } + listView.setVisibility(View.VISIBLE); + if (sharedMediaData[selectedMode].loading && sharedMediaData[selectedMode].messages.isEmpty()) { + progressView.setVisibility(View.VISIBLE); + listView.setEmptyView(null); + emptyView.setVisibility(View.GONE); + } else { + progressView.setVisibility(View.GONE); + listView.setEmptyView(emptyView); + } + listView.setPadding(0, 0, 0, AndroidUtilities.dp(4)); + } } } - private class SharedDocumentsAdapter extends BaseFragmentAdapter { + private boolean onItemLongClick(MessageObject item, View view, int a) { + if (actionBar.isActionModeShowed()) { + return false; + } + selectedFiles.put(item.messageOwner.id, item); + selectedMessagesCountTextView.setText(String.format("%d", selectedFiles.size())); + if (Build.VERSION.SDK_INT >= 11) { + AnimatorSetProxy animatorSet = new AnimatorSetProxy(); + ArrayList animators = new ArrayList<>(); + for (int i = 0; i < actionModeViews.size(); i++) { + View view2 = actionModeViews.get(i); + AndroidUtilities.clearDrawableAnimation(view2); + if (i < 1) { + animators.add(ObjectAnimatorProxy.ofFloat(view2, "translationX", -AndroidUtilities.dp(56), 0)); + } else { + animators.add(ObjectAnimatorProxy.ofFloat(view2, "scaleY", 0.1f, 1.0f)); + } + } + animatorSet.playTogether(animators); + animatorSet.setDuration(250); + animatorSet.start(); + } + scrolling = false; + if (view instanceof SharedDocumentCell) { + ((SharedDocumentCell) view).setChecked(true, true); + } else if (view instanceof SharedPhotoVideoCell) { + ((SharedPhotoVideoCell) view).setChecked(a, true, true); + } + actionBar.showActionMode(); + return true; + } + + private void onItemClick(int index, View view, MessageObject message, int a) { + if (message == null) { + return; + } + if (actionBar.isActionModeShowed()) { + if (selectedFiles.containsKey(message.messageOwner.id)) { + selectedFiles.remove(message.messageOwner.id); + } else { + selectedFiles.put(message.messageOwner.id, message); + } + if (selectedFiles.isEmpty()) { + actionBar.hideActionMode(); + } else { + selectedMessagesCountTextView.setText(String.format("%d", selectedFiles.size())); + } + scrolling = false; + if (view instanceof SharedDocumentCell) { + ((SharedDocumentCell) view).setChecked(selectedFiles.containsKey(message.messageOwner.id), true); + } else if (view instanceof SharedPhotoVideoCell) { + ((SharedPhotoVideoCell) view).setChecked(a, selectedFiles.containsKey(message.messageOwner.id), true); + } + } else { + if (selectedMode == 0) { + PhotoViewer.getInstance().setParentActivity(getParentActivity()); + PhotoViewer.getInstance().openPhoto(sharedMediaData[selectedMode].messages, index, this); + } else if (selectedMode == 1) { + if (view instanceof SharedDocumentCell) { + SharedDocumentCell cell = (SharedDocumentCell) view; + if (cell.isLoaded()) { + File f = null; + String fileName = FileLoader.getAttachFileName(message.messageOwner.media.document); + if (message.messageOwner.attachPath != null && message.messageOwner.attachPath.length() != 0) { + f = new File(message.messageOwner.attachPath); + } + if (f == null || f != null && !f.exists()) { + f = FileLoader.getPathToMessage(message.messageOwner); + } + if (f != null && f.exists()) { + String realMimeType = null; + try { + Intent intent = new Intent(Intent.ACTION_VIEW); + MimeTypeMap myMime = MimeTypeMap.getSingleton(); + int idx = fileName.lastIndexOf("."); + if (idx != -1) { + String ext = fileName.substring(idx + 1); + realMimeType = myMime.getMimeTypeFromExtension(ext.toLowerCase()); + if (realMimeType == null) { + realMimeType = message.messageOwner.media.document.mime_type; + if (realMimeType == null || realMimeType.length() == 0) { + realMimeType = null; + } + } + if (realMimeType != null) { + intent.setDataAndType(Uri.fromFile(f), realMimeType); + } else { + intent.setDataAndType(Uri.fromFile(f), "text/plain"); + } + } else { + intent.setDataAndType(Uri.fromFile(f), "text/plain"); + } + if (realMimeType != null) { + try { + getParentActivity().startActivityForResult(intent, 500); + } catch (Exception e) { + intent.setDataAndType(Uri.fromFile(f), "text/plain"); + getParentActivity().startActivityForResult(intent, 500); + } + } else { + getParentActivity().startActivityForResult(intent, 500); + } + } catch (Exception e) { + if (getParentActivity() == null) { + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null); + builder.setMessage(LocaleController.formatString("NoHandleAppInstalled", R.string.NoHandleAppInstalled, message.messageOwner.media.document.mime_type)); + showAlertDialog(builder); + } + } + } else if (!cell.isLoading()) { + FileLoader.getInstance().loadFile(cell.getDocument().messageOwner.media.document, true, false); + cell.updateFileExistIcon(); + } else { + FileLoader.getInstance().cancelLoadFile(cell.getDocument().messageOwner.media.document); + cell.updateFileExistIcon(); + } + } + } + } + } + + private void fixLayoutInternal() { + if (listView == null) { + return; + } + WindowManager manager = (WindowManager) ApplicationLoader.applicationContext.getSystemService(Activity.WINDOW_SERVICE); + int rotation = manager.getDefaultDisplay().getRotation(); + + if (AndroidUtilities.isTablet()) { + columnsCount = 4; + emptyTextView.setPadding(AndroidUtilities.dp(40), 0, AndroidUtilities.dp(40), AndroidUtilities.dp(128)); + } else { + if (rotation == Surface.ROTATION_270 || rotation == Surface.ROTATION_90) { + columnsCount = 6; + emptyTextView.setPadding(AndroidUtilities.dp(40), 0, AndroidUtilities.dp(40), 0); + } else { + columnsCount = 4; + emptyTextView.setPadding(AndroidUtilities.dp(40), 0, AndroidUtilities.dp(40), AndroidUtilities.dp(128)); + } + } + photoVideoAdapter.notifyDataSetChanged(); + + if (dropDownContainer != null) { + if (!AndroidUtilities.isTablet()) { + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) dropDownContainer.getLayoutParams(); + layoutParams.topMargin = (Build.VERSION.SDK_INT >= 21 ? AndroidUtilities.statusBarHeight : 0); + dropDownContainer.setLayoutParams(layoutParams); + } + + if (!AndroidUtilities.isTablet() && ApplicationLoader.applicationContext.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { + dropDown.setTextSize(18); + } else { + dropDown.setTextSize(20); + } + } + } + + private class SharedDocumentsAdapter extends BaseSectionsAdapter { private Context mContext; public SharedDocumentsAdapter(Context context) { @@ -918,204 +1001,456 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No } @Override - public boolean areAllItemsEnabled() { - return false; - } - - @Override - public boolean isEnabled(int i) { - return i != sharedMediaData[1].messages.size(); - } - - @Override - public int getCount() { - return sharedMediaData[1].messages.size() + (sharedMediaData[1].messages.isEmpty() || sharedMediaData[1].endReached ? 0 : 1); - } - - @Override - public Object getItem(int i) { + public Object getItem(int section, int position) { return null; } @Override - public long getItemId(int i) { - return i; + public boolean isRowEnabled(int section, int row) { + return row != 0; } @Override - public boolean hasStableIds() { - return true; + public int getSectionCount() { + return sharedMediaData[1].sections.size() + (sharedMediaData[1].sections.isEmpty() || sharedMediaData[1].endReached ? 0 : 1); } @Override - public View getView(int i, View view, ViewGroup viewGroup) { - int type = getItemViewType(i); - if (type == 0) { - if (view == null) { - view = new SharedDocumentCell(mContext); - } - SharedDocumentCell sharedDocumentCell = (SharedDocumentCell) view; - sharedDocumentCell.setDocument(sharedMediaData[1].messages.get(i), i != sharedMediaData[1].messages.size() - 1 || sharedMediaData[1].loading); - if (actionBar.isActionModeShowed()) { - sharedDocumentCell.setChecked(selectedFiles.containsKey(sharedMediaData[1].messages.get(i).messageOwner.id), !scrolling); + public int getCountForSection(int section) { + if (section < sharedMediaData[1].sections.size()) { + return sharedMediaData[1].sectionArrays.get(sharedMediaData[1].sections.get(section)).size() + 1; + } + return 1; + } + + @Override + public View getSectionHeaderView(int section, View convertView, ViewGroup parent) { + if (convertView == null) { + convertView = new GreySectionCell(mContext); + } + if (section < sharedMediaData[1].sections.size()) { + String name = sharedMediaData[1].sections.get(section); + ArrayList messageObjects = sharedMediaData[1].sectionArrays.get(name); + MessageObject messageObject = messageObjects.get(0); + ((GreySectionCell) convertView).setText(LocaleController.formatterMonthYear.format((long) messageObject.messageOwner.date * 1000).toUpperCase()); + } + return convertView; + } + + @Override + public View getItemView(int section, int position, View convertView, ViewGroup parent) { + if (section < sharedMediaData[1].sections.size()) { + String name = sharedMediaData[1].sections.get(section); + ArrayList messageObjects = sharedMediaData[1].sectionArrays.get(name); + if (position == 0) { + if (convertView == null) { + convertView = new GreySectionCell(mContext); + } + MessageObject messageObject = messageObjects.get(0); + ((GreySectionCell) convertView).setText(LocaleController.formatterMonthYear.format((long) messageObject.messageOwner.date * 1000).toUpperCase()); } else { - sharedDocumentCell.setChecked(false, !scrolling); + if (convertView == null) { + convertView = new SharedDocumentCell(mContext); + } + SharedDocumentCell sharedDocumentCell = (SharedDocumentCell) convertView; + MessageObject messageObject = messageObjects.get(position - 1); + sharedDocumentCell.setDocument(messageObject, position != messageObjects.size() || section == sharedMediaData[1].sections.size() - 1 && sharedMediaData[1].loading); + if (actionBar.isActionModeShowed()) { + sharedDocumentCell.setChecked(selectedFiles.containsKey(messageObject.messageOwner.id), !scrolling); + } else { + sharedDocumentCell.setChecked(false, !scrolling); + } } - } else if (type == 1) { - if (view == null) { - view = new LoadingCell(mContext); + } else { + if (convertView == null) { + convertView = new LoadingCell(mContext); } } - return view; + return convertView; } @Override - public int getItemViewType(int i) { - if (i == sharedMediaData[1].messages.size()) { - return 1; + public int getItemViewType(int section, int position) { + if (section < sharedMediaData[1].sections.size()) { + if (position == 0) { + return 0; + } else { + return 1; + } } - return 0; - } - - @Override - public int getViewTypeCount() { return 2; } - @Override - public boolean isEmpty() { - return sharedMediaData[1].messages.isEmpty(); - } - } - - private class ListAdapter extends BaseFragmentAdapter { - private Context mContext; - - public ListAdapter(Context context) { - mContext = context; - } - - @Override - public boolean areAllItemsEnabled() { - return false; - } - - @Override - public boolean isEnabled(int i) { - return i != sharedMediaData[0].messages.size(); - } - - @Override - public int getCount() { - return sharedMediaData[0].messages.size() + (sharedMediaData[0].messages.isEmpty() || sharedMediaData[0].endReached ? 0 : 1); - } - - @Override - public Object getItem(int i) { - return null; - } - - @Override - public long getItemId(int i) { - return i; - } - - @Override - public boolean hasStableIds() { - return true; - } - - @Override - public View getView(int i, View view, ViewGroup viewGroup) { - int type = getItemViewType(i); - if (type == 0) { - MessageObject message = sharedMediaData[0].messages.get(i); - if (view == null) { - LayoutInflater li = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - view = li.inflate(R.layout.media_photo_layout, viewGroup, false); - } - ViewGroup.LayoutParams params = view.getLayoutParams(); - params.width = itemWidth; - params.height = itemWidth; - view.setLayoutParams(params); - - BackupImageView imageView = (BackupImageView)view.findViewById(R.id.media_photo_image); - imageView.setTag(i); - - imageView.imageReceiver.setParentMessageObject(message); - imageView.imageReceiver.setNeedsQualityThumb(true); - imageView.imageReceiver.setShouldGenerateQualityThumb(true); - if (message.messageOwner.media != null && message.messageOwner.media.photo != null && !message.messageOwner.media.photo.sizes.isEmpty()) { - TLRPC.PhotoSize photoSize = FileLoader.getClosestPhotoSizeWithSize(message.photoThumbs, 80); - imageView.setImage(null, null, null, mContext.getResources().getDrawable(R.drawable.photo_placeholder_in), null, photoSize.location, "b", 0); - } else { - imageView.setImageResource(R.drawable.photo_placeholder_in); - } - imageView.imageReceiver.setVisible(!PhotoViewer.getInstance().isShowingImage(message), false); - } else if (type == 1) { - MessageObject message = sharedMediaData[0].messages.get(i); - if (view == null) { - LayoutInflater li = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - view = li.inflate(R.layout.media_video_layout, viewGroup, false); - } - ViewGroup.LayoutParams params = view.getLayoutParams(); - params.width = itemWidth; - params.height = itemWidth; - view.setLayoutParams(params); - - TextView textView = (TextView)view.findViewById(R.id.chat_video_time); - BackupImageView imageView = (BackupImageView)view.findViewById(R.id.media_photo_image); - imageView.setTag(i); - - imageView.imageReceiver.setParentMessageObject(message); - imageView.imageReceiver.setNeedsQualityThumb(true); - imageView.imageReceiver.setShouldGenerateQualityThumb(true); - if (message.messageOwner.media.video != null && message.messageOwner.media.video.thumb != null) { - int duration = message.messageOwner.media.video.duration; - int minutes = duration / 60; - int seconds = duration - minutes * 60; - textView.setText(String.format("%d:%02d", minutes, seconds)); - TLRPC.FileLocation location = message.messageOwner.media.video.thumb.location; - imageView.setImage(null, null, null, mContext.getResources().getDrawable(R.drawable.photo_placeholder_in), null, location, "b", 0); - textView.setVisibility(View.VISIBLE); - } else { - textView.setVisibility(View.GONE); - imageView.setImageResource(R.drawable.photo_placeholder_in); - } - imageView.imageReceiver.setVisible(!PhotoViewer.getInstance().isShowingImage(message), false); - } else if (type == 2) { - if (view == null) { - LayoutInflater li = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - view = li.inflate(R.layout.media_loading_layout, viewGroup, false); - } - ViewGroup.LayoutParams params = view.getLayoutParams(); - params.width = itemWidth; - params.height = itemWidth; - view.setLayoutParams(params); - } - return view; - } - - @Override - public int getItemViewType(int i) { - if (i == sharedMediaData[0].messages.size()) { - return 2; - } - MessageObject message = sharedMediaData[0].messages.get(i); - if (message.messageOwner.media instanceof TLRPC.TL_messageMediaVideo) { - return 1; - } - return 0; - } - @Override public int getViewTypeCount() { return 3; } + } + + private class SharedPhotoVideoAdapter extends BaseSectionsAdapter { + private Context mContext; + + public SharedPhotoVideoAdapter(Context context) { + mContext = context; + } + + @Override + public Object getItem(int section, int position) { + return null; + } + + @Override + public boolean isRowEnabled(int section, int row) { + return false; + } + + @Override + public int getSectionCount() { + return sharedMediaData[0].sections.size() + (sharedMediaData[0].sections.isEmpty() || sharedMediaData[0].endReached ? 0 : 1); + } + + @Override + public int getCountForSection(int section) { + if (section < sharedMediaData[0].sections.size()) { + return (int) Math.ceil(sharedMediaData[0].sectionArrays.get(sharedMediaData[0].sections.get(section)).size() / (float)columnsCount) + 1; + } + return 1; + } + + @Override + public View getSectionHeaderView(int section, View convertView, ViewGroup parent) { + if (convertView == null) { + convertView = new SharedMediaSectionCell(mContext); + convertView.setBackgroundColor(0xffffffff); + } + if (section < sharedMediaData[0].sections.size()) { + String name = sharedMediaData[0].sections.get(section); + ArrayList messageObjects = sharedMediaData[0].sectionArrays.get(name); + MessageObject messageObject = messageObjects.get(0); + ((SharedMediaSectionCell) convertView).setText(LocaleController.formatterMonthYear.format((long) messageObject.messageOwner.date * 1000).toUpperCase()); + } + return convertView; + } + + @Override + public View getItemView(int section, int position, View convertView, ViewGroup parent) { + if (section < sharedMediaData[0].sections.size()) { + String name = sharedMediaData[0].sections.get(section); + ArrayList messageObjects = sharedMediaData[0].sectionArrays.get(name); + if (position == 0) { + if (convertView == null) { + convertView = new SharedMediaSectionCell(mContext); + } + MessageObject messageObject = messageObjects.get(0); + ((SharedMediaSectionCell) convertView).setText(LocaleController.formatterMonthYear.format((long) messageObject.messageOwner.date * 1000).toUpperCase()); + } else { + SharedPhotoVideoCell cell = null; + if (convertView == null) { + if (!cellCache.isEmpty()) { + convertView = cellCache.get(0); + cellCache.remove(0); + } else { + convertView = new SharedPhotoVideoCell(mContext); + } + cell = (SharedPhotoVideoCell) convertView; + cell.setDelegate(new SharedPhotoVideoCell.SharedPhotoVideoCellDelegate() { + @Override + public void didClickItem(SharedPhotoVideoCell cell, int index, MessageObject messageObject, int a) { + onItemClick(index, cell, messageObject, a); + } + + @Override + public boolean didLongClickItem(SharedPhotoVideoCell cell, int index, MessageObject messageObject, int a) { + return onItemLongClick(messageObject, cell, a); + } + }); + } else { + cell = (SharedPhotoVideoCell) convertView; + } + cell.setItemsCount(columnsCount); + for (int a = 0; a < columnsCount; a++) { + int index = (position - 1) * columnsCount + a; + if (index < messageObjects.size()) { + MessageObject messageObject = messageObjects.get(index); + cell.setIsFirst(position == 1); + cell.setItem(a, sharedMediaData[0].messages.indexOf(messageObject), messageObject); + + if (actionBar.isActionModeShowed()) { + cell.setChecked(a, selectedFiles.containsKey(messageObject.messageOwner.id), !scrolling); + } else { + cell.setChecked(a, false, !scrolling); + } + } else { + cell.setItem(a, index, null); + } + } + } + } else { + if (convertView == null) { + convertView = new LoadingCell(mContext); + } + } + return convertView; + } + + @Override + public int getItemViewType(int section, int position) { + if (section < sharedMediaData[0].sections.size()) { + if (position == 0) { + return 0; + } else { + return 1; + } + } + return 2; + } + + @Override + public int getViewTypeCount() { + return 3; + } + } + + public class DocumentsSearchAdapter extends BaseFragmentAdapter { + private Context mContext; + private ArrayList searchResult = new ArrayList<>(); + private Timer searchTimer; + protected ArrayList globalSearch = new ArrayList<>(); + private long reqId = 0; + private int lastReqId; + + public DocumentsSearchAdapter(Context context) { + mContext = context; + } + + public void queryServerSearch(final String query, final int max_id) { + int uid = (int) dialog_id; + if (uid == 0) { + return; + } + if (reqId != 0) { + ConnectionsManager.getInstance().cancelRpc(reqId, true); + reqId = 0; + } + if (query == null || query.length() == 0) { + globalSearch.clear(); + lastReqId = 0; + notifyDataSetChanged(); + return; + } + TLRPC.TL_messages_search req = new TLRPC.TL_messages_search(); + req.offset = 0; + req.limit = 50; + req.max_id = max_id; + req.filter = new TLRPC.TL_inputMessagesFilterDocument(); + req.q = query; + if (uid < 0) { + req.peer = new TLRPC.TL_inputPeerChat(); + req.peer.chat_id = -uid; + } else { + TLRPC.User user = MessagesController.getInstance().getUser(uid); + if (user instanceof TLRPC.TL_userForeign || user instanceof TLRPC.TL_userRequest) { + req.peer = new TLRPC.TL_inputPeerForeign(); + req.peer.access_hash = user.access_hash; + } else { + req.peer = new TLRPC.TL_inputPeerContact(); + } + req.peer.user_id = uid; + } + final int currentReqId = ++lastReqId; + reqId = ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { + @Override + public void run(TLObject response, TLRPC.TL_error error) { + final ArrayList messageObjects = new ArrayList<>(); + if (error == null) { + TLRPC.messages_Messages res = (TLRPC.messages_Messages) response; + for (TLRPC.Message message : res.messages) { + messageObjects.add(new MessageObject(message, null, false)); + } + } + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + if (currentReqId == lastReqId) { + globalSearch = messageObjects; + notifyDataSetChanged(); + } + reqId = 0; + } + }); + } + }, true, RPCRequest.RPCRequestClassGeneric | RPCRequest.RPCRequestClassFailOnServerErrors); + ConnectionsManager.getInstance().bindRequestToGuid(reqId, classGuid); + } + + public void searchDocuments(final String query) { + try { + if (searchTimer != null) { + searchTimer.cancel(); + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + if (query == null) { + searchResult.clear(); + notifyDataSetChanged(); + } else { + searchTimer = new Timer(); + searchTimer.schedule(new TimerTask() { + @Override + public void run() { + try { + searchTimer.cancel(); + searchTimer = null; + } catch (Exception e) { + FileLog.e("tmessages", e); + } + processSearch(query); + } + }, 200, 300); + } + } + + private void processSearch(final String query) { + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + if (!sharedMediaData[1].messages.isEmpty()) { + MessageObject messageObject = sharedMediaData[1].messages.get(sharedMediaData[1].messages.size() - 1); + queryServerSearch(query, messageObject.messageOwner.id); + } + final ArrayList copy = new ArrayList<>(); + copy.addAll(sharedMediaData[1].messages); + Utilities.searchQueue.postRunnable(new Runnable() { + @Override + public void run() { + String search1 = query.trim().toLowerCase(); + if (search1.length() == 0) { + updateSearchResults(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<>(); + + for (MessageObject messageObject : copy) { + for (String q : search) { + String name = messageObject.getDocumentName(); + if (name == null || name.length() == 0) { + continue; + } + name = name.toLowerCase(); + if (name.contains(q)) { + resultArray.add(messageObject); + break; + } + } + } + + updateSearchResults(resultArray); + } + }); + } + }); + } + + private void updateSearchResults(final ArrayList documents) { + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + searchResult = documents; + notifyDataSetChanged(); + } + }); + } + + @Override + public boolean areAllItemsEnabled() { + return false; + } + + @Override + public boolean isEnabled(int i) { + return i != searchResult.size(); + } + + @Override + public int getCount() { + int count = searchResult.size(); + int globalCount = globalSearch.size(); + if (globalCount != 0) { + count += globalCount; + } + return count; + } + + public boolean isGlobalSearch(int i) { + int localCount = searchResult.size(); + int globalCount = globalSearch.size(); + if (i >= 0 && i < localCount) { + return false; + } else if (i > localCount && i <= globalCount + localCount) { + return true; + } + return false; + } + + @Override + public MessageObject getItem(int i) { + if (i < searchResult.size()) { + return searchResult.get(i); + } else { + return globalSearch.get(i - searchResult.size()); + } + } + + @Override + public long getItemId(int i) { + return i; + } + + @Override + public boolean hasStableIds() { + return true; + } + + @Override + public View getView(int i, View view, ViewGroup viewGroup) { + if (view == null) { + view = new SharedDocumentCell(mContext); + } + SharedDocumentCell sharedDocumentCell = (SharedDocumentCell) view; + MessageObject messageObject = getItem(i); + sharedDocumentCell.setDocument(messageObject, i != getCount() - 1); + if (actionBar.isActionModeShowed()) { + sharedDocumentCell.setChecked(selectedFiles.containsKey(messageObject.messageOwner.id), !scrolling); + } else { + sharedDocumentCell.setChecked(false, !scrolling); + } + return view; + } + + @Override + public int getItemViewType(int i) { + return 0; + } + + @Override + public int getViewTypeCount() { + return 1; + } @Override public boolean isEmpty() { - return sharedMediaData[0].messages.isEmpty(); + return searchResult.isEmpty() && globalSearch.isEmpty(); } } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java index d79c4cfe3..21bba0e4d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java @@ -26,7 +26,6 @@ import android.view.ViewTreeObserver; import android.view.animation.AccelerateDecelerateInterpolator; import android.widget.AbsListView; import android.widget.AdapterView; -import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.EditText; import android.widget.FrameLayout; @@ -67,6 +66,7 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter private View searchEmptyView; private View progressView; private View emptyView; + private ActionBarMenuItem passcodeItem; private ImageView floatingButton; private int prevPosition; private int prevTop; @@ -88,6 +88,8 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter private long openedDialogId = 0; + private static final int passcode_menu_item = 1; + public static interface MessagesActivityDelegate { public abstract void didSelectDialog(MessagesActivity fragment, long dialog_id, boolean param); } @@ -107,6 +109,10 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter NotificationCenter.getInstance().addObserver(this, NotificationCenter.appDidLogout); NotificationCenter.getInstance().addObserver(this, NotificationCenter.openedChatChanged); NotificationCenter.getInstance().addObserver(this, NotificationCenter.notificationsSettingsUpdated); + NotificationCenter.getInstance().addObserver(this, NotificationCenter.messageReceivedByAck); + NotificationCenter.getInstance().addObserver(this, NotificationCenter.messageReceivedByServer); + NotificationCenter.getInstance().addObserver(this, NotificationCenter.messageSendError); + NotificationCenter.getInstance().addObserver(this, NotificationCenter.didSetPasscode); if (getArguments() != null) { onlySelect = arguments.getBoolean("onlySelect", false); @@ -133,25 +139,37 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter NotificationCenter.getInstance().removeObserver(this, NotificationCenter.appDidLogout); NotificationCenter.getInstance().removeObserver(this, NotificationCenter.openedChatChanged); NotificationCenter.getInstance().removeObserver(this, NotificationCenter.notificationsSettingsUpdated); + NotificationCenter.getInstance().removeObserver(this, NotificationCenter.messageReceivedByAck); + NotificationCenter.getInstance().removeObserver(this, NotificationCenter.messageReceivedByServer); + NotificationCenter.getInstance().removeObserver(this, NotificationCenter.messageSendError); + NotificationCenter.getInstance().removeObserver(this, NotificationCenter.didSetPasscode); delegate = null; } @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { if (fragmentView == null) { + searching = false; + searchWas = false; + ActionBarMenu menu = actionBar.createMenu(); + if (!onlySelect) { + passcodeItem = menu.addItem(passcode_menu_item, R.drawable.lock_close); + updatePasscodeButton(); + } ActionBarMenuItem item = menu.addItem(0, R.drawable.ic_ab_search).setIsSearchField(true).setActionBarMenuItemSearchListener(new ActionBarMenuItem.ActionBarMenuItemSearchListener() { @Override public void onSearchExpand() { searching = true; if (messagesListView != null) { messagesListView.setEmptyView(searchEmptyView); - emptyView.setVisibility(View.GONE); - progressView.setVisibility(View.GONE); + emptyView.setVisibility(View.INVISIBLE); + progressView.setVisibility(View.INVISIBLE); if (!onlySelect) { floatingButton.setVisibility(View.GONE); } } + updatePasscodeButton(); } @Override @@ -160,14 +178,14 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter searchWas = false; if (messagesListView != null) { if (MessagesController.getInstance().loadingDialogs && MessagesController.getInstance().dialogs.isEmpty()) { - searchEmptyView.setVisibility(View.GONE); - emptyView.setVisibility(View.GONE); + searchEmptyView.setVisibility(View.INVISIBLE); + emptyView.setVisibility(View.INVISIBLE); progressView.setVisibility(View.VISIBLE); messagesListView.setEmptyView(progressView); } else { messagesListView.setEmptyView(emptyView); - searchEmptyView.setVisibility(View.GONE); - progressView.setVisibility(View.GONE); + searchEmptyView.setVisibility(View.INVISIBLE); + progressView.setVisibility(View.INVISIBLE); } if (!onlySelect) { floatingButton.setVisibility(View.VISIBLE); @@ -183,6 +201,7 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter if (dialogsSearchAdapter != null) { dialogsSearchAdapter.searchDialogs(null, false); } + updatePasscodeButton(); } @Override @@ -196,8 +215,8 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter } if (searchEmptyView != null && messagesListView.getEmptyView() == emptyView) { messagesListView.setEmptyView(searchEmptyView); - emptyView.setVisibility(View.GONE); - progressView.setVisibility(View.GONE); + emptyView.setVisibility(View.INVISIBLE); + progressView.setVisibility(View.INVISIBLE); } } if (dialogsSearchAdapter != null) { @@ -224,14 +243,15 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter } else if (parentLayout != null) { parentLayout.getDrawerLayoutContainer().openDrawer(false); } + } else if (id == passcode_menu_item) { + UserConfig.appLocked = !UserConfig.appLocked; + UserConfig.saveConfig(false); + updatePasscodeButton(); } } }); - searching = false; - searchWas = false; - - fragmentView = inflater.inflate(R.layout.messages_list, container, false); + fragmentView = inflater.inflate(R.layout.messages_list, null, false); dialogsAdapter = new DialogsAdapter(getParentActivity(), serverOnly); if (AndroidUtilities.isTablet() && openedDialogId != 0) { @@ -242,8 +262,8 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter @Override public void searchStateChanged(boolean search) { if (searching && searchWas && messagesListView != null) { - progressView.setVisibility(search ? View.VISIBLE : View.GONE); - searchEmptyView.setVisibility(search ? View.GONE : View.VISIBLE); + progressView.setVisibility(search ? View.VISIBLE : View.INVISIBLE); + searchEmptyView.setVisibility(search ? View.INVISIBLE : View.VISIBLE); messagesListView.setEmptyView(search ? progressView : searchEmptyView); } } @@ -309,14 +329,14 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter }); if (MessagesController.getInstance().loadingDialogs && MessagesController.getInstance().dialogs.isEmpty()) { - searchEmptyView.setVisibility(View.GONE); - emptyView.setVisibility(View.GONE); + searchEmptyView.setVisibility(View.INVISIBLE); + emptyView.setVisibility(View.INVISIBLE); progressView.setVisibility(View.VISIBLE); messagesListView.setEmptyView(progressView); } else { messagesListView.setEmptyView(emptyView); - searchEmptyView.setVisibility(View.GONE); - progressView.setVisibility(View.GONE); + searchEmptyView.setVisibility(View.INVISIBLE); + progressView.setVisibility(View.INVISIBLE); } messagesListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @@ -559,29 +579,30 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter public void didReceivedNotification(int id, Object... args) { if (id == NotificationCenter.dialogsNeedReload) { if (dialogsAdapter != null) { - dialogsAdapter.notifyDataSetChanged(); + if (dialogsAdapter.isDataSetChanged()) { + dialogsAdapter.notifyDataSetChanged(); + } else { + updateVisibleRows(MessagesController.UPDATE_MASK_NEW_MESSAGE); + } } if (dialogsSearchAdapter != null) { dialogsSearchAdapter.notifyDataSetChanged(); } if (messagesListView != null) { try { - if (messagesListView.getAdapter() != null && messagesListView.getAdapter() instanceof BaseAdapter) { - ((BaseAdapter) messagesListView.getAdapter()).notifyDataSetChanged(); - } if (MessagesController.getInstance().loadingDialogs && MessagesController.getInstance().dialogs.isEmpty()) { - searchEmptyView.setVisibility(View.GONE); - emptyView.setVisibility(View.GONE); + searchEmptyView.setVisibility(View.INVISIBLE); + emptyView.setVisibility(View.INVISIBLE); messagesListView.setEmptyView(progressView); } else { if (searching && searchWas) { messagesListView.setEmptyView(searchEmptyView); - emptyView.setVisibility(View.GONE); + emptyView.setVisibility(View.INVISIBLE); } else { messagesListView.setEmptyView(emptyView); - searchEmptyView.setVisibility(View.GONE); + searchEmptyView.setVisibility(View.INVISIBLE); } - progressView.setVisibility(View.GONE); + progressView.setVisibility(View.INVISIBLE); } } catch (Exception e) { FileLog.e("tmessages", e); //TODO fix it in other way? @@ -616,9 +637,27 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter updateVisibleRows(MessagesController.UPDATE_MASK_SELECT_DIALOG); } } else if (id == NotificationCenter.notificationsSettingsUpdated) { - if (messagesListView != null) { - updateVisibleRows(0); + updateVisibleRows(0); + } else if (id == NotificationCenter.messageReceivedByAck || id == NotificationCenter.messageReceivedByServer || id == NotificationCenter.messageSendError) { + updateVisibleRows(MessagesController.UPDATE_MASK_SEND_STATE); + } else if (id == NotificationCenter.didSetPasscode) { + updatePasscodeButton(); + } + } + + private void updatePasscodeButton() { + if (passcodeItem == null) { + return; + } + if (UserConfig.passcodeHash.length() != 0 && !searching) { + passcodeItem.setVisibility(View.VISIBLE); + if (UserConfig.appLocked) { + passcodeItem.setIcon(R.drawable.lock_close); + } else { + passcodeItem.setIcon(R.drawable.lock_open); } + } else { + passcodeItem.setVisibility(View.GONE); } } @@ -642,13 +681,14 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter View child = messagesListView.getChildAt(a); if (child instanceof DialogCell) { DialogCell cell = (DialogCell) child; - if ((mask & MessagesController.UPDATE_MASK_SELECT_DIALOG) != 0) { + if ((mask & MessagesController.UPDATE_MASK_NEW_MESSAGE) != 0) { + cell.checkCurrentDialogIndex(); if (!serverOnly && AndroidUtilities.isTablet()) { - if (cell.getDialogId() == openedDialogId) { - child.setBackgroundColor(0x0f000000); - } else { - child.setBackgroundColor(0); - } + child.setBackgroundColor(cell.getDialogId() == openedDialogId ? 0x0f000000 : 0); + } + } else if ((mask & MessagesController.UPDATE_MASK_SELECT_DIALOG) != 0) { + if (!serverOnly && AndroidUtilities.isTablet()) { + child.setBackgroundColor(cell.getDialogId() == openedDialogId ? 0x0f000000 : 0); } } else { cell.update(mask); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/NotificationsSettingsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/NotificationsSettingsActivity.java index ace44bad7..993396853 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/NotificationsSettingsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/NotificationsSettingsActivity.java @@ -154,7 +154,7 @@ public class NotificationsSettingsActivity extends BaseFragment implements Notif } @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { if (fragmentView == null) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PasscodeActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PasscodeActivity.java new file mode 100644 index 000000000..2394d61b2 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/PasscodeActivity.java @@ -0,0 +1,710 @@ +/* + * This is the source code of Telegram for Android v. 2.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-2015. + */ + +package org.telegram.ui; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.res.Configuration; +import android.graphics.Typeface; +import android.os.Build; +import android.os.Vibrator; +import android.text.Editable; +import android.text.InputFilter; +import android.text.InputType; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.text.method.DigitsKeyListener; +import android.text.method.PasswordTransformationMethod; +import android.util.TypedValue; +import android.view.ActionMode; +import android.view.ContextMenu; +import android.view.Gravity; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.view.inputmethod.EditorInfo; +import android.widget.AdapterView; +import android.widget.EditText; +import android.widget.FrameLayout; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.TextView; +import android.widget.Toast; + +import org.telegram.android.AndroidUtilities; +import org.telegram.android.LocaleController; +import org.telegram.android.NotificationCenter; +import org.telegram.messenger.ApplicationLoader; +import org.telegram.messenger.FileLog; +import org.telegram.messenger.R; +import org.telegram.messenger.UserConfig; +import org.telegram.messenger.Utilities; +import org.telegram.ui.ActionBar.ActionBar; +import org.telegram.ui.ActionBar.ActionBarMenu; +import org.telegram.ui.ActionBar.ActionBarMenuItem; +import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.Adapters.BaseFragmentAdapter; +import org.telegram.ui.AnimationCompat.AnimatorListenerAdapterProxy; +import org.telegram.ui.AnimationCompat.AnimatorSetProxy; +import org.telegram.ui.AnimationCompat.ObjectAnimatorProxy; +import org.telegram.ui.Cells.TextCheckCell; +import org.telegram.ui.Cells.TextInfoPrivacyCell; +import org.telegram.ui.Cells.TextSettingsCell; +import org.telegram.ui.Components.NumberPicker; + +public class PasscodeActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate { + + private ListAdapter listAdapter; + private ListView listView; + private TextView titleTextView; + private EditText passwordEditText; + private TextView dropDown; + private ActionBarMenuItem dropDownContainer; + + private int type; + private int currentPasswordType = 0; + private String firstPassword; + + private int passcodeRow; + private int changePasscodeRow; + private int passcodeDetailRow; + private int autoLockRow; + private int autoLockDetailRow; + private int rowCount; + + private final static int done_button = 1; + private final static int pin_item = 2; + private final static int password_item = 3; + + public PasscodeActivity(int type) { + super(); + this.type = type; + } + + @Override + public boolean onFragmentCreate() { + super.onFragmentCreate(); + updateRows(); + if (type == 0) { + NotificationCenter.getInstance().addObserver(this, NotificationCenter.didSetPasscode); + } + return true; + } + + @Override + public void onFragmentDestroy() { + super.onFragmentDestroy(); + if (type == 0) { + NotificationCenter.getInstance().removeObserver(this, NotificationCenter.didSetPasscode); + } + } + + @Override + public View createView(LayoutInflater inflater) { + if (fragmentView == null) { + if (type != 3) { + actionBar.setBackButtonImage(R.drawable.ic_ab_back); + } + actionBar.setAllowOverlayTitle(false); + actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { + @Override + public void onItemClick(int id) { + if (id == -1) { + finishFragment(); + } else if (id == done_button) { + if (passwordEditText.getImeOptions() == EditorInfo.IME_ACTION_NEXT) { + processNext(); + } else if (passwordEditText.getImeOptions() == EditorInfo.IME_ACTION_DONE) { + processDone(); + } + } else if (id == pin_item) { + currentPasswordType = 0; + updateDropDownTextView(); + } else if (id == password_item) { + currentPasswordType = 1; + updateDropDownTextView(); + } + } + }); + + fragmentView = new FrameLayout(getParentActivity()); + FrameLayout frameLayout = (FrameLayout) fragmentView; + + if (type != 0) { + ActionBarMenu menu = actionBar.createMenu(); + menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); + + titleTextView = new TextView(getParentActivity()); + titleTextView.setTextColor(0xff757575); + if (type == 1) { + titleTextView.setText(LocaleController.getString("EnterNewPasscode", R.string.EnterNewPasscode)); + } else { + titleTextView.setText(LocaleController.getString("EnterCurrentPasscode", R.string.EnterCurrentPasscode)); + } + titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); + titleTextView.setGravity(Gravity.CENTER_HORIZONTAL); + frameLayout.addView(titleTextView); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) titleTextView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.gravity = Gravity.CENTER_HORIZONTAL; + layoutParams.topMargin = AndroidUtilities.dp(38); + titleTextView.setLayoutParams(layoutParams); + + passwordEditText = new EditText(getParentActivity()); + passwordEditText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); + passwordEditText.setTextColor(0xff000000); + passwordEditText.setMaxLines(1); + passwordEditText.setLines(1); + passwordEditText.setGravity(Gravity.CENTER_HORIZONTAL); + passwordEditText.setSingleLine(true); + if (type == 1) { + passwordEditText.setImeOptions(EditorInfo.IME_ACTION_NEXT); + } else { + passwordEditText.setImeOptions(EditorInfo.IME_ACTION_DONE); + } + passwordEditText.setTransformationMethod(PasswordTransformationMethod.getInstance()); + passwordEditText.setTypeface(Typeface.DEFAULT); + AndroidUtilities.clearCursorDrawable(passwordEditText); + frameLayout.addView(passwordEditText); + layoutParams = (FrameLayout.LayoutParams) passwordEditText.getLayoutParams(); + layoutParams.topMargin = AndroidUtilities.dp(90); + layoutParams.height = AndroidUtilities.dp(36); + layoutParams.leftMargin = AndroidUtilities.dp(40); + layoutParams.gravity = Gravity.TOP | Gravity.LEFT; + layoutParams.rightMargin = AndroidUtilities.dp(40); + layoutParams.width = LinearLayout.LayoutParams.MATCH_PARENT; + passwordEditText.setLayoutParams(layoutParams); + passwordEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { + if (i == EditorInfo.IME_ACTION_NEXT) { + processNext(); + return true; + } else if (i == EditorInfo.IME_ACTION_DONE) { + processDone(); + return true; + } + return false; + } + }); + passwordEditText.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) { + if (passwordEditText.length() == 4) { + if (type == 2 && UserConfig.passcodeType == 0) { + processDone(); + } else if (type == 1 && currentPasswordType == 0) { + if (passwordEditText.getImeOptions() == EditorInfo.IME_ACTION_NEXT) { + processNext(); + } else if (passwordEditText.getImeOptions() == EditorInfo.IME_ACTION_DONE) { + processDone(); + } + } + } + } + }); + if (android.os.Build.VERSION.SDK_INT < 11) { + passwordEditText.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() { + public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { + menu.clear(); + } + }); + } else { + passwordEditText.setCustomSelectionActionModeCallback(new ActionMode.Callback() { + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + return false; + } + + public void onDestroyActionMode(ActionMode mode) { + } + + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + return false; + } + + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + return false; + } + }); + } + + if (type == 1) { + dropDownContainer = new ActionBarMenuItem(getParentActivity(), menu, R.drawable.bar_selector); + dropDownContainer.setSubMenuOpenSide(1); + dropDownContainer.addSubItem(pin_item, LocaleController.getString("PasscodePIN", R.string.PasscodePIN), 0); + dropDownContainer.addSubItem(password_item, LocaleController.getString("PasscodePassword", R.string.PasscodePassword), 0); + actionBar.addView(dropDownContainer); + layoutParams = (FrameLayout.LayoutParams) dropDownContainer.getLayoutParams(); + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.rightMargin = AndroidUtilities.dp(40); + layoutParams.leftMargin = AndroidUtilities.isTablet() ? AndroidUtilities.dp(64) : AndroidUtilities.dp(56); + layoutParams.gravity = Gravity.TOP | Gravity.LEFT; + dropDownContainer.setLayoutParams(layoutParams); + dropDownContainer.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + dropDownContainer.toggleSubMenu(); + } + }); + + dropDown = new TextView(getParentActivity()); + dropDown.setGravity(Gravity.LEFT); + dropDown.setSingleLine(true); + dropDown.setLines(1); + dropDown.setMaxLines(1); + dropDown.setEllipsize(TextUtils.TruncateAt.END); + dropDown.setTextColor(0xffffffff); + dropDown.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + dropDown.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_arrow_drop_down, 0); + dropDown.setCompoundDrawablePadding(AndroidUtilities.dp(4)); + dropDown.setPadding(0, 0, AndroidUtilities.dp(10), 0); + dropDownContainer.addView(dropDown); + layoutParams = (FrameLayout.LayoutParams) dropDown.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; + layoutParams.leftMargin = AndroidUtilities.dp(16); + layoutParams.gravity = Gravity.CENTER_VERTICAL; + layoutParams.bottomMargin = AndroidUtilities.dp(1); + dropDown.setLayoutParams(layoutParams); + } else { + actionBar.setTitle(LocaleController.getString("Passcode", R.string.Passcode)); + } + + updateDropDownTextView(); + } else { + actionBar.setTitle(LocaleController.getString("Passcode", R.string.Passcode)); + frameLayout.setBackgroundColor(0xfff0f0f0); + listView = new ListView(getParentActivity()); + listView.setDivider(null); + listView.setDividerHeight(0); + listView.setVerticalScrollBarEnabled(false); + listView.setDrawSelectorOnTop(true); + frameLayout.addView(listView); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.gravity = Gravity.TOP; + listView.setLayoutParams(layoutParams); + listView.setAdapter(listAdapter = new ListAdapter(getParentActivity())); + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, final int i, long l) { + if (i == changePasscodeRow) { + presentFragment(new PasscodeActivity(1)); + } else if (i == passcodeRow) { + TextCheckCell cell = (TextCheckCell) view; + if (UserConfig.passcodeHash.length() != 0) { + UserConfig.passcodeHash = ""; + UserConfig.appLocked = false; + UserConfig.saveConfig(false); + int count = listView.getChildCount(); + for (int a = 0; a < count; a++) { + View child = listView.getChildAt(a); + if (child instanceof TextSettingsCell) { + TextSettingsCell textCell = (TextSettingsCell) child; + textCell.setTextColor(0xffc6c6c6); + break; + } + } + cell.setChecked(UserConfig.passcodeHash.length() != 0); + NotificationCenter.getInstance().postNotificationName(NotificationCenter.didSetPasscode); + } else { + presentFragment(new PasscodeActivity(1)); + } + } else if (i == autoLockRow) { + if (getParentActivity() == null) { + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(LocaleController.getString("AutoLock", R.string.AutoLock)); + final NumberPicker numberPicker = new NumberPicker(getParentActivity()); + numberPicker.setMinValue(0); + numberPicker.setMaxValue(4); + if (UserConfig.autoLockIn == 0) { + numberPicker.setValue(0); + } else if (UserConfig.autoLockIn == 60) { + numberPicker.setValue(1); + } else if (UserConfig.autoLockIn == 60 * 5) { + numberPicker.setValue(2); + } else if (UserConfig.autoLockIn == 60 * 60) { + numberPicker.setValue(3); + } else if (UserConfig.autoLockIn == 60 * 60 * 5) { + numberPicker.setValue(4); + } + numberPicker.setFormatter(new NumberPicker.Formatter() { + @Override + public String format(int value) { + if (value == 0) { + return LocaleController.getString("Disabled", R.string.Disabled); + } else if (value == 1) { + return LocaleController.formatString("AutoLockInTime", R.string.AutoLockInTime, LocaleController.formatPluralString("Minutes", 1)); + } else if (value == 2) { + return LocaleController.formatString("AutoLockInTime", R.string.AutoLockInTime, LocaleController.formatPluralString("Minutes", 5)); + } else if (value == 3) { + return LocaleController.formatString("AutoLockInTime", R.string.AutoLockInTime, LocaleController.formatPluralString("Hours", 1)); + } else if (value == 4) { + return LocaleController.formatString("AutoLockInTime", R.string.AutoLockInTime, LocaleController.formatPluralString("Hours", 5)); + } + return ""; + } + }); + builder.setView(numberPicker); + builder.setNegativeButton(LocaleController.getString("Done", R.string.Done), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + which = numberPicker.getValue(); + if (which == 0) { + UserConfig.autoLockIn = 0; + } else if (which == 1) { + UserConfig.autoLockIn = 60; + } else if (which == 2) { + UserConfig.autoLockIn = 60 * 5; + } else if (which == 3) { + UserConfig.autoLockIn = 60 * 60; + } else if (which == 4) { + UserConfig.autoLockIn = 60 * 60 * 5; + } + listView.invalidateViews(); + UserConfig.saveConfig(false); + } + }); + showAlertDialog(builder); + } + } + }); + } + } else { + ViewGroup parent = (ViewGroup)fragmentView.getParent(); + if (parent != null) { + parent.removeView(fragmentView); + } + } + return fragmentView; + } + + @Override + public void onResume() { + super.onResume(); + if (listAdapter != null) { + listAdapter.notifyDataSetChanged(); + } + if (type != 0) { + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + if (passwordEditText != null) { + passwordEditText.requestFocus(); + AndroidUtilities.showKeyboard(passwordEditText); + } + } + }, 200); + } + fixLayoutInternal(); + } + + @Override + public void didReceivedNotification(int id, Object... args) { + if (id == NotificationCenter.didSetPasscode) { + if (type == 0) { + updateRows(); + if (listAdapter != null) { + listAdapter.notifyDataSetChanged(); + } + } + } + } + + private void updateRows() { + rowCount = 0; + passcodeRow = rowCount++; + changePasscodeRow = rowCount++; + passcodeDetailRow = rowCount++; + if (UserConfig.passcodeHash.length() > 0) { + autoLockRow = rowCount++; + autoLockDetailRow = rowCount++; + } else { + autoLockRow = -1; + autoLockDetailRow = -1; + } + } + + @Override + public void onConfigurationChanged(android.content.res.Configuration newConfig) { + super.onConfigurationChanged(newConfig); + if (listView != null) { + ViewTreeObserver obs = listView.getViewTreeObserver(); + obs.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + listView.getViewTreeObserver().removeOnPreDrawListener(this); + fixLayoutInternal(); + return false; + } + }); + } + } + + @Override + public void onOpenAnimationEnd() { + super.onOpenAnimationEnd(); + if (type != 0) { + AndroidUtilities.showKeyboard(passwordEditText); + } + } + + private void updateDropDownTextView() { + if (dropDown != null) { + if (currentPasswordType == 0) { + dropDown.setText(LocaleController.getString("PasscodePIN", R.string.PasscodePIN)); + } else if (currentPasswordType == 1) { + dropDown.setText(LocaleController.getString("PasscodePassword", R.string.PasscodePassword)); + } + } + if (type == 1 && currentPasswordType == 0 || type == 2 && UserConfig.passcodeType == 0) { + InputFilter[] filterArray = new InputFilter[1]; + filterArray[0] = new InputFilter.LengthFilter(4); + passwordEditText.setFilters(filterArray); + passwordEditText.setInputType(InputType.TYPE_CLASS_PHONE); + passwordEditText.setKeyListener(DigitsKeyListener.getInstance("123456789")); + } else if (type == 1 && currentPasswordType == 1 || type == 2 && UserConfig.passcodeType == 1) { + passwordEditText.setFilters(new InputFilter[0]); + passwordEditText.setKeyListener(null); + passwordEditText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); + } + passwordEditText.setTransformationMethod(PasswordTransformationMethod.getInstance()); + } + + private void processNext() { + if (passwordEditText.getText().length() == 0 || currentPasswordType == 0 && passwordEditText.getText().length() != 4) { + onPasscodeError(); + return; + } + if (currentPasswordType == 0) { + actionBar.setTitle(LocaleController.getString("PasscodePIN", R.string.PasscodePIN)); + } else { + actionBar.setTitle(LocaleController.getString("PasscodePassword", R.string.PasscodePassword)); + } + dropDownContainer.setVisibility(View.GONE); + titleTextView.setText(LocaleController.getString("ReEnterYourPasscode", R.string.ReEnterYourPasscode)); + firstPassword = passwordEditText.getText().toString(); + passwordEditText.setText(""); + passwordEditText.setImeOptions(EditorInfo.IME_ACTION_DONE); + } + + private void processDone() { + if (passwordEditText.getText().length() == 0) { + onPasscodeError(); + return; + } + if (type == 1) { + if (!firstPassword.equals(passwordEditText.getText().toString())) { + try { + Toast.makeText(getParentActivity(), LocaleController.getString("PasscodeDoNotMatch", R.string.PasscodeDoNotMatch), Toast.LENGTH_SHORT).show(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + shakeTextView(2, 0); + passwordEditText.setText(""); + return; + } + UserConfig.passcodeHash = Utilities.MD5(firstPassword); + UserConfig.passcodeType = currentPasswordType; + UserConfig.saveConfig(false); + //TODO show alert + finishFragment(); + NotificationCenter.getInstance().postNotificationName(NotificationCenter.didSetPasscode); + passwordEditText.clearFocus(); + AndroidUtilities.hideKeyboard(passwordEditText); + } else if (type == 2) { + if (!Utilities.MD5(passwordEditText.getText().toString()).equals(UserConfig.passcodeHash)) { + passwordEditText.setText(""); + onPasscodeError(); + return; + } + passwordEditText.clearFocus(); + AndroidUtilities.hideKeyboard(passwordEditText); + presentFragment(new PasscodeActivity(0), true); + } + } + + private void shakeTextView(final float x, final int num) { + if (num == 6) { + titleTextView.clearAnimation(); + return; + } + AnimatorSetProxy animatorSetProxy = new AnimatorSetProxy(); + animatorSetProxy.playTogether(ObjectAnimatorProxy.ofFloat(titleTextView, "translationX", AndroidUtilities.dp(x))); + animatorSetProxy.setDuration(50); + animatorSetProxy.addListener(new AnimatorListenerAdapterProxy() { + @Override + public void onAnimationEnd(Object animation) { + shakeTextView(num == 5 ? 0 : -x, num + 1); + } + }); + animatorSetProxy.start(); + } + + private void onPasscodeError() { + if (getParentActivity() == null) { + return; + } + Vibrator v = (Vibrator) getParentActivity().getSystemService(Context.VIBRATOR_SERVICE); + if (v != null) { + v.vibrate(200); + } + shakeTextView(2, 0); + } + + private void fixLayoutInternal() { + if (dropDownContainer != null) { + if (!AndroidUtilities.isTablet()) { + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) dropDownContainer.getLayoutParams(); + layoutParams.topMargin = (Build.VERSION.SDK_INT >= 21 ? AndroidUtilities.statusBarHeight : 0); + dropDownContainer.setLayoutParams(layoutParams); + } + if (!AndroidUtilities.isTablet() && ApplicationLoader.applicationContext.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { + dropDown.setTextSize(18); + } else { + dropDown.setTextSize(20); + } + } + } + + private class ListAdapter extends BaseFragmentAdapter { + private Context mContext; + + public ListAdapter(Context context) { + mContext = context; + } + + @Override + public boolean areAllItemsEnabled() { + return false; + } + + @Override + public boolean isEnabled(int i) { + return i == passcodeRow || i == autoLockRow || UserConfig.passcodeHash.length() != 0 && i == changePasscodeRow; + } + + @Override + public int getCount() { + return rowCount; + } + + @Override + public Object getItem(int i) { + return null; + } + + @Override + public long getItemId(int i) { + return i; + } + + @Override + public boolean hasStableIds() { + return false; + } + + @Override + public View getView(int i, View view, ViewGroup viewGroup) { + int viewType = getItemViewType(i); + if (viewType == 0) { + if (view == null) { + view = new TextCheckCell(mContext); + view.setBackgroundColor(0xffffffff); + } + TextCheckCell textCell = (TextCheckCell) view; + + if (i == passcodeRow) { + textCell.setTextAndCheck(LocaleController.getString("Passcode", R.string.Passcode), UserConfig.passcodeHash.length() > 0, true); + } + } else if (viewType == 1) { + if (view == null) { + view = new TextSettingsCell(mContext); + view.setBackgroundColor(0xffffffff); + } + TextSettingsCell textCell = (TextSettingsCell) view; + if (i == changePasscodeRow) { + textCell.setText(LocaleController.getString("ChangePasscode", R.string.ChangePasscode), false); + textCell.setTextColor(UserConfig.passcodeHash.length() == 0 ? 0xffc6c6c6 : 0xff000000); + } else if (i == autoLockRow) { + String val; + if (UserConfig.autoLockIn == 0) { + val = LocaleController.formatString("AutoLockDisabled", R.string.AutoLockDisabled); + } else if (UserConfig.autoLockIn < 60 * 60) { + val = LocaleController.formatString("AutoLockInTime", R.string.AutoLockInTime, LocaleController.formatPluralString("Minutes", UserConfig.autoLockIn / 60)); + } else if (UserConfig.autoLockIn < 60 * 60 * 24) { + val = LocaleController.formatString("AutoLockInTime", R.string.AutoLockInTime, LocaleController.formatPluralString("Hours", (int) Math.ceil(UserConfig.autoLockIn / 60.0f / 60))); + } else { + val = LocaleController.formatString("AutoLockInTime", R.string.AutoLockInTime, LocaleController.formatPluralString("Days", (int) Math.ceil(UserConfig.autoLockIn / 60.0f / 60 / 24))); + } + textCell.setTextAndValue(LocaleController.getString("AutoLock", R.string.AutoLock), val, true); + textCell.setTextColor(0xff000000); + } + } else if (viewType == 2) { + if (view == null) { + view = new TextInfoPrivacyCell(mContext); + } + if (i == passcodeDetailRow) { + ((TextInfoPrivacyCell) view).setText(LocaleController.getString("ChangePasscodeInfo", R.string.ChangePasscodeInfo)); + if (autoLockDetailRow != -1) { + view.setBackgroundResource(R.drawable.greydivider); + } else { + view.setBackgroundResource(R.drawable.greydivider_bottom); + } + } else if (i == autoLockDetailRow) { + ((TextInfoPrivacyCell) view).setText(LocaleController.getString("AutoLockInfo", R.string.AutoLockInfo)); + view.setBackgroundResource(R.drawable.greydivider_bottom); + } + } + return view; + } + + @Override + public int getItemViewType(int i) { + if (i == passcodeRow) { + return 0; + } else if (i == changePasscodeRow || i == autoLockRow) { + return 1; + } else if (i == passcodeDetailRow || i == autoLockDetailRow) { + return 2; + } + return 0; + } + + @Override + public int getViewTypeCount() { + return 3; + } + + @Override + public boolean isEmpty() { + return false; + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PhotoAlbumPickerActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PhotoAlbumPickerActivity.java index 61646ad1e..96c5cac9d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PhotoAlbumPickerActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PhotoAlbumPickerActivity.java @@ -67,9 +67,15 @@ public class PhotoAlbumPickerActivity extends BaseFragment implements Notificati private TextView emptyView; private PhotoPickerBottomLayout photoPickerBottomLayout; private boolean sendPressed = false; + private boolean singlePhoto = false; private PhotoAlbumPickerActivityDelegate delegate; + public PhotoAlbumPickerActivity(boolean onlyOnePhoto) { + super(); + singlePhoto = onlyOnePhoto; + } + @Override public boolean onFragmentCreate() { loading = true; @@ -90,7 +96,7 @@ public class PhotoAlbumPickerActivity extends BaseFragment implements Notificati @SuppressWarnings("unchecked") @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { if (fragmentView == null) { actionBar.setBackgroundColor(0xff333333); actionBar.setItemsBackground(R.drawable.bar_selector_picker); @@ -292,7 +298,11 @@ public class PhotoAlbumPickerActivity extends BaseFragment implements Notificati boolean webChange = false; for (HashMap.Entry entry : selectedWebPhotos.entrySet()) { MediaController.SearchImage searchImage = entry.getValue(); - webPhotos.add(searchImage); + if (searchImage.imagePath != null) { + photos.add(searchImage.imagePath); + } else { + webPhotos.add(searchImage); + } searchImage.date = (int) (System.currentTimeMillis() / 1000); if (searchImage.type == 0) { @@ -364,7 +374,7 @@ public class PhotoAlbumPickerActivity extends BaseFragment implements Notificati recentImages = recentGifImages; } } - PhotoPickerActivity fragment = new PhotoPickerActivity(type, albumEntry, selectedPhotos, selectedWebPhotos, recentImages); + PhotoPickerActivity fragment = new PhotoPickerActivity(type, albumEntry, selectedPhotos, selectedWebPhotos, recentImages, singlePhoto); fragment.setDelegate(new PhotoPickerActivity.PhotoPickerActivityDelegate() { @Override public void selectedPhotosChanged() { @@ -403,6 +413,9 @@ public class PhotoAlbumPickerActivity extends BaseFragment implements Notificati @Override public int getCount() { + if (singlePhoto) { + return albumsSorted != null ? (int) Math.ceil(albumsSorted.size() / (float) columnsCount) : 0; + } return 1 + (albumsSorted != null ? (int) Math.ceil(albumsSorted.size() / (float) columnsCount) : 0); } @@ -440,7 +453,12 @@ public class PhotoAlbumPickerActivity extends BaseFragment implements Notificati } photoPickerAlbumsCell.setAlbumsCount(columnsCount); for (int a = 0; a < columnsCount; a++) { - int index = (i - 1) * columnsCount + a; + int index; + if (singlePhoto) { + index = i * columnsCount + a; + } else { + index = (i - 1) * columnsCount + a; + } if (index < albumsSorted.size()) { MediaController.AlbumEntry albumEntry = albumsSorted.get(index); photoPickerAlbumsCell.setAlbum(a, albumEntry); @@ -464,6 +482,9 @@ public class PhotoAlbumPickerActivity extends BaseFragment implements Notificati @Override public int getItemViewType(int i) { + if (singlePhoto) { + return 0; + } if (i == 0) { return 1; } @@ -472,6 +493,9 @@ public class PhotoAlbumPickerActivity extends BaseFragment implements Notificati @Override public int getViewTypeCount() { + if (singlePhoto) { + return 1; + } return 2; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PhotoCropActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PhotoCropActivity.java index 910b4f444..26a04b4e0 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PhotoCropActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PhotoCropActivity.java @@ -303,6 +303,12 @@ public class PhotoCropActivity extends BaseFragment { int y = (int)(percY * imageToCrop.getHeight()); int sizeX = (int)(percSizeX * imageToCrop.getWidth()); int sizeY = (int)(percSizeY * imageToCrop.getWidth()); + if (x < 0) { + x = 0; + } + if (y < 0) { + y = 0; + } if (x + sizeX > imageToCrop.getWidth()) { sizeX = imageToCrop.getWidth() - x; } @@ -426,7 +432,7 @@ public class PhotoCropActivity extends BaseFragment { } @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { if (fragmentView == null) { actionBar.setBackgroundColor(0xff333333); actionBar.setItemsBackground(R.drawable.bar_selector_picker); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PhotoEditorActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PhotoEditorActivity.java deleted file mode 100644 index 5e0ff8f4e..000000000 --- a/TMessagesProj/src/main/java/org/telegram/ui/PhotoEditorActivity.java +++ /dev/null @@ -1,1285 +0,0 @@ -/* - * This is the source code of Telegram for Android v. 2.0.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-2014. - */ - -package org.telegram.ui; - -import android.content.Context; -import android.content.res.Configuration; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.net.Uri; -import android.opengl.GLES20; -import android.opengl.GLSurfaceView; -import android.opengl.GLUtils; -import android.os.Build; -import android.os.Bundle; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewGroup; -import android.view.ViewTreeObserver; -import android.view.animation.AccelerateDecelerateInterpolator; -import android.view.animation.AccelerateInterpolator; -import android.view.animation.DecelerateInterpolator; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.ProgressBar; -import android.widget.SeekBar; - -import org.telegram.android.AndroidUtilities; -import org.telegram.android.ImageLoader; -import org.telegram.android.LocaleController; -import org.telegram.messenger.FileLog; -import org.telegram.messenger.R; -import org.telegram.ui.ActionBar.ActionBar; -import org.telegram.ui.ActionBar.ActionBarMenu; -import org.telegram.ui.ActionBar.ActionBarMenuItem; -import org.telegram.ui.ActionBar.BaseFragment; -import org.telegram.ui.AnimationCompat.AnimatorListenerAdapterProxy; -import org.telegram.ui.AnimationCompat.AnimatorSetProxy; -import org.telegram.ui.AnimationCompat.ObjectAnimatorProxy; -import org.telegram.ui.AnimationCompat.ViewProxy; -import org.telegram.ui.Cells.PhotoEditToolCell; -import org.telegram.ui.Components.RecyclerListView; - -import java.io.File; -import java.lang.reflect.Field; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.FloatBuffer; - -import javax.microedition.khronos.opengles.GL10; - -public class PhotoEditorActivity extends BaseFragment { - - private GLSurfaceView glView; - private PhotoCropView cropView; - - private SeekBar valueSeekBar; - private LinearLayout toolsView; - private LinearLayout cropButtonsView; - private ImageView imageView; - private ImageView filtersButton; - private ImageView toolButton; - private AnimatorSetProxy rotationAnimation; - - private ActionBarMenuItem doneButton; - private ActionBarMenuItem sizeButton; - private ActionBarMenuItem rotateButton; - - private boolean sameBitmap = false; - private int currentMode = 0; - private boolean freeformCrop; - private boolean onlyCrop; - - private PhotoCropActivity.PhotoEditActivityDelegate delegate; - - private int selectedTool = 0; - private int rotateDegree = 0; - - private Bitmap bitmapToEdit; - private String bitmapKey; - - private float highlightsValue = 0; //0 100 - private float contrastValue = 0; //-100 100 - private float shadowsValue = 0; //0 100 - private float exposureValue = 0; //-100 100 - private float saturationValue = 0; //-100 100 - private float warmthValue = 0; //-100 100 - private float vignetteValue = 0; //0 100 - private float grainValue = 0; //0 100 - private float width = 0; - private float height = 0; - - private boolean donePressed = false; - - private final static int done_button = 1; - private final static int rotate_button = 2; - private final static int size_button = 3; - - private class PhotoCropView extends FrameLayout { - - private Paint rectPaint; - private Paint circlePaint; - private Paint halfPaint; - private Paint shadowPaint; - private float rectSizeX = 600; - private float rectSizeY = 600; - private int draggingState = 0; - private float oldX = 0, oldY = 0; - private int bitmapWidth = 1, bitmapHeight = 1, bitmapX, bitmapY; - private float rectX = -1, rectY = -1; - - public PhotoCropView(Context context) { - super(context); - - rectPaint = new Paint(); - rectPaint.setColor(0xb2ffffff); - rectPaint.setStrokeWidth(AndroidUtilities.dp(2)); - rectPaint.setStyle(Paint.Style.STROKE); - circlePaint = new Paint(); - circlePaint.setColor(0xffffffff); - halfPaint = new Paint(); - halfPaint.setColor(0x7f000000); - shadowPaint = new Paint(); - shadowPaint.setColor(0x1a000000); - setWillNotDraw(false); - - setOnTouchListener(new OnTouchListener() { - @Override - public boolean onTouch(View view, MotionEvent motionEvent) { - float x = motionEvent.getX(); - float y = motionEvent.getY(); - int cornerSide = AndroidUtilities.dp(20); - if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { - if (rectX - cornerSide < x && rectX + cornerSide > x && rectY - cornerSide < y && rectY + cornerSide > y) { - draggingState = 1; - } else if (rectX - cornerSide + rectSizeX < x && rectX + cornerSide + rectSizeX > x && rectY - cornerSide < y && rectY + cornerSide > y) { - draggingState = 2; - } else if (rectX - cornerSide < x && rectX + cornerSide > x && rectY - cornerSide + rectSizeY < y && rectY + cornerSide + rectSizeY > y) { - draggingState = 3; - } else if (rectX - cornerSide + rectSizeX < x && rectX + cornerSide + rectSizeX > x && rectY - cornerSide + rectSizeY < y && rectY + cornerSide + rectSizeY > y) { - draggingState = 4; - } else if (rectX < x && rectX + rectSizeX > x && rectY < y && rectY + rectSizeY > y) { - draggingState = 5; - } else { - draggingState = 0; - } - if (draggingState != 0) { - PhotoCropView.this.requestDisallowInterceptTouchEvent(true); - } - oldX = x; - oldY = y; - } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) { - draggingState = 0; - } else if (motionEvent.getAction() == MotionEvent.ACTION_MOVE && draggingState != 0) { - float diffX = x - oldX; - float diffY = y - oldY; - if (draggingState == 5) { - rectX += diffX; - rectY += diffY; - - if (rectX < bitmapX) { - rectX = bitmapX; - } else if (rectX + rectSizeX > bitmapX + bitmapWidth) { - rectX = bitmapX + bitmapWidth - rectSizeX; - } - if (rectY < bitmapY) { - rectY = bitmapY; - } else if (rectY + rectSizeY > bitmapY + bitmapHeight) { - rectY = bitmapY + bitmapHeight - rectSizeY; - } - } else { - if (draggingState == 1) { - if (rectSizeX - diffX < 160) { - diffX = rectSizeX - 160; - } - if (rectX + diffX < bitmapX) { - diffX = bitmapX - rectX; - } - if (!freeformCrop) { - if (rectY + diffX < bitmapY) { - diffX = bitmapY - rectY; - } - rectX += diffX; - rectY += diffX; - rectSizeX -= diffX; - rectSizeY -= diffX; - } else { - if (rectSizeY - diffY < 160) { - diffY = rectSizeY - 160; - } - if (rectY + diffY < bitmapY) { - diffY = bitmapY - rectY; - } - rectX += diffX; - rectY += diffY; - rectSizeX -= diffX; - rectSizeY -= diffY; - } - } else if (draggingState == 2) { - if (rectSizeX + diffX < 160) { - diffX = -(rectSizeX - 160); - } - if (rectX + rectSizeX + diffX > bitmapX + bitmapWidth) { - diffX = bitmapX + bitmapWidth - rectX - rectSizeX; - } - if (!freeformCrop) { - if (rectY - diffX < bitmapY) { - diffX = rectY - bitmapY; - } - rectY -= diffX; - rectSizeX += diffX; - rectSizeY += diffX; - } else { - if (rectSizeY - diffY < 160) { - diffY = rectSizeY - 160; - } - if (rectY + diffY < bitmapY) { - diffY = bitmapY - rectY; - } - rectY += diffY; - rectSizeX += diffX; - rectSizeY -= diffY; - } - } else if (draggingState == 3) { - if (rectSizeX - diffX < 160) { - diffX = rectSizeX - 160; - } - if (rectX + diffX < bitmapX) { - diffX = bitmapX - rectX; - } - if (!freeformCrop) { - if (rectY + rectSizeX - diffX > bitmapY + bitmapHeight) { - diffX = rectY + rectSizeX - bitmapY - bitmapHeight; - } - rectX += diffX; - rectSizeX -= diffX; - rectSizeY -= diffX; - } else { - if (rectY + rectSizeY + diffY > bitmapY + bitmapHeight) { - diffY = bitmapY + bitmapHeight - rectY - rectSizeY; - } - rectX += diffX; - rectSizeX -= diffX; - rectSizeY += diffY; - if (rectSizeY < 160) { - rectSizeY = 160; - } - } - } else if (draggingState == 4) { - if (rectX + rectSizeX + diffX > bitmapX + bitmapWidth) { - diffX = bitmapX + bitmapWidth - rectX - rectSizeX; - } - if (!freeformCrop) { - if (rectY + rectSizeX + diffX > bitmapY + bitmapHeight) { - diffX = bitmapY + bitmapHeight - rectY - rectSizeX; - } - rectSizeX += diffX; - rectSizeY += diffX; - } else { - if (rectY + rectSizeY + diffY > bitmapY + bitmapHeight) { - diffY = bitmapY + bitmapHeight - rectY - rectSizeY; - } - rectSizeX += diffX; - rectSizeY += diffY; - } - if (rectSizeX < 160) { - rectSizeX = 160; - } - if (rectSizeY < 160) { - rectSizeY = 160; - } - } - } - - oldX = x; - oldY = y; - invalidate(); - } - return true; - } - }); - } - - public Bitmap getBitmap() { - float percX = (rectX - bitmapX) / bitmapWidth; - float percY = (rectY - bitmapY) / bitmapHeight; - float percSizeX = rectSizeX / bitmapWidth; - float percSizeY = rectSizeY / bitmapWidth; - int x = (int)(percX * bitmapToEdit.getWidth()); - int y = (int)(percY * bitmapToEdit.getHeight()); - int sizeX = (int)(percSizeX * bitmapToEdit.getWidth()); - int sizeY = (int)(percSizeY * bitmapToEdit.getWidth()); - if (x + sizeX > bitmapToEdit.getWidth()) { - sizeX = bitmapToEdit.getWidth() - x; - } - if (y + sizeY > bitmapToEdit.getHeight()) { - sizeY = bitmapToEdit.getHeight() - y; - } - try { - return Bitmap.createBitmap(bitmapToEdit, x, y, sizeX, sizeY); - } catch (Throwable e) { - FileLog.e("tmessags", e); - System.gc(); - try { - return Bitmap.createBitmap(bitmapToEdit, x, y, sizeX, sizeY); - } catch (Throwable e2) { - FileLog.e("tmessages", e2); - } - } - return null; - } - - @Override - protected void onDraw(Canvas canvas) { - canvas.drawRect(bitmapX, bitmapY, bitmapX + bitmapWidth, rectY, halfPaint); - canvas.drawRect(bitmapX, rectY, rectX, rectY + rectSizeY, halfPaint); - canvas.drawRect(rectX + rectSizeX, rectY, bitmapX + bitmapWidth, rectY + rectSizeY, halfPaint); - canvas.drawRect(bitmapX, rectY + rectSizeY, bitmapX + bitmapWidth, bitmapY + bitmapHeight, halfPaint); - - int side = AndroidUtilities.dp(1); - canvas.drawRect(rectX - side * 2, rectY - side * 2, rectX - side * 2 + AndroidUtilities.dp(20), rectY, circlePaint); - canvas.drawRect(rectX - side * 2, rectY - side * 2, rectX, rectY - side * 2 + AndroidUtilities.dp(20), circlePaint); - - canvas.drawRect(rectX + rectSizeX + side * 2 - AndroidUtilities.dp(20), rectY - side * 2, rectX + rectSizeX + side * 2, rectY, circlePaint); - canvas.drawRect(rectX + rectSizeX, rectY - side * 2, rectX + rectSizeX + side * 2, rectY - side * 2 + AndroidUtilities.dp(20), circlePaint); - - canvas.drawRect(rectX - side * 2, rectY + rectSizeY + side * 2 - AndroidUtilities.dp(20), rectX, rectY + rectSizeY + side * 2, circlePaint); - canvas.drawRect(rectX - side * 2, rectY + rectSizeY, rectX - side * 2 + AndroidUtilities.dp(20), rectY + rectSizeY + side * 2, circlePaint); - - canvas.drawRect(rectX + rectSizeX + side * 2 - AndroidUtilities.dp(20), rectY + rectSizeY, rectX + rectSizeX + side * 2, rectY + rectSizeY + side * 2, circlePaint); - canvas.drawRect(rectX + rectSizeX, rectY + rectSizeY + side * 2 - AndroidUtilities.dp(20), rectX + rectSizeX + side * 2, rectY + rectSizeY + side * 2, circlePaint); - - for (int a = 1; a < 3; a++) { - canvas.drawRect(rectX + rectSizeX / 3 * a - side, rectY, rectX + side * 2 + rectSizeX / 3 * a, rectY + rectSizeY, shadowPaint); - canvas.drawRect(rectX, rectY + rectSizeY / 3 * a - side, rectX + rectSizeX, rectY + rectSizeY / 3 * a + side * 2, shadowPaint); - } - - for (int a = 1; a < 3; a++) { - canvas.drawRect(rectX + rectSizeX / 3 * a, rectY, rectX + side + rectSizeX / 3 * a, rectY + rectSizeY, circlePaint); - canvas.drawRect(rectX, rectY + rectSizeY / 3 * a, rectX + rectSizeX, rectY + rectSizeY / 3 * a + side, circlePaint); - } - - canvas.drawRect(rectX, rectY, rectX + rectSizeX, rectY + rectSizeY, rectPaint); - } - } - - class MyGLSurfaceView extends GLSurfaceView { - - public MyGLSurfaceView(Context context){ - super(context); - setEGLContextClientVersion(2); - setRenderer(new MyGLRenderer()); - setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); - } - } - - public class MyGLRenderer implements GLSurfaceView.Renderer { - - private int trivialShaderProgram; - - private int positionHandle; - private int inputTexCoordHandle; - private int photoImageHandle; - private int shadowsHandle; - private int highlightsHandle; - private int exposureHandle; - private int contrastHandle; - private int saturationHandle; - private int warmthHandle; - private int vignetteHandle; - private int grainHandle; - private int grainWidthHandle; - private int grainHeightHandle; - - private int[] textures = new int[1]; - - private FloatBuffer vertexBuffer; - private FloatBuffer textureBuffer; - private FloatBuffer vertexSaveBuffer; - - private static final String trivialVertexShaderCode = - "attribute vec4 position;" + - "attribute vec4 inputTexCoord;" + - "varying vec2 texCoord;" + - "void main() {" + - "gl_Position = position;" + - "texCoord = inputTexCoord.xy;" + - "}"; - - private static final String trivialFragmentShaderCode = - "varying highp vec2 texCoord;" + - "uniform sampler2D photoImage;" + - "uniform lowp float shadows;" + - "uniform highp float width;" + - "uniform highp float height;" + - "const mediump vec3 hsLuminanceWeighting = vec3(0.3, 0.3, 0.3);" + - "uniform lowp float highlights;" + - "uniform highp float exposure;" + - "uniform lowp float contrast;" + - "const mediump vec3 satLuminanceWeighting = vec3(0.2126, 0.7152, 0.0722);" + - "uniform lowp float saturation;" + - "uniform lowp float warmth;" + - "uniform lowp float grain;" + - "const lowp float permTexUnit = 1.0 / 256.0;" + - "const lowp float permTexUnitHalf = 0.5 / 256.0;" + - "const lowp float grainsize = 2.3;" + - "uniform lowp float vignette;" + - "highp float getLuma(highp vec3 rgbP) { return (0.299 * rgbP.r) + (0.587 * rgbP.g) + (0.114 * rgbP.b); }" + - "highp vec3 rgbToYuv(highp vec3 inP) { highp vec3 outP; outP.r = getLuma(inP); outP.g = (1.0 / 1.772) * (inP.b - outP.r); outP.b = (1.0 / 1.402) * (inP.r - outP.r); return outP; }" + - "lowp vec3 yuvToRgb(highp vec3 inP) { highp float y = inP.r; highp float u = inP.g; highp float v = inP.b; lowp vec3 outP; outP.r = 1.402 * v + y; outP.g = (y - (0.299 * 1.402 / 0.587) * v - (0.114 * 1.772 / 0.587) * u); outP.b = 1.772 * u + y; return outP; } " + - "lowp float easeInOutSigmoid(lowp float value, lowp float strength) { lowp float t = 1.0 / (1.0 - strength); if (value > 0.5) { return 1.0 - pow(2.0 - 2.0 * value, t) * 0.5; } else { return pow(2.0 * value, t) * 0.5; } }" + - "highp vec4 rnm(in highp vec2 tc) { highp float noise = sin(dot(tc,vec2(12.9898,78.233))) * 43758.5453; highp float noiseR = fract(noise)*2.0-1.0; highp float noiseG = fract(noise*1.2154)*2.0-1.0; highp float noiseB = fract(noise*1.3453)*2.0-1.0; " + - "highp float noiseA = fract(noise*1.3647)*2.0-1.0; return vec4(noiseR,noiseG,noiseB,noiseA); } highp float fade(in highp float t) { return t*t*t*(t*(t*6.0-15.0)+10.0); } highp float pnoise3D(in highp vec3 p) { highp vec3 pi = permTexUnit*floor(p)+permTexUnitHalf; " + - "highp vec3 pf = fract(p); highp float perm00 = rnm(pi.xy).a ; highp vec3 grad000 = rnm(vec2(perm00, pi.z)).rgb * 4.0 - 1.0; highp float n000 = dot(grad000, pf); highp vec3 grad001 = rnm(vec2(perm00, pi.z + permTexUnit)).rgb * 4.0 - 1.0; " + - "highp float n001 = dot(grad001, pf - vec3(0.0, 0.0, 1.0)); highp float perm01 = rnm(pi.xy + vec2(0.0, permTexUnit)).a ; highp vec3 grad010 = rnm(vec2(perm01, pi.z)).rgb * 4.0 - 1.0; highp float n010 = dot(grad010, pf - vec3(0.0, 1.0, 0.0));" + - "highp vec3 grad011 = rnm(vec2(perm01, pi.z + permTexUnit)).rgb * 4.0 - 1.0; highp float n011 = dot(grad011, pf - vec3(0.0, 1.0, 1.0)); highp float perm10 = rnm(pi.xy + vec2(permTexUnit, 0.0)).a ;" + - "highp vec3 grad100 = rnm(vec2(perm10, pi.z)).rgb * 4.0 - 1.0; highp float n100 = dot(grad100, pf - vec3(1.0, 0.0, 0.0)); highp vec3 grad101 = rnm(vec2(perm10, pi.z + permTexUnit)).rgb * 4.0 - 1.0;" + - "highp float n101 = dot(grad101, pf - vec3(1.0, 0.0, 1.0)); highp float perm11 = rnm(pi.xy + vec2(permTexUnit, permTexUnit)).a ; highp vec3 grad110 = rnm(vec2(perm11, pi.z)).rgb * 4.0 - 1.0; highp float n110 = dot(grad110, pf - vec3(1.0, 1.0, 0.0));" + - "highp vec3 grad111 = rnm(vec2(perm11, pi.z + permTexUnit)).rgb * 4.0 - 1.0; highp float n111 = dot(grad111, pf - vec3(1.0, 1.0, 1.0)); highp vec4 n_x = mix(vec4(n000, n001, n010, n011), vec4(n100, n101, n110, n111), fade(pf.x));" + - "highp vec2 n_xy = mix(n_x.xy, n_x.zw, fade(pf.y)); highp float n_xyz = mix(n_xy.x, n_xy.y, fade(pf.z)); return n_xyz; } lowp vec2 coordRot(in lowp vec2 tc, in lowp float angle) { lowp float rotX = ((tc.x * 2.0 - 1.0) * cos(angle)) - ((tc.y * 2.0 - 1.0) * sin(angle));" + - "lowp float rotY = ((tc.y * 2.0 - 1.0) * cos(angle)) + ((tc.x * 2.0 - 1.0) * sin(angle)); rotX = rotX * 0.5 + 0.5; rotY = rotY * 0.5 + 0.5; return vec2(rotX,rotY); }void main() {lowp vec4 source = texture2D(photoImage, texCoord);lowp vec4 result = source;" + - "const lowp float toolEpsilon = 0.005;mediump float hsLuminance = dot(result.rgb, hsLuminanceWeighting); mediump float shadow = clamp((pow(hsLuminance, 1.0 / (shadows + 1.0)) + (-0.76) * pow(hsLuminance, 2.0 / (shadows + 1.0))) - hsLuminance, 0.0, 1.0);" + - "mediump float highlight = clamp((1.0 - (pow(1.0 - hsLuminance, 1.0 / (2.0 - highlights)) + (-0.8) * pow(1.0 - hsLuminance, 2.0 / (2.0 - highlights)))) - hsLuminance, -1.0, 0.0);" + - "lowp vec3 shresult = vec3(0.0, 0.0, 0.0) + ((hsLuminance + shadow + highlight) - 0.0) * ((result.rgb - vec3(0.0, 0.0, 0.0)) / (hsLuminance - 0.0)); result = vec4(shresult.rgb, result.a);" + - "if (abs(exposure) > toolEpsilon) { mediump float mag = exposure * 1.045; mediump float exppower = 1.0 + abs(mag); if (mag < 0.0) { exppower = 1.0 / exppower; } result.r = 1.0 - pow((1.0 - result.r), exppower);" + - "result.g = 1.0 - pow((1.0 - result.g), exppower); result.b = 1.0 - pow((1.0 - result.b), exppower); }result = vec4(((result.rgb - vec3(0.5)) * contrast + vec3(0.5)), result.a);" + - "lowp float satLuminance = dot(result.rgb, satLuminanceWeighting); lowp vec3 greyScaleColor = vec3(satLuminance); result = vec4(mix(greyScaleColor, result.rgb, saturation), result.a);" + - "if (abs(warmth) > toolEpsilon) { highp vec3 yuvVec; if (warmth > 0.0 ) { yuvVec = vec3(0.1765, -0.1255, 0.0902); } else { yuvVec = -vec3(0.0588, 0.1569, -0.1255); } highp vec3 yuvColor = rgbToYuv(result.rgb); highp float luma = yuvColor.r;" + - "highp float curveScale = sin(luma * 3.14159); yuvColor += 0.375 * warmth * curveScale * yuvVec; result.rgb = yuvToRgb(yuvColor); }if (abs(grain) > toolEpsilon) { highp vec3 rotOffset = vec3(1.425, 3.892, 5.835);" + - "highp vec2 rotCoordsR = coordRot(texCoord, rotOffset.x); highp vec3 noise = vec3(pnoise3D(vec3(rotCoordsR * vec2(width / grainsize, height / grainsize),0.0))); lowp vec3 lumcoeff = vec3(0.299,0.587,0.114);" + - "lowp float luminance = dot(result.rgb, lumcoeff); lowp float lum = smoothstep(0.2, 0.0, luminance); lum += luminance; noise = mix(noise,vec3(0.0),pow(lum,4.0)); result.rgb = result.rgb + noise * grain; }" + - "if (abs(vignette) > toolEpsilon) { const lowp float midpoint = 0.7; const lowp float fuzziness = 0.62; lowp float radDist = length(texCoord - 0.5) / sqrt(0.5);" + - "lowp float mag = easeInOutSigmoid(radDist * midpoint, fuzziness) * vignette * 0.645; result.rgb = mix(pow(result.rgb, vec3(1.0 / (1.0 - mag))), vec3(0.0), mag * mag); }gl_FragColor = result;}"; - - private int loadShader(int type, String shaderCode) { - int shader = GLES20.glCreateShader(type); - GLES20.glShaderSource(shader, shaderCode); - GLES20.glCompileShader(shader); - int[] compileStatus = new int[1]; - GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compileStatus, 0); - if (compileStatus[0] == 0) { - GLES20.glDeleteShader(shader); - shader = 0; - } - return shader; - } - - @Override - public void onSurfaceCreated(GL10 gl, javax.microedition.khronos.egl.EGLConfig config) { - - float squareCoordinates[] = { - -1.0f, 1.0f, - 1.0f, 1.0f, - -1.0f, -1.0f, - 1.0f, -1.0f}; - - ByteBuffer bb = ByteBuffer.allocateDirect(squareCoordinates.length * 4); - bb.order(ByteOrder.nativeOrder()); - vertexBuffer = bb.asFloatBuffer(); - vertexBuffer.put(squareCoordinates); - vertexBuffer.position(0); - - float squareCoordinates2[] = { - -1.0f, -1.0f, - 1.0f, -1.0f, - -1.0f, 1.0f, - 1.0f, 1.0f}; - - bb = ByteBuffer.allocateDirect(squareCoordinates2.length * 4); - bb.order(ByteOrder.nativeOrder()); - vertexSaveBuffer = bb.asFloatBuffer(); - vertexSaveBuffer.put(squareCoordinates2); - vertexSaveBuffer.position(0); - - float textureCoordinates[] = { - 0.0f, 0.0f, - 1.0f, 0.0f, - 0.0f, 1.0f, - 1.0f, 1.0f, - }; - - bb = ByteBuffer.allocateDirect(textureCoordinates.length * 4); - bb.order(ByteOrder.nativeOrder()); - textureBuffer = bb.asFloatBuffer(); - textureBuffer.put(textureCoordinates); - textureBuffer.position(0); - - GLES20.glGenTextures(1, textures, 0); - gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); - gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); - gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); - GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmapToEdit, 0); - - int trivialVertexShader = loadShader(GLES20.GL_VERTEX_SHADER, trivialVertexShaderCode); - int trivialFragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, trivialFragmentShaderCode); - - if (trivialVertexShader != 0 && trivialFragmentShader != 0) { - trivialShaderProgram = GLES20.glCreateProgram(); - GLES20.glAttachShader(trivialShaderProgram, trivialVertexShader); - GLES20.glAttachShader(trivialShaderProgram, trivialFragmentShader); - GLES20.glBindAttribLocation(trivialShaderProgram, 0, "position"); - GLES20.glBindAttribLocation(trivialShaderProgram, 1, "inputTexCoord"); - - GLES20.glLinkProgram(trivialShaderProgram); - int[] linkStatus = new int[1]; - GLES20.glGetProgramiv(trivialShaderProgram, GLES20.GL_LINK_STATUS, linkStatus, 0); - if (linkStatus[0] == 0) { - GLES20.glDeleteProgram(trivialShaderProgram); - trivialShaderProgram = 0; - } - } - - if (trivialShaderProgram != 0) { - positionHandle = GLES20.glGetAttribLocation(trivialShaderProgram, "position"); - inputTexCoordHandle = GLES20.glGetAttribLocation(trivialShaderProgram, "inputTexCoord"); - photoImageHandle = GLES20.glGetUniformLocation(trivialShaderProgram, "photoImage"); - shadowsHandle = GLES20.glGetUniformLocation(trivialShaderProgram, "shadows"); - highlightsHandle = GLES20.glGetUniformLocation(trivialShaderProgram, "highlights"); - exposureHandle = GLES20.glGetUniformLocation(trivialShaderProgram, "exposure"); - contrastHandle = GLES20.glGetUniformLocation(trivialShaderProgram, "contrast"); - saturationHandle = GLES20.glGetUniformLocation(trivialShaderProgram, "saturation"); - warmthHandle = GLES20.glGetUniformLocation(trivialShaderProgram, "warmth"); - vignetteHandle = GLES20.glGetUniformLocation(trivialShaderProgram, "vignette"); - grainHandle = GLES20.glGetUniformLocation(trivialShaderProgram, "grain"); - grainWidthHandle = GLES20.glGetUniformLocation(trivialShaderProgram, "width"); - grainHeightHandle = GLES20.glGetUniformLocation(trivialShaderProgram, "height"); - GLES20.glUseProgram(trivialShaderProgram); - } - } - - public void onDrawFrame(GL10 unused) { - GLES20.glActiveTexture(GLES20.GL_TEXTURE0); - GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]); - GLES20.glUniform1i(photoImageHandle, 0); - GLES20.glUniform1f(shadowsHandle, getShadowsValue()); - GLES20.glUniform1f(highlightsHandle, getHighlightsValue()); - GLES20.glUniform1f(exposureHandle, getExposureValue()); - GLES20.glUniform1f(contrastHandle, getContrastValue()); - GLES20.glUniform1f(saturationHandle, getSaturationValue()); - GLES20.glUniform1f(warmthHandle, getWarmthValue()); - GLES20.glUniform1f(vignetteHandle, getVignetteValue()); - GLES20.glUniform1f(grainHandle, getGrainValue()); - GLES20.glUniform1f(grainWidthHandle, width); - GLES20.glUniform1f(grainHeightHandle, height); - GLES20.glEnableVertexAttribArray(inputTexCoordHandle); - GLES20.glVertexAttribPointer(inputTexCoordHandle, 2, GLES20.GL_FLOAT, false, 8, textureBuffer); - GLES20.glEnableVertexAttribArray(positionHandle); - if (donePressed) { - GLES20.glVertexAttribPointer(positionHandle, 2, GLES20.GL_FLOAT, false, 8, vertexSaveBuffer); - GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); - final Bitmap bitmap = saveTexture((int)width, (int)height); - donePressed = false; - AndroidUtilities.runOnUIThread(new Runnable() { - @Override - public void run() { - delegate.didFinishEdit(bitmap, getArguments()); - finishFragment(); - } - }); - } - GLES20.glVertexAttribPointer(positionHandle, 2, GLES20.GL_FLOAT, false, 8, vertexBuffer); - GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); - } - - public void onSurfaceChanged(GL10 unused, int width, int height) { - GLES20.glViewport(0, 0, width, height); - } - - public Bitmap saveTexture(int width, int height) { - //int[] frame = new int[1]; - //GLES20.glGenFramebuffers(1, frame, 0); - //GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, frame[0]); - //GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, texture, 0); - ByteBuffer buffer = ByteBuffer.allocate(width * height * 4); - GLES20.glReadPixels(0, 0, width, height, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, buffer); - Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); - bitmap.copyPixelsFromBuffer(buffer); - //GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0); - //GLES20.glDeleteFramebuffers(1, frame, 0); - return bitmap; - } - } - - public PhotoEditorActivity(Bundle args, Bitmap bitmap, String key) { - super(args); - bitmapToEdit = bitmap; - bitmapKey = key; - if (bitmapToEdit != null && key != null) { - ImageLoader.getInstance().incrementUseCount(key); - } - } - - private float getShadowsValue() { - return (shadowsValue / 100.0f) * 0.65f; - } - - private float getHighlightsValue() { - return 1 - (highlightsValue / 100.0f); - } - - private float getExposureValue() { - return (exposureValue / 100.0f); - } - - private float getContrastValue() { - return (contrastValue / 100.0f) * 0.3f + 1; - } - - private float getWarmthValue() { - return warmthValue / 100.0f; - } - - private float getVignetteValue() { - return vignetteValue / 100.0f; - } - - private float getGrainValue() { - return grainValue / 100.0f * 0.04f; - } - - private float getSaturationValue() { - float value = (saturationValue / 100.0f); - if (value < 0) { - value *= 0.55f; - } else { - value *= 1.05f; - } - return value + 1; - } - - @Override - public boolean onFragmentCreate() { - swipeBackEnabled = false; - freeformCrop = getArguments().getBoolean("freeformCrop", false); - onlyCrop = getArguments().getBoolean("onlyCrop", false); - if (bitmapToEdit == null) { - String photoPath = getArguments().getString("photoPath"); - Uri photoUri = getArguments().getParcelable("photoUri"); - if (photoPath == null && photoUri == null) { - return false; - } - if (photoPath != null) { - File f = new File(photoPath); - if (!f.exists()) { - return false; - } - } - int size = 0; - if (AndroidUtilities.isTablet()) { - size = AndroidUtilities.dp(520); - } else { - size = Math.max(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y); - } - bitmapToEdit = ImageLoader.loadBitmap(photoPath, photoUri, size, size, true); - if (bitmapToEdit == null) { - return false; - } - } - return super.onFragmentCreate(); - } - - @Override - public void onFragmentDestroy() { - super.onFragmentDestroy(); - if (bitmapKey != null) { - if (ImageLoader.getInstance().decrementUseCount(bitmapKey) && !ImageLoader.getInstance().isInCache(bitmapKey)) { - bitmapKey = null; - } - } - if (bitmapKey == null && bitmapToEdit != null && !sameBitmap) { - bitmapToEdit.recycle(); - bitmapToEdit = null; - } - } - - @Override - public void onPause() { - super.onPause(); - if (glView != null) { - glView.onPause(); - } - } - - @Override - public void onResume() { - super.onResume(); - if (glView != null) { - glView.onResume(); - } - } - - @Override - public View createView(LayoutInflater inflater, ViewGroup container) { - if (fragmentView == null) { - actionBar.setBackgroundColor(0xff262626); - actionBar.setItemsBackground(R.drawable.bar_selector_picker); - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setAllowOverlayTitle(true); - actionBar.setTitle(LocaleController.getString("EditImage", R.string.EditImage)); - actionBar.setCastShadows(false); - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == -1) { - finishFragment(); - } else if (id == done_button) { - donePressed = true; - glView.requestRender(); - } else if (id == rotate_button) { - int newRotation = rotateDegree; - newRotation += 90; - fixLayoutInternal(newRotation, true); - } - } - }); - - ActionBarMenu menu = actionBar.createMenu(); - rotateButton = menu.addItemWithWidth(rotate_button, R.drawable.photo_rotate, AndroidUtilities.dp(56)); - sizeButton = menu.addItemWithWidth(size_button, R.drawable.photo_sizes, AndroidUtilities.dp(56)); - doneButton = menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); - - rotateButton.setVisibility(View.GONE); - sizeButton.setVisibility(View.GONE); - - FrameLayout frameLayout = null; - fragmentView = frameLayout = new FrameLayout(getParentActivity()); - fragmentView.setBackgroundColor(0xff262626); - - imageView = new ImageView(getParentActivity()); - imageView.setScaleType(ImageView.ScaleType.MATRIX); - imageView.setImageBitmap(bitmapToEdit); - frameLayout.addView(imageView); - - cropView = new PhotoCropView(getParentActivity()); - cropView.setVisibility(View.GONE); - frameLayout.addView(cropView); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) cropView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - cropView.setLayoutParams(layoutParams); - - cropButtonsView = new LinearLayout(getParentActivity()); - cropButtonsView.setVisibility(View.GONE); - frameLayout.addView(cropButtonsView); - layoutParams = (FrameLayout.LayoutParams) cropButtonsView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.height = AndroidUtilities.dp(48); - layoutParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM; - cropButtonsView.setLayoutParams(layoutParams); - - ImageView button = new ImageView(getParentActivity()); - button.setScaleType(ImageView.ScaleType.CENTER); - button.setImageResource(R.drawable.ic_close_white); - cropButtonsView.addView(button); - LinearLayout.LayoutParams layoutParams1 = (LinearLayout.LayoutParams) button.getLayoutParams(); - layoutParams1.width = AndroidUtilities.dp(48); - layoutParams1.height = AndroidUtilities.dp(48); - button.setLayoutParams(layoutParams1); - button.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (onlyCrop) { - finishFragment(); - } else { - switchToMode(0, true); - } - } - }); - - button = new ImageView(getParentActivity()); - button.setScaleType(ImageView.ScaleType.CENTER); - button.setImageResource(R.drawable.ic_done); - cropButtonsView.addView(button); - layoutParams1 = (LinearLayout.LayoutParams) button.getLayoutParams(); - layoutParams1.width = AndroidUtilities.dp(48); - layoutParams1.height = AndroidUtilities.dp(48); - layoutParams1.leftMargin = AndroidUtilities.dp(146); - button.setLayoutParams(layoutParams1); - button.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (onlyCrop) { - if (delegate != null && currentMode == 1) { - Bitmap bitmap = cropView.getBitmap(); - if (bitmap == bitmapToEdit) { - sameBitmap = true; - } - delegate.didFinishEdit(bitmap, getArguments()); - currentMode = 0; - finishFragment(); - } - } else { - switchToMode(0, false); - } - } - }); - - if (!onlyCrop) { - toolsView = new LinearLayout(getParentActivity()); - frameLayout.addView(toolsView); - layoutParams = (FrameLayout.LayoutParams) toolsView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.height = AndroidUtilities.dp(48); - layoutParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM; - toolsView.setLayoutParams(layoutParams); - - button = new ImageView(getParentActivity()); - button.setScaleType(ImageView.ScaleType.CENTER); - button.setImageResource(R.drawable.photo_crop); - toolsView.addView(button); - layoutParams1 = (LinearLayout.LayoutParams) button.getLayoutParams(); - layoutParams1.width = AndroidUtilities.dp(48); - layoutParams1.height = AndroidUtilities.dp(48); - button.setLayoutParams(layoutParams1); - button.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - switchToMode(1, true); - } - }); - - filtersButton = new ImageView(getParentActivity()); - filtersButton.setScaleType(ImageView.ScaleType.CENTER); - filtersButton.setImageResource(R.drawable.photo_filters); - toolsView.addView(filtersButton); - layoutParams1 = (LinearLayout.LayoutParams) filtersButton.getLayoutParams(); - layoutParams1.width = AndroidUtilities.dp(48); - layoutParams1.height = AndroidUtilities.dp(48); - layoutParams1.leftMargin = AndroidUtilities.dp(54); - filtersButton.setLayoutParams(layoutParams1); - - toolButton = new ImageView(getParentActivity()); - toolButton.setScaleType(ImageView.ScaleType.CENTER); - toolButton.setImageResource(R.drawable.photo_tune); - toolsView.addView(toolButton); - layoutParams1 = (LinearLayout.LayoutParams) toolButton.getLayoutParams(); - layoutParams1.width = AndroidUtilities.dp(48); - layoutParams1.height = AndroidUtilities.dp(48); - layoutParams1.leftMargin = AndroidUtilities.dp(54); - toolButton.setLayoutParams(layoutParams1); - - glView = new MyGLSurfaceView(getParentActivity()); - glView.setVisibility(View.GONE); - frameLayout.addView(glView); - layoutParams = (FrameLayout.LayoutParams) glView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - glView.setLayoutParams(layoutParams); - - RecyclerListView toolsView = new RecyclerListView(getParentActivity()); - LinearLayoutManager layoutManager = new LinearLayoutManager(getParentActivity()); - layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); - toolsView.setLayoutManager(layoutManager); - toolsView.setClipToPadding(false); - if (Build.VERSION.SDK_INT >= 9) { - toolsView.setOverScrollMode(RecyclerListView.OVER_SCROLL_NEVER); - } - toolsView.setAdapter(new ToolsAdapter(getParentActivity())); - toolsView.setVisibility(View.GONE); - frameLayout.addView(toolsView); - layoutParams = (FrameLayout.LayoutParams) toolsView.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = AndroidUtilities.dp(60); - layoutParams.gravity = Gravity.LEFT | Gravity.BOTTOM; - layoutParams.bottomMargin = AndroidUtilities.dp(40); - toolsView.setLayoutParams(layoutParams); - toolsView.addOnItemTouchListener(new RecyclerListView.RecyclerListViewItemClickListener(getParentActivity(), new RecyclerListView.OnItemClickListener() { - @Override - public void onItemClick(View view, int i) { - selectedTool = i; - if (i == 0) { - valueSeekBar.setMax(100); - valueSeekBar.setProgress((int) highlightsValue); - } else if (i == 1) { - valueSeekBar.setMax(200); - valueSeekBar.setProgress((int) contrastValue + 100); - } else if (i == 2) { - valueSeekBar.setMax(200); - valueSeekBar.setProgress((int) exposureValue + 100); - } else if (i == 3) { - valueSeekBar.setMax(200); - valueSeekBar.setProgress((int) warmthValue + 100); - } else if (i == 4) { - valueSeekBar.setMax(200); - valueSeekBar.setProgress((int) saturationValue + 100); - } else if (i == 5) { - valueSeekBar.setMax(100); - valueSeekBar.setProgress((int) vignetteValue); - } else if (i == 6) { - valueSeekBar.setMax(100); - valueSeekBar.setProgress((int) shadowsValue); - } else if (i == 7) { - valueSeekBar.setMax(100); - valueSeekBar.setProgress((int) grainValue); - } - } - })); - - valueSeekBar = new SeekBar(getParentActivity()); - valueSeekBar.setVisibility(View.GONE); - valueSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - if (!fromUser) { - return; - } - if (selectedTool == 0) { - highlightsValue = progress; - } else if (selectedTool == 1) { - contrastValue = progress - 100; - } else if (selectedTool == 2) { - exposureValue = progress - 100; - } else if (selectedTool == 3) { - warmthValue = progress - 100; - } else if (selectedTool == 4) { - saturationValue = progress - 100; - } else if (selectedTool == 5) { - vignetteValue = progress; - } else if (selectedTool == 6) { - shadowsValue = progress; - } else if (selectedTool == 7) { - grainValue = progress; - } - glView.requestRender(); - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - - } - - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - - } - }); - try { - Field field = ProgressBar.class.getDeclaredField("mMinHeight"); - field.setAccessible(true); - field.setInt(valueSeekBar, AndroidUtilities.dp(40)); - field = ProgressBar.class.getDeclaredField("mMaxHeight"); - field.setAccessible(true); - field.setInt(valueSeekBar, AndroidUtilities.dp(40)); - } catch (Exception e) { - FileLog.e("tmessages", e); - } - frameLayout.addView(valueSeekBar); - layoutParams = (FrameLayout.LayoutParams) valueSeekBar.getLayoutParams(); - layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.height = AndroidUtilities.dp(40); - layoutParams.gravity = Gravity.LEFT | Gravity.BOTTOM; - layoutParams.leftMargin = AndroidUtilities.dp(10); - layoutParams.rightMargin = AndroidUtilities.dp(10); - valueSeekBar.setLayoutParams(layoutParams); - } else { - switchToMode(1, false); - } - - fixLayout(); - } else { - ViewGroup parent = (ViewGroup)fragmentView.getParent(); - if (parent != null) { - parent.removeView(fragmentView); - } - } - return fragmentView; - } - - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - fixLayout(); - } - - private void switchToMode(final int mode, final boolean animated) { - if (animated) { - if (currentMode == 0) { - AnimatorSetProxy animatorSet = new AnimatorSetProxy(); - animatorSet.playTogether( - ObjectAnimatorProxy.ofFloat(doneButton, "alpha", 1.0f, 0.0f), - ObjectAnimatorProxy.ofFloat(toolsView, "translationY", 0, AndroidUtilities.dp(48))); - animatorSet.setDuration(150); - animatorSet.setInterpolator(new DecelerateInterpolator()); - animatorSet.addListener(new AnimatorListenerAdapterProxy() { - @Override - public void onAnimationEnd(Object animation) { - processFromMode(currentMode, mode, animated); - } - }); - animatorSet.start(); - } else if (currentMode == 1) { - AnimatorSetProxy animatorSet = new AnimatorSetProxy(); - animatorSet.playTogether( - ObjectAnimatorProxy.ofFloat(cropView, "alpha", 1.0f, 0.0f), - ObjectAnimatorProxy.ofFloat(cropButtonsView, "translationY", 0, AndroidUtilities.dp(48)), - ObjectAnimatorProxy.ofFloat(rotateButton, "alpha", 1.0f, 0.0f), - ObjectAnimatorProxy.ofFloat(sizeButton, "alpha", 1.0f, 0.0f)); - animatorSet.setDuration(150); - animatorSet.setInterpolator(new DecelerateInterpolator()); - animatorSet.addListener(new AnimatorListenerAdapterProxy() { - @Override - public void onAnimationEnd(Object animation) { - processFromMode(currentMode, mode, animated); - } - }); - animatorSet.start(); - } - } else { - processFromMode(currentMode, mode, animated); - } - } - - private void processFromMode(int from, int to, boolean animated) { - if (from == 0) { - doneButton.setVisibility(View.GONE); - if (toolsView != null) { - toolsView.setVisibility(View.GONE); - } - processToMode(to, animated); - } else if (from == 1) { - cropView.setVisibility(View.GONE); - rotateButton.setVisibility(View.GONE); - if (freeformCrop) { - sizeButton.setVisibility(View.GONE); - } - cropButtonsView.setVisibility(View.GONE); - processToMode(to, animated); - } - } - - private void processToMode(int to, boolean animated) { - currentMode = to; - if (currentMode == 0) { - doneButton.setVisibility(View.VISIBLE); - toolsView.setVisibility(View.VISIBLE); - actionBar.setTitle(LocaleController.getString("EditImage", R.string.EditImage)); - if (animated) { - AnimatorSetProxy animatorSet = new AnimatorSetProxy(); - animatorSet.playTogether( - ObjectAnimatorProxy.ofFloat(doneButton, "alpha", 0.0f, 1.0f), - ObjectAnimatorProxy.ofFloat(toolsView, "translationY", AndroidUtilities.dp(48), 0)); - animatorSet.setDuration(150); - animatorSet.setInterpolator(new AccelerateInterpolator()); - animatorSet.start(); - } - } else if (currentMode == 1) { - cropView.setVisibility(View.VISIBLE); - rotateButton.setVisibility(View.VISIBLE); - if (freeformCrop) { - sizeButton.setVisibility(View.VISIBLE); - } - cropButtonsView.setVisibility(View.VISIBLE); - actionBar.setTitle(LocaleController.getString("CropImage", R.string.CropImage)); - if (animated) { - AnimatorSetProxy animatorSet = new AnimatorSetProxy(); - animatorSet.playTogether( - ObjectAnimatorProxy.ofFloat(cropView, "alpha", 0.0f, 1.0f), - ObjectAnimatorProxy.ofFloat(cropButtonsView, "translationY", AndroidUtilities.dp(48), 0), - ObjectAnimatorProxy.ofFloat(rotateButton, "alpha", 0.0f, 1.0f), - ObjectAnimatorProxy.ofFloat(sizeButton, "alpha", 0.0f, 1.0f)); - animatorSet.setDuration(150); - animatorSet.setInterpolator(new AccelerateInterpolator()); - animatorSet.start(); - } - } - } - - private void fixLayoutInternal(int rotation, final boolean animated) { - if (bitmapToEdit == null || fragmentView == null) { - return; - } - - int viewWidth = fragmentView.getWidth() - AndroidUtilities.dp(28); - int viewHeight = fragmentView.getHeight() - AndroidUtilities.dp(28 + 48); - - rotateDegree = rotation; - - if (cropView != null) { - float bitmapWidth = rotation % 180 == 0 ? bitmapToEdit.getWidth() : bitmapToEdit.getHeight(); - float bitmapHeight = rotation % 180 == 0 ? bitmapToEdit.getHeight() : bitmapToEdit.getWidth(); - float scaleX = viewWidth / bitmapWidth; - float scaleY = viewHeight / bitmapHeight; - if (scaleX > scaleY) { - bitmapHeight = viewHeight; - bitmapWidth = (int)Math.ceil(bitmapWidth * scaleY); - } else { - bitmapWidth = viewWidth; - bitmapHeight = (int)Math.ceil(bitmapHeight * scaleX); - } - - float percX = (cropView.rectX - cropView.bitmapX) / cropView.bitmapWidth; - float percY = (cropView.rectY - cropView.bitmapY) / cropView.bitmapHeight; - float percSizeX = cropView.rectSizeX / cropView.bitmapWidth; - float percSizeY = cropView.rectSizeY / cropView.bitmapHeight; - cropView.bitmapWidth = (int) bitmapWidth; - cropView.bitmapHeight = (int) bitmapHeight; - - cropView.bitmapX = (int) Math.ceil((viewWidth - bitmapWidth) / 2 + AndroidUtilities.dp(14)); - cropView.bitmapY = (int) Math.ceil((viewHeight - bitmapHeight) / 2 + AndroidUtilities.dp(14)); - - if (cropView.rectX == -1 && cropView.rectY == -1) { - if (freeformCrop) { - cropView.rectY = cropView.bitmapY; - cropView.rectX = cropView.bitmapX; - cropView.rectSizeX = bitmapWidth; - cropView.rectSizeY = bitmapHeight; - } else { - if (bitmapWidth > bitmapHeight) { - cropView.rectY = cropView.bitmapY; - cropView.rectX = (viewWidth - bitmapHeight) / 2 + AndroidUtilities.dp(14); - cropView.rectSizeX = bitmapHeight; - cropView.rectSizeY = bitmapHeight; - } else { - cropView.rectX = cropView.bitmapX; - cropView.rectY = (viewHeight - bitmapWidth) / 2 + AndroidUtilities.dp(14); - cropView.rectSizeX = bitmapWidth; - cropView.rectSizeY = bitmapWidth; - } - } - } else { - if (rotation % 180 == 0) { - cropView.rectX = percX * bitmapWidth + cropView.bitmapX; - cropView.rectY = percY * bitmapHeight + cropView.bitmapY; - } else { - cropView.rectX = percY * bitmapWidth + cropView.bitmapX; - cropView.rectY = percX * bitmapHeight + cropView.bitmapY; - } - cropView.rectSizeX = percSizeX * bitmapWidth; - cropView.rectSizeY = percSizeY * bitmapHeight; - } - cropView.invalidate(); - } - - float bitmapWidth = bitmapToEdit.getWidth(); - float bitmapHeight = bitmapToEdit.getHeight(); - float scaleX = viewWidth / bitmapWidth; - float scaleY = viewHeight / bitmapHeight; - float scale; - if (scaleX > scaleY) { - bitmapHeight = viewHeight; - bitmapWidth = (int)Math.ceil(bitmapWidth * scaleY); - scale = cropView.bitmapHeight / bitmapWidth; - } else { - bitmapWidth = viewWidth; - bitmapHeight = (int)Math.ceil(bitmapHeight * scaleX); - scale = cropView.bitmapWidth / bitmapHeight; - } - - FrameLayout.LayoutParams layoutParams; - if (imageView != null) { - layoutParams = (FrameLayout.LayoutParams) imageView.getLayoutParams(); - layoutParams.leftMargin = (int) ((viewWidth - bitmapWidth) / 2 + AndroidUtilities.dp(14)); - layoutParams.topMargin = (int) ((viewHeight - bitmapHeight) / 2 + AndroidUtilities.dp(14)); - layoutParams.width = (int) bitmapWidth; - layoutParams.height = (int) bitmapHeight; - imageView.setLayoutParams(layoutParams); - - if (animated) { - ViewProxy.setAlpha(cropView, 0.0f); - rotationAnimation = new AnimatorSetProxy(); - rotationAnimation.playTogether( - ObjectAnimatorProxy.ofFloat(imageView, "scaleX", rotateDegree % 180 != 0 ? scale : 1), - ObjectAnimatorProxy.ofFloat(imageView, "scaleY", rotateDegree % 180 != 0 ? scale : 1), - ObjectAnimatorProxy.ofFloat(imageView, "rotation", rotateDegree)); - rotationAnimation.setDuration(150); - rotationAnimation.setInterpolator(new AccelerateDecelerateInterpolator()); - rotationAnimation.addListener(new AnimatorListenerAdapterProxy() { - @Override - public void onAnimationEnd(Object animation) { - if (rotationAnimation.equals(animation)) { - AnimatorSetProxy animatorSet = new AnimatorSetProxy(); - animatorSet.playTogether(ObjectAnimatorProxy.ofFloat(cropView, "alpha", 1.0f)); - animatorSet.setDuration(150); - animatorSet.setInterpolator(new AccelerateDecelerateInterpolator()); - animatorSet.start(); - rotationAnimation = null; - } - } - }); - rotationAnimation.start(); - } else { - imageView.setScaleX(rotateDegree % 180 != 0 ? scale : 1); - imageView.setScaleY(rotateDegree % 180 != 0 ? scale : 1); - imageView.setRotation(rotateDegree); - } - } - - if (glView != null) { - width = bitmapWidth; - height = bitmapHeight; - layoutParams = (FrameLayout.LayoutParams) glView.getLayoutParams(); - layoutParams.leftMargin = (int) ((viewWidth - bitmapWidth) / 2 + AndroidUtilities.dp(14)); - layoutParams.topMargin = (int) ((viewHeight - bitmapHeight) / 2 + AndroidUtilities.dp(14)); - layoutParams.width = (int) bitmapWidth; - layoutParams.height = (int) bitmapHeight; - glView.setLayoutParams(layoutParams); - glView.requestRender(); - } - } - - private void fixLayout() { - if (fragmentView == null) { - return; - } - fragmentView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { - @Override - public boolean onPreDraw() { - if (fragmentView != null) { - fixLayoutInternal(rotateDegree, false); - fragmentView.getViewTreeObserver().removeOnPreDrawListener(this); - } - return false; - } - }); - } - - public void setDelegate(PhotoCropActivity.PhotoEditActivityDelegate delegate) { - this.delegate = delegate; - } - - public class ToolsAdapter extends RecyclerView.Adapter { - - private Context mContext; - - private class Holder extends RecyclerView.ViewHolder { - - public Holder(View itemView) { - super(itemView); - } - } - - public ToolsAdapter(Context context) { - mContext = context; - } - - @Override - public int getItemCount() { - return 8; - } - - @Override - public long getItemId(int i) { - return i; - } - - @Override - public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { - PhotoEditToolCell view = new PhotoEditToolCell(mContext); - return new Holder(view); - } - - @Override - public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) { - Holder holder = (Holder) viewHolder; - if (i == 0) { - ((PhotoEditToolCell) holder.itemView).setIconAndText(R.drawable.photo_editor_highlights, "Highlights"); - } else if (i == 1) { - ((PhotoEditToolCell) holder.itemView).setIconAndText(R.drawable.photo_editor_contrast, "Contrast"); - } else if (i == 2) { - ((PhotoEditToolCell) holder.itemView).setIconAndText(R.drawable.photo_editor_exposure, "Exposure"); - } else if (i == 3) { - ((PhotoEditToolCell) holder.itemView).setIconAndText(R.drawable.photo_editor_warmth, "Warmth"); - } else if (i == 4) { - ((PhotoEditToolCell) holder.itemView).setIconAndText(R.drawable.photo_editor_saturation, "Saturation"); - } else if (i == 5) { - ((PhotoEditToolCell) holder.itemView).setIconAndText(R.drawable.photo_editor_vignette, "Vignette"); - } else if (i == 6) { - ((PhotoEditToolCell) holder.itemView).setIconAndText(R.drawable.photo_editor_shadows, "Shadows"); - } else if (i == 7) { - ((PhotoEditToolCell) holder.itemView).setIconAndText(R.drawable.photo_editor_grain, "Grain"); - } - } - } -} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PhotoPickerActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PhotoPickerActivity.java index 0c573a96c..ccaef1c03 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PhotoPickerActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PhotoPickerActivity.java @@ -12,7 +12,6 @@ import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.os.Build; -import android.os.Bundle; import android.util.Base64; import android.view.Gravity; import android.view.LayoutInflater; @@ -33,7 +32,6 @@ import android.widget.TextView; import org.json.JSONArray; import org.json.JSONObject; import org.telegram.android.AndroidUtilities; -import org.telegram.android.ImageLoader; import org.telegram.android.LocaleController; import org.telegram.android.MediaController; import org.telegram.android.MessagesStorage; @@ -47,7 +45,6 @@ import org.telegram.android.volley.toolbox.JsonObjectRequest; import org.telegram.android.volley.toolbox.Volley; import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.BuildVars; -import org.telegram.messenger.FileLoader; import org.telegram.messenger.FileLog; import org.telegram.messenger.R; import org.telegram.messenger.TLRPC; @@ -68,7 +65,7 @@ import java.util.HashMap; import java.util.Locale; import java.util.Map; -public class PhotoPickerActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate, PhotoViewer.PhotoViewerProvider, PhotoCropActivity.PhotoEditActivityDelegate { +public class PhotoPickerActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate, PhotoViewer.PhotoViewerProvider { public static interface PhotoPickerActivityDelegate { public abstract void selectedPhotosChanged(); @@ -102,16 +99,18 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen private ActionBarMenuItem searchItem; private int itemWidth = 100; private boolean sendPressed; + private boolean singlePhoto; private PhotoPickerActivityDelegate delegate; - public PhotoPickerActivity(int type, MediaController.AlbumEntry selectedAlbum, HashMap selectedPhotos, HashMap selectedWebPhotos, ArrayList recentImages) { + public PhotoPickerActivity(int type, MediaController.AlbumEntry selectedAlbum, HashMap selectedPhotos, HashMap selectedWebPhotos, ArrayList recentImages, boolean onlyOnePhoto) { super(); this.selectedAlbum = selectedAlbum; this.selectedPhotos = selectedPhotos; this.selectedWebPhotos = selectedWebPhotos; this.type = type; this.recentImages = recentImages; + this.singlePhoto = onlyOnePhoto; } @Override @@ -141,7 +140,7 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen @SuppressWarnings("unchecked") @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { if (fragmentView == null) { actionBar.setBackgroundColor(0xff333333); actionBar.setItemsBackground(R.drawable.bar_selector_picker); @@ -257,7 +256,7 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.bottomMargin = AndroidUtilities.dp(48); + layoutParams.bottomMargin = singlePhoto ? 0 : AndroidUtilities.dp(48); listView.setLayoutParams(layoutParams); listView.setAdapter(listAdapter = new ListAdapter(getParentActivity())); AndroidUtilities.setListViewEdgeEffectColor(listView, 0xff333333); @@ -278,7 +277,7 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen return; } PhotoViewer.getInstance().setParentActivity(getParentActivity()); - PhotoViewer.getInstance().openPhotoForSelect(arrayList, i, PhotoPickerActivity.this); + PhotoViewer.getInstance().openPhotoForSelect(arrayList, i, singlePhoto ? 1 : 0, PhotoPickerActivity.this); } }); @@ -300,7 +299,7 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen layoutParams = (FrameLayout.LayoutParams) emptyView.getLayoutParams(); layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.bottomMargin = AndroidUtilities.dp(48); + layoutParams.bottomMargin = singlePhoto ? 0 : AndroidUtilities.dp(48); emptyView.setLayoutParams(layoutParams); emptyView.setOnTouchListener(new View.OnTouchListener() { @Override @@ -336,7 +335,7 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen layoutParams = (FrameLayout.LayoutParams) progressView.getLayoutParams(); layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.bottomMargin = AndroidUtilities.dp(48); + layoutParams.bottomMargin = singlePhoto ? 0 : AndroidUtilities.dp(48); progressView.setLayoutParams(layoutParams); ProgressBar progressBar = new ProgressBar(getParentActivity()); @@ -370,6 +369,9 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen sendSelectedPhotos(); } }); + if (singlePhoto) { + photoPickerBottomLayout.setVisibility(View.GONE); + } listView.setEmptyView(emptyView); photoPickerBottomLayout.updateSelectedCount(selectedPhotos.size() + selectedWebPhotos.size(), true); @@ -464,6 +466,40 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen return null; } + @Override + public void updatePhotoAtIndex(int index) { + PhotoPickerPhotoCell cell = getCellForIndex(index); + if (cell != null) { + if (selectedAlbum != null) { + cell.photoImage.setOrientation(0, true); + MediaController.PhotoEntry photoEntry = selectedAlbum.photos.get(index); + if (photoEntry.thumbPath != null) { + cell.photoImage.setImage(photoEntry.thumbPath, null, cell.getContext().getResources().getDrawable(R.drawable.nophotos)); + } else if (photoEntry.path != null) { + cell.photoImage.setOrientation(photoEntry.orientation, true); + cell.photoImage.setImage("thumb://" + photoEntry.imageId + ":" + photoEntry.path, null, cell.getContext().getResources().getDrawable(R.drawable.nophotos)); + } else { + cell.photoImage.setImageResource(R.drawable.nophotos); + } + } else { + ArrayList array = null; + if (searchResult.isEmpty() && lastSearchString == null) { + array = recentImages; + } else { + array = searchResult; + } + MediaController.SearchImage photoEntry = array.get(index); + if (photoEntry.thumbPath != null) { + cell.photoImage.setImage(photoEntry.thumbPath, null, cell.getContext().getResources().getDrawable(R.drawable.nophotos)); + } else if (photoEntry.thumbUrl != null && photoEntry.thumbUrl.length() > 0) { + cell.photoImage.setImage(photoEntry.thumbUrl, null, cell.getContext().getResources().getDrawable(R.drawable.nophotos)); + } else { + cell.photoImage.setImageResource(R.drawable.nophotos); + } + } + } + } + @Override public Bitmap getThumbForPhoto(MessageObject messageObject, TLRPC.FileLocation fileLocation, int index) { PhotoPickerPhotoCell cell = getCellForIndex(index); @@ -618,20 +654,6 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen } } - @Override - public void didFinishEdit(Bitmap bitmap, Bundle args) { - TLRPC.PhotoSize size = ImageLoader.scaleAndSaveImage(bitmap, AndroidUtilities.getPhotoSize(), AndroidUtilities.getPhotoSize(), 80, false, 101, 101); - if (size != null) { - int id = args.getInt("id"); - MediaController.PhotoEntry entry = selectedAlbum.photosByIds.get(id); - entry.imagePath = FileLoader.getPathToAttach(size, true).toString(); - selectedPhotos.put(entry.imageId, entry); - listAdapter.notifyDataSetChanged(); - photoPickerBottomLayout.updateSelectedCount(selectedPhotos.size() + selectedWebPhotos.size(), true); - delegate.selectedPhotosChanged(); - } - } - private void updateSearchInterface() { if (listAdapter != null) { listAdapter.notifyDataSetChanged(); @@ -654,7 +676,7 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen } try { searching = true; - String url = String.format("https://api.giphy.com/v1/gifs/search?q=%s&offset=%d&limit=%d&api_key=141Wa2KDAfNfxu", URLEncoder.encode(query, "UTF-8"), offset, count); + String url = String.format(Locale.US, "https://api.giphy.com/v1/gifs/search?q=%s&offset=%d&limit=%d&api_key=141Wa2KDAfNfxu", URLEncoder.encode(query, "UTF-8"), offset, count); JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener() { @Override @@ -933,15 +955,17 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen cell.checkFrame.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { + int index = (Integer) ((View) v.getParent()).getTag(); if (selectedAlbum != null) { - MediaController.PhotoEntry photoEntry = selectedAlbum.photos.get((Integer) ((View) v.getParent()).getTag()); + MediaController.PhotoEntry photoEntry = selectedAlbum.photos.get(index); if (selectedPhotos.containsKey(photoEntry.imageId)) { selectedPhotos.remove(photoEntry.imageId); photoEntry.imagePath = null; + photoEntry.thumbPath = null; + updatePhotoAtIndex(index); } else { selectedPhotos.put(photoEntry.imageId, photoEntry); } - ((PhotoPickerPhotoCell) v.getParent()).editedImage.setVisibility(photoEntry.imagePath != null ? View.VISIBLE : View.GONE); ((PhotoPickerPhotoCell) v.getParent()).checkBox.setChecked(selectedPhotos.containsKey(photoEntry.imageId), true); } else { AndroidUtilities.hideKeyboard(getParentActivity().getCurrentFocus()); @@ -953,32 +977,38 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen } if (selectedWebPhotos.containsKey(photoEntry.id)) { selectedWebPhotos.remove(photoEntry.id); + photoEntry.imagePath = null; + photoEntry.thumbPath = null; + updatePhotoAtIndex(index); } else { selectedWebPhotos.put(photoEntry.id, photoEntry); } - ((PhotoPickerPhotoCell) v.getParent()).editedImage.setVisibility(View.GONE); ((PhotoPickerPhotoCell) v.getParent()).checkBox.setChecked(selectedWebPhotos.containsKey(photoEntry.id), true); } photoPickerBottomLayout.updateSelectedCount(selectedPhotos.size() + selectedWebPhotos.size(), true); delegate.selectedPhotosChanged(); } }); + cell.checkFrame.setVisibility(singlePhoto ? View.GONE : View.VISIBLE); } cell.itemWidth = itemWidth; BackupImageView imageView = ((PhotoPickerPhotoCell) view).photoImage; imageView.setTag(i); view.setTag(i); boolean showing = false; + imageView.setOrientation(0, true); if (selectedAlbum != null) { MediaController.PhotoEntry photoEntry = selectedAlbum.photos.get(i); - if (photoEntry.path != null) { + if (photoEntry.thumbPath != null) { + imageView.setImage(photoEntry.thumbPath, null, mContext.getResources().getDrawable(R.drawable.nophotos)); + } else if (photoEntry.path != null) { + imageView.setOrientation(photoEntry.orientation, true); imageView.setImage("thumb://" + photoEntry.imageId + ":" + photoEntry.path, null, mContext.getResources().getDrawable(R.drawable.nophotos)); } else { imageView.setImageResource(R.drawable.nophotos); } cell.checkBox.setChecked(selectedPhotos.containsKey(photoEntry.imageId), false); - cell.editedImage.setVisibility(photoEntry.imagePath != null ? View.VISIBLE : View.GONE); showing = PhotoViewer.getInstance().isShowingImage(photoEntry.path); } else { MediaController.SearchImage photoEntry = null; @@ -987,17 +1017,18 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen } else { photoEntry = searchResult.get(i); } - if (photoEntry.thumbUrl != null && photoEntry.thumbUrl.length() > 0) { + if (photoEntry.thumbPath != null) { + imageView.setImage(photoEntry.thumbPath, null, mContext.getResources().getDrawable(R.drawable.nophotos)); + } else if (photoEntry.thumbUrl != null && photoEntry.thumbUrl.length() > 0) { imageView.setImage(photoEntry.thumbUrl, null, mContext.getResources().getDrawable(R.drawable.nophotos)); } else { imageView.setImageResource(R.drawable.nophotos); } cell.checkBox.setChecked(selectedWebPhotos.containsKey(photoEntry.id), false); - cell.editedImage.setVisibility(View.GONE); showing = PhotoViewer.getInstance().isShowingImage(photoEntry.thumbUrl); } imageView.imageReceiver.setVisible(!showing, false); - cell.checkBox.setVisibility(showing ? View.GONE : View.VISIBLE); + cell.checkBox.setVisibility(singlePhoto || showing ? View.GONE : View.VISIBLE); } else if (viewType == 1) { if (view == null) { LayoutInflater li = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java b/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java index 4def7298d..efd0e4df9 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java @@ -12,6 +12,7 @@ import android.annotation.SuppressLint; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Canvas; @@ -23,8 +24,10 @@ import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.text.TextUtils; +import android.util.TypedValue; import android.view.GestureDetector; import android.view.Gravity; import android.view.MotionEvent; @@ -69,12 +72,15 @@ import org.telegram.ui.Components.CheckBox; import org.telegram.ui.Components.ClippingImageView; import org.telegram.android.ImageReceiver; import org.telegram.ui.Components.GifDrawable; +import org.telegram.ui.Components.PhotoCropView; +import org.telegram.ui.Components.PhotoFilterView; import org.telegram.ui.Components.PhotoPickerBottomLayout; import java.io.File; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Collections; +import java.util.Date; import java.util.HashMap; import java.util.Locale; @@ -98,17 +104,22 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat private FrameLayout bottomLayout; private TextView nameTextView; private TextView dateTextView; - private ImageView deleteButton; private ActionBarMenuItem menuItem; + private ImageView shareButton; private ColorDrawable backgroundDrawable = new ColorDrawable(0xff000000); private CheckBox checkImageView; private PhotoPickerBottomLayout pickerView; - private ImageView shareButton; + private PhotoPickerBottomLayout editorDoneLayout; private RadialProgressView radialProgressViews[] = new RadialProgressView[3]; private GifDrawable gifDrawable; - private ActionBarMenuItem editItem; + private ActionBarMenuItem cropItem; + private ActionBarMenuItem tuneItem; private AnimatorSetProxy currentActionBarAnimation; + private PhotoCropView photoCropView; + private PhotoFilterView photoFilterView; + private AlertDialog visibleDialog = null; private boolean canShowBottom = true; + private int sendPhotoType = 0; private int animationInProgress = 0; private long transitionAnimationStartTime = 0; @@ -117,6 +128,8 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat private PlaceProviderObject hideAfterAnimation; private boolean disableShowCheck = false; + private int currentEditMode; + private ImageReceiver leftImage = new ImageReceiver(); private ImageReceiver centerImage = new ImageReceiver(); private ImageReceiver rightImage = new ImageReceiver(); @@ -145,8 +158,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat private float animateToX; private float animateToY; private float animateToScale; - private long animationDuration; + private float animationValue; private long animationStartTime; + private AnimatorSetProxy imageMoveAnimation; private GestureDetector gestureDetector; private DecelerateInterpolator interpolator = new DecelerateInterpolator(1.5f); private float pinchStartDistance = 0; @@ -187,7 +201,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat private final static int gallery_menu_save = 1; private final static int gallery_menu_showall = 2; private final static int gallery_menu_send = 3; - private final static int gallery_menu_edit = 4; + private final static int gallery_menu_crop = 4; + private final static int gallery_menu_delete = 6; + private final static int gallery_menu_tune = 7; private final static int PAGE_SPACING = AndroidUtilities.dp(30); @@ -337,6 +353,58 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat public int radius; } + public static class EmptyPhotoViewerProvider implements PhotoViewerProvider { + @Override + public PlaceProviderObject getPlaceForPhoto(MessageObject messageObject, TLRPC.FileLocation fileLocation, int index) { + return null; + } + + @Override + public Bitmap getThumbForPhoto(MessageObject messageObject, TLRPC.FileLocation fileLocation, int index) { + return null; + } + + @Override + public void willSwitchFromPhoto(MessageObject messageObject, TLRPC.FileLocation fileLocation, int index) { + + } + + @Override + public void willHidePhotoViewer() { + + } + + @Override + public boolean isPhotoChecked(int index) { + return false; + } + + @Override + public void setPhotoChecked(int index) { + + } + + @Override + public void cancelButtonPressed() { + + } + + @Override + public void sendButtonPressed(int index) { + + } + + @Override + public int getSelectedCount() { + return 0; + } + + @Override + public void updatePhotoAtIndex(int index) { + + } + } + public static interface PhotoViewerProvider { public PlaceProviderObject getPlaceForPhoto(MessageObject messageObject, TLRPC.FileLocation fileLocation, int index); @@ -355,6 +423,8 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat public void sendButtonPressed(int index); public int getSelectedCount(); + + public void updatePhotoAtIndex(int index); } private class FrameLayoutTouchListener extends FrameLayout { @@ -467,9 +537,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } } if (!avatarsArr.isEmpty()) { - deleteButton.setVisibility(View.VISIBLE); + menuItem.showSubItem(gallery_menu_delete); } else { - deleteButton.setVisibility(View.GONE); + menuItem.hideSubItem(gallery_menu_delete); } needSearchImageInArr = false; currentIndex = -1; @@ -497,7 +567,11 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat loadingMoreImages = true; SharedMediaQuery.loadMedia(currentDialogId, 0, 100, 0, SharedMediaQuery.MEDIA_PHOTOVIDEO, true, classGuid); } else if (!imagesArr.isEmpty()) { - actionBar.setTitle(LocaleController.formatString("Of", R.string.Of, (totalImagesCount - imagesArr.size()) + currentIndex + 1, totalImagesCount)); + if (opennedFromMedia) { + actionBar.setTitle(LocaleController.formatString("Of", R.string.Of, currentIndex + 1, totalImagesCount)); + } else { + actionBar.setTitle(LocaleController.formatString("Of", R.string.Of, (totalImagesCount - imagesArr.size()) + currentIndex + 1, totalImagesCount)); + } } } } else if (id == NotificationCenter.mediaDidLoaded) { @@ -520,11 +594,19 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat int added = 0; for (MessageObject message : arr) { if (!imagesByIdsTemp.containsKey(message.messageOwner.id)) { - added++; - imagesArrTemp.add(0, message); imagesByIdsTemp.put(message.messageOwner.id, message); - if (message.messageOwner.id == currentMessage.messageOwner.id) { - foundIndex = arr.size() - added; + if (opennedFromMedia) { + imagesArrTemp.add(message); + if (message.messageOwner.id == currentMessage.messageOwner.id) { + foundIndex = added; + } + added++; + } else { + added++; + imagesArrTemp.add(0, message); + if (message.messageOwner.id == currentMessage.messageOwner.id) { + foundIndex = arr.size() - added; + } } } } @@ -548,7 +630,11 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } else { if (!cacheEndReached || !arr.isEmpty() && added != 0) { loadingMoreImages = true; - SharedMediaQuery.loadMedia(currentDialogId, 0, 100, imagesArrTemp.get(0).messageOwner.id, SharedMediaQuery.MEDIA_PHOTOVIDEO, true, classGuid); + if (opennedFromMedia) { + SharedMediaQuery.loadMedia(currentDialogId, 0, 100, imagesArrTemp.get(imagesArrTemp.size() - 1).messageOwner.id, SharedMediaQuery.MEDIA_PHOTOVIDEO, true, classGuid); + } else { + SharedMediaQuery.loadMedia(currentDialogId, 0, 100, imagesArrTemp.get(0).messageOwner.id, SharedMediaQuery.MEDIA_PHOTOVIDEO, true, classGuid); + } } } } else { @@ -556,19 +642,29 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat for (MessageObject message : arr) { if (!imagesByIds.containsKey(message.messageOwner.id)) { added++; - imagesArr.add(0, message); + if (opennedFromMedia) { + imagesArr.add(message); + } else { + imagesArr.add(0, message); + } imagesByIds.put(message.messageOwner.id, message); } } if (arr.isEmpty() && !fromCache) { totalImagesCount = arr.size(); } - if (added != 0) { - int index = currentIndex; - currentIndex = -1; - setImageIndex(index + added, true); + if (opennedFromMedia) { + if (added == 0) { + totalImagesCount = imagesArr.size(); + } } else { - totalImagesCount = imagesArr.size(); + if (added != 0) { + int index = currentIndex; + currentIndex = -1; + setImageIndex(index + added, true); + } else { + totalImagesCount = imagesArr.size(); + } } } } @@ -630,7 +726,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat @Override public void onItemClick(int id) { if (id == -1) { - closePhoto(true); + closePhoto(true, false); } else if (id == gallery_menu_save) { File f = null; if (currentMessageObject != null) { @@ -646,14 +742,14 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); builder.setPositiveButton(R.string.OK, null); builder.setMessage(LocaleController.getString("PleaseDownload", R.string.PleaseDownload)); - builder.show().setCanceledOnTouchOutside(true); + showAlertDialog(builder); } } else if (id == gallery_menu_showall) { if (opennedFromMedia) { - closePhoto(true); + closePhoto(true, false); } else if (currentDialogId != 0) { disableShowCheck = true; - closePhoto(false); + closePhoto(false, false); Bundle args2 = new Bundle(); args2.putLong("dialog_id", currentDialogId); ((LaunchActivity) parentActivity).presentFragment(new MediaActivity(args2), false, true); @@ -691,21 +787,94 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } } }*/ - } else if (id == gallery_menu_edit) { - Bundle args = new Bundle(); - Bitmap bitmap = centerImage.getBitmap(); - String key = centerImage.getKey(); - if (bitmap == null) { - args.putString("photoPath", currentPathObject); + } else if (id == gallery_menu_crop) { + switchToEditMode(1); + } else if (id == gallery_menu_tune) { + switchToEditMode(2); + } else if (id == gallery_menu_delete) { + if (parentActivity == null) { + return; } - MediaController.PhotoEntry object = (MediaController.PhotoEntry) imagesArrLocals.get(currentIndex); - args.putInt("id", object.imageId); - args.putBoolean("freeformCrop", true); - args.putBoolean("onlyCrop", true); - PhotoEditorActivity fragment = new PhotoEditorActivity(args, bitmap, key); - fragment.setDelegate((PhotoCropActivity.PhotoEditActivityDelegate) placeProvider); - ((LaunchActivity) parentActivity).presentFragment(fragment, false, true); - closePhoto(false); + AlertDialog.Builder builder = new AlertDialog.Builder(parentActivity); + if (currentFileNames[0] != null && currentFileNames[0].endsWith("mp4")) { + builder.setMessage(LocaleController.formatString("AreYouSureDeleteVideo", R.string.AreYouSureDeleteVideo)); + } else { + builder.setMessage(LocaleController.formatString("AreYouSureDeletePhoto", R.string.AreYouSureDeletePhoto)); + } + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + if (!imagesArr.isEmpty()) { + if (currentIndex < 0 || currentIndex >= imagesArr.size()) { + return; + } + MessageObject obj = imagesArr.get(currentIndex); + if (obj.isSent()) { + ArrayList arr = new ArrayList<>(); + arr.add(obj.messageOwner.id); + + ArrayList random_ids = null; + TLRPC.EncryptedChat encryptedChat = null; + if ((int) obj.getDialogId() == 0 && obj.messageOwner.random_id != 0) { + random_ids = new ArrayList<>(); + random_ids.add(obj.messageOwner.random_id); + encryptedChat = MessagesController.getInstance().getEncryptedChat((int) (obj.getDialogId() >> 32)); + } + + MessagesController.getInstance().deleteMessages(arr, random_ids, encryptedChat); + closePhoto(false, false); + } + } else if (!avatarsArr.isEmpty()) { + if (currentIndex < 0 || currentIndex >= avatarsArr.size()) { + return; + } + TLRPC.Photo photo = avatarsArr.get(currentIndex); + TLRPC.FileLocation currentLocation = imagesArrLocations.get(currentIndex); + if (photo instanceof TLRPC.TL_photoEmpty) { + photo = null; + } + boolean current = false; + if (currentUserAvatarLocation != null) { + if (photo != null) { + for (TLRPC.PhotoSize size : photo.sizes) { + if (size.location.local_id == currentUserAvatarLocation.local_id && size.location.volume_id == currentUserAvatarLocation.volume_id) { + current = true; + break; + } + } + } else if (currentLocation.local_id == currentUserAvatarLocation.local_id && currentLocation.volume_id == currentUserAvatarLocation.volume_id) { + current = true; + } + } + if (current) { + MessagesController.getInstance().deleteUserPhoto(null); + closePhoto(false, false); + } else if (photo != null) { + TLRPC.TL_inputPhoto inputPhoto = new TLRPC.TL_inputPhoto(); + inputPhoto.id = photo.id; + inputPhoto.access_hash = photo.access_hash; + MessagesController.getInstance().deleteUserPhoto(inputPhoto); + MessagesStorage.getInstance().clearUserPhoto(avatarsUserId, photo.id); + imagesArrLocations.remove(currentIndex); + imagesArrLocationsSizes.remove(currentIndex); + avatarsArr.remove(currentIndex); + if (imagesArrLocations.isEmpty()) { + closePhoto(false, false); + } else { + int index = currentIndex; + if (index >= avatarsArr.size()) { + index = avatarsArr.size() - 1; + } + currentIndex = -1; + setImageIndex(index, true); + } + } + } + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); } } @@ -727,12 +896,15 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat }); ActionBarMenu menu = actionBar.createMenu(); + menuItem = menu.addItem(0, R.drawable.ic_ab_other); menuItem.setNeedOffset(false); - menuItem.addSubItem(gallery_menu_save, LocaleController.getString("SaveToGallery", R.string.SaveToGallery), 0); menuItem.addSubItem(gallery_menu_showall, LocaleController.getString("ShowAllMedia", R.string.ShowAllMedia), 0); + menuItem.addSubItem(gallery_menu_save, LocaleController.getString("SaveToGallery", R.string.SaveToGallery), 0); + menuItem.addSubItem(gallery_menu_delete, LocaleController.getString("Delete", R.string.Delete), 0); - editItem = menu.addItemWithWidth(gallery_menu_edit, R.drawable.photo_edit, AndroidUtilities.dp(56)); + cropItem = menu.addItemWithWidth(gallery_menu_crop, R.drawable.photo_crop, AndroidUtilities.dp(56)); + tuneItem = menu.addItemWithWidth(gallery_menu_tune, R.drawable.tune, AndroidUtilities.dp(56)); bottomLayout = new FrameLayout(containerView.getContext()); containerView.addView(bottomLayout); @@ -741,7 +913,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat layoutParams.height = AndroidUtilities.dp(48); layoutParams.gravity = Gravity.BOTTOM | Gravity.LEFT; bottomLayout.setLayoutParams(layoutParams); - bottomLayout.setBackgroundColor(0x7F000000); + bottomLayout.setBackgroundColor(0x7f000000); radialProgressViews[0] = new RadialProgressView(containerView.getContext(), containerView); radialProgressViews[0].setBackgroundState(0, false); @@ -751,13 +923,14 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat radialProgressViews[2].setBackgroundState(0, false); shareButton = new ImageView(containerView.getContext()); - shareButton.setImageResource(R.drawable.ic_ab_share_white); + shareButton.setImageResource(R.drawable.share); shareButton.setScaleType(ImageView.ScaleType.CENTER); shareButton.setBackgroundResource(R.drawable.bar_selector_white); bottomLayout.addView(shareButton); layoutParams = (FrameLayout.LayoutParams) shareButton.getLayoutParams(); layoutParams.width = AndroidUtilities.dp(50); layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.gravity = Gravity.TOP | Gravity.RIGHT; shareButton.setLayoutParams(layoutParams); shareButton.setOnClickListener(new View.OnClickListener() { @Override @@ -783,13 +956,13 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f)); - parentActivity.startActivity(Intent.createChooser(intent, "")); + parentActivity.startActivityForResult(Intent.createChooser(intent, LocaleController.getString("ShareFile", R.string.ShareFile)), 500); } else { AlertDialog.Builder builder = new AlertDialog.Builder(parentActivity); builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); builder.setPositiveButton(R.string.OK, null); builder.setMessage(LocaleController.getString("PleaseDownload", R.string.PleaseDownload)); - builder.show().setCanceledOnTouchOutside(true); + showAlertDialog(builder); } } catch (Exception e) { FileLog.e("tmessages", e); @@ -797,131 +970,56 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } }); - deleteButton = new ImageView(containerView.getContext()); - deleteButton.setImageResource(R.drawable.ic_ab_delete_white); - deleteButton.setScaleType(ImageView.ScaleType.CENTER); - deleteButton.setBackgroundResource(R.drawable.bar_selector_white); - bottomLayout.addView(deleteButton); - layoutParams = (FrameLayout.LayoutParams) deleteButton.getLayoutParams(); - layoutParams.width = AndroidUtilities.dp(50); - layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; - layoutParams.gravity = Gravity.RIGHT; - deleteButton.setLayoutParams(layoutParams); - deleteButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (!imagesArr.isEmpty()) { - if (currentIndex < 0 || currentIndex >= imagesArr.size()) { - return; - } - MessageObject obj = imagesArr.get(currentIndex); - if (obj.isSent()) { - ArrayList arr = new ArrayList<>(); - arr.add(obj.messageOwner.id); - - ArrayList random_ids = null; - TLRPC.EncryptedChat encryptedChat = null; - if ((int) obj.getDialogId() == 0 && obj.messageOwner.random_id != 0) { - random_ids = new ArrayList<>(); - random_ids.add(obj.messageOwner.random_id); - encryptedChat = MessagesController.getInstance().getEncryptedChat((int) (obj.getDialogId() >> 32)); - } - - MessagesController.getInstance().deleteMessages(arr, random_ids, encryptedChat); - closePhoto(false); - } - } else if (!avatarsArr.isEmpty()) { - if (currentIndex < 0 || currentIndex >= avatarsArr.size()) { - return; - } - TLRPC.Photo photo = avatarsArr.get(currentIndex); - TLRPC.FileLocation currentLocation = imagesArrLocations.get(currentIndex); - if (photo instanceof TLRPC.TL_photoEmpty) { - photo = null; - } - boolean current = false; - if (currentUserAvatarLocation != null) { - if (photo != null) { - for (TLRPC.PhotoSize size : photo.sizes) { - if (size.location.local_id == currentUserAvatarLocation.local_id && size.location.volume_id == currentUserAvatarLocation.volume_id) { - current = true; - break; - } - } - } else if (currentLocation.local_id == currentUserAvatarLocation.local_id && currentLocation.volume_id == currentUserAvatarLocation.volume_id) { - current = true; - } - } - if (current) { - MessagesController.getInstance().deleteUserPhoto(null); - closePhoto(false); - } else if (photo != null) { - TLRPC.TL_inputPhoto inputPhoto = new TLRPC.TL_inputPhoto(); - inputPhoto.id = photo.id; - inputPhoto.access_hash = photo.access_hash; - MessagesController.getInstance().deleteUserPhoto(inputPhoto); - MessagesStorage.getInstance().clearUserPhoto(avatarsUserId, photo.id); - imagesArrLocations.remove(currentIndex); - imagesArrLocationsSizes.remove(currentIndex); - avatarsArr.remove(currentIndex); - if (imagesArrLocations.isEmpty()) { - closePhoto(false); - } else { - int index = currentIndex; - if (index >= avatarsArr.size()) { - index = avatarsArr.size() - 1; - } - currentIndex = -1; - setImageIndex(index, true); - } - } - } - } - }); - nameTextView = new TextView(containerView.getContext()); - nameTextView.setTextSize(17); + nameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + nameTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); nameTextView.setSingleLine(true); nameTextView.setMaxLines(1); nameTextView.setEllipsize(TextUtils.TruncateAt.END); nameTextView.setTextColor(0xffffffff); - nameTextView.setGravity(Gravity.CENTER); + nameTextView.setGravity(Gravity.LEFT); bottomLayout.addView(nameTextView); layoutParams = (FrameLayout.LayoutParams) nameTextView.getLayoutParams(); layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.gravity = Gravity.TOP; - layoutParams.leftMargin = AndroidUtilities.dp(60); - layoutParams.rightMargin = AndroidUtilities.dp(60); - layoutParams.topMargin = AndroidUtilities.dp(2); + layoutParams.gravity = Gravity.TOP | Gravity.LEFT; + layoutParams.leftMargin = AndroidUtilities.dp(16); + layoutParams.rightMargin = AndroidUtilities.dp(50); + layoutParams.topMargin = AndroidUtilities.dp(5); nameTextView.setLayoutParams(layoutParams); dateTextView = new TextView(containerView.getContext()); - dateTextView.setTextSize(14); + dateTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); dateTextView.setSingleLine(true); dateTextView.setMaxLines(1); dateTextView.setEllipsize(TextUtils.TruncateAt.END); - dateTextView.setTextColor(0xffb8bdbe); - dateTextView.setGravity(Gravity.CENTER); + dateTextView.setTextColor(0xffffffff); + dateTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + dateTextView.setGravity(Gravity.LEFT); bottomLayout.addView(dateTextView); layoutParams = (FrameLayout.LayoutParams) dateTextView.getLayoutParams(); layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; layoutParams.height = FrameLayout.LayoutParams.WRAP_CONTENT; - layoutParams.gravity = Gravity.TOP; - layoutParams.leftMargin = AndroidUtilities.dp(60); - layoutParams.rightMargin = AndroidUtilities.dp(60); - layoutParams.topMargin = AndroidUtilities.dp(26); + layoutParams.gravity = Gravity.TOP | Gravity.LEFT; + layoutParams.leftMargin = AndroidUtilities.dp(16); + layoutParams.rightMargin = AndroidUtilities.dp(50); + layoutParams.topMargin = AndroidUtilities.dp(25); dateTextView.setLayoutParams(layoutParams); pickerView = new PhotoPickerBottomLayout(parentActivity); pickerView.setBackgroundColor(0x7f000000); containerView.addView(pickerView); + layoutParams = (FrameLayout.LayoutParams) pickerView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = AndroidUtilities.dp(48); + layoutParams.gravity = Gravity.BOTTOM; + pickerView.setLayoutParams(layoutParams); pickerView.cancelButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (placeProvider != null) { placeProvider.cancelButtonPressed(); - closePhoto(false); + closePhoto(false, false); } } }); @@ -930,16 +1028,40 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat public void onClick(View view) { if (placeProvider != null) { placeProvider.sendButtonPressed(currentIndex); - closePhoto(false); + closePhoto(false, false); } } }); - layoutParams = (FrameLayout.LayoutParams) pickerView.getLayoutParams(); + editorDoneLayout = new PhotoPickerBottomLayout(parentActivity); + editorDoneLayout.setBackgroundColor(0x7f000000); + editorDoneLayout.updateSelectedCount(0, false); + editorDoneLayout.setVisibility(View.GONE); + containerView.addView(editorDoneLayout); + layoutParams = (FrameLayout.LayoutParams) editorDoneLayout.getLayoutParams(); layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; layoutParams.height = AndroidUtilities.dp(48); layoutParams.gravity = Gravity.BOTTOM; - pickerView.setLayoutParams(layoutParams); + editorDoneLayout.setLayoutParams(layoutParams); + editorDoneLayout.cancelButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (currentEditMode == 1) { + photoCropView.cancelAnimationRunnable(); + } + switchToEditMode(0); + } + }); + editorDoneLayout.doneButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (currentEditMode == 1) { + photoCropView.cancelAnimationRunnable(); + } + applyCurrentEditMode(); + switchToEditMode(0); + } + }); gestureDetector = new GestureDetector(containerView.getContext(), this); gestureDetector.setOnDoubleTapListener(this); @@ -980,12 +1102,427 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat }); } + private void showAlertDialog(AlertDialog.Builder builder) { + if (parentActivity == null) { + return; + } + try { + if (visibleDialog != null) { + visibleDialog.dismiss(); + visibleDialog = null; + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + try { + visibleDialog = builder.show(); + visibleDialog.setCanceledOnTouchOutside(true); + visibleDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + visibleDialog = null; + } + }); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + + private void applyCurrentEditMode() { + Bitmap bitmap = null; + if (currentEditMode == 1) { + bitmap = photoCropView.getBitmap(); + } else if (currentEditMode == 2) { + bitmap = photoFilterView.getBitmap(); + } + if (bitmap != null) { + TLRPC.PhotoSize size = ImageLoader.scaleAndSaveImage(bitmap, AndroidUtilities.getPhotoSize(), AndroidUtilities.getPhotoSize(), 80, false, 101, 101); + if (size != null) { + Object object = imagesArrLocals.get(currentIndex); + if (object instanceof MediaController.PhotoEntry) { + MediaController.PhotoEntry entry = (MediaController.PhotoEntry) object; + entry.imagePath = FileLoader.getPathToAttach(size, true).toString(); + size = ImageLoader.scaleAndSaveImage(bitmap, AndroidUtilities.dp(120), AndroidUtilities.dp(120), 70, false, 101, 101); + if (size != null) { + entry.thumbPath = FileLoader.getPathToAttach(size, true).toString(); + } + } else if (object instanceof MediaController.SearchImage) { + MediaController.SearchImage entry = (MediaController.SearchImage) object; + entry.imagePath = FileLoader.getPathToAttach(size, true).toString(); + size = ImageLoader.scaleAndSaveImage(bitmap, AndroidUtilities.dp(120), AndroidUtilities.dp(120), 70, false, 101, 101); + if (size != null) { + entry.thumbPath = FileLoader.getPathToAttach(size, true).toString(); + } + } + if (sendPhotoType == 0 && placeProvider != null) { + placeProvider.updatePhotoAtIndex(currentIndex); + if (!placeProvider.isPhotoChecked(currentIndex)) { + placeProvider.setPhotoChecked(currentIndex); + checkImageView.setChecked(placeProvider.isPhotoChecked(currentIndex), true); + updateSelectedCount(); + } + } + if (currentEditMode == 1) { + float scaleX = photoCropView.getRectSizeX() / (float) getContainerViewWidth(); + float scaleY = photoCropView.getRectSizeY() / (float) getContainerViewHeight(); + scale = scaleX > scaleY ? scaleX : scaleY; + translationX = photoCropView.getRectX() + photoCropView.getRectSizeX() / 2 - getContainerViewWidth() / 2; + translationY = photoCropView.getRectY() + photoCropView.getRectSizeY() / 2 - getContainerViewHeight() / 2; + zoomAnimation = true; + } + centerImage.setParentView(null); + centerImage.setOrientation(0, true); + centerImage.setImageBitmap(bitmap); + centerImage.setParentView(containerView); + } + } + } + + private void switchToEditMode(final int mode) { + if (currentEditMode == mode || centerImage.getBitmap() == null || imageMoveAnimation != null || radialProgressViews[0].backgroundState != -1) { + return; + } + if (mode == 0) { + if (currentEditMode == 2) { + if (photoFilterView.getToolsView().getVisibility() != View.VISIBLE) { + photoFilterView.switchToOrFromEditMode(); + return; + } + } + Bitmap bitmap = centerImage.getBitmap(); + if (bitmap != null) { + int bitmapWidth = centerImage.getBitmapWidth(); + int bitmapHeight = centerImage.getBitmapHeight(); + + float scaleX = (float) getContainerViewWidth() / (float) bitmapWidth; + float scaleY = (float) getContainerViewHeight() / (float) bitmapHeight; + float newScaleX = (float) getContainerViewWidth(0) / (float) bitmapWidth; + float newScaleY = (float) getContainerViewHeight(0) / (float) bitmapHeight; + float scale = scaleX > scaleY ? scaleY : scaleX; + float newScale = newScaleX > newScaleY ? newScaleY : newScaleX; + int width = (int) (bitmapWidth * scale); + int height = (int) (bitmapHeight * scale); + + animateToScale = newScale / scale; + animateToX = 0; + if (currentEditMode == 1) { + animateToY = AndroidUtilities.dp(24); + } else if (currentEditMode == 2) { + animateToY = AndroidUtilities.dp(62); + } + animationStartTime = System.currentTimeMillis(); + zoomAnimation = true; + } + + imageMoveAnimation = new AnimatorSetProxy(); + if (currentEditMode == 1) { + imageMoveAnimation.playTogether( + ObjectAnimatorProxy.ofFloat(editorDoneLayout, "translationY", AndroidUtilities.dp(48)), + ObjectAnimatorProxy.ofFloat(PhotoViewer.this, "animationValue", 0, 1), + ObjectAnimatorProxy.ofFloat(photoCropView, "alpha", 0) + ); + } else if (currentEditMode == 2) { + photoFilterView.shutdown(); + imageMoveAnimation.playTogether( + ObjectAnimatorProxy.ofFloat(photoFilterView.getToolsView(), "translationY", AndroidUtilities.dp(126)), + ObjectAnimatorProxy.ofFloat(PhotoViewer.this, "animationValue", 0, 1) + ); + } + imageMoveAnimation.setDuration(200); + imageMoveAnimation.addListener(new AnimatorListenerAdapterProxy() { + @Override + public void onAnimationEnd(Object animation) { + if (currentEditMode == 1) { + photoCropView.clearAnimation(); + editorDoneLayout.clearAnimation(); + editorDoneLayout.setVisibility(View.GONE); + photoCropView.setVisibility(View.GONE); + } else if (currentEditMode == 2) { + photoFilterView.getToolsView().clearAnimation(); + containerView.removeView(photoFilterView); + photoFilterView = null; + } + imageMoveAnimation = null; + currentEditMode = mode; + animateToScale = 1; + animateToX = 0; + animateToY = 0; + scale = 1; + updateMinMax(scale); + containerView.invalidate(); + + AnimatorSetProxy animatorSet = new AnimatorSetProxy(); + ArrayList arrayList = new ArrayList<>(); + arrayList.add(ObjectAnimatorProxy.ofFloat(pickerView, "translationY", 0)); + arrayList.add(ObjectAnimatorProxy.ofFloat(actionBar, "translationY", 0)); + if (sendPhotoType == 0) { + arrayList.add(ObjectAnimatorProxy.ofFloat(checkImageView, "alpha", 1)); + } + animatorSet.playTogether(arrayList); + animatorSet.setDuration(200); + animatorSet.addListener(new AnimatorListenerAdapterProxy() { + @Override + public void onAnimationStart(Object animation) { + pickerView.setVisibility(View.VISIBLE); + actionBar.setVisibility(View.VISIBLE); + if (sendPhotoType == 0) { + checkImageView.setVisibility(View.VISIBLE); + } + } + + @Override + public void onAnimationEnd(Object animation) { + pickerView.clearAnimation(); + actionBar.clearAnimation(); + if (sendPhotoType == 0) { + checkImageView.clearAnimation(); + } + } + }); + animatorSet.start(); + } + }); + imageMoveAnimation.start(); + } else if (mode == 1) { + if (photoCropView == null) { + photoCropView = new PhotoCropView(parentActivity); + photoCropView.setVisibility(View.GONE); + containerView.addView(photoCropView); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) photoCropView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.bottomMargin = AndroidUtilities.dp(48); + photoCropView.setLayoutParams(layoutParams); + photoCropView.setDelegate(new PhotoCropView.PhotoCropViewDelegate() { + @Override + public void needMoveImageTo(float x, float y, float s, boolean animated) { + if (animated) { + animateTo(s, x, y, true); + } else { + translationX = x; + translationY = y; + scale = s; + containerView.invalidate(); + } + } + }); + } + + editorDoneLayout.doneButtonTextView.setText(LocaleController.getString("Crop", R.string.Crop)); + AnimatorSetProxy animatorSet = new AnimatorSetProxy(); + ArrayList arrayList = new ArrayList<>(); + arrayList.add(ObjectAnimatorProxy.ofFloat(pickerView, "translationY", 0, AndroidUtilities.dp(48))); + arrayList.add(ObjectAnimatorProxy.ofFloat(actionBar, "translationY", 0, -actionBar.getHeight())); + if (sendPhotoType == 0) { + arrayList.add(ObjectAnimatorProxy.ofFloat(checkImageView, "alpha", 1, 0)); + } + animatorSet.playTogether(arrayList); + animatorSet.setDuration(200); + animatorSet.addListener(new AnimatorListenerAdapterProxy() { + @Override + public void onAnimationEnd(Object animation) { + pickerView.clearAnimation(); + actionBar.clearAnimation(); + pickerView.setVisibility(View.GONE); + actionBar.setVisibility(View.GONE); + if (sendPhotoType == 0) { + checkImageView.clearAnimation(); + checkImageView.setVisibility(View.GONE); + } + + Bitmap bitmap = centerImage.getBitmap(); + if (bitmap != null) { + photoCropView.setBitmap(bitmap, centerImage.getOrientation(), sendPhotoType != 1); + int bitmapWidth = centerImage.getBitmapWidth(); + int bitmapHeight = centerImage.getBitmapHeight(); + + float scaleX = (float) getContainerViewWidth() / (float) bitmapWidth; + float scaleY = (float) getContainerViewHeight() / (float) bitmapHeight; + float newScaleX = (float) getContainerViewWidth(1) / (float) bitmapWidth; + float newScaleY = (float) getContainerViewHeight(1) / (float) bitmapHeight; + float scale = scaleX > scaleY ? scaleY : scaleX; + float newScale = newScaleX > newScaleY ? newScaleY : newScaleX; + int width = (int) (bitmapWidth * scale); + int height = (int) (bitmapHeight * scale); + + animateToScale = newScale / scale; + animateToX = 0; + animateToY = -AndroidUtilities.dp(24); + animationStartTime = System.currentTimeMillis(); + zoomAnimation = true; + } + + imageMoveAnimation = new AnimatorSetProxy(); + imageMoveAnimation.playTogether( + ObjectAnimatorProxy.ofFloat(editorDoneLayout, "translationY", AndroidUtilities.dp(48), 0), + ObjectAnimatorProxy.ofFloat(PhotoViewer.this, "animationValue", 0, 1), + ObjectAnimatorProxy.ofFloat(photoCropView, "alpha", 0, 1) + ); + imageMoveAnimation.setDuration(200); + imageMoveAnimation.addListener(new AnimatorListenerAdapterProxy() { + @Override + public void onAnimationStart(Object animation) { + editorDoneLayout.setVisibility(View.VISIBLE); + photoCropView.setVisibility(View.VISIBLE); + } + + @Override + public void onAnimationEnd(Object animation) { + imageMoveAnimation = null; + currentEditMode = mode; + animateToScale = 1; + animateToX = 0; + animateToY = 0; + scale = 1; + updateMinMax(scale); + containerView.invalidate(); + editorDoneLayout.clearAnimation(); + photoCropView.clearAnimation(); + } + }); + imageMoveAnimation.start(); + } + }); + animatorSet.start(); + } else if (mode == 2) { + if (photoFilterView == null) { + photoFilterView = new PhotoFilterView(parentActivity, centerImage.getBitmap(), centerImage.getOrientation()); + containerView.addView(photoFilterView); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) photoFilterView.getLayoutParams(); + layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT; + layoutParams.height = FrameLayout.LayoutParams.MATCH_PARENT; + photoFilterView.setLayoutParams(layoutParams); + photoFilterView.getDoneTextView().setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + applyCurrentEditMode(); + switchToEditMode(0); + } + }); + photoFilterView.getCancelTextView().setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (photoFilterView.hasChanges()) { + if (parentActivity == null) { + return; + } + AlertDialog.Builder builder = new AlertDialog.Builder(parentActivity); + builder.setMessage(LocaleController.getString("DiscardChanges", R.string.DiscardChanges)); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + switchToEditMode(0); + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + } else { + switchToEditMode(0); + } + } + }); + //photoFilterView.setEditViewFirst(); + ViewProxy.setTranslationY(photoFilterView.getToolsView(), AndroidUtilities.dp(126)); + } + + AnimatorSetProxy animatorSet = new AnimatorSetProxy(); + ArrayList arrayList = new ArrayList<>(); + arrayList.add(ObjectAnimatorProxy.ofFloat(pickerView, "translationY", 0, AndroidUtilities.dp(48))); + arrayList.add(ObjectAnimatorProxy.ofFloat(actionBar, "translationY", 0, -actionBar.getHeight())); + if (sendPhotoType == 0) { + arrayList.add(ObjectAnimatorProxy.ofFloat(checkImageView, "alpha", 1, 0)); + } + animatorSet.playTogether(arrayList); + animatorSet.setDuration(200); + animatorSet.addListener(new AnimatorListenerAdapterProxy() { + @Override + public void onAnimationEnd(Object animation) { + pickerView.clearAnimation(); + actionBar.clearAnimation(); + pickerView.setVisibility(View.GONE); + actionBar.setVisibility(View.GONE); + if (sendPhotoType == 0) { + checkImageView.clearAnimation(); + checkImageView.setVisibility(View.GONE); + } + + Bitmap bitmap = centerImage.getBitmap(); + if (bitmap != null) { + int bitmapWidth = centerImage.getBitmapWidth(); + int bitmapHeight = centerImage.getBitmapHeight(); + + float scaleX = (float) getContainerViewWidth() / (float) bitmapWidth; + float scaleY = (float) getContainerViewHeight() / (float) bitmapHeight; + float newScaleX = (float) getContainerViewWidth(2) / (float) bitmapWidth; + float newScaleY = (float) getContainerViewHeight(2) / (float) bitmapHeight; + float scale = scaleX > scaleY ? scaleY : scaleX; + float newScale = newScaleX > newScaleY ? newScaleY : newScaleX; + int width = (int) (bitmapWidth * scale); + int height = (int) (bitmapHeight * scale); + + animateToScale = newScale / scale; + animateToX = 0; + animateToY = -AndroidUtilities.dp(62); + animationStartTime = System.currentTimeMillis(); + zoomAnimation = true; + } + + imageMoveAnimation = new AnimatorSetProxy(); + imageMoveAnimation.playTogether( + ObjectAnimatorProxy.ofFloat(PhotoViewer.this, "animationValue", 0, 1), + ObjectAnimatorProxy.ofFloat(photoFilterView.getToolsView(), "translationY", AndroidUtilities.dp(126), 0) + ); + imageMoveAnimation.setDuration(200); + imageMoveAnimation.addListener(new AnimatorListenerAdapterProxy() { + @Override + public void onAnimationStart(Object animation) { + + } + + @Override + public void onAnimationEnd(Object animation) { + photoFilterView.init(); + imageMoveAnimation = null; + currentEditMode = mode; + animateToScale = 1; + animateToX = 0; + animateToY = 0; + scale = 1; + updateMinMax(scale); + containerView.invalidate(); + photoFilterView.getToolsView().clearAnimation(); + } + }); + imageMoveAnimation.start(); + } + }); + animatorSet.start(); + } + /*Bundle args = new Bundle(); + Bitmap bitmap = centerImage.getBitmap(); + String key = centerImage.getKey(); + if (bitmap == null) { + args.putString("photoPath", currentPathObject); + } + MediaController.PhotoEntry object = + args.putInt("id", object.imageId); + args.putBoolean("freeformCrop", true); + args.putBoolean("onlyCrop", true); + PhotoEditorActivity fragment = new PhotoEditorActivity(args, bitmap, key); + fragment.setDelegate((PhotoCropActivity.PhotoEditActivityDelegate) placeProvider); + ((LaunchActivity) parentActivity).presentFragment(fragment, false, true); + closePhoto(false);*/ + } + private void toggleCheckImageView(boolean show) { AnimatorSetProxy animatorSet = new AnimatorSetProxy(); - animatorSet.playTogether( - ObjectAnimatorProxy.ofFloat(checkImageView, "alpha", show ? 1.0f : 0.0f), - ObjectAnimatorProxy.ofFloat(pickerView, "alpha", show ? 1.0f : 0.0f) - ); + ArrayList arrayList = new ArrayList<>(); + arrayList.add(ObjectAnimatorProxy.ofFloat(pickerView, "alpha", show ? 1.0f : 0.0f)); + if (sendPhotoType == 0) { + arrayList.add(ObjectAnimatorProxy.ofFloat(checkImageView, "alpha", show ? 1.0f : 0.0f)); + } + animatorSet.playTogether(arrayList); animatorSet.setDuration(200); animatorSet.start(); } @@ -1014,6 +1551,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat if (currentActionBarAnimation.equals(animation)) { actionBar.setVisibility(View.GONE); if (canShowBottom) { + bottomLayout.clearAnimation(); bottomLayout.setVisibility(View.GONE); } currentActionBarAnimation = null; @@ -1030,6 +1568,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat if (!show) { actionBar.setVisibility(View.GONE); if (canShowBottom) { + bottomLayout.clearAnimation(); bottomLayout.setVisibility(View.GONE); } } @@ -1211,6 +1750,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat avatarsUserId = 0; currentDialogId = 0; totalImagesCount = 0; + currentEditMode = 0; isFirstLoading = true; needSearchImageInArr = false; loadingMoreImages = false; @@ -1226,16 +1766,32 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat imagesArrTemp.clear(); imagesByIdsTemp.clear(); currentUserAvatarLocation = null; - currentThumb = object.thumb; + currentThumb = object != null ? object.thumb : null; menuItem.setVisibility(View.VISIBLE); bottomLayout.setVisibility(View.VISIBLE); + shareButton.setVisibility(View.GONE); + menuItem.hideSubItem(gallery_menu_showall); + ViewProxy.setTranslationY(actionBar, 0); + ViewProxy.setTranslationY(pickerView, 0); ViewProxy.setAlpha(checkImageView, 1.0f); ViewProxy.setAlpha(pickerView, 1.0f); checkImageView.clearAnimation(); pickerView.clearAnimation(); + editorDoneLayout.clearAnimation(); checkImageView.setVisibility(View.GONE); pickerView.setVisibility(View.GONE); - editItem.setVisibility(View.GONE); + cropItem.setVisibility(View.GONE); + tuneItem.setVisibility(View.GONE); + editorDoneLayout.setVisibility(View.GONE); + if (photoCropView != null) { + photoCropView.clearAnimation(); + photoCropView.setVisibility(View.GONE); + } + if (photoFilterView != null) { + photoFilterView.clearAnimation(); + photoFilterView.setVisibility(View.GONE); + } + for (int a = 0; a < 3; a++) { if (radialProgressViews[a] != null) { radialProgressViews[a].setBackgroundState(-1, false); @@ -1270,24 +1826,29 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat imagesArrLocations.add(fileLocation); imagesArrLocationsSizes.add(object.size); avatarsArr.add(new TLRPC.TL_photoEmpty()); + bottomLayout.clearAnimation(); bottomLayout.setVisibility(View.GONE); shareButton.setVisibility(View.VISIBLE); menuItem.hideSubItem(gallery_menu_showall); setImageIndex(0, true); currentUserAvatarLocation = fileLocation; } else if (messages != null) { + menuItem.showSubItem(gallery_menu_showall); + opennedFromMedia = true; imagesArr.addAll(messages); - Collections.reverse(imagesArr); + if (!opennedFromMedia) { + Collections.reverse(imagesArr); + index = imagesArr.size() - index - 1; + } for (MessageObject message : imagesArr) { imagesByIds.put(message.messageOwner.id, message); } - index = imagesArr.size() - index - 1; if (messageObject.messageOwner.dialog_id != 0) { currentDialogId = messageObject.messageOwner.dialog_id; } else { if (messageObject.messageOwner.to_id == null) { - closePhoto(false); + closePhoto(false, false); return; } if (messageObject.messageOwner.to_id.chat_id != 0) { @@ -1300,18 +1861,23 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } } } - opennedFromMedia = true; setImageIndex(index, true); } else if (photos != null) { - checkImageView.setVisibility(View.VISIBLE); + if (sendPhotoType == 0) { + checkImageView.setVisibility(View.VISIBLE); + } menuItem.setVisibility(View.GONE); imagesArrLocals.addAll(photos); setImageIndex(index, true); pickerView.setVisibility(View.VISIBLE); + bottomLayout.clearAnimation(); bottomLayout.setVisibility(View.GONE); - shareButton.setVisibility(View.VISIBLE); canShowBottom = false; - //editItem.setVisibility(imagesArrLocals.get(index) instanceof MediaController.PhotoEntry ? View.VISIBLE : View.GONE); + Object obj = imagesArrLocals.get(index); + cropItem.setVisibility(obj instanceof MediaController.PhotoEntry || obj instanceof MediaController.SearchImage && ((MediaController.SearchImage) obj).type == 0 ? View.VISIBLE : View.GONE); + if (Build.VERSION.SDK_INT >= 14) { + tuneItem.setVisibility(cropItem.getVisibility()); + } updateSelectedCount(); } @@ -1347,9 +1913,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat boolean sameImage = false; if (!imagesArr.isEmpty()) { - deleteButton.setVisibility(View.VISIBLE); + menuItem.showSubItem(gallery_menu_delete); if (currentIndex < 0 || currentIndex >= imagesArr.size()) { - closePhoto(false); + closePhoto(false, false); return; } currentMessageObject = imagesArr.get(currentIndex); @@ -1359,19 +1925,30 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } else { nameTextView.setText(""); } + long date = (long) currentMessageObject.messageOwner.date * 1000; + String dateString = LocaleController.formatString("formatDateAtTime", R.string.formatDateAtTime, LocaleController.formatterYear.format(new Date(date)), LocaleController.formatterDay.format(new Date(date))); if (currentFileNames[0] != null && currentFileNames[0].endsWith("mp4")) { - dateTextView.setText(String.format("%s (%s)", LocaleController.formatterYearMax.format(((long) currentMessageObject.messageOwner.date) * 1000), Utilities.formatFileSize(currentMessageObject.messageOwner.media.video.size))); + dateTextView.setText(String.format("%s (%s)", dateString, Utilities.formatFileSize(currentMessageObject.messageOwner.media.video.size))); } else { - dateTextView.setText(LocaleController.formatterYearMax.format(((long) currentMessageObject.messageOwner.date) * 1000)); + dateTextView.setText(dateString); } if (totalImagesCount != 0 && !needSearchImageInArr) { - if (imagesArr.size() < totalImagesCount && !loadingMoreImages && currentIndex < 5) { - MessageObject lastMessage = imagesArr.get(0); - SharedMediaQuery.loadMedia(currentDialogId, 0, 100, lastMessage.messageOwner.id, SharedMediaQuery.MEDIA_PHOTOVIDEO, !cacheEndReached, classGuid); - loadingMoreImages = true; + if (opennedFromMedia) { + if (imagesArr.size() < totalImagesCount && !loadingMoreImages && currentIndex > imagesArr.size() - 5) { + MessageObject lastMessage = imagesArr.get(imagesArr.size() - 1); + SharedMediaQuery.loadMedia(currentDialogId, 0, 100, lastMessage.messageOwner.id, SharedMediaQuery.MEDIA_PHOTOVIDEO, !cacheEndReached, classGuid); + loadingMoreImages = true; + } + actionBar.setTitle(LocaleController.formatString("Of", R.string.Of, currentIndex + 1, totalImagesCount)); + } else { + if (imagesArr.size() < totalImagesCount && !loadingMoreImages && currentIndex < 5) { + MessageObject lastMessage = imagesArr.get(0); + SharedMediaQuery.loadMedia(currentDialogId, 0, 100, lastMessage.messageOwner.id, SharedMediaQuery.MEDIA_PHOTOVIDEO, !cacheEndReached, classGuid); + loadingMoreImages = true; + } + actionBar.setTitle(LocaleController.formatString("Of", R.string.Of, (totalImagesCount - imagesArr.size()) + currentIndex + 1, totalImagesCount)); } - actionBar.setTitle(LocaleController.formatString("Of", R.string.Of, (totalImagesCount - imagesArr.size()) + currentIndex + 1, totalImagesCount)); } if (currentMessageObject.messageOwner.ttl != 0) { menuItem.hideSubItem(gallery_menu_save); @@ -1384,13 +1961,13 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat nameTextView.setText(""); dateTextView.setText(""); if (avatarsUserId == UserConfig.getClientUserId() && !avatarsArr.isEmpty()) { - deleteButton.setVisibility(View.VISIBLE); + menuItem.showSubItem(gallery_menu_delete); } else { - deleteButton.setVisibility(View.GONE); + menuItem.hideSubItem(gallery_menu_delete); } TLRPC.FileLocation old = currentFileLocation; if (index < 0 || index >= imagesArrLocations.size()) { - closePhoto(false); + closePhoto(false, false); return; } currentFileLocation = imagesArrLocations.get(index); @@ -1403,16 +1980,24 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } else if (!imagesArrLocals.isEmpty()) { Object object = imagesArrLocals.get(index); if (index < 0 || index >= imagesArrLocals.size()) { - closePhoto(false); + closePhoto(false, false); return; } + boolean fromCamera = false; if (object instanceof MediaController.PhotoEntry) { currentPathObject = ((MediaController.PhotoEntry) object).path; + fromCamera = ((MediaController.PhotoEntry) object).bucketId == 0 && ((MediaController.PhotoEntry) object).dateTaken == 0 && imagesArrLocals.size() == 1; } else if (object instanceof MediaController.SearchImage) { currentPathObject = ((MediaController.SearchImage) object).imageUrl; } - actionBar.setTitle(LocaleController.formatString("Of", R.string.Of, currentIndex + 1, imagesArrLocals.size())); - checkImageView.setChecked(placeProvider.isPhotoChecked(currentIndex), false); + if (fromCamera) { + actionBar.setTitle(LocaleController.getString("AttachPhoto", R.string.AttachPhoto)); + } else { + actionBar.setTitle(LocaleController.formatString("Of", R.string.Of, currentIndex + 1, imagesArrLocals.size())); + } + if (sendPhotoType == 0) { + checkImageView.setChecked(placeProvider.isPhotoChecked(currentIndex), false); + } } @@ -1440,8 +2025,8 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat animateToX = 0; animateToY = 0; animateToScale = 1; - animationDuration = 0; animationStartTime = 0; + imageMoveAnimation = null; pinchStartDistance = 0; pinchStartScale = 1; @@ -1586,6 +2171,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } private void setIndexToImage(ImageReceiver imageReceiver, int index) { + imageReceiver.setOrientation(0, false); if (!imagesArrLocals.isEmpty()) { imageReceiver.setParentMessageObject(null); if (index >= 0 && index < imagesArrLocals.size()) { @@ -1601,10 +2187,21 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat String path = null; int imageSize = 0; if (object instanceof MediaController.PhotoEntry) { - path = ((MediaController.PhotoEntry) object).path; + MediaController.PhotoEntry photoEntry = (MediaController.PhotoEntry) object; + if (photoEntry.imagePath != null) { + path = photoEntry.imagePath; + } else { + imageReceiver.setOrientation(photoEntry.orientation, false); + path = photoEntry.path; + } } else if (object instanceof MediaController.SearchImage) { - path = ((MediaController.SearchImage) object).imageUrl; - imageSize = ((MediaController.SearchImage) object).size; + MediaController.SearchImage photoEntry = (MediaController.SearchImage) object; + if (photoEntry.imagePath != null) { + path = photoEntry.imagePath; + } else { + path = photoEntry.imageUrl; + imageSize = ((MediaController.SearchImage) object).size; + } } imageReceiver.setImage(path, String.format(Locale.US, "%d_%d", size, size), placeHolder != null ? new BitmapDrawable(null, placeHolder) : null, imageSize); } else { @@ -1684,7 +2281,11 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat openPhoto(messages.get(index), null, messages, null, index, provider); } - public void openPhotoForSelect(final ArrayList photos, final int index, final PhotoViewerProvider provider) { + public void openPhotoForSelect(final ArrayList photos, final int index, int type, final PhotoViewerProvider provider) { + sendPhotoType = type; + if (pickerView != null) { + pickerView.doneButtonTextView.setText(sendPhotoType == 1 ? LocaleController.getString("Set", R.string.Set).toUpperCase() : LocaleController.getString("Send", R.string.Send).toUpperCase()); + } openPhoto(null, null, null, photos, index, provider); } @@ -1702,11 +2303,12 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } public void openPhoto(final MessageObject messageObject, final TLRPC.FileLocation fileLocation, final ArrayList messages, final ArrayList photos, final int index, final PhotoViewerProvider provider) { - if (parentActivity == null || isVisible || provider == null || checkAnimation() || messageObject == null && fileLocation == null && messages == null && photos == null) { + if (parentActivity == null || isVisible || provider == null && checkAnimation() || messageObject == null && fileLocation == null && messages == null && photos == null) { return; } + final PlaceProviderObject object = provider.getPlaceForPhoto(messageObject, fileLocation, index); - if (object == null) { + if (object == null && photos == null) { return; } @@ -1719,7 +2321,6 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat FileLog.e("tmessages", e); } - WindowManager wm = (WindowManager) parentActivity.getSystemService(Context.WINDOW_SERVICE); try { wm.addView(windowView, windowLayoutParams); @@ -1742,126 +2343,162 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat velocityTracker = VelocityTracker.obtain(); } - disableShowCheck = true; - animationInProgress = 1; - onPhotoShow(messageObject, fileLocation, messages, photos, index, object); isVisible = true; backgroundDrawable.setAlpha(255); toggleActionBar(true, false); - AndroidUtilities.lockOrientation(parentActivity); + if (object != null) { + disableShowCheck = true; + animationInProgress = 1; + onPhotoShow(messageObject, fileLocation, messages, photos, index, object); - final Rect drawRegion = object.imageReceiver.getDrawRegion(); + AndroidUtilities.lockOrientation(parentActivity); - animatingImageView.setVisibility(View.VISIBLE); - animatingImageView.setRadius(object.radius); - animatingImageView.setNeedRadius(object.radius != 0); - animatingImageView.setImageBitmap(object.thumb); + final Rect drawRegion = object.imageReceiver.getDrawRegion(); + int orientation = object.imageReceiver.getOrientation(); - ViewProxy.setAlpha(animatingImageView, 1.0f); - ViewProxy.setPivotX(animatingImageView, 0.0f); - ViewProxy.setPivotY(animatingImageView, 0.0f); - ViewProxy.setScaleX(animatingImageView, 1.0f); - ViewProxy.setScaleY(animatingImageView, 1.0f); - ViewProxy.setTranslationX(animatingImageView, object.viewX + drawRegion.left); - ViewProxy.setTranslationY(animatingImageView, object.viewY + drawRegion.top); - final ViewGroup.LayoutParams layoutParams = animatingImageView.getLayoutParams(); - layoutParams.width = drawRegion.right - drawRegion.left; - layoutParams.height = drawRegion.bottom - drawRegion.top; - animatingImageView.setLayoutParams(layoutParams); + animatingImageView.setVisibility(View.VISIBLE); + animatingImageView.setRadius(object.radius); + animatingImageView.setOrientation(orientation); + animatingImageView.setNeedRadius(object.radius != 0); + animatingImageView.setImageBitmap(object.thumb); - containerView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { - @Override - public boolean onPreDraw() { - containerView.getViewTreeObserver().removeOnPreDrawListener(this); + ViewProxy.setAlpha(animatingImageView, 1.0f); + ViewProxy.setPivotX(animatingImageView, 0.0f); + ViewProxy.setPivotY(animatingImageView, 0.0f); + ViewProxy.setScaleX(animatingImageView, 1.0f); + ViewProxy.setScaleY(animatingImageView, 1.0f); + ViewProxy.setTranslationX(animatingImageView, object.viewX + drawRegion.left); + ViewProxy.setTranslationY(animatingImageView, object.viewY + drawRegion.top); + final ViewGroup.LayoutParams layoutParams = animatingImageView.getLayoutParams(); + layoutParams.width = drawRegion.right - drawRegion.left; + layoutParams.height = drawRegion.bottom - drawRegion.top; + animatingImageView.setLayoutParams(layoutParams); - float scaleX = (float) AndroidUtilities.displaySize.x / layoutParams.width; - float scaleY = (float) (AndroidUtilities.displaySize.y - AndroidUtilities.statusBarHeight) / layoutParams.height; - float scale = scaleX > scaleY ? scaleY : scaleX; - float width = layoutParams.width * scale; - float height = layoutParams.height * scale; - float xPos = (AndroidUtilities.displaySize.x - width) / 2.0f; - float yPos = (AndroidUtilities.displaySize.y - AndroidUtilities.statusBarHeight - height) / 2.0f; - int clipHorizontal = Math.abs(drawRegion.left - object.imageReceiver.getImageX()); - int clipVertical = Math.abs(drawRegion.top - object.imageReceiver.getImageY()); + containerView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + containerView.getViewTreeObserver().removeOnPreDrawListener(this); - int coords2[] = new int[2]; - object.parentView.getLocationInWindow(coords2); - int clipTop = coords2[1] - AndroidUtilities.statusBarHeight - (object.viewY + drawRegion.top); - if (clipTop < 0) { - clipTop = 0; + float scaleX = (float) AndroidUtilities.displaySize.x / layoutParams.width; + float scaleY = (float) (AndroidUtilities.displaySize.y - AndroidUtilities.statusBarHeight) / layoutParams.height; + float scale = scaleX > scaleY ? scaleY : scaleX; + float width = layoutParams.width * scale; + float height = layoutParams.height * scale; + float xPos = (AndroidUtilities.displaySize.x - width) / 2.0f; + float yPos = (AndroidUtilities.displaySize.y - AndroidUtilities.statusBarHeight - height) / 2.0f; + int clipHorizontal = Math.abs(drawRegion.left - object.imageReceiver.getImageX()); + int clipVertical = Math.abs(drawRegion.top - object.imageReceiver.getImageY()); + + int coords2[] = new int[2]; + object.parentView.getLocationInWindow(coords2); + int clipTop = coords2[1] - AndroidUtilities.statusBarHeight - (object.viewY + drawRegion.top); + if (clipTop < 0) { + clipTop = 0; + } + int clipBottom = (object.viewY + drawRegion.top + layoutParams.height) - (coords2[1] + object.parentView.getHeight() - AndroidUtilities.statusBarHeight); + if (clipBottom < 0) { + clipBottom = 0; + } + clipTop = Math.max(clipTop, clipVertical); + clipBottom = Math.max(clipBottom, clipVertical); + + AnimatorSetProxy animatorSet = new AnimatorSetProxy(); + animatorSet.playTogether( + ObjectAnimatorProxy.ofFloat(animatingImageView, "scaleX", scale), + ObjectAnimatorProxy.ofFloat(animatingImageView, "scaleY", scale), + ObjectAnimatorProxy.ofFloat(animatingImageView, "translationX", xPos), + ObjectAnimatorProxy.ofFloat(animatingImageView, "translationY", yPos), + ObjectAnimatorProxy.ofInt(backgroundDrawable, "alpha", 0, 255), + ObjectAnimatorProxy.ofInt(animatingImageView, "clipHorizontal", clipHorizontal, 0), + ObjectAnimatorProxy.ofInt(animatingImageView, "clipTop", clipTop, 0), + ObjectAnimatorProxy.ofInt(animatingImageView, "clipBottom", clipBottom, 0), + ObjectAnimatorProxy.ofInt(animatingImageView, "radius", 0), + ObjectAnimatorProxy.ofFloat(containerView, "alpha", 0.0f, 1.0f) + ); + + animationEndRunnable = new Runnable() { + @Override + public void run() { + animationInProgress = 0; + setImages(); + transitionAnimationStartTime = 0; + containerView.invalidate(); + animatingImageView.setVisibility(View.GONE); + AndroidUtilities.unlockOrientation(parentActivity); + if (showAfterAnimation != null) { + showAfterAnimation.imageReceiver.setVisible(true, true); + } + if (hideAfterAnimation != null) { + hideAfterAnimation.imageReceiver.setVisible(false, true); + } + } + }; + + animatorSet.setDuration(200); + animatorSet.addListener(new AnimatorListenerAdapterProxy() { + @Override + public void onAnimationEnd(Object animation) { + if (animationEndRunnable != null) { + animationEndRunnable.run(); + animationEndRunnable = null; + } + } + + @Override + public void onAnimationCancel(Object animation) { + onAnimationEnd(animation); + } + }); + transitionAnimationStartTime = System.currentTimeMillis(); + animatorSet.start(); + + animatingImageView.setOnDrawListener(new ClippingImageView.onDrawListener() { + @Override + public void onDraw() { + disableShowCheck = false; + animatingImageView.setOnDrawListener(null); + object.imageReceiver.setVisible(false, true); + } + }); + return true; } - int clipBottom = (object.viewY + drawRegion.top + layoutParams.height) - (coords2[1] + object.parentView.getHeight() - AndroidUtilities.statusBarHeight); - if (clipBottom < 0) { - clipBottom = 0; - } - clipTop = Math.max(clipTop, clipVertical); - clipBottom = Math.max(clipBottom, clipVertical); - - AnimatorSetProxy animatorSet = new AnimatorSetProxy(); - animatorSet.playTogether( - ObjectAnimatorProxy.ofFloat(animatingImageView, "scaleX", scale), - ObjectAnimatorProxy.ofFloat(animatingImageView, "scaleY", scale), - ObjectAnimatorProxy.ofFloat(animatingImageView, "translationX", xPos), - ObjectAnimatorProxy.ofFloat(animatingImageView, "translationY", yPos), - ObjectAnimatorProxy.ofInt(backgroundDrawable, "alpha", 0, 255), - ObjectAnimatorProxy.ofInt(animatingImageView, "clipHorizontal", clipHorizontal, 0), - ObjectAnimatorProxy.ofInt(animatingImageView, "clipTop", clipTop, 0), - ObjectAnimatorProxy.ofInt(animatingImageView, "clipBottom", clipBottom, 0), - ObjectAnimatorProxy.ofInt(animatingImageView, "radius", 0), - ObjectAnimatorProxy.ofFloat(containerView, "alpha", 0.0f, 1.0f) - ); - - animationEndRunnable = new Runnable() { - @Override - public void run() { - animationInProgress = 0; - setImages(); - transitionAnimationStartTime = 0; - containerView.invalidate(); - animatingImageView.setVisibility(View.GONE); - AndroidUtilities.unlockOrientation(parentActivity); - if (showAfterAnimation != null) { - showAfterAnimation.imageReceiver.setVisible(true, true); - } - if (hideAfterAnimation != null) { - hideAfterAnimation.imageReceiver.setVisible(false, true); - } - } - }; - - animatorSet.setDuration(200); - animatorSet.addListener(new AnimatorListenerAdapterProxy() { - @Override - public void onAnimationEnd(Object animation) { - if (animationEndRunnable != null) { - animationEndRunnable.run(); - animationEndRunnable = null; - } - } - - @Override - public void onAnimationCancel(Object animation) { - onAnimationEnd(animation); - } - }); - transitionAnimationStartTime = System.currentTimeMillis(); - animatorSet.start(); - - animatingImageView.setOnDrawListener(new ClippingImageView.onDrawListener() { - @Override - public void onDraw() { - disableShowCheck = false; - animatingImageView.setOnDrawListener(null); - object.imageReceiver.setVisible(false, true); - } - }); - return true; - } - }); + }); + } else { + ViewProxy.setAlpha(containerView, 1.0f); + onPhotoShow(messageObject, fileLocation, messages, photos, index, object); + } } - public void closePhoto(boolean animated) { + public void closePhoto(boolean animated, boolean fromEditMode) { + if (!fromEditMode && currentEditMode != 0) { + if (currentEditMode == 1) { + photoCropView.cancelAnimationRunnable(); + } + switchToEditMode(0); + return; + } + try { + if (visibleDialog != null) { + visibleDialog.dismiss(); + visibleDialog = null; + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + + if (currentEditMode != 0) { + if (currentEditMode == 2) { + photoFilterView.shutdown(); + containerView.removeView(photoFilterView); + photoFilterView = null; + } else if (currentEditMode == 1) { + editorDoneLayout.setVisibility(View.GONE); + photoCropView.setVisibility(View.GONE); + } + currentEditMode = 0; + } + if (parentActivity == null || !isVisible || checkAnimation() || placeProvider == null) { return; } @@ -1896,6 +2533,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat final ViewGroup.LayoutParams layoutParams = animatingImageView.getLayoutParams(); Rect drawRegion = null; + animatingImageView.setOrientation(centerImage.getOrientation()); if (object != null) { animatingImageView.setNeedRadius(object.radius != 0); drawRegion = object.imageReceiver.getDrawRegion(); @@ -2086,8 +2724,8 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } private void updateMinMax(float scale) { - int maxW = (int) (centerImage.getImageWidth() * scale - containerView.getWidth()) / 2; - int maxH = (int) (centerImage.getImageHeight() * scale - containerView.getHeight()) / 2; + int maxW = (int) (centerImage.getImageWidth() * scale - getContainerViewWidth()) / 2; + int maxH = (int) (centerImage.getImageHeight() * scale - getContainerViewHeight()) / 2; if (maxW > 0) { minX = -maxW; maxX = maxW; @@ -2100,6 +2738,52 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } else { minY = maxY = 0; } + if (currentEditMode == 1) { + maxX += photoCropView.getLimitX(); + maxY += photoCropView.getLimitY(); + minX -= photoCropView.getLimitWidth(); + minY -= photoCropView.getLimitHeight(); + } + } + + private int getAdditionX() { + if (currentEditMode != 0) { + return AndroidUtilities.dp(14); + } + return 0; + } + + private int getAdditionY() { + if (currentEditMode != 0) { + return AndroidUtilities.dp(14); + } + return 0; + } + + private int getContainerViewWidth() { + return getContainerViewWidth(currentEditMode); + } + + private int getContainerViewWidth(int mode) { + int width = containerView.getWidth(); + if (mode != 0) { + width -= AndroidUtilities.dp(28); + } + return width; + } + + private int getContainerViewHeight() { + return getContainerViewHeight(currentEditMode); + } + + private int getContainerViewHeight(int mode) { + int height = containerView.getHeight(); + if (mode == 1) { + height -= AndroidUtilities.dp(76); + } else if (mode == 2) { + height -= AndroidUtilities.dp(154); + } + return height; } private boolean onTouchEvent(MotionEvent ev) { @@ -2110,7 +2794,23 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat return false; } - if (ev.getPointerCount() == 1 && gestureDetector.onTouchEvent(ev)) { + if (currentEditMode == 2) { + photoFilterView.onTouch(ev); + return true; + } + + if (currentEditMode == 1) { + if (ev.getPointerCount() == 1) { + if (photoCropView.onTouch(ev)) { + updateMinMax(scale); + return true; + } + } else { + photoCropView.onTouch(null); + } + } + + if (currentEditMode == 0 && ev.getPointerCount() == 1 && gestureDetector.onTouchEvent(ev)) { if (doubleTap) { doubleTap = false; moving = false; @@ -2121,6 +2821,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } if (ev.getActionMasked() == MotionEvent.ACTION_DOWN || ev.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN) { + if (currentEditMode == 1) { + photoCropView.cancelAnimationRunnable(); + } discardTap = false; if (!scroller.isFinished()) { scroller.abortAnimation(); @@ -2150,11 +2853,14 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } } } else if (ev.getActionMasked() == MotionEvent.ACTION_MOVE) { + if (currentEditMode == 1) { + photoCropView.cancelAnimationRunnable(); + } if (canZoom && ev.getPointerCount() == 2 && !draggingDown && zooming && !changingPage) { discardTap = true; scale = (float) Math.hypot(ev.getX(1) - ev.getX(0), ev.getY(1) - ev.getY(0)) / pinchStartDistance * pinchStartScale; - translationX = (pinchCenterX - containerView.getWidth() / 2) - ((pinchCenterX - containerView.getWidth() / 2) - pinchStartX) * (scale / pinchStartScale); - translationY = (pinchCenterY - containerView.getHeight() / 2) - ((pinchCenterY - containerView.getHeight() / 2) - pinchStartY) * (scale / pinchStartScale); + translationX = (pinchCenterX - getContainerViewWidth() / 2) - ((pinchCenterX - getContainerViewWidth() / 2) - pinchStartX) * (scale / pinchStartScale); + translationY = (pinchCenterY - getContainerViewHeight() / 2) - ((pinchCenterY - getContainerViewHeight() / 2) - pinchStartY) * (scale / pinchStartScale); updateMinMax(scale); containerView.invalidate(); } else if (ev.getPointerCount() == 1) { @@ -2166,13 +2872,13 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat if (dx > AndroidUtilities.dp(3) || dy > AndroidUtilities.dp(3)) { discardTap = true; } - if (canDragDown && !draggingDown && scale == 1 && dy >= AndroidUtilities.dp(30) && dy / 2 > dx) { + if (!(placeProvider instanceof EmptyPhotoViewerProvider) && currentEditMode == 0 && canDragDown && !draggingDown && scale == 1 && dy >= AndroidUtilities.dp(30) && dy / 2 > dx) { draggingDown = true; moving = false; dragY = ev.getY(); if (isActionBarVisible && canShowBottom) { toggleActionBar(false, true); - } else if (checkImageView.getVisibility() == View.VISIBLE) { + } else if (pickerView.getVisibility() == View.VISIBLE) { toggleActionBar(false, true); toggleCheckImageView(false); } @@ -2183,7 +2889,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } else if (!invalidCoords && animationStartTime == 0) { float moveDx = moveStartX - ev.getX(); float moveDy = moveStartY - ev.getY(); - if (moving || scale == 1 && Math.abs(moveDy) + AndroidUtilities.dp(12) < Math.abs(moveDx) || scale != 1) { + if (moving || currentEditMode != 0 || scale == 1 && Math.abs(moveDy) + AndroidUtilities.dp(12) < Math.abs(moveDx) || scale != 1) { if (!moving) { moveDx = 0; moveDy = 0; @@ -2194,10 +2900,10 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat moveStartX = ev.getX(); moveStartY = ev.getY(); updateMinMax(scale); - if (translationX < minX && !rightImage.hasImage() || translationX > maxX && !leftImage.hasImage()) { + if (translationX < minX && (currentEditMode != 0 || !rightImage.hasImage()) || translationX > maxX && (currentEditMode != 0 || !leftImage.hasImage())) { moveDx /= 3.0f; } - if (maxY == 0 && minY == 0) { + if (maxY == 0 && minY == 0 && currentEditMode == 0) { if (translationY - moveDy < minY) { translationY = minY; moveDy = 0; @@ -2212,7 +2918,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } translationX -= moveDx; - if (scale != 1) { + if (scale != 1 || currentEditMode != 0) { translationY -= moveDy; } @@ -2225,14 +2931,17 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } } } else if (ev.getActionMasked() == MotionEvent.ACTION_CANCEL || ev.getActionMasked() == MotionEvent.ACTION_UP || ev.getActionMasked() == MotionEvent.ACTION_POINTER_UP) { + if (currentEditMode == 1) { + photoCropView.startAnimationRunnable(); + } if (zooming) { invalidCoords = true; if (scale < 1.0f) { updateMinMax(1.0f); animateTo(1.0f, 0, 0, true); } else if (scale > 3.0f) { - float atx = (pinchCenterX - containerView.getWidth() / 2) - ((pinchCenterX - containerView.getWidth() / 2) - pinchStartX) * (3.0f / pinchStartScale); - float aty = (pinchCenterY - containerView.getHeight() / 2) - ((pinchCenterY - containerView.getHeight() / 2) - pinchStartY) * (3.0f / pinchStartScale); + float atx = (pinchCenterX - getContainerViewWidth() / 2) - ((pinchCenterX - getContainerViewWidth() / 2) - pinchStartX) * (3.0f / pinchStartScale); + float aty = (pinchCenterY - getContainerViewHeight() / 2) - ((pinchCenterY - getContainerViewHeight() / 2) - pinchStartY) * (3.0f / pinchStartScale); updateMinMax(3.0f); if (atx < minX) { atx = minX; @@ -2250,14 +2959,14 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } zooming = false; } else if (draggingDown) { - if (Math.abs(dragY - ev.getY()) > containerView.getHeight() / 6.0f) { - closePhoto(true); + if (Math.abs(dragY - ev.getY()) > getContainerViewHeight() / 6.0f) { + closePhoto(true, false); } else { - if (checkImageView.getVisibility() == View.VISIBLE) { + if (pickerView.getVisibility() == View.VISIBLE) { toggleActionBar(true, true); toggleCheckImageView(true); } - animateTo(1, 0, 0); + animateTo(1, 0, 0, false); } draggingDown = false; } else if (moving) { @@ -2272,13 +2981,15 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat velocity = velocityTracker.getXVelocity(); } - if ((translationX < minX - containerView.getWidth() / 3 || velocity < -AndroidUtilities.dp(650)) && rightImage.hasImage()) { - goToNext(); - return true; - } - if ((translationX > maxX + containerView.getWidth() / 3 || velocity > AndroidUtilities.dp(650)) && leftImage.hasImage()) { - goToPrev(); - return true; + if (currentEditMode == 0) { + if ((translationX < minX - getContainerViewWidth() / 3 || velocity < -AndroidUtilities.dp(650)) && rightImage.hasImage()) { + goToNext(); + return true; + } + if ((translationX > maxX + getContainerViewWidth() / 3 || velocity > AndroidUtilities.dp(650)) && leftImage.hasImage()) { + goToPrev(); + return true; + } } if (translationX < minX) { @@ -2291,7 +3002,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } else if (translationY > maxY) { moveToY = maxY; } - animateTo(scale, moveToX, moveToY); + animateTo(scale, moveToX, moveToY, false); } else { AndroidUtilities.unlockOrientation(parentActivity); } @@ -2319,26 +3030,26 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat private void goToNext() { float extra = 0; if (scale != 1) { - extra = (containerView.getWidth() - centerImage.getImageWidth()) / 2 * scale; + extra = (getContainerViewWidth() - centerImage.getImageWidth()) / 2 * scale; } switchImageAfterAnimation = 1; - animateTo(scale, minX - containerView.getWidth() - extra - PAGE_SPACING / 2, translationY); + animateTo(scale, minX - getContainerViewWidth() - extra - PAGE_SPACING / 2, translationY, false); } private void goToPrev() { float extra = 0; if (scale != 1) { - extra = (containerView.getWidth() - centerImage.getImageWidth()) / 2 * scale; + extra = (getContainerViewWidth() - centerImage.getImageWidth()) / 2 * scale; } switchImageAfterAnimation = 2; - animateTo(scale, maxX + containerView.getWidth() + extra + PAGE_SPACING / 2, translationY); - } - - private void animateTo(float newScale, float newTx, float newTy) { - animateTo(newScale, newTx, newTy, false); + animateTo(scale, maxX + getContainerViewWidth() + extra + PAGE_SPACING / 2, translationY, false); } private void animateTo(float newScale, float newTx, float newTy, boolean isZoom) { + animateTo(newScale, newTx, newTy, isZoom, 250); + } + + private void animateTo(float newScale, float newTx, float newTy, boolean isZoom, int duration) { if (scale == newScale && translationX == newTx && translationY == newTy) { AndroidUtilities.unlockOrientation(parentActivity); return; @@ -2348,11 +3059,33 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat animateToX = newTx; animateToY = newTy; animationStartTime = System.currentTimeMillis(); - animationDuration = 250; - containerView.postInvalidate(); + imageMoveAnimation = new AnimatorSetProxy(); + imageMoveAnimation.playTogether( + ObjectAnimatorProxy.ofFloat(this, "animationValue", 0, 1) + ); + imageMoveAnimation.setInterpolator(interpolator); + imageMoveAnimation.setDuration(duration); + imageMoveAnimation.addListener(new AnimatorListenerAdapterProxy() { + @Override + public void onAnimationEnd(Object animation) { + imageMoveAnimation = null; + AndroidUtilities.unlockOrientation(parentActivity); + containerView.invalidate(); + } + }); + imageMoveAnimation.start(); AndroidUtilities.lockOrientation(parentActivity); } + public void setAnimationValue(float value) { + animationValue = value; + containerView.invalidate(); + } + + public float getAnimationValue() { + return animationValue; + } + private void onDraw(Canvas canvas) { if (animationInProgress == 1 || !isVisible && animationInProgress != 2) { return; @@ -2362,23 +3095,18 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat float currentTranslationX; float currentScale; float aty = -1; - float ai = -1; - if (System.currentTimeMillis() - animationStartTime < animationDuration) { - ai = interpolator.getInterpolation((float) (System.currentTimeMillis() - animationStartTime) / animationDuration); - if (ai >= 1.0f) { - ai = -1; - } - } - - if (ai != -1) { + if (imageMoveAnimation != null) { if (!scroller.isFinished()) { scroller.abortAnimation(); } - float ts = scale + (animateToScale - scale) * ai; - float tx = translationX + (animateToX - translationX) * ai; - float ty = translationY + (animateToY - translationY) * ai; + float ts = scale + (animateToScale - scale) * animationValue; + float tx = translationX + (animateToX - translationX) * animationValue; + float ty = translationY + (animateToY - translationY) * animationValue; + if (currentEditMode == 1) { + photoCropView.setAnimationProgress(animationValue); + } if (animateToScale == 1 && scale == 1 && translationX == 0) { aty = ty; @@ -2393,6 +3121,9 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat translationY = animateToY; scale = animateToScale; animationStartTime = 0; + if (currentEditMode == 1) { + photoCropView.setAnimationProgress(1); + } updateMinMax(scale); AndroidUtilities.unlockOrientation(parentActivity); zoomAnimation = false; @@ -2424,8 +3155,8 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } } - if (scale == 1 && aty != -1) { - float maxValue = containerView.getHeight() / 4.0f; + if (currentEditMode == 0 && scale == 1 && aty != -1 && !zoomAnimation) { + float maxValue = getContainerViewHeight() / 4.0f; backgroundDrawable.setAlpha((int) Math.max(127, 255 * (1.0f - (Math.min(Math.abs(aty), maxValue) / maxValue)))); } else { backgroundDrawable.setAlpha(255); @@ -2433,14 +3164,16 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat ImageReceiver sideImage = null; Bitmap bitmap; - if (scale >= 1.0f && !zoomAnimation && !zooming) { - if (currentTranslationX > maxX + AndroidUtilities.dp(5)) { - sideImage = leftImage; - } else if (currentTranslationX < minX - AndroidUtilities.dp(5)) { - sideImage = rightImage; + if (currentEditMode == 0) { + if (scale >= 1.0f && !zoomAnimation && !zooming) { + if (currentTranslationX > maxX + AndroidUtilities.dp(5)) { + sideImage = leftImage; + } else if (currentTranslationX < minX - AndroidUtilities.dp(5)) { + sideImage = rightImage; + } } + changingPage = sideImage != null; } - changingPage = sideImage != null; if (sideImage == rightImage) { float tranlateX = currentTranslationX; @@ -2452,17 +3185,16 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat tranlateX = -canvas.getWidth() - PAGE_SPACING / 2; } - bitmap = sideImage.getBitmap(); - if (bitmap != null) { + if (sideImage.getBitmap() != null) { canvas.save(); - canvas.translate(containerView.getWidth() / 2, containerView.getHeight() / 2); + canvas.translate(getContainerViewWidth() / 2, getContainerViewHeight() / 2); canvas.translate(canvas.getWidth() + PAGE_SPACING / 2 + tranlateX, 0); canvas.scale(1.0f - scaleDiff, 1.0f - scaleDiff); - int bitmapWidth = bitmap.getWidth(); - int bitmapHeight = bitmap.getHeight(); + int bitmapWidth = sideImage.getBitmapWidth(); + int bitmapHeight = sideImage.getBitmapHeight(); - float scaleX = (float) containerView.getWidth() / (float) bitmapWidth; - float scaleY = (float) containerView.getHeight() / (float) bitmapHeight; + float scaleX = (float) getContainerViewWidth() / (float) bitmapWidth; + float scaleY = (float) getContainerViewHeight() / (float) bitmapHeight; float scale = scaleX > scaleY ? scaleY : scaleX; int width = (int) (bitmapWidth * scale); int height = (int) (bitmapHeight * scale); @@ -2485,24 +3217,27 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat float tranlateX = currentTranslationX; float scaleDiff = 0; float alpha = 1; - if (!zoomAnimation && tranlateX > maxX) { + if (!zoomAnimation && tranlateX > maxX && currentEditMode == 0) { alpha = Math.min(1.0f, (tranlateX - maxX) / canvas.getWidth()); scaleDiff = alpha * 0.3f; alpha = 1.0f - alpha; tranlateX = maxX; } - bitmap = centerImage.getBitmap(); - if (bitmap != null) { + if (centerImage.getBitmap() != null) { canvas.save(); - canvas.translate(containerView.getWidth() / 2, containerView.getHeight() / 2); + canvas.translate(getContainerViewWidth() / 2 + getAdditionX(), getContainerViewHeight() / 2 + getAdditionY()); canvas.translate(tranlateX, currentTranslationY); canvas.scale(currentScale - scaleDiff, currentScale - scaleDiff); - int bitmapWidth = bitmap.getWidth(); - int bitmapHeight = bitmap.getHeight(); + if (currentEditMode == 1) { + photoCropView.setBitmapParams(currentScale, tranlateX, currentTranslationY); + } - float scaleX = (float) containerView.getWidth() / (float) bitmapWidth; - float scaleY = (float) containerView.getHeight() / (float) bitmapHeight; + int bitmapWidth = centerImage.getBitmapWidth(); + int bitmapHeight = centerImage.getBitmapHeight(); + + float scaleX = (float) getContainerViewWidth() / (float) bitmapWidth; + float scaleY = (float) getContainerViewHeight() / (float) bitmapHeight; float scale = scaleX > scaleY ? scaleY : scaleX; int width = (int) (bitmapWidth * scale); int height = (int) (bitmapHeight * scale); @@ -2528,16 +3263,15 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat canvas.restore(); if (sideImage == leftImage) { - bitmap = sideImage.getBitmap(); - if (bitmap != null) { + if (sideImage.getBitmap() != null) { canvas.save(); - canvas.translate(containerView.getWidth() / 2, containerView.getHeight() / 2); + canvas.translate(getContainerViewWidth() / 2, getContainerViewHeight() / 2); canvas.translate(-(canvas.getWidth() * (scale + 1) + PAGE_SPACING) / 2 + currentTranslationX, 0); - int bitmapWidth = bitmap.getWidth(); - int bitmapHeight = bitmap.getHeight(); + int bitmapWidth = sideImage.getBitmapWidth(); + int bitmapHeight = sideImage.getBitmapHeight(); - float scaleX = (float) containerView.getWidth() / (float) bitmapWidth; - float scaleY = (float) containerView.getHeight() / (float) bitmapHeight; + float scaleX = (float) getContainerViewWidth() / (float) bitmapWidth; + float scaleY = (float) getContainerViewHeight() / (float) bitmapHeight; float scale = scaleX > scaleY ? scaleY : scaleX; int width = (int) (bitmapWidth * scale); int height = (int) (bitmapHeight * scale); @@ -2597,7 +3331,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat if (f.exists()) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(f), "video/mp4"); - parentActivity.startActivity(intent); + parentActivity.startActivityForResult(intent, 500); } else { loadFile = true; } @@ -2606,7 +3340,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat if (cacheFile.exists()) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(cacheFile), "video/mp4"); - parentActivity.startActivity(intent); + parentActivity.startActivityForResult(intent, 500); } else { loadFile = true; } @@ -2666,8 +3400,8 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat if (state > 0 && state <= 3) { float x = e.getX(); float y = e.getY(); - if (x >= (containerView.getWidth() - AndroidUtilities.dp(64)) / 2.0f && x <= (containerView.getWidth() + AndroidUtilities.dp(64)) / 2.0f && - y >= (containerView.getHeight() - AndroidUtilities.dp(64)) / 2.0f && y <= (containerView.getHeight() + AndroidUtilities.dp(64)) / 2.0f) { + if (x >= (getContainerViewWidth() - AndroidUtilities.dp(64)) / 2.0f && x <= (getContainerViewWidth() + AndroidUtilities.dp(64)) / 2.0f && + y >= (getContainerViewHeight() - AndroidUtilities.dp(64)) / 2.0f && y <= (getContainerViewHeight() + AndroidUtilities.dp(64)) / 2.0f) { onActionClick(); checkProgress(0, true); return true; @@ -2675,7 +3409,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } } toggleActionBar(!isActionBarVisible, true); - } else { + } else if (sendPhotoType == 0) { checkImageView.performClick(); } return true; @@ -2690,8 +3424,8 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat return false; } if (scale == 1.0f) { - float atx = (e.getX() - containerView.getWidth() / 2) - ((e.getX() - containerView.getWidth() / 2) - translationX) * (3.0f / scale); - float aty = (e.getY() - containerView.getHeight() / 2) - ((e.getY() - containerView.getHeight() / 2) - translationY) * (3.0f / scale); + float atx = (e.getX() - getContainerViewWidth() / 2) - ((e.getX() - getContainerViewWidth() / 2) - translationX) * (3.0f / scale); + float aty = (e.getY() - getContainerViewHeight() / 2) - ((e.getY() - getContainerViewHeight() / 2) - translationY) * (3.0f / scale); updateMinMax(3.0f); if (atx < minX) { atx = minX; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java index 5c9dcae8a..3aac25c12 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java @@ -53,6 +53,7 @@ import org.telegram.ui.Components.BackupImageView; import org.telegram.ui.Components.ChatActivityEnterView; import org.telegram.ui.Components.FrameLayoutFixed; import org.telegram.ui.Components.PopupAudioView; +import org.telegram.ui.Components.SizeNotifierRelativeLayout; import org.telegram.ui.Components.TypingDotsDrawable; import java.io.File; @@ -159,7 +160,38 @@ public class PopupNotificationActivity extends Activity implements NotificationC typingDotsDrawable = new TypingDotsDrawable(); - chatActivityEnterView = new ChatActivityEnterView(); + SizeNotifierRelativeLayout contentView = new SizeNotifierRelativeLayout(this); + setContentView(contentView); + contentView.setBackgroundColor(0x99000000); + + RelativeLayout relativeLayout = new RelativeLayout(this); + contentView.addView(relativeLayout); + RelativeLayout.LayoutParams layoutParams3 = (RelativeLayout.LayoutParams) relativeLayout.getLayoutParams(); + layoutParams3.width = RelativeLayout.LayoutParams.MATCH_PARENT; + layoutParams3.height = RelativeLayout.LayoutParams.MATCH_PARENT; + relativeLayout.setLayoutParams(layoutParams3); + + RelativeLayout popupContainer = new RelativeLayout(this); + popupContainer.setBackgroundColor(0xffffffff); + relativeLayout.addView(popupContainer); + layoutParams3 = (RelativeLayout.LayoutParams) popupContainer.getLayoutParams(); + layoutParams3.width = RelativeLayout.LayoutParams.MATCH_PARENT; + layoutParams3.height = AndroidUtilities.dp(240); + layoutParams3.leftMargin = AndroidUtilities.dp(12); + layoutParams3.rightMargin = AndroidUtilities.dp(12); + layoutParams3.addRule(RelativeLayout.CENTER_IN_PARENT); + popupContainer.setLayoutParams(layoutParams3); + + if (chatActivityEnterView != null) { + chatActivityEnterView.onDestroy(); + } + chatActivityEnterView = new ChatActivityEnterView(this, contentView, true); + popupContainer.addView(chatActivityEnterView); + layoutParams3 = (RelativeLayout.LayoutParams) chatActivityEnterView.getLayoutParams(); + layoutParams3.width = RelativeLayout.LayoutParams.MATCH_PARENT; + layoutParams3.height = RelativeLayout.LayoutParams.WRAP_CONTENT; + layoutParams3.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); + chatActivityEnterView.setLayoutParams(layoutParams3); chatActivityEnterView.setDelegate(new ChatActivityEnterView.ChatActivityEnterViewDelegate() { @Override public void onMessageSend() { @@ -202,15 +234,13 @@ public class PopupNotificationActivity extends Activity implements NotificationC } }); - setContentView(R.layout.popup_notification_layout); - RelativeLayout popupContainer = (RelativeLayout) findViewById(R.id.popup_container); messageContainer = new FrameLayoutTouch(this); popupContainer.addView(messageContainer, 0); actionBar = new ActionBar(this); actionBar.setOccupyStatusBar(false); actionBar.setBackButtonImage(R.drawable.ic_ab_back); - actionBar.setBackgroundResource(R.color.header); + actionBar.setBackgroundColor(0xff54759e); actionBar.setItemsBackground(R.drawable.bar_selector); popupContainer.addView(actionBar); ViewGroup.LayoutParams layoutParams = actionBar.getLayoutParams(); @@ -292,8 +322,6 @@ public class PopupNotificationActivity extends Activity implements NotificationC } }); - chatActivityEnterView.setContainerView(this, findViewById(R.id.chat_layout)); - PowerManager pm = (PowerManager) ApplicationLoader.applicationContext.getSystemService(Context.POWER_SERVICE); wakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "screen"); wakeLock.setReferenceCounted(false); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PrivacySettingsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PrivacySettingsActivity.java index 5cdc731cc..0fdf3a59f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PrivacySettingsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PrivacySettingsActivity.java @@ -53,6 +53,7 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio private int securitySectionRow; private int terminateSessionsRow; private int passwordRow; + private int passcodeRow; private int terminateSessionsDetailRow; private int deleteAccountSectionRow; private int deleteAccountRow; @@ -71,6 +72,7 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio lastSeenRow = rowCount++; lastSeenDetailRow = rowCount++; securitySectionRow = rowCount++; + passcodeRow = rowCount++; terminateSessionsRow = rowCount++; terminateSessionsDetailRow = rowCount++; deleteAccountSectionRow = rowCount++; @@ -90,7 +92,7 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio } @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { if (fragmentView == null) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); @@ -227,6 +229,12 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio presentFragment(new LastSeenActivity()); } else if (i == passwordRow) { presentFragment(new AccountPasswordActivity(0)); + } else if (i == passcodeRow) { + if (UserConfig.passcodeHash.length() > 0) { + presentFragment(new PasscodeActivity(2)); + } else { + presentFragment(new PasscodeActivity(0)); + } } } }); @@ -319,7 +327,7 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio @Override public boolean isEnabled(int i) { - return i == passwordRow || i == blockedRow || i == terminateSessionsRow || i == lastSeenRow && !ContactsController.getInstance().getLoadingLastSeenInfo() || i == deleteAccountRow && !ContactsController.getInstance().getLoadingDeleteInfo(); + return i == passcodeRow || i == passwordRow || i == blockedRow || i == terminateSessionsRow || i == lastSeenRow && !ContactsController.getInstance().getLoadingLastSeenInfo() || i == deleteAccountRow && !ContactsController.getInstance().getLoadingDeleteInfo(); } @Override @@ -357,6 +365,8 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio textCell.setText(LocaleController.getString("TerminateAllSessions", R.string.TerminateAllSessions), false); } else if (i == passwordRow) { textCell.setText(LocaleController.getString("Password", R.string.Password), true); + } else if (i == passcodeRow) { + textCell.setText(LocaleController.getString("Passcode", R.string.Passcode), true); } else if (i == lastSeenRow) { String value; if (ContactsController.getInstance().getLoadingLastSeenInfo()) { @@ -413,7 +423,7 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio @Override public int getItemViewType(int i) { - if (i == lastSeenRow || i == blockedRow || i == deleteAccountRow || i == terminateSessionsRow || i == passwordRow) { + if (i == lastSeenRow || i == blockedRow || i == deleteAccountRow || i == terminateSessionsRow || i == passwordRow || i == passcodeRow) { return 0; } else if (i == deleteAccountDetailRow || i == lastSeenDetailRow || i == terminateSessionsDetailRow) { return 1; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java index fe5284968..94d875a90 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java @@ -224,7 +224,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { if (fragmentView == null) { actionBar.setBackgroundColor(AvatarDrawable.getProfileBackColorForId(user_id != 0 ? 5 : chat_id)); actionBar.setItemsBackground(AvatarDrawable.getButtonColorForId(user_id != 0 ? 5 : chat_id)); @@ -485,7 +485,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. try { Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:+" + user.phone)); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - getParentActivity().startActivity(intent); + getParentActivity().startActivityForResult(intent, 500); } catch (Exception e) { FileLog.e("tmessages", e); } @@ -884,6 +884,11 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. fixLayout(); } + @Override + public void updatePhotoAtIndex(int index) { + + } + @Override public PhotoViewer.PlaceProviderObject getPlaceForPhoto(MessageObject messageObject, TLRPC.FileLocation fileLocation, int index) { if (fileLocation == null) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ProfileNotificationsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ProfileNotificationsActivity.java index 3675c7633..9f6a141a4 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ProfileNotificationsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ProfileNotificationsActivity.java @@ -85,7 +85,7 @@ public class ProfileNotificationsActivity extends BaseFragment implements Notifi } @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { if (fragmentView == null) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); @@ -425,10 +425,16 @@ public class ProfileNotificationsActivity extends BaseFragment implements Notifi val = LocaleController.formatString("WillUnmuteIn", R.string.WillUnmuteIn, LocaleController.formatPluralString("Minutes", delta / 60)); } else if (delta < 60 * 60 * 24) { val = LocaleController.formatString("WillUnmuteIn", R.string.WillUnmuteIn, LocaleController.formatPluralString("Hours", (int) Math.ceil(delta / 60.0f / 60))); - } else { + } else if (delta < 60 * 60 * 24 * 365) { val = LocaleController.formatString("WillUnmuteIn", R.string.WillUnmuteIn, LocaleController.formatPluralString("Days", (int) Math.ceil(delta / 60.0f / 60 / 24))); + } else { + val = null; + } + if (val != null) { + textCell.setTextAndValue(LocaleController.getString("Notifications", R.string.Notifications), val, true); + } else { + textCell.setTextAndValue(LocaleController.getString("Notifications", R.string.Notifications), LocaleController.getString("Disabled", R.string.Disabled), true); } - textCell.setTextAndValue(LocaleController.getString("Notifications", R.string.Notifications), val, true); } } else if (i == settingsSoundRow) { String value = preferences.getString("sound_" + dialog_id, LocaleController.getString("Default", R.string.Default)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java index 31efa3080..b51761320 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java @@ -265,7 +265,7 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter } @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { if (fragmentView == null) { actionBar.setBackgroundColor(AvatarDrawable.getProfileBackColorForId(5)); actionBar.setItemsBackground(AvatarDrawable.getButtonColorForId(5)); @@ -491,7 +491,7 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter } else if (i == telegramFaqRow) { try { Intent pickIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(LocaleController.getString("TelegramFaqUrl", R.string.TelegramFaqUrl))); - getParentActivity().startActivity(pickIntent); + getParentActivity().startActivityForResult(pickIntent, 500); } catch (Exception e) { FileLog.e("tmessages", e); } @@ -706,6 +706,11 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter MediaController.getInstance().checkAutodownloadSettings(); } + @Override + public void updatePhotoAtIndex(int index) { + + } + @Override public PhotoViewer.PlaceProviderObject getPlaceForPhoto(MessageObject messageObject, TLRPC.FileLocation fileLocation, int index) { if (fileLocation == null) { @@ -994,7 +999,7 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter i.putExtra(Intent.EXTRA_EMAIL, new String[]{BuildVars.SEND_LOGS_EMAIL}); i.putExtra(Intent.EXTRA_SUBJECT, "last logs"); i.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); - getParentActivity().startActivity(Intent.createChooser(i, "Select email application.")); + getParentActivity().startActivityForResult(Intent.createChooser(i, "Select email application."), 500); } catch (Exception e) { e.printStackTrace(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/VideoEditorActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/VideoEditorActivity.java index 63d0da9c5..3cf311d2b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/VideoEditorActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/VideoEditorActivity.java @@ -221,7 +221,7 @@ public class VideoEditorActivity extends BaseFragment implements TextureView.Sur } @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { if (fragmentView == null) { actionBar.setBackgroundColor(0xff333333); actionBar.setItemsBackground(R.drawable.bar_selector_white); @@ -259,7 +259,7 @@ public class VideoEditorActivity extends BaseFragment implements TextureView.Sur ActionBarMenu menu = actionBar.createMenu(); menu.addItemWithWidth(1, R.drawable.ic_done, AndroidUtilities.dp(56)); - fragmentView = inflater.inflate(R.layout.video_editor_layout, container, false); + fragmentView = inflater.inflate(R.layout.video_editor_layout, null, false); originalSizeTextView = (TextView) fragmentView.findViewById(R.id.original_size); editedSizeTextView = (TextView) fragmentView.findViewById(R.id.edited_size); videoContainerView = fragmentView.findViewById(R.id.video_container); @@ -578,6 +578,9 @@ public class VideoEditorActivity extends BaseFragment implements TextureView.Sur } private void fixLayoutInternal() { + if (getParentActivity() == null) { + return; + } if (!AndroidUtilities.isTablet() && getParentActivity().getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) videoContainerView.getLayoutParams(); layoutParams.topMargin = AndroidUtilities.dp(16); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/WallpapersActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/WallpapersActivity.java index 5b428a431..935cba2a7 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/WallpapersActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/WallpapersActivity.java @@ -63,8 +63,8 @@ public class WallpapersActivity extends BaseFragment implements NotificationCent private ProgressBar progressBar; private int selectedBackground; private int selectedColor; - private ArrayList wallPapers = new ArrayList(); - private HashMap wallpappersByIds = new HashMap(); + private ArrayList wallPapers = new ArrayList<>(); + private HashMap wallpappersByIds = new HashMap<>(); private View doneButton; private String loadingFile = null; private File loadingFileObject = null; @@ -101,7 +101,7 @@ public class WallpapersActivity extends BaseFragment implements NotificationCent } @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public View createView(LayoutInflater inflater) { if (fragmentView == null) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); @@ -148,7 +148,7 @@ public class WallpapersActivity extends BaseFragment implements NotificationCent editor.putInt("selectedBackground", selectedBackground); editor.putInt("selectedColor", selectedColor); editor.commit(); - ApplicationLoader.cachedWallpaper = null; + ApplicationLoader.reloadWallpaper(); } finishFragment(); } @@ -158,7 +158,7 @@ public class WallpapersActivity extends BaseFragment implements NotificationCent ActionBarMenu menu = actionBar.createMenu(); doneButton = menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); - fragmentView = inflater.inflate(R.layout.settings_wallpapers_layout, container, false); + fragmentView = inflater.inflate(R.layout.settings_wallpapers_layout, null, false); listAdapter = new ListAdapter(getParentActivity()); progressBar = (ProgressBar)fragmentView.findViewById(R.id.action_progress); diff --git a/TMessagesProj/src/main/res/drawable-hdpi/bottom_shadow.png b/TMessagesProj/src/main/res/drawable-hdpi/bottom_shadow.png new file mode 100755 index 0000000000000000000000000000000000000000..5dc9ed10aef9c9ee90bf30059ed95de4a395af47 GIT binary patch literal 968 zcmaJ=U2D@&7*17W8%!C9OksG)Koo3}leTFamW{4yT)>Rl#=(;Qo8G!Z2r9*KCre zaYweX$5{!6i@kud8D?cI4lH{Q5zs;%*H_q|Z{D)NbriOdGXx_jqprJg7^3>&rfDDU z*+qw4TLmkzOa(kdED(G9ek8{VJJglwJlW=1Focjjg*{2CX;eWOhX~}jOxhM81d_zT zY)+EkEg%X|AaqZ8ip~1kVSjnqmzL?Kw zu%L~(DzH`3Nv0Fq(#6F1$fs@(sjcg?sa|p=bhTv0Ut2qiA0I9p{W^2GbqOxmOCPGQ zeRJ^S-n;Dav%BB5rPbX}&-JI#liK|xkcvpQR-Eu@%cEpTY6oGgA zB)Eq(O)gNldGYjtBI45xv8a#iJP&xk)xrjv#F9oMQ(wwua!%F za%paAUWuoRtrAc~FC{a@$`GR0376ioGgA zG`_0Jm|ViFAUgfs*+&dPwGJ}OM;5%c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMwS&*t9 zlvv ztM~P_^2{qPNz6-5^>ndS0-B(gnVDi`;OJ!PY-wub=;CH#Xy|HU>0;<;X<}+>=;-L; z>}G5N)9aF-T$-DjR|3Q!gkfv4~Pj*wm=R%;iu*SQ+p9GS*P7S{eppkG04-!F{I+w zmayA-hYWb$COkFT!hVDKL#xN01+|x1ZZ`x4c<=1YKb=#ce!j@VYsS*g7mnF&l6|f+ z(NK+P3*-9+zS{N&Q+GuD=(WGcuyW@u!3#VJ?w5=U*D~1tu{5jC*sF)qDxn%SXN z#?*6b8IFja*!ZgX&_#XOc`KJxYaP6?wIepbRj@pVq3GcbH704xV<}2$hgVN$G_))@ z-QjWjg42&>MvAx7PL`=EZCI$%lv_EeX1mvY?b%`L<{!Cr%}iw7#>rEC7~@0R4nBYI zrsry=1o-I`==bUjLYs;K_P#^7>-$@(Vtc70Llyc}^4=}uYDaU#0I@4lMiR0<& K=d#Wzp$P!^@W0Ri literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/edit_doneblue.png b/TMessagesProj/src/main/res/drawable-hdpi/edit_doneblue.png new file mode 100755 index 0000000000000000000000000000000000000000..ad5f280d1170e2ad438f36038ecb2a60f4449cfb GIT binary patch literal 1306 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Eu!3HE}2mdz#Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS=07?_nZLn2Bde0{8v^Kf6`()~Xj@TAnpKdC8`Lf!&sHg;q@=(~U%$M( zT(8_%FTW^V-_X+15@d#vkuFe$ZgFK^Nn(X=Ua>OF1ees}+T7#d8#0MoBXEYLU9GXQxBrqI_HztY@Xxa#7Ppj3o=u^L<)Qdy9y zACy|0Us{w5jJPyqkW~d%&PAz-CHX}m`T04pPz=b(FUc>?$S+WE4mMNJ2+zz*$uBR~ z1grP;werj>E=kNwPW5!LRRWrzmzkMjWnk=VVQymP>SSo>Y-s3eV&Q7$=4j?*Vqt3L zX6R;W0@Le~pIn-onpXnTn}X2mhEp#nDdZLaZFWg5$}CGwaVyHtRRDY0DigO`oN<~5 z)tiFbEiO3q>H{644~kf%h=vIPQxAvRwofw9li#WAGf z)}Co6y_g*Z+KeZ^@MSqF{y|lw^?_^uqNJEdY?hi8AAFC97r6FvKNhmB`Y`i|kCN6u zR?`b&wv*?bD>1KWf4OA&s{i|URW%*m-aqO2Ms_s^=09OJ?D6dG2@E`qvGX~v9AMS> z{8^}i-=Vwcu&(10c=e%M%&wj)6`=8Fcs&8QQJ5n9J#v^?Df)i2^Pv?4{_nc^vJ8{-a z8Hw#YexbEMr)s2feXTx|Nod)o6|ET^1yW%?zp zIeyF3?s@Z}VypkT!9Shu+3tPgJ##+GcS+9)d%_pBz4Nj0U(Lw1jk#{h{Z$Wwf`vV+ zd5@gywK;Fa>O0Nh4|N468*;E(nd+f%4JY}bI$<#CPFlgjO VA7U3!S`8|#JYD@<);T3K0RY%9&tCul literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/gif_search.png b/TMessagesProj/src/main/res/drawable-hdpi/gif_search.png deleted file mode 100644 index ab687dad9307b9daf38e5c4f87137e471f550363..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1895 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 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/lock_close.png b/TMessagesProj/src/main/res/drawable-hdpi/lock_close.png new file mode 100644 index 0000000000000000000000000000000000000000..f9b9072cdffab3f0c59cbc95969b28600e768e46 GIT binary patch literal 1266 zcmeAS@N?(olHy`uVBq!ia0vp^YCtT~Vkcg59UmvUF{9L_6kQ%*;+ybC(1_m4Zih{)C?9>v4 zq}24xJX@vryZ0+8WTx0Eg`4^s_!c;)W@LI)6{QAO`Gq7`WhYyvDB0U7*i={n4aiL` zNmQuF&B-gas<2f8n`;GRgM{^!6u?SKvTcwn`Gu2HtFf>sxx70H< zH8im>)KM@pFf`UTFxEFT)-^P;GO)BVG*y5CC7^9ZDQQ+gE^bh}fIM5JjFOT9D}DX) z@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7^KE~&-IMVSR9nfZANAQKal z@=Hr>m4GgVcpk{1iHq`B|o_|H#M)s)5TT^D595=nPTPWWM*Mu>T2fb zW@uz+=xSnNVrJ%QW@%<>>|$nY;Ajrh>zP+vl9-pA3e%g3&})iUua$FAYGO%#QAmD% z4lMQpGV)9Ei!<^I6r7zEG<*}2GxI=vO;FfEotj#dS(cjOR+OKs01h0hOe_vCw{$iz zbOa(-HxulRhv-eg;&G^6Bb<8mfsWA!#Vk@x!-Rmz2gHP@TObFX@>BDG$-M}eu2(hR zjAvkA1O}O7NX4zBAOHW`Gqc_h>6p&&u~y+9+tKd}lhUTl@ada;;R22C9_`-L=Rcvfc4G|(8t&J6;0`Z5kwHxmQavZt;KUlt| zeU@+8x-V==d{Re5*sr{~c*OqI2FKVK0cJVok4YNVVjZcPW)mF>H@0`I;m@-Cp!kw; z<9gwR`TVBZg*gl4I_woc+B+U)v+1=xtn{tKz~W55hvBZ}h5{=XllU~&DF&UF^NQL~ z?Xlv2ozutqEQ_AjE?55B87J*u85qfY>uM`|Y&u(Tj_Jqp>t2l(!X5PtALX^KoL%7d k$VA~C+avZJB1|k23?B7D+`qZE>w!ukPgg&ebxsLQ0CXd<6951J literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/lock_open.png b/TMessagesProj/src/main/res/drawable-hdpi/lock_open.png new file mode 100644 index 0000000000000000000000000000000000000000..b7cc48642492c1b3b169b5adfb70a049a2c6e44f GIT binary patch literal 1275 zcmeAS@N?(olHy`uVBq!ia0vp^YCtT~Vkcg59UmvUF{9L_6kQ%*;+ybC(1_m4Zih{)C?9>v4 zq}24xJX@vryZ0+8WTx0Eg`4^s_!c;)W@LI)6{QAO`Gq7`WhYyvDB0U7*i={n4aiL` zNmQuF&B-gas<2f8n`;GRgM{^!6u?SKvTcwn`Gu2HtFf>sxx70H< zH8im>)KM@pFf`UTFxEFT)-^P;GO)BVG*y5CC7^9ZDQQ+gE^bh}fIM5JjFOT9D}DX) z@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7^KE~&-IMVSR9nfZANAQKal z@=Hr>m4GgVcpk{1iHq`B|o_|H#M)s)5TT^D595=nPTN==wxneZsFqS zW@v0^=xSnNVrJ%QW@%<>>|$nY;Ajrh>zP+vl9-pA3e%g3(Cds>ua$FAYGO%#QAmD% z4lMQpGV)9Ei!<^I6r7zEG<*}2GxI=vO;FfEotj#dS(cjOR+OKs01h0hOe_v?ax!;u zGc+;*Isgc;IUb@n1&ha_dQEZa)dxC89~84lF%1&}CLa(Jo^F90c*;-B119$(V7gwI z#WtORfich1#WAGfR??sU|LvJ&9Zdw(88^xad}jKnudt8*$n1t4@*VdNhBnE#vFmUj zdH(M)`~Ain?91Ba`h?gXwP*DGU_LUx;fJ~yd)tN6iLWo{3u`QtZRLn9E(E)_)3)=YWQz{^fB>!Gtc9Vsly(=_Fd)0@(4gh)qg zV}+r!)p;tLAP9MY`#PMVm#+8`Jj zBfu=j{4q(xTC5|Lz4`Du=8dcZ^-Z6w8-J(>Wb>4STvN8}Vm!4@o+tB-q}ayg%?A_f zT)HmW_D*H|n6B`y@ssz0q-Le?rl|Q_1I%tGXz8tZw&3EV`XiQaM0wxVIeR`@&-RGl vVGidJdykx`$D8=Cc+6otvihSY3x@$iL;He#b!o!>pyJ5W)z4*}Q$iB}g2b_# literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/msg_check.png b/TMessagesProj/src/main/res/drawable-hdpi/msg_check.png index 7d63d9115966ba15ea160a433de51abc62bba64b..80e7278e62144a36816d85a51cb624fea764cc90 100755 GIT binary patch literal 1280 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%xRe+5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8KW+g=7RhMR$W{Yl!|Z$R@KEJl?AE#L8-<0 zrA5iW_()TRX$FQJev3c~fv&OgFUkZ)N@9*nesXDUYF>$_i>(q+MlU5Z#mdmh$kD{u z(A?0}$as*~r<^#SLZ#HoY#6CT?z~CT32K7A}T{t|k^{j!qU9 z#s)@~MkdY%CXO(@o_WP3iFwJXFncqB_CoanZN;P4%DE^tu_V7JBtJg~mI4AY@=NlI zGx7@*oP*62G{Q6UQu51-H9^q>@vTd0QD#|cid#{Bt^zoGtunFLPuSlOy(#2`nLf}l z`k=&tlvrRwz!V5#!jnFb1J69EdB7Y~1k4(~5^R$g7#IyaT^vIyZmqfOtIe7yaqMF{ z8~3M86NAj`8um`m@z9*Jd6LV`8=EFPVfNUxDRhdEb$d}#`s$8JbEj-_zH!6jasBIA zmrU9#3$L%Q^gCa2w({N1Qp}IypJ3!X! z#R2K4O)_h_cE31m&GqG_TJD5)-kt}-k6Y%XWqvbSCYZq1{?KjKf=ZpNy)9?w&rS^Z zEUzdWakYw9`=WHs-0ysQMV)f$z5m`k=yb?c~*ZB=c2c zadfqr^6^;bxVrj~-o*~vEf3|Kt7do$ zrF>nqLHlo=i@n^WGj1h)^F+7xCEih!-L#|s8|UUsdk1|Ertk7!RSz&QaoeoAv*^wj PP?_ZE>gTe~DWM4f_Gr1~ delta 349 zcmV-j0iynZ3Y!CvBn<>-K}|sb0I$e51&ZmBAt!$UElET{RCwBA{Qv(y12q5>C7Rt= zoAXd?5YP}6Aaw&sJAwF&L!QFq!3F^pF$38% zfw+GID0v5qA$~w=9S}1^1J@R)?lQJ?G#QAKfp|MKMvx5wg~tl0A%B554&4xBgZQB| zC?>W*V+NL1KrzG#mCpqlvI$?xPK3q)12jff01c4L2s}lt5S?kE(U}g!|FNYNl5#&#(^hDrdjU1% vBT)$r6h_#v+bT1DTyoejBee=PfB*vkq0^ne$)}P300000NkvXXu0mjfhIWX? diff --git a/TMessagesProj/src/main/res/drawable-hdpi/msg_check_w.png b/TMessagesProj/src/main/res/drawable-hdpi/msg_check_w.png index a35fc7a4ff2609df5b752c608946c9dec0f5cf9c..be83f2bf2a61d115d7e864cf3a85b489c6d77e18 100755 GIT binary patch literal 1225 zcmbVM&u`mQ9JdltjjdtrSXl=Wdv!H5*kb3ovD@p{02_O#*m*`GfyrkFNlR#4w zWSPxJ@|K8d+VGr>M(0LK%G{(9Q^~<3hq-W4yNo z#<_dGAzu-D!=JV_ToidqGL>l^8E#HWkoXIwYAO%Yj1cXE{g6!ynJ9#5F)d}d^Z@J= z8Bvh3Esou=87MK?bR?S=1|$eG(E$kAfmnoN*%+4evn_1Sa9r6?P|L1{?QUZ;&&Beh zjbzufOQt#1>VQJcbWNvbT0k7-z_GGssAk=H(=X3fv=Xwl8Kh=yQwN**<+WYx|99M5 zSoQzpjKe6c#wf7#>S(uaFYBAkJZzhB$T{gs~gScV2~wV zzWCSCg-Ykz*p(ZZjnswiMr`5H%EeRS5A$BIo=)fBxdW^}46XDWZFa5(&b@xSqi1Y5y50pIev}Ud*Dqh5 zfArFF4|w`^LHsOr^Tlhzv(=Sk@Vn3#fqk|68_Ty39;eDnd)@`f(3y7obGB4G)EG?N zI!(Ys$;UUl1E~vbSAXm6SPni>jx`UgGi}xOfGmLIpGUglMD=jB+I23~-S|Ze&Azbq w*4i8UrxsVQL^>M}a=C9lT>3h`7@Q}9#P@fulXs8LT=IV|xy*?4ZF+3+Zwn-f3;+NC delta 272 zcmV+r0q_3F3C{wMBn<>-K}|sb0I$e51&ZmBAt!$T;Ymb6RCwBA{Qv(y12q66g$D5e z@fR=)WDuEH1&E&ju@l%aWEvt0#JB%Lzy~0fBgYU;+;ratvxm zGUO5v^TXswF(ebo5KtgXBg?}W%s@N`8WY$I@dM&NNP(-1t_H@K232$$8Y9Sx%z*eC zRQ`Am)KCUo1}#N$_DN{Wz|zVqB)LpnUWYN*pfLag8-Z8?DXsj61~da9gBYMOa0x9y zQPK*r1~EWm0@(nRv_gtOAnXmq|FESMQVjy(ARvB@CplnXe8mVq5Pzgsc?1Ul0R{j8 WeK^S91ef3d0000~PQ5JIQxa!8gbpSo zy+8WC@Av2Ze!7?+f1|g@-$PMUZ+1*7knwrvdCo)L=k8ybBEyR~UBZ**46e%-qLQjv zMj)%p6;wd7x-@?e4O3L-j8-h+QtphPm^vdn7^b1u2%DmYM;kR+nMD|sQAIQ2^v2hB zXrQTadWy>hb2SlFwXtOjO)ifYmE~C_rqZJ$V7MU=0Uco(H1s*c78-GSM^_+oXPc$L z4g}A}>0PHvxjYa}3jvM^2b3U$fae();dmYnf>02K*dV$20E`G6FNB7`-bE8@mO3L8 zq|BZzvWnAHjB5hR*6Veq9%f9d!opZA=4gaM0fGqFO9qx30mJTZD@e#zEUkt$(*Ta5 zTs9YQoF<;`hM?DSxqV^7-b)lo8QYL+EM$VLt~+te zJZAdaWRkmQ8*+fe8)3rI$f3w{lBq1{$iP`CPLnT;s;L4@g_4ml9D-abnT|l15>rx| zPeox^42el8)7ChMEAhb)CuRsUDnXcz#5it9%tV5c80Dm>m~3;ihK*%IL2bJlvAf5O zJd-Pk7Lu`P6-{%lT><&3iA}p|)_^$4gHuzQp_+Ajz&W1XXeDH6i%88_rVe)UD`*GU z|L?eWx$6JP8B3gDo#Oacv9z~H1v=CH(kF}k=0OJO7>l&VUw;%fD5|3?DvvoG{?Wgy+G52bnf}_6IT<}=TbJ4ZA2tIMO zUQayf_I~-pn*WgX4Rig{TVn6h>GQ|eJ2nNtQ>_mZPdp1pv+Lh^dx~Ju)p|Se(xK+D zt1tKzU%zjnqx?SDI^2|hd{hPxzu>`rs~OPheSlVdV~YEuX?OF%{6MpkkN74o z+&bAg-!;;A?W?t;`R|*q&Ee|PL3iuj)K(?=E8A7BfFl?FOx_sk_K$eiZeRDV{v!T# zawU4)|Jb|c$46GDS8l(u`rgXZzV#a)yDvR@^VF-|!L9A>&sY2uxJ&(hB0Si-K}|sb0I$e51&ZmBAt!$T>PbXFRCwBAbX#S{Knd6xdJ;@C zQD6oq5VOHJe3{fRQUT&E(3k>&6d>M*tbiDUM1goalm>wgAYP2Fh>3`_ zvIT$YA`n;x#Ff|-G7*thU`Ze3l|)>MS#SjEJ7^U9LB%dZ1NRrP2EhWA5r{>Q(uyZE zx*3QyC;=%@;b{eG7+!!LM)g4a7Rts*E2J3o7l?I$_zpB+_Ys>~u?6-EAT}WsCd5Yn gM^bY#K!5=N5c(|cODtX?00000NkvXXu0jG}f^wK_6951J diff --git a/TMessagesProj/src/main/res/drawable-hdpi/msg_halfcheck_w.png b/TMessagesProj/src/main/res/drawable-hdpi/msg_halfcheck_w.png index 950d5f251129e0df273a68737e6950dd082926ed..1cb63687512cdad9d7ce744a6cec18f46783f9ce 100755 GIT binary patch literal 1186 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 QhS+{_VqrLRkiRPZUsQV1M*si- delta 947 zcmV;k15EtS4($h!Bn<>-K}|sb0I$e51&ZmBAt--;Nkle*^%B%m4;7iFP+|4dQ=z3X(43l}U=-AYzVuW*so=su)GRGE zZL;MmG!y@=b2`7_K${!e?%BO}wgZQIcgKF;^V#puIXgQ7@M(0-y#O*amnfw)Xanto zk41kC;B@vy@eqPQ)p!$Ma4u*gt*ysI4I&Wj+1{sK-&6Y-;3alB&-#AWV>v~@0_%Nf zp7kc4q2&S6(t5OrU5b;FbVa%Z9mK`Nfl8&~B1Q;_onM?Ubj&ykzx|v($sU^)?WwaZHtz#`!751_~ zAUr{2^vGKVF*GsKa{uOZ346I12!v;7$yBv0W8E73;B?dwfGyAHhXyM3~sj_!bBD?XC z(28u({V&N*|45l9sD+x`K?tGNIoBjBO+ziz%4!^-uDc;KEDCSoSi!W+C;R(&~5o=*FK9f zW(x_2PYETlad1W*4Ou)voGb8tVIH1$cF;#-gLH;H@;lkR9X!JmbQ^)VJ%vBIqQS@E zv|w3SU%_i>wLt1__+KS`fvCN%t^t-;yU)f314?M34`(U@!W~*-f1MjCf#t6N0|1hg Vx~3yF2HXGu002ovPDHLkV1j@Ay!ZeB diff --git a/TMessagesProj/src/main/res/drawable-hdpi/msg_out_photo.9.png b/TMessagesProj/src/main/res/drawable-hdpi/msg_out_photo.9.png index ccfdbaa277cf639e01999863187f24d0864c21db..f8f07f7fbe87d9681aecccdb224fbd29a1cf1e2d 100755 GIT binary patch literal 1625 zcmah}drT8|9IvPZnJ8)}pvyQ<5mEcNzI(Q^(uYPo7~+C+8jLQIb@&LNQ)0$cHXsT*P1Id^$sdcm*YAG6`+Pp%=kJPA zQ&vQT&k1KR7!lf)Dm^{M(YGWllz!&ihBWjLL#d5a8g8LH2!S#bW;_E0v<}3I>QTh( z%f5!n7>tP+W-wAlT{3LK9c(0sVS61en$2Ly61^_OWJf6=1GQpKIoNmMA_!n+Ik;Y^ zW)P}9hA<(p(6oV>6oxy2 zpdyliyD2$HdpaC~!==ZpHi{e*cakH?qSMClA}$WZ=5mN3OfbGtmQMG6hQl$2CMiAo z&iVh;Ck;Lq%F&}F?j}rh6)p3}nR>sWAaEoGScedHl&+!%$s*CA4>}#J!cA@m>ZG(P zIY>jL<2!;fkdT|Ncc*z5E7_FQiXDqt96nT;xwV7T1Q1`9#8nD~YCZ%h1QMY-Nvh^)gnX`8L%TgpG>;2;n8^PhB8PT^6YP(1{W7{l zH(~H~to!N7*#1GCbh-(8ckDj-?9{3h25-k-WjE}z6wxhKi}*s|*HTekeZ0LN zs5?4Y9)oW>2}vGc{bs{L=~q;-bp?@-2b zHirzZwlxc;Mbnsx8(Ne^1i8=%?A?I zvHP)_R&2^f1tS#v`R4ALo(JnopQgQn56zXoZmL=-U)+5rb%ESPxkRKi+iz3}^e(ad?= zh9g%39rLy>SibO^*&Rq{OZ1}U%;Msi{*r+bzhR*GN$WsYbX(!Ez}pY1u0Bf0MPHfA zJHCSpOn&CVrzMfEdiT0l-A=%$;OYBl+7kVqtJ5?5r2~e>ijbc!L(J6Kai?z0%*!lZ zcj5eFbwqvp-TnjnB1?L@;(zHrp}Cp5?irbv$qG}P-sZO4uUXpu={@R5NQRyN^@bZu zUS7=R_`7?zpQ}lUt;lJpbBVW@Wp1k9$UAm|8MgM5=}7w9+RvBVCZ1j1?|J^Bi9eX$ z!h8MfK|_~BTy?!nTeaOR`%L1B{9{ILUStS!YIwT8s6A^>RP256Do#|-?EaYYd;Z?g z`tnWgYUQ@dzZ>;uTSdj5*R7GwTOASqR6cKtLEV?ypWM|%O}mG0^c7Bh(PjN1zHQBf ZP)19C{)Eh3eP@C{d#yS}Rg;vS`!Ad^YUls} delta 705 zcmV;y0zUoO4EzO-K}|sb0I$e51&ZmBAt!$Vj!8s8RCwBAWFQaxCsyIQ%d;5q z$p`7CVTiGSZTSD6R7b%rT7P9W10?|6ZbnAN|12;LzeyBXhAvp(NRgwk*~`K}A+XRf zr_hA`q&aH-0tYi7l?lY&KrD()&G9QINOi?)Al?eZ(=Bx@PGM8Pg4;p%rOeDsU5XNl z3<7_=0t~DytPIouzyJIe{qXri!u=Qb6OLawUIrBEMpwgxP2;@z_PQ+0tX+D_`V69i zqEvGb2!PB2nF%r*WCzGDq8#;~;eV#Am<$648#@E70LW~R9U!}ibyT1bzYqhh0mu%J zT|_wwSa?XVv9QtHQD8fOb`cp;{}|{6u-SiwEBff@sQ*Md>OUPF^&h*V{tthlYR2k-7N zTzqnd;q}x1sUW-1)iJ^n9NJ_cC!&TT4o%Jpk&F}#xDN-&EaLesS{pZzJqr2uF! n)iVJjk`D$2;4_Y71PCwyuswKs#Ds1A00000NkvXXu0mjfXD3* zAP`4Xm>EdbXht+{8aK93ar%d^86u)Eoxug2(Zv}b=%n1P2*@9cyWHLHai7oU`~2O` z+?84JF>_-80Eo}YHdy#EiGR`r(fr%r1Ec&fhc#N+Jj%{`F`59hHmaBabDUTSVIeTv zhV>VTbO4AV$$TqoHLXB!$|=Ia7?IEE=Gg#{uJO4syp&+UVxoj}si7x71tE~Msi6Xe zNn&#A2?v?&r-?lO%6!~kimPmpCId|OA-sT-U@_3=T<2mCpBfs`MfiDmTMU6C5Vlke zy>-fJ$_4clO@IoKOo&Th7*r}nuw0>3!YQCs0!zgb{#FWMIigS^(o}Htf_Q7R&5l?M z=%_7zrG^|V>qf+4uh%Q`%0v`hB8F8eRaiqR74irnv%$q;KB0?QJf>hE7@Q{EEJ?Y* zup(AWc~~{Xd-^s6r`tl7I9O&}+{KJ0i%*-_hq=YDNFt_3FyZ*dSSHi^8BXUonqe)( zJLmsXpUL0gCd3wkp*%FsSJA$Bf~of#3Ij)DKuj22O7K-gv2_eF^1)<63>5Bh5-v8! zpoVy;$VS=_i7ZVeMU}8ltKy4dlxx$pdYw@z(aTU&q12_0adTV@i@9)Oj7z@bO5V#w z^fZC76rE2|>&BWP*Fmuq9PW<^{W7-2 zH(_`>-u?Vy{QM9uKHW5bI!?dABLN`Nmt)Z8`}&G8aQe{F)%};M^JYK2SoP>Z(T+p+f1 z(PJT0upsHG`TGZJ)>RGew(I|T9z@!yRg51z+??BJh-I>2b3luN##LDir zANTgAT)E=0+`G5&=iBLzYib(W1^170oTfZ9lY2aH`RwIXN*+~tq~+VrrX%)WPj?sD z?Z-dcTkygCKl%q+_HI3^nk2}yZ@CiPXO8-=dRbP4`a|)ek1xg6O6Nw@_kzna%Vs=U zHa(-Lp$pkp@fheeHUu^wuAdznub=u&OJ`%1wk9nr#9hliqnld&`K>_RtHNz`Dt0oq zps5wl#Jt^HS3M*>gkJAK#;pqS+AB-Q^mN9peUUiTQ;7$Le7W!)I z&wW)pknl^e>(6<@^sE4N>Y=m`UD!kJnsNO_92=LsebIp<(a2GEW%ojVVp;uy%vbw< zxc~QEZdEWe^s=g_HnKM&97O2#v+_`&pswS3pSfHAPw^VjGPu?Pb z9=bUgtXr!YUjMA?>WOAeD7jGi*KeP)o*Kyos~v50-sv?c;;i?2Rddvh`)8l8a22;o z0--m9b^Qa^o^amV?L#H~ozCDF5tZhdh{K-H94P9#9C@MUR!rfZ>Lful(W;p&yv;4? z-biG66Am_-b3Yo6-E}gur89pOwUwUMI3w9QW%t)WWE_zE<#up+y?=7}_nu>1X*jMc G+VU^*gJ|#o delta 688 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 JPDHLkV1n!Tu&Dq5 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/passcode_check.png b/TMessagesProj/src/main/res/drawable-hdpi/passcode_check.png new file mode 100644 index 0000000000000000000000000000000000000000..d9b4dc28d9af5d54f3e10cf3edcfa009d768810b GIT binary patch literal 1153 zcmeAS@N?(olHy`uVBq!ia0vp^DnKmF!3HEnbaWp8DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg49v=zArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XR4cQU}&OXZmDNz zYG`6%sH0$HU}&swV61OwtZQgwWngJ#XsQ4ONh+i#(Mch>H3D2mX`VkM*2oZxQ#zd*s+SwX`$F*!32 z#McCC@b$Iw%quQQ%u7!7bg@+e8ljh&nPO#RX5wsO?r7{}XyRmO=xSo&>S*d}>EdE( zZ0us>=xPGf>yn>bnwy$e0@Is<&`U7ud`zyg>jzIeJg zhE&`-bL}GMAp-%n1nqSfWm&EV${b*fImG&9<+l8$>=Itb4|mz`*K~yYz6hN3ZQZjX z+aH>~iZv>^>t-6JEsNkj!C2II<^DvrB{NR_dBu2g_C}w=R;?3KclRso{^??ntC=Uf zZujj?o{2%tY=)YSDn42Ql9QQ^9P((sA>kQd$)?OI)%&vP+l19>Y|Yy;nw+>FJ4l~* zX=OXs7&hU#{E7^TJ*hkAwsd!Oz1(+2@rtGBvF|s71C?f6uoQ8UefxQ`$g=kdUl!h* zFne!TLYv>K3tpXx8fzExi^@8`O|_fC(RMk;(2M8r+i%_;x$Beu2g)@K>hqM3y literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/passcode_delete.png b/TMessagesProj/src/main/res/drawable-hdpi/passcode_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..317c52c5ccc6428556069c6bbd45b883e7eb744f GIT binary patch literal 1266 zcmeAS@N?(olHy`uVBq!ia0vp^DnKmF!3HEnbaWp8DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg49v=zArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XR4cQU}&OXZmDNz zYG`6%sH0$HU}&swV61OwtZQgwWngJ#XsQ4ONh+i#(Mch>H3D2mX`VkM*2oZxQ#zd*s+SwX`$F*!32 z#McCC@b$Iw%quQQ%u7!7bg@+e8ljh&nPO$&Z0KZSYUb!S*d}>EdE( zZ0us>=xPGf>yn>bnwy$e0@Is<(CdU#FDNbK765H_NiE7OOHFYr%Fk5*``IcJw_7Z5 zng`XJg4->YIQ8lS9itD5S)`bT2?3K2hzU=(Kn^_Rr{)2Zdl4{Q|2?}|l7WE{7HC8gv-$cPZmXB@$Z5pS zOLn^bKr|;+#Au^w;mpXk;I@{&19pF%!#H~nv~Kvz6yYd)-KMkZiRqPx7f%)OR`6~+ z;PUFn{*9~mzJ0w#yI5n&%-!ri%9b-~>OX$Xbv;bQgvop1ghC;aiLXvgNHD1vJ-eM-JWx% zV(XR|7iVv03|G$Iv*VN2jF2p=aGZ0 zNTS=-2cZZ%f2lx-2>F{qF)SyFY(7M-T#2GlvIwnGB+iErd=``=Rj>#TJGuyXsf0z? zLFbeCN)D7Ojn%85Wc?O_Sf4LuN(d3*_%JPq638J$gxAVt3N@%@5nl6x=-zfrBH&-U zAo(o9pGgV%Tk#xN1>xyLdWe_|(D0#5B0vXd3?LX!Ap=wrnMwkvApiv=GeLlke{&Jg zXevoIn8b~K6AQIigj@tsf+UhgqakXjL|BzW0+>uDiA*6;C?Tjvh+3yWMA{IA+JByb z3#r8_sS=UG3cQU`lm!2M$(FuB!Eb^l{D|j=l{K{T>jQu zjU+*T<@{Hk$Ibt`p16YT_U(tz zlEWqSi0aKsuoXWwN?)9o)^n!D`M()5Fs44K7M@6IYKu6XH9n{crfBF1Icke~gn zSFPK+O79J(|Koo7E$eQ@<&%q#)w+KT~hcts-DT`OtC)S2Wk$LK8l&4M36IpYCl}+r?-E%yI@Z&y8x!Z}RCJrVc^=eUw z%DLu7cf0$QhWHtEr^iIM)vGKKnCS?~bY{ujGQI*h+b^GbH>ca=o89MR_9@|)x600J z@=zY2o=n?TrF)p^Fk>($H+hnwu&i33@+l}oU55m@dR(E|UW~6tFmS=fj zAt-_M57};OpLbhVS-;=gSaQB{H_mMGt_JGtE;tKyo{Ebz0D|&awN_x}X{t{^MJm*~cB%C!3>E?9*1$NK5C=8J;v}jx{&Kx9!tT2V`{K zO4(@o%~3{su*%#V+}~B3>_Tm<(j7mOy5f9_dqFjBxp{4An{+gFaQ}-|LF|SdrN%vt zi+`(*xruFdD6IdFb;{XtbjRgc`x<2E_%f?c)aQWjaL|!8nW4XmS|az@7kwJ)$nLz< zc+rW`zWPX1e&mMH&$b~c0@>Q+z~z$%4gDf*sKF;X~-_ye|ogMbL z@(4M0uy=DFk=}D`EFoeUOX1-{qku0S^D+h1WAFc;?4-*YMKk^ z-m&bgOxTdH~!yk9uA;tgz literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/photo_filters.png b/TMessagesProj/src/main/res/drawable-hdpi/photo_filters.png deleted file mode 100644 index 2bd619df27de73fe422a88e188c320af93c9d5bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1439 zcmeAS@N?(olHy`uVBq!ia0vp^@<1%h!3HFQ(zY7`DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg49v=zArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XR4cQU}&OXZmDNz zYG`6%sH0$HU}&swV61OwtZQgwWngJ#XsQ4ONh+i#(Mch>H3D2mX`VkM*2oZxQ#zd*s+SwX`$F*!32 z#McCC@b$Iw%quQQ%u7!7bg@+e8ljh&nPLSDVrOGhLvu?DXE#GbS73lUnz=cdySNw` z8kw59I>Pk2dBEge1WeaI!oO@`U|pQ=vzAtEB5kd}D-((QRmb4|^-lge+Uy$U({P4nO9paR}gy6>x) zwko_%dl1et!^|gV;{Bd84&R=xne^WAf|ie{$n)u4Dt>?EgzKBU3pnyJ*Rh(+P|3gK zQ^gc^kj z5h*rX)ZeLgBU~l+UQXO5;Yno=y*4>yb~aw-W)ZR5wJZ5xoTyt)zgh9g(DSr z1<%~X^wgl##FWaylc_cg49v=zArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XR4cQU}&OXZmDNz zYG`6%sH0$HU}&swV61OwtZQgwWngJ#XsQ4ONh+i#(Mch>H3D2mX`VkM*2oZxQ#zd*s+SwX`$F*!32 z#McCC@b$Iw%quQQ%u7!7bg@+e8ljh&nPO#WYG!I+Zscfb;p}E;=n4#QM>97ka~BsQ zLnBjDS4Ws$m;B_?+|;}hnBEkGUMHM-L1`hk0BEyIYEfocYKmJ?ey#%8&sLeZ-C}{$ zJgD9j+-|YNsaGH97=2L8BE>XJ2$+08OnABla^NXHH4m8Fi-74mfhi-9fq|*i)5S5Q z;?|n!z8<21BFCTes!1)keHfn>bRu! z<)!}C^#??ZJQg!We{oQ96z_5go08D=pE>lPsk}1l zU)xY7y`{-&0{_3p^9f&rgC9ms=o4Z*(tSW-2miVqTjU!h4VoNfj%(HlpK0P^z8_m4 z&Rns)cnhypHk)+YA+g`NSMvX6^=ZX17=>A!PGDdSJkst^=uy}u&1e1m=bjF|=!*)Nz6m>R3wQskdP4-CNazpA! z-ic!h^He{IIzM*{jO%o?aefrsc20JY4bX^UA^Q-c>G$tUFT81TtXT2!1j~|3uO()f zb5v=aT4uQFtaF8rZA8_9C2AA=w%ltlyriah=W*$hWj`7|{(k#1WM7C+(zTQAwOixY ze^I@}7InnteX+Xyfo%fi=Sug_xc=dGu&W-61jC0z3vYBOaGHQhWlvW>mvv4FO#q!> BLa+b; diff --git a/TMessagesProj/src/main/res/drawable-hdpi/photo_rotate.png b/TMessagesProj/src/main/res/drawable-hdpi/photo_rotate.png deleted file mode 100644 index 31e097a2e121f31828d04375cd3174119b44bbef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1430 zcmeAS@N?(olHy`uVBq!ia0vp^5{{auq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;1Ffc1;hD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Keo~drKfuV_lxuu?= zsiBF5p^k!)fuXU!fw8`!v96(!m4T&|p{W8CC;@FNN=dT{a&d#&1?1T(Wt5Z@Sn2DR zmzV368|&p4rRy77T3YHG80i}s=>k>g7FXt#Bv$C=6)VF`a7isrF3Kz@$;{7F0GXJW zlwVq6s|0i@#0$9vaAWg|p}_9 zsl_)|e!LNJ!esKM4U$hyIXk6-#N;&lU)Pr`+voS)ve^Ict2>|P{`~)b&gZ$GV^^zq ziZ!p5+;L#hypx%1N4*c|t+@J|S((jGfbpe5+BQc)@$%2l#f^Do6nJb>*6@YAEJ~QY zripou*QdAaM-K25XlJhIw04ZSbp77J8G+4A1xpkvSo2bjH7f+KcWjcCTo^ckyGB9l zh|>YB^b727xYTYponYy_d0>qIe+L_{%?9>QqCVR?4ovZ>2{OoB!ggH6V9}-+&dHgr zKh!REs`2b`G7HIib5b%Q*z-02qVU6fQRbFnuOIk4ezB!NwDpGZ4TbY_&wOpN*!KE_ zmhP>NxR#~CwsSV^Nam=C3d(-^K9J>IV|aM*-b}9GpQ@me($m$?Wt~$(69DE| B2Gall diff --git a/TMessagesProj/src/main/res/drawable-hdpi/photo_sizes.png b/TMessagesProj/src/main/res/drawable-hdpi/photo_sizes.png deleted file mode 100644 index ac8c781866c565a75086a53e66734771b34ca6af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1057 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 literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/search_web.png b/TMessagesProj/src/main/res/drawable-hdpi/search_web.png new file mode 100755 index 0000000000000000000000000000000000000000..900a5303b5c441d8ecda5953fe208a568a467e72 GIT binary patch literal 1729 zcmeAS@N?(olHy`uVBq!ia0vp^sz9v5!3HGx4t-t*q$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;1Ffc1+hD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Kep0RGSfuW&-nVFuU ziK&^Hp^k!)fuWJU0T7w#8k$&{npqi{D?ot~(6*wKG^-#NH>h1eo~=?wNlAf~zJ7Um zxn8-kUVc%!zM-Y1CCCgTBVC{h-Qvo;lEez#ykcdT2`;I{$wiq3C7Jno3Lp~`lk!VT zY?Xj6g?J&i0B&qvF*KNf0j6J(SfFpHX8`gNOrftYexnUy@&(kzb(T9Bihb5uTZsl3!k| z30CjxYvq|&T#}fVoa*Ufs{}MbFEca6%GAizz{T9u$jR8!$k5Q$#L2?Y$;rUU+05M7 z$k@=y5vJEAKe;qFHLnDwHwB^B7^hxPQpha;+U$~Alv$RV;#QQOs{r=0RVHq?7~nJy zsy79jv*Dd z_RR415Dk<#{{DsN)~0~0(8vh_PWr0its-vyOSg8*c}=|f)^TfRQ^s}XoJ1*+C4#nM zfp>f*1s!$YI11_YI9y)TK20_3%Y_eB%l}WzfAIKD@j07!J@S8c7(f4bw*H*u{h9A$ zPH%fV!(E%rbb*u(lWKz15B4@k{tCW#&1Da67PfH)>P=}}op9w_UTuQ>iSG~WnS)aq zGZ>P~3SKj=J|q;%WF^X9$ynB~bb-W^Cd~x12wuO&x|RN1GN;2rRv!9j9PsY&M>PYL zpBX$_S!@-`mbax+VjEN+tbFpiLLe}A(&SP`)gKMSUzz5vu$Xc3-Tus5u`J)0Y|{T?&GM{)Y5Mez zKr_Wn?A@FAyr=pe$=o92ojqsif#}0qcz(<{6c}~fuxg^FNue^2d5wNXxtAUvJslZ?fsU zS^X$d{6?wtY}v;LAF4&S%vDV1w3%^f!KG|F)kQDFU)R{GI9?43*|zKJL+R)28>ZjQ zXS}{C#yxxK`?(upZk?>1``gbuUv1eYtpgmYJnrko5`J2q?KqY$(s%1+MyimK(DvLZ zPj=1>n~`dBzZ8=2^d7{Bk~>UG_d_^P;>OrB&*c wzn-kjnbefBd;W{=pc|1Nn6Fqq{m&}FARYTSrpxf!98jg=>FVdQ&MBb@03=PCAOHXW literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/selectphoto_small.png b/TMessagesProj/src/main/res/drawable-hdpi/selectphoto_small.png deleted file mode 100755 index 7a023ec07d41d355da52905d8f3a66b2d0fe0da1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBSkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-%+=jq}YQgQ3ebwj=;1Ce8et2o&U zic*UUzG=xFsIK4%TmR_DlPsr4kKVj{6trJWZ5G=L?S0qFD)fK)3;bwxaPHl@O)FC@ zG;y&4t7b=LnQCLym4$yF1a3D_TeJ24&PBKE)y0>&zh3yc>(COWiH4dEffAVkCT>C| z+{&!8dM7gcZRKp_%a|%;%xYDqSEINn!XSBps@2~+3N1;8eQXuAxgOD>T~t4#BVLwEOM;(;@-VYB1;yW c`7D;ez+lm~!eWiK2GFMrp00i_>zopr02qRT5C8xG diff --git a/TMessagesProj/src/main/res/drawable-hdpi/selectphoto_small_active.png b/TMessagesProj/src/main/res/drawable-hdpi/selectphoto_small_active.png deleted file mode 100755 index 7a023ec07d41d355da52905d8f3a66b2d0fe0da1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBSkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-%+=jq}YQgQ3ebwj=;1Ce8et2o&U zic*UUzG=xFsIK4%TmR_DlPsr4kKVj{6trJWZ5G=L?S0qFD)fK)3;bwxaPHl@O)FC@ zG;y&4t7b=LnQCLym4$yF1a3D_TeJ24&PBKE)y0>&zh3yc>(COWiH4dEffAVkCT>C| z+{&!8dM7gcZRKp_%a|%;%xYDqSEINn!XSBps@2~+3N1;8eQXuAxgOD>T~t4#BVLwEOM;(;@-VYB1;yW c`7D;ez+lm~!eWiK2GFMrp00i_>zopr02qRT5C8xG diff --git a/TMessagesProj/src/main/res/drawable-hdpi/selectphoto_small_grey.png b/TMessagesProj/src/main/res/drawable-hdpi/selectphoto_small_grey.png deleted file mode 100755 index 6cf4bcda9dd6524f6fb059f12ffdc7da71e42640..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 399 zcmV;A0dW3_P)C4PO>h=Ouiz>u6))lB861j(=Wy!eAh;_CI(h*YLF)e?F4ESd z&1;I}!B1_V^&=@St%#z?D^pdxl9dBF(BFY-d2bK|L6*yU$bo+NzHfbo*2o?imtn~W zvp}lI5~N`#ety`X`exI z`RG}i$e|-LLRO|QTJJ*%Gj-ya8Rb3{gKEm-#WY5_F-p`NxyqpjGQ_x1j8><{pVP}! t8wrsP&Tkx>pm5*z4&*=%WVzk~3;^LAb&76j-o^j`002ovPDHLkV1jSVpSb`4 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/share.png b/TMessagesProj/src/main/res/drawable-hdpi/share.png new file mode 100755 index 0000000000000000000000000000000000000000..8b853cf2d8be3f60ff4e1b691907cb49676a8be4 GIT binary patch literal 1343 zcmeAS@N?(olHy`uVBq!ia0vp^l0YoY!3HEd6;(1o0wt~yCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMwS&*t9 zlvv ztM~P_^2{qPNz6-5^>ndS0-B(gnVA9%O=m|7b5~knMZjboy5AI-*BCc@x;TbZ+*)(Z zUxOu(;rPeM-Jk9|o|rFk%5!IdBSI>EG zXmMYcU#2IyFlOj+;8cnpSiy%`e%lBc}-D%awpt+)g`=*XW2P>zrG% zdQO%a^%$ir=56=-Vf-xch5C`~qun<}4{sGJ>tuYQ{nn*`wW~xiu4`ilyJ`-5;FrfN z`JV#&PbS~|{_%FlU6rzjksI4*&U@SZ>3a3lUmXt@ZtaO*Q?VtJ>(P(e>sRVo1(oiF z#NA~Q;D5DO`zopr E00!Ob+yDRo literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/sharedmedia.png b/TMessagesProj/src/main/res/drawable-hdpi/sharedmedia.png new file mode 100755 index 0000000000000000000000000000000000000000..532e67de000f6a3f3a6af77acbbc22cc558bb22e GIT binary patch literal 967 zcmaJ=zi-n(7sDRWUSNyF~MKJz=BXEIHyUvf6 zEg*2bz;fgjQ+!6sijuGmW)DrG`BqnIsFhhPvXbdO#-7BoVHh%Dnn8Y#<@5P`tRV;~ zf=C5p7aLK^4U%&O6$Yknd)P)Uh!u?v8ey3xnVuiP@fNafFe?)&7#kTL%QIYjq&ZO6 z{||MX1vo2Afm7u1lI5V8b<`rph!?U~JoxxRRPvm5NwYD?HDaGdVFWmhwV5Eee?mr=;gx z6`3Okx_HjDF1XuExv>=-k3?3XZ$E}s#YYa99$B)N=aN~fH{)8%bIC5{vLqQcZtP!; zo^KKN#M6as$zoxA=n}X4#Mae^_g|4KaaU7|t>{bV?AqnT=auA*7sKpsBC~pYGx6@q zR)6#0;K^y}`O&xQ>hXqidU*0oJUXfT`1tY-1wK%}R}#5jXZuQgwX||geO-EV_y=LG BEffF% literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/tool_brightness.png b/TMessagesProj/src/main/res/drawable-hdpi/tool_brightness.png new file mode 100755 index 0000000000000000000000000000000000000000..fe2ae06406a74b410dfafbf0f81fd326ee2503c2 GIT binary patch literal 1382 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBBuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFe_z-M3hAM`dB6B=jtVb)aX^@765fKFxc2v6eK2Rr0UTq__OB&@Hb09I0xZL0)vRD^GUf^&XRs)DJWv2L<~p`n7AnVzAE zshOFfj)IYap^?4;5Si&3npl~dSs9rtK!Fm_wxX0Ys~{IQs9ivwtx`rwNr9EVetCJh zUb(Seeo?xx^|#0uTKVr7^KE~&-IMVSR9nfZANAQKal@=Hr> zm4GgVcpgi&u1T;Y}Gc(1?&A`&!#LUpq$c=*n1U1ddK$bJbp6@JI`fjyk#95epUrsX zpk&!MIv-_C1UPhMfjHm7^GPqGj9 zkvB^Jr@dlYZfvENV)oFd)Fbme$4}$pgDGk3KT1qv*i+0_@?DQPv-)(VzwuM;j!aG? zWzm#P!S)los+sqlC@&52{rRYD&l$hJ`=9(@sd|5M!BPQhosPu6sm?LW_FtNEVwr?= w(~XB%*v5Us9Oq!&9*$$%NGHQOX$HTXoptjbj(4_`TMvb!>Czw{4~Dm5;gydXMo8mnI-O2C z(k=(ohiKO8^_m(^ryV2gMpi{a#;zL8C50d`L|xX93{}!p6b9fp@=-X`%_AsUSynZ+ z%7hC>X9SIA9gKOT5-=M5KU7i5XamK;cE0}<{>zY!Az} zvuw!icZayJC*0xodl{DN2$Z-%D2^*YMJ2AZ&2?7fnpRLW961Pd`7)5gI#kGwBlB{_ zT-b0$y)CX(ITxlPm&VD^W@Gzmzin0<^18N#ROmHy7GDYms{o zSETP>rzdAyuI4R0w@}Pjn|R;)`RC)&orenj#in03+U745t*7#B1!;EQyZlIDY*V>;AdCUKnYucU_A!uGL!C%|*sowO#K%(@=AJYIp5imgs&y|77K3Sb6zidD4<= aUaV>$>VBY{HU4Ukd6OfdzTk_Vi}^qPkzRQK literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/tool_details.png b/TMessagesProj/src/main/res/drawable-hdpi/tool_details.png new file mode 100755 index 0000000000000000000000000000000000000000..85549500b81728580800931531ffc022feaac23e GIT binary patch literal 1266 zcmeAS@N?(olHy`uVBq!ia0vp^GC(ZB!3HE>&Y9Z;q$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;1Ffc1+hD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Kep0RGSfuW&-nVFuU ziK&^Hp^k!)fuWJU0T7w#8k$&{npqi{D?ot~(6*wKG^-#NH>h1eo~=?wNlAf~zJ7Um zxn8-kUVc%!zM-Y1CCCgTBVC{h-Qvo;lEez#ykcdT2`;I{$wiq3C7Jno3Lp~`lk!VT zY?Xj6g?J&i0B&qvF*KNf0j6J(SfFpHX8`gNOrftYexnUy@&(kzb(T9Bihb5uTZsl3!k| z30CjxYvq|&T#}fVoa*Ufs{}MbFEca6%G}Mx!pO+P*vZh)(a_M<#KPFc(Z$ii*}&4w z+|AkC1g6&|Ke;qFHLnDwHwB^B1gBn5Qpha;+U$~Alv$RV;#QQOs{r=0RVHq?7~(V! zsy79AGwCL z9&v6Gdai$`nMU(=c4}BOZakQC#?($N(J%U;+MRP=Pd?ryTa?SSKJ~?9o2fi=dcpgI*V3~8=Zx~qZ<2A1vHde@ zR>)p=k^ZJTJ@w|*wpi&yyEa~Fb3Htbzu)iU^fupit5;7S{9dSbtLmBm`pX?l+SH`J zow>i)PjH%K5YItviI0D+cQDFFHD39#(%}$y;rl3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y2=9ZF3nBND}m`vLFhHasTY(KatnYqyQCInmZhe+73JqDfW2&$iPJ5Xt~kwu z>P^Av7E3prdi8;h(Fa8=QbfaqfT;(>geO}d2cGa#^MI+n2$-yUS@L`t7#P2Lx;TbZ z+&VJDU&F;w=J@?}y4it6fhT5uQ;?amY4ww1jT-8UWae}<7nLq}vO)a1t%j?fU!Ta+ z4M!a}Z8f)ySh%M7MAg2yM2Y z7n!=U5~mnkV0p3a#YTo%e*`>>R~YiJ{hzvNZJ{F5uY*z+jHw@3HYKoak?c|IXy)Ir z_}WpPv;&h~#5FxVW?f&$u%0bhzTqxUg>F_^wZAIXZU^rT?+F4|8q7B=ytZt$YLIW{}jO3rBx zULJfnr&#pNG~HS`o2DhsyHh6woIdKTJmdLq^JUo?3V{L-0?#<@ng-Z&q|NBvsh2{ z-t$-N1!JJO;C|JrAN|iO=37r-boNuadV|k0(EHThWL90p6FXG11%#%(YqjR#JkG5f z!l@{JyonWfNBJYN^U9F>3U9@lG&O&4AO*<+J-)jtn;Tu!fJ? Z2N=vXRPIJkQ}zTEik_~1F6*2UngFqd0Ji`D literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/tool_grain.png b/TMessagesProj/src/main/res/drawable-hdpi/tool_grain.png new file mode 100755 index 0000000000000000000000000000000000000000..39a73a1f75d2fa5a29e4788285c1b06694025b03 GIT binary patch literal 1039 zcmaJ=PiWIn7!PiYG1+7wqCJId423r7%i3%W%eJ;@x1!lbT3IiGY4Wy)EqO6{wOQRk z=4mPjLp_QAj)H>XK=d#XFQS*hb`cLddEIHS+kENT&Vw~1dGGu9{eIu~z3+SLb2C%D zJ)s_oqIz@FvP#zT!PnhI{(DvFkSrH)rik-s0arB_Qb_}qAf2FD2@EuKGf|xGBMbnm;{ZCsAZ5k3YA6KG^lZIt;y5_=s zZKj~tmh^ROR8g6u)5wK%oE?tn zQ2=N`U_mS{2p~-JQNVLi@(K|U6XSx&kI;>WA<S^}ic|m>@7}wPP3b7|&@2qhfQ{P{1zbn5Fha&g7 cK88GbD0_WP3rpEAJsTYBLDyZ literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/tool_highlights.png b/TMessagesProj/src/main/res/drawable-hdpi/tool_highlights.png new file mode 100755 index 0000000000000000000000000000000000000000..5530def4b9943ff05b0a4d589154730eb7b65304 GIT binary patch literal 1044 zcmaJ=O=#0#7>>w>D~|0T$o#>W9aLPCCTr6rtd6#6UBPsv>sZ;zEcv#^E%{>d)pi5% z4|E$kCn$In4=NM9h^HL}A~+9TWQspb#=zlWGR8c}4&s-t?L1gRlJAG-dEWPX-{+f5 zB~Lec4tNNHXiRiVX*?cuzdiN%e{1n)A0ApzEQ@;K5Gp7(Ai^3P1Z2WchCv!A+SvIw zppzhWQ+g(gvho>Gg$Av-7`kX!m`xC!T}4Y#M*t!R!LV+IsP(ydiqy3b)gO?3vK0k6 zy?fjSz2nJ@IzFNb8r5}*>@12{zyL@gi^izwh{X_9(iQRC-DW7V1VJMqYCEZ{oFb#p z24sM4_o_aYC3&7^{Q;h5+epsGa*PkZyqEQh0bb;SWci_RG+P@I(^9+~3$H>{4k1fq zm_ngI7usoP4>PPF2(AXlc`?H4jG0I&dQGRbq96fBwRH>W&?H?&Wf103h{Bm}AHlGy zvZhlm6D}B2R4j(2eeRJeKw17j)G(@O2c^MIzW)?gBBU><;mmyx~ai}bE1ToWieqoNHJBAkU|tzpmkjn+v8G@=i|Nz z%L*(T^LIqp4oUJy!v0`bh;&F5t_0P*0ZdfkYCBxECfBusVd2OUu=NW-i`&p3OGg&< znz_VcHTB9|t!6HTNO8kExN>(rzqZ;$Mp4_1Cm&lLD*erMbJu3oo>bpj xHD0YUf@?2zD^W&)f3NqR$dEBo0r^snusN(XOXj4{{UIzS3dv% literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/tool_saturation.png b/TMessagesProj/src/main/res/drawable-hdpi/tool_saturation.png new file mode 100755 index 0000000000000000000000000000000000000000..5d79e93f165ab56f10c141d1ec042d7d6ff89ac8 GIT binary patch literal 1414 zcmeAS@N?(olHy`uVBq!ia0vp^G9b*s1|*Ak?@s|zk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMwS&*t9 zlvv ztM~P_^2{qPNz6-5^>ndS0-B(gnVDkc=IrQV>1bx`WN2t^Xy|Iv4~Pj*wm=R%;iu*SQ+p9GS-<_Jx|@N4@t3EIV@SoV zJ=6B$dCx1HR7has(aY4gGt7y@+&c%~=aI|u@x`}8B3MnlV{m!ou zBjEV(c&wudmm=54$7|l7n4MyDQ`UO+?&_23+pF`__We$~zh}GR@j{*XVvKVau!b}V zR4_&sFwLu3dx+K4K!9EI!_yaUMSL2$?#{B>C|B@s#%*nnrVX7BbWU7k`cuxX(_}5) z82u^NyLiV^$1D90R&9E)<4Jczk5ZW4PvKK{+%K#Wo>SU+Ancfq=RVh?>ATOIZ^|-k z^Za?4`C06zRdGA>C#-vIVwc#P;CnV`ndgM$3w&M&RensYvApFr``8lGlULO9Gw*2b zku6v&Ap1w;#qtHl3G=rVNf?|yQEC+6nd*FBW$$*MP-k*6T6XdkquWz0 zAOC~O)syFy-8I_I`*PO$t?GBpjaT&^TJ%3-j2j+^WiT&I znDoivhVlL9lFKWuo%|QloqS#4ENgz3%8Vza#}+;M9r|ExOj!5##Kso816!iEOPpGK z!g|M&6;gYDDe4zKXB6AdB>TT+S%ukyybrk=H?ozMeLJjdkUpdG`?8g*%9>a=BpK9S z`B6~OGVjaIy){0$7s^*$Vm(*WaqN?-#-{QKyS^?zemuXkGvUO8;Qc&D9JE(3t-m69 g&nNETdIn~O-bZKMr*pnM04fMj$+vu3~K*B51{-K?dqLa?1f#S76fGI)@iUKBQYn(q#}5d=yr2sj9-eOWA-B z@N$(5<7Jp&v6n3^4Fowi8(=+^m5e9N6`O8Q#s@lfyNPYBjz+HHEAcuc zR76srVw1D8<%N#DIbR;ks@Y=|FB@fI^_rQtxyXIGZTRU^a@c?J=cO*;{LLi;+Z;u` z?UKK+zM_Io>;*O*3%BeH; z=w|&$&+_iz27lYxYwE`9;7G@Z+|IqVJ8s`PIFaA^xMMQUX?ljhjKA&j{$O7J!>R5U zeI4s(LoY{H4%STFzH+giOMG+;URXN%wIVS--Pimr!Q3e0&Sl*VPG5TGjI|TlM6&nL T@GG@{#J=vKV2yCE^62T`En0Vh literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/tool_vignette.png b/TMessagesProj/src/main/res/drawable-hdpi/tool_vignette.png new file mode 100755 index 0000000000000000000000000000000000000000..a6ac0587846fdf1b26776ba6042e469a444b807e GIT binary patch literal 1094 zcmbVLO=#0l9M4o_4ktKaQzsZQ@B`PRFKsdtSGTrlw=z3NS6M;CWy$Lr*W|_IZT(;e zod^n!=|zw3A|AvY^e8wG6g&tD6LIKCyv+$R)RXwqkLh7dFeG_jzu)iw@&5noLxX+I zP5YZDifT^uD=9Lzdtc*r@}FH=J41$jIF`Y~D2ofK1F5i%#vq+A)p3}Ds$RPI5_VJ6 z)~u1v;7szAtRa(CJq%kkZNjFg?w+EpY7-FCV{qKCLd@4Eiwte(A!bBK`jd7P=8XQb z1Bc6lX{|h=NjlSWlI||bM8JetrHf|Xa^+%(sp!gN?rn1nU4h_<5L0z3lN_R>$bq!L z27H6KeZfuBl(Gn?4u6-9B9AsvG)M|?pMR*rmM4smBpLW ztDWkOfy}d(@1NQ_N-qwNFR|y|+`9MbeXE|2-MRMm#O{Mzc2ZsTz^N;9KgwQbCt`!j ILS%I2H;Bev*Z=?k literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/tool_warmth.png b/TMessagesProj/src/main/res/drawable-hdpi/tool_warmth.png new file mode 100755 index 0000000000000000000000000000000000000000..2392e73891f595d34ae115751ee3dea3fe7ee7d6 GIT binary patch literal 1554 zcmaJ>X;2eq7+#KgpimFgQLrv6-~lAr94lFf5V8qG6Qr9o&>5?Q%>t3^Zroi+z^aHB zae5+xgU~t-IQ>&$Y>|SZcnqx!hgQd_h#HS6W_oDIk`Mp@LiHIKE{scsFJi_t;a}dfXPz)D=CwJziOJ_(R+a?RHYSe*^^~=M z#7V2Ibn9g@832MHyE%u?F&a>Up+r_cM&zcP0viC5Q`}A~QAF}!9$8?gRgmxWIS91d zR8Y3UC^0%UWT8Eyj3rHFnP#G_h)~*~l(k^88x;g7lDC3x%0Y9eTLq2jqQcz2Er!4` z2w$Xv-XxV{%mOtGOM(iKEP;@~Fo+-`Sgt@2I3AQrV5wLlyhs8pM->PvT?39kkPwZv z<)b*J8;>QdR8S$$J5jON<#LH!G7-ZTh+(Bt>DQ1-69hy8S4#6%cLL2VpHRR^j$rLh z-p>J-BwiNB-?pwamMP>PyFb39JI&G$cr zIdiF#6yqev6tjfTxcue*P)=0Cl2)E!%?#t1IK`|&hG)1!#tCXn2)HuaPTLq4w`vS; zG@^Q%M<20D2VKK8=5AUC1OgsA`ONUVOT3yYSc2FMuT9wL@A=v$tJiMLljda z%};P`Z@I{nT)!14rw|z>m82rf+@q`{CWb-or@UlF*qImJn;w z-i-O-tqpU7zr>>}c9v6Vrt?h_FO)TiCEfnPb5wgp_oF&`(f0V+FW7q*_N1;#xp@C^ z{S#=%y`gBTOqk~Vj z=v#MT7i(@UzuiNiTW)@Yuc-^e+KC49V?9pw4JAUiEwhU1&wc*$7xvrtG5!)ie>lj68RXy}7xMU+7A4LTvL2a&ivBT9E)%7&6D&*GUya(Nf zi(*}dh`&?mef-guggGg-@kfx#%R3v%n5zpaWx8dxQT;vTMiZ3z#eqXuLDbr%5~F%! z#qkJ09_QKd@MfA4iK4aF+JMp39t-$n=IyKHWtXe&#kR}<+AiQ5PDTv`Hm~j`y58$};Yw9KT9j&97ql68@*UpXD++k&iP*pA zMS%D0pjU7C?L%+N$lXofKi=@!{&`+;pA`6f)=)=NS8aaeFS7%81HG#~BA_io^6m7J zxUlqX3+}T`(Kqzxv>O+Gb5rs2*~+*p@_?tOs#eyRT-}a$41{Hc^6KccOPhm2JI$Bw z1|IK?)&3O|7S}O7#oZj8_Jrsf4Y;)I;Vj=D;X9g!bHfiJyE>aAk2MZo+?gH7NuICM zUmtEiSsmv%H{65AuJ_I;&y1OSW8_+D`A$7*+Dz<3T5iQZ&0avC literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/tune.png b/TMessagesProj/src/main/res/drawable-hdpi/tune.png new file mode 100755 index 0000000000000000000000000000000000000000..ab404e6a52ecfcf401895529afe9c49f2a23226d GIT binary patch literal 1010 zcmaJ=PiWIn91d)ZS)2$eI1zcvKpd?3)27)P7H8VDuCR>JR@Rd=OJ3KoB`-@}O*Rn3 z+YVkQvWpi%5OjE)hjq z)LoWmxadf2pr-vFYTF&OkBjgy-+v1GN}WBNt>#BDgSTIVKAHktSZ#q=MsP-7#Q6m1&~DSe7Xz#+A(2cq*l+`6SQhgmED! zgkEJ=oq8v9qH+grpv(X?Y*vgjBeI>hZBvGvov-feOvY6Vp(hi|^DE61pz{+{RG z_t}p-p*xqGe);qBy-(FrBN)7Yy_~*F-)_9S(ct&j-YUm$Rex=r>fP>t{oyLV`QX+0 zy}r?{-P*><-t`|l`S4Qp&hn$v)f118SQ+vC?~TnEN9}$+dc{+QqFYTBax?0~O!ej; Dk=#TI literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-hdpi/web_search.png b/TMessagesProj/src/main/res/drawable-hdpi/web_search.png deleted file mode 100644 index a73acd91c77d4ed70c4953e941dc8da0b349bb3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2296 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 literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-mdpi/doc_actions_g.png b/TMessagesProj/src/main/res/drawable-mdpi/doc_actions_g.png index 069ff82afb622e1f2e3db762dc16097644e82c4a..1c1921a82ba7df0389060701b6de77622e752e62 100755 GIT binary patch delta 323 zcmaFK{*rxz8&iy-fvK^ZlaZ;Dg{irrp{t3LrJ0$NrK_Wxv!ki8v8A(;LPc(YudkI$ zesXDUYF>$_i>(q+L@y;X#R{s|442-?i5|o-|m4e#>6I^;H>oGf3 zs#hxqF)%R1db&7%LLKW7{e?M;7?d^E_AOgg_EnHp{t3blbNBViIJm)p^1rwqlt-$_i>(q+L@y;X#R{s|1ee~)i5|o-|m4e#>BV2kX>oGf3 zx+>_(GB7a2db&7l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)yMv>2~2MaLazx}9J=+-@<%X&zK> z3U0R;;nb@Sbc{YIVv!;mCIn19ASOK70y*%6pPC0u?M1+3?OO9+7?>sAc)B=-RNPuK zC7Q3vK)|(ob%F3M_Q1!?1|J2*UmL|V)csn$fYE--z0S)Pire~HJpDM{p2@Y2k&4Xb zUBtgDA^l%Br$yu5#sGeqx7KMYYgC@jV$Qtaz$0ffquE7qQls|ufZR7~LShS798go( z^i-y+J32ybjf>OK_oaeS56)StM(o;|-#OJHP3xK10s*D$$k*A6v==-V=yCDSXsq0O z?s|LG`8#^&_vuUjG72u(Jb%I6-rAqCm%~`jOzS>2&9`sbRVnL)t_hi;X_se&rJD7E z8P_&E%sG)`@AJFFKKF9A%Eap)SFRoXCX~QXxN!0lZkt{1pt8Wz)z4*}Q$iB}^5ug1 literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-mdpi/edit_doneblue.png b/TMessagesProj/src/main/res/drawable-mdpi/edit_doneblue.png new file mode 100755 index 0000000000000000000000000000000000000000..494f4f85a70a721156eca906f8ed07b2dd5b8469 GIT binary patch literal 1259 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6K!3HEZJa-iaQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS=07?_nZLn2Bde0{8v^Kf6`()~Xj@TAnpKdC8`Lf!&sHg;q@=(~U%$M( zT(8_%FTW^V-_X+15@d#vkuFe$ZgFK^Nn(X=Ua>OF1ees}+T7#d8#0MoBXEYLU9GXQxBrqI_HztY@Xxa#7Ppj3o=u^L<)Qdy9y zACy|0Us{w5jJPyqkW~d%&PAz-CHX}m`T04pPz=b(FUc>?$S+WE4mMNJ2+zz*$uBR~ z1grP;werj>E=kNwPW5!LRRWrzmzkMjWoY1JXl7z=}2L*0@Le~pIn-onpXnTn}X15j8iWtDdZLaZFWg5$}CGwaVyHtRRDY0DigO`fG)!2 z7Kq*y+-@<%saGH97=2L0B1JSz2$*_6On9;da^ML+H4m8Di-5^m*;vhlfq^mJ)5S5Q z;?|nUXSH1dMGmCvc}I4(vU2Z^jEM4!+^|ux%g1fm$Iuhh9)w$i)xhgQtLF}eJp>Kx}_$&VsA z(dKfFHJ|P$PE=nYYxPiK7W0wWyXx6z9=W_=c1O)gE0K0v$%aYAmp3p5YGh>^J$mDwncIF}?QpwPo_5Ry=i&|Fbj)T(Al4wa9Rq|8<+;>WiYs*E29P YEMp3L&3-@iJE-{aboFyt=akR{0NZE0s{jB1 literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-mdpi/gif_search.png b/TMessagesProj/src/main/res/drawable-mdpi/gif_search.png deleted file mode 100644 index bf910aaa5149b1bb00bf2ac86e7788bfabb17719..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1583 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%*vS|5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s04fdYT{^VXJ2$+08OnABla^NXHH4m8Fi-76cyW{aX z1_q`@o-U3d6}R5Zu+0c@6gYmra{03pl04#z8JW$dJ!3N47%b2eqt_dnWzDVK?aY#U zMP#K&QK&(zmbQIxX8K$9B_5OYo^^M)C7r8yUZ21xw`ueC-P`r2w_AT`e*A6k-JkpK z&b)imXY^Apf$yvj=We{RF6$7fs%+BTol`oVOs;iy^s%v)x@ z$%ot=a;Q4$3Q9=gwf+ z`Z7u{BWP*&XTkl!S9Pv8tyehrL2c=#O^ZJl3Z^bRn~`i1=~Q{{=cUrsWW-aDt|QdspSqHF_ZJtCy6MqURvO~p^mxyfar(Fi*>h(a`ah!ZFNOw zPFZ$M_n0MT+5zhV$BX;YEVoT%$TW|+v}bbf-+hetnl;aUme)Q0P03-p()67-W-|N# zkXW?YHJs5iFJ_>ECy8KDkk2r}jxU>-?I%Nv}`X#n+k$71f>omiJ=+o*P}qU9#4T{h!+# z68COZ+LHFu2V$1&i&Ou$$hmB9-HX?a3JM$?Oic|64qNs!@i6Rtc19KR&C*=m}`;nZ&3cDsRetjXoMyj_mQUXn|ej3)LaV5whnxqI52ZSJzW z>yn1J&3-6rnTTZ{oFJVqW3xD`)`>FMRyM>U3JyhZU?DKUPp+tJN})d2Hq{ShA3V5w zp8xawfB)Ct|E7AVcQf5FONOd!UQgHExj;mZKA~c3|c9n~~FamWv2Ztp&MErK` z27yarhn3ob274}!s8KE*F1Vy6jIlQyXAOi)c^LV*1Dr-zRM6BCo(B3#E z34C2e9|;i~K@FsO@Tj6f+~@K+1vl{GfuIZcfR_dxIOPT&((NIE#|bFL9b|wH-+Tz< zO%;cjJ}$oL3rQg&uj@sIBuk}|tK@Mh>M#j{!650TNQ!bI4W~9P>wMWMYlrFVLIYioKR{5OnkwYAK6 z5t4mSQ^r&Q^<(Hz9gJ%CXh()3iiUY!l~7aoQBD!Y3Q*RQT!=t7E>RL0;16&CijDy< z<@VD6&=eJpdFhA`gd^@C1?o1o!*cOh*yp37afv-6*Z$Mqjd)KA2#~4kuC>S=>!zx zs#3t$3(QE{1VGWjoCiYMDF{P3r`O}5ow*_4cLJE>1Bms09~6mAy!d|#N1}j8gCYN6 zO#KMa(AaMA9|>C%1Z6ZfDw>ajuZ}NZn5jF-g)`-!a;s}=UAI{Cvy-OAckS7O(bx7n z9+-gVsV@R-+s@mk^1ot-FW)=*%EN}4&!2D{F$1gP)Y}&=+3ZfoGF!XE?qe6)vA+h* zOS^{g&)AtCC+>X7R-ZmIYg*}wOj5gg?a!Exx1ak3UtC;1{m|@~H`RVWM`sTt_BHf2 zd~$PYX7sBBpBCQxv@LI~-4zE<6~nci4`{?k!lr5yx6%ZI)eaJ+o|H z>CZ=2IeOx>9XG#d2A#o4$v(U$G=i2QK{G zF3&7tq~lujZuP=++%~xT7IyjA$%ZQ*eQRDx=l|^XSFcH$oeC$69X diff --git a/TMessagesProj/src/main/res/drawable-mdpi/ic_ab_share_white.png b/TMessagesProj/src/main/res/drawable-mdpi/ic_ab_share_white.png deleted file mode 100644 index eee5acefa2bae9307f3adc5bc2fd434445861509..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1297 zcmbVMZEO=|9KX_SnCV81piGTG zp8xOv`upF$Y-XsZ`_XQKAbL{6Tn?|mdhhGPU%ghljh8+nQ80EXC8Nq~h=>*y0fAJ7 zA4NID7pEq^L4yQgACvM0qmUk9MWsUVmJVfBRE#Ew!LX_F;utc3fJP-bMBe!FED5Ay zhL}oPB3V)*gyptJTNQcvd)?za@j76_tr5@f@KwB zEJUsZRY+$+T+tBlQeKznh6BJKq@WiL1mJeSxS@x3duZr!L56h)S?C3=hs55rVu{Uh z$(AoHg~+mDs4Puat5vG%p%iVDhQVNvb~7}?xUhyxpOOvUbjkXbwgnF9q9&<^q{zUs z$P3D(5h8J zdZ**vjw|89#gF52T>tv!w#fMX&2Zi9bbPi>cnTco6sEwmZBsaPz+U*|+%vZ3hCNH$ z9kUzfhzZj1HgPiyetn=hS6{MwFW8<0*KI;#>*?nryL%e5^+TH)f7x!n0;V&mJB!_W zoaIY`eY9>q?D*|i^4oaS*BKRkPF>DKL2C-!H4cO2}vLV*{L&fC?*x%$(w+~KL-|y0U7xv`NbLe1q#m23L3tN$(eZ| zz9v|MudkJ7UU5lcUUI6Zi>(sS2))eA6e}kua~C&5BMV12Lm+T9u`n?+b2YOxGc|TG zGd6HEhv{|6PcF?(%`1WFO+o0j#HkmQ7IF)KHoK%2WtOF;xE1B+DuDfLm5JLeW;o4* z>P^Az7IU0>^?{Dj2gNK>Ov8kL$p^%Qr&}Ngp7K-kfXTfGn67iyESwF@6CXTX978H@ z-I=_XugO59)lsHI#m`{&j2Dj<^}l+wVEqH_ADdrf3rJ4c@seq$+!r1;u5D9}9GP5` znV(!Lr?E3N+Z@E6V0*~72IclYORjvy;Ut79= zjYtLWK1=4ikCLW#M#S{}o;+{HER_W2b-5;SOIcXXu=j)-{gbpWWiotj`1soTY&NEI z%*U$q4}K_pYHQhKDe+?8y8rcuA`e&1>^!-vF>qh~QZE};35L9T!Y?fEoOuK)5IkM| KT-G@yGywohqlY~J literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-mdpi/lock_open.png b/TMessagesProj/src/main/res/drawable-mdpi/lock_open.png new file mode 100644 index 0000000000000000000000000000000000000000..689f1901e5ad66b6c9321833ac341d3b75c1584e GIT binary patch literal 1152 zcmaJ>O=uHa6rK`OYka}fU;M*yYHdU_KS`51Lt~p}5)C?OjX|R#I+?j`hIW2BbNe#w zLTUx6743r;v{!(2^DHV1RU0Z!6YQgkq+ts01pVeK8ZAxixK;(5@gXi?(B-TMTt$Wh`*SfB+X z4hqV?5fdC5NoS>zeuE|;Pz*^sN2&q^;qOpYT|`?j1AgWEM`0^FYyc_)EPcq7P~&== zoKOZAH-QLsGpp+Z)hhNBbf{Ye-N55<+%JfdqB-`Cd4eEtDb0eSCV>2CH287niTeb!I^|P-GsM%D+HP zn!1Y5pP5r?=Mt-_x4@Na=h9V^OQB>ar?bCxy6QsX<7^k_78#3^4>UCHCYtMaW4Fub zoA{jKV_Ew}{%fVu;aYQRv+u)_H{G4(RpXRvaH}tL_U()q^Y|*?CpQn&ALVD<6P;z( zc%^P|r*FB7S>api`qV$2aF>o{mWB&;YuS_2FTwWur=yBFjcG7j_UdzW*nEDdhYUQi(Kwv+LB@ E4;-m@v;Y7A literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-mdpi/msg_check.png b/TMessagesProj/src/main/res/drawable-mdpi/msg_check.png index 6f92478e4dedf61abc07f3c243a63dd839d30bb1..2fdad7a389cf444efbef518ab9e8d31320ba8f54 100755 GIT binary patch literal 1077 zcmbVLPe>F|7@smkMWLV~Md&eJ65N@6`)Ax8-E{t}?m}y_F1d#yXJ_8JgU-Bh=50HA z$n+3+2=WqvARUD2(xpq#A;N^Zc8abYf-XUH@L<@R{bL=(pkZd-zwh_^zVG+GZ)19D zvZt%Bi(#0aY(~w~u{-!W+UfsB_2ySP^pbRu%-}MqX)agXY6hZ>~`m^Xf#?7hR>;3L%cj^R-%y zt3^5N&hs#tOa>g0NQhd5yk(nce#rI)S_~@kbk}r(nY>gx19$^$Jh)$U|Rfgz1XyzZLx zQnW=C>s1TcB&()adcql|AwoGK#iDQ+#$_oTgHTpvH7&>q7*!&Qq)xOrj>E>3G*qO7 zB1?%hgz1pii(Rgg53hfi>(Tnu3&<_ z3U+`pBY-QjrfuMwHyB(`BU=@@<{e~AxYz=9eMR#a|NqXrfi?a|GoA*+2gUJMv9z{m z1qRcj(x;1~=0P^?7?-xjT>sCvw5_OOQo;XRIygKWYa6_``SAX$2W$E9Z-ZyIhJM^$ zeYBC;15UddKKK06nVluEbF1{k+g^*mvpbx&k0aXp{`uY5!Q{(}PfL$4?`-b-7j}P* ozwa%6IrXe_k2fa!_xhOA-OQ&|c_edd`)<(4+4Pk9LY`ay4NNIjA^-pY delta 239 zcmV-K}|sb0I$e51&ZmBAt!$Tz)3_wRCwBA{Qv(y11W%s7)9=@ z&G~`25yWOBWCKtk8<5%##7;mQM2rp7po*963_ZD?iGb-9Kq?uC_W^Mt+z&trCy+bQ z6h{H6b|Ah3#1TN#e}Vnrw#rNeNM8ct<3Q{Qk^mV1b@xXgwgQUXff)q$G*H1(ARA=j zG9Xv(0OG?y4Dzf4Q1K~bn^~YV$bAw}O+G-(4GIx-#VElF^}_=o769TbpyKIRLjt4$ phJpT32jU83F?7sGYSI7*FaT#vVIU~Yj(Y$A002ovPDHLkV1md&UxNSu diff --git a/TMessagesProj/src/main/res/drawable-mdpi/msg_check_w.png b/TMessagesProj/src/main/res/drawable-mdpi/msg_check_w.png index ab1c1ba59dea734125f53da950d5d1762d8008f6..f2448a0a5a0669117a77bfff3a1f2f872fb8f215 100755 GIT binary patch literal 1061 zcmbVLy>HV%6n7~?Rn>xkr4$Jru2c~qcFswh#H!o+BcYK zK)`?m69@@Lma2$_KL7?6Ky+h9Ff(>V2&tU&Q5dQsVcGZP_xt_cd-vYM#qy=`(aBMU zVaAIKdWFto(Km90j@R1Pztiay$=ApdZjg@QBSx`s9f6`_te^@qto5~RG{Z2%4ZB(+ zwbEtD#13afHeBd<6wNR*bD?LLtB8O)TCrW3-Ff?t1-2!#%jr_0!wnNXqx4k88!ot7I&q0Dx9CAyA|c@}g{$g0ftoT`-;frfnq(p)lbCLjc& z$iY-v6yZf6B%r`2=qtuyN=l28kOBRNrE0#_kScniuSIt<+a$!3c)ru=aGfNF{S_YO za=C~@5aQG#9;~~>2;*)rHDJ(DVEVR4Z0v%F(Wv7#ky+|#F9gRcmG+3;pr0t3GCnjs z9&!oZaiX}o)&Z%YKW^-69aPsn#8*&&+rCNfqcJrA)7%{_6d6))q$|EnFU4r-*lat< zB}H9k=^xIrEeWcEl1jo1Osh&h1)-{`dR|nsFsTWeq8A1n`(e{UR@IV9Mpd$T2=gfw zCUiQcv$~*W1PBM%q8kvyHPJxVrn-Hscpz5Nd}I*pS21o4DqyjR2@aar1KN@Z&Mn)n zg*!nkx}ILNI`Zw?$SU~Q0p0vc_CEUmj=P7o{wHTVb%u|MpBQV}7)i zjXg3ZzkWWvcK(4q|NQ-{iLId<$IBl+-FeIw;G371bzBn<>-K}|sb0I$e51&ZmBAt!$Tib+I4RCwBA{Qv(y11W%sNOk-` z+z4iYY#@NyfOzkJ2nZxb!yKsMrC{e1P+S33yccQ{T!Rx3^P?$_f-1fZ#G){95TOFZ z-;hm#8t@Z{UqR&=kTozs-3N20E)ai!8e)d-Ol%?X5s3c)u^%>nA#*@}cn{T-i7Oz` n1=Jy-A%ipI7)ebU009O70>ffE?+;Yb00000NkvXXu0mjf1=2^p diff --git a/TMessagesProj/src/main/res/drawable-mdpi/msg_halfcheck.png b/TMessagesProj/src/main/res/drawable-mdpi/msg_halfcheck.png index 2df5738e658aee8271f31997a0300301e54d93ff..010da7c5243550bdde777b6039a79f508f02d568 100755 GIT binary patch literal 1073 zcmbVLO=#0l9FI(j4hs`KI4?djkZr6@UfQH)0iueRI8 zO=Pfx;0{h@B0GrS#hV~_@U(+?)`Lecf)~N7!hGq+^e`qElDx0q@AvdJdG#xOlq zyHqCS!Zq2%PTUAF@uuTZHp7ffG(E#yLIhOMqU~nb?{D9+z_v2%yjb81o{DPr)S8dx z)}~A5+LD>J*okp4)|9D$gNOl|&axZG%?#VpmFYa(=2*~zkfjXUcB)*M1uFIt5aWrM z$wLSvDGrmOB*76N@KE4*`bsgFltoDvQlRs&)S7Qq<)W7B*rKZpTO-7iIj+%Y#2bk? z_7^#rPNzc+L5NXAELe4k(TuslKvzLSf$7^Gv9Sw6MWcf2B*Riq+aWk!p>Qbd2AxFF zlyObN<6xZU94Cycg$_s&{c+<+bWmFL5LZM2uKOmvkLo~|Omla5g3yb5gV(D(t3Jj-* zrB4@!&4XOpF+OdLOHXt}+sepm*;4a!<=4T%M9-K}|sb0I$e51&ZmBAt!$TtVu*cRCwBA`v3nw11Xq^fe7Hf z+T0I_oj`0xkS+p>&4APaAbt(Rs!RkFs{pAjK+Fupi9172{$jzSSQJQY2VxK%4OF}j zB+i6GF&mIt4a6WDnt+Oz!Q^l`X+99!1MxDT;(BBW7BrK!fK)6HM*%U&35nva8qT4F7LLk<~7t;hI4jljl7ywqs Vasj59>%#y5002ovPDHLkV1h&wRk;8F diff --git a/TMessagesProj/src/main/res/drawable-mdpi/msg_halfcheck_w.png b/TMessagesProj/src/main/res/drawable-mdpi/msg_halfcheck_w.png index b1ef529ff129c1184510a4426279c37c951fadc6..d5c1888a9a4eccc15137eb6010dc0eba163c5410 100755 GIT binary patch literal 1061 zcmbVL&rj1(9B)E`NFedo0Xe-C4q{ll*KHkZD6?xjS>guirtIK>u6<(-w6C^rt`K7k zCm|g4>{TzucrwPsgVAUrM-N{72QXfU2X7?!IyUq`FtKU-etkZl?~nKWZY@@>j}DIy zGYm6Yn%4|Ej>O;4ApPHJ-`=CcWun(f6*o!83=pH(xPd^)HCK>Wd zlY04vWMP*xV+SiEVUNcP07%TJzI1ovn@h=iRU|=4%bO>I9TCf zE|-fn1R+5YiE!N`W|Z*4iN1n{LMw25;$RQNie>}1iOf<@k3w+$a`{-;3ww#8DdQv4 z=OLHmT{n)aiw=o_{I;^exh&ND(+kr*zqdCzh)7+hICo9hpVi5^iHm2q zpS_>_JUCtdk-z$AbNBJnu_uGsd)r?!+680hg|a>N>AU#myfN}&=hZ{!5_4{u89(?{ S**hce$BkRkE85G#^5$-K}|sb0I$e51&ZmBAt!$ThDk(0RCwBA{Qv(y11W%!NDY2K z`~`^jF@Q7>z-B=F4Tv8CF&iPpDnR@Sh<^gH6WBF)6pI4!?f(!E1rx`mm<@;zKovJ4 z%i+?n6smYBx*WPfEg)`(D&7mV38#j3XlQ`IB_QU@lzm{#uXUo0);@V ji!U9h8A(kV009O7aE@Wq3cMl300000NkvXXu0mjf@eo9% diff --git a/TMessagesProj/src/main/res/drawable-mdpi/msg_out.9.png b/TMessagesProj/src/main/res/drawable-mdpi/msg_out.9.png index f8496cd473efd16589bcf973251beaa3d58df89e..f22c541f7f9087c833dd863c6cf07faab5c1d58e 100755 GIT binary patch literal 1693 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 delta 518 zcmV+h0{Q*93&RAEBn<>-K}|sb0I$e51&ZmBAt!$U)k#D_RCwBATz7dE10fKkoAw`< z9G`I{BO(2a#8`q4BqZ#|EC1>2^8YMY#0`Mh7>K2Sn3<3z3l=!Sn7@JeIS`)(T6_^% z4at<7 zr9nPH4=x&%!vBVEDNOT9tLab*Bh7t6rzR0?EI~Gx3Dn>QL0~)S$De2dvnvJsiF&2brRTHVl&D?oq&0DA>EvkW$c>;M1&07*qo IM6N<$f**nKU;qFB diff --git a/TMessagesProj/src/main/res/drawable-mdpi/msg_out_photo_selected.9.png b/TMessagesProj/src/main/res/drawable-mdpi/msg_out_photo_selected.9.png index d38cf29db3c07756f641436ad84f2ff50333ed14..734f94360235f60e0dd1c52861cb576eabf07148 100755 GIT binary patch literal 1474 zcmeAS@N?(olHy`uVBq!ia0vp^l0dA+!3HD^j~YmW1WH^ZN`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFlT0lM3hAM`dB6B=jtVb)aX^@765fKFxc2v6eK2Rr0UTq__OB&@Hb09I0xZL0)vRD^GUf^&XRs)DJWv2L<~p`n7AnVzAE zshOFfj)IYap^?4;5Si&3npl~dSs9rtK!Fm_wxX0Ys~{IQs9ivwtx`rwNr9EVetCJh zUb(Seeo?xx^|#0uTKVr7^KE~&-IMVSR9nfZANAQKal@=Hr> zm4GgVcpw+N&V>IW;|#G>p}U@W>N<`k!bC47CYT=J7k zb5rw5JY8&+fJ*gJGE=N9O`Tng4P4Be94%ee(;o@Rx;$rG#W@c_-;phs}>zP+v zl9-pA3e%g3&})iUua$FAYGO%#QAmD%4lFSQWaO9R7iZ)bC^!cjDTHU{rR0|vgW?J3 zDv&!Q&(d{Lq`(}Q&%TTS0gu5 zV*_(HXCywow4pWh?}^jV_zNJR3Uu4k+8_`vkhSFw&!PqD5}&nzq~jm^z% zQq9-j=kup-e{U~wepdR@snbf<2&tVr@Q{eyq@Aj@f9y8pdV&=@B+}u2M=FFL$ zGdnv~&Kx{;j_ZoPf|9}n%i_LNy*ok^{1+I+ML0BcH*z_!yoi`k+40~PKfj)#n3z~v zR>UDLv*-Io%)D1{O*otS^Z18;wP^~oPm5%S{E<)5-dfx8NVtSiD(X`|+q6HuGKDTGUAm||k8{eE13&KX??1q19D3;O_4n}(kN@p;-qN}-cisK{|JT-k zd3CWoD}u?0Jw^=;?n|Lg85_el zd3gU(4?+IKGw=VGXDxZ!Z7-|9QIa|1$P_ zn^)bQ#}sa|@R|0BgfK%*H9pf=vA7`Jouxm|KMz0u?=Qnm_B=l4-Nifs-v2IhF-K}|sb0I$e51&ZmBAt!$U*hxe|RCwBA?A>3?KnN5&_Ws8u z$7dYLNJu{;F_z#1jU~_U%6~e${67m8aRVSW24X27W+r4weUB83`5TCz1Myj)#TSv) z04;%s1js-SC3%@tQ6WKNb~ZLiMn*G2{xdESUA|(pSlr2qdJ z{xeY9M<_ml3DF|JP%NQEkRhANg6=h%1=oN7|Nm&v zXb@Zs0})*RXb@cgMw9R$O~Q=y@ChRwGh^|VP)3@^$?$0sF+kg?K*1k>|NZ?=4GTc# zfXsti0&8>q_|9!SL<{!`XuukL`Z)`q?pZeFV}6)PHdV zWDdwYjQ+`vMeNV5eSgh-`|{{{UcrAFOw0^yBo~T*8Ge0y%XH(#1Ev!vwzI!LN?j0; zQ2*`Uf<`V--)tKY?}o$|8I2T3kLwqdjmV6X{5H}ii9tKA009O7`2-v+BGRUz00000 LNkvXXu0mjf@e}i* diff --git a/TMessagesProj/src/main/res/drawable-mdpi/msg_out_selected.9.png b/TMessagesProj/src/main/res/drawable-mdpi/msg_out_selected.9.png index 06f6fe053163dc5ce65db9cbd3541e1353e603a2..7e29c8128722f6f25a2b4e25db9c0de61d09850f 100755 GIT binary patch literal 1694 zcmah~drT8|94|r?M4+e}kMKB(XfmPg^@Xhz=!2FjWnHO)n+A^dpf_l*++C%TATQ;y z5sPtb%9zrPsS9Mr%}JCfh-_kD0hIXK9KzK22)YG98PMAm0r_Kbm%IBt?(_M4pTAs< zCRORPGI%A8M)Of6%eB1jv%@WB14@b(xWCO3lU?ZIQu7B)JHK(~44c`l39&(7;HD2jXlZO27mY5MVRqn{km%%$U;^QFGTeivi3* zh&(alwNn{t4Io1?7~nIxF?u!#0s;XOnK@N*e-GUg9C*li4oLFG~Vo=sF zLykx*SIpa@R$_*cAS@yltFW+;S;%FgSS||`3WY8W4kv~}#Nd0(1Z0abB8K4#8y6BDqEaUlcdv^U0#p#c7RY3?usMt?z6F+A{dR`Q zw1~zDE&Rs$|J28Idn_y`4~iM2+M=1Dk`9S9G?52R*U4Q z-fDu)gi0=EP*A1;F^B|Q?j{*1mrEr=swhc3sc=)QLJBH`Y>Au$N~H^2l^G`>vmRdH zB5$~|w{k@?42B34)1heoLNjQLD1qWe)B?!TI6yjLHlT&Lt4@?xEM7-|CM zQYJ!{Shrd!(;Nv~AyM#oAcxOS;)0-rw~3!56((^Md@egyA!E!F4NF3PO%(nQkwv+| za`nfOep%R}n$R^}?0#yocz$3rm2QkW9S&C8Z5nM^uSzb_+3sXRfX__TwOV#reZUE} zW?9z+-pTW>zQ;YVZhLs7d;KMnB!dEjg2*4U4mFDVMIOmN(@uxc@w%*MC~(oEduw7@ z(kB({5Ki9FZSAy#%u0F(Envgu%^L@Ps$KW$8EHS35cNm#jB)(gpDWy(G@(NU%|gS& zklvmCZkJM2Ah;JR54vwm_4O4XKu%6}U(v+mU2aqC`ZeEt;l+<~+5`Mok2(~;dwZ`e zsOX#SFAX29ZXmU-(b0WF7SHZRQcIGD4l0~$T0Y$uBH5BX>(~1^Sz6anx^{f|wraNT zyHx-(qlByIXxNs?S>*#dBty>7eFBoJgu^BjV!&kzCOy!Xx`kDpC72K*4&H$ zvYH(mmajUpuIcs|Fg^%Q(jC}PXKBsxvcQerd8-FzcGrdW95zQRb3guJW#W~r%2fyG zj;~~iohiR%)cQOMY!Z(F?M{+ZlJqh+JTwh#694@uqDyM$NmC?Oq|fO>?D4CX%np(X zLr`~m)8LJWDppwW#K`rV-}*%Pz2_zO84JN4b&aHlCy*I;wof&;o_>GQ@BFUlGtr~a zz0Rr2r{as97tdUHg6t?h)px99-!;z|sewFKk)|7g@NetgG3aKFyl^D=XoED!nMZj7_4?lup#>#Q}-h+lS6gc8~5{eqLh{k*NM z&4;TR6wcY{SJVAyK~`jCjaEtfb!r92eyeQNTJI9l*)cNMq8$FtKN!FhA3EB4sy}uV zJ6{wI?r#r>A1=b4diN;rS9Xt`XzM8Nb33x)aq{TpjIVR{4!3>jxY~F&Gk#ZcT*-7c zJ2KKe{IS<(BiHRHd9$N<0v&mBZWw*%>|b?96^U0pPELi@nLS1YFX)lyd%c4ir_u(x lX6?5;daDJ=v6@nUpp(Wb9Jg#4;MrY&3{_I9{CjCu`M;aUj$!}+ delta 768 zcmV+b1ONP<4Z8-ABn<>-K}|sb0I$e51&ZmBAt!$V%}GQ-RCwC#m|JTTK@`W&?5>GW zXt6QPrL~|4wG}K91O>(PQThpdQ+&{>Z+#U4wohUotAcO+2wKu$(KO8kY1u@LiBi1P zmRv|_@YdEeJL619v`IH9KYoEj3 zC5fW>#jAH81p$K1j1_7U;F!%~Icdb&TibuzPcXewdN&Hyr9q@slEgM6KuS7PkLbw} z0>s#g(4Z%k4MLStGP*S3Z*&B0e{dRyqR)|kd}&%}e9`nAAp{!=a-^r{G*<8c)oo$g zYN6@~HrNsSUaPym4|z2;Yo+YjJ@D zLO#55byUK&b8$~r>O^R&0^!BkE2DoRR-1=w`BEoBUjO{~(rcIvc}e#22*UN|;Oa;? zKKGD81ScUgGy=GhKKElla1v!MT_-!HANOOxMF#QzV5IZR`Uisi#-*v<^fnZ%tQ!Hr zbeJAA`OaAdvat@yY(DqQ2oR>j^eTHwy^ku$Y6j%M)5!F4E)~-23>!zsN0?|1)2nRv z^+GjAd=uvM@iT?nxpX+zX2FL95lmV^umXiodEsUDy)YNPZ%&{0tm*or20xxMWoYlE yFq)9x+A|rQaW_L!N!FAo;S##0Zmfa$y-`;?XajHF`#=7_-~adjc-K?O zGoJe9dV(N4iGDGS_ak^6u04qVk#EQD;H?S8b0}kuqP%QFBBGij5F~VY45p#1&P*-C zZi1+8)v`I1lLiIF)cvyS<1gqIMiWGLxM0c31Vms2j%h}S{QmqU2{biC4sjAKSur@S z_0QTcGn>pRvl9xhlHnfET@WyV4v`EB`lR6qg%G*PE8w$xO_5;J1xnim)jY=0z6PeDqX@OV_v`Mm}8LoY56Cg=K!f=pmC@>+0NKE0^G*t+6uraoi zk470b$}n-ZD<0wEyeRU)pcsh6*$P%Pm1!LssDf2@v9W!z?kwmQjx0i3y9m`j+tk5k z&Vsgw7COd6S+0}De38AiY+=>?wM6#SLSZqK+u46QUAe;J;~sbB78^U04-Gu-HlFLB zb?6>`6OR&NBwKhp@_S<=Tb4eRgHCv<_KyV5y^+ kN_r2hm3mvm#8g$|F!8y+>B6VEQrvyYiFi_c938&=7iIQcUjP6A literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-mdpi/passcode_delete.png b/TMessagesProj/src/main/res/drawable-mdpi/passcode_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..c1ccb443b75d71db01a3cae82a360e68f119876e GIT binary patch literal 1157 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

    tOJKqwYBmTQ|)zG*M?*dH+THM!vkCmrFM) uoQ;<|YCeN``hsTvFGv1&wP^ejPhgmGH~rn0B|CdSrJbj%pUXO@geCwgqxAd$ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/photo_rotate.png b/TMessagesProj/src/main/res/drawable-mdpi/photo_rotate.png deleted file mode 100644 index cdfc8530116fb6e990d2c1e397bc4b125f6eae17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1175 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRx!3HE}ruUu)Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS=07?_naLn2Bde0{8v^KDjP)EVYz|dIVz*yhVSl7_V%D~df&{P2mlz_GsrKDK}xwt{?0`hE?GD=Dctn~HE z%ggo3jrH=2()A53EiLs8jP#9+bb%^#i!1X=5-W7`ij`p|xTF>*7iAWdWaj57fJ{tG z$}cUkRRX#c;)UD-xUqS~&|m@vn0`fKfxe-h0mw@*g}%P{mFDKcRTq~8r6Sym)!^cg z%7Rq=pw#00(xPNw#HA^NtSYc_E=o--$uA1Y&(DE{Vn9ZINq%ugeu09svx0_iVsd64 zh_4CO;OlGUnO9trn3tUD>0+w{G(s;kGsVi#&A{Bn#KOqZ!o|SQ&=nZqj%IF7<}NNq zhDN5Qu8uIhF8Rr&xv6<2Fuf@Vy~a58g3>~60nlcb)S}F?)D*X({9FaFpRF=+yTt&f zc~HG6xZPriQ?EYIG5VmGMT%*d5HR_GnDBH9#PaC~{Q%>0{q1{Y$6pX;FU=J0)mJz`pyePbEDxR6laPk?$!kU3P8THNEY1 zZ_nMeOn-l8rs0&JW8$yk?*Hw$x}GiS&*a8fosF!?6TT-0gw21`I>A{gZF48k}-f}4MOllS?PDpVbc3R{zASvJDHicFV?vl;~+mJ=ciJ!*wJEvV&jYg%X7+W9{VkxaXr<@ mGBfw|T8IAfhq?cP8yFd4r^@)gZH_Vl6&0SYelF{r5}E*%4~-`P diff --git a/TMessagesProj/src/main/res/drawable-mdpi/photo_sizes.png b/TMessagesProj/src/main/res/drawable-mdpi/photo_sizes.png deleted file mode 100644 index 34d1d2ba17b3e637ab3270cfae3d56b1f6aff824..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1017 zcmaJ=J8aWH7`9ZXP@#eaq;@(vDgr67W2a7PtEMDzN+aPYO(PK`hB)@Maa;Rb`%2s{ zJi4?~5n|}TP`bdx%4=u`7Njl}WhoM{@ETAD%0L<5oF*v)!P5EeKYic#KW{0YyVTv) z+eJ}ScXmW6ko`1Sr;c@!|IeNNKC<=TObL&naa_|}NF@zafgo#X6R-d^V{YaZ9Hgj@ zkXbC@l6qOvk;P~MhVdY)gMNp%vlZI7uWZs2i z^SPovKc$NXJ#+yK`VtYaAl86yP1~O2%XD2=BIn?mr9mBnr)2sdsFIooY2-p6FhWF+ za{VA7GMvEm4{%|?N4Xdqjj>!T!tqj6lsEx2KAL!Qjd7`<3^#lcOQx$BI}*#*YBi=7 zV~{(+a-t}*QJ&@b2th==IU8$!#P&i>1qFJ#YdY9OHV7283Yx_-O(H!=!E#!%w$~^V zDH!W(4$CpoAf+ZyRsRpQtQOkC1$Y?mKZU*GoCDbc^w6xUlg5pQ0#}ZdcAl6HM1nC*LrNtwJf9HK;(!w4xC|+H zGCrJ2C<@Q5K-atujbRsApq{g2wvQ#*Re@-LLCMA5NiDwkF?fvG LOip>6D&PJC?TbtJ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/photo_tune.png b/TMessagesProj/src/main/res/drawable-mdpi/photo_tune.png deleted file mode 100644 index 9db5621e4fdcab78e76400979f1630e55de8b1d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 994 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 a49pBia(6W4)=E}@icwEjKbLh*2~7ZS)En*q literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-mdpi/selectphoto_small.png b/TMessagesProj/src/main/res/drawable-mdpi/selectphoto_small.png deleted file mode 100755 index 051f23a6fa94693404ecb30ae7f2b6f0e1b55072..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i>J@N{tuskoK&=l_3uW?e>M=H7!V zSWC7#h;(dc-e{$(!yvg&yu-HP2B$0A6d%naiyUfR+Ovo(Jbn2}ftRjAhJ~t_K&r(~ zF$L*3FAv*Y4E6&43`u@j5`AZzlvX_38=<3kvmnONM7UcuMY2zyZ-VYb)$0XL6L~g2 zF`lwcLH(#;Pytug51XRT+=g968YkcOEDnA4VLOAu0fs569fu#@OsfF8k-^i|&t;uc GLK6TY<5}_m diff --git a/TMessagesProj/src/main/res/drawable-mdpi/selectphoto_small_active.png b/TMessagesProj/src/main/res/drawable-mdpi/selectphoto_small_active.png deleted file mode 100755 index 051f23a6fa94693404ecb30ae7f2b6f0e1b55072..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i>J@N{tuskoK&=l_3uW?e>M=H7!V zSWC7#h;(dc-e{$(!yvg&yu-HP2B$0A6d%naiyUfR+Ovo(Jbn2}ftRjAhJ~t_K&r(~ zF$L*3FAv*Y4E6&43`u@j5`AZzlvX_38=<3kvmnONM7UcuMY2zyZ-VYb)$0XL6L~g2 zF`lwcLH(#;Pytug51XRT+=g968YkcOEDnA4VLOAu0fs569fu#@OsfF8k-^i|&t;uc GLK6TY<5}_m diff --git a/TMessagesProj/src/main/res/drawable-mdpi/selectphoto_small_grey.png b/TMessagesProj/src/main/res/drawable-mdpi/selectphoto_small_grey.png deleted file mode 100755 index 0dcf7670565c3409531ea46df71d30aa2c4d8660..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i=u^K@|xskoK&=l_3uW?e>M=H7!V zSXmgkxAM#~&7P()A&TV)Yi4Gq`N~(!D;`!i-eB&SyF$vvqwO_Qq2YzEmsh4SiXHyF zLhR%b3BPTuN2L6wv1YVQe`qYDJd?@vGxJI}g>@`hfBae=-d&QmB}L&J`y*Y4!xoyR zGAt4oy@MAx8aIYW3A|@clAqvz!c=B8YlMy`!=trNB>FBhnRxGGFyuFhv-0p2>G`20 zvp{uu!xT+{^XyXdT*BHIBOCb7&#^RapCDB;qj1Y9nSWvoED{W>Oja)VsKLGh=raaS LS3j3^P6v4 zq}24xJX@vryZ0+8WTx0Eg`4^s_!c;)W@LI)6{QAO`Gq7`WhYyvDB0U7*i={n4aiL` zNmQuF&B-gas<2f8n`;GRgM{^!6u?SKvTcwn`GuBNuFf>#!Gt)CP zF*P$Y)KM@pFf`IP03tJ8LlY}gGbUo-h6WQb!1OB;3-k^33_xCjDfIQluQWFouDZA+C>7yetOgf{R2HP_ z2c;J0mlh=hBQ8xDWL1Hcb5UwyNq$jCetr%t6azByOY(~|@(UE4gUu8)!ZY(y^2>`g z!Rmc|tvvIJOA_;vQ$1a5m4GJbWoD*W89TX{nK?Q+I=Z+S8XCHqSUMV-yO;nWLC3b_S9n_W_iGRsm^+=}vZ6~JD$%Eav!3!LUb z^`_uv@OxBTE$E_I{7{xtZ978H@ zCH?sS-=2Bm48acDh96b}^(>D{9du4RG%-dw{P|+96><28gN*=llBS8FeiCm0%Of70 zNB$j!Ra^r58>}kjCw;!pxY69M*UzDbVbu>Uf!&OT@&eUNg<1l$8?Q8q7%>-e3gojr zl2h2m_DE0RALG>+)+38{=r9TPW+?vV^3rEbGIfe$5nTU2xk)Euk1&sNfX<)eLc7j5 zobd?x!{D3guvu2@k#=K5vxI)boG2FFBYYVzwlRJTU*WjbL8tFLL(C1nj_*#qJ2|_G z6`nCANh|cRC*?Y^9Vk!|uy2&wB78EHzv0HT8$BxgN4Pg0xfU2yv{+J%S#I(q>3D{Z ur6wDDm+W9@@mE|`;y3HnniVaU!KbLh*2~7Z=Jb#7& literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-mdpi/sharedmedia.png b/TMessagesProj/src/main/res/drawable-mdpi/sharedmedia.png new file mode 100755 index 0000000000000000000000000000000000000000..cc21392b4ad14af17e28581e471d2bec0774d8b4 GIT binary patch literal 955 zcmaJ=%Wl&^6tyTqsA>g>O<}{}3aLoM_Be^tn3$4e66y*^Q5vaU;@FeKO6@WB1Up%k zN-S6)@fon;2Uvi_OKf;-yW|I0u&o5+G)Y+yEZg(YIp^NF_sr8~)n$(3R`qSv zV&ld1JAaP-ul@RMvEd4>nRJ(QX>5gIVm z!Adbg;suP&aiy&!uqQh_9 z0i{G`0v@IoNW6VNQWK4z=&Edb822uiXXP@-M;#{f=xgtwOOdI=Gqi0*p zJ?V6ATeg@RAN$PhA+z2=a;4fLw=;P4M|)F`h2 literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-mdpi/tool_brightness.png b/TMessagesProj/src/main/res/drawable-mdpi/tool_brightness.png new file mode 100755 index 0000000000000000000000000000000000000000..bc83f7365b40e55ff2574795734426397296444f GIT binary patch literal 1250 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gjk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMwS&*t9 zlvv ztM~P_^2{qPNz6-5^>ndS0-B(gnVDkcY-ns|WatEhhGvF_t|pGIMyAfLF6Ks-u1=1| z&Q37BF8Rr&xv6<2Fuf@Vy+%0of|5dR0nlcb)S}F?)D*X({9FaFm#s2!y2a5Ar+HAl zDY)HYfK#tN&@uX;h((HMm=G}afSB-P3*^8Perg^twHE=CHAm;!Vg?4rFi#i9kcwM( z!ftyp8w$Mr=IVXv{)9yuN!QnZxP9f4{KRQV@wva%FYW8Pq?b4Uk73W82Od>=l)gx3ix-NITy*(`-vkHmJ3H*xbgCWQuCn8}ma6B{FAA$Q zxmI106H!!k^sZ6r>wKQzJ4c{j)%RJ2dYo%kjqe?<`5BXSjsK(_)bHd@a<&n8enjwF zUWfa$bZ5>bQF4(V^j%%&>zs7)xN(YQmdN`J+Y1uUBm{SVy>Hq1@(<5BUzLM$X3ZDo zd=cIfZzbNh`oyCMndCQTmDMX6&+d(=f2{h+#A4cU<7@62D~_;#WHJlZ-JuqIm?!$h z9rc+DpH=VK$zP|PlI2(X#$wxr%8U!U9_*gu_*!#m#=_51S&|E$1%G^&)%5?T=~|Zd zBfUx64_(!K+r9owsYlmN^C%8B@w(?99C9W}P5OB|=|fJCY#oaPL)0U$Eo|aZ9-vak M)78&qol`;+0L&e{)&Kwi literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-mdpi/tool_contrast.png b/TMessagesProj/src/main/res/drawable-mdpi/tool_contrast.png new file mode 100755 index 0000000000000000000000000000000000000000..ff596a32d2cc30858d282d2dd2d003fcf9737125 GIT binary patch literal 1036 zcmaJ=O-$2Z7_Q1hP$F`W=*6bPD8{wxe!8_`;JOZ6Ldn<`*~P@J{l+S^Uu{2JnU~?k zzr;X{CWadlPwK%$6XJn07xlo&lZjqT3|>sUX!PsYh6iWU_WQ~6Jn#Fx@AKWsPEGXn zp6n$EqAzn%%HeUq`wkt%|4VQ0&*0$%N*7TcmQhu)0g=>T36L2>nFTqZXp7gjzz9Jc zp!7l!73E1mg$Av77}_-~%qEDDG1pSmIe^F#nAOb$_3h0jMe16Dnu*Fm*-C+mez9hQ zd~K?r*5*`RqsB(b5m&$h20#kw8uO+jxCyGEE8w}e%}`_mg60y`Zc;@#OQxU=$S55S zs6mz`IgVx{QI2EJlc69RVuJYP0&GNxazZFZHXjN{v$e92lg68|@G3!75V8b@saC6W zHB3W$mSK6G_cTJG07e9yMH4A*z;ygA1qnE+ty@TkCg~|ECAfeR6wY+_2!_>`HJxUe zaKRW?u^5&PdPiyjW%>V5!)T)&lmmPD{!`c~ELwoc0S7MFDsEia?}f62lnoRF?E-}J zttw_K5J9H`Ei#qo$g?xLsllo<+`!ASkTD&km@3Ff2?{IFx~>U)gcs9%OcYr*#cFH-^a4+Skgdou^BK#O;r({`m50X!Azb zCw>sDeIAV;3x7{fW_zYnQOWnJpWRML%Uxf@+aweMJ5F1K;5ld(^w1ne>$OLcDVG54k2rP5=M^ literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-mdpi/tool_details.png b/TMessagesProj/src/main/res/drawable-mdpi/tool_details.png new file mode 100755 index 0000000000000000000000000000000000000000..758b1be91ff649ac51fd086256d9020921e5bdfe GIT binary patch literal 1128 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9Q!3HFy+4N(8lw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6H#24v4 zq}24xJX@vryZ0+8WTx0Eg`4^s_!c;)W@LI)6{QAO`Gq7`WhYyvDB0U7*i={n4aiL` zNmQuF&B-gas<2f8n`;GRgM{^!6u?SKvTcwn`GuBNuFf>#!Gt)CP zF*P$Y)KM@pFf`IP03tJ8LlY}gGbUo-h6WQb!1OB;3-k^33_xCjDfIQluQWFouDZA+C>7yetOgf{R2HP_ z2c;J0mlh=hBQ8xDWL1Hcb5UwyNq$jCetr%t6azByOY(~|@(UE4gUu8)!ZY(y^2>`g z!Rmc|tvvIJOA_;vQ$1a5m4GJbWoD*WS-2WnxVRY^I2jr`8XCHqSeltwxH>yp8k<=- zn;03o!t}c2Czs}?=9R$orXchh;?xUD3b_S9n_W_iGRsm^+=}vZ6~JD$%EajwLsy*U zLG`BKbc>-IPQCg-$LND17Ac}(Lcr7mV#1RxkONQnsd>QEUIa|m>sqFz0<**&PZ!6K zid#uP{{R2q_kT*WY>$J}?8e52N&?2l6WISTZM0*)pdc`h(X^6via$>r<5lKMrx}Dr zm>=~AaC$58Y;0Nem*eW`2AxR8sWyHsj>i{fX(uF|nDoY>Mt+q7Q@^5Mfa&*zRR%mx zVP6TWH%>7*>|mtf3x;metAHRaKz7)V6eFTd75~_@a0*Od&XCb;oEcODD1BN=KEH z*$IO+ahoYHw!t3ehd#9Qr4M6t9fQ&i*3Kbimxm1kg}yA#E{rmEgRzvAWk+e8?qQyg zbS`|~_y7O-KhDC~=yU#_z8-=g{J9Y^kH_8K_lOVwSDsluhlgHgxaf?d38yMskVvVh z1j(E(Pr^Ku)#;O;!9jxPrnExQDN4`t3eqF8hl$j56SE0oaHwX=N(DM(2~KK;K>c#< z6N=PSfjS(Q7|G1QvNkef!SR{Vf-+N45-K(HEIC-?v49R8nXKt244bbB)P^pP=iW9= zksA=FB2f2}DoSHy23e4dN1|bc0f6MV2#Ccw4unXS0W8hnmkWa!ALn>>fZTj29L-WE z_`I0ijD=SMRdyVcr|D|78mUGj$eN@9iVSCze9->No}Ac{XbOKx6rnehY#}oPhq<-Z9+N^ zZ8T*mxN#HxUMQ2#SWtG5RY2%O`xM8@$U$})nPg_1BcD2~87ivUPjBEQiO(6fBO40L zi2{WcBATZ1DK5)#i2*hZKpcSKSSp^0rUApIMJ64MX0mOrh?FTE8cv(5KHy?}2d-xY z-NcbaXlbuNHESWA+$fpXI_JW4)Z65$opS*lxin6O_8R-IMz^=Hd%WqEZSi8u_|U*^ zx3I03?vy!#=!)gURH1gew6?xJ)ZO({@^oMD1@VU{2>8wAtrs7tYWB zMSv%-egVz$cO=X9&aNH09DL)(j>UHtVvCR7`C}wx{ruy6oiZK|yyjcYB}3Bn6*_tE zVRwDy64CsAHTiM3d&Fg~bh&qD*MiG)W_o_-=OL!PFYWg&Oeg!zD45^L27Pa){eKgS zle0zlrRLZEtgq%jpdL#24kp3T=Jwu@n>lu1*SE2=d+I4T`dHwbxssU>!@HZ826ib| z&gSd#w!QnVww9S-<>m7WH<;$1UwwMK(K_ecJ$2jH|9ax`wgLzWADs#{vf+9vNM0w1 W_m14#Z%<^sJ0&+fD!!jSKKBoc0F})E literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-mdpi/tool_grain.png b/TMessagesProj/src/main/res/drawable-mdpi/tool_grain.png new file mode 100755 index 0000000000000000000000000000000000000000..abf87a45e99526628c281d2497efbfb50433337a GIT binary patch literal 991 zcmaJ=PiWIn91a_ZD@=COA^6BH3O31W(`drtY@5ynmO0zPdR&^kwqZ?POx{d7kf9Eo zFfZFdJbClz!K(-HBs+ zFys21R;J@b@|`_H|CfFpnRK{7N;Oi!4HB6FV)8bwBcQux6P1x^ckb?@X@(hPoobEL zjCsYvE@vhfE_Qv&W|--j*f*^eL_i%i9ZzMyzj@07$5z>;oFN!~5w)DTwE$Jt7OK|T ziY43Z%ndLdD^$Qm#00V1_Ch6A*{-fa=gBtDf-Z!tsO(8nHDeJJaezRM%cd;>LLf;T z6myaUuY!yKGrT}wDGfy>Cn=e0p!cveT3|PnvNqd`MOP}@BE(mCK8hkP%5pep@=%uL zL?e?)Q$#xKc*Km;UO3fP&`@Xvj!zuyfke@)<5i-vG}DtKxc)%a3wvdv1>=pI>dhUbzUs@LP%!*daba(S8z zpEUNbM)$Xuf}`zKSxJ1qm$=GzJ9rRklH*P z+s!WDVYW9OJlpv8{JijP{bGCnXRZC?@!rA6=KZnVo&6^1Y#(lMAGFsmpsoMTO8nN# dM;{3@vCKTJ@2r3NoSILroL*YcUKN%f9s>X#Jn8@d literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-mdpi/tool_highlights.png b/TMessagesProj/src/main/res/drawable-mdpi/tool_highlights.png new file mode 100755 index 0000000000000000000000000000000000000000..ed936c7d6be16833d00c37d9456226a99fd6c236 GIT binary patch literal 1013 zcmaJ=&ui0A91ok0F*Ybeq}#=3COE|=ef^QGVOedHb}N`UyXtz9rO8_xw&ca+&1O4I z5y6Y>AX8+AA%ft+i{iz@JP0a?UOf31=t)FGLB@RP+RlSDBzZshd_Ldr`+h&~*6hsG zK;Lj5!!QGdX{AWV!Qkudq5n(oZ_m?Vh~&y-4lk0r<{~Cz;0gi-ORJ(H(u~zBZ_xz9 zbhBouOv>sxQO6di1sKk^9Li>xiL~!%`Vu0bf~ux1v0q>8u)s7Vc0Q>_RYyiOb9&81 zb89mteQilk8EkqIO!y)dun^IJZ!O!N=u2!vSETb`n`c1-LY5?UKdG`h3uNpfkmTYK zJqjTZ1P&&Wf&kBeSQN(iD1C(pOo&NAjE#Zj!_sK3u_zXmd@~kZNoz0TF+ z9CoWbOr=tRMl2Sgh={jp6U~p<-bhP9L7wiK4l%I}0!6KYSBS*YO!tpqIc-_nYnF)? zjQ2H%hg>u`QVXc6|A$&u8|{%II>`5*!d_|BL3|N;c*WIe;}%DPP>v|ONF&%SVZ7X` z;%p5Q?A5RX)xpbURA|{?Geq^Q9+Sds=%41Atn;z!Z=LjvJj>q%q6nf zd_s<81RTv~%;%dMC?v?!Lhs$<&hE$4`OE7M(uZGdzub6qcB?c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMwS&*t9 zlvv ztM~P_^2{qPNz6-5^>ndS0-B(gnVDi`VBu`(YGG;VWN2t%Xy|Iv4~Pj*wm=R%;iu*SQ+p9GSqCIO-ps(jXzc0Y7*cU7 z>CgZF_RPAB!pyw~8=?u!E|7f3b0mHNn+SuUw1Bv>WS8%n)(Gw`6M6pgn{ud}b9CTg*~A%nphGpHYa!cI zK>_B*d@f zk^92ce+)@}F+UyHyq-ImJ`sG#T(b55ho2AB1vUrHsN`qb$gC%Cv(V|~h3@q$EZi18 zly%r686Wu2(QVTot|ROXH>Tg1Q`6MYxF9C4Z#j>0Mx&ZQ{jubOc1gU)!*5tV+QFVdQ&MBb@0OOaDNdN!< literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-mdpi/tool_shadows.png b/TMessagesProj/src/main/res/drawable-mdpi/tool_shadows.png new file mode 100755 index 0000000000000000000000000000000000000000..62adb55d03adf3186ef4d11b4b64ef676515545f GIT binary patch literal 1053 zcmaJ=O=#0#7|u2wb6Bhsr1ccDp%ZM=q)lgIyRL0I7g%fQitE9{^7C!Yw&aV+H`^6q zqA(`@;LyVa54(9&1o5E45IpF?$*!Iz>>>)D1X0}l(zTrjYe@3_@I24^e((EyH*(o? zuI^*q1VOmO5h0Jq9_Q=o#QzKHcgFGHMd>0MgOjK%S%65WPzI!^OH&{ZBz6AMI}jy^ z4oWK&Q86>hD^T}K4#r>6P0S{UXuM)d$_zlH45lY z=u-j=Lx#hCCd7rq%xRJhFf1LwZ`j9#crMJd17!W7a5PJuFyD9vngxX z^)lgt(G|(08GpbzQUjRD{2!|8O|*^jU@zZ)3fqNw6VQ2J!#PXAjhpOsLYaKZ0uq8& z0m9iv6>}wspk0C{nHmd|{o|UU!m@p;hR#Y=}!lLP>^+ zFibjhCX`GIVKx~GrW0HulxT1TsLbiWKnC2`f!%IlTQA)FaRpzAWl=~JDj(&a zJ3DJ9-SJ=N2Z_($)qRY|z3i%vib+{s z?eTC+>z%KAHWyf?>lNX>-!A7iR~`*LJm{VvZf{IK|CHUTIu}+vTLDe`gZ(fBoIg3LPd$xk;9BoAk^8F$Ej95U99j2i1{jZ{FHNa||=m zb{b96tX|bD>~dyo!$q!7(F`+}k9^ZwLj<%?$MJIPx7WKYaO@nrB3Cn2zl6HZ!d8Hm zw-y`L)|#c-Yxmo= zIy_WWHRce6G_^>Fn;tQvv=>ee8FUm{f#VYgdmv^sTX=)ySnBB@1lO-tkBGhSFi|vR zd}R7OKIqn_6d;q}pn>uFumWmbOmNu6J}50K zU}nYfY}^Yk#@925R!4zz8`(yHUC__3<{YE{@3;q8`+suAQ)l?NIQ}Y@;TEmHczRU& zbaB)?$fF$-(AN0ex$%m&Rjr~I8qufL&x3>A>GAxprFrJ-4|^1*QmLtlnUVK}#Qyyt zwI_`}fAlo5KmCDud+nZ)JYP>F@7{c3!0+3qx)0Bd=bt@Zy>nU^0dJV83tv87+1Y&= O_iUxSsJ|$#ZvO^))<{$U literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-mdpi/tool_warmth.png b/TMessagesProj/src/main/res/drawable-mdpi/tool_warmth.png new file mode 100755 index 0000000000000000000000000000000000000000..6f3d4d9fa541c2beb565a75a2975e93bf4a670f1 GIT binary patch literal 1344 zcmeAS@N?(olHy`uVBq!ia0vp^!ayv8U}fi7AzZCsS=07?_nZLn2Bde0{8v^Kf6`()~Xj@TAnpKdC8`Lf!&sHg;q@=(~U%$M( zT(8_%FTW^V-_X+15@d#vkuFe$ZgFK^Nn(X=Ua>OF1ees}+T7#d8#0MoBXEYLU9GXQxBrqI_HztY@Xxa#7Ppj3o=u^L<)Qdy9y zACy|0Us{w5jJPyqkW~d%&PAz-CHX}m`T04pPz=b(FUc>?$S+WE4mMNJ2+zz*$uBR~ z1grP;werj>E=kNwPW5!LRRWrzmzkMj||(YVQA=TVqxZLWMODz;cDh) zZen3>0@Le~pIn-onpXnTn}X15f>SRjDdZLaZFWg5$}CGwaVyHtRRDY0DigO`3~`zV z)tiFbEk-!?>H{644~kf%h=vIPQxAvAflOIfL=-!B&0GEakww~rg{e{lZNE~>V0z@4=r%fUn;dpHvZ!6&2KA?&G0nHsCy*3XZHOF2Hh+E&+=6qr~G2A z`M%-QHG7AUuk)6duXW40xjdXv(EMz+q3h4W>HnoyTD|`2kbnH?8U4}p*+tZhB-AL&{fgS`&m89Po1hq9X0Oba{lSJ`#v(6nR!ap*Pgoevyw~g^&%Bv;!sPou zuqPykRla>xvu?L@_RD9k{a1HhNLGkV4{58P$-}?zr%(ce@W=brG21`Kg32^cS3j3^ HP65Lp6pd7ilvY%<;DGQ*RVeu2c|QhzoHgh+9GH%XDVy!Z9RyADnaUefOUCaBlYc$WUg8 zqNovLMlX}`EcwnHA0&VK=315v=kRnDFQ6sdv?53qTx3IF_*Na3q2;#jzJ^m2H9&in zDz2KhR0sL2m15Y$4+)#1rt(Q>Im-|O8`ix*qrbm=MFY>(=taro&9Dd?-pqOg7uIJh z&ib;WxODz1m`YS4;6rSI#9s+wHPPs{u1eck=|jc#BZsvOsBHrZyDMNyp- z6h%ojM3Er~CT<1TN|+!X>ni9lb|Npt9tuFJXxV5LYc$F9;0S)$lMUidnMlF7#0oiq z<OTtO=GlZwFW zlFsuouXMROa#np9;4ara literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-mdpi/web_search.png b/TMessagesProj/src/main/res/drawable-mdpi/web_search.png deleted file mode 100644 index be9464961183033c5afb41052d84a97bbf9a5ca5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1767 zcmaJ?c~BEq91bX_MbQFE6$zopCD|kpNLB(3*+gOuh8wRjA=!`!$%gC#fr^SmkpV?C zRy;}(YHJlWOey6o1(bSG1c!2z3JO!SiZFpyr&pnOLP1iYx*h&?;J6192SYlur#p-Ca|SQJWS*(#R+f(ES9Dx z-+%)NgaxjOs5mT6uo09XO0w99A#0UtoJ}AE25Z$~Ng|996h*RGdIaMBowM2F@Q;?(y4w7>RKX=LiGhGz5vzNhe`t}Opr<^zI{k| zG>udSMnJr`vG5s-B*!o{2monmY2-9tGNMTUs7xjkpwIvs%?C&Lpy?`1to2c$u5$_y zj7l^LHKssRM5CfO9!bGiB;4uj7L@9FSrz*BnD7Gwv|=?tB~y%Bnga?1{|{9v=g}w@ z0srgwox*5Tx*7%|U=&HwNbtnTT#cdBAV&j>F+>xEAW3tlD3l`@g31v!k;5T+2*eVF z$~gC&AqWH@Uxi{~l?3KPED|n3Rw$$(mq%yw*lb<^ok^ooxqfUWjmM^jP#Fw=E(e03 zIWB}qQk1X?o8wC7xgnJIa*eg1RO68$SffaVr92IyB+l#^RJ_BBAKMoxIpIuNMF}0~j;=pG?m!;pJl-&ettInXi0Ug_pYquWQoMLI?c1Y~e%fC~e=9 z&4Q$j;daHrm3=ouf8J3clGv_Xl$f`s6N}D`vvi3&a`cYiM02ZoZtI26Hy=ai8|7=? zlwXTEZ|`-W#6>0?^&L7hT$emC@$~d(0|ko5Uku->8>?UUq8M$j87W5Hw_ogvxONc-fcL>?l!_e`Y7m8Qak00Zyk5rUg(#c%ZtOxu(%e;i; zF4hKvQs=O!slo15n1{vpp+Yll*GNlrDKYgDz%E}3nK;z44iJQH`RtQDr9$$W`^VRg zR%KmlHGML&A5^s*dtnP&U9`$;0+#YDmsoP*l)-6JNww}tc11bzva&Ya?&eN#sNQXr zd;i3vmX1eT^<+J#vZI6AOwjEK)mly4H%C|Ynig2zvP!UAzpFKon(9`y*JMJs*yfk+ z>CWBb_lCAV7kiz}{AAL3(lG!bZEd~t;xv7r*0N4C5mwCwcKu!YFzuv4XDCo-8*<09 z4Him(2Cfj;$vZ!|x+W;gKX}KW=r{9wne{)MZL4$|YqxZ78cO)poo>~T`%G7JO0aHk zs^h-D9GV%;1@PAA;f?&JodK*rMBbS;i6+0x{&Wy;;(k-k&<|gbaUVv#iAk2HSP1-E zJPfPbeGb0jLatvY?u&(9gFiai*I&9^QEq?TQ56qtIXDtoV3uyPyl`^EWcWbwV9j;S zQ_sjdU$rb2#b=$8l@=J9&7l(g_%r+XY_Bbz{uNVI=Iu*@(44~|W>K3}U>+*!jL!7r z(pLA%THVfM_wOt+bW09f4RgZvFwUfZrwd7JH4yi9}g zgZ2l?eZ+S4P9*Emg=02T>Vdn1$u4NO5rLU8u7o-FW!mPK-Eu3G>9fe=Z?vsL<+ z4wP)#&=!(O>s=7;;K%Zif8OPoU}x4g>S2BA{HHg|Jv{RaIxo*J%X%Cyd^jNS_B`%w zA0OCs(e~cUjB7Er7O~D h(K55y7SiEtVone;S1rFy2I`H!9zHh=x*Q_f_YYentNZ`} diff --git a/TMessagesProj/src/main/res/drawable-v21/bar_selector_lock.xml b/TMessagesProj/src/main/res/drawable-v21/bar_selector_lock.xml new file mode 100644 index 000000000..d48dd0a10 --- /dev/null +++ b/TMessagesProj/src/main/res/drawable-v21/bar_selector_lock.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/bottom_shadow.png b/TMessagesProj/src/main/res/drawable-xhdpi/bottom_shadow.png new file mode 100755 index 0000000000000000000000000000000000000000..eeb3c83745bec1516fcdcc18d15d3d6abfd4c690 GIT binary patch literal 983 zcmaJ=J#5oJ7k`<%p4Oiks+F$t}!kOVa&j(th2);`z1V7F7n zfW&~r2oeJmK}!rX$vTZD zX&P&?gNuXl{@8!X0>@U^jhrDEei3z@@@|0YyXy^W zchf4^?D7S$6w6e=MZ^TLyXA#)tgwAuna-1Ko&|jf*;Lqrq?$$*6mft+j?1Ji0YV^2 z9L(k<2`&OrfFdu@S4zXIoRefR4+alQqXl+bu4(!p7F{W9mk?j(`6!CGD8u2P!^1+M zkZ6cvnj+HSjz`Qm?S*qg1r3E(;P}MB9!M0;7VZ&+rI{Wa!SzS7UN|TdEf^o0J`Xt| zInoel82^X5?g$-{8amAPpTc2d$47h(g}4`3v~lgZB$O`~17s2$G%(&8RX60k!qLxt}NLl~}E4Y9s#m{R5m~gjDhJx#z#{?*C$X z^QjkmpI_fu)2q{u&%b;7?S`^FxmsVm^-R4)S?`aQ7Z#4+pWb^o!R&p#^5|3g%)}Ja Wf=5m~O`Uy}T(wGRU3;=}_4*&4i7-_F literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/doc_actions_g.png b/TMessagesProj/src/main/res/drawable-xhdpi/doc_actions_g.png deleted file mode 100755 index 37e756fae09a354a5cbb85842336843f7a97353c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1111 zcmaJ=U1-x#6wdrZ=B9%9JJFc=pkkAzZ895LwQD<9F=Muc7XL6y?$+2PHzs#$RuP#f zQv~%z1qB~ekiASN{^EnOH>cC7IOY$C2#PRt4>}ZIys7Q|Xl#~LGXY~9W`a|ZsWru^u^W-*GUQ3AH2oMZwbq`($H#x$u7#DS!A?R@|O z1TmFTlWCL|w+J%SXvx9Qwq{^9K?F9~h9qYJB3nS4st2hrckfZ8ssyPNC%Q!=3^HnC z-UNw!Q&P@nWxqmgSWgCQ0SjmVNu;f{>y}^#se-P6*N&T^$N~gqgVgV&(qc0ih9)36 z+Ut_tEKBk{&H6Z=XV;P*H|t^C_~l)!PvCgLQ%4pb3P&@QRv{i~D8|COAeBML5Ev$x z%h5S64b3)&_51yfhR5T=2$$8RBguB@R&7Zk0xa274WvSybQGl)*nxr+&h&Q)nlUM> zTg79-2gcZv!LYR3DX9b$#s5P!Z4zyvIQWzAKZUJimjReKuwaKNJelHvH)%n6DZUo958qiURtNh{eWx38MXajCl^>@&H*5Uu*~|8)&o_5|db;L@XYJW0_4v8xwG+1nM~^+4eIT{q;>h;i zmhh$ThhH&0%lGsy4ZP{jU$`|vj3@4Ft{4`-_AMip+`alfzxwA`Mf+fKF#03?nD0LS z^2Ao2C2r5956ya4UoibgEAAgQR_vI$aKJG~#40EJ$^GA^R1xDl)o0hH?izMHv1n7I IuYUKzUtL*rEC2ui diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/edit_cancel.png b/TMessagesProj/src/main/res/drawable-xhdpi/edit_cancel.png new file mode 100755 index 0000000000000000000000000000000000000000..bfea63bc61d32be6a2ce34dcfb9e675b256c3104 GIT binary patch literal 1276 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y2=9ZF3nBND}m`vLFjeHsTY(KatnYqyQCInmZhe+73JqDfW2&$iQ6rfIL(9V zO~LIJN1S@~fsWA!MJ!T8!-RmT2gHOYTObFX@Kf`Esl5o8tQ8+u>|X_|2d4VX8TlBWmjHlk{PTRD~%yX{htflW&O}G7gbHgvK z=cLZH2Jr(IEW3HP{N;+cC|O&<7IUWGq~WBz#e62awftYcx-ce~n17DGr^Nn|p(6jM z!+h^QJ529xV&+k@aF=F3c3e#KS;MSA3+x9lZutAFwBO0K@3>h7Jm;&|i(CTOG74z6F&gaS&t~`5t`+=oB-M7A%`Q*IXQEylJ)smSvc|n%+iv@F6FTb_S zYPUE;pvKbV116ICw`!Rd?5-Bly7AXMS+SJ8)AX!qmdswa1+iduwgN!nqgi&1Yzt`(O{p*6HahpYC6xkSXZ(xn}WQ^(~+0d|9>ccT3g0?C+dk zZLYr)epR{duKJbFF}wX&Jl|P1Kj3`vTf4@tey4NIyQ2DQA64t>D_^{qJ>Q{K^}(zM pnPp3tOD0YHR5v4 zq}24xJX@vryZ0+8WTx0Eg`4^s_!c;)W@LI)6{QAO`Gq7`WhYyvDB0U7*i={n4aiL` zNmQuF&B-gas<2f8n`;GRgM{^!6u?SKvTcwn`GuBNuFf>#!Gt)CP zF*P$Y)KM@pFf`IP03tJ8LlY}gGbUo-h6WQb!1OB;3-k^33_xCjDfIQluQWFouDZA+C>7yetOgf{R2HP_ z2c;J0mlh=hBQ8xDWL1Hcb5UwyNq$jCetr%t6azByOY(~|@(UE4gUu8)!ZY(y^2>`g z!Rmc|tvvIJOA_;vQ$1a5m4GJbWoD*WxtW@qTR1wII2jrOk*kS?v$3P4v4NA3rKzQb zi=in@uSMv>2~2MaLa!-Ky`ZF!TL84#CABECEH%ZgC_h&L>}9J=+-@<#X&zK> z3U0R;z85cGe_3 zn`v@Ek(2A-Tnm{9uA&DH=`zv^ahyl)L_G0o;Cmzc;!ZBpk?h6@p6(dK3yrlWn3x6c zhF#D&_Ur&x2|HhlvLoLemLpCPPqKiDk1XqKJr}r#siU>9B|%-U_e;?dMuB{`B+ekG z3G*)IvK^@|wAdi{;y{=a+XX9?-i8X%K9dOcBWI6DG|5f+6;iT*ZG|e^kxvm%q&i9! zb}6rJsIV7U9(b@(;rzS94;=!&m`zHO(AmYkV3uQonn1JE?9Un}RHPdtgt}v-H5O0E zQqWM@+_*#Dw?ZlpHlrG2&VCGJ*1at};`quQPA7(sdFDx7^7nmGvTXimcS4gC0p* z7nHo2yLSe!5N!If>gZRCMe{^E!kIVf3!HZ7mUPwmrOs5SXS!N9=Bm<)t%rDya4$5e zlB(@jp6tW$$SLdk+8?jpExqt%Cy!K@!2$lGFA}VDWjuVeIi_Sk-soa$HG}cBGCwd5 z5-bIlKbpv%I>{%>Y-vZXe^b|j2!(&`YIfbXX0}}V_CzS-SR=2BF2kdeDwEfqxnK0! j%o0p9WRIR;P&mNw(V=45{0G-mL1nS0tDnm{r-UW|sfQTJ literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/gif_search.png b/TMessagesProj/src/main/res/drawable-xhdpi/gif_search.png deleted file mode 100644 index c4a1eb82f53e1311a1931d5288be94a93983f723..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2295 zcmaJ@dsq_r8Xk}o%}Zswk#06(7t;`iO9DkHqDcx%h{{u$B8*7}gMf(^dq&gBQ@OiZ zYS~3MPjxoySea#Zv9z_^)ylOrEya@VrrAX^cRSE#d;X|1&olG;zTfk`@ArO}KPE>c zT z(F_4apb3H#m7(ccI3isrk*6ogSqkE!h2R1M+d`m%^)k?)TBFvn4IJVJUbe-yUXzL7 zhY)=dhxnH$sXznosgLIW;xaFO}wpXjhRT7K=ruP{~v($r3@*rK$BY14*s( z8e`zWI=NP<(JK)(Xl0beBPn_g(W3OP5>%Q`v})bQHdz`*Hpnz&$d6(zX)I76`2V3Q z)u(8kUJU=O_p`)0Nty;Gi(ws-qLo_)m*8bhrC|qYVVNG$N)TktSQkZ!h#t`;A{sC# z2=o@nW2&{)&%#^s*%28N<8Va; zObD9udE-%7kZp(5C9$k3YU$!DH~ujo+Rq!l;le@B7tJr+@+u%<0_Z{@QbK>&+>fdQ z{xfl)unKTMXIpeRX2Jt>|rRVw9sdR+FRj zyzjQ5IS`iKR6K_O<2%EbXZwcTyN5I3PE~xX|m}e)TRV^D+?F zu?S0H%8Ofxrv3BmJl@?1Xl^ovm&G;PlC@XJH$+-3)8()Ie`1kbpXf4Y;( z*Cm&n|G5JV(Q=G2P3s)GoEuK;95-xw8)H{}VCipw@U$!%*O=N%?RRWl#lWuLpmGI# zr@l6Y8p{GMIjqi4*mo0uXqCY=X{QJNm-GURGwXJHxXsC{L&YNme4?VYnl9VZ0KCMU z!ttez*B8qjal^Tat*fgXTDP2#O}m}vf;FEMchcV-<)TQ%nvDY^#@zKIkpiRN*d!E+FHNT%h9#ho80GPpLDaX7pjB z>etHwDB{JvJ3c+MN>&`-`4d<>1GXsVcVl0x-1=N|eX2;wpx|B<@9OXFhNnImOwvUW zw0Ab5SpRMw9h1Vv4XaBkadn;kMU4+Dk4(0~oR4Pgo#XA%kDrFw4TOh_nj_5T56=xW z^vO3jyzk83@%<(rg3x1*C~E%x{(rlg*43Df9bU10iJQwM!S5?;S9lVS3BKL_?&xvc z+r17wXVM_qp5@9T`+S-Ce$-p9yoL261g{=P-AL7sKT)tgX^&48cJ$64c^3}?|GHB2 z{Gp}WQwJsEyuQ2mwtG5hiDdVi(ov(CbMZaCYs#L-qy5`LQoOtCq#G;hYP>evK7+mA zZ^{~+X&=zDV%fPTK6XAz`&&kqC^oXNBo?k-!fY#)EQq``Y<$$2?2joXGza8xzc#lg z0P_yzKh9W#x#M(bbiQPEgR5&3&2w7rg9j^XeP=zjAuX0R*f!MM6306q2g5{>c?+*g zdwu$GbdSW6i|6u69ADVEx!F-;>^V64Zzp2Rp4q(b_O0|uTFW&LF|*4&mLc_SiLu~| zP?y44XX%XQm!1BVNelZF9*gj9PXr0Vd=iUz?t#|)9dcK z?7l<0`DE|Rh-;F=dD*?+yq|QlcUs4$!Pph1SL91AecNdVvrd1Nu{Q|X&`1_{MqX~Y zIhxkn7Jg<|`R%M-;q9+#QWbN470)O+^KC_$vAHG6xxI47g>~@-ry1B|t(PZW1&Q$$ z`TVY!8JCw2syB}M8jaP{=NixP*O%g5y=w6k2)h;dyg?Wkj6g9!*hcL($=ANSt-m7t LU?J})H!kzP$%dV~ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/ic_ab_delete_white.png b/TMessagesProj/src/main/res/drawable-xhdpi/ic_ab_delete_white.png deleted file mode 100644 index 15752143c751c673efa5fde1456471052996cc9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1611 zcmbVNeM}Q)7{3-|0`j3#q!X8;#!b}rKA@$&wb+*9qiRtLYW*1FXkX}!wpXtQvY~Eb;K#nmbP}Axlql29xjUe4e;AkSlDqeP-uL-E zpT8%!Zhl@)Ow>zJ5Cp{-b4fG5>V$W61pnPfulSK)BwUt-%V$csN{R)L-o_LI*yyB6 zff-OX--F&Omhh<6+Vo*xEw9@{TRw+!| zw9>^26KZm20y~|%k_GuI^9rmh%dBdfbXEqe@e;fNC*Ua9>vXt0gjXvavPUERyrJ%#WWwzWLN+z=O z?J4lN0b&Lorku6%{V16d0`s+dz9T`AkA|4X(tJ}W2gz8=oxsHzNv)K>k=tk+fhp6; zbX=8%rQxVjg<&cj*Jq`v3<^wdK-D-FvhggeG9ATHT!CfdIF4aixE|Ll4P>@KsYEee z$PQtRE)Pe!tRUo<=KYRf(dS}`Ocqca!xk`%BgBCDc7|g-cE$~7<}2Z8Cdx{?go6~J zLBsiyfTb&dEt_SW@KA*b`WX@Ycjm)b+yAK=!Uuy0^!OKDLPtCYh3!-F^TN~d0WN-K zSbjJo!<3Y*U#Ose{ol7mRTXXEZwkI&4xnFi;+wq=1dwlAijGV6qt2@B{ zdr9eIb>Z=l2&G`AWh2mE;Mx`SJKQ(BIWx}^`lbZ=|-3z{ja zk0hN?pNje3f8?9Dv&U=W8qch+F`}_24CA^=lVf$`lJ54ekJ3e!Nw`VBbw>vyHkhJ< zVLwN-2MopMZR66^zKsLx3PfAPrujNZ|(bp0n4F;9|ysr~7-(*x}r z)8$U}3+Evs!lS@o*kSns;an?80T6W*%JQf=xS)mBG2!iUwfb%T6xOcc}S#JgS}gsw)fg$_$L{Es)iI3j4Sdha?9UP%~qOl-87io(bED>`pZShoC9)XoQsP2Eh>#VtLz^JEGFpVJf8G&yfi sTYYx#C5E1_B$FADt(PfNuV}tMpEeNcdeq#;iQD*-%vTH?`bJfB*mh diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/ic_ab_share_white.png b/TMessagesProj/src/main/res/drawable-xhdpi/ic_ab_share_white.png deleted file mode 100644 index 03b1ac32f0ddc458ea71006e85b5871e4652599d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1743 zcmbVNdrT8|9KRNdP-J!;%0O_Jvf+#N9(`XZQfR9ciU=q;QK{{f7HF?rk5Sk|z{z7E z(=Z6tg({g|V?3{~5B+Vn+Es3*|MUD#8ZkAQw>Eq2Dy>9EEbbKRntR zX*6NUD$TSlT2k=L6lKRCsGy)gP#_c#WEO*T zNQ<4a5H`@GQNNkUrxZNe)2R@wcAf5pVw+<+QFO{6r``@B0vNJdJ#kH<9aJ*@j~g#V zJ5menIFyV#hE$`t*4M|wR$qZwbmw52skxy}r|0in@?F{5;kAJnx%n{v#p6!d~r-c{e zgWKqtA?e}3wEj{6U`}XN%2a3H{knK_ppsLTmBHHnDJO8?9_V|o9t;U*Y~VRLft^E( zOG~^frOH64jH4oh&fPelQLUU)bS}_p?%mf;M!LAYOV)MEZkJRE z*zjB56hDl5ST*XE!D?|G;SP@vf9k&4Jyi z$7)Jmw}xHO$!K z8vA5kXc^P^V_o?>HBWk&kyTHh`JV)?#IL=-(m$qUR1T|03e54Rdma4imn=#8kc^r{aj$iGEHnYpX!4YFOR%wLXP2zzu&6 zhc3#kRJ%8c)!N2#0Xu1Sc2)amKzwQ6oy&(l^r`D`2^XB77_1!G+1K1T`_`=A2X}+g zmh%DE9P9YqE!U0ZLhap~kuEd$(N89Z4@*8K^6S02vGW``md(wqUfMz4;(fbR)}SqJ zkjlKHcfa}AT{5D+*t>JfzJ_*H`QcM{ueE`5rAT{-A#ZO;FsJTovm|U Q^88}7>O|GC*v!(u0V)B1V*mgE diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/lock_close.png b/TMessagesProj/src/main/res/drawable-xhdpi/lock_close.png new file mode 100644 index 0000000000000000000000000000000000000000..9ea56401620378de10822fc0b75a8b62fe2e225f GIT binary patch literal 1321 zcmeAS@N?(olHy`uVBq!ia0vp^MnJ5=!3HGv6s`0DQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS=07?_naLn2Bde0{8v^KDjP)EVYz|dIVz*yhVSl7_V%D~df&{P2mlz_GsrKDK}xwt{?0`hE?GD=Dctn~HE z%ggo3jrH=2()A53EiLs8jP#9+bb%^#i!1X=5-W7`ij`p|xTF>*7iAWdWaj57fJ{tG z$}cUkRRX#c;)UD-xUqS~&|m@vn0`fKfxe-h0mw@*g}%P{mFDKcRTq~8r6Sym)!^cg z%7Rq=pw#00(xPNw#HA^NtSYc_E=o--$uA1Y&(DE{Vn9ZINq%ugeu09svx0_iVsd64 zh_4CO;OlGUnO9trn3tUD>0+w{G(s;kGsVi$$;`sS)WyZo&Ctlu(AC7k#LUdq%+k!% z*u~7)z|kD0*Cju>G&eP`1g19yq1P3sUQk-dEdbi=l3J8mmYU*Ll%J~r_On$c7PmM# znY#d;0WuE=u(<`IHwCv_oN>BEALtl;P|PC5G)xGXd_YWix&?CJDL*w2nB0qi={mRg zSw8~<;~Y;H$B>F!Z)VtgF*}MJGyc~(HTD4Wk_c|kiHDdYSa>v|qE%Wa1Xr+n=L=|G z%rH=RA-bq_E&Buq4mR%Ol25Gin|MyArIo80AN~Cx{LPta>-XF@%{OZ=nZkPd7K{1= zfj14hQuXZXAMnLA@vmNet~bJ|K}_PrQK^768@BG#6<)nS_w3bWcM^K$oPM*5|2!?BydT!taUAbQIo@c)R1vm-pg#w%*{7PE`IMRlM_h z6W@!Y_hS1>cTYGy_pZzS1v3l!)y~d5@#|dPrv8!_*ZnV*o{A~>eWLbMOuu{?zuPOx z=S{{%EK;10d1q~|S17K?m~;I8k$Ig}$G&OTNI$%+U#@F*$nB5R&o2S@kF-v7=XaBf v+0#F#Nxp#LnymB>y+5^=vtFv5VUb|4nwik_Rh3l%RCsy1`njxgN@xNA&sy6W literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/lock_open.png b/TMessagesProj/src/main/res/drawable-xhdpi/lock_open.png new file mode 100644 index 0000000000000000000000000000000000000000..c85e140b19b06f5271d8bcc0f8dac3481bacfd34 GIT binary patch literal 1348 zcmeAS@N?(olHy`uVBq!ia0vp^MnJ5=!3HGv6s`0DQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS=07?_naLn2Bde0{8v^KDjP)EVYz|dIVz*yhVSl7_V%D~df&{P2mlz_GsrKDK}xwt{?0`hE?GD=Dctn~HE z%ggo3jrH=2()A53EiLs8jP#9+bb%^#i!1X=5-W7`ij`p|xTF>*7iAWdWaj57fJ{tG z$}cUkRRX#c;)UD-xUqS~&|m@vn0`fKfxe-h0mw@*g}%P{mFDKcRTq~8r6Sym)!^cg z%7Rq=pw#00(xPNw#HA^NtSYc_E=o--$uA1Y&(DE{Vn9ZINq%ugeu09svx0_iVsd64 zh_4CO;OlGUnO9trn3tUD>0+w{G(s;kGsVi$$;`sS)YZ_@&Ctlu(AC7k#LUdq%+k!% z*u~7)z|kD0*Cju>G&eP`1g19yq1OnfUQk-dEdbi=l3J8mmYU*Ll%J~r_On$cPPe$Y z;WQ7bHwCv_3~=hz2RcR{6thS%4HE(;9}p9sZh;(l%1_M$Cify>y5_e1bd!OBal5CB zV@SoVH#6+LnGGe5&0h5OfxL*7#*PlYbFy<{*J`{{Da&9#$p7%!t@96-y-qkqUrya*lE%o;aemanU;^{pVe~(Yk`U=kpi)nI-9gsTF#A(1G z^*}DD7*&3-%)fe@x*fl}D_0owIA$1ozay_0ZdMOv( zm+g(Xw|Zl}cKQ*k%sD?L3pi%o*)wa=`kq%mN1&L1LTb zmn@!O_4?C^NRQZ~xn)esJ3C6RNk+1@Hauqy6#w6P=E2g7)&Fm7S1%Imk9W&Ga<}g8 z%BMXR%3Iv#aUQ#Fl=x)M0gtOkzMo+G!O*?n{)Wb~N3Z8!Tb6ZTIRi7pCmo#)r=DtV P0+nl?u6{1-oD!M<(rxRj literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/msg_check.png b/TMessagesProj/src/main/res/drawable-xhdpi/msg_check.png index f507eaf88fe91e91f3a21bf4309f7fac080f7115..d214b024002d3c64a9937c840df0cece5653fb88 100755 GIT binary patch literal 1333 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 Hu0mjfhx2st diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/msg_halfcheck.png b/TMessagesProj/src/main/res/drawable-xhdpi/msg_halfcheck.png index 0fcf4204264d0f097f0911cc265089b65edec950..7ae6e79c73ee685b38caae0d07c92f200ef12b73 100755 GIT binary patch literal 1255 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 G`F{XdDv4$Q delta 288 zcmV+*0pI?w3El#bBn<>-K}|sb0I$e51&ZmBAt!$T@JU2LRCwBA{Qv(y11$j)1C0T- zEieOO6%-Lr5K#%M0P!mzz752pFmY-bE($dm22KJoCrFMOLBt8fThM~$3lRUMMi4Or z@y7qC;3^RFQ!9w3p&9-P8W#-Iu%H6X@NYnDhOUlW!~M_<{{t0cpoRrzP}d@ZOkC>8 zP3wQipdFtcO42$AEG49mSi?D?nFkr{1!6X8Sb#09UqVjny#wZ mSYpyTKFm1eTNMBS1^|tVVXYqdn_~a~000O{MNUMnLSTXuD{<}s diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/msg_out.9.png b/TMessagesProj/src/main/res/drawable-xhdpi/msg_out.9.png index f4e0afa5f463c1b9e3326714e1307da23dfa3e54..d7c2816f1339f91a2abe9fa4bd1b72b05a5b5f47 100755 GIT binary patch literal 2258 zcmai0dpJ~iA0I=EWU1{!sAEu@#oR|u26J=ESh;Lc%3%(Mxg2K>gRm%tWGieNZ*TQj znR=1jHz~v}Z*AlCDzdg>v*qm~T{d0Rdxo_A@jkuhIp=r%d_LdH@B4e6lNaFcWxR0Z zLIQzc?Bgv6#Csn8`I7YU*2Ew?2k*==VJH@)h{jY93KO_uMI;RP$eeYo8|z}sWdu;ioa|}8WUu(LAo>W{vqSmP;oRE zDDZr53!ibwu^5Jc6pBiva#Asz6le^E=HlX_)u7WIafG8XMUFwqj&h~Vyn+B$Mxhb} zlPKhXRuPI+Bw`#g?&(|zG9*wE6N@Q7h|87llZB^^k_;gfniG|R&SJFj&9g+JPcvk) z4`?M82><2$|I}9orywvT5LPM@(J1^BqisGi^=U&|;QJUr5roFW_$hiqQYAdQArgTC zMO2~;mSa8w4jG3!i6vr?$74G)sB|WeyIx4637K3Li!NXacrH`{i^>)9=ea&|B?if( z;CZg(FD~PgT#%2#5T-zb6$kB{nQehDu^?eIhOt2%z3K+t>VBj5%n4?p-@xb)ZH zr9XdbHTV)ajD=Uqz198G!^{)erAgK~d0s1egqSk3VzNVZ@ebK;997WV?c1N127qBKK@&kd;vi<4O>YddRdoYeG zO1+BOacdnKs?ln?F=-&Xv_PNxpz^Wj(w{8W9asBkGAe9IjHFfhSNB_Njix(W8>X|) z+6}|hvo;0cUIXNXO;_lHyKTx>0)F>M-2^Y{^`2TwD697R;_qziOWoqHnhv;h{)hFo zk+G@y)MWhBpLMKrp~I4nMm=#ivA_~tisS-u;w%H(X*_rh(V{#*6grl0jbM_g&j&)sWsJ=H*Es;w;$yEn|jpm;mEHm+O`)Jey_QD>D20rnL~}@ z+L*x?mL?wf#${&gfY4 zA*NE#xZaa}*v{XBlsA~2Wi->1BYo-Htz?3{EBkUrAA6<6Az$5&jIA(LS1oo~XRtQ! z^Nf8vjP?@U7c^#iSmmBCerLgxl9w#p)>*@-UZ8h+&mP;2hOmq)6Ub)jC=Xb`m#L7znRykcAf3{=J^*S@islW5t&n%lB0@7S`sElP&V=9Ln^G z+e^rMyv>by2cJGs6@9ba**LdrgxPb*l67t{px=CaXgqI+pDuB>XnT&O9Y|(?Z*~1N zq7W-$oQI>@(7q+1o@}~8QyJ8IWTZxOVW#CYmFleB>Wwwcd4<)wyMe2|N?QH;6=(WM z|B=oLdO6wc^Dpmo&D{i!^6mX=_CiX3`wYA8hC(*V`PTKqD+xEE`P!7a-%? z-qq>T^0CL0o4ah)%}g delta 1351 zcmV-N1-Sas5&a5~Bn<>-K}|sb0I$e51&ZmBAt!$Y4@pEpRCwC#oO^6jbri?XZM)ms zcI{pUB8d@YFO!j&Fvb=%(?3l7*Tlrc=pX(eBt#QKh=9U6oDPc9xe3e-g@q9LLlPh0 z1BMn81OE&Ifs8E#LblS;ZSB~)cI$2Lz5Y&j8|!H69=$K_J;^W2ZMvTC{q&skd)@vh zkj{UE1=kd)*plJ|K>$4)MNxtY3`?42r62J9jiZX*z$-Ox=O08-?dwbafZpC06$SBs zny31|%}+#-8>PvgEu_6lS_5gc#P`OMcA2!(r1gl`%BIHg-WRrza@xJRbTyQ@O2KJ& zVquX~5GmYrI2vvYPKO!;p}?2qdTT>XeNTV(|M2F;Z`NXY?0Dlgx`6Ipzpe(JdVDRo z94^Trh!s5P3w@$*)NtwghLp9R)d3aD3<@|8#SPoAAkSDDm#eM zGG;5LgPpM}-mReq)PkDi20;NOyjE6JrkXxJsfB2&u024>3BqJDK`jj+r-9`kO#cY9%<(qKD>cd~IoY|*a5NHLK z0;sEKfI^$I>1_W`Zi!Qa2Q?dQpTdSw5@_k+O8rjT7+hKFn^8^axIdG)ny+?jznak`}hX{XzZr^`o z-MhMsh?EsFP6DG5tQNX+U;Elsx~dTm>z>yhV|hxqAZF%f;IAPsJP1d3wC)@ZE_tw~ z#c{+!i?R{;^X3H@y+7U3w%6aYtWm4hBVv|~!o`6L;PX$lwYx_Tk(Uyr@%c#&jTFnd z_$+t_`e4L2*-jv|k(VN*#bJLLn;@Evh**3s31Rr&Wak&n_YaB?Vx)0-1flL4!6ssG zaj*~W`X&x{xW{mPVg>_bxe#&`OZ7%XoMTBOoQFFjV_$W+$3GDv#8v`9bE%Qw;^4j6 z2X}mdo(}iKM`;ieu)@tz&4A!|4!k5CZV&sv>1YZzr=`P+A!w@Cz?y$>>+Zc?0--72 z5HvOE@;?}XPIqumI)uUgU3vS)w6+NxkphCI<{F|Vd_X;(ZwOih!ASu@i>V=*8Jobl zKo}2`8L45Uh5^C=v6y0MJVRwfgaIN;7_z*;sRlxviv#dNL~alQ$HBGna6mO6LXmOc zco>j!RFyFzW~0Inx5j@4RRaRGpeETP;`}M@>l^;75G3D((uNvP3u=-(BKYAUAsU+C zJ~(szw4yN3H)=pFs0l#2rL#qLu4@V`td>9ebjsX3ewk^kbEl+lnaHBy2&_;&}172j(H=}!+z`A&%GklfuS(I6-R zB3)4G8%jlj93U@Jks&#N#ei4{B;!z%2!%(%sI;5avr+#DFaTetV^a%*&G-NS002ov JPDHLkV1fiTh*$ss diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/msg_out_photo.9.png b/TMessagesProj/src/main/res/drawable-xhdpi/msg_out_photo.9.png index 63274aed4b693d47729ee826d43d65040148750f..c452372f3ad3173b06e10b5ad10514210d5e7674 100755 GIT binary patch literal 1799 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 delta 869 zcmV-r1DgEy4WI{*Bn<>-K}|sb0I$e51&ZmBAt-+`Nkln3dy zV{FopQi_Kv3VP9Ayy?L&Ad28gFD-~(BnJ^RlpYNpL=Pz8=!+)iIl7XE!tO2%)<(zyHj8^WIK37r+8KZz{(OYxHB1+8Juc zscD@AV631{?G?2Wwb|+1lFk*xtfkBsvXeAWiX)jcO6^UeL_7w8)72RTmfBh!m48&w z(((#?pPJ5nn`OBW1hJzF-Mp2(6xOuj(Zhd-(D=SFv}bp`>+sgj(i#iKgt37ESe&kB z3b=AD9aa>4@5sUZC>9;`%)eo5U;q|i;uerdhNiNa6p9WGcpjv{04%`7D*znj-0;wl zFgp#f023>7vjiwuArtXfR2Tuk0!%DkrT|)4Xi5(PmbU>5+1|dn1c*b@x6y8FqXBp(mM-LRCYI+y9>;)mA@74& zo=SLpDj^e@Ok{nZ$b9oiEc1X6c|d>U|ID|U2jr=QJeBD4T8Qe^P16(xvS~CS5&Yy8 zKnw%DTV1ONBcM{RA;U!PS&_h8fyM@Y`gwU#7y-ZnOx!Cl|76$w4~q+^N|k%vfB{&5 ziFXCeub-6l+A6vJ^3A-bB4BJ_02W{Zwm+|7y}b?>ZI$jsil;AchMsM`m^ptiI*!JM zM^Pr3?g{w!YPsb$AHOW1$_l#i_->>KOe_ITZ?A`_!Mn=QM9NH_JgZ-fCder*Opf(J zfZo7w>s9=GuB1Jvl@-`cU`<*+@S#l}6o2;EP0MYXmMCT_RyjJdXT+ZQUI?&P!u(fdrvAr_ v7_2{D$gjJieK_sz_X$|w`jd1(2LDnDlanEzk`MsR)=ktC0{GR7zg)Irj zIe9o?Fc_RHM65tZA^I$Gn25gdlhQNLVFn_JLc*aqBt>ZiF#-*w0*Nx6G9FZbO3jAk z>mUz z&8UgvD#X%{zR(q)lz<=xE|r>+l0r%Gr$EMdDjfg-D~F$-FKXcnZ_p!3v#%Z|k28ot zSZ&lA5G|x9S{aop$b|4oXrv!f&>0lk_yh$0M6QQF77HyK)vPp7=@c5(_}<2v-#AJx z|1v_S`(zCx3h>Y1|0h2jvB3aR6(9_mjB2!tapccjec6%K@M8{Kxzd;jqFt0KlVI@u z2f3UphSVkKH8fhY?1Bd*ZuHBbs{?GqZ6HBQi| zT@PxcMo33|Uox)tGw&u7>Kfn(7<7NJkS1a>CH{1}fWcu(gn-0P%JiqPr6STtpysob zKLFYP2S`Q3pj!3unO?@XP!U?EpVW^oKAj&>kCxkro{kk?Q+8u8c0)3;Ai~@}kSkA` zDRHgqENxr+*Q+~4T7ph;Sl0Z__r?W6aRi@SN}SxWP<$jL1R$&`PM7b)_f{l3$-i5+ zvD?lz%UJ=~L;?(*P0>0Re&bd~)~wn++;eRsmw!A(#-0{+50s=l-E=GDg|vNmr1#y% zii(N=&qn95pgf>F+5Hi+=G%3Xv%8VmxisN|(Xf%1-UkB(qaCo@nC+UfH626mZuKl3 z?B`{Zw*&c6FN5)!_s)NJpV#oywd5fm;NM3|Wb@|sPm(tW#jL77bgJx4oHs5#VCvw& zG`r1DkF*n#oLjea_Ft(LMiRU_4&4s@Z)1#i3f{3ck1lDNT-{`PGEguWxO)Hn{2lhXg}#N?*Ab%Y-d=cqA*?W;;G{e}twr4I_VdCaip|=|_Lg%+eTDYS zCeNPj=?{VDm}%0BcIyQ4<(7v?BY(N;FTc8mwTR(M3frw?!V|pY?#0;0tT}=eQ)4t2 zcCadskozo#d{>8n2YHRJoH+Tb!Y$q_k3Qq*qYipRvJ*H(UD3guY{Rw&qi5F*X3}bM z`dbXPu6WeuJy> z74LFb`fSslnj!4#rHog5oh|X@;u7bwI_HstTtj5ikAs@#)jc(_T&B~6>1mBK^6O^x z(Z2K3xv_|!x=Zyw4YkPD^_{n;g zGe&%^Pz54$MmGkXp&i(MSpWi&W!iz)Th<17qN3)qYTT&(@WF)co6D-~<$>LBby0#$?NxSyT3#v*_3Sj$s`7R+42f<^%d(km1b=a6sy@k-JIc@b z_KMB@op9whor@mW->Fm)N5UgWKmP6Lx3YlbyxKtRM{s+x7h2{VN delta 1355 zcmV-R1+@CZ5rGSkBn<>-K}|sb0I$e51&ZmBAt!$Y6G=otRCwC#oPTH=Wf;ew%a6Mx zmnQAjA9Rf2A5)aIQ@2hx5UPTI`j04rf4P4)m=3m5Wa?}>Ya_a}gSw%OIyHazS8)R! zQ$dL_Zc>A669i?VTe@yt+oiEd)8uk@zRxwmSdy5fcbB`}J@8VlP4j;5bIY!pR_7BEdR+giV1G~D0N6X<(1AU_Ci&vUo^1-`(BhJyG% z&B@rO@^}O}QJVbNL)z1%?IMj<_}p@&ohNOAv|!=5v7zA$bnc-j7~jy*2CeH_z}w`; z#GrQA7BAY@gEomIbl@P#a^hP$# zXmO!Nd5@q>45mkz$g9!SFP>51oyE_lAKBDgb|*%?3NRbc2UwUp*TQA5o#8(r$>@ZFbnvbw9XW z?7*2w*k`!VC^gz{hldCZ*5w@R^ScilE;LGwp=sE;^#S4;j-ft3`?6sQs&eL_8F;w+ zL2x=8{)2w@C1Vs+70k&vVAoaxgQ4F#IP5xLs2s7{Tn;A*lWo8-_G1Tzo%??c3j)pU zbP>mdecs@zTkOBiwQFt2}9fJRo#3d@kp*5FrqzuceQL zM)P=kU79qmo@=Sw(8zK*5)OZpaD6&878>Q>E)mm>lktzC*_2xsl^ka5gykk zQs^M{LeS-0gUjb3dTA2k@#K31!f*jXb}bNemm~6g9)2JYuErOFp%LNr5(xRVUOnAR zx_E&n5MuDx)x?LPfG}7R4tY5w>n2&A`y~c{UYYwi6c7jGhM=p;^2UFyn?N8OE`{)I z^hw!->TSy}tptS19--Y$V7x({lN*B0hEGWouLJ~LjT+{SA}VRp&Ax`xnoN(-TOHAm z8%2z0rbkru2m_9vrbn1LqPF2PCkTROMB;)BDJ0TrgAjQhF3v9|Gy@`$N&+vyuS#Z$ zvL2DmP^YiV#5Dr~wV;0{)jc9|%KpJ`@yoD4u0*2^HJ}#Mq_#&0*Z#09CFjLgzWF)Q zP#D-ZYCtWh3F_Fvs@2M^Sz>40#F%6JsTY^6XSlD2?%B8*Hnnerj+Qo60Nh-dlfvQm zsmqXv))#r<*{dSyIFs)_yo;}+tmP(%TgCo z3)ENP3HoGm&VpH6+Qr)KTjE!L_M;=!pIxuz{So+Tl}fKoK=RUi8;B78^t%q+Tz$Xb zL1mx%k+FWnzHxOL_bW26vPOwo1SLx^olw2WfZvdEb(v zrKPO~LB%Un^aL|CKomVgaR9Y|SPg_P_eUc1jwrDy4bL}KKL-|y0U7xv`NbLe1q#m23L3tN$(eZ| zz9v|MudkJ7UU5lcUUI6Zi>(sS2))eA6e}Y$6K4~1OE)J&6DLDMR}%|YM^jfz7Z*!o zV;3VwR}+|Cm;B_?+|;}hnBEk)UPl9*dO>L+w*Y9fOKMSOS!#+~QGTuh*w0p(xZUD{ z(>$o&6r66cbj7JxALtl;P|PC5G)xGXd_YWix&?CJDL*w2nB0qi>Dt$P88BBc&i8b2 z45_$vWyW5=!v-R5((6+l_c*f4HS+bOBsGaAWJYqlKdijL;nclN!KEpQj!CbNxZIp@ zM!X|1>e2rr`?i&+TnTydt0u3c*!bK}g^64FxeB=B{@blJo4~+h^WpwimbOPxTu0Lr zj%~j#^CtAV@gw(+#_ED=MQ>T}7#up9-t~z6NPNBg=d-fGhW5cC|IgcOWm$7J*z>?mo2e{w&K~zWaJ%LW%bv5x zy&5vR%+2Jr8_%6NEo8wYt~nz=`x)PX=({?;R(a>VT$8tbZA$9?k<2o${9ob4!0^af zB~$IBEm*Qo@~VZLH8(Ffb9MECjJod}PailJI^R}#_si`5w;+2q>7%{tHD^xuRW0%K zSve!TH#BAvM_!z{_$FVa9hH+0PSfjL>G*N)O!K*CR!*v5*Zv@Sc+Y_)Go_o|4Ys@p z5G%dEne*bkSJyVl70(b${{8o!dBSDgUFB14^A8-!3HZD&KgH^!rbftlgFT;cKan?)aj$}dk>KbLh*2~7Z%g5&@I literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/passcode_delete.png b/TMessagesProj/src/main/res/drawable-xhdpi/passcode_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..57af5956d6bbdfb4b445692451c5e2dc3c78f0c9 GIT binary patch literal 1397 zcmeAS@N?(olHy`uVBq!ia0vp^20*OB!3HGHyY2)@NS3%plmzFem6RtIr7}3CKL-|y0U7xv`NbLe1q#m23L3tN$(eZ| zz9v|MudkJ7UU5lcUUI6Zi>(sS2))eA6e|N~LnjkcGczYc6GuZsR}%|YM^jfz7Z*!o zV;3VwR}+|Cm;B_?+|;}hnBEkGUUQs!L1`hk0BEyIYEfocYKmJ?ey#%8&sLdO+~QI5{;61!Ur(S)aWAs5Wixkr^Az<2a&epuNX~~Itm}3Q~t*E3Zrd%e)5VXJNe|tV{|i@2-ZpCa_nqUXv9`n0F{WFNSx$Qo+-N z`~O$&5nJ{7+RcK<1JM_(u6!_jz%1LVqg%J}hhp!k85{IW)n-T*oI1Xq>3hq@?G49| zn>9p~F3|a7_F<)BfnH7jDi&TDnBjG3^0|2u_snCK2dMNM?q)JQ zd+p*xj@%Y;RyMKlo=Tx>hnBNSvFcQBR$0^PAGG#!;DuYUYKgjkViv@IU{movWMMPy zc>4KIVjdw4g^up=W}cntiblDLPoB&_v_AFEM&)3}CE12G#>zGN&tF|J6TQKt#@ZfV z(wRG(!(iVmla&U_HPa3JxA?HkC|J_PmGA4M*0A==I>iD-&ifbVs51#OKJjr@c=lN1 zVXDx+mu+e1nwPcs^UR;dq499zC$q1i`&O=>QW|W}xGpx{bH$yRubGdhimmtr*fwA3Pq9J^#^Mdx}c{6jFc?@kneA7O_ Ykh{K8F3k7EOXIt%87n1P3jHqM+GX!y1yXs1by)D1wBf0ui#1L(prjb=pHfy9Z7)xT|?@_(E8s!2PQG!H%JeDYqE&w4!CNCTWyg2j-&=;gL<70Y2 zM+ijCj7_k!;Td0qB>ogT_dRV%RegF3y0Xn4lEkfFe2|=0tOa1hEt1lP*EIR~@4fz$b_( z$_eq=R1nn%An^nsV2!dyGB8*xz}6mxwZ>Z6VYdJ{3>J^Z;L%t-5{n~X>jTwEL~4v*pqBG6cSdwVnnhsNQMN(53E&lSnP09;Hi|Kqc7KKrjvtQNUs9%DZT<4!WV#D@9N<&U z1orp6V7~9=Gne@dFJJ1wewT|@nn9~N`#+stJW`I2YWsC=mBH7^2f4~|7bxd?=ty5Z z1fsFri%g`6WfLJBZ&Qka^Pa#n{rLsEE&UO+ELRJ}4O!Z~ebLm$Y40F~-p{5-5+~%F4Seh`>DfJ(5nG+VitC%s7oHr=n2Hk(2)?EIAs;j8KcxXA{Dg+w zN*=6dV+adBxhCvrZ-Z3h8QlKLhuwew6@YvO$c-CPC$1snej{(1f5@;%NO=c2r-qm2 zFf&)L;%CGc4Y`h8T`D(_JNUr}h~eLV=5EhC7DZ5xW_3s>N~53Ij{G~kY$GacwcMKJ z04|FkF_tGBhfOg%P*VX$v#aEsk^AQtj%CHn#=_%w8RnGn>R5p^=&Up`ueG>7XL9fX z%OCdSieurGh|q`84i@?D_hDCQtpzq~`$r?H4f&oh*eOG^QX&P`-23OF3A-K8fieK< zUDofk4W?a6*#gz{GcfLlM%KAhNis%FtJ%#u9+Xo)P`%}x%CROLWGVHGMCBw zcFs+Xy;UbiR#le!?Xt>6Cyh2W)+NSb%uFd|a0kI?VQ`^0{^F)f^Xn`pYYY^y@bNn2 z^-@DJ=FoUuO?;o+_OJ06%4B0^0RA8}-OqBkRw_iunk4G38`6~E_$g{`WFWIqajnf@ zZr7pn?+q?an``|_I6W53YmMwfoN%B#2p0u3d8pSMD-}GM4U*Zw?$qr);d1lNxf2UH zsdX;I>6gtCC!@pjCENRiIN5Ks7-Te2v{6*zG=BN0K25UTtCF*ee*KdYuR|q`cj2) zSZyV_B+W)ve5gG~J*E!9G?XBKYA3*VNTY{V5(LYjm*c`v& zQsG;FTfgx7ney0XyQKy3WdjFU$@Y!@ZA*|jnMH246$ARDq}m&am3MmX`9Y&EIkJ)^ zYJ}B&7B-+D_0-UZu^rg0OK*I~}xN!!YI=|A*% zpPMd;&(=nO%j4tFy=r?6O|B;mpn&q3w&b+*Yr$_b->K&beyS$g=A~3zs*~u6hmQ3m zH?Qc)44I@~J4ib4)@W<7eOr*+%}ecXNBMfB;jS#CI@8f5mQ_OQIj zAzQ*;w&y~HrB#aN^2gIh0=u$)?oWPc9I5v&2c6y8H67KZLmcR1#$0)f-AGDG-Y}M5 zvT7JQO68rZckOc58<@Wz*BiC9#Z~KLnmWQ+e_+F-TW#H4iq=Zu_>wJ|cX?{3kIWQ0 zlitLhbj)-80I&Lqc_AZPvwdB4HR=7lQ(Mc}ij0>wK_TW_;Hlm|?@ApLZ%T*Sf9Pzg z-*hS8SblOQwy1IWQm7jfAJBvlY!zYK2}JrWM-rEq%o_!uW1kS~7Lv zmyV~}aQK=2jWM3O~4+k#9WYWzxrpVFhnESEBot9FkWIUpZZMq%BCTZ14qR zMkn-awBg#s0!vSEZSx1yqq%E5Tg5Xxmvy&ZO@BD5kTbngKpHSKMzSo)L$Pgp!n!n|(BMA6OjEPfE}(!o4~uayh`exC*EUH;Mr>>How3mEcWHlI zpeHdc8v&Qt`8j&P55S4Ky1Q;1?mhE>-ttQoa0mBNKVfe=*4vQw)IW7W-58>!2-`q^ S{YI$zS@NRnAphnTmhvBhvjkxP literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/photo_filters.png b/TMessagesProj/src/main/res/drawable-xhdpi/photo_filters.png deleted file mode 100644 index 61102102268f18deb5f6daec50e75b7ca3556ab2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1701 zcmaJ?Yfuwc7>xyqf*@#&s94t|WmL>#6CxxKLY@#M5JHL|SP97j5jGo>1p?KoQ63f@ z7@wnP8$>9zDvCuc=!hZ}#-f1AFun#E6$T18I6PF8ZV<3PN_S@W-tW$L&i6WZcAp|N z$k}nJBMygimIaHI*t!OLJ?A)J--=mt0c=@Z;5AcB%~!I?%VA~RH_$xPO8v?P82;BV$)1TciE0W+MUH*w88(gZIT+uM%mBw)e? zP3Dn4Clw`E03yT)0c;wZs$qcMfDeZTvO#ZOa4o=OfGj$LMF&|_kjZ6mxF8#td`MU{ zqc(x76iX*#VHS^+grWv6ot~baPD^Le5Mv@86(l$b;GWUyG$%lnIB&}z9A_>K*)ZOtcZBx zSa~{fu^>+zp8M#%u!Iu)>k*fH4$FxM-qy&s$GlQPt#HeMave+ z7wtQrPrN-^wr}YD3eIlEUrpCd1N-p--TwW@`EUJM=PO`8LNn2FAZ~F~y{_VZ2Pb%s zTj&R$1xt6OG3-m>#KPCyKEdO`4{E|0ICaC@s&Pp-x1jQ4%+VdIDq~7~gEWBM*01jM zBG%d0-n`%aV{>!|7`38R6L!;+QT#o4s&Xi%s=uh*F1p#ZHTh87?9racmced@I#8Rt zqklvR{@tQ3bO^sOigU;F|LBumJkd2Cq9}TSbIKJzvmc43th`q#-JJI;al0y(G7z}n zA>RMp;dNv0I`S+HcddeBfk(dO&%b8BVRO%-T0y~CMpoM!MNpty$fW_3*KIi~*O4I={;rw)6_0yBy=J?yav1 z2=nS0BI|`UR|nG-)Oq7&w{L9p-=)gKcjAITfL5+oH?*1DI37McvfkDC_~j|eml7&P`Hf9$Ihf^h}T!KnH z5TOoe1+~~BiuK@XN1@`0ie%zJQEVBjNKw=>+Kmm=xHUN~N>eY$}aGWiZGXf{bM9QKgBjM?A(Agb<=K zY7M9s)&n+0Wip(Oa*0@^|D>QZOvvhy4`sp%Ml~r7R62!bOKBV^mHt0er<*_{s0{iT z?|%v-@=OCnl|cxcZd757OYyL|GH?V&NQuHmISi+bS20opqcEa@4S+xZkfchLR&TSt z-xH)#jzo{3O1%n_2)RT|f}+)`Ief7{P3*_?X9ozxbh-#Dc!-~v?=KWG=nN1Pg^Y8B zuqs^#>Cthn`Xe`BQm$G3OUd~C;wxy6i$$%pjVxEry#?qc$svCpMkA`Fq6ERE%1p)M;IUVL1_k8heU zi?y_e^F2BfTwgY}*Y0xRhZN;9b{^dNV}86fw8l?#P%%|Rwva?C@@Y#i9jI5{_A?8WJGu;nkTX=Ht7Jz0u7vaY@Bu zo*U^;1MGU=&B3AxGEFybVC_k)_XsA{ct4ms-R-T*z!_OCEo*j{|46|g$1@@JR8Le- z&I~WNtXobg)sLM93pJTIFUNZ1M0lILlMth&fnD=>)K_g+uh^aNs5E=$55g_ts11!$ zM!JhNwe07;kzQdj!tOS?$oyF={hD1f$3^Iwo$d;*N^xJA%KLg*pzlv5eV%3|GfS$bF33at6D{f@sq?CwaaTR(@KT6XaH{vVbIRrm1~ zzf|W+-dLN!y`CV@@TmGa>zb#t)#sD4O~~&4tGu+a7jtXOh5HnKch@vt7{I$NJX))= z_TBg21eTNR&axic^*;IIo0aj4)@6c2U+v43<3ncX`V&bArkyUly zPqR2#+Rk}0o;8BmwTe1JP7qM@ki5I2YB;m+P_z zgKwyH@4j)N#3!1E{6$#&(~%o#4OQWVTK7X~P0mZ_HmON*_YQY@X0p@vl*)uYGb=7f z+g~4R76fE)c07MIJF}L@x@f%}?tIr{=dP0BcIlHBZf)xX8;TeN^NWV;73tQMBxI4X z?liTae14T)yI^Qr*r$TAWBHYm-bcg9Pgx^d+gbODU(LF=E@^q#@1qa)M9J{c!`sDF oaK~tM(DR`?v&^NH;bSfe9R6nauS2o?M%$lDB8m{!^A)*&0}JQKfdBvi diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/photo_rotate.png b/TMessagesProj/src/main/res/drawable-xhdpi/photo_rotate.png deleted file mode 100644 index 968e91dcdebecad5563de3cfcb7672abb0f0540b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1505 zcmeAS@N?(olHy`uVBq!ia0vp^3P7yJ!3HFkD$jfgq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;1Ffc1;hD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Keo~drKfuV_lxuu?= zsiBF5p^k!)fuXU!fw8`!v96(!m4T&|p{W8CC;@FNN=dT{a&d#&1?1T(Wt5Z@Sn2DR zmzV368|&p4rRy77T3YHG80i}s=>k>g7FXt#Bv$C=6)VF`a7isrF3Kz@$;{7F0GXJW zlwVq6s|0i@#0$9vaAWg|p}_TC!3=B*mo-U3d z6}OJe*zNt)LFCxuubtu7&w0gsxuv0WD}V8Vhz#`~3?I)6=%j>-Y`vkI6Vs|2_Tex4 zjTKkT9x=Z;YOWP_=od@p{fWYJZ2j`m)_K}|&{iupxwIp)MY>Nlc zIlt=+D!ckx!qi1)ss&1kt+a^{o8#C#Cw+rTpXsDVw!(tToqA?Rc0BwVc3dL$L5O7h z@mvLd8?DF7TRxu@+};>uxKEMUde3XyS;{5>+Q-^c62fJ2x-K-tR8Qww)7=~^_}Ap- zo^SvAZLYtJj$G*UD<$~l)i1rC`9)DaK_`9MH2mJrHeP7Bb|0_yfo3Di<7eF^9))C2 zYyF{|ZMEy%cmETQf@ig*_*@r!+Q`^zVY)`ZM>=|GB?S)`~AUwoF%^_XppEpD&Z7r`)ca75Lglb5>|H z^Y=gYPVe0J@dn>%`@h+s;PCGKHW{_E>l8SnR`xP|eK32*f9`KPwybZgp6nXWBEg^{ WWEkD~#ZL-U=z6;PxvXP) diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/photo_sizes.png b/TMessagesProj/src/main/res/drawable-xhdpi/photo_sizes.png deleted file mode 100644 index 01f3176f5417d36670e827711f9aa572fa0c4d2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1118 zcmaJ=OK1~87+#H3DYh0o_`u@05qu^4O4l??(;&lg`Gb^o%x6V`~KHAr_-JL z>S{OF5(H6~+An7Cz8f#FrUw7D+-wwYn~;=4-BvFuDh?##nw5tjWhi|x0~Kxf=o8pN z5I(=2&7qv!A*hx?DV`5iGHi?{h?cgJt*8SKfjsQf%_uoP`G5qv79|hyG9%jwSkU*6 zIIw%9Gpmjas1c29YXvPO0TUPyDWGHwnyyfal4V{2pS^3E1Z5XA5GDU4m6OvTVL1@+ z6dzO>wh4qI6w9+s&1?X03>%`E5Y2{yEGIA#f#t#CN8)IX)+=PhG)?lTJ>4JqUw_w>IkpMeoMb%Bu-c<(3vXC-eq?js9iBS?$P`a)O?O}=I!h4xW zvlwDo2{$~xH`yK*MULfoUW!++qNNTQ&_oriwv1(~Vm&PwHjXSpM?VI&q+=PNT(h88 z&4rh$@-1Sus=4sVs#qE)Lwl3`Ytoe~EFbT6%iHx0^DEw+nVOn54g^jwXNftTsDN?Udj7S~}JyR^1}l_p!tEPoHhfOOo{K_CzDMO_)vh`yTy@#rE8} zL>)Qv^l|?Igqq$LHa8Byh1O0`iPf}(3SVFjA@#*KGyj-m!8ooWr& zjAhwEE@LJbCU$+orl`63*f*_Jh(R4T9Z#WuzIsgq$5!a8qQM!y23yY3W&l?gIJRyTaeR$z$M1B*1SF`2mXWi5avMnM&!wQd#5Ere0n zLO#$mFlCsQ<0bZVn_w7n(F?KZS+J-pG?8E&$Cf2Q&*!qUIVrE{JYOIMS7#R&a=I?? zf+!Z$E>}m^x(hwr<=Thbd|z%d3$9N*>o9O`LVGblE@49IzvV#-U{l>#*Q;)vxCQq+eDCy4^uHXIx&22Y} diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/photo_tune_active.png b/TMessagesProj/src/main/res/drawable-xhdpi/photo_tune_active.png deleted file mode 100644 index e65b803624602b382df13baa101468d59ce5b6e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1032 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 literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/selectphoto_small.png b/TMessagesProj/src/main/res/drawable-xhdpi/selectphoto_small.png deleted file mode 100755 index 5b817801c6efa0496add8d1f0fff12955a1de1f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 696 zcmV;p0!RIcP)KAm4sGlO$Q9Om;pBsrobY@0&(YFNn$JoAvtvMgV8yWIzPzCzj%6M%~X7=8hA zy;iGTk4B>(=vO+O&NH;F(X(aj^BxiSgRfSrH!8du^?LoB9tE!n{0mL8x`0)9R|V{VcTK=9cvl2y_)4X6Wd)wQfZgy$1(0TE zXh^^bcq0OSvib!{&P@{G4bLio2y_TGR%h94_Hf#+kT*Q50KVEQxm@miI2?ZV`~BBU zCL=-Hs#bzGJgdNbu~<9;_;2-xu|ztZKG8~8fj3(fWDy9&8@&&s%_&2uYF@>-Bo?Dtx2Scp~tNtnh9Ks1kUS7mCGV5=gwsviu0IBSzuv5J1{5 zVJz;dBM~I?{R^@UIUsdRM}uZID=_K5f~)xw)V7kb}tak1i^q z(*)MsIdF=XMN#?2joq!CdXSmY&DG znJkWaGg=(?W~ew?%)IBZC8Oh`oebRpA7vUAeB8)*@NqIzRi`Q!aEUm+yHWxnjxAE04@&_Ujg%|9`@3mhjnm rX=e-B&xkivFNS!8;luTY=?u&akuIV^&zKZffkZuB{an^LB{Ts50JWm; diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/selectphoto_small_grey.png b/TMessagesProj/src/main/res/drawable-xhdpi/selectphoto_small_grey.png deleted file mode 100755 index 598676b9165e4ab7664a60c72ef9c548cbcda20f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 461 zcmV;;0W$uHP)%w0aB^9{sa2cSjGbBY zC-2m+*Un~oo_2O-BpU=l#^sjFINnHr1W14cNZ`K(@~Q*)zOVFs&+|Tw+e2yN{?NH6 z5W+8z0Y1;25{SST!!9P#azY>mp0yFC(b0MV4*bmeDI^PTg@6jY4FXE=rUjJYO$wv} zZ%Uw>7Q6`o2ER-TUbjH%@Hz!z;gOl@z(N76(@msiBfL<6!J}-DgQUby;kg0;ZlLUt z5>kB5+{L#HhAGXAR*Dw3IEk9lt6;PuXMtH zy$|ptkg6&8L>n1L;vDvAhfll{e~>661rzX6M~R5UKIXPocV zgTx)Bj$Dx`GB)wcC`*6xkpKyh011!)36Ow%dkQcBnCg-kN&n|?00000NkvXXu0mjf Dv^>J< diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/share.png b/TMessagesProj/src/main/res/drawable-xhdpi/share.png new file mode 100755 index 0000000000000000000000000000000000000000..d554570d95a999f77613160d6763ec90712d0939 GIT binary patch literal 1500 zcmeAS@N?(olHy`uVBq!ia0vp^3P7yF!3HE>yta4*q$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;1Ffc1+hD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Kep0RGSfuW&-nVFuU ziK&^Hp^k!)fuWJU0T7w#8k$&{npqi{D?ot~(6*wKG^-#NH>h1eo~=?wNlAf~zJ7Um zxn8-kUVc%!zM-Y1CCCgTBVC{h-Qvo;lEez#ykcdT2`;I{$wiq3C7Jno3Lp~`lk!VT zY?Xj6g?J&i0B&qvF*KNf0j6J(SfFpHX8`gNOrftYexnUy@&(kzb(T9Bihb5uTZsl3!k| z30CjxYvq|&T#}fVoa*Ufs{}MbFEca6%FW2a)Xm7*(b2^X80xMjmPQsX7LG=iCdQU7 zt_DU(LT&-jW|!2W%(B!Jx1#)91+bT`GI6`b0;hRU zy(zfeVu@3)KF~4xpom3^XqXT%^?;c0WDDfL6MkwQFtrx}lXcwI-|rY0m;yXq978H@ zZMos^5#lIw;A8CSrM(W@UkE%q$ibiK(SBsf0gYEF9FBnjTB5SMNuJ62 zaHdbD`uyoF?;b8M%i(;#(b!Wls%>wDP;sjM27RGwj%JDD%5z-xJXLd!_Ri?Lzv%wA zn$ueyH}dL6G)9Vi4DDO%s((&V{O4KzCxx7suN@9EI{8S;>sILALxv@fGtY$DADE}| z*rPVZASCgKUgmxE6r+A%IrJBue5w$#{?c5oxzo13pKPJ|Rk@HUQE0m1+R~6C zf+c?!zvIs?y+3Q8M()(0HDV&h6`lD-Yxrz~x~{v{eU{$7M5KP*Hj&#I2e;1H{n0UP z*DAS2-O}e}i6&|j3oBC+-;~8n+f&cDt#hEVj(~;xaLfV5q-LfY-aU4u^HecRHQE%F4yKWx?4kUVDk!zFVdQ&MBb@0Pi_B>;M1& literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/sharedmedia.png b/TMessagesProj/src/main/res/drawable-xhdpi/sharedmedia.png new file mode 100755 index 0000000000000000000000000000000000000000..ad1203f6df10413b7c98faca5f8684e714a9c18b GIT binary patch literal 983 zcmaJ=J#W)M7Q%se_F^RxcNQ0UMDUN+wh#ezv}?Nx`}6$=7TA`;?j&_V_j0Id7y3Th?r&Ah ze#?|CcJnGohmZ<5h!`Mr+HL?tg&pcbI*-ge3x*KVQrP35s(K0Ju#Z5JTZ@~5C<001 z#Py^kiB~{E5EHyWUnwrG!=wZgDKL6i>dm(ru&in$Uv#CgO+q}#^WAQj>#lLw-{nPF zmLrWsB2E$Upyv`JjJv_=SV2XB>DwN$u?r$aqmDa7VQHktDLCFl)(u8wq6Ona!{bFx zh*BB@b^ZTP$C;o5Qbs57{!=)p^gP6uQGh$XNe`~E8oBad&PN8peg)(9xQeAFCOBwf z59GEbaB0VOE!+(*5AnJVi*7&+*F;5CVW|RV+ZN1aQ*v@c$YfNFRz1I-6|yN!T@zE9 zEQuRpV$4;s*>R9d#$4-!o1MyyTEX$CXBGMOU1VuKcEB)YXitx2W2)YWYfXu0(BJ$fas7u8H9{8s;SZg%na%<9VXmxoVd zbFqi8b}+Mdw)XJ}UM_t8e*VS9M}y4cIqk>b<~-edcOmxbjP`ZEd0RNVPc7|vW;Vv$ W`?6R#xb^03bk&OaE%kM_HaG(L>oO$( literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/tool_brightness.png b/TMessagesProj/src/main/res/drawable-xhdpi/tool_brightness.png new file mode 100755 index 0000000000000000000000000000000000000000..1d1269e0196b71ee16478e07fe66c6f909037cbb GIT binary patch literal 1607 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y$nXGBh+ZG;}qwFgI~>F>*4uG%>TZ zurzgo>2=9ZF3nBND}m`vLFjeFsTY(KatnYqyQCInmZhe+73JqDfW2&$iQ6saIL(9V zO~LIJ3!HlOfsWA!MJ!T8!-RmT2gHOYTObFX@Kf`Esl5o8te1aI`oX}!wA<6gF{I+w zn;E{|(t#pvlQm3ld5M-NioA@Pc*%27toL7bt(Eo%{!MDS@W`!u;SM3zdT0ABC2QYh z1qLjRon{u96+LGkb9#c!o%1K}%v|#10Q1bmcPD?JJ8t{@-k$frclz};J^qt=DDsPy z*#E{ld-nFZUs#+zIv;TlcqPId_%V^^qUHL#yd6i{4SoC%Wrs6seLUwQ5+w5eh)Y~B zdsE~q|6{?mcBic_d~98lt?<^XhOg|P-4Cw1OFsn-7}E}Nf3VnC&tsRwx_4jXoaV}a z3r|j8H0@rHHzRtcJ|}Z@!T|@1=XN*F-8$gK^Kg!Nq~wiBJ(XNp4@B+=s3$PnOzgQ? znEGJmqq)!5``X{Qa_4NcQFuzSe1rGN8AUP7#tSq(cPR+`KWg58o=G_Lv@lvW-Na2V*g7w{sS@@QazH1$G?ir-k;HP>rU-GzuB{9Z20k^cd@H*aZ0sCDeJM~YqCj*6>~&S<U$Bwm zqvpvOch`uStQU^BuqJKqk~<6Q?uGqW@a)|3v;)g;F3#Gq;{8JYZ(5zMwU?s1r*By+ zB(gpEgK|)!dgi?KO&^zR6Wd+A`0m=H>ljP_EG-XkKe|D*-z-h_@ST-5jI+PC>{y-C z9R8xA#q_e!`$y6iDviA+M|S_}a8;YrVXm37w#EIog=P4oSm_h4W()gb{x)VapL;x? aftg|Ql6|IyTW(AT744p`elF{r5}E)tYI05h literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/tool_contrast.png b/TMessagesProj/src/main/res/drawable-xhdpi/tool_contrast.png new file mode 100755 index 0000000000000000000000000000000000000000..52ca3c9084a666fc67fd362cb77d870c209b5fc9 GIT binary patch literal 1155 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBBuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFe_z-M3hAM`dB6B=jtVb)aX^@765fKFxc2v6eK2Rr0UTq__OB&@Hb09I0xZL0)vRD^GUf^&XRs)DJWv2L<~p`n7AnVzAE zshOFfj)IYap^?4;5Si&3npl~dSs9rtK!Fm_wxX0Ys~{IQs9ivwtx`rwNr9EVetCJh zUb(Seeo?xx^|#0uTKVr7^KE~&-IMVSR9nfZANAQKal@=Hr> zm4GgVcpgi&u1T;Y}Gc(1?+||+C$jQLf$_=yk)X7nBro3xGDeq!wkCrKY$Q<>xAZy=;|<+bzyG&4cPq z!R;0ooO<@yWg2!|S1#a@zH@zMOQ`aN<2Jw4?K2ZD>ie4WRJ>=b zKK3o*`PawO_MT*5uZdxJ(3^YEOg_hbft)!13T5U-89l$L4f}c(pM8BkOGeuHjO^<} z{Jy>t+!xf`q_=cmWN}U0;&4%dH$ccuYD&*Umej;04mTw@0|eWoLwX*vY)shUkR!n- zpuJ4wNS`KSXF`!<(hQji8fu~{eV&Xf6OtUWW=KrXO5BsBGZ>58Z N1y5H$mvv4FO#qKwe+&Qs literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/tool_details.png b/TMessagesProj/src/main/res/drawable-xhdpi/tool_details.png new file mode 100755 index 0000000000000000000000000000000000000000..db56a7a9fd54809b6428b582d02c4a18cb61043f GIT binary patch literal 1358 zcmeAS@N?(olHy`uVBq!ia0vp^DnP8j!3HF&Cf@1;Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS=07?_nZLn2Bde0{8v^Kf6`()~Xj@TAnpKdC8`Lf!&sHg;q@=(~U%$M( zT(8_%FTW^V-_X+15@d#vkuFe$ZgFK^Nn(X=Ua>OF1ees}+T7#d8#0MoBXEYLU9GXQxBrqI_HztY@Xxa#7Ppj3o=u^L<)Qdy9y zACy|0Us{w5jJPyqkW~d%&PAz-CHX}m`T04pPz=b(FUc>?$S+WE4mMNJ2+zz*$uBR~ z1grP;werj>E=kNwPW5!LRRWrzmzkMjWp3bTYG&Z%H{644~kf%h=vIPQxAv#I_q3LQf$@;1i(^Q| ztur$=<{dH+Xqy|b(x=DZP*X@}qv*T^Hcb5om`f6pTc-9dJ>95ObZo5T< zuN|ND>tEjUbFt6doERB_>>wb$-gu>p!_2BZbZ09}yQWc{A}_q|_0X zo8NrYzgy`YnHPFUc}D7%^C#4|%brq@U)_`*kaGR|1GYWCRC<}SH19sVQB?azTdkx; zM0A?AmI?pY*tl3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y2=9ZF3nBND}m`vLFl!>sTY(KatnYqyQCInmZhe+73JqDfW2&$iQ6rvIL(9V zO~LIJGn{($fsWA!MJ!T8!-RmT2gHOYTObFX@Kf`Esl5o8tQj+{N*NfK_IbKEhE&|T zGV{E*XrRdP=X>2YwRUoQR|x56s!BRa&d~fE<6MVUD_@7BfS- zJdcUD%SE`kKygcE_%hp~z$fqJ7Z}y)&uKhekbdvXozGv+wf1v-Ketn!Fa6w|nbQkn zuO~_H&DdJu&U=H+>!8kMHh$eIE2rutSMBy z<=9w#&~*cY+KOx92Pd|b$o^pe*UWv&O8k-GOP2Qs+E&Z$Kaf4aTj2KM=&tLFqLMRN z?3tquhTnRidP2RYl&_>w=?Bj@)sML!7I5;*NdF0y ztM5z>-m=wQq@?FmoAzb>C1%H!*1tNbbmK6WN3`OnwYwgPP4(5C{KezIuHXAM)tpw0 zOV}fLeWmq@*DgW(JhICi+1oABzkfKrddd5uD;C?g=+yUn&vLfu+LD#w$-QY-|407^ zQDIAB^jRf+ zam>?2HcrdX6A%5f#Q1IPw+gmxFFv>Y_&@D?rc&3Bm0vTHg!Y7=y}9gL=F6|T(#vIM zDd-;aS+KbA>BIHq)?O=TOv=n>sr$IK_R{4AM+IJbq)!d;tbVj|^0y=Nm;2rl{xA1= z*4@j~rrmy6aAex{;Kpgo|GqMtBbIqJa_J1VmkXT3E|$F9a5?c}%F6}wgPzRa6@HNa d^npU10}P6tM_J}gugL|K?w+oGF6*2UngENkZ$|(C literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/tool_grain.png b/TMessagesProj/src/main/res/drawable-xhdpi/tool_grain.png new file mode 100755 index 0000000000000000000000000000000000000000..e811faeaa876ac08b7e839bb1cb4c5873b1d2fc3 GIT binary patch literal 1091 zcmaJ=Nodqi7!DMyR_lf+bt$iLhfXq?C3Zq%9VcA|oKmNQ4!B?@d2K_RyqLT?nVE~r z!3ByJDe6H{1QoGpFFjPyqT&V?4+;uGPxVq2wP;(^`qFk<4~`+pd++D_zJGnEn;Pp& zOIDXq6jd5+km6(o?l*rP`P)wQ(ly&bwIdJ#9by?cdWT^Pjz~}G3S{q^SsF}1aJxuP2bGL9fe5l72r_<; z;^jEN^9&aV@;p}wd|uASddbUsxPTDk1>ZI>^U%bbrM3uhscyy>If--|#-_ls>2#V& z`x#`lvRo(>ay5KD4?%eBjDcmxW7zBS3KFyxOEa;C4B#rtDb$HYnnXICf^N>r8umvDp8ix;~4xaU9OY`%hszkuf0~hc@c86w7QTv;BEe9eDdkP~!m;=Ya#<1#>o)eUM(0grdfe^o*pkES;6sBdUS8+0{Gt?W$Ax>)O>DAI?9&RJp0B;(E)W#upF6X?6LsjStr4QlCe<#NLHZ z&s3MNqqoWyReWtYdiql^IsRmPwfb>nc(_C9Te*GnfpZY)rQTZuxX%2kfF>-A3ebGs(h;(+**ULMRwr`ER3@%X(yp1!R<&2{G-GrH3nDB{&epIdCnjgMn?4LT zyr54`#1}6h;)5WHeNxn+;2iiMKDmL2C^|*(L2>AlC)+xGu!bb(!uNgufByeFr#n0L z)HpXdDT=B|?2RVLxY_=ymXQBj>f%K*xNt0uyHF3#OD3d33d%r`(4=0Ngpx9FcmlRj zl!I1NX`B}K3o_C?l8x~cG=s1ys%=-nkmNpyK?e4!dXWBl{}ByTB}gCei>zowU{>8b zXu__+j+8vuCkGUI*G|w@5Qu;Vu>=ZQPPc?Yke<~Q$lTs$XfO-GeL;FIskGP$BFKcm z@A0{1mg4}=d$?vl&vQ+{%W__ZB`@#hngu^Ecw4~yLz8Hx(jz3J@%dO}6{NEm8v?`R z^LbC+=RsyK!vz8XTf^&h6NK9u(6Ll->sCWaAqp+oR1K^m9oULe2KD10O){N3f@Unp z>ehUjNWqwbWH6kEwU1N+isJvFnzn$pa1#E>_n*R6YQTU@5?ZL=lu6@y8thPp5HX>I zk(oj$SE^!X7GY#%kpUuIJZLI%wR+h*~iC?s?XOS%jb(I8C}JgTY)zEC{mGvJ1G7gK z)bhD_%j(T@mGZgx%5oW!3}ZL;uSS=)hdUJ;HILa1=Sa)W4<9o0)@GP{V zec$bhHP0uV)5D*dh8||xhqiK4SFhBGFPhG-&+>6cv1+uwSU0-1=p3ysZWwi(ANkqR z=xX3*CPDo@*WijnFtYAsYwlS3k`f6Xyz6eQ9a>J}Prq5boO)86*mNOxZl!(A6S0oy It#J48--6&~bpQYW literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/tool_saturation.png b/TMessagesProj/src/main/res/drawable-xhdpi/tool_saturation.png new file mode 100755 index 0000000000000000000000000000000000000000..92f8d6c75109e2418df4ff3a1eda67450ddfdaee GIT binary patch literal 1497 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBBuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFe_z-M3hAM`dB6B=jtVb)aX^@765fKFxc2v6eK2Rr0UTq__OB&@Hb09I0xZL0)vRD^GUf^&XRs)DJWv2L<~p`n7AnVzAE zshOFfj)IYap^?4;5Si&3npl~dSs9rtK!Fm_wxX0Ys~{IQs9ivwtx`rwNr9EVetCJh zUb(Seeo?xx^|#0uTKVr7^KE~&-IMVSR9nfZANAQKal@=Hr> zm4GgVcpgi&u1T;Y}Gc(1?)ycrj#KqX$$edz68J$=B1xF{I+w znHjboGL9n0%g^&adEl44a4LIU!;gtdp#r|Dik1hD`SA&ATNVelOfV|-QB*P$lVUok zHe-umkc#4*Ci%7U>Wdm(HVP?KmAB6R-y9h+{o}j0=T5wnuRF?Hod3_<`t!HF#=57C zY*vZdug zYiQk+j5a*!w3X{~&fcPPy*u>oGF6luZ#6OPzd4K1{|&#Nv!_AWqi*F%8v|P_{rKNI zZZ+l)HCR^`H;47sKPv-PF0RjaW~t~eJ8?zx!$pp;<6p!!@a8rgcl+>a`Sa_~j3%=S zEAVAGvWb}J9P6}B=s5D!yuU(F{T;tlOyC*in8HW%+*~*pPIBMz=t!-A;MX26xrbfC z*G*g^7by2fNPW5?82ejkPN?L=3+h!V|9d{X;FkO)D`fm6c`DD_wj&ozG$t*KS2Qr@ zx4WJHTTDCRY-7jnq%&*@Pgr<%ZZ2QCIOxsJ=f|C1KIOl$=(Y=cM31MmtJZ~Yrhh+~ zUSRb}6RzUEe9_CEIbO89G3rIT*3+)d%i@^5SIrFDT2@pptADU;!uR`A{`|hkP}fu@ z|B>&g^6A&N6ff<3F?n0fk;O$n=3Ww;YVpxD;o@=K-5-i~zk3yP*Y&4G1=qJdf86G_ zM=i@=AkEXPll+hUZu_n|vs}-;VwP1T_-v~Qv+>vX21bUBb5ah(OmDslDr`Mn L{an^LB{Ts5Vc8+- literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/tool_shadows.png b/TMessagesProj/src/main/res/drawable-xhdpi/tool_shadows.png new file mode 100755 index 0000000000000000000000000000000000000000..99cc7f7b558133b2f5d70f3be56808a773f3ab8b GIT binary patch literal 1197 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBBuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFe_z-M3hAM`dB6B=jtVb)aX^@765fKFxc2v6eK2Rr0UTq__OB&@Hb09I0xZL0)vRD^GUf^&XRs)DJWv2L<~p`n7AnVzAE zshOFfj)IYap^?4;5Si&3npl~dSs9rtK!Fm_wxX0Ys~{IQs9ivwtx`rwNr9EVetCJh zUb(Seeo?xx^|#0uTKVr7^KE~&-IMVSR9nfZANAQKal@=Hr> zm4GgVcpgi&u1T;Y}Gc(1?z{t_k+1bs-$fK8_rVH3Qz1h>aptm)wsdZ|?V_g<)?SrSBgtQ%1dZ)@M9yf5)VTt_D z$}MR6{;r7ihgQY2b#Ic@A|K5WUcta!5mQ&Oeq$@MWJO5l3zkz$%+4JUaT1#(_Eb4X z@rk15QFZcCuLgJH}^D_XPc^z z>n}8%u`(m=ev4Yds#UwY^3L1e_bhvm`NimIYan-~qVAH`Efd5pIVmn?(3AiFJ?3j_ z^W?>xx4QYaNKI0H`uNZ)y|fdoY8x8YI~=L+)s?xkoPn9)MbgokhPkhKKm~}WtDnm{ Hr-UW|3Q3Z{ literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/tool_vignette.png b/TMessagesProj/src/main/res/drawable-xhdpi/tool_vignette.png new file mode 100755 index 0000000000000000000000000000000000000000..c9ae138cf8b38704b2b5fe7ac0579aa923c0b6ab GIT binary patch literal 1150 zcmbVMNodqi7!Fpn7K>PM#Y2pPSa6a_GLtr;qb8FXJLuGLI?&Nm)8w@i+T_LL)tOcg zE=3Rpi}g^!1-wb22P;L|gW`fzZ$%J16s-qQ#06^IaCvDv)k9G*yyPwUzwh7QsdU4x z%8CsY1VL0L>(vaN1O8jS1b?3s{rz}akK#Gh2wPD>a{(b6umzAwOKSrepc!2U$3PuH zl(m}K9LlBkNIJA=&6lBzmV?m*QMaS$XnH$9WD96B?I`tb^cF>$MwDubq(Uht2J&Wo zw+kA(8?t(LyDl2kj_qV!QNjckKpI)JI&4oWMyVNI39tQQh9YM~PbJ;wza8=>NChvsmMQV#Z)&7{56F zD3;O@u0Ve|U;216-#oy^9pmEG$PQJn!EH5|ROM{(>6?DJ;zWA6`f}})@!jXA%cnO? zG_FXGz_ZWTuLIxEBKvisXL1Eva(Qu0SAY(L_}*2o>W9Dgy_|S^^xlK@xBE8k6PWRv z=?7QiXQt@$`yb0aTh?B`|LDfhy{4aK$Ky)-wc)p)mnIKf=m`WiElbubRp)wpe!RIN znV{;xmy;8x^%JY7E*w!l?JOJl^6|x;$z$u54h-zgla;T=ayyNShez+eU)fAd+#LK+ SIsEXFe8 literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/tool_warmth.png b/TMessagesProj/src/main/res/drawable-xhdpi/tool_warmth.png new file mode 100755 index 0000000000000000000000000000000000000000..aca145d12028d77e4a9a2c1549182f298a6bf960 GIT binary patch literal 1795 zcmaJ?c~BE~7!9Y~aw&&YmJkpT2ni&RNTdnj$d~{U1XNU(WCH|7DTLA zI$Dn^AX21OaD?FyQ>iFOTR>D`w2Boq2vuouv>OVvf0XX*?(dlQ-uHdK@9k`HWO%5l zk-ZTHgE3`=F{99N1Nz_$^wGDGpK}d5*df7j2p3L5SfoCJ+EJ*^A&yB9jRo0MVO3#CxMR*^}T)C6TE_KVb2~qS2)M zBx)2hWHA=HqG6K}L_)>m<#M@~+{X)+3h)F9g`&|Q5 zzW*sKi_VZh_$WvQr%QQg2Vz}M1co93BE*>lP8&DFV6yz4h6zVgY|}$BYSY`FHW&X!WlU}cgHM8KN>T$ zXwL39GBBlkFHMzoczRxq-*59`!c0|AU-#N#Rok~~w{H^E57CR}98;mT$#r03L2FFsen?eEYS9jOTirC|P$c*1!p_gV&k%_prAFPtV6r_Q#0*h3!;u?8L`cs5oSJ2w_Ww#H0(ajymp9tp#rC$ z`OVIR3RBC`?5xcoy)sn2)mixa4~gBj6Yb7@=5Ma-OoA_ja(n5n{)JCG9B=!y-OOz@ zISaYpUt8&rq!4)inW}T`L2ho%#}oK&HfWlzH5O`|_6Pg%RD6woL(S{K>=$5} z#BgrbH@D%l0o`|x!{U8phcXzIst?IR`M^P^v}^hP+;-rRYNn#Vzvp$ltL;JGv<MN@9 zCRxSkeBhSW*KMmapF2_g(A}_$4S9*hz9(`f9ulbl& z-qG5Y&qp(x?P{CsvOM~CSY95tmVaq@-v!s&Jsq>Fj6=)zYuNN`F7yOFNm8bZo2Y+~ zy6t=W-+F*o47N*vcIiw})0+IQmi%+86}YKYjnBq5x|+r^A_XQ4$ZaM_0I`= z_3&pUirU)`8|UjUZ+^<>f`^WmoZh(pME%LxoX0zgi!Ue}x4Nqwwe&GV*=C_fUPUBm OeoL(2aAqSTA@?u+OT07y literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/tune.png b/TMessagesProj/src/main/res/drawable-xhdpi/tune.png new file mode 100755 index 0000000000000000000000000000000000000000..c6d6b9c7f830dc7a83c98914f7d490d6f5747e02 GIT binary patch literal 1010 zcmaJ=J#5oJ7&R)2NRzMQ!XjiCyeAlr&ChP#slCpkbmH`;wT}K4V`SHwzLQ zBO5GTDi&Im1*QstGJq;EREVKMVnjly5)vCisGQRzWgu9#??>;w@4N4N_i!P9eJFe} z%rMMQZcZ)Gag2VWgCY8_?G4y;xInUHQp8o#fG%Rv2Cg8GvtSJs5H!~B?V%}#8DPy) znUuA8MaLEg0}SU|4rMdU)U@wFeHjr@K{eA(vEO%Jv%oY`?4qc}G$(`V=3LW7#b&;w zHh zBu+?*k|d0Scua`%G5ShTA*qOx5}yE_ho#Y6qpB3t*-k9FO0ji99EIl_jRx09aM-Q! zf-K8{Mm!#+h^V)26X-{6Z=|cBB2RZshnUy~fg-HnRgz+9rpHIHoSv-hb;?8w#{1CW z1uhmGsSDJ!|3fXShxSMTo#gvZVXw6AAijV+yz1(-an+F^l%r%^1POLa7_W4zxKPIg zdv)x9Oi==(i>7VhhIhG**EA((dj#4#%Bd-qDsZN0DA`OV7M~E(X>~R(2-##>l#;R} zigHqzkkX>s<*Ha;wUAA^T;qg0)0Z1q!E$J16}jdbGG<+Df%cIVvwtpE`s#JKM*m#o zzFeLr!v~H1tI^#p>YiZQvn^fpjE`*Uc9+`vC;T`>uS7Mcrc3^(!-Mqj8!&kK+Sj9_ z`8)fM4{mHedG!qrhwHa)p8fIS(x!Z7_uORb{m%W3F)6$q3H?f}Z6zX+$mDIfv{;#Z z`TT9Zcz*jXv-P>vYQ|b?@HgAqkl1ITcRD^5Vya&nA0F+GKMihSE}K_(W|kiO0oCk5 Af&c&j literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/web_search.png b/TMessagesProj/src/main/res/drawable-xhdpi/web_search.png deleted file mode 100644 index 345a04629812a39828f9f831d02dc09dd86c209d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2832 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 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/bottom_shadow.png b/TMessagesProj/src/main/res/drawable-xxhdpi/bottom_shadow.png new file mode 100755 index 0000000000000000000000000000000000000000..cf81b6c1476760e876dbf17350586a53fb9264fe GIT binary patch literal 1014 zcmaJ=&ui0A9FIE27;J~#90-r(qG*%8uF2ZiIMSru3TBS3u);u=C2wuEB`-_fOtzy6 z&VvKNyYnCL(3|YwbvuY-!a(t)pciomuY!B&+RlSDBzfos*du!tm6&U6U>(uI` zZrqhE?DA%U;bYgQY=$XJ#lC5+Ap(|B!|@dMbpI_299v-*L?dnZ8frQ-+X0&2o~>Ei zYgXQ7r|y74EK>m&5fjAjx);i^!nSo~x=+jk3)&E}rm*Kh)r~oz;Q#@VpGaA02!SN= zFe^$Dyah68m=V(Sl~OP(i;|p~1f7Sa-U53?uIlBEFM3kgCLz8o2vHRA(FBi!h5+;V ze4>%bq$na4Zh6FvQ(nk*6?7C@f#VYgdmvFXm+>Z1SQ_bh3a;Oi^}Xu*Wo^aaSL zla#tZ!}vecb$jTLRMADe{}c{uTRsx1D8!qAMH{!mC9Zr~3y?{0P{Vk=TgAC1COB+j zA87LuxW3?cHjcs@ZMgO5Bq?ExL@3G4HFdL>pXx>}1r{WylB3>X?vv%mkmlTM_g zrEg=4!T$ZnJB8NIn~g|Zz5U{7PyKKJ4o{jzt|ew>TCdbcWoi0oZ)4yYx10O2!!<`g rK0p1w!|k?BO^W9h6X=03e(lmA^R;pLiRk}oB{#8Bn$=$ymmZ!0?{q~} literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/doc_actions_g.png b/TMessagesProj/src/main/res/drawable-xxhdpi/doc_actions_g.png index 5445d4e10b8fbfe92f94c50d37c5cd0157ba02f9..109c13fd7aa78941c7ef8d996deb8aadd1824e43 100755 GIT binary patch delta 576 zcmaFF`Gj+W8&iydnURsDiLrr`g{irrp{t3Lv4ydVv7@<}v!St(iMg?oLPc(YudkI$ zesXDUYF>$_i>(q+L@y;X#R{s|5SQM`i4_;uunK>&=XVoQE6)Tze}nXxXe*-`Ew=6t;jdS|Iv^Kv2WVgIY(L zBN}~QX!<4af1EJ)h=kdW_Xjs96m#^O8vk^hmTIf9yq}3hk;9S0NuWufMZrO!sqXxN zugo&*e@~Q|c*QF#t8Sn7(x8udbrrj6_8oY7eAS71$wP7`cq&)%*V7l zON8FD%;dEUQF&T4ZC#nd^VwS>CEAN}&S>b@Wj(21ePrnzKaQj>kh_>zYI!@8rXRQI zTvS)=A)-5>Ohan|2yJ3FZFUK41fh#;ok?F?C%R13Y*S!iY!bM_rP38E_gSUu*IC8D zEe?xTfYAxLD?CE3tY9Rq(sfnbO~`ebM3Vpu)bF5R_;4_~fsx_Qg#|Ne6`m9`0D-5g KpUXO@geCxGsnjU| delta 574 zcmaFD`G|9a8&iy{iJ66wg%OZ+axpY?HE}d>GIDY?Gc$K{c5ySdv{X{4$Sv^owQ|W% zF3nBNEAe!(RRW6WrDUd9LG_yA(mQz(lL5>EBV3A<6pBlNQq!zba9d!EOYdYoW~chE z*B|mTFffLBx;TbZ+!1ZXv3(Yl0FDXYn6#T;C^j7l?C;J5Bh)Ndi$DDgw z!Yovx6Atoqq;&p{GrD=i$1yG}?T2Hai1Lc`9wrt=4o40rfhK_#1qXqqy7NcAGRx?F z^yzcS(iWXH|9#NTkgAyF{?pHk@AwlTYFS)wc`m4X*0i7yl}U2Pye#b_5C?_$3*|VJ(ck+cdK9hm3FM`zBjqQ=~A2dW3{Q3>L+qe zOjKGqWpm+HX3P6a&K|Ounw;-e`89a)pXgM*r#wyq!8{;WDZI$`5NWr0<|*=Zw)3Kl zMwh@6AZ~P-XuCpMrHc!U%sfP9>-VU1`4|GdBG9rRP9ad{(+u^%EBSn#i&%wRA?VwJ zya^gwV023%FlV2^Bn_jZ5I+M+a3D1C-(%uoFxkGyz$j_LGzK8>boFyt=akR{0Cm;M Ai2wiq diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/edit_cancel.png b/TMessagesProj/src/main/res/drawable-xxhdpi/edit_cancel.png new file mode 100755 index 0000000000000000000000000000000000000000..d050523b79379b55604d625feb5d55593954503b GIT binary patch literal 1448 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 d;|HxmQh>quukFt0+-m-Vq>e& z0@krQYN3@>YwLjrh)1p3K-*NUJ*-eck%APD>L@5esjYT{U^^YBe{^Twe&2ihe(!#> zZ>Ocq_w$+N0|0o<|s@?7N?R&V~q` zl)Xf#;;D>@cs{Y9l)^JgQ!=sA0!*x9zZ3_>S|p4CJx*&Ni@wlcl31kdQM(f6?h?an zXjFwRkg}fym8D995=jb&gj^v9;~@elTFga+h(LryLMRX6!#qBW@Hq%7;fW=P5E^^f zj5kV`D@m6t$9yrIl$}r0MhOg?&1SBd&n2lm7!ixbFb{=Ml*4FnOeF?dW8oM~VdEC$ zxCx^OBTbM7$YoKZC5vb&n~C&E3VNeT_0+JzG*&34WUxhJgb^+e*6Uq)jcS|dbo}oy zo~dohEHUD6I&LD1D2(YxZrC`Osoj4&aw#&=NKz?+X^N&$PGUuR+(0MErEKO4S4Ze1 zNK~{u8WkxJ0m_RKA&3Y?WeR~PL5Ro_cw!V8xA82j3{6xbDnYJH zh>GGN45J*!CK*h$#(?4DehJ3!7?%H^SV;6yWU?w2gH6s5QnQ;*_hpy|>1z?z`D})=Ey`h)|S(Wx_HM4h@lH{^X z%ca}d$pw>Mo^o>cPs@6D%pK@hsJGhHinRU)>XYezf`&gP7_xWydcMHk?_s{vS=FtS zHxDPsWs3S`im#4j6$sxeSN4t^3k?sRr~2SK>n|aqHQ^g|*S2-uEgPf^Gk%)BYxD*U>B8h!OYsS?Knv8+p)sQGjPZy>K0za2&ElRxb#qd;JT!{BaZ#8%wgzR0i3eE~ZsE^0Wdt<> zFE|!D*5#bXSjFLy{O7uC^P8>UTIudnUGDIkcN0P1muY`y?55tgZbf`-*eh*Wcz1K1>(>sV+oPN^kgL-;0+t8a%c%JlNSd!?$^H zw-0vxek2&A!v%Gs@=zWVk6V{3axP5M9xdL-!g3l-e!y(0jz zb=9m3X>2Z7>b|1Z4=J}-IX9aR5S7<2L;JEb`VyV57z4hHh~N8howX(}U>8)^I;Em5 z^6S>vd54TAwAZTII(=9CR33~}bKKe`6U}wzx6FM0T98loShG=;lAU>b%Zy)$3V#mgN z+=$$@f#qoO_5cC8(!3m!B2^ZGf z1Q~Df)ov5LA&2^$+v&C&aR+WiKKv>45I|YC)W==zwbFRqceN9@%rh2!IF#MLDX%>8 zAr*9@u5bPE<$Jo{Y4F`S0}PmEPWG$nc{O_Ik;i)#&i7}VTQ@62Lp7Hwk0?D!;|U(+;>O*rtjHUj$^MR1@^N#}we*>DL8SbN2~c|Ij2wihO^9 H`i;K;5u^1s diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/ic_ab_share_white.png b/TMessagesProj/src/main/res/drawable-xxhdpi/ic_ab_share_white.png deleted file mode 100644 index 890d00aed0b8ea0c6acd5ef7b3a1ebf5fd41e40d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2210 zcmbVOYfuyS7T*NWAZVra35p?rL?zj5-ie6{1SHC5`GldXjRd?>#wToM z1XF^wey~CrxJM6%?+Fo0_ryy%GQ!$5c%G4q8c@NA1aDL&s0~~rpYYZ$7p1LYkbr-y zg2eL)?}Ca94#WFt^e~=5W{{*5h>mA*$PfdfvmtLhl>*T~3Jrv4B#6qTaJUcy|NbJN z-t@9Ku1FB@-WSU82?_+!azQXLF_D}|BWv_>5aMt+AcYE2sU%c`WZ11nBu0|j;680Z z02`!wr4~_Y)Of2!Nvvik!Y81SzDq%+4G#WbSZ#P;D70jtQKAJQG6htrta-iFHXtJS zuP{EUZ4mF)!k`E?Xm;wQXg}iIr@?6L{@IaL5sii$s#l^-kt7H-(w!<;jR*yN0{Vt5 zQ_8pylO=BvM5vvmB9(1QmGK+PxYbt zFnt99zDyW`+q72q5*-{5&7H5OpDMtw2~hd0A)U`5UfV`MvpE?OZ~2& z0l@Z0p}Fl=;YAan&oW-R9xHJNQJ&6)TEFQ@Iixr)$>fPKMFu9xJ zZF6VlXj6;@lad2CGO*j`n29~t7JqN^CId(q;WdP~&0D$H1okYoof~RyE^qP6o*0d) zbu-zg{WeR4!p(Pzp=ZhWA?(1(+*`NODt_9mJy!I*JnAM%peJ|f{ z&C<-q^zQW1?6I=1$kjGWSuy592soqe+~xDNN^$FTNK;gAN=c*VAbFpBPx2%zROJ?D zq8zx-RSZ2hf6jGCowaO-#Ta@f&~m&S_P4@_@8*Tg-Kv z#&ZKJ%X44k>r+of^S1(d(ctTZ(>D(2?q^yj7{#RdtebVZQ z^R(LL&7T6C_(VbU!3FMHL~n4ZHQl+{5s!8#YKD8dZ_m#+l^V!)*$z!te!FV_rtMUq zuKi-)p~F?3r-F1Co+O#)j!Rp)3RswPxF3rd8z>$gF2e(Bw-nhH{!r6Xbq9O$2-wPH z{1Ji0{hYuz6s+_Q%z(W%I=MkTuPjFvK^57$JBsleb`f{IF}!N_lV=@dMQ7kLN$ywV z_3d5RUAC5!rdp_boFQA2k?LY8q03}dzE>Tu74p6BE9MhP!Q=9rKE5BY*ZD*f1BWp_ z+lBoM!WgUT#C@minw$ zGjYy4Uw3uipI}Q#Ilx->Ys}a&b5^3u*{R`IB=QyHxGp(4CHDE0-JCmxOJ0mQEV<)_ zej~6w#JK<_%yu0x4>K3=2W;0lS=qcfUGujCu3dG^`Wr7_TmKq_{vm>Ie7C3n50m?N A^#A|> diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/lock_close.png b/TMessagesProj/src/main/res/drawable-xxhdpi/lock_close.png new file mode 100644 index 0000000000000000000000000000000000000000..716b83b663c2faff8bb1cd310b8c077e5c2f75d1 GIT binary patch literal 1597 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 VR=|NPDV3ly-P6_2Wt~$(695LITX_Hg literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/msg_check.png b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_check.png index 467e62be6e8c69ea4fbd2268a99cc7f3d64d0b68..5a38cea3e6b8a47c64ad0b47ba449635394c59f0 100755 GIT binary patch literal 1540 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBBuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFsEgPM3hAM`dB6B=jtVb)aX^@765fKFxc2v6eK2Rr0UTq__OB&@Hb09I0xZL0)vRD^GUf^&XRs)DJWv2L<~p`n7AnVzAE zshOFfj)IYap^?4;5Si&3npl~dSs9rtK!Fm_wxX0Ys~{IQs9ivwtx`rwNr9EVetCJh zUb(Seeo?xx^|#0uTKVr7^KE~&-IMVSR9nfZANAQKal@=Hr> zm4GgVcpk{1iHq`zbF$JDTz5Q`N^fZsd*)yF1AWQ8NHOu6e~j~BS#Zs zLvuq@Cr4KkLqjKLCl^;UCksPkXCr4v7dMz0*z`I%Iy$;qI9fP4TDTY*x|%o{xwyDF zy11CRI=UH~TbjZ2dgc|EB<3Zj!tBii+6&cdj#sahb5UwyNq$jCetr%t1q5W|m*f{` z6IBSrX}c;*fdpDfj7%+{CiPHcObT>s^yGSsXH@xA;R1E01QSCU7p%_%HM0 z=KB@q2VOtBHMBl=Zq5AT{b|a7kt+?KBWC}pzvJ+KR?;>uNwe2MGyG3Yu|MPhI!wa*uEAE|#xlUp228Y8=_M*mbH_;Nu0cw#tpSk2us_-Kle;ck7Dt zIqR0#eZ6^Qx!$s#9XwstYmS+p`rj(<5N)5I6{CJVwrkhl^S=^5+`gi**E#T_&}w5C(`=gDx+0}VAG}R5*uP8F{$2!{&(or dTFxqg1crv#@)O1W1*)KO+0)g}Wt~$(69Bo$MS1`L delta 500 zcmV-K}|sb0I$e51&ZmBAt!$U!%0LzRCwBA{Qv(y!(akT41)}? zP-=ktYIBP8?+iUTXhMh$h_wb&l+6d?1Hceg84M0;2jVCo76syUKu7Tpq=PbnxB`i< z3w0FRKsd+`h$mwacLL%BdOOGrh*tnHGZwi`Ks=Y84gw|IEkMkPMeY<3M*y?`UwSzR zlwf~1LK84LcnZWpK*xNiSE2?b)OFa(8zA@y#GXLMJf&y0pASv2=-?M9WPtcGJqt!y zS%VEE0`We2R<7t}4Kk<%;$=81S4t~K63QA7m=44pq&7c5xnTm1@`BQ`CYRLa2Pd?= zFoWihENYfDK>U}K1{yQecVPmxh%tah>WR+Ys z)acv00`WI$l{M6G5U3b%1mZW;C~K%S`T@#C-q3_gQCWizFp@ex1Z>b51E~wJZVR|k1|%Oc%$NbBBuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFsEgPM3hAM`dB6B=jtVb)aX^@765fKFxc2v6eK2Rr0UTq__OB&@Hb09I0xZL0)vRD^GUf^&XRs)DJWv2L<~p`n7AnVzAE zshOFfj)IYap^?4;5Si&3npl~dSs9rtK!Fm_wxX0Ys~{IQs9ivwtx`rwNr9EVetCJh zUb(Seeo?xx^|#0uTKVr7^KE~&-IMVSR9nfZANAQKal@=Hr> zm4GgVcpk{1iHq`zbF$JDTz5Q`N^fZsd*)yF1AWQ8NHOu6e~j~BS#Zs zLvuq@Cr4KkLqjKLCl^;UCksPkXCr4v7dMz0*z`KOx|$gqS~@v7TDTY*x|%qd8JfFV zxSBXSTRNIsIy=Gidgc|EB<3Zj!tBii+6&d|h*z(bb5UwyNq$jCetr%t1q5W|m*f{` z&*;XkHZck$JdK_ zU0hg~*SBtNX<)$0AB;`2U))$ZdvUV*+!)q!R`ZK{XLqd7c%>q1t?^3X=%Us~KkaJ{ zR_x0zR@__iqB(v+`OeepclJ+LQCuoASHyPF;YHd@T;)XmPg!9pB7Ay*V*R2AQ;(|} z^JaZApK@c?s_x_yn;vj{`E_bif@+_lG;{x_`Y8^#zE0?EFj6jNH(K{RpiOU$`%ITs z?}aA3opSyrEr*r{2+0^55ZY0Y1FqvTQ8U?UtYi)xI^q#LdrgeeWAC@ zPOQ0n^y>|tOLkc^RRhvf%9_4C{6F#XcNXtsTmL*cYUf*^t+;;k?+HO!ocoQ8)D==M zPq*r6>RLZJ+92m*=e>K~#TT-FKfm&D%F8!wJgjH@`P=@O2&BEZnkcl#cy3(tLABoB zFZ5mnF5Inlh)Z)BkMJk1FUGvVZGXO;dAi)d=}zz*@#+7LGoSKjKT{bRC8MOJcyx{9 zt3&ErPhVNRH(jl3Z;$pF$tC9wOjER9>$Y|0EUjk;+IhrUHOhadP5t~}bE}WxtC$5P+R_BSVN_#tD=7}t@t`<_y6%dYv!yPRTb bxD6PNIq$9i&SxzQDl$D?{an^LB{Ts5+Zqj_ delta 413 zcmV;O0b>523)%yaBn<>-K}|sb0I$e51&ZmBAt!$UY)M2xRCwBA{Qv(y!(akT41)}e zItU4{0kPI#a?pGrJ^;ijD59W5Jpj1*W_mhE1&CkaaLh>{=A>sD0wvh1I2`i?h^3L$Gtr@}S%0fLV} z>@Lz92fj$t`P$bY=pOCabKWM&){enq>_&90bblU#V5rP^eIWUjX92wCEL(|k1|%Oc%$NbBBuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFsEgPM3hAM`dB6B=jtVb)aX^@765fKFxc2v6eK2Rr0UTq__OB&@Hb09I0xZL0)vRD^GUf^&XRs)DJWv2L<~p`n7AnVzAE zshOFfj)IYap^?4;5Si&3npl~dSs9rtK!Fm_wxX0Ys~{IQs9ivwtx`rwNr9EVetCJh zUb(Seeo?xx^|#0uTKVr7^KE~&-IMVSR9nfZANAQKal@=Hr> zm4GgVcpk{1iHq`zbF$JDTz5Q`N^fZsd*)yF1AWQ8NHOu6e~j~BS#Zs zLvuq@Cr4KkLqjKLCl^;UCksPkXCr4v7dMz0*z`KNnmC)fxtTaQTDTY*x|%o|nK-%_ znYkJnn7JC8ySc#hdgc|EB<3Zj!tBii+6&cdj90Ifb5UwyNq$jCetr%t1q5W|m*f{` z&*;r4VOfb+Po-45GFxZR3jI$+vpO`P0#8 zo9x;0rUfz^7*`!sbYXoX@`N#4;lzLL19~n$-wLEONCvEa+U+<|w#m)0eOfiEufg}u zEeql6Wu@!X+hp2E)&nmah@g*-(FF21D|tsk?aAd^QYEmi*$my-#QZ zb4`>T=c70BhK`j9{487kXlAgSpLBMri_At1({nfd`6u1IcYOWIfYb4fS_R6MbrTAO zb5cy#Ia+oL&2GO_v&A{;pWKy(DPJ1Q&K~vWHOiaOt7B!z*QD3|?+RPrQuhcUqoj%N z8MQANm)g$Qbb`M*@};8viKq7$KlMB@;mftaQ;(P5n;-TwG_{tuYqO*MF<-e0R~0@V zyK!be*L(5n(g$SzpJTn7`78L#=6_Q(9j}y66Pe!=eP{BcL*?olcW#UR;qu;JF^^Yi zwMpo`zb4o7c1Ff|z5C|>rk7dQ|FJV`zwje@X*oyP-062TPVP8s|JHw|P3n7pl|%0T xSYuL(Ilk9@wi7B<+jQ$+{f1xJP4`$N7?#~hy58_i<{79U^>p=fS?83{1OP%L7LNb` delta 458 zcmV;*0X6=$3x@=dBn<>-K}|sb0I$e51&ZmBAt!$UnMp)JRCwBAbX#S{Knd6xdXj;f zfQey{0Y*wgh*E$a!UGjTia^XiSfWf6h<5?;Iv{2nXa{iu@fILf0b(a0o1|MJ{vX$oq#R|}bN>N!uNeE3wD|sWRQPz;_peShRO9+r$){yI<_0X~eA0Vr& zA=g2mGQy;PIjV|Nk=#CNStm&;SAq0Mr*;9!!3Aj{pDw07*qoM6N<$f@&hh A!2kdN diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/msg_halfcheck_w.png b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_halfcheck_w.png index 03177ed49fa4db59711f11e292813ed526d168f1..841c77bcc982edf6e15fcfd44acc90829e2dcf22 100755 GIT binary patch literal 1392 zcmbVMZA=qq9KV7VMl8ZeI&mT14r9>u?I~?(4=U~TK)O+=r9o!M#`XG?p3q*oJ8a>@ zCXgsbt-A4{CS=yI4Va4?$(DU^FK&=DMwSq=Wy!(^?1v?8Hjc%pGi>ZBP__@mCA-`` zum9ig|9)rPEk_hZdy6m(Q#hMw51RL9zd|`0?_!Arn#!ey4yla~NKrImJex|tc)fWiXb$G)z!x$4BG=G+y}e4u$6dl^J@a< z{8r+a(WP@m95Bc=4GOSru*J&`_OKQ|QGXb(i;;*R1SJNKg?hsx8M6}Wyd+v@kF^B8 zE+X|u+Fe3 zF<}KFmFMl$tl zC5Fk8PTKB`{p4F+TdSY#%4^;=vg^bMwOJ`l9b*;)&3 zV=JsGZjsG(K6$wKEl7GE%ay6lJfEFvFOEHIjXnQRi~C%y+))@DYUh40>*11~LHvK1)C zVsCd|XhGN9*a4YfxRSS0po+gH3n>`vP_2CpwqU44|kes$_z(j6pacb~_H+^4QB;Zvph2iGzcAAYVZJh+Ud zD}wPqUODk6o#~XH@Z2A6AFIE7Q}yYs^K@}4BAY2HS(BxE3>jxUzWV|>N?|2k*vE$m T=>w%I`%lH34K4Hys%!Xfjp5|Y delta 398 zcmV;90dfBD3d{qLBn<>-K}|sb0I$e51&ZmBAt!$UUP(kjRCwBA{Qv(y!(akT41)}e zItU6BftY`=I7k$TcLDJ_AZEjm1tn@aVoo4F`5yt6qN|~&W0-+><9|%hK2Q#t{2w>a zqPK%G@i?Y}-XY`%#D8!&W*WWIkQoqv!{L~X&~!yN2dMz@D;$nF3C(c~^m33W5Z}h( zm?wWgER9PqEeb|XAl?GRDp=$`0 ztf7a4NGfY+?I4oN8d^Gttg;3lW~87^4QkgM!;!r~+1dn%U(l5OYwotf8bFdJV+UpwfY=WepX|p?IXqlj5?5T6I|_waOZ5 s)@5cue2SJGe@ZIX(ea@H0RRC804*Q)GXxd1$N&HU07*qoM6N<$f|x9-D*ylh diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/msg_out.9.png b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_out.9.png index 10eac9cce31b81b37507d12135eebafeb09b41cf..b7aa02377fd49c6a462c58ed7972719f41ccd978 100755 GIT binary patch literal 3076 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 E04lRG=>Px# delta 2291 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 N002ovPDHLkV1m8|a^wI2 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/msg_out_photo.9.png b/TMessagesProj/src/main/res/drawable-xxhdpi/msg_out_photo.9.png index 1c56a391ff664576d5856f6d9e95cf8e4764961a..02e3ad804ed1b79c258457715ba9ed6e638322d5 100755 GIT binary patch literal 2376 zcmai0dpJ~iA0G)_m_)LbGEG*V%G{V?CL?3UHP>-xrMVnT%*B~AW)P7IU3g`!>7^x! zdMs_R71|{0n%1;>bH6Qvwj{MBx%3{Dwm;sd_dMtPuAk56d-;8T&vVi|+#IylY+i#v zAhetu8BDl$fIq=1b-0!2B8TB_6J+NPc?m-yDGLM;G_H^hpq%)uFn|fLxG_;JfE5Cv z%Hw(aL;kKV6poOOVJ%@WGQJ3ABM?^mWFi(P0)S9#AdDxVqNi$V(I_65iuNPA;#@^^ zAe`qI3j$uTZr+^O2o9Nx-e--nl2Kp*J^-;$GJd2$Op#I1A9N}3cxf4nMty)l5mfX? zr~F+#P;?;(pokbVQw|P~N0CSvyg89X!tX&5aCib12frj!yg7wPq7W=lpB^-94djMW zm<;<*w%{2R9S%Vv3KlDsN-l$4k_Lfb3L{L#F#?DsGZlz;EGsYoF$d&{ zAf8ZwT2f@Og%XI0hCTfl0$;@Bg@r@n&*B2{r)0rt!^&79EFOcyf*&wT@h!7lUBAxY z^FO1-5EJ;v`Twae_Kpz&SSBDANLilIBcF!gmqOTbStP+VDH1OT6+Ju6ZSeAsYx zr7(mX2_FzZP7EpvBjOokhAqv~9*?&(x1=#}mKL@+90_knBN1rJTql7T zVhK3FGMD!cm;O~Qg$@ENNC z7Y%UjK_MUYA!QWa7uF>b*fidfXlZUwvc=gFiFRgqJk8vaXlF~dBiIwoa2ED-^d}W3$v?++k=(+$G61N`Y>8v>ywabnQCWj)W% z3&Xbn22J_npngYXgfsu&lITM@Cww~W@IB}2nPJt(%&WeY&b*yZKSfP$34RVLUyjavU*hTr z&K%x1yAYG$j)^zv&TCv@X{;5i7+d`fXJwGqH_n^x(JW1mW_4B7TuC;d9zGI8?^@_e zd*9doz;Ho7{TPW^yFE|c^-WyjbZ=uzUsct%1h3VZiWIhD>oqHrzYcKN1|fZ z)skE4`nF}F`}-W|bal3gVJGE%#oei`yEpzqcei?Nx7azGliO3{OpdG zN#5^$35vZoe_pd37TJ#LRA0y{3^dAlmE&X_mlj_A=8uaR`G-}uRnV(h9j?PPII-a&$u|rzDI)m&t!=t!>Mb7M9jSAhCwnNjKkVQj{CyjC* z+mYqxCX?&qn#v8=Qsq7BBgdoa-_kTDh7&J`SQ^XgQ=Z4;yDeUfHb2h1@w+uHL7@`c zhX5<{lG_KfQ|+^ppYVCx|1g_CPz&y7C=ouqCP((5$9wIxR?qE2iAaTN^`3=CrAkNe zn2WKl(*Ejzurcx3k&ROv^q(Odr-tvc3GrT}rlG49H(&wS)%xUrS`Vum2$x}Ma<^Qt~{ zQL7Z(=Tp^nzsNsZ!zWv}t`yAMu3<)xu2|LoyBRm+mBDw$4KG#JwjFRjFk%Z)hPz z7BHGOUGJWuEVjwGRLW|L>Ty%smhvleC}c)DJ+Sb1#g%bpa`2pBAbNLq=H_n~sGT}w zbP6)HIAZ1XXU?H%dlqAUfJ~903{1E{#=+>ZRuos2PDbE$8X$?>x z&WQ@KV7|_!i=F{#PE6UZ_4PQ%fYQs^grL^ohx_LK;x1l1rT@rh?a4sZMzg#?o1ZgU ziM||MVkGo0cnM;pxrZ)+_TLOAlCq{|2 zyGQo2yAl;W2*W}!w|nGdkja6eM?c<%Ra1 delta 1326 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 delta 1313 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 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/passcode_check.png b/TMessagesProj/src/main/res/drawable-xxhdpi/passcode_check.png new file mode 100644 index 0000000000000000000000000000000000000000..a831f4bb1d3465e851f4cdb12b20ee60136b5d3b GIT binary patch literal 1324 zcmeAS@N?(olHy`uVBq!ia0vp^9zbly!3HE#j^6(Uq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;1Ffc1;hD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Keo~drKfuV_lxuu?= zsiBF5p^k!)fuXU!fw8`!v96(!m4T&|p{W8CC;@FNN=dT{a&d#&1?1T(Wt5Z@Sn2DR zmzV368|&p4rRy77T3YHG80i}s=>k>g7FXt#Bv$C=6)VF`a7isrF3Kz@$;{7F0GXJW zlwVq6s|0i@#0$9vaAWg|p}_Mv>2~2MaLa!T6y`Z#^TL84#CABECEH%ZgC_h&L>}RV?+-`Bk zX&zK>3U0T!;MA)Rbc{YIW|3kVCIn1AASOKB0y*%MpPC0u?nS_KU3@s^2Ll7+d`}n0 zkcwMxZpV5ZF%V&WAXOuCoVVllh4!0muQ$FsT-&kl*LDSQf&6rh9z)O1#rd-)KReLq z^jW~p$%|v}g(!aM^QK=Lf8|tH-Yjeje8~$b}&9y>nS6$;A(+DL)g)ejIt~A zuiTwh*f(?Cyk5B#_P?f-zdC2+wyXNpcE0l(rsDE_ahxlqWQ0$&1xu~enp3PG@29!s zRYBT<+YECo<()i2AI(|6z%Z%kj>pwUGpa90c?h2iUu&^#eT2@X(9;%X3xYfZEc6sI zRU~BOCx{4%oD&Mrx%8Y#NXCytKwL=0Pa{B2NXL&SKugHPPbYv2NOA?}07)$Y^PsI3 zmJTr9#i>2`}t4KFX^I=YrE|%8AyjxmW+LalfI5i!a$YeAzp>Ubk i-_2H5^B#WEKENQFb6@UD-c?Xp$l&Sf=d#Wzp$Pz;EXAS# literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/passcode_delete.png b/TMessagesProj/src/main/res/drawable-xxhdpi/passcode_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..cdd6dce686e5b1d5aea100d38e99c6448f0600da GIT binary patch literal 1653 zcmeAS@N?(olHy`uVBq!ia0vp^9zbly!3HE#j^6(Uq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;1Ffc1;hD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Keo~drKfuV_lxuu?= zsiBF5p^k!)fuXU!fw8`!v96(!m4T&|p{W8CC;@FNN=dT{a&d#&1?1T(Wt5Z@Sn2DR zmzV368|&p4rRy77T3YHG80i}s=>k>g7FXt#Bv$C=6)VF`a7isrF3Kz@$;{7F0GXJW zlwVq6s|0i@#0$9vaAWg|p}_Mv>2~2MaLa!N4y`Z#^TL84#CABECEH%ZgC_h&L>}RV?+-@<( zX&zK>3U0TU;MA)Rbc{YIW|3kVCIn1AASOKB0y*%MpPC0u?nS_KedL@*4Fdzy3r`ov zkcwMxW}o#FaTICgPEyc|$&fgbZlKfaeJxGqN~7b4bmmTJp~IIKrIy!Pcs zerUGwKivL-yGmD0f+4oi{XFsz20Tw5x5-pUG6kwO{P*)oGjyq(AWg z$m(X4^^yAXVfD1bfx9BbF9`2YzqS5!sgfD{f1ZSIb22|EMeS*jJKU|L5ZZY|W^L4U zC#H~8w!J*OexeTj530|6mpjD#W6I8XQBC%ndRHigJ$n7Y{^aV~imqevEy-<${txte zS04L!;GtqM-?+17YP!ZW3ptSu7g%o{Y*yPsdqMOEm5-Q zoSw^gYwDjaPN$2t@3WjPH75V5IW1igdMnsRz(>KdaWZ?xHK#2Wik8hlmiw+iSr5O5 zDU4MbcfHtyrmrjJbJvXRJ{z>w^l^px`m#%ZC*94TzE3Q6ao3BE-!7`WFKlx!&z``i z@=(femsoVBK;MG+9COp)Jq?r3EZ{5UNO$?XDk>+c70Ao=f1u%e*m{=nNvk=#bgwU% z;^MP5ZfiGrsAD&4Z@|=}-`i$@PGaas5&h!haqFy zqW_Ha_TuQTjgNyCd;L6cQ_D~*Oqu^-!8WfR#?lA(~!T`LCu19vU{#M zS;RlQEyLcv%IW_VCyQ0i1*aHa%wP*%V0T#k@h^w4^D;kn&a(WV|Ml#DCLV@TFTZfM SzRg*niony=&t;ucLK6T<=yhcP literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/passcode_logo.png b/TMessagesProj/src/main/res/drawable-xxhdpi/passcode_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..af2428a206ad0f4041ae6e680aed64cb97004ec4 GIT binary patch literal 3524 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 NM1)1M8$$WT{{wVW!~_5U diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/photo_editor_exposure.png b/TMessagesProj/src/main/res/drawable-xxhdpi/photo_editor_exposure.png deleted file mode 100644 index 5feb667aba1c5b7ac2d96201debf6fb13b686c4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2300 zcmaJ@dsI?+9={sCGj%Hq(U$XYG_Z zrnYO@%NnL}weqB3v+Go&wK`i(54FdtQ<9X4_OKS3boP&F?>YDWe&65uem>vV=iYPo zuv6B#yZX2S0N~C{q;sq**LFKQTAz;&t4P)b2{SU`G$SR^tTeE@;O?W@>83v4a2EDhi1T`q59}H!QH2Z z=krSnzBjEZ{n4Fx=$YLaBU8VkFUBs$V_@wQQ2@z%qNK)QnX$d27x0d*-?m zXMeM!M>M3J9Nlz&gLr5uJ7nOeKf51y?Q7#=K2YXq&vsot*t~C9t?{<;wqeAu`r?eg znXG2+CJvrKPBpT2M>V$_iT5`l1|2p?vXWA}eci7;_PyYi4eDi^oeFg;sfr4-=;?fm zU~#2X?b6wJsjwdw#!!JK!v^C&gPmp~NZ!Y~3tCfI{yv(JG?#ZhBP$I01R&RNYf(%+ zP>C3pe<6KpX*}5d^`a}9BYW@6t53X;#`HLaWxdTauFzhn>C(1d+%%!w>T;l>*!KWM zBc!I|clh5&Xzd41o5z=g=ik=F?%Wclmdn6z`zX}OkjllCgptTF7~)viZe{`$%-BWKI9 z+a(Ql_b_j?v_q)lIe#C0yVwhrT~_kSQ~~5gPny!bpJ1{*xwrl{j`T9fd`N-zK?T30 z4fZ;l8&7o9Z7$QEADR-~gN#^^8u8V>sdl`)y0!7wHg2ur<l=l>w`Q^sWA7iR4 zC%!GaTVz?{#RUoOn@_R0=(^YUHak;TfhU za(v$UYr3p;?%IjUOGWtWlZ|_#j4y)iV|yc(pK06^v0&u+`t2mupn`Oy)}nr+3Rsgr z(A|HkB5`9&uH3I}F!dqMgqyH*osX=qw=gPtNBd1_ohQx7$9gbet$0XPS8W{MIDPL6 z@O9uA<`_C~_NC73O6qDlblF_tvA*mBw{UqVcZw}+>JJ(H3sS!{E9b6iSxInT zV6}z8X1`cc=)aa*jBk?a6c3*k1uSWk9YA_M4{7ag@jyCv@R!jDCezrxV!LZIo31~( zSf^zT4unt@rI-JMGdKmm$Clgaj62LJ1ke5fL#esYW$zZ<^{s+z%(bl<_lLg+;3yfP zuW;`K+<%x;dB|P<1r_CLa8q|ndBbIbk<#Ko+j diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/photo_editor_grain.png b/TMessagesProj/src/main/res/drawable-xxhdpi/photo_editor_grain.png deleted file mode 100644 index 297bc2dc96fc8a1a39f6a1b9b638eb69810622c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2648 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 Y+eeUPhlg(w-xbb%U4`%76umAu6 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/photo_editor_saturation.png b/TMessagesProj/src/main/res/drawable-xxhdpi/photo_editor_saturation.png deleted file mode 100644 index c1a14fa759c410d437177c679fd181bc6997dcd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2738 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 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/photo_editor_shadows.png b/TMessagesProj/src/main/res/drawable-xxhdpi/photo_editor_shadows.png deleted file mode 100644 index f3ead53246daf19cfda4134fb1665db435e1fbbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2618 zcmaJ@dpy&7AOB6uHHi{adCi=V+pcEY8DXa68WWP3`Hf*0+t_HiK2B(*-#GR^xvSbYo-eT zfWG%e&mi?2z3^&ls=qJGL#3!Ca{8jD0>k!Y*~8bd-6NoXhd*9W2Y z#*bx^f;_#x`cm&)5b;7GkAy^uL?TBK){)DPL!ya9A`*o`VlWPB3kN|OM@Sbta0Hg$ z7(77%gU{j#SzHc$fsr1=O%b{v)Jp#ffzA6)%MpA{lR9BYF`b7*JE9gs`ex|o_y0}V z?C;hBVG#JY-hU(((9(DyG6)oKQ}_&Z;h2^Su6QI0AEXPpd>WUV^eu~l@mwKS5YOeo zDHOPkADzMCEbP~P0r>fmyg33Pox=dVJzWrL3P%f^tU5*`z$QK_pN&Kz4Jkiy50HezP2}ZiU0u3 z25(Pyns{KWA|lC{YT9|>RZT-f9lUN&Gh$$OeL{rMmGf3ry;aC^n`O&`6>H5b6WkQJ zUQtquD{1ZtB{!gzS8iBOQ%_dA44n-dKx~BQ=j*IUC~CH)wa&E*@x;~b{Y`N_6Juk) z%@)hLM5(E9ZS(zy`qjf|u*HGV8-83T+pt4Bx?4LMief@h8m3qcQ-~A>kpj0K^>4fP z-dU?TJJAgruTh#yt+?G*-3vbEeyUfI=-KB!Q_o&*i9pB(%)Vj4r;O+ zVs7uCz57`|_d`xyH}_$cZ}DEc;Pc|@6?b?-nCXEfr@{?iKr-fMx9`~G;(HlwsP`%) z@Ioy-#878hsJiM(1>{nlu+*nsM{U4M^R>9|Ht) zzuKm|v!z_P`(yvqfwbtnPRxbl@r$;?WE(wlCu?20XLgy<sTIrBiGA+_KK*1h6vW zGCm!eatO6>Tcr58CL5qHjyk9!C{Bi2bWo*}wRM$wFiD);ad73yWmP#-ek;S3cl=Rp zdbA}}p3Wwm_T>iDO!m#|J!?AdRj)sjKR3Jgo&n-N8BoH#8QbONlGCDK6VH&b4O!kr z<2ea>b~7ca$Xo3{*+Q&LWg7ZWZM&JP#p!<<-Eyw?$YMw*V|)ViM&61aF&0T^dB85R z>l$lTd`ua!{@~P_Ef#?D#KUsA{6Ml|J`~$VH`Z8!X*1SY>YCEpt_pj7?Q`Y!;%N`7 z-$js?FuCD?9&Ej+qj~tC1Vf*fbf&{(!O}BP7}phIV^0-YF)9sHhu_}C2wy+tob_^Y z3wNLI25!OGk2;M5$$eW;tn#%FAFrbMch^kKuTaQJstkMm?;IF^C`E#^JFSbWju*Jk zye(f`M zh@4z+y|ZaAvng^F%dl6oEoa}?oalHY zFg+(2R8{SOg*O)_4ma-K_r7{tmgIutgvs=~V&JsTn`elD{B8A;(U&&($?f{-_LGN2 zlP%2lf9=1N=Io$dy{GlxH_%QosY7)!_4tOD)%RN8cCA{I=F67Q-Wj>#cBg;(_{OO$ zbdw-5sfk^=nge?Z;-shY^@t|w3=sT+$!9X&=-omdoww+&}+6f zWg_lWJYvcqgLw)DDZJ5L`iB(o0vKL^Wfs~p%dn&D`{hvoU~YLda0QlLKKzuNyYM&X MP4)LY?Gc^xU)(KOPyhe` diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/photo_editor_sharpen.png b/TMessagesProj/src/main/res/drawable-xxhdpi/photo_editor_sharpen.png deleted file mode 100644 index 4d6687ba8aa23c2afba74f643866d81d46678854..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2162 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 SzhY(epVOC0r&MiYr2Plz7LC^c diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/photo_editor_warmth.png b/TMessagesProj/src/main/res/drawable-xxhdpi/photo_editor_warmth.png deleted file mode 100644 index 9b9a258edbe870a8439da9653452d7c9665b85c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3258 zcmaJ^c|4SB8-9nekI9y-8H1vj#UL}1F~(R&lSZkCF$Pm+F~(k*qsUrO*>`0rbrJ~) z*&<8Rjy9Air#Q4o$u~OH`TqF&-skte&vQS&`?~J?x$oT#rfh z-wuaAKYlXv@{?_oF=42F^YsUy; zI!5yt+oRp6^yvL`tUugl3v6>FPDH?B@M*9}Rxmph7ikUu&WjVRSGJLG*moEHerxzY zNqLefFgp&90W(LKo6u2cGuS390&R{qvqT%iOi^eI5`{scF(znJ914p=o5OxQa8Wd# ze*n&%Ncs^=WLd+5_iXqJ@Q>85WJUH?y=L zVeIYf>@95VO))5}*-tEyLl0vy*!-VZ|9`QYev4hv0*fn(Ol0tw;S7HgkHdm}KQoT` z`&`U^%l8B8|NC6be~U$ml0mL?_P;v)b4w(jmE|wpii}^%XRt+b=ZSP}<%&vBO&5U$Vj9J%)EJw9z_zMu+_Y*S3+794j*37M*SpZXlbf0S&)AM~kjPIO?5dW)| z0`dVh#dscb?bkc?*G^xJ!L)ncO{yh_8Zn40Vx9yl=S9-w+E^t zF(Wi}OGQSJN)?7quZd}egD>b4~sS1<57VnGx zB(|0~zER0u;fRfRbdC)8YvtVGQJ|)3yYv*(8EN;d0@c3h!sT=wXVlr5j^`JTUX#mp zqqdyziobOn5i;d0B^p3OK%$4S-W9)=sZ)fIHv(*bKGtJQn@(<;1iT4T{T8pa zKzv9^ZN`El)$=yB`(fi44{y9f)xNr_`NbJ0p93Y+AQSzs1FH#vCdKMy_p*xZJKuby z<4+NyvXnj+*51kecK9UP*BF-MSX4E8EDO+1das=Ev?|B7HI`xuYjNlomU3YpIq{Tw z1Df~37Rg|PmV}AqnV~-8&-ZdB?awz5r@T&3w3tJLex9`ONy5`UZ?$=?2wNuPUe)EC zjNbQEjY(>)aUD5J z&vk-F4oS1jBLcC9E{c=T{&~p|*xk-^^OeL3o%DL8g5uIz&zhO5e$!=#(m?1=<1-Jt zB^TYswYTfvc0eyJODDOR-dj3z?b6AB%#EI#3L|WHbs7_^Rc{X!UmV~$&wYI>sa+nq zqx9ZsCz~F%bI%8o0yZXhguksYg|-U$%Ik!_kYM)12N=fuk!x~Fa$M5$=< zpG@i@EJxMS!z*;4j-gdspZ4(OU+Cka`h(wqUPayUt4E(-I0n_m59hx*DsH$q)|~d~ z07v*ZS`K8CI_Mm**pRKh{YbTMcLF1!7PTohpql*=>64>F1sjB?C3fSzoXcGxHr+x{nOXrKVs7SQP@Hvm&g!C^RgOE_ z#zadkeUNz8!}+6xB>E4Z3Ina>TG#lunZlt$tF}Qkirbkkt0|Y`nqf!HE5q8oNDh!{ z9n|AfPb|i+3TCn!znrwVrG0zWz3@2brnTpY+)Iq&tvgEl7QxDkJrn8eLc{&Rg;uCO zb(`IIne8i`@d4!OJ*U#zyj=}fP7%kpg;Yza^yMlZxukLcZ1BTyGl%ZEzQcFuX<#^B+tshf@Ila6RDVoi##FUmOZ!?S=S83-RQ<#mHF>w* z&~%ObjRf&km;=zOI>OU5!XxLo*SD!p#O(9DR}F?a7hivY+U%{cZ${Z`sY9t?urun} z8-+>PCWT|FXi^g5NJXpW;5>+}EsTV$+L~xB2vglN=pZ;R*w99h!(9M;N{{tSe(vVt z?MCHa^--=TJkT^i%bJzi3vmT-mRQ3*};Jb!v)gSj};?g}qtKM9Xu56qUay> zx4W*>lNg=w$qptYY+sI-(JM%8NIJ1Y8XY+6q9 zP=Ypv$S1a$YUOKwOFJ#Cuc}FSU~7(=f(E@WU3S`Pg}1_|gbTt2s&9d}fXTlXlm)|O aSrj1V1j|owjq_ajn{cvsBVHu<#{CC!$zaO> diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/photo_filters.png b/TMessagesProj/src/main/res/drawable-xxhdpi/photo_filters.png deleted file mode 100644 index 29abc7eda64d34a4b4923df6b9c183b845984c5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1870 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 WL3jV4i=Ke(cPomN2v3Elm;44Vk1YWJ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/photo_rotate.png b/TMessagesProj/src/main/res/drawable-xxhdpi/photo_rotate.png deleted file mode 100644 index 0c1a9c772ae9c565f81f813059a80dd9814395ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1825 zcmaJ?c~BE)6i=iEN}(bsA|9*(5fzebLV%=12rMC?M8Z*}D4Hc%BucVzvyfob8tTEJ zP>qxTa!y51JlZm96+CDdxfB5{3aEfG)?+;CSq13^Mf-<#XLi5uy?MXi`@Q$QZ#Gl1 zIMmkK*_uQm*@}cv6tOahmt#dCzG~a52x6Izhs5I1XdT!KJ};4q+5CaW}D9gjN3%O&<^H=PQM zh2U#=)VHEy#S$PG#Snl^V|&RMpf}*lp@D4B+Yj^vm<*6bXRzoX%L`<385}Oi2HrhX zA{!=8ii-uyW=pcu~p);6tCew?E@Y1BIa9HQ1(zuQ@ zK!`?$Db%ma%>C zX8$awi6i~{ZZGT#yT9|o&nII^!DSYn+V4inO#9Ax|25&juy8%1I?pU@q8#&g z0*-ES*>y9NAD&qD$Hl7$GmB>1*v)lxzo4f4efDte1r}|q1Fvxg;mq4L0AkD)jCld^#Q!~#Nb&{$Godw4NbSLWz8B*r{;Dg=UZCr zm6mj*HY7=ZymRTGw3zW_gzq_w)hlfYERXeQs|edk9;|Dm#C=}!KK~I<8x>h6@UM>>mPU;XQn*6#-O6Nxa zmTiT#?MRD*Ro$5ZHdgTbPB?hvCq*e>vEiu_ZFplh-2?6k5QH4+^jsYzm(J*VQ(|Mo z3h>$76zJNuNJuHkm}8hdBQV9v)XjWIQf%Z?PKio_Lal6O<|U_`s!S|bRd%hAOeuSb zU2GUm?KQ@=<*ko;PO05e8Q&ml-ZsLNVOs0uvORz5FO&O5T&44#^rkQhO8Vl-_UNuUhDNrOLK; zzlYj8?$*Q8*=Zco2tpqv}xNH*0_AnZgQAgO*Ryma`b7DxoaGX zL`%6bLtCs(m51$j>)k7F@E$pC-?R@Hc-AmF(TS8Zlyo-47`n>*(-MU&h7JWu)BgoU Cqtasl diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/photo_sizes.png b/TMessagesProj/src/main/res/drawable-xxhdpi/photo_sizes.png deleted file mode 100644 index 40a564e6a2a77473f1362e008236c89763d4f150..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1203 zcmeAS@N?(olHy`uVBq!ia0vp^4nSDSr z1<%~X^wgl##FWaylc_cg49v=zArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XR4cQU}&OXZmDNz zYG`6%sH0$HU}&swV61OwtZQgwWngJ#XsQ4ONh+i#(Mch>H3D2mX`VkM*2oZxQ#zd*s+SwX`$F*!32 z#McCC@b$Iw%quQQ%u7!7bg@+e8ljh&nPTN)V(w_<1`Hkx7Xw2>S73lUnz=cdySNw` z8kw59I>Pk2dBEge1WebT^O=|!7#P(&T^vIy zZoRp-G3!u($gz)4f^s;{3jg48THXAEN6BLL*`;M~?*5YKd&|tCZeGi6tl_8U*Ee$# z-}km_b>WXLEo=_n`P}+Lyb#NI{f|j2w(`x&TqthhDEmd=hpFhT#jI8C*JAf%=WV;l zWy|`nuX;iAGEJ$4le6aSd4Kx9-1gT}cdZ*{Zg{%>bH_Yc2dNWtuP}aLVJ=yp-f(5- z9L7cNHVwb!1*-PkpPA3V$l<`i^vCd_ z`$G`HDtPj$XBBTA6uYPh1rY?1`lEk9QBm;V)yZ~u>%ny(nRzqc_q{joy}6N}INRNI zyo+I&?%cRmpmQqvI%D*IGkbZ5PQ4^sB9pjGs)mo4jD=?q$T`L=Dj>sJTG&Fv40Ev0 zE|y41Kc|@3;fx5wg^owr3^P0udWJcN2$(^$wwq>uJl$l0ZKc_Zk}l|;iYoT_vX3U0 zCyM6soGDxE$QdvkDpbHh!~mf)?*>YkX6w2NT}RtI3+fOumuB~ZD(QKkVjlsClM!-O`xv-AL=+QbU+GdKi+=|2gM~1@dXs%Mc<@_EB8gNJVo`9L9k!Mc)pp% zd<7F6RImqB6`a%!({>~KRGpyfO3n?4;hHF?rCBP$*|w!5GlQwrkgUo>ss>?}COnfG z8y(a%5sH$O%`~|hHWwY_k|x*M=W1=aQ7q zWwb4qr@`=1W&f&lbBnf5v~2Y)HCmmIT-xqF?d#HstM}-e@N!zF7=HTpVe1G3Iy;2j z&B}w?^(Swy9eDL~W#di%?ekyNcfZD0R##UyUbtKLk6x(JajW(P3WD&scl*xk&-hS0 z9^d}n^GtfbMqyLGr|Gy-oS7^|qD&P^m_4=UKEY1eKEt6kT$TbUW7E3CSgX36OqyIhu>+6$A( z_B0vD7*jz9-at`Q@PeX(eHk(z_UM&8_^QJS`X-7eUEBF!4V;|wAHMJVuV;2}px4&e z(uiT0Ez-wE(e5=@gBAVfLMPYIwhxBla7azUEUyDBAgZGPkI4KOhyq^BPpp70470RJ zu{ex##~4AC9lVKgWL6DOA3OX1n z48(*&TA)S3e-!V^F-SlLkjHcKxMDClA5qq2(Am5u3A_w}X&RGb^cgQ^a2kHcdZ zoK!pBK|3f9)!s=R!Cg+uO*-8q<+f8U#z`}j2d{ht@}`SPCd!5@zL4c3QV?nkNoKQI zN7n67^)Zs7X_|DpNSDiw5OyQ4Kt5+zjJB!*3k*S*G$^SGZYuJlY6kiU6zN6^vR0E- zj7phM!N?r1k(9$}rc?!T-2b7nTtgc$3O3{Yr?3&rYk-UbL(S*{YFx6-bfqyt9q>@q zW2!n{t>R!xg{qNKH9Q!^4{^L8DW-k6OyD>sq8N}@1Q20;1d?z_lE}CN9bRu|z)5!o zS&9mwf(N|eo(`6EQ7(@s6sU4pRmjLdfmN=!$))OY%~_B&_-|jBxwYJME>FFfT3bo}et6*Sa_P(a z$)_cSNhA`FzsDn2KhMrR+V5Yu-e9$!zjStDekwD()nfU0aCd*}*X`N9-knWN>nCi_ ze*9`_Z*G3~$yP|eUi3m+3%dShU0S@xzbY1s%G#AXrORam-3s5_m>iz5S}grbp)*^s WVsg*qgmL=5`Hmx@0rp-`V)_qza$w~E diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/search_gif.png b/TMessagesProj/src/main/res/drawable-xxhdpi/search_gif.png new file mode 100755 index 0000000000000000000000000000000000000000..d9e7195be34b847cb066257f8baee880ddf71943 GIT binary patch literal 2592 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 literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/selectphoto_small.png b/TMessagesProj/src/main/res/drawable-xxhdpi/selectphoto_small.png deleted file mode 100755 index 7620f457e723b7c4f31e2dc3f0f832199eac3209..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1033 zcmV+k1or!hP)+MdBTCLVbQ9mL?KtKdU zKm@K7iIeu#jaIG0nY)X2fXL8iuqWm%i7Tep~uc2Lk=tqzUP9~Fi3+?XVCe{(! zeUJ#w($dm9Xm=m-8g5>u^GF^FARjm>$m@{ZZbz_C0Eyr%E-t=DoT1ZjvOUGI(f zg;E7a6v)Ogu>)OPc5qk3hVD2bKsHVkL1L`Xw6e02#)4A}*GEN=RKpPkG7*6lmd#dd}V>RJT_o6>+=**`w#U13NoApSZeiIiJtJfc1lr7rY>;iX#Hlj&<9< zy}i8;F2(Qi#>U1=`21?4NGjt915Hm)4;&pGzFAc(XZpy?_1xN@9qO!ie{tDWSK;B3s z61QaIs08E-DISlH1%aa)kTBBW;o)WwI4S~(A_an@Dv%T;88|8forSd73>?*g>LSg~ z&OWPDD!<)uvf1oc4yVTtjt)R>NUT0|dv0!S%89hLw)RCPjut@NRl0rM)`@4(cV}j1 zp4domxc?06l90o)aI^ucgY9)g_AQqv8? zEojD}$OxhzJfRUpKme3g_bCnYa8O_p>~LUF5@_T&A^>HGq#k?0yUTk)(VXZnEVT~b zIljn0f018(RxESM2bV(0d4 zPg|f-P}8ujz2UR8anaT{JbzvKW$SKVF|3*%{@mn%VfO2$%^fB|B^KKpHcy&7&8bW1 zINOPs1A87lshzm!=*GRxYK#*W9V@J4_f&H2f6S!Px`gSt=m~L8-ah^b+LN?o;uokb zS+A;6Y9Zv1J2B+Z46n8CW-R#rqVD9r{4bJsJ0I70z^>d0))}kL>c?;jqDs<|P;k}f`=qc-W0;oo_ zsv|CyYw{

    yEXNs=y$1QD8Czhb@o+3}&9jsAujCj0|c#>hIQWljs0OK7*&LpUXO@ GgeCx%YUZ{8 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/selectphoto_small_grey.png b/TMessagesProj/src/main/res/drawable-xxhdpi/selectphoto_small_grey.png deleted file mode 100755 index 935604b4d8aa4663740c582faa435c7be5f189f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 586 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!Ea{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+AuIM-tlyC45_&F=C+~t5d#tS4{^GF zO%KWij@&$Y)mLEo;j;&q&Yr#b0eeBQ7T0zej$fQ}_8vW&uef8!izh+x3av%y>oX@` z|DyWe-p1+nViWsW*^?iurADfG6bA_~a5yk92{bUUC@?5O8Hp!z`~yT@BJGa&M5cDej%W724Ig}AQko;3b#LX|w!X!az8=_lZFceB z$>)n#Sj>I5Ky}V4=i*hFD=dyVRGodgVqx+&kHtp~*%p=e#%J}djFVOFm0EsTKzWJ$ zagW8vU;Ys(?oeS`em(gf<0OeW_w>8OJQfwKStiBi(eLf?s9??WBwY__Q(o}O zd2n}H=%s(o^i+|-=)Ty$zb9+2(&U!De(po&5 zgX{UE)lRq8Ds~%o8&U{e+`Cpqv149c^STk}k0t5YtVm%WNgXxEZ V+=*H@DuIcC!PC{xWt~$(69C^m?dSji diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/share.png b/TMessagesProj/src/main/res/drawable-xxhdpi/share.png new file mode 100755 index 0000000000000000000000000000000000000000..b72403da1bbf85f4695446c9836b87186afd4965 GIT binary patch literal 1840 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 literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/tool_contrast.png b/TMessagesProj/src/main/res/drawable-xxhdpi/tool_contrast.png new file mode 100755 index 0000000000000000000000000000000000000000..b7f4ea77c2a074f3672f9207a86f53600112dba7 GIT binary patch literal 1302 zcmeAS@N?(olHy`uVBq!ia0vp^W+2SL1|)l2v+e>Z$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y2=9ZF3nBND}m`vLFjeDsTY(KatnYqyQCInmZhe+73JqDfW2&$iQ6p}IL(9V zO~LIJOPqT3fsWA!MJ!T8!-RmT2gHOYTObFX@Kf`Esl5o8tWEFU*vi1b*yZWs7*cWT z&aJb)haCi1ADrY;6}MWzx}?Bs1!G17TZ6KygLugUwik>O1em6XU2-hqU_T>Wx%1=Z zZRzD{-#pK6`lI~w@+rFr+0_Nh8tyH2e`3A< zh2*X@iS<{4Sy#N@v+#7o*;H4Jb257$h*lpsXLxn0d)wPb?TeSaX-dALD^+J{&fOPi zULPxv=5adALc;^IKDL?w-E1H&n*Gc-_-hns78wH9>2|9Rt%4zZqIu;y$ud znbVk5d5xPVwaj$#Ja}fIN`hKoa$;Iwa>BAe=fr1$&Ix(}wTXEFwF&D2RvMJA5Sih9 zrQTq>2A}`4EnWM0RX+W^e9-pQv){{Bnp>P~3xC@B>U3A4Z|jD(`x_-on`eCX3V8pb zDZJDex{xOO~pvG*6LTDR?e2Dg8l`SYebW1&7H8$;~s#AVmzpHzTK NDoDSr z1<%~X^wgl##FWaylc_cg49rTIArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XRMoSU}&gdW~OIo zVrph)sH0$HU}&Uo07PcGh9*{~W>!Y#3Q(W~w5=#5%__*n4QdyVXRDM^Qc_^0uU}qX zu2*iXmtT~wZ)j<02{OaTNEfI=x41H|B(Xv_uUHvof=g;~a#3bMNoIbY0?5R~r2Ntn zTP2`NAzsKWfE$}v3=Jk=fazBx7U&!58GyV5Q|Rl9UukYGTy=3tP%6T`SPd=?sVqp< z4@xc0FD*(2MqHXQ$f^P>=c3falKi5O{QMkPCP^Az7DJqR^?{Dj2SqGWM8kxDsRzV_CtDx~p72xifT_I*n5;!ymWnbkFa>(LIEGZ* zx)ZfG?~s82pTU7ChT1wFQzarMt2ekm5UgOi#}H=LX2;M!!HzL@qQj~yj8@au#x4*N zwG9{7blo<2#%}MEp7NX%YoDKgzJGJx;$j*w+<5Nr+^&8I3opg&?jv;>k zf02zMZsMDJ)?b>|xN&LC;*zM?XHyj)TOZJ$IHf=J!pT=wd;J_UR!)uVJd!r8sI{^~ zQ-_z!ufdOViB(3lx_7MHxDKyvk0^FBra#~wZ0OazB*;?kv~66b@H;=F)%W(WGH>D za&EEm`h{{2atyX4C~PyhVU-+tqGO`O0^tqCvQ7CjqRKL6 z_e!LnaoZ&!5c|wS?|w{Y;PIT+BwfFxDTdJxBf4ixgq{hrxb{fRO>nd85#L!oH`dOb zm;2bG#M`H6b$`?xvfvv}5&fWYsFZ*wDf2!|3CF%7ta^5Md9LASyn3eb* z&pG0xl0KQ^*?y}vd$@?2>>HWC?)^^ literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/tool_enhance.png b/TMessagesProj/src/main/res/drawable-xxhdpi/tool_enhance.png new file mode 100755 index 0000000000000000000000000000000000000000..d3f893339a7946edee546d7e639d47aa1ec1a935 GIT binary patch literal 1822 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 Y5M1cnWTALl3sk&#y85}Sb4q9e03P3@9smFU literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/tool_saturation.png b/TMessagesProj/src/main/res/drawable-xxhdpi/tool_saturation.png new file mode 100755 index 0000000000000000000000000000000000000000..9918b34d40181427ee87794fb112840c378683d5 GIT binary patch literal 1836 zcmaJ?X;c$e7)@CWU{Fy&M36B^l`RWP2qP(k1SHi^ghWy{3CRFsNG6$#5Kt6Q8W*s& zVyg%m_JW1~l?Cg&Neb$nSJPd~YyQ$-p}ZCS#G` z2PNW102~B`0AGr?r-VkQ0}KX*?&Hf~&^-Vz8r_RZ!*7Ns-3Rn#fL?yU#6`xvq0(e9 zk{deV3qP^QsTigNsnm>&3`&MK1wm7&bbo(;gNB!vCyww`XDTqU##5noo>bsMY6%J} zF&I$*21RiavL0iR@krmNAXiSwD%2BY!V5;#h?P`2g=R=;63FNOKU6NCLaVVz=tI2! zDXbP`Dj{klq(;`G61;KA&IVUXkb^>E3_%45k~Uezh*Sha)TxLP;6yQiWzn!gie#u= z-{JXukf%^%Vub|aaam+sfda!)kQ3_7p)lySG#y>VpM_bgtea9&+^J)S zJ@Ssk-))>_YHnk-I`X#b6;8w%xYLDWc7dy{)P=J(sk3cwu?HipGW+eUt!zUhzRSBv za^CZGBmeG}r{NF2MU)-M8OfWykvpYCr?`?g*DmypZmJ*JP#F>k7rb1_vxi4!}gJdIvbMx zcqi$J>4W$`l;JHIP3=kA=fjms`#)|u@lHH4%f zqUz?XQxpfG>vGHMnKt^I13~mAz0I=Pdkt(Vbh+htBYD;l(s;+u2UWcCO1RXm5sV99 zKJJbSF0bq%y4f!4+V{LWPEcOiit26^R-d1HWNlZ&xtPPJ-Y_iI#9sZ2ak<&Cx(#~N z^83TAJxwXGa+eyR$I(ysGOMKidF|N)j){@wX^UmmvK>Vu*+Pxz8)s48h^g=4s}#o< zk$0{S^I3PE)!AU{_9Dw+3#mm}MbnC}%yO%10m!10crf*0^;+vyzm~Vfb$?v^w|)zA zTb{krYSoMSlslIW;chqV;Fc`ur=B_K4GxXYt#%mYViF9v893>nwTm(oQQzLuxJwqpQn_0DR58!nMWv{MkmC+x|ly z2UZ%NX&pXeWNiAX;$YH-o3|Z^LGt{9D0tVV9tGp>jnT8kF`LRTq#$ru*1u0xLX625 z4$ST9$SJu#06yj~TA4DsQ8TVGD}I0xmlS}btO{*s=?l%VYm0(*`+!XnSC$(j>cPc=!ZYwWq%qaNjFygSR^QX>Jo0LA7uLVZP}La zXv{cZo{j{yX@_R-b#?>W$;urg_p|Z`7bG|?Jb*M-Hb7r8YTdK!D$&(n%)Q@J5(B>w zit3uLb<}H1WlUC?=j{i&*>R>+7wr#$MkK=aqXW@PlMlQy{J(f1;oPd=#Jqn1i>%Vf literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/tool_shadows.png b/TMessagesProj/src/main/res/drawable-xxhdpi/tool_shadows.png new file mode 100755 index 0000000000000000000000000000000000000000..ba854d4b53fb551b0e771697e22b9541683fef1a GIT binary patch literal 1358 zcmeAS@N?(olHy`uVBq!ia0vp^W+2SL1|)l2v+e>Z$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%u1Od5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)yG;}p_G;wjUaCLTbbapc` zb22uE>2=9ZF3nBND}m`vLFjeCsTY(KatnYqyQCInmZhe+73JqDfW2&$iQ6rXIL(9V zO~LIJC!BiqfsWA!MJ!T8!-RmT2gHOYTObFX@Kf`Esl5o8tV8mwJ}@va9`bZ?45_&F zW|pltv!g)UcRs_`f6NEt1d^71>uTz1ZB>Z+eep+l4$IL)ZVv@=SOj%)ST2fqU1>7Bdbe- zaLtA3jbg7E+Y=l<_8HA!>Q`}_sa2_PwIka=uZLD% z%26w0cROgjUC7G&ja*NIdS5kj zhu@+*@Uq_962IQULrGFy;c|UPxH?_sx?Hy;Mg@G`7k*KArL=*EZ$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%xRe+5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8KW+g=7RhMR$W{Yl!|Z$R@KEJl?AE#L8-<0 zrA5iW_()TRX$FQJev3c~fv&OgFUkZ)N@9*nesXDUYF>$_i>(q+MlU5Z#md6S&Dh1% z#L3Xo$#nRNk*v!?*$P{J=c`5nj#hRe#f%w)XwJ5VJHN~wcKUV=9zE+u7>?iDRh~5-(!b~6N7=2LU zKuRnyAz%swG2uxc$bn~`)I4C0DFS8TZG?&aSf?=V&|w>(_^L5b&Je|*~I^}U9t z(i-wEids3kpXyC{A?$n6_SdxTTZfLlV4SP9z1VsB3-1J@m7CdDSe2V_e%SbtL$&k5 zR-ZQ=`o>Sg{g|}h9DEqe)i_h%o~=*e)Uxix)4t1|Ypj)-f9kwq&xUy_Zwk)u=My>G zDd;AV*n*4L>pi_b+C&|sWUH*)t<)KBzMHO-{P|tSbu4H#+O+1`^={|8@I0LXJBTSRAlvI TqQ##~PzmJe>gTe~DWM4f1Qx7o literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/tool_warmth.png b/TMessagesProj/src/main/res/drawable-xxhdpi/tool_warmth.png new file mode 100755 index 0000000000000000000000000000000000000000..cfbf0d5162e436ca363af4345653a151dd427ad2 GIT binary patch literal 2296 zcmaJ@X;c$u8%^0v0#uqHAX*$ESSpf*C7OwmY%D>mzEcX4hs>VC?pJ)A*o_DgyBfxI0z6Z#PLulB$lQn z--K3UFvcW#coY&P3xf-IiJkhKaG%En+;duvrfJSai#pRR_&(u2Y!>4_4Cl;phzSgi$70R@DJ0j(lQsR6Yt(mP!cozHGlNWeP? zlE@+$2;Q4WQG>G*2%&owfpSr_$UhRP?30(L6yfI_SOj>l zXlkhp4CVX2kA<#Sqyz*}ffPz=YAQL^gAA+VDKrLyF{|P3?uH`VG-*mitaVdrmd+{g zA&o>WS0Qp(3Ct>rxe39t&_h0y_* zNV!r9r)s`@hZhP#fl`Brl@dt6XOU0^vRp0&IUEmP2FKl&t6-SptzTi8puLh;l39eee!qR*{q-Y3>Y=#H1fWtmQ$LZW%r+#@@D@L^YbZCcsM)K*rV=Jtg4>6=$wUq5~_GMzTedU+*e zaYG1x2k{Vg%qYWL_St!YZ@gW5k4?RdOY0y%kFq^>AxxLEaBuRnj8WPKY}vxx#cRi} zH+1{ho%t+UxXN}WJ|5R(?({lnGBa^$U<%mVfz;H?0?f z>hq2G_5YxUzcT=YoFI&*x#!Ezs@5HEtc) zVWXc3fsM^=4HY!^WgzZb^mpxpT-T1vx z>}cr~TQDXMyY2WG=&UaTjxN&Sv)guZy6Si@HRQY#>vaV#NtuM0JqUft_ywzs{MTEU zqnYe}f6XfWm`UlyBHat4nH`NXm*Gc_JBjHfn+rYZ`J$WSm#|DrlAqOS$>dIK%aOK# zQR7R6y3@<@<0dcRe&kdT*Gv0e>0(;PCvYbVb>+sHCzBtZsA<^ShRd&OWLH>^``PE5 zsPXYnSkg;b7PyW8xrn3_QK@l!{Pw$JY05u zrUhElYRmD4362H6+uW$D&wD6zz_~h$KHpB~;5cd4+0}&W{sfHWR74hV{X(xi?Jbb) zO3aR>@mfv_T;M@cpr}h=i$ANsV3FE=J*#G*_E1O(U}(T|$+oKj|MstnxSNdBqP^w! zb-IhEuCRLD1FC>BurhFFu?!4Qc5w{YLa@bItvlN*@XVEHnJ!YkyDx)Sf@!YEhW%O2k!3w*E*t zoN&s1aDZOY#$+!jEheTDd!lb-{`!O8$h_%@5|Q10;zbK&I!16~=*>JzR@+)ruL@&^ zjN)cme7H#Wn_AIQultSj%@0EaURYb%v z$i7VHrAG`tAtaxtyzR)C_TFTg`Y$iECksBL#q-tez`J=J@*>rfB`LCTTSAXk~ zLDpEaIF?VDoI9*P`=WwGiL3Meg+dlt%mf;HWcBNgb0Vdu^VZ)gLVkh<0qfy(rW{G30UC zxcS%tzimTw`IAxwWw>~#lmCsDXLhEnX-YG?!i=1o$G@&N)O9bpJN%@q@xa%H*N5uZ zQ3Zq5Or)ePX3ary%2j8JR-!NQs4#JK55^c1zWa-#UvZOLX73^bpCJBe?&hq&0lVg| AAOHXW literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/tune.png b/TMessagesProj/src/main/res/drawable-xxhdpi/tune.png new file mode 100755 index 0000000000000000000000000000000000000000..eda3e5a32ad83c75ece2b33e3bc0b5a45db0cda7 GIT binary patch literal 1067 zcmaJ=PiWIn7|%KsDI18M^x`8!bZkwUtj*TgZfl#?6-?RM!V2@SEO}ewmb@%^U9+9W zz{5a12)pdycG*$!Ac}724jvqc2Ne$kK^%yJe-JN|9rUGZI}g^7P+SQAGx$co@btEW##Y1Fog0(-4CRIHj90`upZn8t7V#9u3Pu*-FBa zKD1!N{6e;%E=;QtjUMO+QCB1a2E+<*jTzGs-56cf6^ZRFvoxqe@N|qm45}y(gCw#c z2s1qaHOO&55Ew2L76h&v@Ij7egX9$gTu2NHBHs&Y4^6z;+N7A1(luXX7NbiTTO!L= zDix;E!ytQ#2%Z;B1(Q2<7&-gi8ST1BpBAa*uO5izC^0WGaF?~CXK>}CaHFtl=bP#tuE3MYZ)nCaCg7# zj`c+dOk|CqE9io@|ZyD5|vd=+~v}yP>WYvT=XSH?n__@Y;F(RX?cm zsP5Z7^ZE)|+E`s5Q_g$*m-+2G_f8Rzan;vGJ^0ji^F#TyOLnMCDl6Shj4%BGu%b}F literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/web_search.png b/TMessagesProj/src/main/res/drawable-xxhdpi/web_search.png deleted file mode 100644 index 1fc70c4b1a3bffc8d14cefed74f57eaaf94e1760..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3878 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 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TMessagesProj/src/main/res/layout-ar/encrypted_chat_placeholder.xml b/TMessagesProj/src/main/res/layout-ar/encrypted_chat_placeholder.xml deleted file mode 100644 index c265685e2..000000000 --- a/TMessagesProj/src/main/res/layout-ar/encrypted_chat_placeholder.xml +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/TMessagesProj/src/main/res/layout/chat_layout.xml b/TMessagesProj/src/main/res/layout/chat_layout.xml deleted file mode 100644 index 214bb3d69..000000000 --- a/TMessagesProj/src/main/res/layout/chat_layout.xml +++ /dev/null @@ -1,299 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/TMessagesProj/src/main/res/layout/encrypted_chat_placeholder.xml b/TMessagesProj/src/main/res/layout/encrypted_chat_placeholder.xml deleted file mode 100644 index 6df0e8915..000000000 --- a/TMessagesProj/src/main/res/layout/encrypted_chat_placeholder.xml +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/TMessagesProj/src/main/res/layout/media_photo_layout.xml b/TMessagesProj/src/main/res/layout/media_photo_layout.xml deleted file mode 100644 index 918626671..000000000 --- a/TMessagesProj/src/main/res/layout/media_photo_layout.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - \ No newline at end of file diff --git a/TMessagesProj/src/main/res/layout/media_video_layout.xml b/TMessagesProj/src/main/res/layout/media_video_layout.xml deleted file mode 100644 index 17de40a58..000000000 --- a/TMessagesProj/src/main/res/layout/media_video_layout.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/TMessagesProj/src/main/res/layout/popup_notification_layout.xml b/TMessagesProj/src/main/res/layout/popup_notification_layout.xml deleted file mode 100644 index 3286d13b5..000000000 --- a/TMessagesProj/src/main/res/layout/popup_notification_layout.xml +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/TMessagesProj/src/main/res/values-ar/strings.xml b/TMessagesProj/src/main/res/values-ar/strings.xml index bf476db35..b81609edf 100644 --- a/TMessagesProj/src/main/res/values-ar/strings.xml +++ b/TMessagesProj/src/main/res/values-ar/strings.xml @@ -57,6 +57,7 @@ ضعه على الصامت لمدة %1$s إزالة كتم الصوت خلال %1$s + تعطيل رسالة جماعية جديدة أدخل اسم القائمة @@ -143,6 +144,7 @@ %1$s قام بتعديل اسم المجموعة %2$s %1$s قام بتغيير صورة المجموعة %2$s %1$s قام بدعوة %3$s للمجموعة %2$s + %1$s عاد إلى المجموعة %2$s %1$s قام بإخراج %3$s من المجموعة %2$s %1$s قام بإخراجك من المجموعة %2$s %1$s قام بمغادرة المجموعة %2$s @@ -296,9 +298,27 @@ سيتم إرسال رسالة قصيرة تحتوي على رمز التفعيل الخاص إلى رقمك الجديد. الرقم %1$s لديه حساب تيليجرام مسبقًا. يرجى حذف هذا الحساب قبل محاولة تغيير رقمك. آخر + + رمز المرور + غيًر رمز المرور + عندما تختار رمز مرور، ستظهر علامة قفل في صفحة المحادثات. اضغط عليها لقفل أو فتح تيليجرام.\n\nملاحظة: إذا نسيت رمز المرور، ستحتاج لحذف وإعادة تنزيل التطبيق. وستخسر كافة محادثاتك السرية وستعود المحادثات العادية فور إعادة تسجيل الدخول. + سوف ترى الآن أيقونة قفل في صفحة المحادثات. اضغط عليها لقفل تطبيق تيليجرام برمز المرور الجديد الخاص بك. + الرمز + كلمة المرور + قم بإدخال رمز المرور الخاص بك الحالي + قم بإدخال رمز المرور الخاص بك الجديد + قم بإدخال رمز المرور الخاص بك + قم بإعادة إدخال رمز المرور الخاص بك الجديدة + رمز مرور غير صحيح + رموز المرور غير متطابقة + قفل تلقائي + اطلب رمز المرور إذا غبت فترة محددة من الزمن. + خلال %1$s + معطّل شارك المقاطع المرئية والصور في هذه المحادثة لتستطيع الوصول إليها من أية جهاز من أجهزتك ملفات + الوسائط المشتركة شارك الملفات والمستندات في هذه المحادثة لتستطيع الوصول إليها من أية جهاز من أجهزتك الخريطة @@ -318,12 +338,27 @@ فضلًا، قم بتنزيل الوسائط أولًا لا توجد صور حديثة لا يوجد صور متحركة حديثة - البحث على الإنترنت - البحث عن صور متحركة + ابحث عن صور + البحث على الإنترنت + ابحث عن صور متحركة البحث على الإنترنت البحث عن صور متحركة قص الصورة تعديل الصورة + تحسين + التفتيح + التباين + التعريض + الدفء + التشبع + النقش + الظل + الحبوب + زيادة الحدة + الطمس + هل أنت متأكد من رغبتك في حذف هذه الصورة؟ + هل أنت متأكد من رغبتك في حذف هذا المقطع المرئي؟ + تجاهل التغييرات؟ Password Change password @@ -405,6 +440,7 @@ حذف الصورة تعيين موافق + قطع un1 أزال un2 غادر المجموعة العضو un1 @@ -422,6 +458,7 @@ لقد قمت بإنشاء المجموعة un1 قام بإخراجك un1 قام بإضافتك + un1 عاد إلى المجموعة نسخة تيليجرام الموجودة لديك لا تدعم هذه الرسالة. الرجاء التحديث لأحدث نسخة: http://telegram.org/update صورة مقطع مرئي @@ -511,18 +548,24 @@ %1$d رسائل %1$d رسالة %1$d رسالة - لا يوجد ملفات - %1$d ملف - %1$d ملفان - %1$d ملفات - %1$d ملف - %1$d ملف + لا يوجد ملفات + %1$d ملف + %1$d ملف + %1$d ملفات + %1$d ملف + %1$d ملف ليس من جهة اتصال من %1$d جهة اتصال من %1$d جهتان اتصال من %1$d جهات اتصال من %1$d جهة اتصال من %1$d جهة اتصال + من ولا محادثة + من %1$d محادثة + من %1$d محادثة + من %1$d محادثات + من %1$d محادثة + من %1$d محادثة %1$d ثانية %1$d ثانية %1$d ثانيتان @@ -572,6 +615,7 @@ %1$d مستخدم %1$d مستخدم + MMMM yyyy MMM dd dd.MM.yy dd.MM.yyyy diff --git a/TMessagesProj/src/main/res/values-de/strings.xml b/TMessagesProj/src/main/res/values-de/strings.xml index 8fe9a5dcf..0ed32660a 100644 --- a/TMessagesProj/src/main/res/values-de/strings.xml +++ b/TMessagesProj/src/main/res/values-de/strings.xml @@ -34,13 +34,13 @@ gestern Keine Ergebnisse Noch keine Chats… - Tippe unten auf den Sift für deine erste\nChatnachricht oder auf den Menüknopf\num die restlichen Optionen zu öffnen. + Tippe unten auf den Stift für deine erste\nChatnachricht oder auf den Menüknopf\num die restlichen Optionen zu öffnen. Warte auf Netzwerk... Verbinde… Aktualisiere… Neuer Geheimer Chat Warte, bis %s online geht… - Geheimen Chat abgebrochen + Geheimen Chat beendet Tausche Schlüssel aus… %s ist deinem geheimen Chat beigetreten. Du bist dem geheimen Chat beigetreten. @@ -57,6 +57,7 @@ Stumm für %1$s Stumm aus In %1$s + Stumm aus Neue Broadcast Liste Listenname @@ -143,6 +144,7 @@ %1$s hat den Namen der Gruppe %2$s geändert %1$s hat das Bild der Gruppe %2$s geändert %1$s hat %3$s in die Gruppe %2$s eingeladen + %1$s ist in die Gruppe %2$s zurückgekehrt %1$s hat %3$s aus der Gruppe %2$s entfernt %1$s hat dich aus der Gruppe %2$s entfernt %1$s hat die Gruppe %2$s verlassen @@ -296,10 +298,28 @@ Der Bestätigungscode kommt per SMS an deine neue Nummer. Die Telefonnummer %1$s ist bereits ein Telegram Konto. Bitte lösche es, bevor du mit der Übertragung auf das neue Konto startest. Sonstige + + Pincode + Pincode ändern + Wenn du die Code-Sperre aktivierst, erscheint ein Schloss ganz oben über der Chatliste. Tippe auf das Schloss, um deine Chats zu sperren und zu entsperren.\n\nÜbrigens: Wenn du den Pincode vergisst, musst du Telegram löschen und neu installieren. Dadurch verlierst du alle Geheimen Chats. + Du wirst nun ein Schloss über der Chatliste sehen. Tippe darauf um deine Chats mit dem neuen Pincode zu sperren. + Pincode + Kennwort + Aktuellen Pincode eingeben + Neuen Pincode eingeben + Deinen Pincode eingeben + Neuen Pincode erneut eingben + Ungültiger Pincode + Pincode falsch + Auto-Sperre + Benötigt Pincode wenn lange inaktiv. + in %1$s + Deaktiviert Die hier geteilten Bilder und Videos kannst du von jedem deiner Geräte aufrufen. Dateien - Die hier geteilten Bilder und Videos kannst du von jedem deiner Geräte aufrufen. + Geteilte Medien + Die hier geteilten Dateien kannst du von jedem deiner Geräte aufrufen. Karte Satellit @@ -319,11 +339,26 @@ Suchverlauf Suchverlauf BILDERSUCHE + BILDERSUCHE GIF-SUCHE Suche Bilder Suche GIFs Bild zuschneiden Bild bearbeiten + Verbessern + Highlights + Kontrast + Belichtung + Wärme + Sättigung + Vignette + Schatten + Körnung + Schärfe + Unschärfe + Möchtest du wirklich dieses Bild löschen? + Möchtest du wirklich dieses Video löschen? + Änderungen verwerfen? Password Change password @@ -405,6 +440,7 @@ Foto löschen Wählen OK + SCHNEIDEN un1 hat un2 aus der Gruppe entfernt un1 hat die Gruppe verlassen @@ -422,6 +458,7 @@ Du hast die Gruppe erstellt un1 hat dich aus der Gruppe entfernt un1 hat dich hinzugefügt + un1 ist in die Gruppe zurückgekehrt Diese Nachricht wird von deiner Telegram-Version nicht unterstützt. Bitte aktualisiere die App um sie zu sehen: http://telegram.org/update Foto Video @@ -511,18 +548,24 @@ %1$d Nachrichten %1$d Nachrichten %1$d Nachrichten - keine Dateien - %1$d Datei - %1$d Dateien - %1$d Dateien - %1$d Dateien - %1$d Dateien + keine Objekte + %1$d Objekt + %1$d Objekte + %1$d Objekte + %1$d Objekte + %1$d Objekte von keinem Kontakt von %1$d Kontakt von %1$d Kontakten von %1$d Kontakten von %1$d Kontakten von %1$d Kontakten + von keinen Chats + von %1$d Chat + von %1$d Chats + von %1$d Chats + von %1$d Chats + von %1$d Chats %1$d Sekunden %1$d Sekunde %1$d Sekunden @@ -572,6 +615,7 @@ %1$d Nutzer %1$d Nutzer + MMMM yyyy dd MMM dd.MM.yy dd.MM.yyyy diff --git a/TMessagesProj/src/main/res/values-es/strings.xml b/TMessagesProj/src/main/res/values-es/strings.xml index c59b5b3ed..7872194de 100644 --- a/TMessagesProj/src/main/res/values-es/strings.xml +++ b/TMessagesProj/src/main/res/values-es/strings.xml @@ -57,6 +57,7 @@ Silenciar %1$s No silenciar En %1$s + Desactivar Nueva difusión Nombre de la lista @@ -143,6 +144,7 @@ %1$s cambió el nombre del grupo %2$s %1$s cambió la foto del grupo %2$s %1$s invitó a %3$s al grupo %2$s + %1$s volvió al grupo %2$s %1$s expulsó a %3$s del grupo %2$s %1$s te expulsó del grupo %2$s %1$s dejó el grupo %2$s @@ -296,9 +298,27 @@ Enviaremos un SMS con el código de confirmación a tu nuevo número. El número %1$s ya está vinculado a una cuenta de Telegram. Por favor, elimina esa cuenta antes de migrar al nuevo número. Otras + + Código de acceso + Cambiar código de acceso + Cuando configuras un código, aparece un candado en la pantalla de chats. Toca sobre él para bloquear y desbloquear la aplicación.\n\nNota: si olvidas el código, tendrás que eliminar y reinstalar la aplicación. Perderás todos los chats secretos. + Ahora verás un candado en la pantalla de chats. Púlsalo para bloquear tu Telegram con tu nuevo código. + PIN + Contraseña + Pon tu código de acceso actual + Pon tu nuevo código de acceso + Pon tu código de acceso + Pon, otra vez, tu nuevo código + Código de acceso inválido + Los códigos de acceso no coinciden + Bloqueo automático + El bloqueo se activará transcurrido este tiempo. + en %1$s + Desactivado Comparte fotos y vídeos en este chat y accede a ellos desde cualquier dispositivo. Archivos + Multimedia Comparte archivos en este chat y accede a ellos desde cualquier dispositivo. Mapa @@ -307,9 +327,9 @@ m de distancia km de distancia Enviar ubicación - Compartir ubicación + Ubicación - Ir a Fotos y vídeos + Ir a Multimedia Guardar en galería %1$d de %2$d Galería @@ -318,12 +338,27 @@ Por favor, primero descarga la multimedia No hay fotos recientes No hay GIF recientes - BUSCAR FOTO - BUSCAR GIF + BUSCA FOTOS + BÚSQUEDA WEB + BUSCA GIF Buscar foto Buscar GIF Cortar imagen Editar imagen + Realzar + Iluminación + Contraste + Exposición + Temperatura + Saturación + Viñeta + Sombras + Grano + Nitidez + Desenfoque + ¿Quieres eliminar esta foto? + ¿Quieres eliminar este vídeo? + ¿Descartar cambios? Password Change password @@ -405,6 +440,7 @@ Eliminar foto Establecer OK + CORTAR un1 expulsó a un2 un1 dejó el grupo @@ -422,6 +458,7 @@ Creaste el grupo un1 te expulsó un1 te añadió + un1 volvió al grupo Este mensaje no lo admite tu versión de Telegram. Actualiza la app para verlo: http://telegram.org/update Foto Vídeo @@ -511,18 +548,24 @@ %1$d mensajes %1$d mensajes %1$d mensajes - sin archivos - %1$d archivo - %1$d archivos - %1$d archivos - %1$d archivos - %1$d archivos + Sin ítemes + %1$d ítem + %1$d ítemes + %1$d ítemes + %1$d ítemes + %1$d ítemes unused de %1$d contacto de %1$d contactos de %1$d contactos de %1$d contactos de %1$d contactos + desde ningún chat + desde %1$d chat + desde %1$d chats + desde %1$d chats + desde %1$d chats + desde %1$d chats %1$d segundos %1$d segundo %1$d segundos @@ -572,6 +615,7 @@ %1$d usuarios %1$d usuarios + MMMM \'de\' yyyy dd \'de\' MMM dd.MM.yy dd.MM.yyyy diff --git a/TMessagesProj/src/main/res/values-it/strings.xml b/TMessagesProj/src/main/res/values-it/strings.xml index 2a2f3da83..8f4d876d8 100644 --- a/TMessagesProj/src/main/res/values-it/strings.xml +++ b/TMessagesProj/src/main/res/values-it/strings.xml @@ -37,7 +37,7 @@ Inizia a scrivere premendo il tasto\nnuovo messaggio nell\'angolo in basso a destra\no apri il menu per avere più opzioni. Attendo la rete... Connessione in corso… - Aggiornamento in corso… + Aggiornamento… Nuova chat segreta In attesa che %s si colleghi… Chat segreta annullata @@ -57,6 +57,7 @@ Silenzia per %1$s Suona Tra %1$s + Disabilita Nuova lista broadcast Immetti il nome della lista @@ -143,6 +144,7 @@ %1$s ha modificato il nome del gruppo %2$s %1$s ha modificato la foto del gruppo %2$s %1$s ha invitato %3$s nel gruppo %2$s + %1$s è rientrato nel gruppo %2$s %1$s ha espulso %3$s dal gruppo %2$s %1$s ti ha espulso dal gruppo %2$s %1$s ha lasciato il gruppo %2$s @@ -240,7 +242,7 @@ Utenti bloccati Disconnetti Nessun suono - Predefinito + Default Supporto Sfondo chat Messaggi @@ -256,8 +258,8 @@ https://telegram.org/faq/it Eliminare la localizzazione? File della localizzazione non valido - Abilitato - Disabilitato + Abilitate + Disabilitate Servizio notifiche Se i servizi di Google Play sono sufficienti per ricevere le notifiche, è possibile disabilitare il Servizio notifiche. Ti raccomandiamo comunque di lasciarlo abilitato per lasciare l\'app attiva in background e ricevere le notifiche istantanee. Ordina per @@ -296,9 +298,27 @@ Invieremo un SMS con un codice di conferma al tuo nuovo numero. Il numero %1$s è già connesso a un account Telegram. Per favore elimina quell\'account prima di migrare ad un nuovo numero. Altro + + Codice + Cambia codice + Quando imposti un codice, un\'icona col lucchetto apparirà nella pagina delle chat. Premi su di essa per bloccare e sbloccare l\'app.\n\nNota: se ti dimentichi il codice, dovrai disinstallare e reinstallare l\'app. Tutte le chat segrete verranno perse. + Ora visualizzerai un\'icona col lucchetto nella pagina delle chat. Premi su di essa per bloccare la tua app Telegram con il codice. + PIN + Password + Inserisci il tuo codice + Inserisci il nuovo codice + Inserisci il tuo codice + Reinserisci il nuovo codice + Codice non valido + I codici non corrispondono + Blocco automatico + Richiede il codice se lontano per del tempo. + tra %1$s + Disabilitato Condividi foto e video in questa chat e accedi ad essi da ogni tuo dispositivo. File + Media condivisi Condividi file e documenti in questa chat e accedi ad essi da ogni tuo dispositivo. Mappa @@ -318,12 +338,27 @@ Scarica prima il file Nessuna foto recente Nessuna GIF recente - RICERCA WEB - RICERCA GIF + CERCA IMMAGINI + RICERCA WEB + CERCA GIF Cerca su web Cerca GIF Ritaglia immagine Modifica immagine + Migliora + Alte luci + Contrasto + Esposizione + Calore + Saturazione + Vignettatura + Ombre + Grana + Nitidezza + Sfocatura + Sei sicuro di voler eliminare questa foto? + Sei sicuro di voler eliminare questo video? + Annullare le modifiche? Password Change password @@ -405,6 +440,7 @@ Elimina foto Imposta OK + RITAGLIA un1 ha espulso un2 un1 ha lasciato il gruppo @@ -422,6 +458,7 @@ Hai creato il gruppo un1 ti ha espulso un1 ti ha aggiunto + un1 è ritentrato nel gruppo Questo messaggio non è supportato sulla tua versione di Telegram. Aggiorna l\'applicazione per visualizzarlo: http://telegram.org/update Foto Video @@ -511,18 +548,24 @@ %1$d messaggi %1$d messaggi %1$d messaggi - nessun file - %1$d file - %1$d file - %1$d file - %1$d file - %1$d file + nessun oggetto + %1$d oggetto + %1$d oggetti + %1$d oggetti + %1$d oggetti + %1$d oggetti da nessun contatto da %1$d contatto da %1$d contatti da %1$d contatti da %1$d contatti da %1$d contatti + in nessuna chat + in %1$d chat + in %1$d chat + in %1$d chat + in %1$d chat + in %1$d chat %1$d secondi %1$d secondo %1$d secondi @@ -572,6 +615,7 @@ %1$d utenti %1$d utenti + MMMM yyyy dd MMM dd.MM.yy dd.MM.yyyy diff --git a/TMessagesProj/src/main/res/values-ko/strings.xml b/TMessagesProj/src/main/res/values-ko/strings.xml index 08923ac6d..770d8960c 100644 --- a/TMessagesProj/src/main/res/values-ko/strings.xml +++ b/TMessagesProj/src/main/res/values-ko/strings.xml @@ -57,6 +57,7 @@ %1$s 동안 음소거 음소거 해제 %1$s 후 + 비활성화 새 단체 메시지 리스트 리스트 이름을 입력하세요 @@ -143,6 +144,7 @@ %1$s님이 그룹 이름을 %2$s 그룹으로 변경했습니다 %1$s님이 %2$s 그룹 사진을 변경했습니다 %1$s님이 %3$s님을 %2$s 그룹에 초대했습니다 + %1$s 님이 %2$s 그룹으로 되돌아왔습니다 %1$s님이 %3$s님을 %2$s 그룹에서 추방했습니다 %1$s님이 %2$s 그룹에서 추방했습니다 %1$s님이 %2$s 그룹을 떠났습니다 @@ -296,9 +298,27 @@ 인증코드 메시지를 새 번호로 전송하겠습니다. 그 번호는 이미 텔레그램 계정에 연결되어 있습니다. 새 번호로 이동하기 전에 %1$s 계정에서 탈퇴해 주세요. 기타 + + 잠금번호 + 잠금번호 변경 + 잠금코드를 설정하셨을 경우, 대화방에 잠금 아이콘이 표시됩니다. 해당 아이콘을 클릭하여 텔레그램 잠금 설정을 할 수 있습니다.\n\n주의: 잠금코드를 잊어버렸을 경우 앱 삭제후 재설치를 해주셔야합니다. 이 경우 비밀대화 내용은 삭제가 됩니다. + 대화방에 잠금아이콘이 표시가 됩니다. 해당 아이콘을 클릭하여 새로운 잠금코드를 설정하여 텔레그램을 잠글수 있습니다. + 핀코드 + 잠금번호 + 현재 잠금코드 입력 + 새로운 잠금코드 입력 + 잠금코드를 입력해주세요 + 잠금코드 재입력 + 올바르지 않은 잠금코드 + 잠금코드가 정확하지 않습니다 + 자동 잠금 + 일정 시간 후에 잠금코드 활성화 + %1$s 후에 + 비활성화됨 이 채팅방에서 사진이나 동영상을 공유하면 다른 기기에서도 보실 수 있습니다. 파일 + 공유된 미디어 이 채팅방에서 파일이나 문서를 공유하면 다른 기기에서도 보실 수 있습니다. 지도 @@ -318,12 +338,27 @@ 사진/동영상을 먼저 다운로드하세요 최근 사진 없음 최근에 검색한 GIF - 웹 검색 + 이미지 검색 + 웹 검색 GIF 검색 웹 검색 GIF 검색 사진 자르기 이미지 편집 + 향상 + 하이라이트 + 대비 + 노출 + 온기 + 채도 + 비네팅 + 그림자 + 그레인 + 선명 + 흐림 + 이 사진을 삭제하시겠습니까? + 이 동영상을 삭제하시겠습니까? + 변경을 취소하시겠습니까? Password Change password @@ -405,6 +440,7 @@ 사진 삭제 설정 확인 + 자르기 un1님이 un2님을 추방했습니다 un1님이 퇴장했습니다 @@ -422,6 +458,7 @@ 그룹을 만들었습니다 un1님이 추방했습니다 un1님이 그룹에 초대했습니다 + un1 님께서 그룹에 돌아오셨습니다 이 메시지는 사용 중인 텔레그램의 버전이 낮아 지원하지 않습니다. 앱을 업데이트 하세요: http://telegram.org/update 사진 동영상 @@ -511,18 +548,24 @@ 메시지 %1$d건 메시지 %1$d건 메시지 %1$d건 - 파일 없음 - 파일 %1$d개 - 파일 %1$d개 - 파일 %1$d개 - 파일 %1$d개 - 파일 %1$d개 + 아이템이 없습니다. + %1$d개 아이템 + %1$d개 아이템 + %1$d개 아이템 + %1$d개 아이템 + %1$d개 아이템 보낸곳 없음 - 채팅방 %1$d개에서 채팅방 %1$d개에서 채팅방 %1$d개에서 채팅방 %1$d개에서 채팅방 %1$d개에서 + 받은 대화 없음 + %1$d개의 대화로부터 받음 + %1$d개의 대화로부터 받음 + %1$d개의 대화로부터 받음 + %1$d개의 대화로부터 받음 + %1$d개의 대화로부터 받음 %1$d초 %1$d초 %1$d초 @@ -572,6 +615,7 @@ %1$d명의 대화상대 %1$d명의 대화상대 + MMMM yyyy M\'월\' d\'일\' yyyy.MM.dd. yyyy. MM. dd. diff --git a/TMessagesProj/src/main/res/values-nl/strings.xml b/TMessagesProj/src/main/res/values-nl/strings.xml index 945b90a44..f765c87db 100644 --- a/TMessagesProj/src/main/res/values-nl/strings.xml +++ b/TMessagesProj/src/main/res/values-nl/strings.xml @@ -57,6 +57,7 @@ %1$s stil Stil uitschakelen Over %1$s + Uitschakelen Nieuwe verzendlijst Naam van lijst @@ -143,6 +144,7 @@ %1$s heeft de naam van de groep %2$s gewijzigd %1$s heeft de afbeelding van de groep %2$s gewijzigd %1$s heeft %3$s uitgenodigd voor de groep %2$s + %1$s is terug in de groep %2$s %1$s heeft %3$s verwijderd uit de groep %2$s %1$s heeft je verwijderd uit de groep %2$s %1$s heeft de groep %2$s verlaten @@ -221,7 +223,7 @@ Een vraag stellen Animaties Deblokkeer - Houd een gebruiker ingedrukt om hem/haar te deblokkeren. + Gebruiker vasthouden om te deblokkeren. Geen geblokkeerde gebruikers Berichtmeldingen Waarschuwing @@ -296,9 +298,27 @@ We sturen een sms-bericht met verificatiecode naar je nieuwe nummer. Aan telefoonnummer %1$s is al een Telegram-account gekoppeld. Verwijder het account om te kunnen migreren naar het nieuwe nummer. Overig + + Toegangscode + Toegangscode wijzigen + Als je een toegangscode instelt verschijnt er een slotje op de chatspagina. Tik erop om Telegram te vergrendelen of te ontgrendelen.\n\nLet op: vergeet je de toegangscode dan zul je de app moeten verwijderen en herinstalleren. Alle geheime chats gaan daarbij verloren. + Je zult nu een slotje op de chatspagina zien. Tik erop om Telegram te vergrendelen met je nieuwe toegangscode. + PIN + Wachtwoord + Huidige toegangscode invoeren + Nieuwe toegangscode invoeren + Toegangscode invoeren + Nieuwe toegangscode opnieuw invoeren + Ongeldige toegangscode + Toegangscodes komen niet overeen + Automatisch vergrendelen + Vraag om toegangscode indien afwezig + over %1$s + Uitgeschakeld Deel foto\'s en video\'s in deze chat om ze op al je apparaten te kunnen benaderen. Bestanden + Gedeelde media Deel bestanden en documenten in deze chat om ze op al je apparaten te kunnen benaderen. Kaart @@ -319,11 +339,26 @@ Niets recents Niets recents ONLINE ZOEKEN - GIF\'S ZOEKEN + ZOEK OP HET WEB + GIF\'S ZOEKEN Online zoeken GIF\'s zoeken Foto bijsnijden Foto bewerken + Verbeteren + Accent + Contrast + Belichting + Warmte + Verzadiging + Vignet + Schaduwen + Korrel + Scherper + Vager + Foto echt verwijderen? + Video echt verwijderen? + Wijzigingen negeren? Password Change password @@ -405,6 +440,7 @@ Foto verwijderen Stel in OK + BIJSNIJDEN un1 heeft un2 verwijderd un1 heeft de groep verlaten @@ -422,6 +458,7 @@ Je hebt de groep gemaakt un1 heeft je verwijderd un1 heeft je toegevoegd + un1 is terug in de groep Dit bericht wordt niet ondersteund door jouw versie van Telegram. Werk Telegram bij om dit bericht te bekijken: http://telegram.org/update Foto Video @@ -511,18 +548,24 @@ %1$d berichten %1$d berichten %1$d berichten - geen bestanden - %1$d bestand - %1$d bestanden - %1$d bestanden - %1$d bestanden - %1$d bestanden + geen items + %1$d item + %1$d items + %1$d items + %1$d items + %1$d items van geen enkel contact van %1$d contacten van %1$d contacten van %1$d contacten van %1$d contacten van %1$d contacten + van geen chats + van %1$d chat + van %1$d chats + van %1$d chats + van %1$d chats + van %1$d chats %1$d seconden %1$d seconde %1$d seconden @@ -572,6 +615,7 @@ %1$d gebruikers %1$d gebruikers + MMMM yyyy dd MMM dd-MM-yy dd-MM-yyyy diff --git a/TMessagesProj/src/main/res/values-pt-rBR/strings.xml b/TMessagesProj/src/main/res/values-pt-rBR/strings.xml index bced87c67..701ca6f5b 100644 --- a/TMessagesProj/src/main/res/values-pt-rBR/strings.xml +++ b/TMessagesProj/src/main/res/values-pt-rBR/strings.xml @@ -5,7 +5,7 @@ Telegram Português (Brasil) - Portuguese (Brazil) + Português (Brasil) pt_BR Seu número @@ -57,6 +57,7 @@ Silenciar por %1$s Restaurar Som Em %1$s + Desativar Nova Lista de Transmissão Digite o nome da lista @@ -143,6 +144,7 @@ %1$s editou o nome do grupo %2$s %1$s editou a foto do grupo %2$s %1$s convidou %3$s para o grupo %2$s + %1$s retornou ao grupo %2$s %1$s removeu %3$s do grupo %2$s %1$s removeu você do grupo %2$s %1$s saiu do grupo %2$s @@ -175,7 +177,7 @@ Nome do grupo %1$d/%2$d membros - Mídia compartilhada + Mídia Compartilhada Configurações Adicionar membro Apagar e sair do grupo @@ -270,7 +272,7 @@ Somente com a tela ligada Somente com a tela desligada Sempre mostrar pop-up - Contador de medalhas + Contador no Ícone Curta Longa Padrão do sistema @@ -294,11 +296,29 @@ ALTERAR NÚMERO Novo número Vamos enviar uma SMS com um código de confirmação para o seu novo número. - O número %1$s já possui uma conta do Telegram. Por favor, delete esta conta antes de migrar para o novo número. + O número %1$s já possui uma conta do Telegram. Por favor, exclua esta conta antes de migrar para o novo número. Outro + + Senha + Alterar Senha + Quando você define uma senha adicional, um ícone de cadeado aparece na página de chats. Clique para bloquear e desbloquear o app.\n\nNota: se você esquecer a sua senha, terá de excluir e reinstalar o app. Todos os chats secretos serão perdidos. + Você verá o ícone do cadeado na página de chats. Clique para bloquear seu app do Telegram com a sua nova senha. + PIN + Senha + Insira sua senha atual + Insira sua nova senha + Insira sua senha + Re-insira sua nova senha + Senha inválida + As senhas não são iguais + Auto-bloquear + Requisitar senha se estiver ausente por muito tempo. + em %1$s + Desativado Compartilhar fotos e vídeos no chat e acessá-los em qualquer um de seus dispositivos. Arquivos + Mídia Compartilhada Compartilhar arquivos e documentos no chat e acessá-los de qualquer um de seus dispositivos. Mapa @@ -318,12 +338,27 @@ Baixar o vídeo primeiro Nenhuma foto recente Nenhum GIF recente - PROCURAR NA INTERNET - PROCURAR GIFS + BUSCAR IMAGENS + BUSCA GLOBAL + BUSCAR GIFS Procurar na web Procurar GIFs Recortar imagem Editar imagem + Aumentar + Realce + Contraste + Exposição + Calor + Saturação + Vignette + Sombras + Granulado + Nitidez + Desfoque + Você tem certeza que deseja apagar esta foto? + Você tem certeza que deseja apagar este vídeo? + Descartar mudanças? Password Change password @@ -379,7 +414,7 @@ Adicionar Usuários Desculpe, muitas solicitações. Impossível alterar os ajustes de privacidade agora, por favor aguarde. Sair de todos os dispositivos, exceto este. - Toque e segure no usuário para deletar. + Toque e segure no usuário para remover. Editar Vídeo Vídeo Original @@ -405,6 +440,7 @@ Apagar foto Aplicar OK + CORTAR un1 removeu un2 un1 saiu do grupo @@ -422,6 +458,7 @@ Você criou o grupo un1 removeu você un1 adicionou você + un1 retornou ao grupo Esta mensagem não é suportada na sua versão do Telegram. Para visualiza-la atualize seu aplicativo em http://telegram.org/update Foto Vídeo @@ -451,16 +488,16 @@ Enviar mensagens para %1$s? Você tem certeza que desejar sair?\n\nSaiba que você pode usar o Telegram em vários dispositivos de uma vez.\n\nLembre-se, sair apaga todos os seus Chats Secretos. Você tem certeza que deseja terminar todas as outras sessões? - Você tem certeza que deseja deletar e sair do grupo? - Você tem certeza que deseja deletar esta conversa? + Você tem certeza que apagar e sair do grupo? + Você tem certeza que deseja apagar esta conversa? Você tem certeza que deseja compartilhar suas informações de contato? Você tem certeza que deseja bloquear este contato? Você tem certeza que deseja desbloquear este contato? - Você tem certeza que deseja deletar este contato? + Você tem certeza que deseja apagar este contato? Você tem certeza que deseja começar um chat secreto? Você tem certeza que deseja cancelar o registro? Você tem certeza que deseja limpar o histórico? - Você tem certeza que deseja deletar %1$s? + Você tem certeza que deseja apagar %1$s? Enviar mensagens para %1$s? Encaminhar mensagem para %1$s? Desculpe, esta funcionalidade não está disponível para seu país. @@ -511,18 +548,24 @@ %1$d mensagens %1$d mensagens %1$d mensagens - nenhum arquivo - %1$d arquivo - %1$d arquivos - %1$d arquivos - %1$d arquivos - %1$d arquivos + nenhum item + %1$d item + %1$d itens + %1$d itens + %1$d itens + %1$d itens de nenhum contato de %1$d contato de %1$d contatos de %1$d contatos de %1$d contatos de %1$d contatos + de nenhum chat + de %1$d chat + de %1$d chats + de %1$d chats + de %1$d chats + de %1$d chats %1$d segundos %1$d segundo %1$d segundos @@ -572,6 +615,7 @@ %1$d usuários %1$d usuários + MMMM yyyy dd MMM dd.MM.yy dd.MM.yyyy diff --git a/TMessagesProj/src/main/res/values-pt-rPT/strings.xml b/TMessagesProj/src/main/res/values-pt-rPT/strings.xml index 31f5ae720..040317928 100644 --- a/TMessagesProj/src/main/res/values-pt-rPT/strings.xml +++ b/TMessagesProj/src/main/res/values-pt-rPT/strings.xml @@ -57,6 +57,7 @@ Silenciar por %1$s Restaurar Som Em %1$s + Desativar Nova Lista de Transmissão Digite o nome da lista @@ -143,6 +144,7 @@ %1$s editou o nome do grupo %2$s %1$s editou a foto do grupo %2$s %1$s convidou %3$s para o grupo %2$s + %1$s retornou ao grupo %2$s %1$s removeu %3$s do grupo %2$s %1$s removeu você do grupo %2$s %1$s saiu do grupo %2$s @@ -175,7 +177,7 @@ Nome do grupo %1$d/%2$d membros - Mídia compartilhada + Mídia Compartilhada Configurações Adicionar membro Apagar e sair do grupo @@ -270,7 +272,7 @@ Somente com a tela ligada Somente com a tela desligada Sempre mostrar pop-up - Contador de medalhas + Contador no Ícone Curta Longa Padrão do sistema @@ -294,11 +296,29 @@ ALTERAR NÚMERO Novo número Vamos enviar uma SMS com um código de confirmação para o seu novo número. - O número %1$s já possui uma conta do Telegram. Por favor, delete esta conta antes de migrar para o novo número. + O número %1$s já possui uma conta do Telegram. Por favor, exclua esta conta antes de migrar para o novo número. Outro + + Senha + Alterar Senha + Quando você define uma senha adicional, um ícone de cadeado aparece na página de chats. Clique para bloquear e desbloquear o app.\n\nNota: se você esquecer a sua senha, terá de excluir e reinstalar o app. Todos os chats secretos serão perdidos. + Você verá o ícone do cadeado na página de chats. Clique para bloquear seu app do Telegram com a sua nova senha. + PIN + Senha + Insira sua senha atual + Insira sua nova senha + Insira sua senha + Re-insira sua nova senha + Senha inválida + As senhas não são iguais + Auto-bloquear + Requisitar senha se estiver ausente por muito tempo. + em %1$s + Desativado Compartilhar fotos e vídeos no chat e acessá-los em qualquer um de seus dispositivos. Arquivos + Mídia Compartilhada Compartilhar arquivos e documentos no chat e acessá-los de qualquer um de seus dispositivos. Mapa @@ -318,12 +338,27 @@ Baixar o vídeo primeiro Nenhuma foto recente Nenhum GIF recente - PROCURAR NA INTERNET - PROCURAR GIFS + BUSCAR IMAGENS + BUSCA GLOBAL + BUSCAR GIFS Procurar na web Procurar GIFs Recortar imagem Editar imagem + Aumentar + Realce + Contraste + Exposição + Calor + Saturação + Vignette + Sombras + Granulado + Nitidez + Desfoque + Você tem certeza que deseja apagar esta foto? + Você tem certeza que deseja apagar este vídeo? + Descartar mudanças? Password Change password @@ -379,7 +414,7 @@ Adicionar Usuários Desculpe, muitas solicitações. Impossível alterar os ajustes de privacidade agora, por favor aguarde. Sair de todos os dispositivos, exceto este. - Toque e segure no usuário para deletar. + Toque e segure no usuário para remover. Editar Vídeo Vídeo Original @@ -405,6 +440,7 @@ Apagar foto Aplicar OK + CORTAR un1 removeu un2 un1 saiu do grupo @@ -422,6 +458,7 @@ Você criou o grupo un1 removeu você un1 adicionou você + un1 retornou ao grupo Esta mensagem não é suportada na sua versão do Telegram. Para visualiza-la atualize seu aplicativo em http://telegram.org/update Foto Vídeo @@ -451,16 +488,16 @@ Enviar mensagens para %1$s? Você tem certeza que desejar sair?\n\nSaiba que você pode usar o Telegram em vários dispositivos de uma vez.\n\nLembre-se, sair apaga todos os seus Chats Secretos. Você tem certeza que deseja terminar todas as outras sessões? - Você tem certeza que deseja deletar e sair do grupo? - Você tem certeza que deseja deletar esta conversa? + Você tem certeza que apagar e sair do grupo? + Você tem certeza que deseja apagar esta conversa? Você tem certeza que deseja compartilhar suas informações de contato? Você tem certeza que deseja bloquear este contato? Você tem certeza que deseja desbloquear este contato? - Você tem certeza que deseja deletar este contato? + Você tem certeza que deseja apagar este contato? Você tem certeza que deseja começar um chat secreto? Você tem certeza que deseja cancelar o registro? Você tem certeza que deseja limpar o histórico? - Você tem certeza que deseja deletar %1$s? + Você tem certeza que deseja apagar %1$s? Enviar mensagens para %1$s? Encaminhar mensagem para %1$s? Desculpe, esta funcionalidade não está disponível para seu país. @@ -511,18 +548,24 @@ %1$d mensagens %1$d mensagens %1$d mensagens - nenhum arquivo - %1$d arquivo - %1$d arquivos - %1$d arquivos - %1$d arquivos - %1$d arquivos + nenhum item + %1$d item + %1$d itens + %1$d itens + %1$d itens + %1$d itens de nenhum contato de %1$d contato de %1$d contatos de %1$d contatos de %1$d contatos de %1$d contatos + de nenhum chat + de %1$d chat + de %1$d chats + de %1$d chats + de %1$d chats + de %1$d chats %1$d segundos %1$d segundo %1$d segundos @@ -572,6 +615,7 @@ %1$d usuários %1$d usuários + MMMM yyyy dd MMM dd.MM.yy dd.MM.yyyy diff --git a/TMessagesProj/src/main/res/values-v21/styles.xml b/TMessagesProj/src/main/res/values-v21/styles.xml index 97ee0af7d..b02410741 100644 --- a/TMessagesProj/src/main/res/values-v21/styles.xml +++ b/TMessagesProj/src/main/res/values-v21/styles.xml @@ -54,7 +54,7 @@ diff --git a/TMessagesProj/src/main/res/values/colors.xml b/TMessagesProj/src/main/res/values/colors.xml index 9b1c746d2..31a03a7c9 100755 --- a/TMessagesProj/src/main/res/values/colors.xml +++ b/TMessagesProj/src/main/res/values/colors.xml @@ -2,5 +2,4 @@ #6633B5E5 #dcdcdc - #ff54759e \ 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 0f856f43a..085fb7bd6 100644 --- a/TMessagesProj/src/main/res/values/strings.xml +++ b/TMessagesProj/src/main/res/values/strings.xml @@ -57,6 +57,7 @@ Mute for %1$s Unmute In %1$s + Disable New Broadcast List Enter list name @@ -143,6 +144,7 @@ %1$s edited the group\'s %2$s name %1$s edited the group\'s %2$s photo %1$s invited %3$s to the group %2$s + %1$s returned to the group %2$s %1$s removed %3$s from the group %2$s %1$s removed you from the group %2$s %1$s has left the group %2$s @@ -296,9 +298,27 @@ We will send an SMS with a confirmation code to your new number. The number %1$s is already connected to a Telegram account. Please delete that account before migrating to the new number. Other + + Passcode + Change Passcode + When you set up an additional passcode, a lock icon will appear on the chats page. Tap it to lock and unlock your Telegram app.\n\nNote: if you forget the passcode, you\'ll need to delete and reinstall the app. All secret chats will be lost. + You will now see a lock icon on the chats page. Tap it to lock your Telegram app with your new passcode. + PIN + Password + Enter your current passcode + Enter your new passcode + Enter your passcode + Re-enter your new passcode + Invalid passcode + Passcodes do not match + Auto-lock + Require passcode if away for a time. + in %1$s + Disabled Share photos and videos in this chat and access them on any of your devices. Files + Shared Media Share files and documents in this chat and access them on any of your devices. Map @@ -318,12 +338,27 @@ Please download media first No recent photos No recent GIFs - SEARCH WEB - SEARCH GIFS + FIND IMAGES + WEB SEARCH + FIND GIFS Search web Search GIFs Crop image Edit image + Enhance + Highlights + Contrast + Exposure + Warmth + Saturation + Vignette + Shadows + Grain + Sharpen + Blur + Are you sure you want to delete this photo? + Are you sure you want to delete this video? + Discard changes? Password Change password @@ -405,6 +440,7 @@ Delete photo Set OK + CROP un1 removed un2 un1 left group @@ -422,6 +458,7 @@ You created the group un1 removed you un1 added you + un1 returned to the group This message is not supported on your version of Telegram. Update the app to view: http://telegram.org/update Photo Video @@ -511,18 +548,24 @@ %1$d messages %1$d messages %1$d messages - no files - %1$d file - %1$d files - %1$d files - %1$d files - %1$d files + no items + %1$d item + %1$d items + %1$d items + %1$d items + %1$d items from no contacts from %1$d contact from %1$d contacts from %1$d contacts from %1$d contacts from %1$d contacts + from no chats + from %1$d chat + from %1$d chats + from %1$d chats + from %1$d chats + from %1$d chats %1$d seconds %1$d second %1$d seconds @@ -572,6 +615,7 @@ %1$d users %1$d users + MMMM yyyy MMM dd dd.MM.yy dd.MM.yyyy diff --git a/TMessagesProj/src/main/res/values/styles.xml b/TMessagesProj/src/main/res/values/styles.xml index bf12e881b..9884ff93b 100644 --- a/TMessagesProj/src/main/res/values/styles.xml +++ b/TMessagesProj/src/main/res/values/styles.xml @@ -42,7 +42,7 @@