From 75349fc1a8742a073473b4e17a33a19ffe9a2b1a Mon Sep 17 00:00:00 2001 From: rafalense Date: Sat, 25 Jul 2015 17:22:47 +0200 Subject: [PATCH] =?UTF-8?q?Update=20to=203.1.1.3=20(583):=20-=20Base=20upd?= =?UTF-8?q?ated=20to=203.1.1:=20*=20Search=20for=20messages=20inside=20a?= =?UTF-8?q?=20specific=20chat.=20*=20Fully=20redesigned=20attachment=20men?= =?UTF-8?q?u.=20Send=20contacts=20and=20audio=20files=20straight=20from=20?= =?UTF-8?q?the=20attachment=20menu.=20*=20Improved=20in-app=20media=20play?= =?UTF-8?q?back=20(YouTube,=20Vimeo,=20Sound=D0=A1loud=20etc.),=20new=20pl?= =?UTF-8?q?ayer=20for=20large=20audio=20files.=20More=20about=20this=20upd?= =?UTF-8?q?ate:=20https://telegram.org/blog/search-and-media=20-=20New=20M?= =?UTF-8?q?OD=20to=20change=20color=20of=20shared=20contact=20name=20-=20N?= =?UTF-8?q?ew=20MODs=20to=20change=20avatar=20color,=20size=20and=20radius?= =?UTF-8?q?=20and=20status=20color=20in=20settings=20screen=20-=20Bug=20fi?= =?UTF-8?q?xes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TMessagesProj/build.gradle | 5 +- TMessagesProj/src/main/AndroidManifest.xml | 14 +- .../SQLite/SQLitePreparedStatement.java | 8 +- .../telegram/android/AndroidUtilities.java | 24 +- .../AnimationCompat/AnimatorSetProxy.java | 4 +- .../telegram/android/ContactsController.java | 82 +- .../main/java/org/telegram/android/Emoji.java | 51 +- .../org/telegram/android/ImageLoader.java | 3 + .../org/telegram/android/MediaController.java | 454 +++++++- .../org/telegram/android/MessageObject.java | 57 +- .../telegram/android/MessagesController.java | 2 +- .../org/telegram/android/MessagesStorage.java | 23 +- .../telegram/android/NotificationCenter.java | 2 + .../android/NotificationsController.java | 33 +- .../telegram/android/SendMessagesHelper.java | 81 ++ .../android/query/SharedMediaQuery.java | 34 + .../android/support/util/SortedList.java | 16 +- .../android/support/widget/AdapterHelper.java | 3 + .../support/widget/DefaultItemAnimator.java | 1 + .../support/widget/GridLayoutManager.java | 2 + .../android/support/widget/LayoutState.java | 23 +- .../support/widget/LinearLayoutManager.java | 75 +- .../android/support/widget/OpReorderer.java | 14 +- .../android/support/widget/PositionMap.java | 1 - .../android/support/widget/RecyclerView.java | 564 ++++++++-- .../widget/StaggeredGridLayoutManager.java | 186 ++-- .../util/SortedListAdapterCallback.java | 2 +- .../telegram/messenger/ApplicationLoader.java | 6 +- .../messenger/ConnectionsManager.java | 4 +- .../telegram/messenger/FileLoadOperation.java | 18 +- .../org/telegram/messenger/FileLoader.java | 9 + .../telegram/messenger/HandshakeAction.java | 2 +- .../java/org/telegram/messenger/TLRPC.java | 12 + .../org/telegram/messenger/TcpConnection.java | 2 +- .../org/telegram/ui/ActionBar/ActionBar.java | 369 +++---- .../ui/ActionBar/ActionBarLayout.java | 10 +- .../telegram/ui/ActionBar/ActionBarMenu.java | 26 +- .../ui/ActionBar/ActionBarMenuItem.java | 40 +- .../ui/ActionBar/ActionBarPopupWindow.java | 50 +- .../telegram/ui/ActionBar/BaseFragment.java | 3 +- .../ui/ActionBar/DrawerLayoutContainer.java | 4 - .../ui/Adapters/CountrySearchAdapter.java | 1 - .../ui/Adapters/DialogsSearchAdapter.java | 6 + .../ui/Adapters/DrawerLayoutAdapter.java | 27 +- .../telegram/ui/Adapters/StickersAdapter.java | 2 +- .../org/telegram/ui/BlockedUsersActivity.java | 3 +- .../org/telegram/ui/Cells/ChatActionCell.java | 8 +- .../org/telegram/ui/Cells/ChatAudioCell.java | 123 ++- .../org/telegram/ui/Cells/ChatBaseCell.java | 16 +- .../telegram/ui/Cells/ChatContactCell.java | 29 +- .../org/telegram/ui/Cells/ChatMediaCell.java | 9 +- .../telegram/ui/Cells/ChatMessageCell.java | 12 +- .../org/telegram/ui/Cells/DialogCell.java | 24 +- .../telegram/ui/Cells/DrawerActionCell.java | 31 +- .../telegram/ui/Cells/DrawerProfileCell.java | 32 +- .../telegram/ui/Cells/GreySectionCell.java | 1 + .../telegram/ui/Cells/HashtagSearchCell.java | 8 + .../telegram/ui/Cells/SharedDocumentCell.java | 5 +- .../ui/Cells/SharedMediaSectionCell.java | 2 +- .../telegram/ui/Cells/StickerEmojiCell.java | 4 +- .../org/telegram/ui/Cells/TextDetailCell.java | 18 +- .../org/telegram/ui/Cells/TextInfoCell.java | 9 +- .../telegram/ui/ChangeChatNameActivity.java | 3 +- .../org/telegram/ui/ChangeNameActivity.java | 3 +- .../org/telegram/ui/ChangePhoneActivity.java | 3 +- .../telegram/ui/ChangePhoneHelpActivity.java | 3 +- .../telegram/ui/ChangeUsernameActivity.java | 3 +- .../java/org/telegram/ui/ChatActivity.java | 364 ++++--- .../ui/Components/AvatarDrawable.java | 2 +- .../ui/Components/ChatActivityEnterView.java | 104 +- .../org/telegram/ui/Components/EmojiView.java | 9 +- .../ui/Components/LetterSectionsListView.java | 2 +- .../ui/Components/LineProgressView.java | 18 +- .../telegram/ui/Components/NumberPicker.java | 1 - .../ui/Components/PagerSlidingTabStrip.java | 3 - .../telegram/ui/Components/PasscodeView.java | 10 +- .../ui/Components/PhotoFilterView.java | 29 +- .../Components/PhotoPickerBottomLayout.java | 114 -- .../PhotoViewerCaptionEnterView.java | 35 +- .../ui/Components/PopupAudioView.java | 7 +- .../ui/Components/RadialProgress.java | 5 +- .../ui/Components/RecyclerListView.java | 5 + .../org/telegram/ui/Components/SeekBar.java | 54 +- .../org/telegram/ui/Components/Switch.java | 4 +- .../telegram/ui/Components/TimerDrawable.java | 4 +- .../ui/Components/TypingDotsDrawable.java | 2 +- .../ui/Components/VideoTimelineView.java | 1 - .../org/telegram/ui/ContactAddActivity.java | 11 +- .../org/telegram/ui/ContactsActivity.java | 3 +- .../telegram/ui/CountrySelectActivity.java | 5 +- .../telegram/ui/DocumentSelectActivity.java | 5 +- .../org/telegram/ui/GroupCreateActivity.java | 16 +- .../telegram/ui/GroupCreateFinalActivity.java | 21 +- .../org/telegram/ui/GroupInviteActivity.java | 3 +- .../org/telegram/ui/IdenticonActivity.java | 7 +- .../org/telegram/ui/ImageListActivity.java | 6 +- .../telegram/ui/LanguageSelectActivity.java | 3 +- .../org/telegram/ui/LastSeenActivity.java | 3 +- .../telegram/ui/LastSeenUsersActivity.java | 3 +- .../java/org/telegram/ui/LaunchActivity.java | 91 +- .../org/telegram/ui/LocationActivity.java | 10 +- .../java/org/telegram/ui/LoginActivity.java | 8 +- .../java/org/telegram/ui/MediaActivity.java | 80 +- .../org/telegram/ui/MessagesActivity.java | 988 ------------------ .../ui/NotificationsSettingsActivity.java | 19 +- .../org/telegram/ui/PasscodeActivity.java | 3 +- .../telegram/ui/PhotoAlbumPickerActivity.java | 25 +- .../org/telegram/ui/PhotoCropActivity.java | 7 +- .../org/telegram/ui/PhotoPickerActivity.java | 28 +- .../java/org/telegram/ui/PhotoViewer.java | 23 +- .../ui/PopupNotificationActivity.java | 10 +- .../telegram/ui/PrivacySettingsActivity.java | 4 +- .../java/org/telegram/ui/ProfileActivity.java | 25 +- .../ui/ProfileNotificationsActivity.java | 11 +- .../org/telegram/ui/SessionsActivity.java | 9 +- .../org/telegram/ui/SettingsActivity.java | 35 +- .../java/org/telegram/ui/ThemingActivity.java | 2 +- .../org/telegram/ui/ThemingChatActivity.java | 26 +- .../org/telegram/ui/ThemingChatsActivity.java | 2 +- .../telegram/ui/ThemingContactsActivity.java | 2 +- .../telegram/ui/ThemingDrawerActivity.java | 26 +- .../telegram/ui/ThemingProfileActivity.java | 2 +- .../ui/TwoStepVerificationActivity.java | 3 +- .../org/telegram/ui/VideoEditorActivity.java | 11 +- .../org/telegram/ui/WallpapersActivity.java | 14 +- .../src/main/res/drawable-hdpi/Thumbs.db | Bin 363520 -> 435200 bytes .../res/drawable-hdpi/ic_attach_gallery.png | Bin 1248 -> 0 bytes .../res/drawable-hdpi/ic_attach_location.png | Bin 1490 -> 0 bytes .../res/drawable-hdpi/ic_attach_music.png | Bin 1206 -> 0 bytes .../res/drawable-hdpi/ic_attach_photo.png | Bin 1442 -> 0 bytes .../res/drawable-hdpi/ic_attach_video.png | Bin 1045 -> 0 bytes .../src/main/res/drawable-hdpi/player1.png | Bin 687 -> 0 bytes .../res/drawable-hdpi/player1_pressed.png | Bin 1210 -> 0 bytes .../src/main/res/drawable-hdpi/player2.png | Bin 676 -> 0 bytes .../res/drawable-hdpi/player2_pressed.png | Bin 1250 -> 0 bytes .../src/main/res/drawable-mdpi/Thumbs.db | Bin 296448 -> 306176 bytes .../res/drawable-mdpi/ic_attach_gallery.png | Bin 1131 -> 0 bytes .../res/drawable-mdpi/ic_attach_location.png | Bin 1261 -> 0 bytes .../res/drawable-mdpi/ic_attach_music.png | Bin 1102 -> 0 bytes .../res/drawable-mdpi/ic_attach_photo.png | Bin 1227 -> 0 bytes .../res/drawable-mdpi/ic_attach_video.png | Bin 990 -> 0 bytes .../src/main/res/drawable-mdpi/player1.png | Bin 516 -> 0 bytes .../res/drawable-mdpi/player1_pressed.png | Bin 828 -> 0 bytes .../src/main/res/drawable-mdpi/player2.png | Bin 503 -> 0 bytes .../res/drawable-mdpi/player2_pressed.png | Bin 845 -> 0 bytes .../src/main/res/drawable-xhdpi/Thumbs.db | Bin 508416 -> 526848 bytes .../res/drawable-xhdpi/ic_attach_gallery.png | Bin 1335 -> 0 bytes .../res/drawable-xhdpi/ic_attach_location.png | Bin 1607 -> 0 bytes .../res/drawable-xhdpi/ic_attach_music.png | Bin 1272 -> 0 bytes .../res/drawable-xhdpi/ic_attach_photo.png | Bin 1588 -> 0 bytes .../res/drawable-xhdpi/ic_attach_video.png | Bin 1032 -> 0 bytes .../src/main/res/drawable-xhdpi/player1.png | Bin 858 -> 0 bytes .../res/drawable-xhdpi/player1_pressed.png | Bin 1470 -> 0 bytes .../src/main/res/drawable-xhdpi/player2.png | Bin 844 -> 0 bytes .../res/drawable-xhdpi/player2_pressed.png | Bin 1482 -> 0 bytes .../src/main/res/drawable-xxhdpi/Thumbs.db | Bin 768000 -> 890880 bytes .../res/drawable-xxhdpi/ic_attach_gallery.png | Bin 1552 -> 0 bytes .../drawable-xxhdpi/ic_attach_location.png | Bin 1993 -> 0 bytes .../res/drawable-xxhdpi/ic_attach_music.png | Bin 1496 -> 0 bytes .../res/drawable-xxhdpi/ic_attach_photo.png | Bin 1949 -> 0 bytes .../res/drawable-xxhdpi/ic_attach_video.png | Bin 1092 -> 0 bytes .../src/main/res/drawable-xxhdpi/player1.png | Bin 1312 -> 0 bytes .../res/drawable-xxhdpi/player1_pressed.png | Bin 2355 -> 0 bytes .../src/main/res/drawable-xxhdpi/player2.png | Bin 1290 -> 0 bytes .../res/drawable-xxhdpi/player2_pressed.png | Bin 2436 -> 0 bytes .../src/main/res/drawable-xxxhdpi/Thumbs.db | Bin 9728 -> 9728 bytes .../src/main/res/drawable/floating_states.xml | 9 - .../main/res/drawable/search_dark_states.xml | 7 - .../main/res/drawable/search_light_states.xml | 7 - .../src/main/res/values-ar/strings.xml | 13 +- .../src/main/res/values-ca/strings.xml | 271 ++++- .../src/main/res/values-de/strings.xml | 13 +- .../src/main/res/values-es/strings.xml | 14 +- .../src/main/res/values-fr/strings.xml | 35 +- .../src/main/res/values-gl/strings.xml | 313 +++++- .../src/main/res/values-hi/strings.xml | 2 +- .../src/main/res/values-it/strings.xml | 43 +- .../src/main/res/values-ko/strings.xml | 11 +- .../src/main/res/values-nl/strings.xml | 11 +- .../src/main/res/values-pt-rBR/strings.xml | 17 +- .../src/main/res/values-pt-rPT/strings.xml | 11 +- .../src/main/res/values-ru/strings.xml | 275 ++++- .../src/main/res/values-tr/strings.xml | 2 +- .../src/main/res/values-zh-rCN/strings.xml | 101 +- .../src/main/res/values-zh-rTW/strings.xml | 10 +- TMessagesProj/src/main/res/values/strings.xml | 16 +- TMessagesProj/src/main/res/values/styles.xml | 4 +- 187 files changed, 3630 insertions(+), 2582 deletions(-) delete mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoPickerBottomLayout.java delete mode 100644 TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java delete mode 100644 TMessagesProj/src/main/res/drawable-hdpi/ic_attach_gallery.png delete mode 100644 TMessagesProj/src/main/res/drawable-hdpi/ic_attach_location.png delete mode 100644 TMessagesProj/src/main/res/drawable-hdpi/ic_attach_music.png delete mode 100644 TMessagesProj/src/main/res/drawable-hdpi/ic_attach_photo.png delete mode 100644 TMessagesProj/src/main/res/drawable-hdpi/ic_attach_video.png delete mode 100644 TMessagesProj/src/main/res/drawable-hdpi/player1.png delete mode 100644 TMessagesProj/src/main/res/drawable-hdpi/player1_pressed.png delete mode 100644 TMessagesProj/src/main/res/drawable-hdpi/player2.png delete mode 100644 TMessagesProj/src/main/res/drawable-hdpi/player2_pressed.png delete mode 100644 TMessagesProj/src/main/res/drawable-mdpi/ic_attach_gallery.png delete mode 100644 TMessagesProj/src/main/res/drawable-mdpi/ic_attach_location.png delete mode 100644 TMessagesProj/src/main/res/drawable-mdpi/ic_attach_music.png delete mode 100644 TMessagesProj/src/main/res/drawable-mdpi/ic_attach_photo.png delete mode 100644 TMessagesProj/src/main/res/drawable-mdpi/ic_attach_video.png delete mode 100644 TMessagesProj/src/main/res/drawable-mdpi/player1.png delete mode 100644 TMessagesProj/src/main/res/drawable-mdpi/player1_pressed.png delete mode 100644 TMessagesProj/src/main/res/drawable-mdpi/player2.png delete mode 100644 TMessagesProj/src/main/res/drawable-mdpi/player2_pressed.png delete mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/ic_attach_gallery.png delete mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/ic_attach_location.png delete mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/ic_attach_music.png delete mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/ic_attach_photo.png delete mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/ic_attach_video.png delete mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/player1.png delete mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/player1_pressed.png delete mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/player2.png delete mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/player2_pressed.png delete mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/ic_attach_gallery.png delete mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/ic_attach_location.png delete mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/ic_attach_music.png delete mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/ic_attach_photo.png delete mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/ic_attach_video.png delete mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/player1.png delete mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/player1_pressed.png delete mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/player2.png delete mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/player2_pressed.png delete mode 100644 TMessagesProj/src/main/res/drawable/search_dark_states.xml delete mode 100644 TMessagesProj/src/main/res/drawable/search_light_states.xml diff --git a/TMessagesProj/build.gradle b/TMessagesProj/build.gradle index b15fb74e..ad3b7a5e 100644 --- a/TMessagesProj/build.gradle +++ b/TMessagesProj/build.gradle @@ -1,4 +1,3 @@ - apply plugin: 'com.android.application' repositories { @@ -82,7 +81,7 @@ android { applicationId "org.telegram.plus" minSdkVersion 8 targetSdkVersion 22 - versionCode 576 - versionName "3.0.1.5" + versionCode 583 + versionName "3.1.1.3" } } diff --git a/TMessagesProj/src/main/AndroidManifest.xml b/TMessagesProj/src/main/AndroidManifest.xml index 4235c45a..a2d46e6e 100644 --- a/TMessagesProj/src/main/AndroidManifest.xml +++ b/TMessagesProj/src/main/AndroidManifest.xml @@ -161,8 +161,20 @@ - + + + + + + + + + + + + + diff --git a/TMessagesProj/src/main/java/org/telegram/SQLite/SQLitePreparedStatement.java b/TMessagesProj/src/main/java/org/telegram/SQLite/SQLitePreparedStatement.java index 6e78412d..92dc7dea 100644 --- a/TMessagesProj/src/main/java/org/telegram/SQLite/SQLitePreparedStatement.java +++ b/TMessagesProj/src/main/java/org/telegram/SQLite/SQLitePreparedStatement.java @@ -30,7 +30,7 @@ public class SQLitePreparedStatement { public SQLitePreparedStatement(SQLiteDatabase db, String sql, boolean finalize) throws SQLiteException { finalizeAfterQuery = finalize; sqliteStatementHandle = prepare(db.getSQLiteHandle(), sql); - //if (BuildVars.DEBUG_VERSION) { + /*//if (BuildVars.DEBUG_VERSION) { if (BuildConfig.DEBUG) { if (hashMap == null) { hashMap = new HashMap<>(); @@ -39,7 +39,7 @@ public class SQLitePreparedStatement { for (HashMap.Entry entry : hashMap.entrySet()) { FileLog.d("tmessages", "exist entry = " + entry.getValue()); } - } + }*/ } @@ -102,10 +102,10 @@ public class SQLitePreparedStatement { return; } try { - //if (BuildVars.DEBUG_VERSION) { + /*//if (BuildVars.DEBUG_VERSION) { if (BuildConfig.DEBUG) { hashMap.remove(this); - } + }*/ isFinalized = true; finalize(sqliteStatementHandle); } catch (SQLiteException e) { diff --git a/TMessagesProj/src/main/java/org/telegram/android/AndroidUtilities.java b/TMessagesProj/src/main/java/org/telegram/android/AndroidUtilities.java index 17f51edb..b6451e5c 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/AndroidUtilities.java +++ b/TMessagesProj/src/main/java/org/telegram/android/AndroidUtilities.java @@ -54,18 +54,18 @@ import net.hockeyapp.android.CrashManager; import net.hockeyapp.android.CrashManagerListener; import net.hockeyapp.android.UpdateManager; -import org.telegram.android.AnimationCompat.AnimatorListenerAdapterProxy; -import org.telegram.android.AnimationCompat.AnimatorSetProxy; -import org.telegram.android.AnimationCompat.ObjectAnimatorProxy; -import org.telegram.android.AnimationCompat.ViewProxy; -import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.BuildConfig; import org.telegram.messenger.BuildVars; 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.android.AnimationCompat.AnimatorListenerAdapterProxy; +import org.telegram.android.AnimationCompat.AnimatorSetProxy; +import org.telegram.android.AnimationCompat.ObjectAnimatorProxy; +import org.telegram.android.AnimationCompat.ViewProxy; import org.telegram.ui.Components.ForegroundDetector; import org.telegram.ui.Components.NumberPicker; import org.telegram.ui.Components.TypefaceSpan; @@ -558,16 +558,6 @@ public class AndroidUtilities { return 0; } - public static int getCurrentActionBarHeight() { - if (isTablet()) { - return dp(64); - } else if (ApplicationLoader.applicationContext.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { - return dp(48); - } else { - return dp(56); - } - } - public static Point getRealScreenSize() { Point size = new Point(); try { @@ -965,8 +955,8 @@ public class AndroidUtilities { builder.append(" "); } query = query.trim(); - builder.append(AndroidUtilities.replaceTags("" + query + "")); - //builder.append(AndroidUtilities.replaceTags("" + query + "")); + //builder.append(AndroidUtilities.replaceTags("" + query + "")); + builder.append(AndroidUtilities.replaceTags("" + query + "")); lastIndex = end; } diff --git a/TMessagesProj/src/main/java/org/telegram/android/AnimationCompat/AnimatorSetProxy.java b/TMessagesProj/src/main/java/org/telegram/android/AnimationCompat/AnimatorSetProxy.java index be599393..c41b14bf 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/AnimationCompat/AnimatorSetProxy.java +++ b/TMessagesProj/src/main/java/org/telegram/android/AnimationCompat/AnimatorSetProxy.java @@ -66,13 +66,13 @@ public class AnimatorSetProxy { public void playTogether(ArrayList items) { if (View10.NEED_PROXY) { - ArrayList animators = new ArrayList(); + ArrayList animators = new ArrayList<>(); for (Object obj : items) { animators.add((Animator10)obj); } ((AnimatorSet10) animatorSet).playTogether(animators); } else { - ArrayList animators = new ArrayList(); + ArrayList animators = new ArrayList<>(); for (Object obj : items) { animators.add((Animator)obj); } diff --git a/TMessagesProj/src/main/java/org/telegram/android/ContactsController.java b/TMessagesProj/src/main/java/org/telegram/android/ContactsController.java index 00bc6405..449dfcef 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/ContactsController.java +++ b/TMessagesProj/src/main/java/org/telegram/android/ContactsController.java @@ -20,10 +20,10 @@ import android.database.Cursor; import android.net.Uri; import android.provider.BaseColumns; import android.provider.ContactsContract; +import android.text.TextUtils; import android.util.SparseArray; import org.telegram.PhoneFormat.PhoneFormat; -import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.BuildVars; import org.telegram.messenger.ConnectionsManager; import org.telegram.messenger.FileLog; @@ -33,6 +33,7 @@ import org.telegram.messenger.TLObject; import org.telegram.messenger.TLRPC; import org.telegram.messenger.UserConfig; import org.telegram.messenger.Utilities; +import org.telegram.messenger.ApplicationLoader; import java.util.ArrayList; import java.util.Collections; @@ -331,7 +332,7 @@ public class ContactsController { ContentResolver cr = ApplicationLoader.applicationContext.getContentResolver(); HashMap shortContacts = new HashMap<>(); - StringBuilder ids = new StringBuilder(); + ArrayList idsArr = new ArrayList<>(); Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projectionPhones, null, null, null); if (pCur != null) { if (pCur.getCount() > 0) { @@ -356,10 +357,9 @@ public class ContactsController { } Integer id = pCur.getInt(0); - if (ids.length() != 0) { - ids.append(","); + if (!idsArr.contains(id)) { + idsArr.add(id); } - ids.append(id); int type = pCur.getInt(2); Contact contact = contactsMap.get(id); @@ -393,8 +393,9 @@ public class ContactsController { } pCur.close(); } + String ids = TextUtils.join(",", idsArr); - pCur = cr.query(ContactsContract.Data.CONTENT_URI, projectionNames, ContactsContract.CommonDataKinds.StructuredName.CONTACT_ID + " IN (" + ids.toString() + ") AND " + ContactsContract.Data.MIMETYPE + " = '" + ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE + "'", null, null); + pCur = cr.query(ContactsContract.Data.CONTENT_URI, projectionNames, ContactsContract.CommonDataKinds.StructuredName.CONTACT_ID + " IN (" + ids + ") AND " + ContactsContract.Data.MIMETYPE + " = '" + ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE + "'", null, null); if (pCur != null && pCur.getCount() > 0) { while (pCur.moveToNext()) { int id = pCur.getInt(0); @@ -475,6 +476,23 @@ public class ContactsController { FileLog.e("tmessages", e); contactsMap.clear(); } + if (BuildVars.DEBUG_VERSION) { + for (HashMap.Entry entry : contactsMap.entrySet()) { + Contact contact = entry.getValue(); + FileLog.e("tmessages", "contact = " + contact.first_name + " " + contact.last_name); + if (contact.first_name.length() == 0 && contact.last_name.length() == 0 && contact.phones.size() > 0) { + FileLog.e("tmessages", "warning, empty name for contact = " + contact.id); + } + FileLog.e("tmessages", "phones:"); + for (String s : contact.phones) { + FileLog.e("tmessages", "phone = " + s); + } + FileLog.e("tmessages", "short phones:"); + for (String s : contact.shortPhones) { + FileLog.e("tmessages", "short phone = " + s); + } + } + } return contactsMap; } @@ -570,7 +588,7 @@ public class ContactsController { } } - boolean nameChanged = existing != null && (!existing.first_name.equals(value.first_name) || !existing.last_name.equals(value.last_name)); + boolean nameChanged = existing != null && (value.first_name.length() != 0 && !existing.first_name.equals(value.first_name) || value.last_name != null && !existing.last_name.equals(value.last_name)); if (existing == null || nameChanged) { for (int a = 0; a < value.phones.size(); a++) { String sphone = value.shortPhones.get(a); @@ -608,8 +626,12 @@ public class ContactsController { int index = existing.shortPhones.indexOf(sphone); if (index == -1) { if (request) { - if (contactsByPhone.containsKey(sphone)) { - continue; + TLRPC.TL_contact contact = contactsByPhone.get(sphone); + if (contact != null) { + TLRPC.User user = MessagesController.getInstance().getUser(contact.user_id); + if (user == null || user.first_name != null && user.first_name.length() != 0 || user.last_name != null && user.last_name.length() != 0) { + continue; + } } TLRPC.TL_inputPhoneContact imp = new TLRPC.TL_inputPhoneContact(); @@ -703,8 +725,12 @@ public class ContactsController { int id = pair.getKey(); for (int a = 0; a < value.phones.size(); a++) { String phone = value.shortPhones.get(a); - if (contactsByPhone.containsKey(phone)) { - continue; + TLRPC.TL_contact contact = contactsByPhone.get(phone); + if (contact != null) { + TLRPC.User user = MessagesController.getInstance().getUser(contact.user_id); + if (user == null || user.first_name != null && user.first_name.length() != 0 || user.last_name != null && user.last_name.length() != 0) { + continue; + } } TLRPC.TL_inputPhoneContact imp = new TLRPC.TL_inputPhoneContact(); imp.client_id = id; @@ -722,9 +748,9 @@ public class ContactsController { if (!toImport.isEmpty()) { if (BuildVars.DEBUG_VERSION) { FileLog.e("tmessages", "start import contacts"); -// for (TLRPC.TL_inputPhoneContact contact : toImport) { -// FileLog.e("tmessages", "add contact " + contact.first_name + " " + contact.last_name + " " + contact.phone); -// } + for (TLRPC.TL_inputPhoneContact contact : toImport) { + FileLog.e("tmessages", "add contact " + contact.first_name + " " + contact.last_name + " " + contact.phone); + } } final int count = (int)Math.ceil(toImport.size() / 500.0f); for (int a = 0; a < count; a++) { @@ -744,9 +770,9 @@ public class ContactsController { } TLRPC.TL_contacts_importedContacts res = (TLRPC.TL_contacts_importedContacts)response; if (BuildVars.DEBUG_VERSION) { -// for (TLRPC.User user : res.users) { -// FileLog.e("tmessages", "received user " + user.first_name + " " + user.last_name + " " + user.phone); -// } + for (TLRPC.User user : res.users) { + FileLog.e("tmessages", "received user " + user.first_name + " " + user.last_name + " " + user.phone); + } } MessagesStorage.getInstance().putUsersAndChats(res.users, null, true, true); ArrayList cArr = new ArrayList<>(); @@ -904,9 +930,9 @@ public class ContactsController { if (user != null) { usersDict.put(user.id, user); -// if (BuildVars.DEBUG_VERSION) { -// FileLog.e("tmessages", "loaded user contact " + user.first_name + " " + user.last_name + " " + user.phone); -// } + if (BuildVars.DEBUG_VERSION) { + FileLog.e("tmessages", "loaded user contact " + user.first_name + " " + user.last_name + " " + user.phone); + } } } @@ -1525,9 +1551,9 @@ public class ContactsController { contactsParams.add(c); req.contacts = contactsParams; req.replace = false; -// if (BuildVars.DEBUG_VERSION) { -// FileLog.e("tmessages", "add contact " + user.first_name + " " + user.last_name + " " + user.phone); -// } + if (BuildVars.DEBUG_VERSION) { + FileLog.e("tmessages", "add contact " + user.first_name + " " + user.last_name + " " + user.phone); + } ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { @Override public void run(TLObject response, TLRPC.TL_error error) { @@ -1537,11 +1563,11 @@ public class ContactsController { final TLRPC.TL_contacts_importedContacts res = (TLRPC.TL_contacts_importedContacts)response; MessagesStorage.getInstance().putUsersAndChats(res.users, null, true, true); -// if (BuildVars.DEBUG_VERSION) { -// for (TLRPC.User user : res.users) { -// FileLog.e("tmessages", "received user " + user.first_name + " " + user.last_name + " " + user.phone); -// } -// } + if (BuildVars.DEBUG_VERSION) { + for (TLRPC.User user : res.users) { + FileLog.e("tmessages", "received user " + user.first_name + " " + user.last_name + " " + user.phone); + } + } for (final TLRPC.User u : res.users) { Utilities.phoneBookQueue.postRunnable(new Runnable() { diff --git a/TMessagesProj/src/main/java/org/telegram/android/Emoji.java b/TMessagesProj/src/main/java/org/telegram/android/Emoji.java index 01df41ab..7ef2edc8 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/Emoji.java +++ b/TMessagesProj/src/main/java/org/telegram/android/Emoji.java @@ -8,6 +8,11 @@ package org.telegram.android; +import java.io.File; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Locale; + import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; @@ -23,14 +28,9 @@ import android.view.View; import android.view.ViewGroup; import android.widget.TextView; -import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.FileLog; import org.telegram.messenger.Utilities; - -import java.io.File; -import java.io.InputStream; -import java.util.HashMap; -import java.util.Locale; +import org.telegram.messenger.ApplicationLoader; public class Emoji { private static HashMap rects = new HashMap<>(); @@ -64,7 +64,8 @@ public class Emoji { new long[] {}, new long[]//189 - {0x00000000D83DDE04L, 0x00000000D83DDE03L, 0x00000000D83DDE00L, 0x00000000D83DDE0AL, 0x000000000000263AL, 0x00000000D83DDE09L, 0x00000000D83DDE0DL, + { + 0x00000000D83DDE04L, 0x00000000D83DDE03L, 0x00000000D83DDE00L, 0x00000000D83DDE0AL, 0x000000000000263AL, 0x00000000D83DDE09L, 0x00000000D83DDE0DL, 0x00000000D83DDE18L, 0x00000000D83DDE1AL, 0x00000000D83DDE17L, 0x00000000D83DDE19L, 0x00000000D83DDE1CL, 0x00000000D83DDE1DL, 0x00000000D83DDE1BL, 0x00000000D83DDE33L, 0x00000000D83DDE01L, 0x00000000D83DDE14L, 0x00000000D83DDE0CL, 0x00000000D83DDE12L, 0x00000000D83DDE1EL, 0x00000000D83DDE23L, 0x00000000D83DDE22L, 0x00000000D83DDE02L, 0x00000000D83DDE2DL, 0x00000000D83DDE2AL, 0x00000000D83DDE25L, 0x00000000D83DDE30L, 0x00000000D83DDE05L, @@ -92,7 +93,8 @@ public class Emoji { 0x00000000D83DDC93L, 0x00000000D83DDC95L, 0x00000000D83DDC96L, 0x00000000D83DDC9EL, 0x00000000D83DDC98L, 0x00000000D83DDC8CL, 0x00000000D83DDC8BL, 0x00000000D83DDC8DL, 0x00000000D83DDC8EL, 0x00000000D83DDC64L, 0x00000000D83DDC65L, 0x00000000D83DDCACL, 0x00000000D83DDC63L, 0x00000000D83DDCADL}, new long[]//116 - {0x00000000D83DDC36L, 0x00000000D83DDC3AL, 0x00000000D83DDC31L, 0x00000000D83DDC2DL, 0x00000000D83DDC39L, 0x00000000D83DDC30L, 0x00000000D83DDC38L, 0x00000000D83DDC2FL, + { + 0x00000000D83DDC36L, 0x00000000D83DDC3AL, 0x00000000D83DDC31L, 0x00000000D83DDC2DL, 0x00000000D83DDC39L, 0x00000000D83DDC30L, 0x00000000D83DDC38L, 0x00000000D83DDC2FL, 0x00000000D83DDC28L, 0x00000000D83DDC3BL, 0x00000000D83DDC37L, 0x00000000D83DDC3DL, 0x00000000D83DDC2EL, 0x00000000D83DDC17L, 0x00000000D83DDC35L, 0x00000000D83DDC12L, 0x00000000D83DDC34L, 0x00000000D83DDC11L, 0x00000000D83DDC18L, 0x00000000D83DDC3CL, 0x00000000D83DDC27L, 0x00000000D83DDC26L, 0x00000000D83DDC24L, 0x00000000D83DDC25L, 0x00000000D83DDC23L, 0x00000000D83DDC14L, 0x00000000D83DDC0DL, 0x00000000D83DDC22L, 0x00000000D83DDC1BL, @@ -110,7 +112,8 @@ public class Emoji { 0x00000000000026C5L, 0x0000000000002601L, 0x00000000000026A1L, 0x0000000000002614L, 0x0000000000002744L, 0x00000000000026C4L, 0x00000000D83CDF00L, 0x00000000D83CDF01L, 0x00000000D83CDF08L, 0x00000000D83CDF0AL}, new long[]//230 - {0x00000000D83CDF8DL, 0x00000000D83DDC9DL, 0x00000000D83CDF8EL, 0x00000000D83CDF92L, 0x00000000D83CDF93L, 0x00000000D83CDF8FL, 0x00000000D83CDF86L, 0x00000000D83CDF87L, + { + 0x00000000D83CDF8DL, 0x00000000D83DDC9DL, 0x00000000D83CDF8EL, 0x00000000D83CDF92L, 0x00000000D83CDF93L, 0x00000000D83CDF8FL, 0x00000000D83CDF86L, 0x00000000D83CDF87L, 0x00000000D83CDF90L, 0x00000000D83CDF91L, 0x00000000D83CDF83L, 0x00000000D83DDC7BL, 0x00000000D83CDF85L, 0x00000000D83CDF84L, 0x00000000D83CDF81L, 0x00000000D83CDF8BL, 0x00000000D83CDF89L, 0x00000000D83CDF8AL, 0x00000000D83CDF88L, 0x00000000D83CDF8CL, 0x00000000D83DDD2EL, 0x00000000D83CDFA5L, 0x00000000D83DDCF7L, 0x00000000D83DDCF9L, 0x00000000D83DDCFCL, 0x00000000D83DDCBFL, 0x00000000D83DDCC0L, 0x00000000D83DDCBDL, 0x00000000D83DDCBEL, @@ -144,7 +147,8 @@ public class Emoji { 0x00000000D83CDF49L, 0x00000000D83CDF53L, 0x00000000D83CDF51L, 0x00000000D83CDF48L, 0x00000000D83CDF4CL, 0x00000000D83CDF50L, 0x00000000D83CDF4DL, 0x00000000D83CDF60L, 0x00000000D83CDF46L, 0x00000000D83CDF45L, 0x00000000D83CDF3DL}, new long[]//101 - {0x00000000D83CDFE0L, 0x00000000D83CDFE1L, 0x00000000D83CDFEBL, 0x00000000D83CDFE2L, 0x00000000D83CDFE3L, 0x00000000D83CDFE5L, 0x00000000D83CDFE6L, 0x00000000D83CDFEAL, + { + 0x00000000D83CDFE0L, 0x00000000D83CDFE1L, 0x00000000D83CDFEBL, 0x00000000D83CDFE2L, 0x00000000D83CDFE3L, 0x00000000D83CDFE5L, 0x00000000D83CDFE6L, 0x00000000D83CDFEAL, 0x00000000D83CDFE9L, 0x00000000D83CDFE8L, 0x00000000D83DDC92L, 0x00000000000026EAL, 0x00000000D83CDFECL, 0x00000000D83CDFE4L, 0x00000000D83CDF07L, 0x00000000D83CDF06L, 0x00000000D83CDFEFL, 0x00000000D83CDFF0L, 0x00000000000026FAL, 0x00000000D83CDFEDL, 0x00000000D83DDDFCL, 0x00000000D83DDDFEL, 0x00000000D83DDDFBL, 0x00000000D83CDF04L, 0x00000000D83CDF05L, 0x00000000D83CDF03L, 0x00000000D83DDDFDL, 0x00000000D83CDF09L, 0x00000000D83CDFA0L, @@ -160,7 +164,8 @@ public class Emoji { 0xD83CDDF0D83CDDF7L, 0xD83CDDE9D83CDDEAL, 0xD83CDDE8D83CDDF3L, 0xD83CDDFAD83CDDF8L, 0xD83CDDEBD83CDDF7L, 0xD83CDDEAD83CDDF8L, 0xD83CDDEED83CDDF9L, 0xD83CDDF7D83CDDFAL, 0xD83CDDECD83CDDE7L}, new long[]//209 - {0x00000000003120E3L, 0x00000000003220E3L, 0x00000000003320E3L, 0x00000000003420E3L, 0x00000000003520E3L, 0x00000000003620E3L, 0x00000000003720E3L, + { + 0x00000000003120E3L, 0x00000000003220E3L, 0x00000000003320E3L, 0x00000000003420E3L, 0x00000000003520E3L, 0x00000000003620E3L, 0x00000000003720E3L, 0x00000000003820E3L, 0x00000000003920E3L, 0x00000000003020E3L, 0x00000000D83DDD1FL, 0x00000000D83DDD22L, 0x00000000002320E3L, 0x00000000D83DDD23L, 0x0000000000002B06L, 0x0000000000002B07L, 0x0000000000002B05L, 0x00000000000027A1L, 0x00000000D83DDD20L, 0x00000000D83DDD21L, 0x00000000D83DDD24L, 0x0000000000002197L, 0x0000000000002196L, 0x0000000000002198L, 0x0000000000002199L, 0x0000000000002194L, 0x0000000000002195L, 0x00000000D83DDD04L, @@ -213,7 +218,7 @@ public class Emoji { for (int j = 1; j < data.length; j++) { for (int i = 0; i < data[j].length; i++) { Rect rect = new Rect((i % cols[j - 1]) * emojiFullSize, (i / cols[j - 1]) * emojiFullSize, (i % cols[j - 1] + 1) * emojiFullSize, (i / cols[j - 1] + 1) * emojiFullSize); - rects.put(data[j][i], new DrawableInfo(rect, (byte)(j - 1))); + rects.put(data[j][i], new DrawableInfo(rect, (byte) (j - 1))); } } placeholderPaint = new Paint(); @@ -290,7 +295,7 @@ public class Emoji { NotificationCenter.getInstance().postNotificationName(NotificationCenter.emojiDidLoaded); } }); - } catch(Throwable x) { + } catch (Throwable x) { FileLog.e("tmessages", "Error loading emoji", x); } } @@ -310,7 +315,7 @@ public class Emoji { public static void invalidateAll(View view) { if (view instanceof ViewGroup) { - ViewGroup g = (ViewGroup)view; + ViewGroup g = (ViewGroup) view; for (int i = 0; i < g.getChildCount(); i++) { invalidateAll(g.getChildAt(i)); } @@ -425,15 +430,17 @@ public class Emoji { return value == 0xd83cdffb || value == 0xd83cdffc || value == 0xd83cdffd || value == 0xd83cdffe || value == 0xd83cdfff; } - public static CharSequence replaceEmoji(CharSequence cs, Paint.FontMetricsInt fontMetrics, int size) { + public static CharSequence replaceEmoji(CharSequence cs, Paint.FontMetricsInt fontMetrics, int size, boolean createNew) { if (cs == null || cs.length() == 0) { return cs; } + //SpannableStringLight.isFieldsAvailable(); + //SpannableStringLight s = new SpannableStringLight(cs.toString()); Spannable s; - if (cs instanceof Spannable) { - s = (Spannable)cs; + if (!createNew && cs instanceof Spannable) { + s = (Spannable) cs; } else { - s = Spannable.Factory.getInstance().newSpannable(cs); + s = Spannable.Factory.getInstance().newSpannable(cs.toString()); } // If showAndroidEmoji is enabled don't replace anything if (android.os.Build.VERSION.SDK_INT >= 19 && ApplicationLoader.SHOW_ANDROID_EMOJI) { @@ -441,6 +448,8 @@ public class Emoji { } long buf = 0; int emojiCount = 0; + //s.setSpansCount(emojiCount); + try { for (int i = 0; i < cs.length(); i++) { char c = cs.charAt(i); @@ -454,12 +463,12 @@ public class Emoji { if (d != null) { boolean nextIsSkinTone = isNextCharIsColor(cs, i); EmojiSpan span = new EmojiSpan(d, DynamicDrawableSpan.ALIGN_BOTTOM, size, fontMetrics); - emojiCount++; if (c >= 0xDDE6 && c <= 0xDDFA) { s.setSpan(span, i - 3, i + (nextIsSkinTone ? 3 : 1), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } else { s.setSpan(span, i - 1, i + (nextIsSkinTone ? 3 : 1), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } + emojiCount++; if (nextIsSkinTone) { i += 2; } @@ -476,8 +485,8 @@ public class Emoji { if (d != null) { boolean nextIsSkinTone = isNextCharIsColor(cs, i); EmojiSpan span = new EmojiSpan(d, DynamicDrawableSpan.ALIGN_BOTTOM, size, fontMetrics); - emojiCount++; s.setSpan(span, i - 1, i + (nextIsSkinTone ? 3 : 1), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + emojiCount++; if (nextIsSkinTone) { i += 2; } @@ -490,8 +499,8 @@ public class Emoji { if (d != null) { boolean nextIsSkinTone = isNextCharIsColor(cs, i); EmojiSpan span = new EmojiSpan(d, DynamicDrawableSpan.ALIGN_BOTTOM, size, fontMetrics); - emojiCount++; s.setSpan(span, i, i + (nextIsSkinTone ? 3 : 1), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + emojiCount++; if (nextIsSkinTone) { i += 2; } diff --git a/TMessagesProj/src/main/java/org/telegram/android/ImageLoader.java b/TMessagesProj/src/main/java/org/telegram/android/ImageLoader.java index 859d3559..a7b1f404 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/ImageLoader.java +++ b/TMessagesProj/src/main/java/org/telegram/android/ImageLoader.java @@ -1298,6 +1298,9 @@ public class ImageLoader { } public Float getFileProgress(String location) { + if (location == null) { + return null; + } return fileProgresses.get(location); } diff --git a/TMessagesProj/src/main/java/org/telegram/android/MediaController.java b/TMessagesProj/src/main/java/org/telegram/android/MediaController.java index e6564fc6..ebd9fc87 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/MediaController.java +++ b/TMessagesProj/src/main/java/org/telegram/android/MediaController.java @@ -46,6 +46,8 @@ import android.os.Vibrator; import android.provider.MediaStore; import android.view.View; +import org.telegram.android.audioinfo.AudioInfo; +import org.telegram.android.query.SharedMediaQuery; import org.telegram.android.video.InputSurface; import org.telegram.android.video.MP4Builder; import org.telegram.android.video.Mp4Movie; @@ -77,25 +79,37 @@ import java.util.concurrent.Semaphore; public class MediaController implements NotificationCenter.NotificationCenterDelegate, SensorEventListener { + public static String iFilter = "*"; + private native int startRecord(String path); + private native int writeFrame(ByteBuffer frame, int len); + private native void stopRecord(); + private native int openOpusFile(String path); + private native int seekOpusFile(float position); + private native int isOpusFile(String path); + private native void closeOpusFile(); + private native void readOpusFile(ByteBuffer buffer, int capacity, int[] args); + private native long getTotalPcmDuration(); public static int[] readArgs = new int[3]; - public static String iFilter = "*"; - public interface FileDownloadProgressListener { void onFailedDownload(String fileName); + void onSuccessDownload(String fileName); + void onProgressDownload(String fileName, float progress); + void onProgressUpload(String fileName, float progress, boolean isEncrypted); + int getObserverTag(); } @@ -129,6 +143,16 @@ public class MediaController implements NotificationCenter.NotificationCenterDel MediaStore.Video.Media.DATE_TAKEN }; + public static class AudioEntry { + public long id; + public String author; + public String title; + public String genre; + public int duration; + public String path; + public MessageObject messageObject; + } + public static class AlbumEntry { public int bucketId; public String bucketName; @@ -223,7 +247,10 @@ public class MediaController implements NotificationCenter.NotificationCenterDel private HashMap downloadQueueKeys = new HashMap<>(); private boolean saveToGallery = true; + private boolean shuffleMusic; + private int repeatMode; + private Runnable refreshGalleryRunnable; public static AlbumEntry allPhotosAlbumEntry; private HashMap>> loadingFileObservers = new HashMap<>(); @@ -251,6 +278,11 @@ public class MediaController implements NotificationCenter.NotificationCenterDel private final Object progressTimerSync = new Object(); private boolean useFrontSpeaker; private int buffersWrited; + private ArrayList playlist = new ArrayList<>(); + private ArrayList shuffledPlaylist = new ArrayList<>(); + private int currentPlaylistNum; + private boolean downloadingCurrentMessage; + private AudioInfo audioInfo; private AudioRecord audioRecorder = null; private TLRPC.TL_audio recordingAudio = null; @@ -273,6 +305,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel private int recordBufferSize; private boolean sendAfterDone; + private Runnable recordStartRunnable; private DispatchQueue recordQueue; private DispatchQueue fileEncodingQueue; private Runnable recordRunnable = new Runnable() { @@ -361,7 +394,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel } } - /*private class GalleryObserverInternal extends ContentObserver { + private class GalleryObserverInternal extends ContentObserver { public GalleryObserverInternal() { super(null); } @@ -369,9 +402,13 @@ public class MediaController implements NotificationCenter.NotificationCenterDel @Override public void onChange(boolean selfChange) { super.onChange(selfChange); - AndroidUtilities.runOnUIThread(new Runnable() { + if (refreshGalleryRunnable != null) { + AndroidUtilities.cancelRunOnUIThread(refreshGalleryRunnable); + } + AndroidUtilities.runOnUIThread(refreshGalleryRunnable = new Runnable() { @Override public void run() { + refreshGalleryRunnable = null; loadGalleryPhotosAlbums(0); } }, 2000); @@ -386,14 +423,18 @@ public class MediaController implements NotificationCenter.NotificationCenterDel @Override public void onChange(boolean selfChange) { super.onChange(selfChange); - AndroidUtilities.runOnUIThread(new Runnable() { + if (refreshGalleryRunnable != null) { + AndroidUtilities.cancelRunOnUIThread(refreshGalleryRunnable); + } + AndroidUtilities.runOnUIThread(refreshGalleryRunnable = new Runnable() { @Override public void run() { + refreshGalleryRunnable = null; loadGalleryPhotosAlbums(0); } }, 2000); } - }*/ + } private ExternalObserver externalObserver = null; private InternalObserver internalObserver = null; @@ -404,6 +445,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel private ArrayList lastSecretChatVisibleMessages = null; private int startObserverToken = 0; private StopMediaObserverRunnable stopMediaObserverRunnable = null; + private final class StopMediaObserverRunnable implements Runnable { public int currentObserverToken = 0; @@ -429,9 +471,11 @@ public class MediaController implements NotificationCenter.NotificationCenterDel } } } + private String[] mediaProjections = null; private static volatile MediaController Instance = null; + public static MediaController getInstance() { MediaController localInstance = Instance; if (localInstance == null) { @@ -486,6 +530,8 @@ public class MediaController implements NotificationCenter.NotificationCenterDel wifiDownloadMask = preferences.getInt("wifiDownloadMask", AUTODOWNLOAD_MASK_PHOTO | AUTODOWNLOAD_MASK_AUDIO); roamingDownloadMask = preferences.getInt("roamingDownloadMask", 0); saveToGallery = preferences.getBoolean("save_gallery", false); + shuffleMusic = preferences.getBoolean("shuffleMusic", false); + repeatMode = preferences.getInt("repeatMode", 0); NotificationCenter.getInstance().addObserver(this, NotificationCenter.FileDidFailedLoad); NotificationCenter.getInstance().addObserver(this, NotificationCenter.FileDidLoaded); @@ -493,6 +539,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel NotificationCenter.getInstance().addObserver(this, NotificationCenter.FileUploadProgressChanged); NotificationCenter.getInstance().addObserver(this, NotificationCenter.messagesDeleted); NotificationCenter.getInstance().addObserver(this, NotificationCenter.removeAllMessagesFromDialog); + NotificationCenter.getInstance().addObserver(this, NotificationCenter.musicDidLoaded); BroadcastReceiver networkStateReceiver = new BroadcastReceiver() { @Override @@ -508,7 +555,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel } if (Build.VERSION.SDK_INT >= 16) { - mediaProjections = new String[] { + mediaProjections = new String[]{ MediaStore.Images.ImageColumns.DATA, MediaStore.Images.ImageColumns.DISPLAY_NAME, MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME, @@ -518,7 +565,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel MediaStore.Images.ImageColumns.HEIGHT }; } else { - mediaProjections = new String[] { + mediaProjections = new String[]{ MediaStore.Images.ImageColumns.DATA, MediaStore.Images.ImageColumns.DISPLAY_NAME, MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME, @@ -527,7 +574,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel }; } - /*try { + try { ApplicationLoader.applicationContext.getContentResolver().registerContentObserver(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, false, new GalleryObserverExternal()); } catch (Exception e) { FileLog.e("tmessages", e); @@ -536,7 +583,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel ApplicationLoader.applicationContext.getContentResolver().registerContentObserver(MediaStore.Images.Media.INTERNAL_CONTENT_URI, false, new GalleryObserverInternal()); } catch (Exception e) { FileLog.e("tmessages", e); - }*/ + } } private void startProgressTimer() { @@ -608,12 +655,13 @@ public class MediaController implements NotificationCenter.NotificationCenterDel } public void cleanup() { - clenupPlayer(false); + clenupPlayer(false, true); if (currentGifDrawable != null) { currentGifDrawable.recycle(); currentGifDrawable = null; } currentMediaCell = null; + audioInfo = null; currentGifMessageObject = null; photoDownloadQueue.clear(); audioDownloadQueue.clear(); @@ -621,6 +669,8 @@ public class MediaController implements NotificationCenter.NotificationCenterDel videoDownloadQueue.clear(); downloadQueueKeys.clear(); videoConvertQueue.clear(); + playlist.clear(); + shuffledPlaylist.clear(); typingTimes.clear(); cancelVideoConvert(null); } @@ -654,7 +704,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel } } else { for (DownloadObject downloadObject : photoDownloadQueue) { - FileLoader.getInstance().cancelLoadFile((TLRPC.PhotoSize)downloadObject.object); + FileLoader.getInstance().cancelLoadFile((TLRPC.PhotoSize) downloadObject.object); } photoDownloadQueue.clear(); } @@ -664,7 +714,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel } } else { for (DownloadObject downloadObject : audioDownloadQueue) { - FileLoader.getInstance().cancelLoadFile((TLRPC.Audio)downloadObject.object); + FileLoader.getInstance().cancelLoadFile((TLRPC.Audio) downloadObject.object); } audioDownloadQueue.clear(); } @@ -674,7 +724,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel } } else { for (DownloadObject downloadObject : documentDownloadQueue) { - FileLoader.getInstance().cancelLoadFile((TLRPC.Document)downloadObject.object); + FileLoader.getInstance().cancelLoadFile((TLRPC.Document) downloadObject.object); } documentDownloadQueue.clear(); } @@ -684,7 +734,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel } } else { for (DownloadObject downloadObject : videoDownloadQueue) { - FileLoader.getInstance().cancelLoadFile((TLRPC.Video)downloadObject.object); + FileLoader.getInstance().cancelLoadFile((TLRPC.Video) downloadObject.object); } videoDownloadQueue.clear(); } @@ -715,7 +765,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel private int getCurrentDownloadMask() { if (ConnectionsManager.isConnectedToWiFi()) { return wifiDownloadMask; - } else if(ConnectionsManager.isRoaming()) { + } else if (ConnectionsManager.isRoaming()) { return roamingDownloadMask; } else { return mobileDataDownloadMask; @@ -744,13 +794,13 @@ public class MediaController implements NotificationCenter.NotificationCenterDel boolean added = true; if (downloadObject.object instanceof TLRPC.Audio) { - FileLoader.getInstance().loadFile((TLRPC.Audio)downloadObject.object, false); + FileLoader.getInstance().loadFile((TLRPC.Audio) downloadObject.object, false); } else if (downloadObject.object instanceof TLRPC.PhotoSize) { - FileLoader.getInstance().loadFile((TLRPC.PhotoSize)downloadObject.object, null, false); + FileLoader.getInstance().loadFile((TLRPC.PhotoSize) downloadObject.object, null, false); } else if (downloadObject.object instanceof TLRPC.Video) { - FileLoader.getInstance().loadFile((TLRPC.Video)downloadObject.object, false); + FileLoader.getInstance().loadFile((TLRPC.Video) downloadObject.object, false); } else if (downloadObject.object instanceof TLRPC.Document) { - FileLoader.getInstance().loadFile((TLRPC.Document)downloadObject.object, false, false); + FileLoader.getInstance().loadFile((TLRPC.Document) downloadObject.object, false, false); } else { added = false; } @@ -988,7 +1038,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel public void didReceivedNotification(int id, Object... args) { if (id == NotificationCenter.FileDidFailedLoad) { listenerInProgress = true; - String fileName = (String)args[0]; + String fileName = (String) args[0]; ArrayList> arrayList = loadingFileObservers.get(fileName); if (arrayList != null) { for (WeakReference reference : arrayList) { @@ -1001,10 +1051,16 @@ public class MediaController implements NotificationCenter.NotificationCenterDel } listenerInProgress = false; processLaterArrays(); - checkDownloadFinished(fileName, (Integer)args[1]); + checkDownloadFinished(fileName, (Integer) args[1]); } else if (id == NotificationCenter.FileDidLoaded) { listenerInProgress = true; - String fileName = (String)args[0]; + String fileName = (String) args[0]; + if (downloadingCurrentMessage && playingMessageObject != null) { + String file = FileLoader.getAttachFileName(playingMessageObject.messageOwner.media.document); + if (file.equals(fileName)) { + playAudio(playingMessageObject); + } + } ArrayList> arrayList = loadingFileObservers.get(fileName); if (arrayList != null) { for (WeakReference reference : arrayList) { @@ -1020,10 +1076,10 @@ public class MediaController implements NotificationCenter.NotificationCenterDel checkDownloadFinished(fileName, 0); } else if (id == NotificationCenter.FileLoadProgressChanged) { listenerInProgress = true; - String fileName = (String)args[0]; + String fileName = (String) args[0]; ArrayList> arrayList = loadingFileObservers.get(fileName); if (arrayList != null) { - Float progress = (Float)args[1]; + Float progress = (Float) args[1]; for (WeakReference reference : arrayList) { if (reference.get() != null) { reference.get().onProgressDownload(fileName, progress); @@ -1034,11 +1090,11 @@ public class MediaController implements NotificationCenter.NotificationCenterDel processLaterArrays(); } else if (id == NotificationCenter.FileUploadProgressChanged) { listenerInProgress = true; - String fileName = (String)args[0]; + String fileName = (String) args[0]; ArrayList> arrayList = loadingFileObservers.get(fileName); if (arrayList != null) { - Float progress = (Float)args[1]; - Boolean enc = (Boolean)args[2]; + Float progress = (Float) args[1]; + Boolean enc = (Boolean) args[2]; for (WeakReference reference : arrayList) { if (reference.get() != null) { reference.get().onProgressUpload(fileName, progress, enc); @@ -1072,15 +1128,27 @@ public class MediaController implements NotificationCenter.NotificationCenterDel } } else if (id == NotificationCenter.messagesDeleted) { if (playingMessageObject != null) { - ArrayList markAsDeletedMessages = (ArrayList)args[0]; + ArrayList markAsDeletedMessages = (ArrayList) args[0]; if (markAsDeletedMessages.contains(playingMessageObject.getId())) { - clenupPlayer(false); + clenupPlayer(false, true); } } } else if (id == NotificationCenter.removeAllMessagesFromDialog) { - long did = (Long)args[0]; + long did = (Long) args[0]; if (playingMessageObject != null && playingMessageObject.getDialogId() == did) { - clenupPlayer(false); + clenupPlayer(false, true); + } + } else if (id == NotificationCenter.musicDidLoaded) { + long did = (Long) args[0]; + if (playingMessageObject != null && playingMessageObject.isMusic() && playingMessageObject.getDialogId() == did) { + ArrayList arrayList = (ArrayList) args[1]; + playlist.addAll(0, arrayList); + if (shuffleMusic) { + buildShuffledPlayList(); + currentPlaylistNum = 0; + } else { + currentPlaylistNum += arrayList.size(); + } } } } @@ -1176,7 +1244,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel audioTrackPlayer.setNotificationMarkerPosition(1); } if (finalBuffersWrited == 1) { - clenupPlayer(true); + clenupPlayer(true, true); } } } @@ -1223,7 +1291,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel NotificationCenter.getInstance().postNotificationName(NotificationCenter.audioRouteChanged, useFrontSpeaker); MessageObject currentMessageObject = playingMessageObject; float progress = playingMessageObject.audioProgress; - clenupPlayer(false); + clenupPlayer(false, true); currentMessageObject.audioProgress = progress; playAudio(currentMessageObject); ignoreProximity = false; @@ -1268,9 +1336,9 @@ public class MediaController implements NotificationCenter.NotificationCenterDel } } - private void clenupPlayer(boolean notify) { + public void clenupPlayer(boolean notify, boolean stopService) { stopProximitySensor(); - if (audioPlayer != null || audioTrackPlayer != null) { + if (playingMessageObject != null) { if (audioPlayer != null) { try { audioPlayer.stop(); @@ -1303,12 +1371,20 @@ public class MediaController implements NotificationCenter.NotificationCenterDel lastProgress = 0; buffersWrited = 0; isPaused = false; + if (downloadingCurrentMessage) { + FileLoader.getInstance().cancelLoadFile(playingMessageObject.messageOwner.media.document); + } MessageObject lastFile = playingMessageObject; playingMessageObject.audioProgress = 0.0f; playingMessageObject.audioProgressSec = 0; playingMessageObject = null; + downloadingCurrentMessage = false; if (notify) { - NotificationCenter.getInstance().postNotificationName(NotificationCenter.audioDidReset, lastFile.getId()); + NotificationCenter.getInstance().postNotificationName(NotificationCenter.audioDidReset, lastFile.getId(), stopService); + } + if (stopService) { + Intent intent = new Intent(ApplicationLoader.applicationContext, MusicPlayerService.class); + ApplicationLoader.applicationContext.stopService(intent); } } } @@ -1366,6 +1442,151 @@ public class MediaController implements NotificationCenter.NotificationCenterDel return true; } + public MessageObject getPlayingMessageObject() { + return playingMessageObject; + } + + private void buildShuffledPlayList() { + ArrayList all = new ArrayList<>(playlist); + shuffledPlaylist.clear(); + + MessageObject messageObject = playlist.get(currentPlaylistNum); + all.remove(currentPlaylistNum); + shuffledPlaylist.add(messageObject); + + int count = all.size(); + for (int a = 0; a < count; a++) { + int index = Utilities.random.nextInt(all.size()); + shuffledPlaylist.add(all.get(index)); + all.remove(index); + } + } + + public boolean setPlaylist(ArrayList messageObjects, MessageObject current) { + if (playingMessageObject == current) { + return playAudio(current); + } + playlist.clear(); + for (int a = messageObjects.size() - 1; a >= 0; a--) { + MessageObject messageObject = messageObjects.get(a); + if (messageObject.isMusic()) { + playlist.add(messageObject); + } + } + currentPlaylistNum = playlist.indexOf(current); + if (currentPlaylistNum == -1) { + playlist.clear(); + shuffledPlaylist.clear(); + return false; + } + if (shuffleMusic) { + buildShuffledPlayList(); + currentPlaylistNum = 0; + } + SharedMediaQuery.loadMusic(current.getDialogId(), playlist.get(0).getId()); + return playAudio(current); + } + + public void playNextMessage() { + playNextMessage(false); + } + + private void playNextMessage(boolean byStop) { + ArrayList currentPlayList = shuffleMusic ? shuffledPlaylist : playlist; + + if (byStop && repeatMode == 2) { + clenupPlayer(false, false); + playAudio(currentPlayList.get(currentPlaylistNum)); + return; + } + currentPlaylistNum++; + if (currentPlaylistNum >= currentPlayList.size()) { + currentPlaylistNum = 0; + if (byStop && repeatMode == 0) { + stopProximitySensor(); + if (audioPlayer != null || audioTrackPlayer != null) { + if (audioPlayer != null) { + try { + audioPlayer.stop(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + try { + audioPlayer.release(); + audioPlayer = null; + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } else if (audioTrackPlayer != null) { + synchronized (playerObjectSync) { + try { + audioTrackPlayer.pause(); + audioTrackPlayer.flush(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + try { + audioTrackPlayer.release(); + audioTrackPlayer = null; + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + } + stopProgressTimer(); + lastProgress = 0; + buffersWrited = 0; + isPaused = true; + playingMessageObject.audioProgress = 0.0f; + playingMessageObject.audioProgressSec = 0; + NotificationCenter.getInstance().postNotificationName(NotificationCenter.audioPlayStateChanged, playingMessageObject.getId()); + } + return; + } + } + if (currentPlaylistNum < 0 || currentPlaylistNum >= currentPlayList.size()) { + return; + } + playAudio(currentPlayList.get(currentPlaylistNum)); + } + + public void playPreviousMessage() { + ArrayList currentPlayList = shuffleMusic ? shuffledPlaylist : playlist; + + currentPlaylistNum--; + if (currentPlaylistNum < 0) { + currentPlaylistNum = currentPlayList.size() - 1; + } + if (currentPlaylistNum < 0 || currentPlaylistNum >= currentPlayList.size()) { + return; + } + playAudio(currentPlayList.get(currentPlaylistNum)); + } + + private void checkIsNextMusicFileDownloaded() { + ArrayList currentPlayList = shuffleMusic ? shuffledPlaylist : playlist; + if (currentPlayList == null || currentPlayList.size() < 2) { + return; + } + int nextIndex = currentPlaylistNum + 1; + if (nextIndex >= currentPlayList.size()) { + nextIndex = 0; + } + MessageObject nextAudio = currentPlayList.get(nextIndex); + File file = null; + if (nextAudio.messageOwner.attachPath != null && nextAudio.messageOwner.attachPath.length() > 0) { + file = new File(nextAudio.messageOwner.attachPath); + if (!file.exists()) { + file = null; + } + } + final File cacheFile = file != null ? file : FileLoader.getPathToMessage(nextAudio.messageOwner); + boolean exist = cacheFile != null && cacheFile.exists(); + if (cacheFile != null && cacheFile != file && !cacheFile.exists() && nextAudio.isMusic()) { + FileLoader.getInstance().loadFile(nextAudio.messageOwner.media.document, true, false); + } + } + public boolean playAudio(MessageObject messageObject) { if (messageObject == null) { return false; @@ -1376,8 +1597,10 @@ public class MediaController implements NotificationCenter.NotificationCenterDel } return true; } - NotificationCenter.getInstance().postNotificationName(NotificationCenter.audioDidStarted, messageObject); - clenupPlayer(true); + if (audioTrackPlayer != null) { + MusicPlayerService.setIgnoreAudioFocus(); + } + clenupPlayer(true, false); File file = null; if (messageObject.messageOwner.attachPath != null && messageObject.messageOwner.attachPath.length() > 0) { file = new File(messageObject.messageOwner.attachPath); @@ -1386,8 +1609,33 @@ public class MediaController implements NotificationCenter.NotificationCenterDel } } final File cacheFile = file != null ? file : FileLoader.getPathToMessage(messageObject.messageOwner); + if (cacheFile != null && cacheFile != file && !cacheFile.exists() && messageObject.isMusic()) { + FileLoader.getInstance().loadFile(messageObject.messageOwner.media.document, true, false); + downloadingCurrentMessage = true; + isPaused = false; + lastProgress = 0; + lastPlayPcm = 0; + audioInfo = null; + playingMessageObject = messageObject; + if (playingMessageObject.messageOwner.media.document != null) { + Intent intent = new Intent(ApplicationLoader.applicationContext, MusicPlayerService.class); + ApplicationLoader.applicationContext.startService(intent); + } else { + Intent intent = new Intent(ApplicationLoader.applicationContext, MusicPlayerService.class); + ApplicationLoader.applicationContext.stopService(intent); + } + NotificationCenter.getInstance().postNotificationName(NotificationCenter.audioPlayStateChanged, playingMessageObject.getId()); + return true; + } else { + downloadingCurrentMessage = false; + } + if (messageObject.isMusic()) { + checkIsNextMusicFileDownloaded(); + } if (isOpusFile(cacheFile.getAbsolutePath()) == 1) { + playlist.clear(); + shuffledPlaylist.clear(); synchronized (playerObjectSync) { try { ignoreFirstProgress = 3; @@ -1412,7 +1660,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel audioTrackPlayer.setPlaybackPositionUpdateListener(new AudioTrack.OnPlaybackPositionUpdateListener() { @Override public void onMarkerReached(AudioTrack audioTrack) { - clenupPlayer(true); + clenupPlayer(true, true); } @Override @@ -1422,7 +1670,9 @@ public class MediaController implements NotificationCenter.NotificationCenterDel }); audioTrackPlayer.play(); startProgressTimer(); - startProximitySensor(); + if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaAudio) { + startProximitySensor(); + } } catch (Exception e) { FileLog.e("tmessages", e); if (audioTrackPlayer != null) { @@ -1430,6 +1680,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel audioTrackPlayer = null; isPaused = false; playingMessageObject = null; + downloadingCurrentMessage = false; } return false; } @@ -1442,13 +1693,28 @@ public class MediaController implements NotificationCenter.NotificationCenterDel audioPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mediaPlayer) { - clenupPlayer(true); + if (!playlist.isEmpty() && playlist.size() > 1) { + playNextMessage(true); + } else { + clenupPlayer(true, true); + } } }); audioPlayer.prepare(); audioPlayer.start(); startProgressTimer(); - startProximitySensor(); + if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaAudio) { + audioInfo = null; + playlist.clear(); + shuffledPlaylist.clear(); + startProximitySensor(); + } else { + try { + audioInfo = AudioInfo.getAudioInfo(cacheFile); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } } catch (Exception e) { FileLog.e("tmessages", e); if (audioPlayer != null) { @@ -1456,6 +1722,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel audioPlayer = null; isPaused = false; playingMessageObject = null; + downloadingCurrentMessage = false; } return false; } @@ -1465,6 +1732,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel lastProgress = 0; lastPlayPcm = 0; playingMessageObject = messageObject; + NotificationCenter.getInstance().postNotificationName(NotificationCenter.audioDidStarted, messageObject); if (audioPlayer != null) { try { @@ -1486,7 +1754,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel public void run() { try { if (playingMessageObject != null && playingMessageObject.audioProgress != 0) { - lastPlayPcm = (long)(currentTotalPcmDuration * playingMessageObject.audioProgress); + lastPlayPcm = (long) (currentTotalPcmDuration * playingMessageObject.audioProgress); seekOpusFile(playingMessageObject.audioProgress); } } catch (Exception e) { @@ -1502,6 +1770,14 @@ public class MediaController implements NotificationCenter.NotificationCenterDel }); } + if (playingMessageObject.messageOwner.media.document != null) { + Intent intent = new Intent(ApplicationLoader.applicationContext, MusicPlayerService.class); + ApplicationLoader.applicationContext.startService(intent); + } else { + Intent intent = new Intent(ApplicationLoader.applicationContext, MusicPlayerService.class); + ApplicationLoader.applicationContext.stopService(intent); + } + return true; } @@ -1535,7 +1811,55 @@ public class MediaController implements NotificationCenter.NotificationCenterDel } stopProgressTimer(); playingMessageObject = null; + downloadingCurrentMessage = false; isPaused = false; + + Intent intent = new Intent(ApplicationLoader.applicationContext, MusicPlayerService.class); + ApplicationLoader.applicationContext.stopService(intent); + } + + public AudioInfo getAudioInfo() { + return audioInfo; + } + + public boolean isShuffleMusic() { + return shuffleMusic; + } + + public int getRepeatMode() { + return repeatMode; + } + + public void toggleShuffleMusic() { + shuffleMusic = !shuffleMusic; + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + editor.putBoolean("shuffleMusic", shuffleMusic); + editor.commit(); + if (shuffleMusic) { + buildShuffledPlayList(); + currentPlaylistNum = 0; + } else { + if (playingMessageObject != null) { + currentPlaylistNum = playlist.indexOf(playingMessageObject); + if (currentPlaylistNum == -1) { + playlist.clear(); + shuffledPlaylist.clear(); + clenupPlayer(true, true); + } + } + } + } + + public void toggleRepeatMode() { + repeatMode++; + if (repeatMode > 2) { + repeatMode = 0; + } + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + editor.putInt("repeatMode", repeatMode); + editor.commit(); } public boolean pauseAudio(MessageObject messageObject) { @@ -1551,6 +1875,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel audioTrackPlayer.pause(); } isPaused = true; + NotificationCenter.getInstance().postNotificationName(NotificationCenter.audioPlayStateChanged, playingMessageObject.getId()); } catch (Exception e) { FileLog.e("tmessages", e); isPaused = false; @@ -1563,7 +1888,9 @@ public class MediaController implements NotificationCenter.NotificationCenterDel if (audioTrackPlayer == null && audioPlayer == null || messageObject == null || playingMessageObject == null || playingMessageObject != null && playingMessageObject.getId() != messageObject.getId()) { return false; } - startProximitySensor(); + if (messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaAudio) { + startProximitySensor(); + } try { startProgressTimer(); if (audioPlayer != null) { @@ -1573,6 +1900,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel checkPlayerQueue(); } isPaused = false; + NotificationCenter.getInstance().postNotificationName(NotificationCenter.audioPlayStateChanged, playingMessageObject.getId()); } catch (Exception e) { FileLog.e("tmessages", e); return false; @@ -1581,15 +1909,23 @@ public class MediaController implements NotificationCenter.NotificationCenterDel } public boolean isPlayingAudio(MessageObject messageObject) { - return !(audioTrackPlayer == null && audioPlayer == null || messageObject == null || playingMessageObject == null || playingMessageObject != null && playingMessageObject.getId() != messageObject.getId()); + return !(audioTrackPlayer == null && audioPlayer == null || messageObject == null || playingMessageObject == null || playingMessageObject != null && (playingMessageObject.getId() != messageObject.getId() || downloadingCurrentMessage)); } public boolean isAudioPaused() { - return isPaused; + return isPaused || downloadingCurrentMessage; + } + + public boolean isDownloadingCurrentMessage() { + return downloadingCurrentMessage; } public void startRecording(final long dialog_id, final MessageObject reply_to_msg) { - clenupPlayer(true); + boolean paused = false; + if (playingMessageObject != null && isPlayingAudio(playingMessageObject) && !isAudioPaused()) { + paused = true; + pauseAudio(playingMessageObject); + } try { Vibrator v = (Vibrator) ApplicationLoader.applicationContext.getSystemService(Context.VIBRATOR_SERVICE); @@ -1598,13 +1934,14 @@ public class MediaController implements NotificationCenter.NotificationCenterDel FileLog.e("tmessages", e); } - recordQueue.postRunnable(new Runnable() { + recordQueue.postRunnable(recordStartRunnable = new Runnable() { @Override public void run() { if (audioRecorder != null) { AndroidUtilities.runOnUIThread(new Runnable() { @Override public void run() { + recordStartRunnable = null; NotificationCenter.getInstance().postNotificationName(NotificationCenter.recordStartError); } }); @@ -1626,6 +1963,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel AndroidUtilities.runOnUIThread(new Runnable() { @Override public void run() { + recordStartRunnable = null; NotificationCenter.getInstance().postNotificationName(NotificationCenter.recordStartError); } }); @@ -1655,6 +1993,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel AndroidUtilities.runOnUIThread(new Runnable() { @Override public void run() { + recordStartRunnable = null; NotificationCenter.getInstance().postNotificationName(NotificationCenter.recordStartError); } }); @@ -1665,11 +2004,12 @@ public class MediaController implements NotificationCenter.NotificationCenterDel AndroidUtilities.runOnUIThread(new Runnable() { @Override public void run() { + recordStartRunnable = null; NotificationCenter.getInstance().postNotificationName(NotificationCenter.recordStarted); } }); } - }); + }, paused ? 500 : 0); } private void stopRecordingInternal(final boolean send) { @@ -1711,6 +2051,9 @@ public class MediaController implements NotificationCenter.NotificationCenterDel } public void stopRecording(final boolean send) { + if (recordStartRunnable != null) { + recordQueue.cancelRunnable(recordStartRunnable); + } recordQueue.postRunnable(new Runnable() { @Override public void run() { @@ -1792,10 +2135,15 @@ public class MediaController implements NotificationCenter.NotificationCenterDel destFile = AndroidUtilities.generateVideoPath(); } else if (type == 2) { File f = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); + f.mkdir(); + destFile = new File(f, name); + } else if (type == 3) { + File f = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC); + f.mkdirs(); destFile = new File(f, name); } - if(!destFile.exists()) { + if (!destFile.exists()) { destFile.createNewFile(); } FileChannel source = null; @@ -1837,7 +2185,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel } } - if (result && (type == 0 || type == 1)) { + if (result && (type == 0 || type == 1 || type == 3)) { AndroidUtilities.addMediaToGallery(Uri.fromFile(destFile)); } } catch (Exception e) { @@ -1942,7 +2290,7 @@ public class MediaController implements NotificationCenter.NotificationCenterDel String str = new String(header); if (str != null) { str = str.toLowerCase(); - if (str.startsWith("riff") && str.endsWith("webp")){ + if (str.startsWith("riff") && str.endsWith("webp")) { return true; } } diff --git a/TMessagesProj/src/main/java/org/telegram/android/MessageObject.java b/TMessagesProj/src/main/java/org/telegram/android/MessageObject.java index e1ae5e25..4a413965 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/MessageObject.java +++ b/TMessagesProj/src/main/java/org/telegram/android/MessageObject.java @@ -338,6 +338,8 @@ public class MessageObject { } else { messageText = LocaleController.getString("AttachSticker", R.string.AttachSticker); } + } else if (isMusic()) { + messageText = LocaleController.getString("AttachMusic", R.string.AttachMusic); } else { String name = FileLoader.getDocumentFileName(message.media.document); if (name != null && name.length() > 0) { @@ -352,7 +354,9 @@ public class MessageObject { } else { messageText = message.message; } - messageText = Emoji.replaceEmoji(messageText, textPaint.getFontMetricsInt(), AndroidUtilities.dp(20)); + if (generateLayout) { + messageText = Emoji.replaceEmoji(messageText, textPaint.getFontMetricsInt(), AndroidUtilities.dp(20), false); + } if (message instanceof TLRPC.TL_message || message instanceof TLRPC.TL_messageForwarded_old2) { if (isMediaEmpty()) { @@ -380,6 +384,9 @@ public class MessageObject { type = 8; } else if (message.media.document.mime_type.equals("image/webp") && isSticker()) { type = 13; + } else if (isMusic()) { + type = 14; + contentType = 8; } else { type = 9; } @@ -625,7 +632,7 @@ public class MessageObject { return; } if (messageOwner.media != null && messageOwner.media.caption != null && messageOwner.media.caption.length() > 0) { - caption = Emoji.replaceEmoji(messageOwner.media.caption, textPaint.getFontMetricsInt(), AndroidUtilities.dp(20)); + caption = Emoji.replaceEmoji(messageOwner.media.caption, textPaint.getFontMetricsInt(), AndroidUtilities.dp(20), false); if (containsUrls(caption)) { try { Linkify.addLinks((Spannable) caption, Linkify.WEB_URLS); @@ -975,6 +982,17 @@ public class MessageObject { return false; } + public static boolean isMusicMessage(TLRPC.Message message) { + if (message.media != null && message.media.document != null) { + for (TLRPC.DocumentAttribute attribute : message.media.document.attributes) { + if (attribute instanceof TLRPC.TL_documentAttributeAudio) { + return true; + } + } + } + return false; + } + public static TLRPC.InputStickerSet getInputStickerSet(TLRPC.Message message) { if (message.media != null && message.media.document != null) { for (TLRPC.DocumentAttribute attribute : message.media.document.attributes) { @@ -1011,6 +1029,8 @@ public class MessageObject { return AndroidUtilities.dp(100); } else if (type == 4) { return AndroidUtilities.dp(114); + } else if (type == 14) { + return AndroidUtilities.dp(78); } else if (type == 13) { float maxHeight = AndroidUtilities.displaySize.y * 0.4f; float maxWidth; @@ -1086,6 +1106,39 @@ public class MessageObject { return isStickerMessage(messageOwner); } + public boolean isMusic() { + return isMusicMessage(messageOwner); + } + + public String getMusicTitle() { + for (TLRPC.DocumentAttribute attribute : messageOwner.media.document.attributes) { + if (attribute instanceof TLRPC.TL_documentAttributeAudio) { + String title = attribute.title; + if (title == null || title.length() == 0) { + title = FileLoader.getDocumentFileName(messageOwner.media.document); + if (title == null || title.length() == 0) { + title = LocaleController.getString("AudioUnknownTitle", R.string.AudioUnknownTitle); + } + } + return title; + } + } + return ""; + } + + public String getMusicAuthor() { + for (TLRPC.DocumentAttribute attribute : messageOwner.media.document.attributes) { + if (attribute instanceof TLRPC.TL_documentAttributeAudio) { + String performer = attribute.performer; + if (performer == null || performer.length() == 0) { + performer = LocaleController.getString("AudioUnknownArtist", R.string.AudioUnknownArtist); + } + return performer; + } + } + return ""; + } + public TLRPC.InputStickerSet getInputStickerSet() { return getInputStickerSet(messageOwner); } diff --git a/TMessagesProj/src/main/java/org/telegram/android/MessagesController.java b/TMessagesProj/src/main/java/org/telegram/android/MessagesController.java index 318b83b4..49ed7360 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/MessagesController.java +++ b/TMessagesProj/src/main/java/org/telegram/android/MessagesController.java @@ -3902,7 +3902,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter } if (!markAsReadMessagesInbox.isEmpty() || !markAsReadMessagesOutbox.isEmpty() || !markAsReadEncrypted.isEmpty()) { if (!markAsReadMessagesInbox.isEmpty() || !markAsReadMessagesOutbox.isEmpty()) { - MessagesStorage.getInstance().updateDialogsWithReadedMessages(markAsReadMessagesInbox, true); + MessagesStorage.getInstance().updateDialogsWithReadMessages(markAsReadMessagesInbox, true); } MessagesStorage.getInstance().markMessagesAsRead(markAsReadMessagesInbox, markAsReadMessagesOutbox, markAsReadEncrypted, true); } diff --git a/TMessagesProj/src/main/java/org/telegram/android/MessagesStorage.java b/TMessagesProj/src/main/java/org/telegram/android/MessagesStorage.java index b5030041..ad37757f 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/MessagesStorage.java +++ b/TMessagesProj/src/main/java/org/telegram/android/MessagesStorage.java @@ -1149,7 +1149,7 @@ public class MessagesStorage { }); } - private void updateDialogsWithReadedMessagesInternal(final ArrayList messages, final HashMap inbox) { + private void updateDialogsWithReadMessagesInternal(final ArrayList messages, final HashMap inbox) { try { HashMap dialogsToUpdate = new HashMap<>(); StringBuilder dialogsToReload = new StringBuilder(); @@ -1184,14 +1184,13 @@ public class MessagesStorage { SQLiteCursor cursor = database.queryFinalized(String.format(Locale.US, "SELECT COUNT(mid) FROM messages WHERE uid = %d AND mid <= %d AND read_state IN(0,2) AND out = 0", entry.getKey(), entry.getValue())); if (cursor.next()) { int count = cursor.intValue(0); - if (count == 0) { - continue; + if (count != 0) { + dialogsToUpdate.put((long) entry.getKey(), count); + if (dialogsToReload.length() != 0) { + dialogsToReload.append(","); + } + dialogsToReload.append(entry.getKey()); } - dialogsToUpdate.put((long) entry.getKey(), count); - if (dialogsToReload.length() != 0) { - dialogsToReload.append(","); - } - dialogsToReload.append(entry.getKey()); } cursor.dispose(); } @@ -1231,7 +1230,7 @@ public class MessagesStorage { } } - public void updateDialogsWithReadedMessages(final HashMap inbox, boolean useQueue) { + public void updateDialogsWithReadMessages(final HashMap inbox, boolean useQueue) { if (inbox.isEmpty()) { return; } @@ -1239,11 +1238,11 @@ public class MessagesStorage { storageQueue.postRunnable(new Runnable() { @Override public void run() { - updateDialogsWithReadedMessagesInternal(null, inbox); + updateDialogsWithReadMessagesInternal(null, inbox); } }); } else { - updateDialogsWithReadedMessagesInternal(null, inbox); + updateDialogsWithReadMessagesInternal(null, inbox); } } @@ -3473,7 +3472,7 @@ public class MessagesStorage { NotificationCenter.getInstance().postNotificationName(NotificationCenter.messagesDeleted, mids); } }); - MessagesStorage.getInstance().updateDialogsWithReadedMessagesInternal(mids, null); + MessagesStorage.getInstance().updateDialogsWithReadMessagesInternal(mids, null); MessagesStorage.getInstance().markMessagesAsDeletedInternal(mids); MessagesStorage.getInstance().updateDialogsWithDeletedMessagesInternal(mids); } diff --git a/TMessagesProj/src/main/java/org/telegram/android/NotificationCenter.java b/TMessagesProj/src/main/java/org/telegram/android/NotificationCenter.java index ffaf321a..474d0c77 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/NotificationCenter.java +++ b/TMessagesProj/src/main/java/org/telegram/android/NotificationCenter.java @@ -64,6 +64,7 @@ public class NotificationCenter { public static final int botInfoDidLoaded = totalEvents++; public static final int botKeyboardDidLoaded = totalEvents++; public static final int chatSearchResultsAvailable = totalEvents++; + public static final int musicDidLoaded = totalEvents++; public static final int httpFileDidLoaded = totalEvents++; public static final int httpFileDidFailedLoad = totalEvents++; @@ -89,6 +90,7 @@ public class NotificationCenter { public static final int audioProgressDidChanged = totalEvents++; public static final int audioDidReset = totalEvents++; + public static final int audioPlayStateChanged = totalEvents++; public static final int recordProgressChanged = totalEvents++; public static final int recordStarted = totalEvents++; public static final int recordStartError = totalEvents++; diff --git a/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java b/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java index 7c0e401c..97cbe020 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java +++ b/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java @@ -31,8 +31,6 @@ import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationManagerCompat; 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; @@ -602,11 +600,8 @@ public class NotificationsController { } String lastMessage = null; - String lastMessageFull = null; if (pushMessages.size() == 1) { - String message = lastMessageFull = getStringForMessage(pushMessages.get(0), false); - //lastMessage = getStringForMessage(pushMessages.get(0), true); - lastMessage = lastMessageFull; + String message = lastMessage = getStringForMessage(pushMessages.get(0), false); if (message == null) { return; } @@ -630,8 +625,7 @@ public class NotificationsController { continue; } if (i == 0) { - lastMessageFull = message; - lastMessage = lastMessageFull; + lastMessage = message; } if (pushDialogs.size() == 1) { if (replace) { @@ -692,9 +686,6 @@ public class NotificationsController { showExtraNotifications(mBuilder, notifyAboutLast); notificationManager.notify(1, mBuilder.build()); - if (preferences.getBoolean("EnablePebbleNotifications", false)) { - sendAlertToPebble(lastMessageFull); - } scheduleNotificationRepeat(); } catch (Exception e) { @@ -897,26 +888,6 @@ public class NotificationsController { } } - private void sendAlertToPebble(String message) { - try { - final Intent i = new Intent("com.getpebble.action.SEND_NOTIFICATION"); - - final HashMap data = new HashMap<>(); - data.put("title", LocaleController.getString("AppName", R.string.AppName)); - data.put("body", message); - final JSONObject jsonData = new JSONObject(data); - final String notificationData = new JSONArray().put(jsonData).toString(); - - i.putExtra("messageType", "PEBBLE_ALERT"); - i.putExtra("sender", LocaleController.formatString("AppName", R.string.AppName)); - i.putExtra("notificationData", notificationData); - - ApplicationLoader.applicationContext.sendBroadcast(i); - } catch (Exception e) { - FileLog.e("tmessages", e); - } - } - public void processReadMessages(HashMap inbox, long dialog_id, int max_date, int max_id, boolean isPopup) { int oldCount = popupMessages.size(); if (inbox != null) { diff --git a/TMessagesProj/src/main/java/org/telegram/android/SendMessagesHelper.java b/TMessagesProj/src/main/java/org/telegram/android/SendMessagesHelper.java index 060d2179..62eecb35 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/SendMessagesHelper.java +++ b/TMessagesProj/src/main/java/org/telegram/android/SendMessagesHelper.java @@ -19,6 +19,7 @@ import android.provider.MediaStore; import android.webkit.MimeTypeMap; import android.widget.Toast; +import org.telegram.android.audioinfo.AudioInfo; import org.telegram.messenger.ConnectionsManager; import org.telegram.messenger.FileLoader; import org.telegram.messenger.FileLog; @@ -557,6 +558,9 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter for (int a = 0; a < messages.size(); a++) { MessageObject msgObj = messages.get(a); + if (msgObj.getId() <= 0) { + continue; + } final TLRPC.Message newMsg = new TLRPC.TL_message(); newMsg.flags |= TLRPC.MESSAGE_FLAG_FWD; @@ -1858,6 +1862,7 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter return false; } MimeTypeMap myMime = MimeTypeMap.getSingleton(); + TLRPC.TL_documentAttributeAudio attributeAudio = null; if (uri != null) { String extension = null; if (mime != null) { @@ -1885,9 +1890,32 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter if (idx != -1) { ext = path.substring(idx + 1); } + if (ext.toLowerCase().equals("mp3") || ext.toLowerCase().equals("m4a")) { + AudioInfo audioInfo = AudioInfo.getAudioInfo(f); + if (audioInfo != null && audioInfo.getDuration() != 0) { + if (isEncrypted) { + attributeAudio = new TLRPC.TL_documentAttributeAudio_old(); + } else { + attributeAudio = new TLRPC.TL_documentAttributeAudio(); + } + attributeAudio.duration = (int) (audioInfo.getDuration() / 1000); + attributeAudio.title = audioInfo.getTitle(); + attributeAudio.performer = audioInfo.getArtist(); + if (attributeAudio.title == null) { + attributeAudio.title = ""; + } + if (attributeAudio.performer == null) { + attributeAudio.performer = ""; + } + } + } if (originalPath != null) { + if (attributeAudio != null) { + originalPath += "audio" + f.length(); + } else { originalPath += "" + f.length(); } + } TLRPC.TL_document document = null; if (!isEncrypted) { @@ -1905,6 +1933,9 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter document.attributes.add(fileName); document.size = (int) f.length(); document.dc_id = 0; + if (attributeAudio != null) { + document.attributes.add(attributeAudio); + } if (ext.length() != 0) { if (ext.toLowerCase().equals("webp")) { document.mime_type = "image/webp"; @@ -1990,6 +2021,56 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter prepareSendingDocuments(paths, originalPaths, uris, mine, dialog_id, reply_to_msg); } + public static void prepareSendingAudioDocuments(final ArrayList messageObjects, final long dialog_id, final MessageObject reply_to_msg) { + new Thread(new Runnable() { + @Override + public void run() { + int size = messageObjects.size(); + for (int a = 0; a < size; a++) { + final MessageObject messageObject = messageObjects.get(a); + String originalPath = messageObject.messageOwner.attachPath; + final File f = new File(originalPath); + + boolean isEncrypted = (int) dialog_id == 0; + + + if (originalPath != null) { + originalPath += "audio" + f.length(); + } + + TLRPC.TL_document document = null; + if (!isEncrypted) { + document = (TLRPC.TL_document) MessagesStorage.getInstance().getSentFile(originalPath, !isEncrypted ? 1 : 4); + } + if (document == null) { + document = (TLRPC.TL_document) messageObject.messageOwner.media.document; + } + + if (isEncrypted) { + for (int b = 0; b < document.attributes.size(); b++) { + if (document.attributes.get(b) instanceof TLRPC.TL_documentAttributeAudio) { + TLRPC.TL_documentAttributeAudio_old old = new TLRPC.TL_documentAttributeAudio_old(); + old.duration = document.attributes.get(b).duration; + document.attributes.remove(b); + document.attributes.add(old); + break; + } + } + } + + final String originalPathFinal = originalPath; + final TLRPC.TL_document documentFinal = document; + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + SendMessagesHelper.getInstance().sendMessage(documentFinal, originalPathFinal, messageObject.messageOwner.attachPath, dialog_id, reply_to_msg); + } + }); + } + } + }).start(); + } + public static void prepareSendingDocuments(final ArrayList paths, final ArrayList originalPaths, final ArrayList uris, final String mime, final long dialog_id, final MessageObject reply_to_msg) { if (paths == null && originalPaths == null && uris == null || paths != null && originalPaths != null && paths.size() != originalPaths.size()) { return; diff --git a/TMessagesProj/src/main/java/org/telegram/android/query/SharedMediaQuery.java b/TMessagesProj/src/main/java/org/telegram/android/query/SharedMediaQuery.java index f1acd028..492fea8d 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/query/SharedMediaQuery.java +++ b/TMessagesProj/src/main/java/org/telegram/android/query/SharedMediaQuery.java @@ -400,4 +400,38 @@ public class SharedMediaQuery { } }); } + + public static void loadMusic(final long uid, final int max_id) { + MessagesStorage.getInstance().getStorageQueue().postRunnable(new Runnable() { + @Override + public void run() { + final ArrayList arrayList = new ArrayList<>(); + try { + SQLiteCursor cursor = MessagesStorage.getInstance().getDatabase().queryFinalized(String.format(Locale.US, "SELECT data, mid FROM media_v2 WHERE uid = %d AND mid < %d AND type = %d ORDER BY date DESC, mid DESC LIMIT 1000", uid, max_id, MEDIA_FILE)); + + while (cursor.next()) { + ByteBufferDesc data = MessagesStorage.getInstance().getBuffersStorage().getFreeBuffer(cursor.byteArrayLength(0)); + if (data != null && cursor.byteBufferValue(0, data.buffer) != 0) { + TLRPC.Message message = TLRPC.Message.TLdeserialize(data, data.readInt32(false), false); + if (MessageObject.isMusicMessage(message)) { + message.id = cursor.intValue(1); + message.dialog_id = uid; + arrayList.add(0, new MessageObject(message, null, false)); + } + } + MessagesStorage.getInstance().getBuffersStorage().reuseFreeBuffer(data); + } + cursor.dispose(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + NotificationCenter.getInstance().postNotificationName(NotificationCenter.musicDidLoaded, uid, arrayList); + } + }); + } + }); + } } diff --git a/TMessagesProj/src/main/java/org/telegram/android/support/util/SortedList.java b/TMessagesProj/src/main/java/org/telegram/android/support/util/SortedList.java index 688e032c..c8bb6d3e 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/support/util/SortedList.java +++ b/TMessagesProj/src/main/java/org/telegram/android/support/util/SortedList.java @@ -14,9 +14,10 @@ * limitations under the License. */ -package android.support.v7.util; +package org.telegram.android.support.util; import java.lang.reflect.Array; +import java.util.Arrays; /** * A Sorted list implementation that can keep items in order and also notify for changes in the @@ -418,6 +419,19 @@ public class SortedList { mSize++; } + /** + * Removes all items from the SortedList. + */ + public void clear() { + if (mSize == 0) { + return; + } + final int prevSize = mSize; + Arrays.fill(mData, 0, prevSize, null); + mSize = 0; + mCallback.onRemoved(0, prevSize); + } + /** * The class that controls the behavior of the {@link SortedList}. *

diff --git a/TMessagesProj/src/main/java/org/telegram/android/support/widget/AdapterHelper.java b/TMessagesProj/src/main/java/org/telegram/android/support/widget/AdapterHelper.java index 3b4c28c1..d56fb0b9 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/support/widget/AdapterHelper.java +++ b/TMessagesProj/src/main/java/org/telegram/android/support/widget/AdapterHelper.java @@ -19,6 +19,9 @@ package org.telegram.android.support.widget; import android.support.v4.util.Pools; import android.util.Log; +import org.telegram.android.support.widget.OpReorderer; +import org.telegram.android.support.widget.RecyclerView; + import java.util.ArrayList; import java.util.Collections; import java.util.List; diff --git a/TMessagesProj/src/main/java/org/telegram/android/support/widget/DefaultItemAnimator.java b/TMessagesProj/src/main/java/org/telegram/android/support/widget/DefaultItemAnimator.java index bbbc20a5..0d7e11af 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/support/widget/DefaultItemAnimator.java +++ b/TMessagesProj/src/main/java/org/telegram/android/support/widget/DefaultItemAnimator.java @@ -18,6 +18,7 @@ package org.telegram.android.support.widget; import android.support.v4.view.ViewCompat; import android.support.v4.view.ViewPropertyAnimatorCompat; import android.support.v4.view.ViewPropertyAnimatorListener; + import org.telegram.android.support.widget.RecyclerView.ViewHolder; import android.view.View; diff --git a/TMessagesProj/src/main/java/org/telegram/android/support/widget/GridLayoutManager.java b/TMessagesProj/src/main/java/org/telegram/android/support/widget/GridLayoutManager.java index 790bf06f..37453d67 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/support/widget/GridLayoutManager.java +++ b/TMessagesProj/src/main/java/org/telegram/android/support/widget/GridLayoutManager.java @@ -24,6 +24,8 @@ import android.util.SparseIntArray; import android.view.View; import android.view.ViewGroup; +import org.telegram.android.support.widget.RecyclerView; + import java.util.Arrays; /** diff --git a/TMessagesProj/src/main/java/org/telegram/android/support/widget/LayoutState.java b/TMessagesProj/src/main/java/org/telegram/android/support/widget/LayoutState.java index c431b614..b91274a1 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/support/widget/LayoutState.java +++ b/TMessagesProj/src/main/java/org/telegram/android/support/widget/LayoutState.java @@ -60,11 +60,14 @@ class LayoutState { int mLayoutDirection; /** - * Used if you want to pre-layout items that are not yet visible. - * The difference with {@link #mAvailable} is that, when recycling, distance rendered for - * {@link #mExtra} is not considered not to recycle visible children. + * This is the target pixel closest to the start of the layout that we are trying to fill */ - int mExtra = 0; + int mStartLine = 0; + + /** + * This is the target pixel closest to the end of the layout that we are trying to fill + */ + int mEndLine = 0; /** * @return true if there are more items in the data adapter @@ -84,4 +87,16 @@ class LayoutState { mCurrentPosition += mItemDirection; return view; } + + @Override + public String toString() { + return "LayoutState{" + + "mAvailable=" + mAvailable + + ", mCurrentPosition=" + mCurrentPosition + + ", mItemDirection=" + mItemDirection + + ", mLayoutDirection=" + mLayoutDirection + + ", mStartLine=" + mStartLine + + ", mEndLine=" + mEndLine + + '}'; + } } diff --git a/TMessagesProj/src/main/java/org/telegram/android/support/widget/LinearLayoutManager.java b/TMessagesProj/src/main/java/org/telegram/android/support/widget/LinearLayoutManager.java index a52bbffe..a0508ad5 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/support/widget/LinearLayoutManager.java +++ b/TMessagesProj/src/main/java/org/telegram/android/support/widget/LinearLayoutManager.java @@ -23,6 +23,12 @@ import android.os.Parcelable; import android.support.v4.view.ViewCompat; import android.support.v4.view.accessibility.AccessibilityEventCompat; import android.support.v4.view.accessibility.AccessibilityRecordCompat; +import android.util.AttributeSet; + +import org.telegram.android.support.widget.OrientationHelper; +import org.telegram.android.support.widget.RecyclerView; +import org.telegram.android.support.widget.ScrollbarHelper; +import org.telegram.android.support.widget.helper.ItemTouchHelper; import android.util.Log; import android.view.View; import android.view.ViewGroup; @@ -33,10 +39,11 @@ import java.util.List; import static org.telegram.android.support.widget.RecyclerView.NO_POSITION; /** - * A {@link android.support.v7.widget.RecyclerView.LayoutManager} implementation which provides + * A {@link RecyclerView.LayoutManager} implementation which provides * similar functionality to {@link android.widget.ListView}. */ -public class LinearLayoutManager extends RecyclerView.LayoutManager { +public class LinearLayoutManager extends RecyclerView.LayoutManager implements + ItemTouchHelper.ViewDropHandler { private static final String TAG = "LinearLayoutManager"; @@ -130,7 +137,7 @@ public class LinearLayoutManager extends RecyclerView.LayoutManager { * Re-used variable to keep anchor information on re-layout. * Anchor position and coordinate defines the reference point for LLM while doing a layout. * */ - final AnchorInfo mAnchorInfo; + final AnchorInfo mAnchorInfo = new AnchorInfo(); /** * Creates a vertical LinearLayoutManager @@ -148,7 +155,6 @@ public class LinearLayoutManager extends RecyclerView.LayoutManager { * @param reverseLayout When set to true, layouts from end to start. */ public LinearLayoutManager(Context context, int orientation, boolean reverseLayout) { - mAnchorInfo = new AnchorInfo(); setOrientation(orientation); setReverseLayout(reverseLayout); } @@ -342,8 +348,8 @@ public class LinearLayoutManager extends RecyclerView.LayoutManager { * laid out at the end of the UI, second item is laid out before it etc. * * For horizontal layouts, it depends on the layout direction. - * When set to true, If {@link android.support.v7.widget.RecyclerView} is LTR, than it will - * layout from RTL, if {@link android.support.v7.widget.RecyclerView}} is RTL, it will layout + * When set to true, If {@link RecyclerView} is LTR, than it will + * layout from RTL, if {@link RecyclerView}} is RTL, it will layout * from LTR. * * If you are looking for the exact same behavior of @@ -371,9 +377,13 @@ public class LinearLayoutManager extends RecyclerView.LayoutManager { final int firstChild = getPosition(getChildAt(0)); final int viewPosition = position - firstChild; if (viewPosition >= 0 && viewPosition < childCount) { - return getChildAt(viewPosition); + final View child = getChildAt(viewPosition); + if (getPosition(child) == position) { + return child; // in pre-layout, this may not match + } } - return null; + // fallback to traversal. This might be necessary in pre-layout. + return super.findViewByPosition(position); } /** @@ -796,6 +806,7 @@ public class LinearLayoutManager extends RecyclerView.LayoutManager { } // override layout from end values for consistency anchorInfo.mLayoutFromEnd = mShouldReverseLayout; + // if this changes, we should update prepareForDrop as well if (mShouldReverseLayout) { anchorInfo.mCoordinate = mOrientationHelper.getEndAfterPadding() - mPendingScrollPositionOffset; @@ -941,7 +952,6 @@ public class LinearLayoutManager extends RecyclerView.LayoutManager { * item[10]'s bottom is 20 pixels above the RecyclerView's bottom. *

* Note that scroll position change will not be reflected until the next layout call. - * *

* If you are just trying to make a position visible, use {@link #scrollToPosition(int)}. * @@ -1175,11 +1185,10 @@ public class LinearLayoutManager extends RecyclerView.LayoutManager { /** * Recycles views that went out of bounds after scrolling towards the end of the layout. * - * @param recycler Recycler instance of {@link android.support.v7.widget.RecyclerView} + * @param recycler Recycler instance of {@link RecyclerView} * @param dt This can be used to add additional padding to the visible area. This is used - * to - * detect children that will go out of bounds after scrolling, without actually - * moving them. + * to detect children that will go out of bounds after scrolling, without + * actually moving them. */ private void recycleViewsFromStart(RecyclerView.Recycler recycler, int dt) { if (dt < 0) { @@ -1215,7 +1224,7 @@ public class LinearLayoutManager extends RecyclerView.LayoutManager { /** * Recycles views that went out of bounds after scrolling towards the start of the layout. * - * @param recycler Recycler instance of {@link android.support.v7.widget.RecyclerView} + * @param recycler Recycler instance of {@link RecyclerView} * @param dt This can be used to add additional padding to the visible area. This is used * to detect children that will go out of bounds after scrolling, without * actually moving them. @@ -1257,8 +1266,8 @@ public class LinearLayoutManager extends RecyclerView.LayoutManager { * @param layoutState Current layout state. Right now, this object does not change but * we may consider moving it out of this view so passing around as a * parameter for now, rather than accessing {@link #mLayoutState} - * @see #recycleViewsFromStart(android.support.v7.widget.RecyclerView.Recycler, int) - * @see #recycleViewsFromEnd(android.support.v7.widget.RecyclerView.Recycler, int) + * @see #recycleViewsFromStart(RecyclerView.Recycler, int) + * @see #recycleViewsFromEnd(RecyclerView.Recycler, int) * @see android.support.v7.widget.LinearLayoutManager.LayoutState#mLayoutDirection */ private void recycleByLayoutState(RecyclerView.Recycler recycler, LayoutState layoutState) { @@ -1788,6 +1797,40 @@ public class LinearLayoutManager extends RecyclerView.LayoutManager { return mPendingSavedState == null && mLastStackFromEnd == mStackFromEnd; } + /** + * @hide This method should be called by ItemTouchHelper only. + */ + @Override + public void prepareForDrop(View view, View target, int x, int y) { + assertNotInLayoutOrScroll("Cannot drop a view during a scroll or layout calculation"); + ensureLayoutState(); + resolveShouldLayoutReverse(); + final int myPos = getPosition(view); + final int targetPos = getPosition(target); + final int dropDirection = myPos < targetPos ? LayoutState.ITEM_DIRECTION_TAIL : + LayoutState.ITEM_DIRECTION_HEAD; + if (mShouldReverseLayout) { + if (dropDirection == LayoutState.ITEM_DIRECTION_TAIL) { + scrollToPositionWithOffset(targetPos, + mOrientationHelper.getEndAfterPadding() - + (mOrientationHelper.getDecoratedStart(target) + + mOrientationHelper.getDecoratedMeasurement(view))); + } else { + scrollToPositionWithOffset(targetPos, + mOrientationHelper.getEndAfterPadding() - + mOrientationHelper.getDecoratedEnd(target)); + } + } else { + if (dropDirection == LayoutState.ITEM_DIRECTION_HEAD) { + scrollToPositionWithOffset(targetPos, mOrientationHelper.getDecoratedStart(target)); + } else { + scrollToPositionWithOffset(targetPos, + mOrientationHelper.getDecoratedEnd(target) - + mOrientationHelper.getDecoratedMeasurement(view)); + } + } + } + /** * Helper class that keeps temporary state while {LayoutManager} is filling out the empty * space. diff --git a/TMessagesProj/src/main/java/org/telegram/android/support/widget/OpReorderer.java b/TMessagesProj/src/main/java/org/telegram/android/support/widget/OpReorderer.java index 3d56822f..05d0e93a 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/support/widget/OpReorderer.java +++ b/TMessagesProj/src/main/java/org/telegram/android/support/widget/OpReorderer.java @@ -16,14 +16,14 @@ package org.telegram.android.support.widget; -import java.util.List; - import org.telegram.android.support.widget.AdapterHelper.UpdateOp; import static org.telegram.android.support.widget.AdapterHelper.UpdateOp.ADD; import static org.telegram.android.support.widget.AdapterHelper.UpdateOp.MOVE; import static org.telegram.android.support.widget.AdapterHelper.UpdateOp.REMOVE; import static org.telegram.android.support.widget.AdapterHelper.UpdateOp.UPDATE; +import java.util.List; + class OpReorderer { final Callback mCallback; @@ -58,7 +58,7 @@ class OpReorderer { } void swapMoveRemove(List list, int movePos, UpdateOp moveOp, - int removePos, UpdateOp removeOp) { + int removePos, UpdateOp removeOp) { UpdateOp extraRm = null; // check if move is nulled out by remove boolean revertedMove = false; @@ -83,7 +83,7 @@ class OpReorderer { removeOp.positionStart--; } else if (moveOp.itemCount < removeOp.positionStart + removeOp.itemCount) { // move is removed. - removeOp.itemCount --; + removeOp.itemCount--; moveOp.cmd = REMOVE; moveOp.itemCount = 1; if (removeOp.itemCount == 0) { @@ -157,7 +157,7 @@ class OpReorderer { } private void swapMoveAdd(List list, int move, UpdateOp moveOp, int add, - UpdateOp addOp) { + UpdateOp addOp) { int offset = 0; // going in reverse, first revert the effect of add if (moveOp.itemCount < addOp.positionStart) { @@ -178,7 +178,7 @@ class OpReorderer { } void swapMoveUpdate(List list, int move, UpdateOp moveOp, int update, - UpdateOp updateOp) { + UpdateOp updateOp) { UpdateOp extraUp1 = null; UpdateOp extraUp2 = null; // going in reverse, first revert the effect of add @@ -228,7 +228,7 @@ class OpReorderer { return -1; } - static interface Callback { + interface Callback { UpdateOp obtainUpdateOp(int cmd, int startPosition, int itemCount); diff --git a/TMessagesProj/src/main/java/org/telegram/android/support/widget/PositionMap.java b/TMessagesProj/src/main/java/org/telegram/android/support/widget/PositionMap.java index b97bd5a6..15a41191 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/support/widget/PositionMap.java +++ b/TMessagesProj/src/main/java/org/telegram/android/support/widget/PositionMap.java @@ -456,5 +456,4 @@ class PositionMap implements Cloneable { return ~lo; // value not present } } - } diff --git a/TMessagesProj/src/main/java/org/telegram/android/support/widget/RecyclerView.java b/TMessagesProj/src/main/java/org/telegram/android/support/widget/RecyclerView.java index f6a17a1d..4aa003c7 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/support/widget/RecyclerView.java +++ b/TMessagesProj/src/main/java/org/telegram/android/support/widget/RecyclerView.java @@ -18,6 +18,7 @@ package org.telegram.android.support.widget; import android.content.Context; +import android.content.res.TypedArray; import android.database.Observable; import android.graphics.Canvas; import android.graphics.PointF; @@ -30,6 +31,8 @@ import android.support.annotation.Nullable; import android.support.v4.util.ArrayMap; import android.support.v4.view.InputDeviceCompat; import android.support.v4.view.MotionEventCompat; +import android.support.v4.view.NestedScrollingChild; +import android.support.v4.view.NestedScrollingChildHelper; import android.support.v4.view.ScrollingView; import android.support.v4.view.VelocityTrackerCompat; import android.support.v4.view.ViewCompat; @@ -39,9 +42,6 @@ import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; import android.support.v4.view.accessibility.AccessibilityRecordCompat; import android.support.v4.widget.EdgeEffectCompat; import android.support.v4.widget.ScrollerCompat; -import static org.telegram.android.support.widget.AdapterHelper.UpdateOp; -import static org.telegram.android.support.widget.AdapterHelper.Callback; - import android.util.AttributeSet; import android.util.Log; import android.util.SparseArray; @@ -58,12 +58,15 @@ import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import android.view.animation.Interpolator; -import org.telegram.android.AndroidUtilities; - +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import static org.telegram.android.support.widget.AdapterHelper.Callback; +import static org.telegram.android.support.widget.AdapterHelper.UpdateOp; + /** * A flexible view for providing a limited window into a large data set. * @@ -128,8 +131,10 @@ import java.util.List; *

* When writing a {@link LayoutManager} you almost always want to use layout positions whereas when * writing an {@link Adapter}, you probably want to use adapter positions. + * + * @attr ref android.support.v7.recyclerview.R.styleable#RecyclerView_layoutManager */ -public class RecyclerView extends ViewGroup implements ScrollingView { +public class RecyclerView extends ViewGroup implements ScrollingView, NestedScrollingChild { private static final String TAG = "RecyclerView"; @@ -221,6 +226,8 @@ public class RecyclerView extends ViewGroup implements ScrollingView { * >Try increasing your pool size and item cache size. */ private static final String TRACE_CREATE_VIEW_TAG = "RV CreateView"; + private static final Class[] LAYOUT_MANAGER_CONSTRUCTOR_SIGNATURE = + new Class[]{Context.class, AttributeSet.class, int.class, int.class}; private final RecyclerViewDataObserver mObserver = new RecyclerViewDataObserver(); @@ -283,6 +290,7 @@ public class RecyclerView extends ViewGroup implements ScrollingView { private boolean mAdapterUpdateDuringMeasure; private final boolean mPostUpdatesOnAnimation; private final AccessibilityManager mAccessibilityManager; + private List mOnChildAttachStateListeners; /** * Set to true when an adapter data set changed notification is received. @@ -354,11 +362,17 @@ public class RecyclerView extends ViewGroup implements ScrollingView { new ItemAnimatorRestoreListener(); private boolean mPostedAnimatorRunner = false; private RecyclerViewAccessibilityDelegate mAccessibilityDelegate; + private ChildDrawingOrderCallback mChildDrawingOrderCallback; // simple array to keep min and max child position during a layout calculation // preserved not to create a new one in each layout pass private final int[] mMinMaxLayoutPositions = new int[2]; + private final NestedScrollingChildHelper mScrollingChildHelper; + private final int[] mScrollOffset = new int[2]; + private final int[] mScrollConsumed = new int[2]; + private final int[] mNestedOffsets = new int[2]; + private Runnable mItemAnimatorRunner = new Runnable() { @Override public void run() { @@ -408,6 +422,10 @@ public class RecyclerView extends ViewGroup implements ScrollingView { mAccessibilityManager = (AccessibilityManager) getContext() .getSystemService(Context.ACCESSIBILITY_SERVICE); setAccessibilityDelegateCompat(new RecyclerViewAccessibilityDelegate(this)); + // Create the layoutManager if specified. + + mScrollingChildHelper = new NestedScrollingChildHelper(this); + setNestedScrollingEnabled(true); } /** @@ -428,6 +446,72 @@ public class RecyclerView extends ViewGroup implements ScrollingView { ViewCompat.setAccessibilityDelegate(this, mAccessibilityDelegate); } + /** + * Instantiate and set a LayoutManager, if specified in the attributes. + */ + private void createLayoutManager(Context context, String className, AttributeSet attrs, + int defStyleAttr, int defStyleRes) { + if (className != null) { + className = className.trim(); + if (className.length() != 0) { // Can't use isEmpty since it was added in API 9. + className = getFullClassName(context, className); + try { + ClassLoader classLoader; + if (isInEditMode()) { + // Stupid layoutlib cannot handle simple class loaders. + classLoader = this.getClass().getClassLoader(); + } else { + classLoader = context.getClassLoader(); + } + Class layoutManagerClass = + classLoader.loadClass(className).asSubclass(LayoutManager.class); + Constructor constructor; + Object[] constructorArgs = null; + try { + constructor = layoutManagerClass + .getConstructor(LAYOUT_MANAGER_CONSTRUCTOR_SIGNATURE); + constructorArgs = new Object[]{context, attrs, defStyleAttr, defStyleRes}; + } catch (NoSuchMethodException e) { + try { + constructor = layoutManagerClass.getConstructor(); + } catch (NoSuchMethodException e1) { + e1.initCause(e); + throw new IllegalStateException(attrs.getPositionDescription() + + ": Error creating LayoutManager " + className, e1); + } + } + constructor.setAccessible(true); + setLayoutManager(constructor.newInstance(constructorArgs)); + } catch (ClassNotFoundException e) { + throw new IllegalStateException(attrs.getPositionDescription() + + ": Unable to find LayoutManager " + className, e); + } catch (InvocationTargetException e) { + throw new IllegalStateException(attrs.getPositionDescription() + + ": Could not instantiate the LayoutManager: " + className, e); + } catch (InstantiationException e) { + throw new IllegalStateException(attrs.getPositionDescription() + + ": Could not instantiate the LayoutManager: " + className, e); + } catch (IllegalAccessException e) { + throw new IllegalStateException(attrs.getPositionDescription() + + ": Cannot access non-public constructor " + className, e); + } catch (ClassCastException e) { + throw new IllegalStateException(attrs.getPositionDescription() + + ": Class is not a LayoutManager " + className, e); + } + } + } + } + + private String getFullClassName(Context context, String className) { + if (className.charAt(0) == '.') { + return context.getPackageName() + className; + } + if (className.contains("")) { + return className; + } + return RecyclerView.class.getPackage().getName() + '.' + className; + } + private void initChildrenHelper() { mChildHelper = new ChildHelper(new ChildHelper.Callback() { @Override @@ -769,6 +853,46 @@ public class RecyclerView extends ViewGroup implements ScrollingView { } } + /** + * Register a listener that will be notified whenever a child view is attached to or detached + * from RecyclerView. + * + *

This listener will be called when a LayoutManager or the RecyclerView decides + * that a child view is no longer needed. If an application associates expensive + * or heavyweight data with item views, this may be a good place to release + * or free those resources.

+ * + * @param listener Listener to register + */ + public void addOnChildAttachStateChangeListener(OnChildAttachStateChangeListener listener) { + if (mOnChildAttachStateListeners == null) { + mOnChildAttachStateListeners = new ArrayList(); + } + mOnChildAttachStateListeners.add(listener); + } + + /** + * Removes the provided listener from child attached state listeners list. + * + * @param listener Listener to unregister + */ + public void removeOnChildAttachStateChangeListener(OnChildAttachStateChangeListener listener) { + if (mOnChildAttachStateListeners == null) { + return; + } + mOnChildAttachStateListeners.remove(listener); + } + + /** + * Removes all listeners that were added via + * {@link #addOnChildAttachStateChangeListener(OnChildAttachStateChangeListener)}. + */ + public void clearOnChildAttachStateChangeListeners() { + if (mOnChildAttachStateListeners != null) { + mOnChildAttachStateListeners.clear(); + } + } + /** * Set the {@link LayoutManager} that this RecyclerView will use. * @@ -993,7 +1117,7 @@ public class RecyclerView extends ViewGroup implements ScrollingView { public void addItemDecoration(ItemDecoration decor, int index) { if (mLayout != null) { mLayout.assertNotInLayoutOrScroll("Cannot add item decoration during a scroll or" - + " layout"); + + "layout"); } if (mItemDecorations.isEmpty()) { setWillNotDraw(false); @@ -1035,7 +1159,7 @@ public class RecyclerView extends ViewGroup implements ScrollingView { public void removeItemDecoration(ItemDecoration decor) { if (mLayout != null) { mLayout.assertNotInLayoutOrScroll("Cannot remove item decoration during a scroll or" - + " layout"); + + "layout"); } mItemDecorations.remove(decor); if (mItemDecorations.isEmpty()) { @@ -1045,6 +1169,26 @@ public class RecyclerView extends ViewGroup implements ScrollingView { requestLayout(); } + /** + * Sets the {@link ChildDrawingOrderCallback} to be used for drawing children. + *

+ * See {@link ViewGroup#getChildDrawingOrder(int, int)} for details. Calling this method will + * always call {@link ViewGroup#setChildrenDrawingOrderEnabled(boolean)}. The parameter will be + * true if childDrawingOrderCallback is not null, false otherwise. + *

+ * Note that child drawing order may be overridden by View's elevation. + * + * @param childDrawingOrderCallback The ChildDrawingOrderCallback to be used by the drawing + * system. + */ + public void setChildDrawingOrderCallback(ChildDrawingOrderCallback childDrawingOrderCallback) { + if (childDrawingOrderCallback == mChildDrawingOrderCallback) { + return; + } + mChildDrawingOrderCallback = childDrawingOrderCallback; + setChildrenDrawingOrderEnabled(mChildDrawingOrderCallback != null); + } + /** * Set a listener that will be notified of any changes in scroll state or position. * @@ -1153,7 +1297,7 @@ public class RecyclerView extends ViewGroup implements ScrollingView { final boolean canScrollHorizontal = mLayout.canScrollHorizontally(); final boolean canScrollVertical = mLayout.canScrollVertically(); if (canScrollHorizontal || canScrollVertical) { - scrollByInternal(canScrollHorizontal ? x : 0, canScrollVertical ? y : 0, false, 0, 0); + scrollByInternal(canScrollHorizontal ? x : 0, canScrollVertical ? y : 0, null); } } @@ -1176,29 +1320,25 @@ public class RecyclerView extends ViewGroup implements ScrollingView { * * @param x The amount of horizontal scroll request * @param y The amount of vertical scroll request - * @param fromMotionEvent If request is originated from a MotionEvent, this should be set to - * true and motionX/motionY should be provided, false otherwise. - * @param motionX The x coordinate of the MotionEvent which triggered this scroll. Unused if - * fromMotionEvent is false. - * @param motionY The y coordinate of the MotionEvent which triggered this scroll. Unused if - * fromMotionEvent is false. + * @param ev The originating MotionEvent, or null if not from a touch event. * * @return Whether any scroll was consumed in either direction. */ - boolean scrollByInternal(int x, int y, boolean fromMotionEvent, int motionX, int motionY) { - int overscrollX = 0, overscrollY = 0; - int hresult = 0, vresult = 0; + boolean scrollByInternal(int x, int y, MotionEvent ev) { + int unconsumedX = 0, unconsumedY = 0; + int consumedX = 0, consumedY = 0; + consumePendingUpdateOperations(); if (mAdapter != null) { eatRequestLayout(); onEnterLayoutOrScroll(); if (x != 0) { - hresult = mLayout.scrollHorizontallyBy(x, mRecycler, mState); - overscrollX = x - hresult; + consumedX = mLayout.scrollHorizontallyBy(x, mRecycler, mState); + unconsumedX = x - consumedX; } if (y != 0) { - vresult = mLayout.scrollVerticallyBy(y, mRecycler, mState); - overscrollY = y - vresult; + consumedY = mLayout.scrollVerticallyBy(y, mRecycler, mState); + unconsumedY = y - consumedY; } if (supportsChangeAnimations()) { // Fix up shadow views used by changing animations @@ -1227,19 +1367,27 @@ public class RecyclerView extends ViewGroup implements ScrollingView { if (!mItemDecorations.isEmpty()) { invalidate(); } - if (ViewCompat.getOverScrollMode(this) != ViewCompat.OVER_SCROLL_NEVER) { - if (fromMotionEvent) { - pullGlows(motionX, overscrollX, motionY, overscrollY); + + if (dispatchNestedScroll(consumedX, consumedY, unconsumedX, unconsumedY, mScrollOffset)) { + // Update the last touch co-ords, taking any scroll offset into account + mLastTouchX -= mScrollOffset[0]; + mLastTouchY -= mScrollOffset[1]; + ev.offsetLocation(mScrollOffset[0], mScrollOffset[1]); + mNestedOffsets[0] += mScrollOffset[0]; + mNestedOffsets[1] += mScrollOffset[1]; + } else if (ViewCompat.getOverScrollMode(this) != ViewCompat.OVER_SCROLL_NEVER) { + if (ev != null) { + pullGlows(ev.getX(), unconsumedX, ev.getY(), unconsumedY); } considerReleasingGlowsOnScroll(x, y); } - if (hresult != 0 || vresult != 0) { - dispatchOnScrolled(hresult, vresult); + if (consumedX != 0 || consumedY != 0) { + dispatchOnScrolled(consumedX, consumedY); } if (!awakenScrollBars()) { invalidate(); } - return hresult != 0 || vresult != 0; + return consumedX != 0 || consumedY != 0; } /** @@ -1432,19 +1580,31 @@ public class RecyclerView extends ViewGroup implements ScrollingView { "Call setLayoutManager with a non-null argument."); return false; } + final boolean canScrollHorizontal = mLayout.canScrollHorizontally(); final boolean canScrollVertical = mLayout.canScrollVertically(); + if (!canScrollHorizontal || Math.abs(velocityX) < mMinFlingVelocity) { velocityX = 0; } if (!canScrollVertical || Math.abs(velocityY) < mMinFlingVelocity) { velocityY = 0; } - velocityX = Math.max(-mMaxFlingVelocity, Math.min(velocityX, mMaxFlingVelocity)); - velocityY = Math.max(-mMaxFlingVelocity, Math.min(velocityY, mMaxFlingVelocity)); - if (velocityX != 0 || velocityY != 0) { - mViewFlinger.fling(velocityX, velocityY); - return true; + if (velocityX == 0 && velocityY == 0) { + // If we don't have any velocity, return false + return false; + } + + if (!dispatchNestedPreFling(velocityX, velocityY)) { + final boolean canScroll = canScrollHorizontal || canScrollVertical; + dispatchNestedFling(velocityX, velocityY, canScroll); + + if (canScroll) { + velocityX = Math.max(-mMaxFlingVelocity, Math.min(velocityX, mMaxFlingVelocity)); + velocityY = Math.max(-mMaxFlingVelocity, Math.min(velocityY, mMaxFlingVelocity)); + mViewFlinger.fling(velocityX, velocityY); + return true; + } } return false; } @@ -1468,29 +1628,52 @@ public class RecyclerView extends ViewGroup implements ScrollingView { } } + /** + * Returns the minimum velocity to start a fling. + * + * @return The minimum velocity to start a fling + */ + public int getMinFlingVelocity() { + return mMinFlingVelocity; + } + + + /** + * Returns the maximum fling velocity used by this RecyclerView. + * + * @return The maximum fling velocity used by this RecyclerView. + */ + public int getMaxFlingVelocity() { + return mMaxFlingVelocity; + } + /** * Apply a pull to relevant overscroll glow effects */ - private void pullGlows(int x, int overscrollX, int y, int overscrollY) { + private void pullGlows(float x, float overscrollX, float y, float overscrollY) { boolean invalidate = false; if (overscrollX < 0) { ensureLeftGlow(); - invalidate = mLeftGlow.onPull(-overscrollX / (float) getWidth(), - 1f - y / (float) getHeight()) || invalidate; + if (mLeftGlow.onPull(-overscrollX / getWidth(), 1f - y / getHeight())) { + invalidate = true; + } } else if (overscrollX > 0) { ensureRightGlow(); - invalidate = mRightGlow.onPull(overscrollX / (float) getWidth(), - y / (float) getHeight()) || invalidate; + if (mRightGlow.onPull(overscrollX / getWidth(), y / getHeight())) { + invalidate = true; + } } if (overscrollY < 0) { ensureTopGlow(); - invalidate = mTopGlow.onPull(-overscrollY / (float) getHeight(), - x / (float) getWidth()) || invalidate; + if (mTopGlow.onPull(-overscrollY / getHeight(), x / getWidth())) { + invalidate = true; + } } else if (overscrollY > 0) { ensureBottomGlow(); - invalidate = mBottomGlow.onPull(overscrollY / (float) getHeight(), - 1f - x / (float) getWidth()) || invalidate; + if (mBottomGlow.onPull(overscrollY / getHeight(), 1f - x / getWidth())) { + invalidate = true; + } } if (invalidate || overscrollX != 0 || overscrollY != 0) { @@ -1693,6 +1876,14 @@ public class RecyclerView extends ViewGroup implements ScrollingView { removeCallbacks(mItemAnimatorRunner); } + /** + * Returns true if RecyclerView is attached to window. + */ + // @override + public boolean isAttachedToWindow() { + return mIsAttached; + } + /** * Checks if RecyclerView is in the middle of a layout or scroll and throws an * {@link IllegalStateException} if it is not. @@ -1739,6 +1930,7 @@ public class RecyclerView extends ViewGroup implements ScrollingView { * for each incoming MotionEvent until the end of the gesture.

* * @param listener Listener to add + * @see SimpleOnItemTouchListener */ public void addOnItemTouchListener(OnItemTouchListener listener) { mOnItemTouchListeners.add(listener); @@ -1832,6 +2024,15 @@ public class RecyclerView extends ViewGroup implements ScrollingView { getParent().requestDisallowInterceptTouchEvent(true); setScrollState(SCROLL_STATE_DRAGGING); } + + int nestedScrollAxis = ViewCompat.SCROLL_AXIS_NONE; + if (canScrollHorizontally) { + nestedScrollAxis |= ViewCompat.SCROLL_AXIS_HORIZONTAL; + } + if (canScrollVertically) { + nestedScrollAxis |= ViewCompat.SCROLL_AXIS_VERTICAL; + } + startNestedScroll(nestedScrollAxis); break; case MotionEventCompat.ACTION_POINTER_DOWN: @@ -1874,6 +2075,7 @@ public class RecyclerView extends ViewGroup implements ScrollingView { case MotionEvent.ACTION_UP: { mVelocityTracker.clear(); + stopNestedScroll(); } break; case MotionEvent.ACTION_CANCEL: { @@ -1883,6 +2085,16 @@ public class RecyclerView extends ViewGroup implements ScrollingView { return mScrollState == SCROLL_STATE_DRAGGING; } + @Override + public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) { + final int listenerCount = mOnItemTouchListeners.size(); + for (int i = 0; i < listenerCount; i++) { + final OnItemTouchListener listener = mOnItemTouchListeners.get(i); + listener.onRequestDisallowInterceptTouchEvent(disallowIntercept); + } + super.requestDisallowInterceptTouchEvent(disallowIntercept); + } + @Override public boolean onTouchEvent(MotionEvent e) { if (dispatchOnItemTouch(e)) { @@ -1898,14 +2110,29 @@ public class RecyclerView extends ViewGroup implements ScrollingView { } mVelocityTracker.addMovement(e); + final MotionEvent vtev = MotionEvent.obtain(e); final int action = MotionEventCompat.getActionMasked(e); final int actionIndex = MotionEventCompat.getActionIndex(e); + if (action == MotionEvent.ACTION_DOWN) { + mNestedOffsets[0] = mNestedOffsets[1] = 0; + } + vtev.offsetLocation(mNestedOffsets[0], mNestedOffsets[1]); + switch (action) { case MotionEvent.ACTION_DOWN: { mScrollPointerId = MotionEventCompat.getPointerId(e, 0); mInitialTouchX = mLastTouchX = (int) (e.getX() + 0.5f); mInitialTouchY = mLastTouchY = (int) (e.getY() + 0.5f); + + int nestedScrollAxis = ViewCompat.SCROLL_AXIS_NONE; + if (canScrollHorizontally) { + nestedScrollAxis |= ViewCompat.SCROLL_AXIS_HORIZONTAL; + } + if (canScrollVertically) { + nestedScrollAxis |= ViewCompat.SCROLL_AXIS_VERTICAL; + } + startNestedScroll(nestedScrollAxis); } break; case MotionEventCompat.ACTION_POINTER_DOWN: { @@ -1924,32 +2151,52 @@ public class RecyclerView extends ViewGroup implements ScrollingView { final int x = (int) (MotionEventCompat.getX(e, index) + 0.5f); final int y = (int) (MotionEventCompat.getY(e, index) + 0.5f); + int dx = mLastTouchX - x; + int dy = mLastTouchY - y; + + if (dispatchNestedPreScroll(dx, dy, mScrollConsumed, mScrollOffset)) { + dx -= mScrollConsumed[0]; + dy -= mScrollConsumed[1]; + vtev.offsetLocation(mScrollOffset[0], mScrollOffset[1]); + // Updated the nested offsets + mNestedOffsets[0] += mScrollOffset[0]; + mNestedOffsets[1] += mScrollOffset[1]; + } + if (mScrollState != SCROLL_STATE_DRAGGING) { - final int dx = x - mInitialTouchX; - final int dy = y - mInitialTouchY; boolean startScroll = false; if (canScrollHorizontally && Math.abs(dx) > mTouchSlop) { - mLastTouchX = mInitialTouchX + mTouchSlop * (dx < 0 ? -1 : 1); + if (dx > 0) { + dx -= mTouchSlop; + } else { + dx += mTouchSlop; + } startScroll = true; } if (canScrollVertically && Math.abs(dy) > mTouchSlop) { - mLastTouchY = mInitialTouchY + mTouchSlop * (dy < 0 ? -1 : 1); + if (dy > 0) { + dy -= mTouchSlop; + } else { + dy += mTouchSlop; + } startScroll = true; } if (startScroll) { setScrollState(SCROLL_STATE_DRAGGING); } } + if (mScrollState == SCROLL_STATE_DRAGGING) { - final int dx = x - mLastTouchX; - final int dy = y - mLastTouchY; - if (scrollByInternal(canScrollHorizontally ? -dx : 0, - canScrollVertically ? -dy : 0, true, x, y)) { + mLastTouchX = x - mScrollOffset[0]; + mLastTouchY = y - mScrollOffset[1]; + + if (scrollByInternal( + canScrollHorizontally ? dx : 0, + canScrollVertically ? dy : 0, + vtev)) { getParent().requestDisallowInterceptTouchEvent(true); } } - mLastTouchX = x; - mLastTouchY = y; } break; case MotionEventCompat.ACTION_POINTER_UP: { @@ -1965,6 +2212,7 @@ public class RecyclerView extends ViewGroup implements ScrollingView { if (!((xvel != 0 || yvel != 0) && fling((int) xvel, (int) yvel))) { setScrollState(SCROLL_STATE_IDLE); } + mVelocityTracker.clear(); releaseGlows(); } break; @@ -1974,6 +2222,8 @@ public class RecyclerView extends ViewGroup implements ScrollingView { } break; } + vtev.recycle(); + return true; } @@ -1981,6 +2231,7 @@ public class RecyclerView extends ViewGroup implements ScrollingView { if (mVelocityTracker != null) { mVelocityTracker.clear(); } + stopNestedScroll(); releaseGlows(); setScrollState(SCROLL_STATE_IDLE); } @@ -2823,6 +3074,18 @@ public class RecyclerView extends ViewGroup implements ScrollingView { return mLayout.generateLayoutParams(p); } + /** + * Returns true if RecyclerView is currently running some animations. + *

+ * If you want to be notified when animations are finished, use + * {@link ItemAnimator#isRunning(ItemAnimator.ItemAnimatorFinishedListener)}. + * + * @return True if there are some item animations currently running or waiting to be started. + */ + public boolean isAnimating() { + return mItemAnimator != null && mItemAnimator.isRunning(); + } + void saveOldPositions() { final int childCount = mChildHelper.getUnfilteredChildCount(); for (int i = 0; i < childCount; i++) { @@ -3232,6 +3495,11 @@ public class RecyclerView extends ViewGroup implements ScrollingView { return null; } + @Override + public boolean drawChild(Canvas canvas, View child, long drawingTime) { + return super.drawChild(canvas, child, drawingTime); + } + /** * Offset the bounds of all child views by dy pixels. * Useful for implementing simple scrolling in {@link LayoutManager LayoutManagers}. @@ -5153,17 +5421,32 @@ public class RecyclerView extends ViewGroup implements ScrollingView { } private void dispatchChildDetached(View child) { - if (mAdapter != null) { - mAdapter.onViewDetachedFromWindow(getChildViewHolderInt(child)); - } + final ViewHolder viewHolder = getChildViewHolderInt(child); onChildDetachedFromWindow(child); + if (mAdapter != null && viewHolder != null) { + mAdapter.onViewDetachedFromWindow(viewHolder); + } + if (mOnChildAttachStateListeners != null) { + final int cnt = mOnChildAttachStateListeners.size(); + for (int i = cnt - 1; i >= 0; i--) { + mOnChildAttachStateListeners.get(i).onChildViewDetachedFromWindow(child); + } + } } private void dispatchChildAttached(View child) { - if (mAdapter != null) { - mAdapter.onViewAttachedToWindow(getChildViewHolderInt(child)); - } + final ViewHolder viewHolder = getChildViewHolderInt(child); onChildAttachedToWindow(child); + if (mAdapter != null && viewHolder != null) { + mAdapter.onViewAttachedToWindow(viewHolder); + } + if (mOnChildAttachStateListeners != null) { + final int cnt = mOnChildAttachStateListeners.size(); + for (int i = cnt - 1; i >= 0; i--) { + mOnChildAttachStateListeners.get(i).onChildViewAttachedToWindow(child); + } + } + } /** @@ -5173,6 +5456,14 @@ public class RecyclerView extends ViewGroup implements ScrollingView { * a RecyclerView can be used to implement a standard vertically scrolling list, * a uniform grid, staggered grids, horizontally scrolling collections and more. Several stock * layout managers are provided for general use. + *

+ * If the LayoutManager specifies a default constructor or one with the signature + * ({@link Context}, {@link AttributeSet}, {@code int}, {@code int}), RecyclerView will + * instantiate and set the LayoutManager when being inflated. Most used properties can + * be then obtained from {@link #getProperties(Context, AttributeSet, int, int)}. In case + * a LayoutManager specifies both constructors, the non-default constructor will take + * precedence. + * */ public static abstract class LayoutManager { ChildHelper mChildHelper; @@ -7259,6 +7550,20 @@ public class RecyclerView extends ViewGroup implements ScrollingView { int action, Bundle args) { return false; } + + /** + * Some general properties that a LayoutManager may want to use. + */ + public static class Properties { + /** @attr ref android.support.v7.recyclerview.R.styleable#RecyclerView_android_orientation */ + public int orientation; + /** @attr ref android.support.v7.recyclerview.R.styleable#RecyclerView_spanCount */ + public int spanCount; + /** @attr ref android.support.v7.recyclerview.R.styleable#RecyclerView_reverseLayout */ + public boolean reverseLayout; + /** @attr ref android.support.v7.recyclerview.R.styleable#RecyclerView_stackFromEnd */ + public boolean stackFromEnd; + } } /** @@ -7359,8 +7664,10 @@ public class RecyclerView extends ViewGroup implements ScrollingView { * manipulation of item views within the RecyclerView. OnItemTouchListeners may intercept * a touch interaction already in progress even if the RecyclerView is already handling that * gesture stream itself for the purposes of scrolling.

+ * + * @see SimpleOnItemTouchListener */ - public interface OnItemTouchListener { + public static interface OnItemTouchListener { /** * Silently observe and/or take over touch events sent to the RecyclerView * before they are handled by either the RecyclerView itself or its child views. @@ -7385,8 +7692,44 @@ public class RecyclerView extends ViewGroup implements ScrollingView { * the RecyclerView's coordinate system. */ public void onTouchEvent(RecyclerView rv, MotionEvent e); + + /** + * Called when a child of RecyclerView does not want RecyclerView and its ancestors to + * intercept touch events with + * {@link ViewGroup#onInterceptTouchEvent(MotionEvent)}. + * + * @param disallowIntercept True if the child does not want the parent to + * intercept touch events. + * @see ViewParent#requestDisallowInterceptTouchEvent(boolean) + */ + public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept); } + /** + * An implementation of {@link RecyclerView.OnItemTouchListener} that has empty method bodies and + * default return values. + *

+ * You may prefer to extend this class if you don't need to override all methods. Another + * benefit of using this class is future compatibility. As the interface may change, we'll + * always provide a default implementation on this class so that your code won't break when + * you update to a new version of the support library. + */ + public class SimpleOnItemTouchListener implements RecyclerView.OnItemTouchListener { + @Override + public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { + return false; + } + + @Override + public void onTouchEvent(RecyclerView rv, MotionEvent e) { + } + + @Override + public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { + } + } + + /** * An OnScrollListener can be set on a RecyclerView to receive messages * when a scrolling event has occurred on that RecyclerView. @@ -7399,7 +7742,7 @@ public class RecyclerView extends ViewGroup implements ScrollingView { * want your components to be able to easily replace the listener use * RecyclerView#setOnScrollListener. */ - abstract static public class OnScrollListener { + public abstract static class OnScrollListener { /** * Callback method to be invoked when RecyclerView's scroll state changes. * @@ -7444,6 +7787,27 @@ public class RecyclerView extends ViewGroup implements ScrollingView { public void onViewRecycled(ViewHolder holder); } + /** + * A Listener interface that can be attached to a RecylcerView to get notified + * whenever a ViewHolder is attached to or detached from RecyclerView. + */ + public interface OnChildAttachStateChangeListener { + + /** + * Called when a view is attached to the RecyclerView. + * + * @param view The View which is attached to the RecyclerView + */ + public void onChildViewAttachedToWindow(View view); + + /** + * Called when a view is detached from RecyclerView. + * + * @param view The View which is being detached from the RecyclerView + */ + public void onChildViewDetachedFromWindow(View view); + } + /** * A ViewHolder describes an item view and metadata about its place within the RecyclerView. * @@ -7862,6 +8226,55 @@ public class RecyclerView extends ViewGroup implements ScrollingView { return mAdapterHelper.applyPendingUpdatesToPosition(viewHolder.mPosition); } + // NestedScrollingChild + + @Override + public void setNestedScrollingEnabled(boolean enabled) { + mScrollingChildHelper.setNestedScrollingEnabled(enabled); + } + + @Override + public boolean isNestedScrollingEnabled() { + return mScrollingChildHelper.isNestedScrollingEnabled(); + } + + @Override + public boolean startNestedScroll(int axes) { + return mScrollingChildHelper.startNestedScroll(axes); + } + + @Override + public void stopNestedScroll() { + mScrollingChildHelper.stopNestedScroll(); + } + + @Override + public boolean hasNestedScrollingParent() { + return mScrollingChildHelper.hasNestedScrollingParent(); + } + + @Override + public boolean dispatchNestedScroll(int dxConsumed, int dyConsumed, int dxUnconsumed, + int dyUnconsumed, int[] offsetInWindow) { + return mScrollingChildHelper.dispatchNestedScroll(dxConsumed, dyConsumed, + dxUnconsumed, dyUnconsumed, offsetInWindow); + } + + @Override + public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow) { + return mScrollingChildHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow); + } + + @Override + public boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed) { + return mScrollingChildHelper.dispatchNestedFling(velocityX, velocityY, consumed); + } + + @Override + public boolean dispatchNestedPreFling(float velocityX, float velocityY) { + return mScrollingChildHelper.dispatchNestedPreFling(velocityX, velocityY); + } + /** * {@link android.view.ViewGroup.MarginLayoutParams LayoutParams} subclass for children of * {@link RecyclerView}. Custom {@link LayoutManager layout managers} are encouraged @@ -9318,4 +9731,35 @@ public class RecyclerView extends ViewGroup implements ScrollingView { this.bottom = bottom; } } + + @Override + protected int getChildDrawingOrder(int childCount, int i) { + if (mChildDrawingOrderCallback == null) { + return super.getChildDrawingOrder(childCount, i); + } else { + return mChildDrawingOrderCallback.onGetChildDrawingOrder(childCount, i); + } + } + + /** + * A callback interface that can be used to alter the drawing order of RecyclerView children. + *

+ * It works using the {@link ViewGroup#getChildDrawingOrder(int, int)} method, so any case + * that applies to that method also applies to this callback. For example, changing the drawing + * order of two views will not have any effect if their elevation values are different since + * elevation overrides the result of this callback. + */ + public static interface ChildDrawingOrderCallback { + /** + * Returns the index of the child to draw for this iteration. Override this + * if you want to change the drawing order of children. By default, it + * returns i. + * + * @param i The current iteration. + * @return The index of the child to draw this iteration. + * + * @see RecyclerView#setChildDrawingOrderCallback(RecyclerView.ChildDrawingOrderCallback) + */ + public int onGetChildDrawingOrder(int childCount, int i); + } } diff --git a/TMessagesProj/src/main/java/org/telegram/android/support/widget/StaggeredGridLayoutManager.java b/TMessagesProj/src/main/java/org/telegram/android/support/widget/StaggeredGridLayoutManager.java index d28434a6..166311da 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/support/widget/StaggeredGridLayoutManager.java +++ b/TMessagesProj/src/main/java/org/telegram/android/support/widget/StaggeredGridLayoutManager.java @@ -537,7 +537,6 @@ public class StaggeredGridLayoutManager extends RecyclerView.LayoutManager { @Override public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) { ensureOrientationHelper(); - final AnchorInfo anchorInfo = mAnchorInfo; anchorInfo.reset(); @@ -577,21 +576,22 @@ public class StaggeredGridLayoutManager extends RecyclerView.LayoutManager { detachAndScrapAttachedViews(recycler); mLaidOutInvalidFullSpan = false; updateMeasureSpecs(); + updateLayoutState(anchorInfo.mPosition, state); if (anchorInfo.mLayoutFromEnd) { // Layout start. - updateLayoutStateToFillStart(anchorInfo.mPosition, state); + setLayoutStateDirection(LAYOUT_START); fill(recycler, mLayoutState, state); // Layout end. - updateLayoutStateToFillEnd(anchorInfo.mPosition, state); - mLayoutState.mCurrentPosition += mLayoutState.mItemDirection; + setLayoutStateDirection(LAYOUT_END); + mLayoutState.mCurrentPosition = anchorInfo.mPosition + mLayoutState.mItemDirection; fill(recycler, mLayoutState, state); } else { // Layout end. - updateLayoutStateToFillEnd(anchorInfo.mPosition, state); + setLayoutStateDirection(LAYOUT_END); fill(recycler, mLayoutState, state); // Layout start. - updateLayoutStateToFillStart(anchorInfo.mPosition, state); - mLayoutState.mCurrentPosition += mLayoutState.mItemDirection; + setLayoutStateDirection(LAYOUT_START); + mLayoutState.mCurrentPosition = anchorInfo.mPosition + mLayoutState.mItemDirection; fill(recycler, mLayoutState, state); } @@ -1254,40 +1254,37 @@ public class StaggeredGridLayoutManager extends RecyclerView.LayoutManager { } } - private void updateLayoutStateToFillStart(int anchorPosition, RecyclerView.State state) { + private void updateLayoutState(int anchorPosition, RecyclerView.State state) { mLayoutState.mAvailable = 0; mLayoutState.mCurrentPosition = anchorPosition; + int startExtra = 0; + int endExtra = 0; if (isSmoothScrolling()) { final int targetPos = state.getTargetScrollPosition(); - if (mShouldReverseLayout == targetPos < anchorPosition) { - mLayoutState.mExtra = 0; - } else { - mLayoutState.mExtra = mPrimaryOrientation.getTotalSpace(); + if (targetPos != NO_POSITION) { + if (mShouldReverseLayout == targetPos < anchorPosition) { + endExtra = mPrimaryOrientation.getTotalSpace(); + } else { + startExtra = mPrimaryOrientation.getTotalSpace(); + } } - } else { - mLayoutState.mExtra = 0; } - mLayoutState.mLayoutDirection = LAYOUT_START; - mLayoutState.mItemDirection = mShouldReverseLayout ? ITEM_DIRECTION_TAIL - : ITEM_DIRECTION_HEAD; + + // Line of the furthest row. + final boolean clipToPadding = getClipToPadding(); + if (clipToPadding) { + mLayoutState.mStartLine = mPrimaryOrientation.getStartAfterPadding() - startExtra; + mLayoutState.mEndLine = mPrimaryOrientation.getEndAfterPadding() + endExtra; + } else { + mLayoutState.mEndLine = mPrimaryOrientation.getEnd() + endExtra; + mLayoutState.mStartLine = -startExtra; + } } - private void updateLayoutStateToFillEnd(int anchorPosition, RecyclerView.State state) { - mLayoutState.mAvailable = 0; - mLayoutState.mCurrentPosition = anchorPosition; - if (isSmoothScrolling()) { - final int targetPos = state.getTargetScrollPosition(); - if (mShouldReverseLayout == targetPos > anchorPosition) { - mLayoutState.mExtra = 0; - } else { - mLayoutState.mExtra = mPrimaryOrientation.getTotalSpace(); - } - } else { - mLayoutState.mExtra = 0; - } - mLayoutState.mLayoutDirection = LAYOUT_END; - mLayoutState.mItemDirection = mShouldReverseLayout ? ITEM_DIRECTION_HEAD - : ITEM_DIRECTION_TAIL; + private void setLayoutStateDirection(int direction) { + mLayoutState.mLayoutDirection = direction; + mLayoutState.mItemDirection = (mShouldReverseLayout == (direction == LAYOUT_START)) ? + ITEM_DIRECTION_TAIL : ITEM_DIRECTION_HEAD; } @Override @@ -1383,31 +1380,25 @@ public class StaggeredGridLayoutManager extends RecyclerView.LayoutManager { mRemainingSpans.set(0, mSpanCount, true); // The target position we are trying to reach. final int targetLine; - /* - * The line until which we can recycle, as long as we add views. - * Keep in mind, it is still the line in layout direction which means; to calculate the - * actual recycle line, we should subtract/add the size in orientation. - */ - final int recycleLine; + // Line of the furthest row. if (layoutState.mLayoutDirection == LAYOUT_END) { - // ignore padding for recycler - recycleLine = mPrimaryOrientation.getEndAfterPadding() + mLayoutState.mAvailable; - targetLine = recycleLine + mLayoutState.mExtra + mPrimaryOrientation.getEndPadding(); - + targetLine = layoutState.mEndLine + layoutState.mAvailable; } else { // LAYOUT_START - // ignore padding for recycler - recycleLine = mPrimaryOrientation.getStartAfterPadding() - mLayoutState.mAvailable; - targetLine = recycleLine - mLayoutState.mExtra - - mPrimaryOrientation.getStartAfterPadding(); + targetLine = layoutState.mStartLine - layoutState.mAvailable; } + updateAllRemainingSpans(layoutState.mLayoutDirection, targetLine); + if (DEBUG) { + Log.d(TAG, "FILLING targetLine: " + targetLine + "," + + "remaining spans:" + mRemainingSpans + ", state: " + layoutState); + } // the default coordinate to add new view. final int defaultNewViewLine = mShouldReverseLayout ? mPrimaryOrientation.getEndAfterPadding() : mPrimaryOrientation.getStartAfterPadding(); - + boolean added = false; while (layoutState.hasMore(state) && !mRemainingSpans.isEmpty()) { View view = layoutState.next(recycler); LayoutParams lp = ((LayoutParams) view.getLayoutParams()); @@ -1500,18 +1491,21 @@ public class StaggeredGridLayoutManager extends RecyclerView.LayoutManager { } else { updateRemainingSpans(currentSpan, mLayoutState.mLayoutDirection, targetLine); } - recycle(recycler, mLayoutState, currentSpan, recycleLine); + recycle(recycler, mLayoutState); + added = true; } - if (DEBUG) { - Log.d(TAG, "fill, " + getChildCount()); + if (!added) { + recycle(recycler, mLayoutState); } + final int diff; if (mLayoutState.mLayoutDirection == LAYOUT_START) { final int minStart = getMinStart(mPrimaryOrientation.getStartAfterPadding()); - return Math.max(0, mLayoutState.mAvailable + (recycleLine - minStart)); + diff = mPrimaryOrientation.getStartAfterPadding() - minStart; } else { - final int max = getMaxEnd(mPrimaryOrientation.getEndAfterPadding()); - return Math.max(0, mLayoutState.mAvailable + (max - recycleLine)); + final int maxEnd = getMaxEnd(mPrimaryOrientation.getEndAfterPadding()); + diff = maxEnd - mPrimaryOrientation.getEndAfterPadding(); } + return diff > 0 ? Math.min(layoutState.mAvailable, diff) : 0; } private LazySpanLookup.FullSpanItem createFullSpanItemFromEnd(int newItemTop) { @@ -1548,19 +1542,40 @@ public class StaggeredGridLayoutManager extends RecyclerView.LayoutManager { } } - private void recycle(RecyclerView.Recycler recycler, LayoutState layoutState, - Span updatedSpan, int recycleLine) { - if (layoutState.mLayoutDirection == LAYOUT_START) { - // calculate recycle line - int maxStart = getMaxStart(updatedSpan.getStartLine()); - recycleFromEnd(recycler, Math.max(recycleLine, maxStart) + - (mPrimaryOrientation.getEnd() - mPrimaryOrientation.getStartAfterPadding())); + private void recycle(RecyclerView.Recycler recycler, LayoutState layoutState) { + if (layoutState.mAvailable == 0) { + // easy, recycle line is still valid + if (layoutState.mLayoutDirection == LAYOUT_START) { + recycleFromEnd(recycler, layoutState.mEndLine); + } else { + recycleFromStart(recycler, layoutState.mStartLine); + } } else { - // calculate recycle line - int minEnd = getMinEnd(updatedSpan.getEndLine()); - recycleFromStart(recycler, Math.min(recycleLine, minEnd) - - (mPrimaryOrientation.getEnd() - mPrimaryOrientation.getStartAfterPadding())); + // scrolling case, recycle line can be shifted by how much space we could cover + // by adding new views + if (layoutState.mLayoutDirection == LAYOUT_START) { + // calculate recycle line + int scrolled = layoutState.mStartLine - getMaxStart(layoutState.mStartLine); + final int line; + if (scrolled < 0) { + line = layoutState.mEndLine; + } else { + line = layoutState.mEndLine - Math.min(scrolled, layoutState.mAvailable); + } + recycleFromEnd(recycler, line); + } else { + // calculate recycle line + int scrolled = getMinEnd(layoutState.mEndLine) - layoutState.mEndLine; + final int line; + if (scrolled < 0) { + line = layoutState.mStartLine; + } else { + line = layoutState.mStartLine + Math.min(scrolled, layoutState.mAvailable); + } + recycleFromStart(recycler, line); + } } + } private void appendViewToAllSpans(View view) { @@ -1602,12 +1617,12 @@ public class StaggeredGridLayoutManager extends RecyclerView.LayoutManager { final int deletedSize = span.getDeletedSize(); if (layoutDir == LAYOUT_START) { final int line = span.getStartLine(); - if (line + deletedSize < targetLine) { + if (line + deletedSize <= targetLine) { mRemainingSpans.set(span.mIndex, false); } } else { final int line = span.getEndLine(); - if (line - deletedSize > targetLine) { + if (line - deletedSize >= targetLine) { mRemainingSpans.set(span.mIndex, false); } } @@ -1678,18 +1693,24 @@ public class StaggeredGridLayoutManager extends RecyclerView.LayoutManager { } private void recycleFromStart(RecyclerView.Recycler recycler, int line) { - if (DEBUG) { - Log.d(TAG, "recycling from start for line " + line); - } while (getChildCount() > 0) { View child = getChildAt(0); - if (mPrimaryOrientation.getDecoratedEnd(child) < line) { + if (mPrimaryOrientation.getDecoratedEnd(child) <= line) { LayoutParams lp = (LayoutParams) child.getLayoutParams(); + // Don't recycle the last View in a span not to lose span's start/end lines if (lp.mFullSpan) { + for (int j = 0; j < mSpanCount; j++) { + if (mSpans[j].mViews.size() == 1) { + return; + } + } for (int j = 0; j < mSpanCount; j++) { mSpans[j].popStart(); } } else { + if (lp.mSpan.mViews.size() == 1) { + return; + } lp.mSpan.popStart(); } removeAndRecycleView(child, recycler); @@ -1704,13 +1725,22 @@ public class StaggeredGridLayoutManager extends RecyclerView.LayoutManager { int i; for (i = childCount - 1; i >= 0; i--) { View child = getChildAt(i); - if (mPrimaryOrientation.getDecoratedStart(child) > line) { + if (mPrimaryOrientation.getDecoratedStart(child) >= line) { LayoutParams lp = (LayoutParams) child.getLayoutParams(); + // Don't recycle the last View in a span not to lose span's start/end lines if (lp.mFullSpan) { + for (int j = 0; j < mSpanCount; j++) { + if (mSpans[j].mViews.size() == 1) { + return; + } + } for (int j = 0; j < mSpanCount; j++) { mSpans[j].popEnd(); } } else { + if (lp.mSpan.mViews.size() == 1) { + return; + } lp.mSpan.popEnd(); } removeAndRecycleView(child, recycler); @@ -1860,21 +1890,19 @@ public class StaggeredGridLayoutManager extends RecyclerView.LayoutManager { int scrollBy(int dt, RecyclerView.Recycler recycler, RecyclerView.State state) { ensureOrientationHelper(); final int referenceChildPosition; + final int layoutDir; if (dt > 0) { // layout towards end - mLayoutState.mLayoutDirection = LAYOUT_END; - mLayoutState.mItemDirection = mShouldReverseLayout ? ITEM_DIRECTION_HEAD - : ITEM_DIRECTION_TAIL; + layoutDir = LAYOUT_END; referenceChildPosition = getLastChildPosition(); } else { - mLayoutState.mLayoutDirection = LAYOUT_START; - mLayoutState.mItemDirection = mShouldReverseLayout ? ITEM_DIRECTION_TAIL - : ITEM_DIRECTION_HEAD; + layoutDir = LAYOUT_START; referenceChildPosition = getFirstChildPosition(); } + updateLayoutState(referenceChildPosition, state); + setLayoutStateDirection(layoutDir); mLayoutState.mCurrentPosition = referenceChildPosition + mLayoutState.mItemDirection; final int absDt = Math.abs(dt); mLayoutState.mAvailable = absDt; - mLayoutState.mExtra = isSmoothScrolling() ? mPrimaryOrientation.getTotalSpace() : 0; int consumed = fill(recycler, mLayoutState, state); final int totalScroll; if (absDt < consumed) { diff --git a/TMessagesProj/src/main/java/org/telegram/android/support/widget/util/SortedListAdapterCallback.java b/TMessagesProj/src/main/java/org/telegram/android/support/widget/util/SortedListAdapterCallback.java index 44ddd667..2457f493 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/support/widget/util/SortedListAdapterCallback.java +++ b/TMessagesProj/src/main/java/org/telegram/android/support/widget/util/SortedListAdapterCallback.java @@ -16,7 +16,7 @@ package org.telegram.android.support.widget.util; -import android.support.v7.util.SortedList; +import org.telegram.android.support.util.SortedList; import org.telegram.android.support.widget.RecyclerView; /** diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ApplicationLoader.java b/TMessagesProj/src/main/java/org/telegram/messenger/ApplicationLoader.java index dd8ae648..b74e5c27 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ApplicationLoader.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ApplicationLoader.java @@ -31,13 +31,13 @@ import com.google.android.gms.gcm.GoogleCloudMessaging; import org.telegram.android.AndroidUtilities; import org.telegram.android.ContactsController; -import org.telegram.android.MediaController; -import org.telegram.android.NotificationsService; -import org.telegram.android.SendMessagesHelper; import org.telegram.android.LocaleController; +import org.telegram.android.MediaController; import org.telegram.android.MessagesController; import org.telegram.android.NativeLoader; +import org.telegram.android.NotificationsService; import org.telegram.android.ScreenReceiver; +import org.telegram.android.SendMessagesHelper; import org.telegram.ui.Components.ForegroundDetector; import java.io.File; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ConnectionsManager.java b/TMessagesProj/src/main/java/org/telegram/messenger/ConnectionsManager.java index 928d5e57..3f1dafe5 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ConnectionsManager.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ConnectionsManager.java @@ -363,7 +363,7 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection. try { SerializedData data = new SerializedData(configFile); isTestBackend = data.readInt32(false); - int version = data.readInt32(false); + data.readInt32(false); sessionsToDestroy.clear(); int count = data.readInt32(false); for (int a = 0; a < count; a++) { @@ -2700,7 +2700,7 @@ public class ConnectionsManager implements Action.ActionDelegate, TcpConnection. return; } - int messageLength = data.readInt32(false); + data.readInt32(false); TLObject message = deserialize(getRequestWithMessageId(messageId), data, true); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java index ba544e8b..0e5753df 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoadOperation.java @@ -28,6 +28,7 @@ public class FileLoadOperation { private final static int stateFinished = 3; private final static int downloadChunkSize = 1024 * 32; + private final static int downloadChunkSizeBig = 1024 * 128; private final static int maxDownloadRequests = 3; private int datacenter_id; @@ -38,6 +39,7 @@ public class FileLoadOperation { private FileLoadOperationDelegate delegate; private byte[] key; private byte[] iv; + private int currentDownloadChunkSize; private int nextDownloadOffset = 0; private ArrayList requestInfos = new ArrayList<>(maxDownloadRequests); @@ -171,6 +173,7 @@ public class FileLoadOperation { if (state != stateIdle) { return; } + currentDownloadChunkSize = totalBytesCount >= 1024 * 1024 * 30 ? downloadChunkSizeBig : downloadChunkSize; state = stateDownloading; if (location == null) { Utilities.stageQueue.postRunnable(new Runnable() { @@ -181,7 +184,6 @@ public class FileLoadOperation { }); return; } - Long mediaId = null; String fileNameFinal; String fileNameTemp; String fileNameIv = null; @@ -239,7 +241,7 @@ public class FileLoadOperation { cacheFileTemp = new File(tempPath, fileNameTemp); if (cacheFileTemp.exists()) { downloadedBytes = (int)cacheFileTemp.length(); - nextDownloadOffset = downloadedBytes = downloadedBytes / 1024 * 1024; + nextDownloadOffset = downloadedBytes = downloadedBytes / currentDownloadChunkSize * currentDownloadChunkSize; } if (fileNameIv != null) { cacheIvTemp = new File(tempPath, fileNameIv); @@ -404,10 +406,10 @@ public class FileLoadOperation { } } - if (currentBytesSize != downloadChunkSize) { + if (currentBytesSize != currentDownloadChunkSize) { onFinishLoadingFile(); } else { - if (totalBytesCount != downloadedBytes && downloadedBytes % downloadChunkSize == 0 || totalBytesCount > 0 && totalBytesCount > downloadedBytes) { + if (totalBytesCount != downloadedBytes && downloadedBytes % currentDownloadChunkSize == 0 || totalBytesCount > 0 && totalBytesCount > downloadedBytes) { startDownloadRequest(); } else { onFinishLoadingFile(); @@ -438,7 +440,7 @@ public class FileLoadOperation { startDownloadRequest(); } } else if (error.text.contains("OFFSET_INVALID")) { - if (downloadedBytes % downloadChunkSize == 0) { + if (downloadedBytes % currentDownloadChunkSize == 0) { try { onFinishLoadingFile(); } catch (Exception e) { @@ -476,12 +478,12 @@ public class FileLoadOperation { if (totalBytesCount > 0 && nextDownloadOffset >= totalBytesCount) { break; } - boolean isLast = totalBytesCount <= 0 || a == count - 1 || totalBytesCount > 0 && nextDownloadOffset + downloadChunkSize >= totalBytesCount; + boolean isLast = totalBytesCount <= 0 || a == count - 1 || totalBytesCount > 0 && nextDownloadOffset + currentDownloadChunkSize >= totalBytesCount; TLRPC.TL_upload_getFile req = new TLRPC.TL_upload_getFile(); req.location = location; req.offset = nextDownloadOffset; - req.limit = downloadChunkSize; - nextDownloadOffset += downloadChunkSize; + req.limit = currentDownloadChunkSize; + nextDownloadOffset += currentDownloadChunkSize; final RequestInfo requestInfo = new RequestInfo(); requestInfos.add(requestInfo); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java index b6bb1a1b..7cc6454f 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileLoader.java @@ -679,6 +679,15 @@ public class FileLoader { return closestObject; } + public static String getFileExtension(File file) { + String name = file.getName(); + try { + return name.substring(name.lastIndexOf(".") + 1); + } catch (Exception e) { + return ""; + } + } + public static String getDocumentFileName(TLRPC.Document document) { if (document != null) { if (document.file_name != null) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/HandshakeAction.java b/TMessagesProj/src/main/java/org/telegram/messenger/HandshakeAction.java index 7043dca5..b99706fe 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/HandshakeAction.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/HandshakeAction.java @@ -637,7 +637,7 @@ public class HandshakeAction extends Action implements TcpConnection.TcpConnecti FileLog.d("tmessages", String.format("===== Duplicate message id %d received, ignoring", messageId)); return; } - int messageLength = data.readInt32(false); + data.readInt32(false); int constructor = data.readInt32(false); TLObject object = TLClassStore.Instance().TLdeserialize(data, constructor, false); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/TLRPC.java b/TMessagesProj/src/main/java/org/telegram/messenger/TLRPC.java index 5de616dc..954025cc 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/TLRPC.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/TLRPC.java @@ -11634,6 +11634,9 @@ public class TLRPC { case 0x9eddf188: result = new TL_inputMessagesFilterDocument(); break; + case 0x5afbf764: + result = new TL_inputMessagesFilterAudioDocuments(); + break; case 0x9fc00e65: result = new TL_inputMessagesFilterVideo(); break; @@ -11672,6 +11675,15 @@ public class TLRPC { } } + public static class TL_inputMessagesFilterAudioDocuments extends MessagesFilter { + public static int constructor = 0x5afbf764; + + + public void serializeToStream(AbsSerializedData stream) { + stream.writeInt32(constructor); + } + } + public static class TL_inputMessagesFilterVideo extends MessagesFilter { public static int constructor = 0x9fc00e65; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/TcpConnection.java b/TMessagesProj/src/main/java/org/telegram/messenger/TcpConnection.java index 217e63fb..417d5c4e 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/TcpConnection.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/TcpConnection.java @@ -143,7 +143,7 @@ public class TcpConnection extends ConnectionContext { FileLog.e("tmessages", e2); } - FileLog.d("tmessages", String.format(TcpConnection.this + " Connecting (%s:%d)", hostAddress, hostPort)); + FileLog.d("tmessages", String.format(TcpConnection.this + " Connecting (%s:%d), connection class %d", hostAddress, hostPort, transportRequestClass)); firstPacket = true; if (restOfTheData != null) { BuffersStorage.getInstance().reuseFreeBuffer(restOfTheData); 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 5cf1f2c2..257237e9 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBar.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBar.java @@ -15,7 +15,6 @@ import android.os.Build; import android.text.TextUtils; import android.util.TypedValue; import android.view.Gravity; -import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.widget.FrameLayout; @@ -23,6 +22,7 @@ import android.widget.ImageView; import android.widget.TextView; import org.telegram.android.AndroidUtilities; +import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.R; import org.telegram.ui.Components.LayoutHelper; @@ -38,7 +38,6 @@ public class ActionBar extends FrameLayout { } } - private FrameLayout titleFrameLayout; private ImageView backButtonImageView; private TextView titleTextView; private TextView subTitleTextView; @@ -60,116 +59,6 @@ public class ActionBar extends FrameLayout { public ActionBar(Context context) { super(context); - titleFrameLayout = new FrameLayout(context); - addView(titleFrameLayout); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams)titleFrameLayout.getLayoutParams(); - layoutParams.width = LayoutHelper.WRAP_CONTENT; - layoutParams.height = LayoutHelper.MATCH_PARENT; - layoutParams.gravity = Gravity.TOP | Gravity.LEFT; - titleFrameLayout.setLayoutParams(layoutParams); - titleFrameLayout.setPadding(0, 0, AndroidUtilities.dp(4), 0); - titleFrameLayout.setEnabled(false); - } - - private void positionBackImage(int height) { - if (backButtonImageView != null) { - LayoutParams layoutParams = (LayoutParams)backButtonImageView.getLayoutParams(); - layoutParams.width = AndroidUtilities.dp(54); - layoutParams.height = height; - layoutParams.gravity = Gravity.TOP | Gravity.LEFT; - backButtonImageView.setLayoutParams(layoutParams); - } - } - - private void positionTitle(int width, int height) { - int offset = AndroidUtilities.dp(2); - if (!AndroidUtilities.isTablet() && getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { - offset = AndroidUtilities.dp(1); - } - int maxTextWidth = 0; - - LayoutParams layoutParams; - - if (titleTextView != null && titleTextView.getVisibility() == VISIBLE) { - if (!AndroidUtilities.isTablet() && getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { - titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); - } else { - titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); - } - - layoutParams = (LayoutParams) titleTextView.getLayoutParams(); - layoutParams.width = LayoutHelper.WRAP_CONTENT; - layoutParams.height = LayoutHelper.WRAP_CONTENT; - layoutParams.gravity = Gravity.TOP | Gravity.LEFT; - titleTextView.setLayoutParams(layoutParams); - titleTextView.measure(width, height); - maxTextWidth = titleTextView.getMeasuredWidth(); - } - if (subTitleTextView != null && subTitleTextView.getVisibility() == VISIBLE) { - if (!AndroidUtilities.isTablet() && getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { - subTitleTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); - } else { - subTitleTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); - } - - layoutParams = (LayoutParams) subTitleTextView.getLayoutParams(); - layoutParams.width = LayoutHelper.WRAP_CONTENT; - layoutParams.height = LayoutHelper.WRAP_CONTENT; - layoutParams.gravity = Gravity.TOP | Gravity.LEFT; - subTitleTextView.setLayoutParams(layoutParams); - subTitleTextView.measure(width, height); - maxTextWidth = Math.max(maxTextWidth, subTitleTextView.getMeasuredWidth()); - } - - int x; - if (backButtonImageView != null && backButtonImageView.getVisibility() == VISIBLE) { - x = AndroidUtilities.dp(AndroidUtilities.isTablet() ? 80 : 72); - } else { - x = AndroidUtilities.dp(AndroidUtilities.isTablet() ? 26 : 18); - } - - if (menu != null) { - maxTextWidth = Math.min(maxTextWidth, width - menu.getMeasuredWidth() - AndroidUtilities.dp(16) - x); - } - - if (titleTextView != null && titleTextView.getVisibility() == VISIBLE) { - layoutParams = (LayoutParams) titleTextView.getLayoutParams(); - layoutParams.width = LayoutHelper.MATCH_PARENT; - layoutParams.height = titleTextView.getMeasuredHeight(); - int y; - if (subTitleTextView != null && subTitleTextView.getVisibility() == VISIBLE) { - y = (height / 2 - titleTextView.getMeasuredHeight()) / 2 + offset; - } else { - y = (height - titleTextView.getMeasuredHeight()) / 2 - AndroidUtilities.dp(1); - } - layoutParams.setMargins(x, y, 0, 0); - titleTextView.setLayoutParams(layoutParams); - } - if (subTitleTextView != null && subTitleTextView.getVisibility() == VISIBLE) { - layoutParams = (LayoutParams) subTitleTextView.getLayoutParams(); - layoutParams.width = LayoutHelper.MATCH_PARENT; - layoutParams.height = subTitleTextView.getMeasuredHeight(); - layoutParams.setMargins(x, height / 2 + (height / 2 - subTitleTextView.getMeasuredHeight()) / 2 - offset, 0, 0); - subTitleTextView.setLayoutParams(layoutParams); - } - - MarginLayoutParams layoutParams1 = (MarginLayoutParams) titleFrameLayout.getLayoutParams(); - layoutParams1.width = x + maxTextWidth + (isSearchFieldVisible ? 0 : AndroidUtilities.dp(6)); - layoutParams1.topMargin = occupyStatusBar ? AndroidUtilities.statusBarHeight : 0; - titleFrameLayout.setLayoutParams(layoutParams1); - } - - public void positionMenu(int width, int height) { - if (menu == null) { - return; - } - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams)menu.getLayoutParams(); - layoutParams.width = isSearchFieldVisible ? LayoutHelper.MATCH_PARENT : LayoutHelper.WRAP_CONTENT; - layoutParams.height = height; - layoutParams.leftMargin = isSearchFieldVisible ? AndroidUtilities.dp(AndroidUtilities.isTablet() ? 74 : 66) : 0; - layoutParams.topMargin = occupyStatusBar ? AndroidUtilities.statusBarHeight : 0; - menu.setLayoutParams(layoutParams); - menu.measure(width, height); } private void createBackButtonImage() { @@ -177,9 +66,10 @@ public class ActionBar extends FrameLayout { return; } backButtonImageView = new ImageView(getContext()); - titleFrameLayout.addView(backButtonImageView); backButtonImageView.setScaleType(ImageView.ScaleType.CENTER); backButtonImageView.setBackgroundResource(itemsBackgroundResourceId); + addView(backButtonImageView, LayoutHelper.createFrame(54, 54, Gravity.LEFT | Gravity.TOP)); + backButtonImageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { @@ -195,31 +85,19 @@ public class ActionBar extends FrameLayout { } public void setBackButtonDrawable(Drawable drawable) { - boolean reposition = false; if (backButtonImageView == null) { createBackButtonImage(); - } else { - reposition = true; } backButtonImageView.setVisibility(drawable == null ? GONE : VISIBLE); backButtonImageView.setImageDrawable(drawable); - if (reposition) { - positionTitle(getMeasuredWidth(), getMeasuredHeight()); - } } public void setBackButtonImage(int resource) { - boolean reposition = false; if (backButtonImageView == null) { createBackButtonImage(); - } else { - reposition = true; } backButtonImageView.setVisibility(resource == 0 ? GONE : VISIBLE); backButtonImageView.setImageResource(resource); - if (reposition) { - positionTitle(getMeasuredWidth(), getMeasuredHeight()); - } } private void createSubtitleTextView() { @@ -227,13 +105,13 @@ public class ActionBar extends FrameLayout { return; } subTitleTextView = new TextView(getContext()); - titleFrameLayout.addView(subTitleTextView); subTitleTextView.setGravity(Gravity.LEFT); subTitleTextView.setTextColor(0xffd7e8f7); subTitleTextView.setSingleLine(true); subTitleTextView.setLines(1); subTitleTextView.setMaxLines(1); subTitleTextView.setEllipsize(TextUtils.TruncateAt.END); + addView(subTitleTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP)); } public void setSubtitle(CharSequence value) { @@ -243,22 +121,6 @@ public class ActionBar extends FrameLayout { if (subTitleTextView != null) { subTitleTextView.setVisibility(value != null && !isSearchFieldVisible ? VISIBLE : INVISIBLE); subTitleTextView.setText(value); - positionTitle(getMeasuredWidth(), getMeasuredHeight()); - } - } - - public void setSubTitleIcon(int resourceId, Drawable drawable, int padding) { - if ((resourceId != 0 || drawable != null) && subTitleTextView == null) { - createSubtitleTextView(); - positionTitle(getMeasuredWidth(), getMeasuredHeight()); - } - if (subTitleTextView != null) { - if (drawable != null) { - subTitleTextView.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null); - } else { - subTitleTextView.setCompoundDrawablesWithIntrinsicBounds(resourceId, 0, 0, 0); - } - subTitleTextView.setCompoundDrawablePadding(padding); } } @@ -268,39 +130,32 @@ public class ActionBar extends FrameLayout { } titleTextView = new TextView(getContext()); titleTextView.setGravity(Gravity.LEFT); - titleTextView.setSingleLine(true); titleTextView.setLines(1); titleTextView.setMaxLines(1); + titleTextView.setSingleLine(true); titleTextView.setEllipsize(TextUtils.TruncateAt.END); - titleFrameLayout.addView(titleTextView); titleTextView.setTextColor(0xffffffff); titleTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); + addView(titleTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP)); } public void setTitle(CharSequence value) { - boolean created = false; if (value != null && titleTextView == null) { createTitleTextView(); - created = true; } if (titleTextView != null) { lastTitle = value; titleTextView.setVisibility(value != null && !isSearchFieldVisible ? VISIBLE : INVISIBLE); titleTextView.setText(value); - positionTitle(getMeasuredWidth(), getMeasuredHeight()); - if (!created) { - titleTextView.setText(value); - } } } - public void setTitleIcon(int resourceId, int padding) { - if (resourceId != 0 && titleTextView == null) { - createTitleTextView(); - positionTitle(getMeasuredWidth(), getMeasuredHeight()); - } - titleTextView.setCompoundDrawablesWithIntrinsicBounds(resourceId, 0, 0, 0); - titleTextView.setCompoundDrawablePadding(padding); + public TextView getSubTitleTextView() { + return subTitleTextView; + } + + public TextView getTitleTextView() { + return titleTextView; } public Drawable getSubTitleIcon() { @@ -322,6 +177,7 @@ public class ActionBar extends FrameLayout { titleTextView.setTextColor(color); } } + public ActionBarMenu createMenu() { if (menu != null) { return menu; @@ -340,17 +196,6 @@ public class ActionBar extends FrameLayout { actionBarMenuOnItemClick = listener; } - public void setCustomView(int resourceId) { - LayoutInflater li = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); - View view = li.inflate(resourceId, null); - addView(view); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams)view.getLayoutParams(); - layoutParams.width = LayoutHelper.MATCH_PARENT; - layoutParams.height = LayoutHelper.MATCH_PARENT; - layoutParams.topMargin = occupyStatusBar ? AndroidUtilities.statusBarHeight : 0; - view.setLayoutParams(layoutParams); - } - public ActionBarMenu createActionMode() { if (actionMode != null) { return actionMode; @@ -366,7 +211,7 @@ public class ActionBar extends FrameLayout { actionMode.setLayoutParams(layoutParams); actionMode.setVisibility(INVISIBLE); - if (occupyStatusBar) { + if (occupyStatusBar && actionModeTop == null) { actionModeTop = new View(getContext()); actionModeTop.setBackgroundColor(0x99000000); addView(actionModeTop); @@ -389,8 +234,14 @@ public class ActionBar extends FrameLayout { if (occupyStatusBar && actionModeTop != null) { actionModeTop.setVisibility(VISIBLE); } - if (titleFrameLayout != null) { - titleFrameLayout.setVisibility(INVISIBLE); + if (titleTextView != null) { + titleTextView.setVisibility(INVISIBLE); + } + if (subTitleTextView != null) { + subTitleTextView.setVisibility(INVISIBLE); + } + if (backButtonImageView != null) { + backButtonImageView.setVisibility(INVISIBLE); } if (menu != null) { menu.setVisibility(INVISIBLE); @@ -405,14 +256,33 @@ public class ActionBar extends FrameLayout { if (occupyStatusBar && actionModeTop != null) { actionModeTop.setVisibility(INVISIBLE); } - if (titleFrameLayout != null) { - titleFrameLayout.setVisibility(VISIBLE); + if (titleTextView != null) { + titleTextView.setVisibility(VISIBLE); + } + if (subTitleTextView != null) { + subTitleTextView.setVisibility(VISIBLE); + } + if (backButtonImageView != null) { + backButtonImageView.setVisibility(VISIBLE); } if (menu != null) { menu.setVisibility(VISIBLE); } } + public void showActionModeTop() { + if (occupyStatusBar && actionModeTop == null) { + actionModeTop = new View(getContext()); + actionModeTop.setBackgroundColor(0x99000000); + addView(actionModeTop); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) actionModeTop.getLayoutParams(); + layoutParams.height = AndroidUtilities.statusBarHeight; + layoutParams.width = LayoutHelper.MATCH_PARENT; + layoutParams.gravity = Gravity.TOP | Gravity.LEFT; + actionModeTop.setLayoutParams(layoutParams); + } + } + public boolean isActionModeShowed() { return actionMode != null && actionMode.getVisibility() == VISIBLE; } @@ -447,12 +317,136 @@ public class ActionBar extends FrameLayout { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - int actionBarHeight = AndroidUtilities.getCurrentActionBarHeight(); - positionBackImage(actionBarHeight); - positionMenu(MeasureSpec.getSize(widthMeasureSpec), actionBarHeight); - positionTitle(MeasureSpec.getSize(widthMeasureSpec), actionBarHeight); - actionBarHeight += occupyStatusBar ? AndroidUtilities.statusBarHeight : 0; - super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(actionBarHeight + extraHeight, MeasureSpec.EXACTLY)); + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + int actionBarHeight = getCurrentActionBarHeight(); + int actionBarHeightSpec = MeasureSpec.makeMeasureSpec(actionBarHeight, MeasureSpec.EXACTLY); + + setMeasuredDimension(width, actionBarHeight + extraHeight + (occupyStatusBar ? AndroidUtilities.statusBarHeight : 0)); + + int textLeft; + if (backButtonImageView != null && backButtonImageView.getVisibility() != GONE) { + backButtonImageView.measure(MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(54), MeasureSpec.EXACTLY), actionBarHeightSpec); + textLeft = AndroidUtilities.dp(AndroidUtilities.isTablet() ? 80 : 72); + } else { + textLeft = AndroidUtilities.dp(AndroidUtilities.isTablet() ? 26 : 18); + } + + if (menu != null && menu.getVisibility() != GONE) { + int menuWidth; + if (isSearchFieldVisible) { + menuWidth = MeasureSpec.makeMeasureSpec(width - AndroidUtilities.dp(AndroidUtilities.isTablet() ? 74 : 66), MeasureSpec.EXACTLY); + } else { + menuWidth = MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST); + } + menu.measure(menuWidth, actionBarHeightSpec); + } + + if (titleTextView != null && titleTextView.getVisibility() != GONE || subTitleTextView != null && subTitleTextView.getVisibility() != GONE) { + int availableWidth = width - (menu != null ? menu.getMeasuredWidth() : 0) - AndroidUtilities.dp(16) - textLeft; + + if (titleTextView != null && titleTextView.getVisibility() != GONE) { + titleTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, !AndroidUtilities.isTablet() && getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ? 18 : 20); + titleTextView.measure(MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(actionBarHeight, MeasureSpec.AT_MOST)); + + } + if (subTitleTextView != null && subTitleTextView.getVisibility() != GONE) { + subTitleTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, !AndroidUtilities.isTablet() && getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ? 14 : 16); + subTitleTextView.measure(MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(actionBarHeight, MeasureSpec.AT_MOST)); + } + } + + int childCount = getChildCount(); + for (int i = 0; i < childCount; i++) { + View child = getChildAt(i); + if (child.getVisibility() == GONE || child == titleTextView || child == subTitleTextView || child == menu || child == backButtonImageView) { + continue; + } + measureChildWithMargins(child, widthMeasureSpec, 0, MeasureSpec.makeMeasureSpec(getMeasuredHeight(), MeasureSpec.EXACTLY), 0); + } + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + int additionalTop = occupyStatusBar ? AndroidUtilities.statusBarHeight : 0; + + int textLeft; + if (backButtonImageView != null && backButtonImageView.getVisibility() != GONE) { + backButtonImageView.layout(0, additionalTop, backButtonImageView.getMeasuredWidth(), additionalTop + backButtonImageView.getMeasuredHeight()); + textLeft = AndroidUtilities.dp(AndroidUtilities.isTablet() ? 80 : 72); + } else { + textLeft = AndroidUtilities.dp(AndroidUtilities.isTablet() ? 26 : 18); + } + + if (menu != null && menu.getVisibility() != GONE) { + int menuLeft = isSearchFieldVisible ? AndroidUtilities.dp(AndroidUtilities.isTablet() ? 74 : 66) : (right - left) - menu.getMeasuredWidth(); + menu.layout(menuLeft, additionalTop, menuLeft + menu.getMeasuredWidth(), additionalTop + menu.getMeasuredHeight()); + } + + int offset = AndroidUtilities.dp(!AndroidUtilities.isTablet() && getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ? 1 : 2); + if (titleTextView != null && titleTextView.getVisibility() != GONE) { + int textTop; + if (subTitleTextView != null && subTitleTextView.getVisibility() != GONE) { + textTop = (getCurrentActionBarHeight() / 2 - titleTextView.getMeasuredHeight()) / 2 + offset; + } else { + textTop = (getCurrentActionBarHeight() - titleTextView.getMeasuredHeight()) / 2 - AndroidUtilities.dp(1); + } + titleTextView.layout(textLeft, additionalTop + textTop, textLeft + titleTextView.getMeasuredWidth(), additionalTop + textTop + titleTextView.getMeasuredHeight()); + } + if (subTitleTextView != null && subTitleTextView.getVisibility() != GONE) { + int textTop = getCurrentActionBarHeight() / 2 + (getCurrentActionBarHeight() / 2 - subTitleTextView.getMeasuredHeight()) / 2 - offset; + subTitleTextView.layout(textLeft, additionalTop + textTop, textLeft + subTitleTextView.getMeasuredWidth(), additionalTop + textTop + subTitleTextView.getMeasuredHeight()); + } + + int childCount = getChildCount(); + for (int i = 0; i < childCount; i++) { + View child = getChildAt(i); + if (child.getVisibility() == GONE || child == titleTextView || child == subTitleTextView || child == menu || child == backButtonImageView) { + continue; + } + + LayoutParams lp = (LayoutParams) child.getLayoutParams(); + + int width = child.getMeasuredWidth(); + int height = child.getMeasuredHeight(); + int childLeft; + int childTop; + + int gravity = lp.gravity; + if (gravity == -1) { + gravity = Gravity.TOP | Gravity.LEFT; + } + + final int absoluteGravity = gravity & Gravity.HORIZONTAL_GRAVITY_MASK; + final int verticalGravity = gravity & Gravity.VERTICAL_GRAVITY_MASK; + + switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) { + case Gravity.CENTER_HORIZONTAL: + childLeft = (right - left - width) / 2 + lp.leftMargin - lp.rightMargin; + break; + case Gravity.RIGHT: + childLeft = right - width - lp.rightMargin; + break; + case Gravity.LEFT: + default: + childLeft = lp.leftMargin; + } + + switch (verticalGravity) { + case Gravity.TOP: + childTop = lp.topMargin; + break; + case Gravity.CENTER_VERTICAL: + childTop = (bottom - top - height) / 2 + lp.topMargin - lp.bottomMargin; + break; + case Gravity.BOTTOM: + childTop = (bottom - top) - height - lp.bottomMargin; + break; + default: + childTop = lp.topMargin; + } + child.layout(childLeft, childTop, childLeft + width, childTop + height); + } } public void onMenuButtonPressed() { @@ -482,10 +476,13 @@ public class ActionBar extends FrameLayout { if (titleTextView != null) { titleTextView.setVisibility(textToSet != null && !isSearchFieldVisible ? VISIBLE : INVISIBLE); titleTextView.setText(textToSet); - positionTitle(getMeasuredWidth(), getMeasuredHeight()); } } + public boolean isSearchFieldVisible() { + return isSearchFieldVisible; + } + public void setExtraHeight(int value, boolean layout) { extraHeight = value; if (layout) { @@ -513,7 +510,7 @@ public class ActionBar extends FrameLayout { if (backButtonImageView != null) { backButtonImageView.setBackgroundResource(itemsBackgroundResourceId); } - setBackgroundColor(AndroidUtilities.getIntColor("themeColor")); //Plus + setBackgroundColor(AndroidUtilities.getIntColor("themeColor")); //Plus } public void setCastShadows(boolean value) { @@ -529,4 +526,14 @@ public class ActionBar extends FrameLayout { super.onTouchEvent(event); return true; } + + public static int getCurrentActionBarHeight() { + if (AndroidUtilities.isTablet()) { + return AndroidUtilities.dp(64); + } else if (ApplicationLoader.applicationContext.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { + return AndroidUtilities.dp(48); + } else { + return AndroidUtilities.dp(56); + } + } } \ No newline at end of file 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 68b3b28b..f74d7c4d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarLayout.java @@ -59,7 +59,7 @@ public class ActionBarLayout extends FrameLayout { if (child instanceof ActionBar) { return super.drawChild(canvas, child, drawingTime); } else { - boolean wasActionBar = false; + //boolean wasActionBar = false; int actionBarHeight = 0; int childCount = getChildCount(); for (int a = 0; a < childCount; a++) { @@ -339,7 +339,7 @@ public class ActionBarLayout extends FrameLayout { BaseFragment lastFragment = fragmentsStack.get(fragmentsStack.size() - 2); View fragmentView = lastFragment.fragmentView; if (fragmentView == null) { - fragmentView = lastFragment.createView(parentActivity, parentActivity.getLayoutInflater()); + fragmentView = lastFragment.createView(parentActivity); } else { ViewGroup parent = (ViewGroup) fragmentView.getParent(); if (parent != null) { @@ -625,7 +625,7 @@ public class ActionBarLayout extends FrameLayout { fragment.setParentLayout(this); View fragmentView = fragment.fragmentView; if (fragmentView == null) { - fragmentView = fragment.createView(parentActivity, parentActivity.getLayoutInflater()); + fragmentView = fragment.createView(parentActivity); } else { ViewGroup parent = (ViewGroup) fragmentView.getParent(); if (parent != null) { @@ -829,7 +829,7 @@ public class ActionBarLayout extends FrameLayout { previousFragment.setParentLayout(this); View fragmentView = previousFragment.fragmentView; if (fragmentView == null) { - fragmentView = previousFragment.createView(parentActivity, parentActivity.getLayoutInflater()); + fragmentView = previousFragment.createView(parentActivity); } else { ViewGroup parent = (ViewGroup) fragmentView.getParent(); if (parent != null) { @@ -972,7 +972,7 @@ public class ActionBarLayout extends FrameLayout { previousFragment.setParentLayout(this); View fragmentView = previousFragment.fragmentView; if (fragmentView == null) { - fragmentView = previousFragment.createView(parentActivity, parentActivity.getLayoutInflater()); + fragmentView = previousFragment.createView(parentActivity); } else { ViewGroup parent = (ViewGroup) fragmentView.getParent(); if (parent != null) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenu.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenu.java index e1fa67f7..64cb65aa 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenu.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenu.java @@ -36,7 +36,7 @@ public class ActionBarMenu extends LinearLayout { View view = li.inflate(resourceId, null); view.setTag(id); addView(view); - LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams)view.getLayoutParams(); + LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) view.getLayoutParams(); layoutParams.height = LayoutHelper.MATCH_PARENT; view.setBackgroundResource(parentActionBar.itemsBackgroundResourceId); view.setLayoutParams(layoutParams); @@ -78,14 +78,14 @@ public class ActionBarMenu extends LinearLayout { menuItem.iconView.setImageResource(icon); } addView(menuItem); - LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams)menuItem.getLayoutParams(); + LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) menuItem.getLayoutParams(); layoutParams.height = LayoutHelper.MATCH_PARENT; layoutParams.width = width; menuItem.setLayoutParams(layoutParams); menuItem.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { - ActionBarMenuItem item = (ActionBarMenuItem)view; + ActionBarMenuItem item = (ActionBarMenuItem) view; if (item.hasSubMenu()) { if (parentActionBar.actionBarMenuOnItemClick.canOpenMenu()) { item.toggleSubMenu(); @@ -93,7 +93,7 @@ public class ActionBarMenu extends LinearLayout { } else if (item.isSearchField()) { parentActionBar.onSearchFieldVisibilityChanged(item.toggleSearch()); } else { - onItemClick((Integer)view.getTag()); + onItemClick((Integer) view.getTag()); } } }); @@ -104,7 +104,7 @@ public class ActionBarMenu extends LinearLayout { for (int a = 0; a < getChildCount(); a++) { View view = getChildAt(a); if (view instanceof ActionBarMenuItem) { - ((ActionBarMenuItem)view).closeSubMenu(); + ((ActionBarMenuItem) view).closeSubMenu(); } } } @@ -126,10 +126,16 @@ public class ActionBarMenu extends LinearLayout { for (int a = 0; a < getChildCount(); a++) { View view = getChildAt(a); if (view instanceof ActionBarMenuItem) { - ActionBarMenuItem item = (ActionBarMenuItem)view; - if (item.hasSubMenu() && item.getVisibility() == VISIBLE) { + ActionBarMenuItem item = (ActionBarMenuItem) view; + if (item.getVisibility() != VISIBLE) { + continue; + } + if (item.hasSubMenu()) { item.toggleSubMenu(); break; + } else if (item.overrideMenuClick) { + onItemClick((Integer) item.getTag()); + break; } } } @@ -139,7 +145,7 @@ public class ActionBarMenu extends LinearLayout { for (int a = 0; a < getChildCount(); a++) { View view = getChildAt(a); if (view instanceof ActionBarMenuItem) { - ActionBarMenuItem item = (ActionBarMenuItem)view; + ActionBarMenuItem item = (ActionBarMenuItem) view; if (item.isSearchField()) { parentActionBar.onSearchFieldVisibilityChanged(item.toggleSearch()); break; @@ -152,7 +158,7 @@ public class ActionBarMenu extends LinearLayout { for (int a = 0; a < getChildCount(); a++) { View view = getChildAt(a); if (view instanceof ActionBarMenuItem) { - ActionBarMenuItem item = (ActionBarMenuItem)view; + ActionBarMenuItem item = (ActionBarMenuItem) view; if (item.isSearchField()) { if (toggle) { parentActionBar.onSearchFieldVisibilityChanged(item.toggleSearch()); @@ -168,7 +174,7 @@ public class ActionBarMenu extends LinearLayout { public ActionBarMenuItem getItem(int id) { View v = findViewWithTag(id); if (v instanceof ActionBarMenuItem) { - return (ActionBarMenuItem)v; + return (ActionBarMenuItem) v; } return null; } 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 93f4ef8b..49da2efe 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenuItem.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenuItem.java @@ -83,6 +83,8 @@ public class ActionBarMenuItem extends FrameLayoutFixed { private int subMenuOpenSide = 0; private ActionBarMenuItemDelegate delegate; private boolean allowCloseAnimation = true; + protected boolean overrideMenuClick; + private boolean processedPopupClick; public ActionBarMenuItem(Context context, ActionBarMenu menu, int background) { super(context); @@ -130,21 +132,23 @@ public class ActionBarMenuItem extends FrameLayoutFixed { x -= location[0]; y -= location[1]; selectedMenuView = null; - for (int a = 0; a < popupLayout.getChildCount(); a++) { - View child = popupLayout.getChildAt(a); + for (int a = 0; a < popupLayout.getItemsCount(); a++) { + View child = popupLayout.getItemAt(a); child.getHitRect(rect); if ((Integer) child.getTag() < 100) { if (!rect.contains((int) x, (int) y)) { child.setPressed(false); child.setSelected(false); - if (Build.VERSION.SDK_INT >= 21) { + if (Build.VERSION.SDK_INT == 21) { child.getBackground().setVisible(false, false); } } else { child.setPressed(true); child.setSelected(true); if (Build.VERSION.SDK_INT >= 21) { + if (Build.VERSION.SDK_INT == 21) { child.getBackground().setVisible(true, false); + } child.drawableHotspotChanged(x, y - child.getTop()); } selectedMenuView = child; @@ -193,9 +197,6 @@ public class ActionBarMenuItem extends FrameLayoutFixed { rect = new Rect(); location = new int[2]; popupLayout = new ActionBarPopupWindow.ActionBarPopupWindowLayout(getContext()); - popupLayout.setOrientation(LinearLayout.VERTICAL); - popupLayout.setPadding(AndroidUtilities.dp(8), AndroidUtilities.dp(8), AndroidUtilities.dp(8), AndroidUtilities.dp(8)); - //popupLayout.setBackgroundResource(R.drawable.popup_fixed); popupLayout.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { @@ -253,6 +254,10 @@ public class ActionBarMenuItem extends FrameLayoutFixed { @Override public void onClick(View view) { if (popupWindow != null && popupWindow.isShowing()) { + if (processedPopupClick) { + return; + } + processedPopupClick = true; popupWindow.dismiss(allowCloseAnimation); } if (parentMenu != null) { @@ -307,6 +312,7 @@ public class ActionBarMenuItem extends FrameLayoutFixed { } }); } + processedPopupClick = false; popupWindow.setFocusable(true); if (popupLayout.getMeasuredWidth() == 0) { updateOrShowPopup(true, true); @@ -372,6 +378,11 @@ public class ActionBarMenuItem extends FrameLayoutFixed { return setIsSearchField(value, true); } + public ActionBarMenuItem setOverrideMenuClick(boolean value) { + overrideMenuClick = value; + return this; + } + public ActionBarMenuItem setIsSearchField(boolean value, boolean needClearButton) { if (parentMenu == null) { return this; @@ -394,7 +405,8 @@ public class ActionBarMenuItem extends FrameLayoutFixed { searchField.setSingleLine(true); searchField.setBackgroundResource(0); searchField.setPadding(0, 0, 0, 0); - searchField.setInputType(EditorInfo.TYPE_TEXT_FLAG_NO_SUGGESTIONS); + int inputType = searchField.getInputType() | EditorInfo.TYPE_TEXT_FLAG_NO_SUGGESTIONS; + searchField.setInputType(inputType); if (android.os.Build.VERSION.SDK_INT < 11) { searchField.setOnCreateContextMenuListener(new OnCreateContextMenuListener() { public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { @@ -472,7 +484,7 @@ public class ActionBarMenuItem extends FrameLayoutFixed { layoutParams2.width = LayoutHelper.MATCH_PARENT; layoutParams2.gravity = Gravity.CENTER_VERTICAL; layoutParams2.height = AndroidUtilities.dp(36); - layoutParams2.rightMargin = AndroidUtilities.dp(48); + layoutParams2.rightMargin = needClearButton ? AndroidUtilities.dp(48) : 0; searchField.setLayoutParams(layoutParams2); if (needClearButton) { @@ -537,6 +549,10 @@ public class ActionBarMenuItem extends FrameLayoutFixed { } } + if (show) { + popupLayout.scrollToTop(); + } + if (subMenuOpenSide == 0) { if (showFromBottom) { if (show) { @@ -584,10 +600,6 @@ public class ActionBarMenuItem extends FrameLayoutFixed { if (view != null) { view.setVisibility(GONE); } - view = popupLayout.findViewWithTag(100 + id); - if (view != null) { - view.setVisibility(GONE); - } } public void showSubItem(int id) { @@ -595,9 +607,5 @@ public class ActionBarMenuItem extends FrameLayoutFixed { if (view != null) { view.setVisibility(VISIBLE); } - view = popupLayout.findViewWithTag(100 + id); - if (view != null) { - view.setVisibility(VISIBLE); - } } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarPopupWindow.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarPopupWindow.java index 7d6816f2..ee42b1eb 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarPopupWindow.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarPopupWindow.java @@ -19,14 +19,18 @@ import android.graphics.drawable.Drawable; import android.os.Build; import android.view.KeyEvent; import android.view.View; +import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.animation.DecelerateInterpolator; +import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.PopupWindow; +import android.widget.ScrollView; import org.telegram.android.AndroidUtilities; import org.telegram.messenger.FileLog; import org.telegram.messenger.R; +import org.telegram.ui.Components.LayoutHelper; import java.lang.reflect.Field; import java.util.HashMap; @@ -62,7 +66,7 @@ public class ActionBarPopupWindow extends PopupWindow { void onDispatchKeyEvent(KeyEvent keyEvent); } - public static class ActionBarPopupWindowLayout extends LinearLayout { + public static class ActionBarPopupWindowLayout extends FrameLayout { private OnDispatchKeyEventListener mOnDispatchKeyEventListener; protected static Drawable backgroundDrawable; @@ -73,13 +77,26 @@ public class ActionBarPopupWindow extends PopupWindow { private boolean showedFromBotton; private HashMap positions = new HashMap<>(); + private ScrollView scrollView; + private LinearLayout linearLayout; + public ActionBarPopupWindowLayout(Context context) { super(context); - setWillNotDraw(false); if (backgroundDrawable == null) { backgroundDrawable = getResources().getDrawable(R.drawable.popup_fixed); } + + setPadding(AndroidUtilities.dp(8), AndroidUtilities.dp(8), AndroidUtilities.dp(8), AndroidUtilities.dp(8)); + setWillNotDraw(false); + + scrollView = new ScrollView(context); + scrollView.setVerticalScrollBarEnabled(false); + addView(scrollView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT)); + + linearLayout = new LinearLayout(context); + linearLayout.setOrientation(LinearLayout.VERTICAL); + scrollView.addView(linearLayout, new ScrollView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); } public void setShowedFromBotton(boolean value) { @@ -106,15 +123,15 @@ public class ActionBarPopupWindow extends PopupWindow { public void setBackScaleY(float value) { backScaleY = value; if (animationEnabled) { - int count = getChildCount(); + int count = getItemsCount(); int visibleCount = 0; for (int a = 0; a < count; a++) { - visibleCount += getChildAt(a).getVisibility() == VISIBLE ? 1 : 0; + visibleCount += getItemAt(a).getVisibility() == VISIBLE ? 1 : 0; } int height = getMeasuredHeight() - AndroidUtilities.dp(16); if (showedFromBotton) { for (int a = lastStartedChild; a >= 0; a--) { - View child = getChildAt(a); + View child = getItemAt(a); if (child.getVisibility() != VISIBLE) { continue; } @@ -127,7 +144,7 @@ public class ActionBarPopupWindow extends PopupWindow { } } else { for (int a = lastStartedChild; a < count; a++) { - View child = getChildAt(a); + View child = getItemAt(a); if (child.getVisibility() != VISIBLE) { continue; } @@ -155,6 +172,11 @@ public class ActionBarPopupWindow extends PopupWindow { } } + @Override + public void addView(View child) { + linearLayout.addView(child); + } + public float getBackScaleX() { return backScaleX; } @@ -183,6 +205,18 @@ public class ActionBarPopupWindow extends PopupWindow { backgroundDrawable.draw(canvas); } } + + public int getItemsCount() { + return linearLayout.getChildCount(); + } + + public View getItemAt(int index) { + return linearLayout.getChildAt(index); + } + + public void scrollToTop() { + scrollView.scrollTo(0, 0); + } } public ActionBarPopupWindow() { @@ -269,11 +303,11 @@ public class ActionBarPopupWindow extends PopupWindow { content.setAlpha(1.0f); content.setPivotX(content.getMeasuredWidth()); content.setPivotY(0); - int count = content.getChildCount(); + int count = content.getItemsCount(); content.positions.clear(); int visibleCount = 0; for (int a = 0; a < count; a++) { - View child = content.getChildAt(a); + View child = content.getItemAt(a); if (child.getVisibility() != View.VISIBLE) { continue; } 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 80111af5..139c0ad6 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BaseFragment.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BaseFragment.java @@ -14,7 +14,6 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; -import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; @@ -48,7 +47,7 @@ public class BaseFragment { classGuid = ConnectionsManager.getInstance().generateClassGuid(); } - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { return null; } 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 8b0fd39e..732e4ae3 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/DrawerLayoutContainer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/DrawerLayoutContainer.java @@ -30,7 +30,6 @@ import org.telegram.messenger.R; import org.telegram.android.AnimationCompat.AnimatorListenerAdapterProxy; import org.telegram.android.AnimationCompat.AnimatorSetProxy; import org.telegram.android.AnimationCompat.ObjectAnimatorProxy; -import org.telegram.messenger.R; public class DrawerLayoutContainer extends FrameLayout { @@ -384,7 +383,6 @@ public class DrawerLayoutContainer extends FrameLayout { @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { inLayout = true; - final int width = r - l; final int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { final View child = getChildAt(i); @@ -417,8 +415,6 @@ public class DrawerLayoutContainer extends FrameLayout { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - int widthMode = MeasureSpec.getMode(widthMeasureSpec); - int heightMode = MeasureSpec.getMode(heightMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/CountrySearchAdapter.java b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/CountrySearchAdapter.java index 8c39b844..8efc3429 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/CountrySearchAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/CountrySearchAdapter.java @@ -72,7 +72,6 @@ public class CountrySearchAdapter extends BaseFragmentAdapter { updateSearchResults(new ArrayList()); return; } - long time = System.currentTimeMillis(); ArrayList resultArray = new ArrayList<>(); String n = query.substring(0, 1); 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 7bf933c7..31a09f75 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DialogsSearchAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DialogsSearchAdapter.java @@ -9,6 +9,7 @@ package org.telegram.ui.Adapters; import android.content.Context; +import android.content.SharedPreferences; import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; @@ -21,6 +22,7 @@ import org.telegram.android.MessageObject; import org.telegram.android.MessagesController; import org.telegram.android.MessagesStorage; import org.telegram.android.support.widget.RecyclerView; +import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.ByteBufferDesc; import org.telegram.messenger.ConnectionsManager; import org.telegram.messenger.FileLog; @@ -642,6 +644,7 @@ public class DialogsSearchAdapter extends BaseSearchAdapterRecycler { @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + SharedPreferences themePrefs = ApplicationLoader.applicationContext.getSharedPreferences(AndroidUtilities.THEME_PREFS, AndroidUtilities.THEME_PREFS_MODE); switch (holder.getItemViewType()) { case 0: { ProfileSearchCell cell = (ProfileSearchCell) holder.itemView; @@ -693,6 +696,8 @@ public class DialogsSearchAdapter extends BaseSearchAdapterRecycler { } case 1: { GreySectionCell cell = (GreySectionCell) holder.itemView; + cell.setBackgroundColor(themePrefs.getInt("chatsRowColor", 0xfff2f2f2)); + cell.setTextColor(themePrefs.getInt("chatsNameColor", 0xff8a8a8a)); if (!searchResultHashtags.isEmpty()) { cell.setText(LocaleController.getString("Hashtags", R.string.Hashtags).toUpperCase()); } else if (!globalSearch.isEmpty() && position == searchResult.size()) { @@ -714,6 +719,7 @@ public class DialogsSearchAdapter extends BaseSearchAdapterRecycler { } case 4: { HashtagSearchCell cell = (HashtagSearchCell) holder.itemView; + cell.setTextColor(themePrefs.getInt("chatsMessageColor", 0xff000000)); cell.setText(searchResultHashtags.get(position - 1)); cell.setNeedDivider(position != searchResultHashtags.size()); break; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DrawerLayoutAdapter.java b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DrawerLayoutAdapter.java index 2d69ecd4..0f47cf00 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DrawerLayoutAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DrawerLayoutAdapter.java @@ -9,6 +9,7 @@ package org.telegram.ui.Adapters; import android.content.Context; +import android.content.SharedPreferences; import android.content.pm.PackageInfo; import android.view.View; import android.view.ViewGroup; @@ -80,11 +81,13 @@ public class DrawerLayoutAdapter extends BaseAdapter { @Override public View getView(int i, View view, ViewGroup viewGroup) { int type = getItemViewType(i); + SharedPreferences themePrefs = ApplicationLoader.applicationContext.getSharedPreferences(AndroidUtilities.THEME_PREFS, AndroidUtilities.THEME_PREFS_MODE); if (type == 0) { if (view == null) { view = new DrawerProfileCell(mContext); } ((DrawerProfileCell) view).setUser(MessagesController.getInstance().getUser(UserConfig.getClientUserId())); + ((DrawerProfileCell) view).refreshAvatar(themePrefs.getInt("drawerAvatarSize", 64), themePrefs.getInt("drawerAvatarRadius", 32)); } else if (type == 1) { if (view == null) { view = new EmptyCell(mContext, AndroidUtilities.dp(8)); @@ -99,24 +102,28 @@ public class DrawerLayoutAdapter extends BaseAdapter { view = new DrawerActionCell(mContext); } DrawerActionCell actionCell = (DrawerActionCell) view; + actionCell.setTextColor(themePrefs.getInt("drawerOptionColor", 0xff444444)); + actionCell.setTextSize(themePrefs.getInt("drawerOptionSize", 15)); + //actionCell.setIconColor(themePrefs.getInt("drawerIconColor", 0xff737373)); + int color = themePrefs.getInt("drawerIconColor", 0xff737373); if (i == 2) { - actionCell.setTextAndIcon(LocaleController.getString("NewGroup", R.string.NewGroup), R.drawable.menu_newgroup); + actionCell.setTextAndIcon(LocaleController.getString("NewGroup", R.string.NewGroup), R.drawable.menu_newgroup, color); } else if (i == 3) { - actionCell.setTextAndIcon(LocaleController.getString("NewSecretChat", R.string.NewSecretChat), R.drawable.menu_secret); + actionCell.setTextAndIcon(LocaleController.getString("NewSecretChat", R.string.NewSecretChat), R.drawable.menu_secret, color); } else if (i == 4) { - actionCell.setTextAndIcon(LocaleController.getString("NewBroadcastList", R.string.NewBroadcastList), R.drawable.menu_broadcast); + actionCell.setTextAndIcon(LocaleController.getString("NewBroadcastList", R.string.NewBroadcastList), R.drawable.menu_broadcast, color); } else if (i == contactsRow) { - actionCell.setTextAndIcon(LocaleController.getString("Contacts", R.string.Contacts), R.drawable.menu_contacts); + actionCell.setTextAndIcon(LocaleController.getString("Contacts", R.string.Contacts), R.drawable.menu_contacts, color); }/* else if (i == 7) { actionCell.setTextAndIcon(LocaleController.getString("InviteFriends", R.string.InviteFriends), R.drawable.menu_invite); }*/ else if (i == themesRow) { - actionCell.setTextAndIcon(LocaleController.getString("Themes", R.string.Themes), R.drawable.menu_themes); + actionCell.setTextAndIcon(LocaleController.getString("Themes", R.string.Themes), R.drawable.menu_themes, color); } else if (i == themingRow) { - actionCell.setTextAndIcon(LocaleController.getString("Theming", R.string.Theming), R.drawable.menu_theming); + actionCell.setTextAndIcon(LocaleController.getString("Theming", R.string.Theming), R.drawable.menu_theming, color); } else if (i == settingsRow) { - actionCell.setTextAndIcon(LocaleController.getString("Settings", R.string.Settings), R.drawable.menu_settings); + actionCell.setTextAndIcon(LocaleController.getString("Settings", R.string.Settings), R.drawable.menu_settings, color); } else if (i == communityRow) { - actionCell.setTextAndIcon(LocaleController.getString("Community", R.string.Community), R.drawable.menu_forum); + actionCell.setTextAndIcon(LocaleController.getString("Community", R.string.Community), R.drawable.menu_forum, color); } /*else if (i == 10) { actionCell.setTextAndIcon(LocaleController.getString("TelegramFaq", R.string.TelegramFaq), R.drawable.menu_help); }*/ @@ -126,8 +133,8 @@ public class DrawerLayoutAdapter extends BaseAdapter { try { PackageInfo pInfo = ApplicationLoader.applicationContext.getPackageManager().getPackageInfo(ApplicationLoader.applicationContext.getPackageName(), 0); ((TextInfoCell) view).setText(String.format(Locale.US, LocaleController.getString("TelegramForAndroid", R.string.TelegramForAndroid)+" v%s (%d)", pInfo.versionName, pInfo.versionCode)); - //((TextInfoCell) view).setTextColor(AndroidUtilities.getIntDef("drawerVersionColor",0xffa3a3a3)); - //((TextInfoCell) view).setTextSize(AndroidUtilities.getIntDef("drawerVersionSize",13)); + ((TextInfoCell) view).setTextColor(themePrefs.getInt("drawerVersionColor", 0xffa3a3a3)); + ((TextInfoCell) view).setTextSize(themePrefs.getInt("drawerVersionSize", 13)); } catch (Exception e) { FileLog.e("tmessages", e); } 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 7953cbe2..d55bb67c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/StickersAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/StickersAdapter.java @@ -87,7 +87,7 @@ public class StickersAdapter extends RecyclerView.Adapter implements Notificatio } public void loadStikersForEmoji(CharSequence emoji) { - boolean search = emoji != null && emoji.length() != 0 && emoji.length() <= 2; + boolean search = emoji != null && emoji.length() > 0 && emoji.length() <= 4; if (search) { lastSticker = emoji.toString(); HashMap> allStickers = StickersQuery.getAllStickers(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/BlockedUsersActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/BlockedUsersActivity.java index 97e35883..96f622da 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/BlockedUsersActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/BlockedUsersActivity.java @@ -17,7 +17,6 @@ import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; import android.view.Gravity; -import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; @@ -70,7 +69,7 @@ public class BlockedUsersActivity extends BaseFragment implements NotificationCe } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); actionBar.setTitle(LocaleController.getString("BlockedUsers", R.string.BlockedUsers)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatActionCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatActionCell.java index fba42e12..b7201bfa 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatActionCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatActionCell.java @@ -48,8 +48,6 @@ public class ChatActionCell extends BaseCell { private static TextPaint textPaint; - - private URLSpan pressedLink; private ImageReceiver imageReceiver; @@ -70,7 +68,6 @@ public class ChatActionCell extends BaseCell { public ChatActionCell(Context context) { super(context); if (textPaint == null) { - textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); textPaint.setColor(0xffffffff); textPaint.linkColor = 0xffffffff; @@ -186,8 +183,8 @@ public class ChatActionCell extends BaseCell { final int line = textLayout.getLineForVertical((int)y); final int off = textLayout.getOffsetForHorizontal(line, x); final float left = textLayout.getLineLeft(line); - if (left <= x && left + textLayout.getLineWidth(line) >= x) { - Spannable buffer = (Spannable)currentMessageObject.messageText; + if (left <= x && left + textLayout.getLineWidth(line) >= x && currentMessageObject.messageText instanceof Spannable) { + Spannable buffer = (Spannable) currentMessageObject.messageText; URLSpan[] link = buffer.getSpans(off, off, URLSpan.class); if (link.length != 0) { @@ -239,7 +236,6 @@ public class ChatActionCell extends BaseCell { int linesCount = textLayout.getLineCount(); for (int a = 0; a < linesCount; a++) { float lineWidth; - float lineLeft = 0; try { lineWidth = textLayout.getLineWidth(a); textHeight = (int)Math.max(textHeight, Math.ceil(textLayout.getLineBottom(a))); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatAudioCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatAudioCell.java index 87c5a71b..e8bae160 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatAudioCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatAudioCell.java @@ -21,10 +21,11 @@ import android.view.SoundEffectConstants; import org.telegram.android.AndroidUtilities; import org.telegram.android.ImageLoader; import org.telegram.android.MessagesController; +import org.telegram.android.SendMessagesHelper; import org.telegram.messenger.FileLoader; import org.telegram.android.MediaController; import org.telegram.android.MessageObject; -import org.telegram.ui.Components.ProgressView; +import org.telegram.ui.Components.RadialProgress; import org.telegram.ui.Components.ResourceLoader; import org.telegram.ui.Components.SeekBar; @@ -36,10 +37,10 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega private static Paint circlePaint; private SeekBar seekBar; - private ProgressView progressView; private int seekBarX; private int seekBarY; + private RadialProgress radialProgress; private int buttonState = 0; private int buttonX; private int buttonY; @@ -58,7 +59,7 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega seekBar = new SeekBar(context); seekBar.delegate = this; - progressView = new ProgressView(); + radialProgress = new RadialProgress(this); drawForwardedName = true; /*avatarDrawable = new AvatarDrawable(); //Chat Audio Photo @@ -83,7 +84,7 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); - updateButtonState(); + updateButtonState(false); } @Override @@ -136,30 +137,34 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega } if (result) { buttonState = 1; + radialProgress.setBackground(getDrawableForCurrentState(), false, false); invalidate(); } } else if (buttonState == 1) { boolean result = MediaController.getInstance().pauseAudio(currentMessageObject); if (result) { buttonState = 0; + radialProgress.setBackground(getDrawableForCurrentState(), false, false); invalidate(); } } else if (buttonState == 2) { FileLoader.getInstance().loadFile(currentMessageObject.messageOwner.media.audio, true); buttonState = 3; + radialProgress.setBackground(getDrawableForCurrentState(), true, false); invalidate(); } else if (buttonState == 3) { FileLoader.getInstance().cancelLoadFile(currentMessageObject.messageOwner.media.audio); buttonState = 2; + radialProgress.setBackground(getDrawableForCurrentState(), false, false); invalidate(); } else if (buttonState == 4) { if (currentMessageObject.isOut() && currentMessageObject.isSending()) { if (delegate != null) { delegate.didPressedCancelSendButton(this); } + } } } - } public void updateProgress() { if (currentMessageObject == null) { @@ -178,6 +183,7 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega } String timeString = String.format("%02d:%02d", duration / 60, duration % 60); if (lastTimeString == null || lastTimeString != null && !lastTimeString.equals(timeString)) { + lastTimeString = timeString; timeWidth = (int)Math.ceil(timePaint.measureText(timeString)); timeLayout = new StaticLayout(timeString, timePaint, timeWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); } @@ -188,16 +194,23 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega if (buttonState == 2) { FileLoader.getInstance().loadFile(currentMessageObject.messageOwner.media.audio, true); buttonState = 3; - invalidate(); + radialProgress.setBackground(getDrawableForCurrentState(), false, false); } } - public void updateButtonState() { + public void updateButtonState(boolean animated) { if (currentMessageObject == null) { return; } if (currentMessageObject.isOut() && currentMessageObject.isSending()) { + MediaController.getInstance().addLoadingFileObserver(currentMessageObject.messageOwner.attachPath, this); buttonState = 4; + radialProgress.setBackground(getDrawableForCurrentState(), true, animated); + Float progress = ImageLoader.getInstance().getFileProgress(currentMessageObject.messageOwner.attachPath); + if (progress == null && SendMessagesHelper.getInstance().isSendingMessage(currentMessageObject.getId())) { + progress = 1.0f; + } + radialProgress.setProgress(progress != null ? progress : 0, false); } else { File cacheFile = null; if (currentMessageObject.messageOwner.attachPath != null && currentMessageObject.messageOwner.attachPath.length() > 0) { @@ -209,57 +222,59 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega if (cacheFile == null) { cacheFile = FileLoader.getPathToMessage(currentMessageObject.messageOwner); } - if (cacheFile.exists()) { - MediaController.getInstance().removeLoadingFileObserver(this); - boolean playing = MediaController.getInstance().isPlayingAudio(currentMessageObject); - if (!playing || playing && MediaController.getInstance().isAudioPaused()) { - buttonState = 0; - } else { - buttonState = 1; - } - progressView.setProgress(0); - } else { - String fileName = currentMessageObject.getFileName(); - MediaController.getInstance().addLoadingFileObserver(fileName, this); - if (!FileLoader.getInstance().isLoadingFile(fileName)) { - buttonState = 2; - progressView.setProgress(0); - } else { - buttonState = 3; - Float progress = ImageLoader.getInstance().getFileProgress(fileName); - if (progress != null) { - progressView.setProgress(progress); + if (cacheFile.exists()) { + MediaController.getInstance().removeLoadingFileObserver(this); + boolean playing = MediaController.getInstance().isPlayingAudio(currentMessageObject); + if (!playing || playing && MediaController.getInstance().isAudioPaused()) { + buttonState = 0; } else { - progressView.setProgress(0); + buttonState = 1; + } + radialProgress.setProgress(0, animated); + radialProgress.setBackground(getDrawableForCurrentState(), false, animated); + } else { + String fileName = currentMessageObject.getFileName(); + MediaController.getInstance().addLoadingFileObserver(fileName, this); + if (!FileLoader.getInstance().isLoadingFile(fileName)) { + buttonState = 2; + radialProgress.setProgress(0, animated); + radialProgress.setBackground(getDrawableForCurrentState(), false, animated); + } else { + buttonState = 3; + Float progress = ImageLoader.getInstance().getFileProgress(fileName); + if (progress != null) { + radialProgress.setProgress(progress, animated); + } else { + radialProgress.setProgress(0, animated); + } + radialProgress.setBackground(getDrawableForCurrentState(), true, animated); } } } - } updateProgress(); } @Override public void onFailedDownload(String fileName) { - updateButtonState(); + updateButtonState(true); } @Override public void onSuccessDownload(String fileName) { - updateButtonState(); + updateButtonState(true); } @Override public void onProgressDownload(String fileName, float progress) { - progressView.setProgress(progress); + radialProgress.setProgress(progress, true); if (buttonState != 3) { - updateButtonState(); + updateButtonState(false); } - invalidate(); } @Override public void onProgressUpload(String fileName, float progress, boolean isEncrypted) { - + radialProgress.setProgress(progress, true); } @Override @@ -291,7 +306,7 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega buttonX = layoutWidth - backgroundWidth + AndroidUtilities.dp(13); timeX = layoutWidth - backgroundWidth + AndroidUtilities.dp(66); } else { - if (isChat) { + if (isChat || showAvatar) { seekBarX = AndroidUtilities.dp(116); buttonX = AndroidUtilities.dp(74); timeX = AndroidUtilities.dp(127); @@ -304,34 +319,39 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega seekBar.width = backgroundWidth - AndroidUtilities.dp(70); seekBar.height = AndroidUtilities.dp(30); - progressView.width = backgroundWidth - AndroidUtilities.dp(94); - progressView.height = AndroidUtilities.dp(30); seekBarY = AndroidUtilities.dp(11) + namesOffset; buttonY = AndroidUtilities.dp(13) + namesOffset; + radialProgress.setProgressRect(buttonX, buttonY, buttonX + AndroidUtilities.dp(40), buttonY + AndroidUtilities.dp(40)); updateProgress(); } @Override public void setMessageObject(MessageObject messageObject) { - if (currentMessageObject != messageObject || isUserDataChanged()) { + boolean dataChanged = currentMessageObject == messageObject && isUserDataChanged(); + if (currentMessageObject != messageObject || dataChanged) { if (AndroidUtilities.isTablet()) { - backgroundWidth = Math.min(AndroidUtilities.getMinTabletSide() - AndroidUtilities.dp(isChat ? 102 : 50), AndroidUtilities.dp(300)); + backgroundWidth = Math.min(AndroidUtilities.getMinTabletSide() - AndroidUtilities.dp(isChat || showAvatar ? 102 : 50), AndroidUtilities.dp(300)); } else { - backgroundWidth = Math.min(AndroidUtilities.displaySize.x - AndroidUtilities.dp(isChat ? 102 : 50), AndroidUtilities.dp(300)); + backgroundWidth = Math.min(AndroidUtilities.displaySize.x - AndroidUtilities.dp(isChat || showAvatar ? 102 : 50), AndroidUtilities.dp(300)); } if (messageObject.isOut()) { seekBar.type = 0; - progressView.setProgressColors(0xffb4e396, 0xff6ac453); + radialProgress.setProgressColor(0xff87bf78); } else { seekBar.type = 1; - progressView.setProgressColors(0xffd9e2eb, 0xff86c5f8); + radialProgress.setProgressColor(0xffa2b5c7); } super.setMessageObject(messageObject); } - updateButtonState(); + updateButtonState(dataChanged); + } + + private Drawable getDrawableForCurrentState() { + return ResourceLoader.audioStatesDrawable[currentMessageObject.isOut() ? buttonState : buttonState + 5][0]; + //buttonPressed ? 1 : } @Override @@ -343,27 +363,18 @@ public class ChatAudioCell extends ChatBaseCell implements SeekBar.SeekBarDelega } canvas.save(); - if (buttonState == 0 || buttonState == 1) { - canvas.translate(seekBarX, seekBarY); - seekBar.draw(canvas); - } else { - canvas.translate(seekBarX + AndroidUtilities.dp(12), seekBarY); - progressView.draw(canvas); - } + canvas.translate(seekBarX, seekBarY); + seekBar.draw(canvas); canvas.restore(); - int state = buttonState; if (currentMessageObject.isOut()) { timePaint.setColor(0xff70b15c); circlePaint.setColor(0xff87bf78); } else { - state += 5; timePaint.setColor(0xffa1aab3); circlePaint.setColor(0xff4195e5); } - Drawable buttonDrawable = ResourceLoader.audioStatesDrawable[state][buttonPressed ? 1 : 0]; - setDrawableBounds(buttonDrawable, buttonX, buttonY); - buttonDrawable.draw(canvas); + radialProgress.onDraw(canvas); canvas.save(); canvas.translate(timeX, AndroidUtilities.dp(42) + namesOffset); 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 35677927..996c5fb3 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatBaseCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatBaseCell.java @@ -139,6 +139,8 @@ public class ChatBaseCell extends BaseCell { protected boolean avatarAlignTop = false; private int avatarLeft = AndroidUtilities.dp(6); + boolean showAvatar = false; + public ChatBaseCell(Context context) { super(context); if (timePaintIn == null) { @@ -379,7 +381,9 @@ public class ChatBaseCell extends BaseCell { currentReplyPhoto = null; currentUser = MessagesController.getInstance().getUser(messageObject.messageOwner.from_id); - if (isChat && !messageObject.isOut()) { + + //if (isChat && !messageObject.isOut()) { + if ((isChat || showAvatar) && !messageObject.isOut()) { isAvatarVisible = true; if (currentUser != null) { if (currentUser.photo != null) { @@ -493,7 +497,7 @@ public class ChatBaseCell extends BaseCell { if (messageObject.isOut()) { maxWidth = width - backgroundWidth - AndroidUtilities.dp(60); } else { - maxWidth = width - backgroundWidth - AndroidUtilities.dp(56 + (isChat ? 61 : 0)); + maxWidth = width - backgroundWidth - AndroidUtilities.dp(56 + (isChat || showAvatar ? 61 : 0)); } } else { maxWidth = getMaxNameWidth() - AndroidUtilities.dp(22); @@ -526,7 +530,7 @@ public class ChatBaseCell extends BaseCell { mess = mess.substring(0, 150); } mess = mess.replace("\n", " "); - stringFinalText = Emoji.replaceEmoji(mess, replyTextPaint.getFontMetricsInt(), AndroidUtilities.dp(14)); + stringFinalText = Emoji.replaceEmoji(mess, replyTextPaint.getFontMetricsInt(), AndroidUtilities.dp(14), false); stringFinalText = TextUtils.ellipsize(stringFinalText, replyTextPaint, maxWidth - AndroidUtilities.dp(8), TextUtils.TruncateAt.END); } } @@ -657,13 +661,13 @@ public class ChatBaseCell extends BaseCell { timeLayout = new StaticLayout(currentTimeString, currentTimePaint, timeWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); if (!media) { if (!currentMessageObject.isOut()) { - timeX = backgroundWidth - AndroidUtilities.dp(9) - timeWidth + (isChat ? AndroidUtilities.dp(leftBound) : 0); + timeX = backgroundWidth - AndroidUtilities.dp(9) - timeWidth + (isChat || showAvatar ? AndroidUtilities.dp(leftBound) : 0); } else { timeX = layoutWidth - timeWidth - AndroidUtilities.dp(38.5f); } } else { if (!currentMessageObject.isOut()) { - timeX = backgroundWidth - AndroidUtilities.dp(4) - timeWidth + (isChat ? AndroidUtilities.dp(leftBound) : 0); + timeX = backgroundWidth - AndroidUtilities.dp(4) - timeWidth + (isChat || showAvatar ? AndroidUtilities.dp(leftBound) : 0); } else { timeX = layoutWidth - timeWidth - AndroidUtilities.dp(42.0f); } @@ -734,7 +738,7 @@ public class ChatBaseCell extends BaseCell { currentBackgroundDrawable = ResourceLoader.backgroundMediaDrawableIn; } } - if (isChat) { + if (isChat || showAvatar) { setDrawableBounds(currentBackgroundDrawable, AndroidUtilities.dp(leftBound + (!media ? 0 : 9)), AndroidUtilities.dp(1), backgroundWidth, layoutHeight - AndroidUtilities.dp(2)); } else { setDrawableBounds(currentBackgroundDrawable, (!media ? 0 : AndroidUtilities.dp(9)), AndroidUtilities.dp(1), backgroundWidth, layoutHeight - AndroidUtilities.dp(2)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatContactCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatContactCell.java index d3fe620d..2aa9d9da 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatContactCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatContactCell.java @@ -115,7 +115,6 @@ public class ChatContactCell extends ChatBaseCell { float y = event.getY(); boolean result = false; - int side = AndroidUtilities.dp(36); if (event.getAction() == MotionEvent.ACTION_DOWN) { if (x >= avatarImage.getImageX() && x <= avatarImage.getImageX() + namesWidth + AndroidUtilities.dp(42) && y >= avatarImage.getImageY() && y <= avatarImage.getImageY() + avatarImage.getImageHeight()) { avatarPressed = true; @@ -202,6 +201,11 @@ public class ChatContactCell extends ChatBaseCell { currentPhoto = null; avatarDrawable.setInfo(uid, null, null, false); } + if(uid == 0) { + SharedPreferences themePrefs = ApplicationLoader.applicationContext.getSharedPreferences(AndroidUtilities.THEME_PREFS, AndroidUtilities.THEME_PREFS_MODE); + int color = themePrefs.getInt("chatContactNameColor", themePrefs.getInt("themeColor", AndroidUtilities.defColor)); + avatarDrawable.setColor(color); + } avatarImage.setImage(currentPhoto, "50_50", avatarDrawable, null, false); String currentNameString = ContactsController.formatName(messageObject.messageOwner.media.first_name, messageObject.messageOwner.media.last_name); @@ -258,7 +262,7 @@ public class ChatContactCell extends ChatBaseCell { if (currentMessageObject.isOut()) { x = layoutWidth - backgroundWidth + AndroidUtilities.dp(8); } else { - if (isChat) { + if (isChat || showAvatar) { x = AndroidUtilities.dp(69); } else { x = AndroidUtilities.dp(16); @@ -276,16 +280,31 @@ public class ChatContactCell extends ChatBaseCell { } avatarImage.draw(canvas); - + SharedPreferences themePrefs = ApplicationLoader.applicationContext.getSharedPreferences(AndroidUtilities.THEME_PREFS, AndroidUtilities.THEME_PREFS_MODE); if (nameLayout != null) { canvas.save(); canvas.translate(avatarImage.getImageX() + avatarImage.getImageWidth() + AndroidUtilities.dp(9), AndroidUtilities.dp(10) + namesOffset); - namePaint.setColor(AvatarDrawable.getColorForId(currentMessageObject.messageOwner.media.user_id)); + //namePaint.setColor(AvatarDrawable.getColorForId(currentMessageObject.messageOwner.media.user_id)); + namePaint.setColor(AvatarDrawable.getNameColorForId(currentMessageObject.messageOwner.media.user_id)); + int id = currentMessageObject.messageOwner.media.user_id; + int defColor = themePrefs.getInt("themeColor", AndroidUtilities.defColor); + int color = themePrefs.getInt("chatContactNameColor", defColor); + if(id == 0 || color != defColor){ + namePaint.setColor(color); + //avatarDrawable.setColor(color); + }/*else{ + //if(color == defColor){ + namePaint.setColor(AvatarDrawable.getNameColorForId(currentMessageObject.messageOwner.media.user_id)); + //}else{ + // namePaint.setColor(color); + //} + }*/ + nameLayout.draw(canvas); canvas.restore(); } if (phoneLayout != null) { - SharedPreferences themePrefs = ApplicationLoader.applicationContext.getSharedPreferences(AndroidUtilities.THEME_PREFS, AndroidUtilities.THEME_PREFS_MODE); + int color = themePrefs.getInt("chatLTextColor", 0xff000000); if (currentMessageObject.isOut()) { color = themePrefs.getInt("chatRTextColor", 0xff000000); 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 004455bf..f23675df 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMediaCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMediaCell.java @@ -395,7 +395,6 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD private Drawable getDrawableForCurrentState() { if (buttonState >= 0 && buttonState < 4) { - Drawable currentButtonDrawable = null; if (currentMessageObject.type == 9 && gifDrawable == null) { if (buttonState == 1 && !currentMessageObject.isSending()) { return ResourceLoader.buttonStatesDrawablesDoc[2][currentMessageObject.isOut() ? 1 : 0]; @@ -618,13 +617,13 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD }//Plus: member name in photos else if (messageObject.type == 1) { //PHOTO TLRPC.User fromUser = MessagesController.getInstance().getUser(messageObject.messageOwner.from_id); - String senderName = ""; + String senderName = String.format("%s %s", fromUser.first_name, fromUser.last_name); if (UserObject.isDeleted(fromUser)) { senderName = "Deleted"; } else { if (fromUser.first_name != null && fromUser.first_name.length() > 0) { senderName = fromUser.first_name; - } else { + } else if (fromUser.last_name != null && fromUser.last_name.length() > 0){ senderName = fromUser.last_name; } } @@ -668,7 +667,7 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD double lon = messageObject.messageOwner.media.geo._long; if (messageObject.messageOwner.media.title != null && messageObject.messageOwner.media.title.length() > 0) { - int maxWidth = (AndroidUtilities.isTablet() ? AndroidUtilities.getMinTabletSide() : Math.min(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y)) - AndroidUtilities.dp((isChat && !messageObject.isOut() ? 102 : 40) + 86 + 24); + int maxWidth = (AndroidUtilities.isTablet() ? AndroidUtilities.getMinTabletSide() : Math.min(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y)) - AndroidUtilities.dp(((isChat || showAvatar) && !messageObject.isOut() ? 102 : 40) + 86 + 24); nameLayout = StaticLayoutEx.createStaticLayout(messageObject.messageOwner.media.title, locationTitlePaint, maxWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false, TextUtils.TruncateAt.END, maxWidth - AndroidUtilities.dp(4), 3); int lineCount = nameLayout.getLineCount(); if (messageObject.messageOwner.media.address != null && messageObject.messageOwner.media.address.length() > 0) { @@ -1023,7 +1022,7 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD x = layoutWidth - backgroundWidth + AndroidUtilities.dp(6); } } else { - if (isChat) { + if (isChat || showAvatar) { x = AndroidUtilities.dp(67); } else { x = AndroidUtilities.dp(15); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java index 1a2874fd..9a846489 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java @@ -195,7 +195,7 @@ public class ChatMessageCell extends ChatBaseCell { pressedLink.onClick(this); } else { TLRPC.WebPage webPage = currentMessageObject.messageOwner.media.webpage; - if (Build.VERSION.SDK_INT >= 16 && webPage.embed_url != null && webPage.embed_url.length() != 0) { + if (Build.VERSION.SDK_INT >= 19 && webPage.embed_url != null && webPage.embed_url.length() != 0) { delegate.needOpenWebView(webPage.embed_url, webPage.site_name, webPage.url, webPage.embed_width, webPage.embed_height); } else { Uri uri = Uri.parse(webPage.url); @@ -331,7 +331,7 @@ public class ChatMessageCell extends ChatBaseCell { int maxWidth; if (AndroidUtilities.isTablet()) { - if (isChat && !messageObject.isOut()) { + if ((isChat || showAvatar) && !messageObject.isOut()) { maxWidth = AndroidUtilities.getMinTabletSide() - AndroidUtilities.dp(122); drawName = true; } else { @@ -339,7 +339,7 @@ public class ChatMessageCell extends ChatBaseCell { drawName = false; } } else { - if (isChat && !messageObject.isOut()) { + if ((isChat || showAvatar) && !messageObject.isOut()) { maxWidth = Math.min(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y) - AndroidUtilities.dp(122); drawName = true; } else { @@ -538,7 +538,7 @@ public class ChatMessageCell extends ChatBaseCell { if (webPage.photo != null) { boolean smallImage = webPage.type != null && (webPage.type.equals("app") || webPage.type.equals("profile") || webPage.type.equals("article")); - if (smallImage && descriptionLayout != null && descriptionLayout.getLineCount() == 1) { + if (smallImage && (descriptionLayout == null || descriptionLayout != null && descriptionLayout.getLineCount() == 1)) { smallImage = false; isSmallImage = false; } @@ -665,7 +665,7 @@ public class ChatMessageCell extends ChatBaseCell { textX = layoutWidth - backgroundWidth + AndroidUtilities.dp(10); textY = AndroidUtilities.dp(10) + namesOffset; } else { - textX = AndroidUtilities.dp(19) + (isChat ? AndroidUtilities.dp(52) : 0); + textX = AndroidUtilities.dp(19) + (isChat || showAvatar ? AndroidUtilities.dp(52) : 0); textY = AndroidUtilities.dp(10) + namesOffset; } } @@ -681,7 +681,7 @@ public class ChatMessageCell extends ChatBaseCell { textX = layoutWidth - backgroundWidth + AndroidUtilities.dp(10); textY = AndroidUtilities.dp(10) + namesOffset; } else { - textX = AndroidUtilities.dp(19) + (isChat ? AndroidUtilities.dp(52) : 0); + textX = AndroidUtilities.dp(19) + (isChat || showAvatar ? AndroidUtilities.dp(52) : 0); textY = AndroidUtilities.dp(10) + namesOffset; } 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 09021104..19336c64 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java @@ -384,15 +384,7 @@ public class DialogCell extends BaseCell { if (message.isOut()) { name = LocaleController.getString("FromYou", R.string.FromYou); } else { - if (UserObject.isDeleted(fromUser)) { - name = "Deleted"; - } else { - if (fromUser.first_name != null && fromUser.first_name.length() > 0) { - name = fromUser.first_name; - } else { - name = fromUser.last_name; - } - } + name = UserObject.getFirstName(fromUser); } checkMessage = false; SharedPreferences themePrefs = ApplicationLoader.applicationContext.getSharedPreferences(AndroidUtilities.THEME_PREFS, AndroidUtilities.THEME_PREFS_MODE); @@ -408,13 +400,13 @@ public class DialogCell extends BaseCell { mess = mess.substring(0, 150); } mess = mess.replace("\n", " "); - //messageString = Emoji.replaceEmoji(AndroidUtilities.replaceTags(String.format("%s: %s", name, mess)), messagePaint.getFontMetricsInt(), AndroidUtilities.dp(20)); - messageString = Emoji.replaceEmoji(AndroidUtilities.replaceTags(String.format("%s: %s", name, mess)), messagePaint.getFontMetricsInt(), AndroidUtilities.dp(20)); + //messageString = Emoji.replaceEmoji(AndroidUtilities.replaceTags(String.format("%s: %s", name, mess), AndroidUtilities.FLAG_TAG_COLOR), messagePaint.getFontMetricsInt(), AndroidUtilities.dp(20), false); + messageString = Emoji.replaceEmoji(AndroidUtilities.replaceTags(String.format("%s: %s", name, mess), AndroidUtilities.FLAG_TAG_COLOR), messagePaint.getFontMetricsInt(), AndroidUtilities.dp(20), false); } else { if (message.messageOwner.media != null && !message.isMediaEmpty()) { currentMessagePaint = messagePrintingPaint; - //messageString = Emoji.replaceEmoji(AndroidUtilities.replaceTags(String.format("%s: %s", name, message.messageText)), messagePaint.getFontMetricsInt(), AndroidUtilities.dp(20)); - messageString = Emoji.replaceEmoji(AndroidUtilities.replaceTags(String.format("%s: %s", name, message.messageText)), messagePaint.getFontMetricsInt(), AndroidUtilities.dp(20)); + //messageString = Emoji.replaceEmoji(AndroidUtilities.replaceTags(String.format("%s: %s", name, message.messageText)), AndroidUtilities.FLAG_TAG_COLOR), messagePaint.getFontMetricsInt(), AndroidUtilities.dp(20), false); + messageString = Emoji.replaceEmoji(AndroidUtilities.replaceTags(String.format("%s: %s", name, message.messageText), AndroidUtilities.FLAG_TAG_COLOR), messagePaint.getFontMetricsInt(), AndroidUtilities.dp(20), false); } else { if (message.messageOwner.message != null) { String mess = message.messageOwner.message; @@ -422,8 +414,8 @@ public class DialogCell extends BaseCell { mess = mess.substring(0, 150); } mess = mess.replace("\n", " "); - //messageString = Emoji.replaceEmoji(AndroidUtilities.replaceTags(String.format("%s: %s", name, mess)), messagePaint.getFontMetricsInt(), AndroidUtilities.dp(20)); - messageString = Emoji.replaceEmoji(AndroidUtilities.replaceTags(String.format("%s: %s", name, mess)), messagePaint.getFontMetricsInt(), AndroidUtilities.dp(20)); + //messageString = Emoji.replaceEmoji(AndroidUtilities.replaceTags(String.format("%s: %s", name, mess)), AndroidUtilities.FLAG_TAG_COLOR), messagePaint.getFontMetricsInt(), AndroidUtilities.dp(20), false); + messageString = Emoji.replaceEmoji(AndroidUtilities.replaceTags(String.format("%s: %s", name, mess), AndroidUtilities.FLAG_TAG_COLOR), messagePaint.getFontMetricsInt(), AndroidUtilities.dp(20), false); } } } @@ -624,7 +616,7 @@ public class DialogCell extends BaseCell { mess = mess.substring(0, 150); } mess = mess.replace("\n", " "); - messageString = Emoji.replaceEmoji(mess, messagePaint.getFontMetricsInt(), AndroidUtilities.dp(17)); + messageString = Emoji.replaceEmoji(mess, messagePaint.getFontMetricsInt(), AndroidUtilities.dp(17), false); } messageWidth = Math.max(AndroidUtilities.dp(12), messageWidth); CharSequence messageStringFinal = TextUtils.ellipsize(messageString, currentMessagePaint, messageWidth - AndroidUtilities.dp(12), TextUtils.TruncateAt.END); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerActionCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerActionCell.java index 922ff9cb..b68d7e24 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerActionCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerActionCell.java @@ -41,23 +41,30 @@ public class DrawerActionCell extends FrameLayout { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(48), MeasureSpec.EXACTLY)); - updateTheme(); } public void setTextAndIcon(String text, int resId) { textView.setText(text); - //textView.setCompoundDrawablesWithIntrinsicBounds(resId, 0, 0, 0); - textView.setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(resId), null, null, null); + textView.setCompoundDrawablesWithIntrinsicBounds(resId, 0, 0, 0); } - private void updateTheme(){ - textView.setTextColor(AndroidUtilities.getIntDef("drawerOptionColor", 0xff444444)); - textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, AndroidUtilities.getIntDef("drawerOptionSize", 15)); - Drawable[] drawables = textView.getCompoundDrawables(); - //if(drawables[0].getConstantState().equals(getResources().getDrawable(R.drawable.menu_themes).getConstantState())){ - // return; - //} - int color = AndroidUtilities.getIntDef("drawerIconColor", 0xff737373); - if(drawables[0] != null)drawables[0].setColorFilter(color, PorterDuff.Mode.SRC_IN); + public void setTextAndIcon(String text, int resId, int color) { + textView.setText(text); + Drawable d = getResources().getDrawable(resId); + d.setColorFilter(color, PorterDuff.Mode.SRC_IN); + textView.setCompoundDrawablesWithIntrinsicBounds(d, null, null, null); } + + public void setTextColor(int color) { + textView.setTextColor(color); + } + + public void setTextSize(int size) { + textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, size); + } +/* + public void setIconColor(int color) { + Drawable[] drawables = textView.getCompoundDrawables(); + if(drawables[0] != null)drawables[0].setColorFilter(color, PorterDuff.Mode.SRC_IN); + }*/ } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerProfileCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerProfileCell.java index 1df8442f..216cff13 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerProfileCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerProfileCell.java @@ -60,10 +60,10 @@ public class DrawerProfileCell extends FrameLayout implements PhotoViewer.PhotoV shadowView.setScaleType(ImageView.ScaleType.FIT_XY); shadowView.setImageResource(R.drawable.bottom_shadow); addView(shadowView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 70, Gravity.LEFT | Gravity.BOTTOM)); - + SharedPreferences themePrefs = ApplicationLoader.applicationContext.getSharedPreferences(AndroidUtilities.THEME_PREFS, AndroidUtilities.THEME_PREFS_MODE); avatarImageView = new BackupImageView(context); avatarImageView.getImageReceiver().setRoundRadius(AndroidUtilities.dp(32)); - SharedPreferences themePrefs = ApplicationLoader.applicationContext.getSharedPreferences(AndroidUtilities.THEME_PREFS, AndroidUtilities.THEME_PREFS_MODE); + int aSize = themePrefs.getInt("drawerAvatarSize", 64); //addView(avatarImageView, LayoutHelper.createFrame(64, 64, Gravity.LEFT | Gravity.BOTTOM, 16, 0, 0, 67)); addView(avatarImageView, LayoutHelper.createFrame(aSize, aSize, Gravity.LEFT | Gravity.BOTTOM, 16, 0, 0, 67)); @@ -102,6 +102,13 @@ public class DrawerProfileCell extends FrameLayout implements PhotoViewer.PhotoV addView(phoneTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.BOTTOM, 16, 0, 16, 9)); } + public void refreshAvatar(int size, int radius){ + //SharedPreferences themePrefs = ApplicationLoader.applicationContext.getSharedPreferences(AndroidUtilities.THEME_PREFS, AndroidUtilities.THEME_PREFS_MODE); + removeView(avatarImageView); + avatarImageView.getImageReceiver().setRoundRadius(AndroidUtilities.dp(radius)); + addView(avatarImageView, LayoutHelper.createFrame(size, size, Gravity.LEFT | Gravity.BOTTOM, 16, 0, 0, 67)); + } + @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (Build.VERSION.SDK_INT >= 21) { @@ -113,7 +120,11 @@ public class DrawerProfileCell extends FrameLayout implements PhotoViewer.PhotoV FileLog.e("tmessages", e); } } - updateTheme(); + if(AndroidUtilities.getBoolMain("hideMobile")){ + phoneTextView.setVisibility(GONE); + }else{ + phoneTextView.setVisibility(VISIBLE); + } } @Override @@ -164,8 +175,10 @@ public class DrawerProfileCell extends FrameLayout implements PhotoViewer.PhotoV AvatarDrawable avatarDrawable = new AvatarDrawable(user); avatarDrawable.setColor(0xff5c98cd); avatarImageView.setImage(photo, "50_50", avatarDrawable); + updateTheme(); } + @Override public void updatePhotoAtIndex(int index) {} @@ -232,10 +245,15 @@ public class DrawerProfileCell extends FrameLayout implements PhotoViewer.PhotoV nameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, themePrefs.getInt("drawerNameSize", 15)); phoneTextView.setTextColor(themePrefs.getInt("drawerPhoneColor", dColor)); phoneTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, themePrefs.getInt("drawerPhoneSize", 13)); + if(AndroidUtilities.getBoolMain("hideMobile")){ + phoneTextView.setVisibility(GONE); + }else{ + phoneTextView.setVisibility(VISIBLE); + } TLRPC.User user = MessagesController.getInstance().getUser(UserConfig.getClientUserId()); TLRPC.FileLocation photo = null; if (user != null && user.photo != null && user.photo.photo_small != null ) { - photo = user.photo.photo_small; + photo = user.photo.photo_small; } AvatarDrawable avatarDrawable = new AvatarDrawable(user); avatarDrawable.setColor(themePrefs.getInt("drawerAvatarColor", AndroidUtilities.getIntDarkerColor("themeColor", 0x15))); @@ -245,10 +263,6 @@ public class DrawerProfileCell extends FrameLayout implements PhotoViewer.PhotoV avatarImageView.getImageReceiver().setRoundRadius(radius); avatarImageView.setImage(photo, "50_50", avatarDrawable); - if(AndroidUtilities.getBoolMain("hideMobile")){ - phoneTextView.setVisibility(GONE); - }else{ - phoneTextView.setVisibility(VISIBLE); - } + } } 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 759667bf..5122a6c1 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/GreySectionCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/GreySectionCell.java @@ -46,4 +46,5 @@ public class GreySectionCell extends FrameLayout { public void setTextColor(int color) { textView.setTextColor(color); } + } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/HashtagSearchCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/HashtagSearchCell.java index 6655015e..8ee07afd 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/HashtagSearchCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/HashtagSearchCell.java @@ -39,6 +39,14 @@ public class HashtagSearchCell extends TextView { setBackgroundResource(R.drawable.list_selector); } + public void setBackgroundColor(int color) { + setBackgroundColor(color); + } + + public void setDividerColor(int color) { + paint.setColor(color); + } + @Override public boolean onTouchEvent(MotionEvent event) { if (Build.VERSION.SDK_INT >= 21 && getBackground() != null) { 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 7cc059b6..9d677bb4 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedDocumentCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedDocumentCell.java @@ -100,7 +100,7 @@ public class SharedDocumentCell extends FrameLayout implements MediaController.F }); nameTextView = new TextView(context); - nameTextView.setTextColor(0xff222222); + nameTextView.setTextColor(0xff212121); nameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); nameTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); nameTextView.setLines(1); @@ -318,6 +318,9 @@ public class SharedDocumentCell extends FrameLayout implements MediaController.F @Override public void onProgressDownload(String fileName, float progress) { + if (progressView.getVisibility() != VISIBLE) { + updateFileExistIcon(); + } progressView.setProgress(progress, true); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedMediaSectionCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedMediaSectionCell.java index 1646b509..010b51a0 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedMediaSectionCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedMediaSectionCell.java @@ -28,7 +28,7 @@ public class SharedMediaSectionCell extends FrameLayout { textView = new TextView(getContext()); textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); textView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); - textView.setTextColor(0xff222222); + textView.setTextColor(0xff212121); textView.setGravity((LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.CENTER_VERTICAL); addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, 13, 0, 13, 0)); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerEmojiCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerEmojiCell.java index ce803d31..1f5c47ee 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerEmojiCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/StickerEmojiCell.java @@ -63,14 +63,14 @@ public class StickerEmojiCell extends FrameLayout { for (TLRPC.DocumentAttribute attribute : document.attributes) { if (attribute instanceof TLRPC.TL_documentAttributeSticker) { if (attribute.alt != null && attribute.alt.length() > 0) { - emojiTextView.setText(Emoji.replaceEmoji(attribute.alt, emojiTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(16))); + emojiTextView.setText(Emoji.replaceEmoji(attribute.alt, emojiTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(16), false)); set = true; } break; } } if (!set) { - emojiTextView.setText(Emoji.replaceEmoji(StickersQuery.getEmojiForSticker(sticker.id), emojiTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(16))); + emojiTextView.setText(Emoji.replaceEmoji(StickersQuery.getEmojiForSticker(sticker.id), emojiTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(16), false)); } emojiTextView.setVisibility(VISIBLE); } else { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextDetailCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextDetailCell.java index c7390ce2..d1a21ca6 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextDetailCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextDetailCell.java @@ -37,7 +37,7 @@ public class TextDetailCell extends FrameLayout { textView.setMaxLines(1); textView.setSingleLine(true); textView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); - addView(textView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT, LocaleController.isRTL ? 16 : 71, 10, LocaleController.isRTL ? 16 : 71, 0)); + addView(textView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT, LocaleController.isRTL ? 16 : 71, 10, LocaleController.isRTL ? 71 : 16, 0)); valueTextView = new TextView(context); valueTextView.setTextColor(0xff8a8a8a); @@ -46,7 +46,7 @@ public class TextDetailCell extends FrameLayout { valueTextView.setMaxLines(1); valueTextView.setSingleLine(true); valueTextView.setGravity(LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT); - addView(valueTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT, LocaleController.isRTL ? 16 : 71, 35, LocaleController.isRTL ? 16 : 71, 0)); + addView(valueTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT, LocaleController.isRTL ? 16 : 71, 35, LocaleController.isRTL ? 71 : 16, 0)); imageView = new ImageView(context); imageView.setScaleType(ImageView.ScaleType.CENTER); @@ -64,13 +64,6 @@ public class TextDetailCell extends FrameLayout { imageView.setVisibility(INVISIBLE); } - public void setTextAndValueAndIcon(String text, String value, int resId) { - textView.setText(text); - valueTextView.setText(value); - imageView.setVisibility(VISIBLE); - imageView.setImageResource(resId); - } - public void setTextAndValueAndIcon(String text, String value, Drawable drawable) { textView.setText(text); valueTextView.setText(value); @@ -85,4 +78,11 @@ public class TextDetailCell extends FrameLayout { public void setValueColor(int color) { valueTextView.setTextColor(color); } + + public void setTextAndValueAndIcon(String text, String value, int resId) { + textView.setText(text); + valueTextView.setText(value); + imageView.setVisibility(VISIBLE); + imageView.setImageResource(resId); + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextInfoCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextInfoCell.java index 7bec6ac2..883e4e9d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextInfoCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/TextInfoCell.java @@ -16,7 +16,6 @@ import android.widget.TextView; import org.telegram.android.AndroidUtilities; import org.telegram.ui.Components.LayoutHelper; -import org.telegram.ui.LaunchActivity; public class TextInfoCell extends FrameLayout { @@ -36,10 +35,10 @@ public class TextInfoCell extends FrameLayout { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); - if( textView.getContext() instanceof LaunchActivity ){ - textView.setTextColor(AndroidUtilities.getIntDef("drawerVersionColor", 0xffa3a3a3)); - textView.setTextSize(AndroidUtilities.getIntDef("drawerVersionSize", 13)); - } + //if( textView.getContext() instanceof LaunchActivity ){ + //textView.setTextColor(AndroidUtilities.getIntDef("drawerVersionColor", 0xffa3a3a3)); + //textView.setTextSize(AndroidUtilities.getIntDef("drawerVersionSize", 13)); + //} } public void setText(String text) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChangeChatNameActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChangeChatNameActivity.java index 1056b373..2fe8ccce 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChangeChatNameActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChangeChatNameActivity.java @@ -18,7 +18,6 @@ import android.text.InputType; import android.util.TypedValue; import android.view.Gravity; import android.view.KeyEvent; -import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; @@ -59,7 +58,7 @@ public class ChangeChatNameActivity extends BaseFragment { } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); actionBar.setTitle(LocaleController.getString("EditName", R.string.EditName)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChangeNameActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChangeNameActivity.java index 7f455d60..b40039a7 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChangeNameActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChangeNameActivity.java @@ -17,7 +17,6 @@ import android.text.InputType; import android.util.TypedValue; import android.view.Gravity; import android.view.KeyEvent; -import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; @@ -52,7 +51,7 @@ public class ChangeNameActivity extends BaseFragment { private final static int done_button = 1; @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); actionBar.setTitle(LocaleController.getString("EditName", R.string.EditName)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChangePhoneActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChangePhoneActivity.java index 746d97ee..03b02522 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChangePhoneActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChangePhoneActivity.java @@ -27,7 +27,6 @@ import android.text.TextWatcher; import android.util.TypedValue; import android.view.Gravity; import android.view.KeyEvent; -import android.view.LayoutInflater; import android.view.View; import android.view.WindowManager; import android.view.animation.AccelerateDecelerateInterpolator; @@ -105,7 +104,7 @@ public class ChangePhoneActivity extends BaseFragment { } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { actionBar.setTitle(LocaleController.getString("AppName", R.string.AppName)); actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChangePhoneHelpActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChangePhoneHelpActivity.java index 45a5e0b8..eda9c17e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChangePhoneHelpActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChangePhoneHelpActivity.java @@ -13,7 +13,6 @@ import android.content.Context; import android.content.DialogInterface; import android.util.TypedValue; import android.view.Gravity; -import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.widget.ImageView; @@ -36,7 +35,7 @@ import org.telegram.ui.Components.LayoutHelper; public class ChangePhoneHelpActivity extends BaseFragment { @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { 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 1ece40e7..f82d0b53 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChangeUsernameActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChangeUsernameActivity.java @@ -22,7 +22,6 @@ import android.text.TextWatcher; import android.util.TypedValue; import android.view.Gravity; import android.view.KeyEvent; -import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; @@ -64,7 +63,7 @@ public class ChangeUsernameActivity extends BaseFragment { private final static int done_button = 1; @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); actionBar.setTitle(LocaleController.getString("Username", R.string.Username)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index 8e7f09a3..18d47aa9 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -14,7 +14,6 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; -import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.database.Cursor; @@ -33,7 +32,6 @@ import android.util.Base64; import android.util.SparseArray; import android.util.TypedValue; import android.view.Gravity; -import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; @@ -102,6 +100,7 @@ import org.telegram.ui.Cells.ChatContactCell; import org.telegram.ui.Cells.ChatLoadingCell; import org.telegram.ui.Cells.ChatMediaCell; import org.telegram.ui.Cells.ChatMessageCell; +import org.telegram.ui.Cells.ChatMusicCell; import org.telegram.ui.Cells.ChatUnreadCell; import org.telegram.ui.Components.AlertsCreator; import org.telegram.ui.Components.AvatarDrawable; @@ -127,7 +126,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.concurrent.Semaphore; -public class ChatActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate, MessagesActivity.MessagesActivityDelegate, +public class ChatActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate, DialogsActivity.MessagesActivityDelegate, PhotoViewer.PhotoViewerProvider { protected TLRPC.Chat currentChat; @@ -181,6 +180,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not private ListView mentionListView; private AnimatorSetProxy mentionListAnimation; private ChatAttachView chatAttachView; + private BottomSheet chatAttachViewSheet; private ImageView deleteIconImageView; private View lineView; @@ -287,6 +287,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not private final static int bot_help = 30; private final static int bot_settings = 31; + private final static int attach_photo = 0;//6; private final static int attach_gallery = 1;//7; private final static int attach_video = 2;//8; @@ -304,6 +305,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not private final static int search_up = 41; private final static int search_down = 42; + //private final static int chat_background = 50; private final static int id_chat_compose_panel = 1000; @@ -336,7 +338,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not @Override public boolean onFragmentCreate() { final int chatId = arguments.getInt("chat_id", 0); - chat_id = chatId; + chat_id = chatId; //Plus final int userId = arguments.getInt("user_id", 0); final int encId = arguments.getInt("enc_id", 0); startLoadFromMessageId = arguments.getInt("message_id", 0); @@ -474,6 +476,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not NotificationCenter.getInstance().addObserver(this, NotificationCenter.removeAllMessagesFromDialog); NotificationCenter.getInstance().addObserver(this, NotificationCenter.audioProgressDidChanged); NotificationCenter.getInstance().addObserver(this, NotificationCenter.audioDidReset); + NotificationCenter.getInstance().addObserver(this, NotificationCenter.audioPlayStateChanged); NotificationCenter.getInstance().addObserver(this, NotificationCenter.screenshotTook); NotificationCenter.getInstance().addObserver(this, NotificationCenter.blockedUsersDidLoaded); NotificationCenter.getInstance().addObserver(this, NotificationCenter.FileNewChunkAvailable); @@ -577,6 +580,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not NotificationCenter.getInstance().removeObserver(this, NotificationCenter.botInfoDidLoaded); NotificationCenter.getInstance().removeObserver(this, NotificationCenter.botKeyboardDidLoaded); NotificationCenter.getInstance().removeObserver(this, NotificationCenter.chatSearchResultsAvailable); + NotificationCenter.getInstance().removeObserver(this, NotificationCenter.audioPlayStateChanged); if (AndroidUtilities.isTablet()) { NotificationCenter.getInstance().postNotificationName(NotificationCenter.openedChatChanged, dialog_id, true); @@ -597,11 +601,14 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not chatAttachView.onDestroy(); } AndroidUtilities.unlockOrientation(getParentActivity()); + MessageObject messageObject = MediaController.getInstance().getPlayingMessageObject(); + if (messageObject != null && !messageObject.isMusic()) { MediaController.getInstance().stopAudio(); } + } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { for (int a = 0; a < 8; a++) { chatMessageCellsCache.add(new ChatMessageCell(context)); @@ -614,6 +621,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not lastStatus = null; hasOwnBackground = true; chatAttachView = null; + chatAttachViewSheet = null; ResourceLoader.loadRecources(context); @@ -701,7 +709,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not Bundle args = new Bundle(); args.putBoolean("onlySelect", true); args.putInt("dialogsType", 1); - MessagesActivity fragment = new MessagesActivity(args); + DialogsActivity fragment = new DialogsActivity(args); fragment.setDelegate(ChatActivity.this); presentFragment(fragment); } else if (id == chat_enc_timer) { @@ -798,20 +806,19 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not selectedMessagesCanCopyIds.clear(); actionBar.hideActionMode(); updateVisibleRows(); - }/* else if (id == chat_menu_attach) { + } else if (id == chat_menu_attach) { if (getParentActivity() == null) { return; } - BottomSheet.Builder builder = new BottomSheet.Builder(getParentActivity()); + if (chatAttachView == null) { + BottomSheet.Builder builder = new BottomSheet.Builder(getParentActivity()); chatAttachView = new ChatAttachView(getParentActivity()); chatAttachView.setDelegate(new ChatAttachView.ChatAttachViewDelegate() { @Override public void didPressedButton(int button) { - if (visibleDialog != null) { - visibleDialog.dismiss(); - } if (button == 7) { + chatAttachViewSheet.dismiss(); HashMap selectedPhotos = chatAttachView.getSelectedPhotos(); if (!selectedPhotos.isEmpty()) { ArrayList photos = new ArrayList<>(); @@ -824,31 +831,50 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not showReplyPanel(false, null, null, null, false, true); } return; + } else { + chatAttachViewSheet.dismissWithButtonClick(button); } processSelectedAttach(button); } }); - } - builder.setCustomView(chatAttachView); - final int coords[] = new int[2]; - menuItem.getLocationInWindow(coords); - builder.setRevealAnimation(coords[0] + menuItem.getWidth() / 2, coords[1] + menuItem.getHeight() / 2); builder.setDelegate(new BottomSheet.BottomSheetDelegate() { - @Override - public void onOpenAnimationStart() { - chatAttachView.startAnimations(coords[1] > AndroidUtilities.displaySize.y - AndroidUtilities.dp(100)); + + @Override + public void onRevealAnimationStart(boolean open) { + chatAttachView.onRevealAnimationStart(open); + } + + @Override + public void onRevealAnimationProgress(boolean open, float radius, int x, int y) { + chatAttachView.onRevealAnimationProgress(open, radius, x, y); + } + + @Override + public void onRevealAnimationEnd(boolean open) { + chatAttachView.onRevealAnimationEnd(open); } @Override public void onOpenAnimationEnd() { - + chatAttachView.onRevealAnimationEnd(true); } - }); + + @Override + public View getRevealView() { + return menuItem; + } + }); + builder.setApplyTopPaddings(false); + builder.setUseRevealAnimation(); + builder.setCustomView(chatAttachView); + chatAttachViewSheet = builder.create(); + } + chatAttachView.init(ChatActivity.this); - showDialog(builder.create()); - }*/ else if (id == attach_gallery || id == attach_video || id == attach_document || id == attach_location || id == attach_photo || id == attach_audio || id == attach_contact || id == attach_sticker) { + showDialog(chatAttachViewSheet); + }/* else if (id == attach_gallery || id == attach_video || id == attach_document || id == attach_location || id == attach_photo || id == attach_audio || id == attach_contact) { processSelectedAttach(id); - } else if (id == bot_help) { + } */else if (id == bot_help) { SendMessagesHelper.getInstance().sendMessage("/help", dialog_id, null, null, false); } else if (id == bot_settings) { SendMessagesHelper.getInstance().sendMessage("/settings", dialog_id, null, null, false); @@ -866,12 +892,13 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not MessagesSearchQuery.searchMessagesInChat(null, dialog_id, classGuid, 1); } else if (id == search_down) { MessagesSearchQuery.searchMessagesInChat(null, dialog_id, classGuid, 2); - } - else if (id == add_member) { - openAddMember(); - } - } - }); + } else if (id == add_member) { //Plus + openAddMember(); + } /*else if (id == chat_background) { //Plus + presentFragment(new WallpapersActivity()); + }*/ + } + }); avatarContainer = new FrameLayoutFixed(context); avatarContainer.setBackgroundResource(R.drawable.bar_selector); @@ -958,7 +985,21 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not @Override public void onSearchCollapse() { avatarContainer.setVisibility(View.VISIBLE); + if (chatActivityEnterView.hasText()) { + if (headerItem != null) { + headerItem.setVisibility(View.GONE); + } + if (attachItem != null) { + attachItem.setVisibility(View.VISIBLE); + } + } else { + if (headerItem != null) { headerItem.setVisibility(View.VISIBLE); + } + if (attachItem != null) { + attachItem.setVisibility(View.GONE); + } + } searchItem.setVisibility(View.GONE); //chatActivityEnterView.setVisibility(View.VISIBLE); searchUpItem.clearAnimation(); @@ -976,7 +1017,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not searchItem.getSearchField().requestFocus(); AndroidUtilities.showKeyboard(searchItem.getSearchField()); } - }, 200); //TODO find a better way to open keyboard + }, 300); //TODO find a better way to open keyboard } @Override @@ -988,20 +1029,26 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not searchItem.getSearchField().setHint(LocaleController.getString("Search", R.string.Search)); searchItem.setVisibility(View.GONE); - searchUpItem = menu.addItem(search_up, R.drawable.search_up); + //searchUpItem = menu.addItem(search_up, R.drawable.search_up); + Drawable searchU = getParentActivity().getResources().getDrawable(R.drawable.search_up); + searchUpItem = menu.addItem(search_up, searchU); searchUpItem.setVisibility(View.GONE); - searchDownItem = menu.addItem(search_down, R.drawable.search_down); + //searchDownItem = menu.addItem(search_down, R.drawable.search_down); + Drawable searchD = getParentActivity().getResources().getDrawable(R.drawable.search_down); + searchDownItem = menu.addItem(search_down, searchD); searchDownItem.setVisibility(View.GONE); } //headerItem = menu.addItem(0, R.drawable.ic_ab_other); + //Plus Drawable dots = getParentActivity().getResources().getDrawable(R.drawable.ic_ab_other); - //dots.setColorFilter(AndroidUtilities.getIntDef("chatHeaderIconsColor", 0xffffffff), PorterDuff.Mode.MULTIPLY); + dots.setColorFilter(AndroidUtilities.getIntDef("chatHeaderIconsColor", 0xffffffff), PorterDuff.Mode.MULTIPLY); headerItem = menu.addItem(0, dots); final boolean isChat = (int) dialog_id < 0 && (int) (dialog_id >> 32) != 1; if(isChat)headerItem.addSubItem(add_member, LocaleController.getString("AddMember", R.string.AddMember), 0); - + //headerItem.addSubItem(chat_background, LocaleController.getString("ChatBackground", R.string.ChatBackground), 0); + //!Plus if (searchItem != null) { headerItem.addSubItem(search, LocaleController.getString("Search", R.string.Search), 0); } @@ -1018,9 +1065,6 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not headerItem.addSubItem(delete_chat, LocaleController.getString("DeleteChatUser", R.string.DeleteChatUser), 0); } muteItem = headerItem.addSubItem(mute, null, 0); - - - if (currentUser != null && currentEncryptedChat == null && (currentUser.flags & TLRPC.USER_FLAG_BOT) != 0) { headerItem.addSubItem(bot_settings, LocaleController.getString("BotSettings", R.string.BotSettings), 0); headerItem.addSubItem(bot_help, LocaleController.getString("BotHelp", R.string.BotHelp), 0); @@ -1031,36 +1075,15 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not updateSubtitle(); updateTitleIcons(); - //attachItem = menu.addItem(chat_menu_attach, R.drawable.ic_ab_other).setAllowCloseAnimation(false);; - attachItem = menu.addItem(chat_menu_attach, dots).setAllowCloseAnimation(false); - attachItem.addSubItem(attach_photo, LocaleController.getString("ChatTakePhoto", R.string.ChatTakePhoto), R.drawable.ic_attach_photo); - attachItem.addSubItem(attach_gallery, LocaleController.getString("ChatGallery", R.string.ChatGallery), R.drawable.ic_attach_gallery); - attachItem.addSubItem(attach_sticker, LocaleController.getString("AttachSticker", R.string.AttachSticker), R.drawable.ic_attach_sticker); - //attachItem.addSubItem(attach_music, LocaleController.getString("ChatMusic", R.string.ChatMusic), R.drawable.ic_attach_music); - attachItem.addSubItem(attach_audio, LocaleController.getString("ChatMusic", R.string.ChatMusic), R.drawable.ic_attach_music); - - attachItem.addSubItem(attach_video, LocaleController.getString("ChatVideo", R.string.ChatVideo), R.drawable.ic_attach_video); - attachItem.addSubItem(attach_document, LocaleController.getString("ChatDocument", R.string.ChatDocument), R.drawable.ic_ab_doc); - attachItem.addSubItem(attach_location, LocaleController.getString("ChatLocation", R.string.ChatLocation), R.drawable.ic_attach_location); - attachItem.addSubItem(attach_contact, LocaleController.getString("AttachContact", R.string.AttachContact), R.drawable.ic_attach_contact); - attachItem.setVisibility(View.GONE); - - Drawable clip = getParentActivity().getResources().getDrawable(R.drawable.ic_ab_attach_white); + //attachItem = menu.addItem(chat_menu_attach, R.drawable.ic_ab_other).setOverrideMenuClick(true).setAllowCloseAnimation(false); + attachItem = menu.addItem(chat_menu_attach, dots).setOverrideMenuClick(true).setAllowCloseAnimation(false); + attachItem.setVisibility(View.GONE); + + //menuItem = menu.addItem(chat_menu_attach, R.drawable.ic_ab_attach).setAllowCloseAnimation(false); + Drawable clip = getParentActivity().getResources().getDrawable(R.drawable.ic_ab_attach_white); clip.setColorFilter(themePrefs.getInt("chatEditTextIconsColor", 0xffadadad), PorterDuff.Mode.MULTIPLY); menuItem = menu.addItem(chat_menu_attach, clip).setAllowCloseAnimation(false); - //menuItem = menu.addItem(chat_menu_attach, R.drawable.ic_ab_attach).setAllowCloseAnimation(false);; - menuItem.addSubItem(attach_photo, LocaleController.getString("ChatTakePhoto", R.string.ChatTakePhoto), R.drawable.ic_attach_photo); - menuItem.addSubItem(attach_gallery, LocaleController.getString("ChatGallery", R.string.ChatGallery), R.drawable.ic_attach_gallery); - menuItem.addSubItem(attach_sticker, LocaleController.getString("AttachSticker", R.string.AttachSticker), R.drawable.ic_attach_sticker); - //menuItem.addSubItem(attach_music, LocaleController.getString("ChatMusic", R.string.ChatMusic), R.drawable.ic_attach_music); - menuItem.addSubItem(attach_audio, LocaleController.getString("ChatMusic", R.string.ChatMusic), R.drawable.ic_attach_music); - - menuItem.addSubItem(attach_video, LocaleController.getString("ChatVideo", R.string.ChatVideo), R.drawable.ic_attach_video); - menuItem.addSubItem(attach_document, LocaleController.getString("ChatDocument", R.string.ChatDocument), R.drawable.ic_ab_doc); - menuItem.addSubItem(attach_location, LocaleController.getString("ChatLocation", R.string.ChatLocation), R.drawable.ic_attach_location); - menuItem.addSubItem(attach_contact, LocaleController.getString("AttachContact", R.string.AttachContact), R.drawable.ic_attach_contact); - menuItem.setShowFromBottom(true); - menuItem.setBackgroundDrawable(null); + menuItem.setBackgroundDrawable(null); actionModeViews.clear(); @@ -1076,7 +1099,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not selectedMessagesCountTextView.setEllipsize(TextUtils.TruncateAt.END); selectedMessagesCountTextView.setPadding(AndroidUtilities.dp(11), 0, 0, AndroidUtilities.dp(2)); selectedMessagesCountTextView.setGravity(Gravity.CENTER_VERTICAL); - actionMode.addView(selectedMessagesCountTextView, LayoutHelper.createLinear(0, LayoutHelper.MATCH_PARENT, 1.0f)); + actionMode.addView(selectedMessagesCountTextView, LayoutHelper.createLinear(0, LayoutHelper.MATCH_PARENT, 1.0f)); selectedMessagesCountTextView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { @@ -1122,14 +1145,10 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { - View child = getChildAt(i); - if (child == chatActivityEnterView) { - measureChildWithMargins(child, widthMeasureSpec, 0, heightMeasureSpec, 0); - inputFieldHeight = child.getMeasuredHeight(); - break; - } - } + + measureChildWithMargins(chatActivityEnterView, widthMeasureSpec, 0, heightMeasureSpec, 0); + inputFieldHeight = chatActivityEnterView.getMeasuredHeight(); + for (int i = 0; i < childCount; i++) { View child = getChildAt(i); if (child.getVisibility() == GONE || child == chatActivityEnterView) { @@ -1222,8 +1241,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not }; SizeNotifierFrameLayout contentView = (SizeNotifierFrameLayout) fragmentView; - - contentView.setBackgroundImage(ApplicationLoader.getCachedWallpaper()); + contentView.setBackgroundImage(ApplicationLoader.getCachedWallpaper()); emptyViewContainer = new FrameLayout(context); emptyViewContainer.setVisibility(View.INVISIBLE); @@ -1244,7 +1262,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } emptyView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); emptyView.setGravity(Gravity.CENTER); - emptyView.setTextColor(0xffffffff); + //emptyView.setTextColor(0xffffffff); + emptyView.setTextColor(themePrefs.getInt("chatDateColor", 0xffffffff)); emptyView.setBackgroundResource(ApplicationLoader.isCustomTheme() ? R.drawable.system_black : R.drawable.system_blue); emptyView.setPadding(AndroidUtilities.dp(7), AndroidUtilities.dp(1), AndroidUtilities.dp(7), AndroidUtilities.dp(1)); emptyViewContainer.addView(emptyView, new FrameLayout.LayoutParams(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); @@ -1715,6 +1734,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not @Override public void onAttachButtonHidden() { + if (actionBar.isSearchFieldVisible()) { + return; + } if (attachItem != null) { attachItem.setVisibility(View.VISIBLE); } @@ -1725,6 +1747,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not @Override public void onAttachButtonShow() { + if (actionBar.isSearchFieldVisible()) { + return; + } if (attachItem != null) { attachItem.setVisibility(View.GONE); } @@ -1735,7 +1760,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not @Override public void onWindowSizeChanged(int size) { - if (size < AndroidUtilities.dp(72) + AndroidUtilities.getCurrentActionBarHeight()) { + if (size < AndroidUtilities.dp(72) + ActionBar.getCurrentActionBarHeight()) { allowStickersPanel = false; if (stickersPanel.getVisibility() == View.VISIBLE) { stickersPanel.clearAnimation(); @@ -2216,12 +2241,15 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not }); presentFragment(fragment); } else if (which == attach_audio) { - try { - Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI); - startActivityForResult(intent, 32); - } catch (Exception e) { - FileLog.e("tmessages", e); - } + AudioSelectActivity fragment = new AudioSelectActivity(); + fragment.setDelegate(new AudioSelectActivity.AudioSelectActivityDelegate() { + @Override + public void didSelectAudio(ArrayList audios) { + SendMessagesHelper.prepareSendingAudioDocuments(audios, dialog_id, replyingMessageObject); + showReplyPanel(false, null, null, null, false, true); + } + }); + presentFragment(fragment); } else if (which == attach_contact) { try { Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); @@ -2360,7 +2388,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not mess = mess.substring(0, 150); } mess = mess.replace("\n", " "); - replyObjectTextView.setText(Emoji.replaceEmoji(mess, replyObjectTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(14))); + replyObjectTextView.setText(Emoji.replaceEmoji(mess, replyObjectTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(14), false)); } } else if (messageObjects != null) { if (messageObjects.isEmpty()) { @@ -2427,7 +2455,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not mess = mess.substring(0, 150); } mess = mess.replace("\n", " "); - replyObjectTextView.setText(Emoji.replaceEmoji(mess, replyObjectTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(14))); + replyObjectTextView.setText(Emoji.replaceEmoji(mess, replyObjectTextView.getPaint().getFontMetricsInt(), AndroidUtilities.dp(14), false)); } else { replyObjectTextView.setText(LocaleController.formatPluralString("ForwardedMessage", messageObjects.size())); } @@ -2446,7 +2474,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } } else if (type == 12) { replyObjectTextView.setText(LocaleController.formatPluralString("ForwardedContact", messageObjects.size())); - } else if (type == 2) { + } else if (type == 2 || type == 14) { replyObjectTextView.setText(LocaleController.formatPluralString("ForwardedAudio", messageObjects.size())); } else if (type == 13) { replyObjectTextView.setText(LocaleController.formatPluralString("ForwardedSticker", messageObjects.size())); @@ -3769,7 +3797,6 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (currentEncryptedChat != null && obj.isOut() && obj.messageOwner.action != null && obj.messageOwner.action instanceof TLRPC.TL_messageEncryptedAction && obj.messageOwner.action.encryptedAction instanceof TLRPC.TL_decryptedMessageActionSetMessageTTL && getParentActivity() != null) { - TLRPC.TL_decryptedMessageActionSetMessageTTL action = (TLRPC.TL_decryptedMessageActionSetMessageTTL) obj.messageOwner.action.encryptedAction; if (AndroidUtilities.getPeerLayerVersion(currentEncryptedChat.layer) < 17 && currentEncryptedChat.ttl > 0 && currentEncryptedChat.ttl <= 60) { AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); @@ -4187,7 +4214,6 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not int encId = (Integer) args[0]; if (currentEncryptedChat != null && currentEncryptedChat.id == encId) { int date = (Integer) args[1]; - boolean started = false; for (MessageObject obj : messages) { if (!obj.isOut()) { continue; @@ -4200,7 +4226,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } updateVisibleRows(); } - } else if (id == NotificationCenter.audioDidReset) { + } else if (id == NotificationCenter.audioDidReset || id == NotificationCenter.audioPlayStateChanged) { Integer mid = (Integer) args[0]; if (chatListView != null) { int count = chatListView.getChildCount(); @@ -4209,7 +4235,13 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (view instanceof ChatAudioCell) { ChatAudioCell cell = (ChatAudioCell) view; if (cell.getMessageObject() != null && cell.getMessageObject().getId() == mid) { - cell.updateButtonState(); + cell.updateButtonState(false); + break; + } + } else if (view instanceof ChatMusicCell) { + ChatMusicCell cell = (ChatMusicCell) view; + if (cell.getMessageObject() != null && cell.getMessageObject().getId() == mid) { + cell.updateButtonState(false); break; } } @@ -4227,6 +4259,16 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not cell.updateProgress(); break; } + } else if (view instanceof ChatMusicCell) { + ChatMusicCell cell = (ChatMusicCell) view; + if (cell.getMessageObject() != null && cell.getMessageObject().getId() == mid) { + MessageObject playing = cell.getMessageObject(); + MessageObject player = MediaController.getInstance().getPlayingMessageObject(); + playing.audioProgress = player.audioProgress; + playing.audioProgressSec = player.audioProgressSec; + cell.updateProgress(); + break; + } } } } @@ -4303,6 +4345,27 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } else if (id == NotificationCenter.audioDidStarted) { MessageObject messageObject = (MessageObject) args[0]; sendSecretMessageRead(messageObject); + + int mid = messageObject.getId(); + if (chatListView != null) { + int count = chatListView.getChildCount(); + for (int a = 0; a < count; a++) { + View view = chatListView.getChildAt(a); + if (view instanceof ChatAudioCell) { + ChatAudioCell cell = (ChatAudioCell) view; + if (cell.getMessageObject() != null && cell.getMessageObject().getId() == mid) { + cell.updateButtonState(false); + break; + } + } else if (view instanceof ChatMusicCell) { + ChatMusicCell cell = (ChatMusicCell) view; + if (cell.getMessageObject() != null && cell.getMessageObject().getId() == mid) { + cell.updateButtonState(false); + break; + } + } + } + } } else if (id == NotificationCenter.updateMessageMedia) { MessageObject messageObject = (MessageObject) args[0]; MessageObject existMessageObject = messagesDict.get(messageObject.getId()); @@ -4652,20 +4715,30 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } private void updateTheme(){ - SharedPreferences themePrefs = ApplicationLoader.applicationContext.getSharedPreferences(AndroidUtilities.THEME_PREFS, AndroidUtilities.THEME_PREFS_MODE); - int def = themePrefs.getInt("themeColor", AndroidUtilities.defColor); - actionBar.setBackgroundColor(themePrefs.getInt("chatHeaderColor", def)); - nameTextView.setTextColor(themePrefs.getInt("chatNameColor", 0xffffffff)); - nameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, themePrefs.getInt("chatNameSize", 18)); - onlineTextView.setTextColor(themePrefs.getInt("chatStatusColor", AndroidUtilities.getIntDarkerColor("themeColor", -0x40))); - onlineTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, themePrefs.getInt("chatStatusSize", 14)); - int iColor = themePrefs.getInt("chatHeaderIconsColor", 0xffffffff); - Drawable mute = getParentActivity().getResources().getDrawable(R.drawable.mute_blue); - mute.setColorFilter(iColor, PorterDuff.Mode.SRC_IN); - Drawable dots = getParentActivity().getResources().getDrawable(R.drawable.ic_ab_other); - dots.setColorFilter(iColor, PorterDuff.Mode.MULTIPLY); - Drawable back = getParentActivity().getResources().getDrawable(R.drawable.ic_ab_back); - back.setColorFilter(iColor, PorterDuff.Mode.MULTIPLY); + try{ + SharedPreferences themePrefs = ApplicationLoader.applicationContext.getSharedPreferences(AndroidUtilities.THEME_PREFS, AndroidUtilities.THEME_PREFS_MODE); + int def = themePrefs.getInt("themeColor", AndroidUtilities.defColor); + actionBar.setBackgroundColor(themePrefs.getInt("chatHeaderColor", def)); + nameTextView.setTextColor(themePrefs.getInt("chatNameColor", 0xffffffff)); + nameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, themePrefs.getInt("chatNameSize", 18)); + onlineTextView.setTextColor(themePrefs.getInt("chatStatusColor", AndroidUtilities.getIntDarkerColor("themeColor", -0x40))); + onlineTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, themePrefs.getInt("chatStatusSize", 14)); + int iColor = themePrefs.getInt("chatHeaderIconsColor", 0xffffffff); + Drawable mute = getParentActivity().getResources().getDrawable(R.drawable.mute_blue); + mute.setColorFilter(iColor, PorterDuff.Mode.SRC_IN); + Drawable dots = getParentActivity().getResources().getDrawable(R.drawable.ic_ab_other); + dots.setColorFilter(iColor, PorterDuff.Mode.MULTIPLY); + Drawable back = getParentActivity().getResources().getDrawable(R.drawable.ic_ab_back); + back.setColorFilter(iColor, PorterDuff.Mode.MULTIPLY); + + Drawable searchD = getParentActivity().getResources().getDrawable(R.drawable.search_down); + searchD.setColorFilter(iColor, PorterDuff.Mode.SRC_IN); + Drawable searchU = getParentActivity().getResources().getDrawable(R.drawable.search_up); + searchU.setColorFilter(iColor, PorterDuff.Mode.SRC_IN); + if(searchItem != null)searchItem.getSearchField().setTextColor(iColor); + } catch (Exception e) { + FileLog.e("tmessages", e); + } } @Override @@ -4751,7 +4824,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (AndroidUtilities.isTablet()) { SharedPreferences themePrefs = ApplicationLoader.applicationContext.getSharedPreferences(AndroidUtilities.THEME_PREFS, AndroidUtilities.THEME_PREFS_MODE); int color = themePrefs.getInt("chatHeaderIconsColor", 0xffffffff); - if (AndroidUtilities.isSmallTablet() && getParentActivity().getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { + if (AndroidUtilities.isSmallTablet() && ApplicationLoader.applicationContext.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { //actionBar.setBackButtonImage(R.drawable.ic_ab_back); Drawable back = getParentActivity().getResources().getDrawable(R.drawable.ic_ab_back); back.setColorFilter(color, PorterDuff.Mode.MULTIPLY); @@ -4763,7 +4836,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not actionBar.setBackButtonDrawable(back); } } - int padding = (AndroidUtilities.getCurrentActionBarHeight() - AndroidUtilities.dp(48)) / 2; + int padding = (ActionBar.getCurrentActionBarHeight() - AndroidUtilities.dp(48)) / 2; avatarContainer.setPadding(avatarContainer.getPaddingLeft(), padding, avatarContainer.getPaddingRight(), padding); FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) avatarContainer.getLayoutParams(); layoutParams.topMargin = (Build.VERSION.SDK_INT >= 21 ? AndroidUtilities.statusBarHeight : 0); @@ -4837,7 +4910,13 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not options = new int[]{8, 22, 2, 3, 1}; } else if (type == 4) { if (selectedObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument) { - items = new CharSequence[]{LocaleController.getString("Reply", R.string.Reply), LocaleController.getString("SaveToDownloads", R.string.SaveToDownloads), LocaleController.getString("ShareFile", R.string.ShareFile), LocaleController.getString("Forward", R.string.Forward), LocaleController.getString("ForwardNoQuote", R.string.ForwardNoQuote), LocaleController.getString("Delete", R.string.Delete)}; + String saveString; + if (selectedObject.isMusic()) { + saveString = LocaleController.getString("SaveToMusic", R.string.SaveToMusic); + } else { + saveString = LocaleController.getString("SaveToDownloads", R.string.SaveToDownloads); + } + items = new CharSequence[]{LocaleController.getString("Reply", R.string.Reply), saveString, LocaleController.getString("ShareFile", R.string.ShareFile), LocaleController.getString("Forward", R.string.Forward), LocaleController.getString("ForwardNoQuote", R.string.ForwardNoQuote), LocaleController.getString("Delete", R.string.Delete)}; options = new int[]{8, 10, 4, 22, 2, 1}; } else { items = new CharSequence[]{LocaleController.getString("Reply", R.string.Reply), LocaleController.getString("SaveToGallery", R.string.SaveToGallery), LocaleController.getString("Forward", R.string.Forward), LocaleController.getString("ForwardNoQuote", R.string.ForwardNoQuote), LocaleController.getString("Delete", R.string.Delete)}; @@ -4847,7 +4926,13 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not items = new CharSequence[]{LocaleController.getString("Reply", R.string.Reply), LocaleController.getString("ApplyTheme", R.string.ApplyTheme), LocaleController.getString("ShareFile", R.string.ShareFile), LocaleController.getString("Forward", R.string.Forward), LocaleController.getString("ForwardNoQuote", R.string.ForwardNoQuote), LocaleController.getString("Delete", R.string.Delete)}; options = new int[]{8, 5, 4, 22, 2, 1}; } else if (type == 6) { - items = new CharSequence[]{LocaleController.getString("Reply", R.string.Reply), LocaleController.getString("SaveToGallery", R.string.SaveToGallery), LocaleController.getString("SaveToDownloads", R.string.SaveToDownloads), LocaleController.getString("ShareFile", R.string.ShareFile), LocaleController.getString("Forward", R.string.Forward), LocaleController.getString("ForwardNoQuote", R.string.ForwardNoQuote), LocaleController.getString("Delete", R.string.Delete)}; + String saveString; + if (selectedObject.isMusic()) { + saveString = LocaleController.getString("SaveToMusic", R.string.SaveToMusic); + } else { + saveString = LocaleController.getString("SaveToDownloads", R.string.SaveToDownloads); + } + items = new CharSequence[]{LocaleController.getString("Reply", R.string.Reply), LocaleController.getString("SaveToGallery", R.string.SaveToGallery), saveString, LocaleController.getString("ShareFile", R.string.ShareFile), LocaleController.getString("Forward", R.string.Forward), LocaleController.getString("ForwardNoQuote", R.string.ForwardNoQuote), LocaleController.getString("Delete", R.string.Delete)}; options = new int[]{8, 7, 10, 6, 22, 2, 1}; } else if (type == 7) { items = new CharSequence[]{LocaleController.getString("Reply", R.string.Reply), LocaleController.getString("Forward", R.string.Forward), LocaleController.getString("ForwardNoQuote", R.string.ForwardNoQuote), LocaleController.getString("AddToStickers", R.string.AddToStickers), LocaleController.getString("Delete", R.string.Delete)}; @@ -4862,7 +4947,13 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not options = new int[]{22, 2, 3, 1}; } else if (type == 4) { if (selectedObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument) { - items = new CharSequence[]{LocaleController.getString("SaveToDownloads", R.string.SaveToDownloads), LocaleController.getString("ShareFile", R.string.ShareFile), LocaleController.getString("Forward", R.string.Forward), LocaleController.getString("ForwardNoQuote", R.string.ForwardNoQuote), LocaleController.getString("Delete", R.string.Delete)}; + String saveString; + if (selectedObject.isMusic()) { + saveString = LocaleController.getString("SaveToMusic", R.string.SaveToMusic); + } else { + saveString = LocaleController.getString("SaveToDownloads", R.string.SaveToDownloads); + } + items = new CharSequence[]{saveString, LocaleController.getString("ShareFile", R.string.ShareFile), LocaleController.getString("Forward", R.string.Forward), LocaleController.getString("ForwardNoQuote", R.string.ForwardNoQuote), LocaleController.getString("Delete", R.string.Delete)}; options = new int[]{10, 4, 22, 2, 1}; } else { items = new CharSequence[]{LocaleController.getString("SaveToGallery", R.string.SaveToGallery), LocaleController.getString("Forward", R.string.Forward), LocaleController.getString("ForwardNoQuote", R.string.ForwardNoQuote), LocaleController.getString("Delete", R.string.Delete)}; @@ -4872,7 +4963,13 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not items = new CharSequence[]{LocaleController.getString("ApplyTheme", R.string.ApplyTheme), LocaleController.getString("ShareFile", R.string.ShareFile), LocaleController.getString("Forward", R.string.Forward), LocaleController.getString("ForwardNoQuote", R.string.ForwardNoQuote), LocaleController.getString("Delete", R.string.Delete)}; options = new int[]{5, 4, 22, 2, 1}; } else if (type == 6) { - items = new CharSequence[]{LocaleController.getString("SaveToGallery", R.string.SaveToGallery), LocaleController.getString("SaveToDownloads", R.string.SaveToDownloads), LocaleController.getString("ShareFile", R.string.ShareFile), LocaleController.getString("Forward", R.string.Forward), LocaleController.getString("ForwardNoQuote", R.string.ForwardNoQuote), LocaleController.getString("Delete", R.string.Delete)}; + String saveString; + if (selectedObject.isMusic()) { + saveString = LocaleController.getString("SaveToMusic", R.string.SaveToMusic); + } else { + saveString = LocaleController.getString("SaveToDownloads", R.string.SaveToDownloads); + } + items = new CharSequence[]{LocaleController.getString("SaveToGallery", R.string.SaveToGallery), saveString, LocaleController.getString("ShareFile", R.string.ShareFile), LocaleController.getString("Forward", R.string.Forward), LocaleController.getString("ForwardNoQuote", R.string.ForwardNoQuote), LocaleController.getString("Delete", R.string.Delete)}; options = new int[]{7, 10, 6, 22, 2, 1}; } else if (type == 7) { items = new CharSequence[]{LocaleController.getString("Reply", R.string.Reply), LocaleController.getString("Forward", R.string.Forward), LocaleController.getString("ForwardNoQuote", R.string.ForwardNoQuote), LocaleController.getString("AddToStickers", R.string.AddToStickers), LocaleController.getString("Delete", R.string.Delete)}; @@ -4888,7 +4985,13 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not options = new int[]{3, 1}; } else if (type == 4) { if (selectedObject.messageOwner.media instanceof TLRPC.TL_messageMediaDocument) { - items = new CharSequence[]{LocaleController.getString("SaveToDownloads", R.string.SaveToDownloads), LocaleController.getString("ShareFile", R.string.ShareFile), LocaleController.getString("Delete", R.string.Delete)}; + String saveString; + if (selectedObject.isMusic()) { + saveString = LocaleController.getString("SaveToMusic", R.string.SaveToMusic); + } else { + saveString = LocaleController.getString("SaveToDownloads", R.string.SaveToDownloads); + } + items = new CharSequence[]{saveString, LocaleController.getString("ShareFile", R.string.ShareFile), LocaleController.getString("Delete", R.string.Delete)}; options = new int[]{10, 4, 1}; } else { items = new CharSequence[]{LocaleController.getString("SaveToGallery", R.string.SaveToGallery), LocaleController.getString("Delete", R.string.Delete)}; @@ -4898,8 +5001,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not items = new CharSequence[]{LocaleController.getString("ApplyTheme", R.string.ApplyTheme), LocaleController.getString("Delete", R.string.Delete)}; options = new int[]{5, 1}; } else if (type == 7) { - items = new CharSequence[]{LocaleController.getString("Reply", R.string.Reply), LocaleController.getString("Forward", R.string.Forward), LocaleController.getString("AddToStickers", R.string.AddToStickers), LocaleController.getString("Delete", R.string.Delete)}; - options = new int[]{8, 2, 9, 1}; + items = new CharSequence[]{LocaleController.getString("Reply", R.string.Reply), LocaleController.getString("Forward", R.string.Forward), LocaleController.getString("ForwardNoQuote", R.string.ForwardNoQuote), LocaleController.getString("AddToStickers", R.string.AddToStickers), LocaleController.getString("Delete", R.string.Delete)}; + options = new int[]{8, 22, 2, 9, 1}; } } } @@ -4985,7 +5088,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not Bundle args = new Bundle(); args.putBoolean("onlySelect", true); args.putInt("dialogsType", 1); - MessagesActivity fragment = new MessagesActivity(args); + DialogsActivity fragment = new DialogsActivity(args); fragment.setDelegate(this); presentFragment(fragment); } else if (option == 3) { @@ -5017,7 +5120,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not MediaController.saveFile(path, getParentActivity(), 1, null); } else if (selectedObject.type == 1) { MediaController.saveFile(path, getParentActivity(), 0, null); - } else if (selectedObject.type == 8 || selectedObject.type == 9) { + } else if (selectedObject.type == 8 || selectedObject.type == 9 || selectedObject.type == 14) { 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))); @@ -5089,9 +5192,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not showDialog(builder.create()); } } - } - else if (option == 6 || option == 7) { - String fileName = selectedObject.getFileName(); + } else if (option == 6 || option == 7) { String path = selectedObject.messageOwner.attachPath; if (path != null && path.length() > 0) { File temp = new File(path); @@ -5102,7 +5203,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (path == null || path.length() == 0) { path = FileLoader.getPathToMessage(selectedObject.messageOwner).toString(); } - if (selectedObject.type == 8 || selectedObject.type == 9) { + if (selectedObject.type == 8 || selectedObject.type == 9 || selectedObject.type == 14) { if (option == 6) { Intent intent = new Intent(Intent.ACTION_SEND); intent.setType(selectedObject.messageOwner.media.document.mime_type); @@ -5170,13 +5271,13 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (path == null || path.length() == 0) { path = FileLoader.getPathToMessage(selectedObject.messageOwner).toString(); } - MediaController.saveFile(path, getParentActivity(), 2, fileName); + MediaController.saveFile(path, getParentActivity(), selectedObject.isMusic() ? 3 : 2, fileName); } selectedObject = null; } @Override - public void didSelectDialog(MessagesActivity activity, long did, boolean param) { + public void didSelectDialog(DialogsActivity activity, long did, boolean param) { if (dialog_id != 0 && (forwaringMessage != null || !selectedMessagesIds.isEmpty())) { ArrayList fmessages = new ArrayList<>(); if (forwaringMessage != null) { @@ -5254,7 +5355,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not public boolean isGoogleMapsInstalled() { try { - ApplicationInfo info = ApplicationLoader.applicationContext.getPackageManager().getApplicationInfo("com.google.android.apps.maps", 0); + ApplicationLoader.applicationContext.getPackageManager().getApplicationInfo("com.google.android.apps.maps", 0); return true; } catch (PackageManager.NameNotFoundException e) { if (getParentActivity() == null) { @@ -5506,7 +5607,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (url.startsWith("@")) { MessagesController.openByUserName(url.substring(1), ChatActivity.this, 0); } else if (url.startsWith("#")) { - MessagesActivity fragment = new MessagesActivity(null); + DialogsActivity fragment = new DialogsActivity(null); fragment.setSearchString(url); presentFragment(fragment); } else if (url.startsWith("/")) { @@ -5514,6 +5615,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } } }); + } else if (viewType == 8) { + view = new ChatMusicCell(mContext); } if (view instanceof ChatBaseCell) { @@ -5554,7 +5657,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (url.startsWith("@")) { MessagesController.openByUserName(url.substring(1), ChatActivity.this, 0); } else if (url.startsWith("#")) { - MessagesActivity fragment = new MessagesActivity(null); + DialogsActivity fragment = new DialogsActivity(null); fragment.setSearchString(url); presentFragment(fragment); } else if (url.startsWith("/")) { @@ -5566,7 +5669,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not public void needOpenWebView(String url, String title, String originalUrl, int w, int h) { BottomSheet.Builder builder = new BottomSheet.Builder(mContext); builder.setCustomView(new WebFrameLayout(mContext, builder.create(), title, originalUrl, url, w, h)); - builder.setOverrideTabletWidth(true); + builder.setUseFullWidth(true); showDialog(builder.create()); } @@ -5727,6 +5830,13 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not showDialog(builder.create()); } }); + } else if (view instanceof ChatMusicCell) { + ((ChatMusicCell) view).setMusicDelegate(new ChatMusicCell.ChatMusicCellDelegate() { + @Override + public boolean needPlayMusic(MessageObject messageObject) { + return MediaController.getInstance().setPlaylist(messages, messageObject); + } + }); } } else if (view instanceof ChatActionCell) { ((ChatActionCell) view).setDelegate(new ChatActionCell.ChatActionCellDelegate() { 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 d8c30f25..83503d6f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarDrawable.java @@ -20,11 +20,11 @@ import android.text.StaticLayout; import android.text.TextPaint; import org.telegram.android.AndroidUtilities; -import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.FileLog; import org.telegram.messenger.R; import org.telegram.messenger.TLRPC; import org.telegram.messenger.UserConfig; +import org.telegram.messenger.ApplicationLoader; import java.util.Locale; 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 2ac30c33..f1798b9a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java @@ -51,6 +51,7 @@ import org.telegram.messenger.FileLog; import org.telegram.messenger.R; import org.telegram.messenger.TLRPC; import org.telegram.messenger.UserConfig; +import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.BaseFragment; import java.util.Locale; @@ -119,6 +120,7 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat private BaseFragment parentFragment; private long dialog_id; private boolean ignoreTextChange; + private int innerTextChange; private MessageObject replyingMessageObject; private MessageObject botMessageObject; private TLRPC.WebPage messageWebPage; @@ -194,7 +196,16 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat } }); - messageEditText = new EditText(context); + messageEditText = new EditText(context) { + @Override + public boolean onTouchEvent(MotionEvent event) { + if (isPopupShowing() && event.getAction() == MotionEvent.ACTION_DOWN) { + showPopup(AndroidUtilities.usingHardwareInput ? 0 : 2, 0); + openKeyboardInternal(); + } + return super.onTouchEvent(event); + } + }; messageEditText.setHint(LocaleController.getString("TypeMessage", R.string.TypeMessage)); messageEditText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI); messageEditText.setInputType(messageEditText.getInputType() | EditorInfo.TYPE_TEXT_FLAG_CAP_SENTENCES | EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE); @@ -223,14 +234,6 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat return false; } }); - messageEditText.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - if (isPopupShowing()) { - showPopup(AndroidUtilities.usingHardwareInput ? 0 : 2, 0); - } - } - }); messageEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { @@ -247,6 +250,8 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat } }); messageEditText.addTextChangedListener(new TextWatcher() { + boolean processChange = false; + @Override public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { @@ -254,16 +259,20 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat @Override public void onTextChanged(CharSequence charSequence, int start, int before, int count) { - String message = getTrimmedString(charSequence.toString()); + if (innerTextChange == 1) { + return; + } checkSendButton(true); - + String message = getTrimmedString(charSequence.toString()); if (delegate != null) { if (count > 2 || charSequence == null || charSequence.length() == 0) { messageWebPageSearch = true; } delegate.onTextChanged(charSequence, before > count + 1 || (count - before) > 2); } - + if (innerTextChange != 2 && before != count && (count - before) > 1) { + processChange = true; + } if (message.length() != 0 && lastTypingTimeSend < System.currentTimeMillis() - 5000 && !ignoreTextChange) { int currentTime = ConnectionsManager.getInstance().getCurrentTime(); TLRPC.User currentUser = null; @@ -282,19 +291,19 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat @Override public void afterTextChanged(Editable editable) { + if (innerTextChange != 0) { + return; + } 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, messageEditText.getPaint().getFontMetricsInt(), AndroidUtilities.dp(20)); - return; + if (processChange) { + ImageSpan[] spans = editable.getSpans(0, editable.length(), ImageSpan.class); + for (int i = 0; i < spans.length; i++) { + editable.removeSpan(spans[i]); } - editable.removeSpan(arrayOfImageSpan[i]); - i++; + Emoji.replaceEmoji(editable, messageEditText.getPaint().getFontMetricsInt(), AndroidUtilities.dp(20), false); + processChange = false; } } }); @@ -623,7 +632,7 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat delegate.onWindowSizeChanged(size); } if (topView != null) { - if (size < AndroidUtilities.dp(72) + AndroidUtilities.getCurrentActionBarHeight()) { + if (size < AndroidUtilities.dp(72) + ActionBar.getCurrentActionBarHeight()) { if (allowShowTopView) { allowShowTopView = false; if (needShowTopView) { @@ -806,11 +815,7 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat }); runningAnimation2.start(); - if (messageEditText != null) { - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) messageEditText.getLayoutParams(); - layoutParams.rightMargin = AndroidUtilities.dp(0); - messageEditText.setLayoutParams(layoutParams); - } + updateFieldRight(0); delegate.onAttachButtonHidden(); } @@ -856,9 +861,7 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat attachButton.setVisibility(View.GONE); attachButton.clearAnimation(); delegate.onAttachButtonHidden(); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) messageEditText.getLayoutParams(); - layoutParams.rightMargin = AndroidUtilities.dp(0); - messageEditText.setLayoutParams(layoutParams); + updateFieldRight(0); } } } @@ -887,11 +890,7 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat runningAnimation2.setDuration(100); runningAnimation2.start(); - if (messageEditText != null) { - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) messageEditText.getLayoutParams(); - layoutParams.rightMargin = AndroidUtilities.dp(50); - messageEditText.setLayoutParams(layoutParams); - } + updateFieldRight(1); delegate.onAttachButtonShow(); } @@ -936,14 +935,37 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat if (attachButton != null) { delegate.onAttachButtonShow(); attachButton.setVisibility(View.VISIBLE); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) messageEditText.getLayoutParams(); - layoutParams.rightMargin = AndroidUtilities.dp(50); - messageEditText.setLayoutParams(layoutParams); + updateFieldRight(1); } } } } + private void updateFieldRight(int attachVisible) { + if (messageEditText == null) { + return; + } + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) messageEditText.getLayoutParams(); + if (attachVisible == 1) { + if (botButton != null && botButton.getVisibility() == VISIBLE) { + layoutParams.rightMargin = AndroidUtilities.dp(98); + } else { + layoutParams.rightMargin = AndroidUtilities.dp(50); + } + } else if (attachVisible == 2) { + if (layoutParams.rightMargin != AndroidUtilities.dp(2)) { + if (botButton != null && botButton.getVisibility() == VISIBLE) { + layoutParams.rightMargin = AndroidUtilities.dp(98); + } else { + layoutParams.rightMargin = AndroidUtilities.dp(50); + } + } + } else { + layoutParams.rightMargin = AndroidUtilities.dp(2); + } + messageEditText.setLayoutParams(layoutParams); + } + private void updateAudioRecordIntefrace() { if (recordingAudio) { if (audioInterfaceState == 1) { @@ -1153,6 +1175,7 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat } else { botButton.setVisibility(GONE); } + updateFieldRight(2); ViewProxy.setPivotX(attachButton, AndroidUtilities.dp(botButton.getVisibility() == GONE ? 48 : 96)); attachButton.clearAnimation(); } @@ -1257,12 +1280,15 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat i = 0; } try { - CharSequence localCharSequence = Emoji.replaceEmoji(symbol/* + "\uFE0F"*/, messageEditText.getPaint().getFontMetricsInt(), AndroidUtilities.dp(20)); + innerTextChange = 2; + CharSequence localCharSequence = Emoji.replaceEmoji(symbol/* + "\uFE0F"*/, messageEditText.getPaint().getFontMetricsInt(), AndroidUtilities.dp(20), false); messageEditText.setText(messageEditText.getText().insert(i, localCharSequence)); int j = i + localCharSequence.length(); messageEditText.setSelection(j, j); } catch (Exception e) { FileLog.e("tmessages", e); + } finally { + innerTextChange = 0; } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiView.java index 3cb770d4..dd67321a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/EmojiView.java @@ -128,7 +128,6 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific stickersWrap = new FrameLayout(context); stickersWrap.addView(gridView); - TextView textView = new TextView(context); textView.setText(LocaleController.getString("NoStickers", R.string.NoStickers)); textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); @@ -205,6 +204,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific //scrollSlidingTabStrip.setUnderlineColor(0xffe2e5e7); scrollSlidingTabStrip.setIndicatorColor(tabColor); scrollSlidingTabStrip.setUnderlineColor(lineColor); + scrollSlidingTabStrip.setVisibility(INVISIBLE); addView(scrollSlidingTabStrip, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.LEFT | Gravity.TOP)); ViewProxy.setTranslationX(scrollSlidingTabStrip, AndroidUtilities.displaySize.x); updateStickerTabs(); @@ -375,6 +375,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific if (ViewProxy.getTranslationX(pagerSlidingTabStripContainer) != margin) { ViewProxy.setTranslationX(pagerSlidingTabStripContainer, margin); ViewProxy.setTranslationX(scrollSlidingTabStrip, width + margin); + scrollSlidingTabStrip.setVisibility(margin < 0 ? VISIBLE : INVISIBLE); if (Build.VERSION.SDK_INT < 11) { if (margin <= -width) { pagerSlidingTabStripContainer.clearAnimation(); @@ -464,7 +465,7 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific stringBuilder.append("="); stringBuilder.append(entry.getValue()); } - getContext().getSharedPreferences("emoji", 0).edit().putString("stickers", stringBuilder.toString()).commit(); + preferences.edit().putString("stickers", stringBuilder.toString()).commit(); } private void sortStickers() { @@ -580,10 +581,12 @@ public class EmojiView extends FrameLayout implements NotificationCenter.Notific layoutParams.width = View.MeasureSpec.getSize(widthMeasureSpec); if (scrollSlidingTabStrip != null) { layoutParams1 = (FrameLayout.LayoutParams) scrollSlidingTabStrip.getLayoutParams(); + if (layoutParams1 != null) { layoutParams1.width = layoutParams.width; } + } if (layoutParams.width != oldWidth) { - if (scrollSlidingTabStrip != null) { + if (scrollSlidingTabStrip != null && layoutParams1 != null) { onPageScrolled(pager.getCurrentItem(), layoutParams.width, 0); scrollSlidingTabStrip.setLayoutParams(layoutParams1); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/LetterSectionsListView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/LetterSectionsListView.java index aedc5bcd..9ac490ad 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/LetterSectionsListView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/LetterSectionsListView.java @@ -113,7 +113,7 @@ public class LetterSectionsListView extends ListView implements AbsListView.OnSc header.setTag(-header.getHeight()); } else if (pos == count - 2) { View child = getChildAt(itemNum - firstVisibleItem); - int headerTop = 0; + int headerTop; if (child != null) { headerTop = child.getTop(); } else { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/LineProgressView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/LineProgressView.java index 60c2522e..74f4168a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/LineProgressView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/LineProgressView.java @@ -25,6 +25,9 @@ public class LineProgressView extends View { private float animatedProgressValue = 0; private float animatedAlphaValue = 1.0f; + private int backColor; + private int progressColor = 0xff36a2ee; + private static DecelerateInterpolator decelerateInterpolator = null; private static Paint progressPaint = null; @@ -37,7 +40,6 @@ public class LineProgressView extends View { progressPaint.setStyle(Paint.Style.STROKE); progressPaint.setStrokeCap(Paint.Cap.ROUND); progressPaint.setStrokeWidth(AndroidUtilities.dp(2)); - progressPaint.setColor(0xff36a2ee); } } @@ -70,7 +72,11 @@ public class LineProgressView extends View { } public void setProgressColor(int color) { - progressPaint.setColor(color); + progressColor = color; + } + + public void setBackColor(int color) { + backColor = color; } public void setProgress(float value, boolean animated) { @@ -91,6 +97,14 @@ public class LineProgressView extends View { } public void onDraw(Canvas canvas) { + if (backColor != 0 && animatedProgressValue != 1) { + progressPaint.setColor(backColor); + progressPaint.setAlpha((int) (255 * animatedAlphaValue)); + int start = (int) (getWidth() * animatedProgressValue); + canvas.drawRect(start, 0, getWidth(), getHeight(), progressPaint); + } + + progressPaint.setColor(progressColor); progressPaint.setAlpha((int)(255 * animatedAlphaValue)); canvas.drawRect(0, 0, getWidth() * animatedProgressValue, getHeight(), progressPaint); updateAnimation(); 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 25235c16..a95c161f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/NumberPicker.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/NumberPicker.java @@ -537,7 +537,6 @@ public class NumberPicker extends LinearLayout { } maxTextWidth = (int) (numberOfDigits * maxDigitWidth); } else { - final int valueCount = mDisplayedValues.length; for (String mDisplayedValue : mDisplayedValues) { final float textWidth = mSelectorWheelPaint.measureText(mDisplayedValue); if (textWidth > maxTextWidth) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/PagerSlidingTabStrip.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/PagerSlidingTabStrip.java index 5f7beb69..5eff6bcc 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/PagerSlidingTabStrip.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/PagerSlidingTabStrip.java @@ -18,7 +18,6 @@ import android.graphics.drawable.Drawable; import android.os.Build; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; -import android.util.DisplayMetrics; import android.view.View; import android.view.ViewTreeObserver.OnGlobalLayoutListener; import android.widget.FrameLayout; @@ -75,8 +74,6 @@ public class PagerSlidingTabStrip extends HorizontalScrollView { tabsContainer.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); addView(tabsContainer); - DisplayMetrics dm = getResources().getDisplayMetrics(); - rectPaint = new Paint(); rectPaint.setAntiAlias(true); rectPaint.setStyle(Style.FILL); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/PasscodeView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/PasscodeView.java index 06854218..54658932 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/PasscodeView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/PasscodeView.java @@ -41,16 +41,16 @@ import android.widget.ImageView; import android.widget.TextView; import org.telegram.android.AndroidUtilities; -import org.telegram.android.AnimationCompat.AnimatorListenerAdapterProxy; -import org.telegram.android.AnimationCompat.AnimatorSetProxy; -import org.telegram.android.AnimationCompat.ObjectAnimatorProxy; -import org.telegram.android.AnimationCompat.ViewProxy; 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.android.AnimationCompat.AnimatorListenerAdapterProxy; +import org.telegram.android.AnimationCompat.AnimatorSetProxy; +import org.telegram.android.AnimationCompat.ObjectAnimatorProxy; +import org.telegram.android.AnimationCompat.ViewProxy; import java.util.ArrayList; import java.util.Locale; @@ -671,7 +671,6 @@ public class PasscodeView extends FrameLayout { @Override public void onClick(View v) { int tag = (Integer) v.getTag(); - int key = KeyEvent.KEYCODE_DEL; switch (tag) { case 0: passwordEditText2.appendCharacter("0"); @@ -845,7 +844,6 @@ public class PasscodeView extends FrameLayout { } SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE); int selectedBackground = preferences.getInt("selectedBackground", 1000001); - boolean customTheme = false; if (selectedBackground == 1000001) { //backgroundFrameLayout.setBackgroundColor(0xff517c9e); backgroundFrameLayout.setBackgroundColor(AndroidUtilities.getIntDarkerColor("themeColor", 0x15)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoFilterView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoFilterView.java index ced235b6..d2de9216 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoFilterView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoFilterView.java @@ -11,9 +11,7 @@ package org.telegram.ui.Components; import android.annotation.SuppressLint; 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; @@ -1205,28 +1203,29 @@ public class PhotoFilterView extends FrameLayout { } 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); + //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.postTranslate(-bitmap.getWidth() / 2, -bitmap.getHeight() / 2); matrix.postRotate(orientation); - if (orientation == 90 || orientation == 270) { + /*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) { + }*/ + //canvas.drawBitmap(bitmap, matrix, paint); + //try { + // canvas.setBitmap(null); + //} catch (Exception e) { //don't promt, this will crash on 2.x - } + //} + return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); - return result; + //return result; } private void loadTexture(Bitmap bitmap) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoPickerBottomLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoPickerBottomLayout.java deleted file mode 100644 index 67c72c12..00000000 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoPickerBottomLayout.java +++ /dev/null @@ -1,114 +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.Components; - -import android.content.Context; -import android.util.TypedValue; -import android.view.Gravity; -import android.view.View; -import android.widget.FrameLayout; -import android.widget.LinearLayout; -import android.widget.TextView; - -import org.telegram.android.AndroidUtilities; -import org.telegram.android.LocaleController; -import org.telegram.messenger.R; - -public class PhotoPickerBottomLayout extends FrameLayout { - - public LinearLayout doneButton; - public TextView cancelButton; - public TextView doneButtonTextView; - public TextView doneButtonBadgeTextView; - - public PhotoPickerBottomLayout(Context context) { - super(context); - 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(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 = LayoutHelper.WRAP_CONTENT; - layoutParams.height = LayoutHelper.MATCH_PARENT; - layoutParams.gravity = Gravity.TOP | Gravity.LEFT; - cancelButton.setLayoutParams(layoutParams); - - doneButton = new LinearLayout(context); - doneButton.setOrientation(LinearLayout.HORIZONTAL); - doneButton.setBackgroundResource(R.drawable.bar_selector_picker); - doneButton.setPadding(AndroidUtilities.dp(29), 0, AndroidUtilities.dp(29), 0); - addView(doneButton); - layoutParams = (LayoutParams) doneButton.getLayoutParams(); - layoutParams.width = LayoutHelper.WRAP_CONTENT; - layoutParams.height = LayoutHelper.MATCH_PARENT; - layoutParams.gravity = Gravity.TOP | Gravity.RIGHT; - doneButton.setLayoutParams(layoutParams); - - doneButtonBadgeTextView = new TextView(context); - doneButtonBadgeTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); - doneButtonBadgeTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); - doneButtonBadgeTextView.setTextColor(0xffffffff); - doneButtonBadgeTextView.setGravity(Gravity.CENTER); - doneButtonBadgeTextView.setBackgroundResource(R.drawable.photobadge); - doneButtonBadgeTextView.setMinWidth(AndroidUtilities.dp(23)); - doneButtonBadgeTextView.setPadding(AndroidUtilities.dp(8), 0, AndroidUtilities.dp(8), AndroidUtilities.dp(1)); - doneButton.addView(doneButtonBadgeTextView); - LinearLayout.LayoutParams layoutParams1 = (LinearLayout.LayoutParams) doneButtonBadgeTextView.getLayoutParams(); - layoutParams1.width = LayoutHelper.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.setText(LocaleController.getString("Send", R.string.Send).toUpperCase()); - doneButtonTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); - doneButton.addView(doneButtonTextView); - layoutParams1 = (LinearLayout.LayoutParams) doneButtonTextView.getLayoutParams(); - layoutParams1.width = LayoutHelper.WRAP_CONTENT; - layoutParams1.gravity = Gravity.CENTER_VERTICAL; - layoutParams1.height = LayoutHelper.WRAP_CONTENT; - doneButtonTextView.setLayoutParams(layoutParams1); - } - - public void updateSelectedCount(int count, boolean disable) { - if (count == 0) { - doneButtonBadgeTextView.setVisibility(View.GONE); - - if (disable) { - doneButtonTextView.setTextColor(0xff999999); - doneButton.setEnabled(false); - } else { - doneButtonTextView.setTextColor(0xffffffff); - } - } else { - doneButtonTextView.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); - doneButtonBadgeTextView.setVisibility(View.VISIBLE); - doneButtonBadgeTextView.setText(String.format("%d", count)); - - if (disable) { - doneButtonTextView.setTextColor(0xffffffff); - doneButton.setEnabled(true); - } else { - doneButtonTextView.setTextColor(0xffffffff); - } - } - } -} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoViewerCaptionEnterView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoViewerCaptionEnterView.java index fcff6ef2..4f0051ce 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoViewerCaptionEnterView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/PhotoViewerCaptionEnterView.java @@ -62,6 +62,8 @@ public class PhotoViewerCaptionEnterView extends FrameLayoutFixed implements Not private boolean keyboardVisible; private int emojiPadding; + private boolean innerTextChange; + private PhotoViewerCaptionEnterViewDelegate delegate; public PhotoViewerCaptionEnterView(Context context, SizeNotifierFrameLayoutPhoto parent) { @@ -149,6 +151,8 @@ public class PhotoViewerCaptionEnterView extends FrameLayoutFixed implements Not } }); messageEditText.addTextChangedListener(new TextWatcher() { + boolean processChange = false; + @Override public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { @@ -156,23 +160,31 @@ public class PhotoViewerCaptionEnterView extends FrameLayoutFixed implements Not @Override public void onTextChanged(CharSequence charSequence, int start, int before, int count) { + if (innerTextChange) { + return; + } + if (delegate != null) { delegate.onTextChanged(charSequence); } + + if (before != count && (count - before) > 1) { + processChange = true; + } } @Override public void afterTextChanged(Editable editable) { - int i = 0; - ImageSpan[] arrayOfImageSpan = editable.getSpans(0, editable.length(), ImageSpan.class); - int j = arrayOfImageSpan.length; - while (true) { - if (i >= j) { - Emoji.replaceEmoji(editable, messageEditText.getPaint().getFontMetricsInt(), AndroidUtilities.dp(20)); - return; + if (innerTextChange) { + return; + } + if (processChange) { + ImageSpan[] spans = editable.getSpans(0, editable.length(), ImageSpan.class); + for (int i = 0; i < spans.length; i++) { + editable.removeSpan(spans[i]); } - editable.removeSpan(arrayOfImageSpan[i]); - i++; + Emoji.replaceEmoji(editable, messageEditText.getPaint().getFontMetricsInt(), AndroidUtilities.dp(20), false); + processChange = false; } } }); @@ -299,12 +311,15 @@ public class PhotoViewerCaptionEnterView extends FrameLayoutFixed implements Not i = 0; } try { - CharSequence localCharSequence = Emoji.replaceEmoji(symbol, messageEditText.getPaint().getFontMetricsInt(), AndroidUtilities.dp(20)); + innerTextChange = true; + CharSequence localCharSequence = Emoji.replaceEmoji(symbol/* + "\uFE0F"*/, messageEditText.getPaint().getFontMetricsInt(), AndroidUtilities.dp(20), false); messageEditText.setText(messageEditText.getText().insert(i, localCharSequence)); int j = i + localCharSequence.length(); messageEditText.setSelection(j, j); } catch (Exception e) { FileLog.e("tmessages", e); + } finally { + innerTextChange = false; } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/PopupAudioView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/PopupAudioView.java index c6f7bb03..d145ca2f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/PopupAudioView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/PopupAudioView.java @@ -90,11 +90,6 @@ public class PopupAudioView extends BaseCell implements SeekBar.SeekBarDelegate, public void setMessageObject(MessageObject messageObject) { if (currentMessageObject != messageObject) { - int uid = messageObject.messageOwner.media.audio.user_id; - if (uid == 0) { - uid = messageObject.messageOwner.from_id; - } - seekBar.type = 1; progressView.setProgressColors(0xffd9e2eb, 0xff86c5f8); @@ -269,7 +264,7 @@ public class PopupAudioView extends BaseCell implements SeekBar.SeekBarDelegate, seekBar.setProgress(currentMessageObject.audioProgress); } - int duration = 0; + int duration; if (!MediaController.getInstance().isPlayingAudio(currentMessageObject)) { duration = currentMessageObject.messageOwner.media.audio.duration; } else { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/RadialProgress.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/RadialProgress.java index af86334c..8826b64a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/RadialProgress.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/RadialProgress.java @@ -35,6 +35,7 @@ public class RadialProgress { private Drawable currentDrawable; private Drawable previousDrawable; private boolean hideCurrentDrawable; + private int progressColor = 0xffffffff; private static DecelerateInterpolator decelerateInterpolator = null; private static Paint progressPaint = null; @@ -46,7 +47,6 @@ public class RadialProgress { progressPaint.setStyle(Paint.Style.STROKE); progressPaint.setStrokeCap(Paint.Cap.ROUND); progressPaint.setStrokeWidth(AndroidUtilities.dp(2)); - progressPaint.setColor(0xffffffff); } parent = parentView; } @@ -86,7 +86,7 @@ public class RadialProgress { } public void setProgressColor(int color) { - progressPaint.setColor(color); + progressColor = color; } public void setHideCurrentDrawable(boolean value) { @@ -154,6 +154,7 @@ public class RadialProgress { if (currentWithRound || previousWithRound) { int diff = AndroidUtilities.dp(1); + progressPaint.setColor(progressColor); if (previousWithRound) { progressPaint.setAlpha((int)(255 * animatedAlphaValue)); } else { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/RecyclerListView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/RecyclerListView.java index b356c719..f503341e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/RecyclerListView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/RecyclerListView.java @@ -161,6 +161,11 @@ public class RecyclerListView extends RecyclerView { public void onTouchEvent(RecyclerView view, MotionEvent e) { } + + @Override + public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { + + } } private AdapterDataObserver observer = new AdapterDataObserver() { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/SeekBar.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/SeekBar.java index bc15136a..727b3bac 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/SeekBar.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SeekBar.java @@ -11,11 +11,9 @@ package org.telegram.ui.Components; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; -import android.graphics.drawable.Drawable; import android.view.MotionEvent; import org.telegram.android.AndroidUtilities; -import org.telegram.messenger.R; public class SeekBar { @@ -23,14 +21,10 @@ public class SeekBar { void onSeekBarDrag(float progress); } - private static Drawable thumbDrawable1; - private static Drawable thumbDrawablePressed1; - private static Drawable thumbDrawable2; - private static Drawable thumbDrawablePressed2; - private static Paint innerPaint1 = new Paint(); - private static Paint outerPaint1 = new Paint(); - private static Paint innerPaint2 = new Paint(); - private static Paint outerPaint2 = new Paint(); + private static Paint innerPaint1; + private static Paint outerPaint1; + private static Paint innerPaint2; + private static Paint outerPaint2; private static int thumbWidth; private static int thumbHeight; public int type; @@ -42,17 +36,21 @@ public class SeekBar { public SeekBarDelegate delegate; public SeekBar(Context context) { - if (thumbDrawable1 == null) { - thumbDrawable1 = context.getResources().getDrawable(R.drawable.player1); - thumbDrawablePressed1 = context.getResources().getDrawable(R.drawable.player1_pressed); - thumbDrawable2 = context.getResources().getDrawable(R.drawable.player2); - thumbDrawablePressed2 = context.getResources().getDrawable(R.drawable.player2_pressed); - innerPaint1.setColor(0xffb4e396); - outerPaint1.setColor(0xff6ac453); - innerPaint2.setColor(0xffd9e2eb); - outerPaint2.setColor(0xff86c5f8); - thumbWidth = thumbDrawable1.getIntrinsicWidth(); - thumbHeight = thumbDrawable1.getIntrinsicHeight(); + if (innerPaint1 == null) { + innerPaint1 = new Paint(Paint.ANTI_ALIAS_FLAG); + innerPaint1.setColor(0xffc3e3ab); + + outerPaint1 = new Paint(Paint.ANTI_ALIAS_FLAG); + outerPaint1.setColor(0xff87bf78); + + innerPaint2 = new Paint(Paint.ANTI_ALIAS_FLAG); + innerPaint2.setColor(0xffe4eaf0); + + outerPaint2 = new Paint(Paint.ANTI_ALIAS_FLAG); + outerPaint2.setColor(0xff4195e5); + + thumbWidth = AndroidUtilities.dp(24); + thumbHeight = AndroidUtilities.dp(24); } } @@ -100,30 +98,18 @@ public class SeekBar { } public void draw(Canvas canvas) { - Drawable thumb = null; Paint inner = null; Paint outer = null; if (type == 0) { - if (!pressed) { - thumb = thumbDrawable1; - } else { - thumb = thumbDrawablePressed1; - } inner = innerPaint1; outer = outerPaint1; } else if (type == 1) { - if (!pressed) { - thumb = thumbDrawable2; - } else { - thumb = thumbDrawablePressed2; - } inner = innerPaint2; outer = outerPaint2; } int y = (height - thumbHeight) / 2; canvas.drawRect(thumbWidth / 2, height / 2 - AndroidUtilities.dp(1), width - thumbWidth / 2, height / 2 + AndroidUtilities.dp(1), inner); canvas.drawRect(thumbWidth / 2, height / 2 - AndroidUtilities.dp(1), thumbWidth / 2 + thumbX, height / 2 + AndroidUtilities.dp(1), outer); - thumb.setBounds(thumbX, y, thumbX + thumbWidth, y + thumbHeight); - thumb.draw(canvas); + canvas.drawCircle(thumbX + thumbWidth / 2, y + thumbHeight / 2, AndroidUtilities.dp(pressed ? 8 : 6), outer); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Switch.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Switch.java index 4f612147..16889974 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Switch.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Switch.java @@ -32,10 +32,10 @@ import android.view.ViewConfiguration; import android.widget.CompoundButton; import org.telegram.android.AndroidUtilities; -import org.telegram.android.AnimationCompat.ObjectAnimatorProxy; import org.telegram.android.LocaleController; import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.R; +import org.telegram.android.AnimationCompat.ObjectAnimatorProxy; public class Switch extends CompoundButton { @@ -581,8 +581,6 @@ public class Switch extends CompoundButton { final int switchTop = mSwitchTop; final int switchBottom = mSwitchBottom; - final int switchInnerTop = switchTop + padding.top; - final int switchInnerBottom = switchBottom - padding.bottom; final Drawable thumbDrawable = mThumbDrawable; if (trackDrawable != null) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/TimerDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/TimerDrawable.java index 7bfd4799..1aae1599 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/TimerDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/TimerDrawable.java @@ -45,7 +45,7 @@ public class TimerDrawable extends Drawable { public void setTime(int value) { time = value; - String timeString = null; + String timeString; if (time >= 1 && time < 60) { timeString = "" + value; if (timeString.length() < 2) { @@ -91,7 +91,7 @@ public class TimerDrawable extends Drawable { public void draw(Canvas canvas) { int width = timerDrawable.getIntrinsicWidth(); int height = timerDrawable.getIntrinsicHeight(); - Drawable drawable = null; + Drawable drawable; if (time == 0) { drawable = timerDrawable; } else { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/TypingDotsDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/TypingDotsDrawable.java index d644d7d6..f26e450f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/TypingDotsDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/TypingDotsDrawable.java @@ -88,7 +88,7 @@ public class TypingDotsDrawable extends Drawable { @Override public void draw(Canvas canvas) { - int y = 0; + int y; if (isChat) { y = AndroidUtilities.dp(6); } else { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/VideoTimelineView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/VideoTimelineView.java index d562cc6b..980237df 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/VideoTimelineView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/VideoTimelineView.java @@ -202,7 +202,6 @@ public class VideoTimelineView extends View { int h = (int) (bitmap.getHeight() * scale); Rect srcRect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); Rect destRect = new Rect((frameWidth - w) / 2, (frameHeight - h) / 2, w, h); - Paint paint = new Paint(); canvas.drawBitmap(bitmap, srcRect, destRect, null); bitmap.recycle(); bitmap = result; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ContactAddActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ContactAddActivity.java index a4122ab8..f57e4f9b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ContactAddActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ContactAddActivity.java @@ -17,7 +17,6 @@ import android.text.TextUtils; import android.util.TypedValue; import android.view.Gravity; import android.view.KeyEvent; -import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.inputmethod.EditorInfo; @@ -27,20 +26,20 @@ import android.widget.LinearLayout; import android.widget.ScrollView; import android.widget.TextView; -import org.telegram.PhoneFormat.PhoneFormat; import org.telegram.android.AndroidUtilities; +import org.telegram.PhoneFormat.PhoneFormat; import org.telegram.android.ContactsController; import org.telegram.android.LocaleController; +import org.telegram.messenger.ApplicationLoader; +import org.telegram.messenger.TLRPC; import org.telegram.android.MessagesController; import org.telegram.android.NotificationCenter; -import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.R; -import org.telegram.messenger.TLRPC; import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.ActionBarMenu; -import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.Components.AvatarDrawable; import org.telegram.ui.Components.BackupImageView; +import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.Components.LayoutHelper; public class ContactAddActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate { @@ -79,7 +78,7 @@ public class ContactAddActivity extends BaseFragment implements NotificationCent } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); if (addContact) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java index 5a3ba06a..5fa21591 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java @@ -23,7 +23,6 @@ import android.text.InputType; import android.text.TextWatcher; import android.util.TypedValue; import android.view.Gravity; -import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; @@ -129,7 +128,7 @@ public class ContactsActivity extends BaseFragment implements NotificationCenter } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { searching = false; searchWas = false; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/CountrySelectActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/CountrySelectActivity.java index 3058d691..16e71029 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/CountrySelectActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/CountrySelectActivity.java @@ -11,7 +11,6 @@ package org.telegram.ui; import android.content.Context; import android.os.Build; import android.view.Gravity; -import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.widget.AbsListView; @@ -62,7 +61,7 @@ public class CountrySelectActivity extends BaseFragment { } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); actionBar.setTitle(LocaleController.getString("ChooseCountry", R.string.ChooseCountry)); @@ -185,7 +184,7 @@ public class CountrySelectActivity extends BaseFragment { listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView adapterView, View view, int i, long l) { - Country country = null; + Country country; if (searching && searchWas) { country = searchListViewAdapter.getItem(i); } else { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/DocumentSelectActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/DocumentSelectActivity.java index 22c1c205..40807cdb 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/DocumentSelectActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/DocumentSelectActivity.java @@ -19,7 +19,6 @@ import android.os.Environment; import android.os.StatFs; import android.text.TextUtils; import android.view.Gravity; -import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; @@ -129,7 +128,7 @@ public class DocumentSelectActivity extends BaseFragment { } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { if (!receiverRegistered) { receiverRegistered = true; IntentFilter filter = new IntentFilter(); @@ -197,7 +196,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, null, false); + fragmentView = getParentActivity().getLayoutInflater().inflate(R.layout.document_select_layout, null, false); listAdapter = new ListAdapter(context); 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 3b571d21..777286c2 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java @@ -39,21 +39,21 @@ import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; -import org.telegram.android.AndroidUtilities; import org.telegram.PhoneFormat.PhoneFormat; +import org.telegram.android.AndroidUtilities; import org.telegram.android.LocaleController; -import org.telegram.android.UserObject; -import org.telegram.messenger.ApplicationLoader; -import org.telegram.messenger.TLRPC; -import org.telegram.messenger.FileLog; import org.telegram.android.MessagesController; import org.telegram.android.NotificationCenter; +import org.telegram.android.UserObject; +import org.telegram.messenger.ApplicationLoader; +import org.telegram.messenger.FileLog; import org.telegram.messenger.R; -import org.telegram.ui.Adapters.ContactsAdapter; -import org.telegram.ui.Adapters.SearchAdapter; +import org.telegram.messenger.TLRPC; import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.ActionBarMenu; import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.ui.Adapters.ContactsAdapter; +import org.telegram.ui.Adapters.SearchAdapter; import org.telegram.ui.Cells.UserCell; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.LetterSectionsListView; @@ -143,7 +143,7 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { searching = false; searchWas = false; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java index d86dd3c6..5684bc3f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateFinalActivity.java @@ -19,7 +19,6 @@ import android.text.InputType; import android.text.TextWatcher; import android.util.TypedValue; import android.view.Gravity; -import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; @@ -29,23 +28,23 @@ import android.widget.LinearLayout; import android.widget.ListView; import org.telegram.android.AndroidUtilities; -import org.telegram.android.LocaleController; -import org.telegram.android.MessagesController; -import org.telegram.android.MessagesStorage; -import org.telegram.android.NotificationCenter; import org.telegram.messenger.ConnectionsManager; -import org.telegram.messenger.FileLog; -import org.telegram.messenger.R; +import org.telegram.android.LocaleController; +import org.telegram.android.MessagesStorage; import org.telegram.messenger.TLRPC; -import org.telegram.ui.ActionBar.ActionBar; -import org.telegram.ui.ActionBar.ActionBarMenu; -import org.telegram.ui.ActionBar.BaseFragment; +import org.telegram.messenger.FileLog; +import org.telegram.android.MessagesController; +import org.telegram.android.NotificationCenter; +import org.telegram.messenger.R; import org.telegram.ui.Adapters.BaseFragmentAdapter; import org.telegram.ui.Cells.GreySectionCell; import org.telegram.ui.Cells.UserCell; +import org.telegram.ui.ActionBar.ActionBar; +import org.telegram.ui.ActionBar.ActionBarMenu; import org.telegram.ui.Components.AvatarDrawable; import org.telegram.ui.Components.AvatarUpdater; import org.telegram.ui.Components.BackupImageView; +import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.Components.FrameLayoutFixed; import org.telegram.ui.Components.LayoutHelper; @@ -139,7 +138,7 @@ public class GroupCreateFinalActivity extends BaseFragment implements Notificati } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); if (isBroadcast) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/GroupInviteActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/GroupInviteActivity.java index 1ea12de4..3677a8ee 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/GroupInviteActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/GroupInviteActivity.java @@ -14,7 +14,6 @@ import android.content.DialogInterface; import android.content.Intent; import android.os.Build; import android.view.Gravity; -import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; @@ -88,7 +87,7 @@ public class GroupInviteActivity extends BaseFragment implements NotificationCen } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); actionBar.setTitle(LocaleController.getString("InviteLink", R.string.InviteLink)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/IdenticonActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/IdenticonActivity.java index b0aa4da6..b75c2d36 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/IdenticonActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/IdenticonActivity.java @@ -10,7 +10,6 @@ package org.telegram.ui; import android.content.Context; import android.os.Bundle; -import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.Surface; import android.view.View; @@ -44,7 +43,7 @@ public class IdenticonActivity extends BaseFragment { } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); actionBar.setTitle(LocaleController.getString("EncryptionKey", R.string.EncryptionKey)); @@ -58,7 +57,7 @@ public class IdenticonActivity extends BaseFragment { } }); - fragmentView = inflater.inflate(R.layout.identicon_layout, null, false); + fragmentView = getParentActivity().getLayoutInflater().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); @@ -100,7 +99,7 @@ public class IdenticonActivity extends BaseFragment { if (fragmentView == null) { return true; } - fragmentView.getViewTreeObserver().removeOnPreDrawListener(this); + fragmentView.getViewTreeObserver().removeOnPreDrawListener(this); LinearLayout layout = (LinearLayout)fragmentView; WindowManager manager = (WindowManager) ApplicationLoader.applicationContext.getSystemService(Context.WINDOW_SERVICE); int rotation = manager.getDefaultDisplay().getRotation(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ImageListActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ImageListActivity.java index 26a26d4c..8601ca91 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ImageListActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ImageListActivity.java @@ -2,8 +2,6 @@ package org.telegram.ui; import android.content.Context; import android.content.SharedPreferences; -import android.graphics.PorterDuff; -import android.graphics.drawable.Drawable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -48,7 +46,7 @@ public class ImageListActivity extends BaseFragment { } @Override - public View createView(Context context, LayoutInflater inflater){ + public View createView(Context context){ actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); actionBar.setTitle(LocaleController.getString("BubbleStyle", R.string.BubbleStyle)); @@ -61,7 +59,7 @@ public class ImageListActivity extends BaseFragment { } }); - fragmentView = inflater.inflate(R.layout.imagelistlayout, null, false); + fragmentView = getParentActivity().getLayoutInflater().inflate(R.layout.imagelistlayout, null, false); listAdapter = new CustomListAdapter(context, bubblesNamesArray, imgid); list=(ListView) fragmentView.findViewById(R.id.list); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LanguageSelectActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LanguageSelectActivity.java index e77659fd..72da9005 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LanguageSelectActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LanguageSelectActivity.java @@ -15,7 +15,6 @@ import android.content.SharedPreferences; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.view.Gravity; -import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; @@ -57,7 +56,7 @@ public class LanguageSelectActivity extends BaseFragment { public ArrayList searchResult; @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { searching = false; searchWas = false; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LastSeenActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LastSeenActivity.java index aaecedd3..6bf55103 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LastSeenActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LastSeenActivity.java @@ -20,7 +20,6 @@ import android.os.Bundle; import android.text.Spannable; import android.text.method.LinkMovementMethod; import android.view.Gravity; -import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; @@ -102,7 +101,7 @@ public class LastSeenActivity extends BaseFragment implements NotificationCenter } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); actionBar.setTitle(LocaleController.getString("PrivacyLastSeen", R.string.PrivacyLastSeen)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LastSeenUsersActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LastSeenUsersActivity.java index 6eee902d..54ad9ef1 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LastSeenUsersActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LastSeenUsersActivity.java @@ -17,7 +17,6 @@ import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; import android.view.Gravity; -import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; @@ -81,7 +80,7 @@ public class LastSeenUsersActivity extends BaseFragment implements NotificationC } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); if (isAlwaysShare) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java index e38f965d..ea696c55 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java @@ -24,6 +24,7 @@ import android.os.Bundle; import android.os.Parcelable; import android.provider.ContactsContract; import android.view.ActionMode; +import android.view.Gravity; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; @@ -61,6 +62,7 @@ import org.telegram.ui.ActionBar.ActionBarLayout; import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.DrawerLayoutContainer; import org.telegram.ui.Adapters.DrawerLayoutAdapter; +import org.telegram.ui.Components.DrawerPlayerView; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.PasscodeView; @@ -71,7 +73,8 @@ import java.util.ArrayList; import java.util.Locale; import java.util.Map; -public class LaunchActivity extends Activity implements ActionBarLayout.ActionBarLayoutDelegate, NotificationCenter.NotificationCenterDelegate, MessagesActivity.MessagesActivityDelegate { +public class LaunchActivity extends Activity implements ActionBarLayout.ActionBarLayoutDelegate, NotificationCenter.NotificationCenterDelegate, DialogsActivity.MessagesActivityDelegate { + private boolean finished; private String videoPath; private String sendingText; @@ -261,20 +264,22 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa drawerLayoutContainer.addView(actionBarLayout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); } - ListView listView = new ListView(this); - listView.setAdapter(drawerLayoutAdapter = new DrawerLayoutAdapter(this)); - drawerLayoutContainer.setDrawerLayout(listView); - listView.setBackgroundColor(0xffffffff); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams)listView.getLayoutParams(); + FrameLayout listViewContainer = new FrameLayout(this); + listViewContainer.setBackgroundColor(0xffffffff); + drawerLayoutContainer.setDrawerLayout(listViewContainer); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) listViewContainer.getLayoutParams(); Point screenSize = AndroidUtilities.getRealScreenSize(); layoutParams.width = AndroidUtilities.isTablet() ? AndroidUtilities.dp(320) : Math.min(screenSize.x, screenSize.y) - AndroidUtilities.dp(56); layoutParams.height = LayoutHelper.MATCH_PARENT; - listView.setPadding(0, 0, 0, 0); + listViewContainer.setLayoutParams(layoutParams); + + ListView listView = new ListView(this); + listView.setAdapter(drawerLayoutAdapter = new DrawerLayoutAdapter(this)); listView.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE); listView.setDivider(null); listView.setDividerHeight(0); - listView.setLayoutParams(layoutParams); listView.setVerticalScrollBarEnabled(false); + listViewContainer.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override @@ -358,6 +363,16 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa } }); + DrawerPlayerView drawerPlayerView = new DrawerPlayerView(this, listView); + listViewContainer.addView(drawerPlayerView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 51, Gravity.LEFT | Gravity.BOTTOM)); + drawerPlayerView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + actionBarLayout.presentFragment(new AudioPlayerActivity()); + drawerLayoutContainer.closeDrawer(false); + } + }); + drawerLayoutContainer.setParentActionBarLayout(actionBarLayout); actionBarLayout.setDrawerLayoutContainer(drawerLayoutContainer); actionBarLayout.init(mainFragmentsStack); @@ -388,7 +403,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa actionBarLayout.addFragmentToStack(new LoginActivity()); drawerLayoutContainer.setAllowOpenDrawer(false, false); } else { - actionBarLayout.addFragmentToStack(new MessagesActivity(null)); + actionBarLayout.addFragmentToStack(new DialogsActivity(null)); drawerLayoutContainer.setAllowOpenDrawer(true, false); } @@ -507,6 +522,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa Integer push_enc_id = 0; Integer open_settings = 0; boolean showDialogsList = false; + boolean showPlayer = false; photoPathsArray = null; videoPath = null; @@ -800,6 +816,8 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa } else { showDialogsList = true; } + } else if (intent.getAction().equals("com.tmessages.openplayer")) { + showPlayer = true; } } } @@ -839,6 +857,30 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa } pushOpened = false; isNew = false; + } else if (showPlayer) { + if (AndroidUtilities.isTablet()) { + for (int a = 0; a < layersActionBarLayout.fragmentsStack.size(); a++) { + BaseFragment fragment = layersActionBarLayout.fragmentsStack.get(a); + if (fragment instanceof AudioPlayerActivity) { + layersActionBarLayout.removeFragmentFromStack(fragment); + break; + } + } + actionBarLayout.showLastFragment(); + rightActionBarLayout.showLastFragment(); + drawerLayoutContainer.setAllowOpenDrawer(false, false); + } else { + for (int a = 0; a < actionBarLayout.fragmentsStack.size(); a++) { + BaseFragment fragment = actionBarLayout.fragmentsStack.get(a); + if (fragment instanceof AudioPlayerActivity) { + actionBarLayout.removeFragmentFromStack(fragment); + break; + } + } + drawerLayoutContainer.setAllowOpenDrawer(true, false); + } + actionBarLayout.presentFragment(new AudioPlayerActivity(), false, true, true); + pushOpened = true; } else if (videoPath != null || photoPathsArray != null || sendingText != null || documentsPathsArray != null || contactsToSend != null || documentsUrisArray != null) { if (!AndroidUtilities.isTablet()) { NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats); @@ -847,13 +889,13 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa 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); + DialogsActivity fragment = new DialogsActivity(args); fragment.setDelegate(this); boolean removeLast; if (AndroidUtilities.isTablet()) { - removeLast = layersActionBarLayout.fragmentsStack.size() > 0 && layersActionBarLayout.fragmentsStack.get(layersActionBarLayout.fragmentsStack.size() - 1) instanceof MessagesActivity; + removeLast = layersActionBarLayout.fragmentsStack.size() > 0 && layersActionBarLayout.fragmentsStack.get(layersActionBarLayout.fragmentsStack.size() - 1) instanceof DialogsActivity; } else { - removeLast = actionBarLayout.fragmentsStack.size() > 1 && actionBarLayout.fragmentsStack.get(actionBarLayout.fragmentsStack.size() - 1) instanceof MessagesActivity; + removeLast = actionBarLayout.fragmentsStack.size() > 1 && actionBarLayout.fragmentsStack.get(actionBarLayout.fragmentsStack.size() - 1) instanceof DialogsActivity; } actionBarLayout.presentFragment(fragment, removeLast, true, true); pushOpened = true; @@ -889,7 +931,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa } } else { if (actionBarLayout.fragmentsStack.isEmpty()) { - actionBarLayout.addFragmentToStack(new MessagesActivity(null)); + actionBarLayout.addFragmentToStack(new DialogsActivity(null)); drawerLayoutContainer.setAllowOpenDrawer(true, false); } } @@ -899,7 +941,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa actionBarLayout.addFragmentToStack(new LoginActivity()); drawerLayoutContainer.setAllowOpenDrawer(false, false); } else { - actionBarLayout.addFragmentToStack(new MessagesActivity(null)); + actionBarLayout.addFragmentToStack(new DialogsActivity(null)); drawerLayoutContainer.setAllowOpenDrawer(true, false); } } @@ -958,10 +1000,10 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa args.putBoolean("onlySelect", true); args.putInt("dialogsType", 2); args.putString("addToGroupAlertString", LocaleController.formatString("AddToTheGroupTitle", R.string.AddToTheGroupTitle, UserObject.getUserName(user), "%1$s")); - MessagesActivity fragment = new MessagesActivity(args); - fragment.setDelegate(new MessagesActivity.MessagesActivityDelegate() { + DialogsActivity fragment = new DialogsActivity(args); + fragment.setDelegate(new DialogsActivity.MessagesActivityDelegate() { @Override - public void didSelectDialog(MessagesActivity fragment, long did, boolean param) { + public void didSelectDialog(DialogsActivity fragment, long did, boolean param) { NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats); MessagesController.getInstance().addUserToChat(-(int) did, user, null, 0, botChat); Bundle args = new Bundle(); @@ -1151,7 +1193,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa } @Override - public void didSelectDialog(MessagesActivity messageFragment, long dialog_id, boolean param) { + public void didSelectDialog(DialogsActivity messageFragment, long dialog_id, boolean param) { if (dialog_id != 0) { int lower_part = (int)dialog_id; int high_id = (int)(dialog_id >> 32); @@ -1429,6 +1471,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa @Override @SuppressWarnings("unchecked") public void didReceivedNotification(int id, Object... args) { + //Log.e("didReceivedNotification",id+""); if (id == NotificationCenter.appDidLogout) { if (drawerLayoutAdapter != null) { drawerLayoutAdapter.notifyDataSetChanged(); @@ -1676,9 +1719,9 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa public boolean needPresentFragment(BaseFragment fragment, boolean removeLast, boolean forceWithoutAnimation, ActionBarLayout layout) { if (AndroidUtilities.isTablet()) { drawerLayoutContainer.setAllowOpenDrawer(!(fragment instanceof LoginActivity || fragment instanceof CountrySelectActivity) && layersActionBarLayout.getVisibility() != View.VISIBLE, true); - if (fragment instanceof MessagesActivity) { - MessagesActivity messagesActivity = (MessagesActivity)fragment; - if (messagesActivity.isMainDialogList() && layout != actionBarLayout) { + if (fragment instanceof DialogsActivity) { + DialogsActivity dialogsActivity = (DialogsActivity)fragment; + if (dialogsActivity.isMainDialogList() && layout != actionBarLayout) { actionBarLayout.removeAllFragments(); actionBarLayout.presentFragment(fragment, removeLast, forceWithoutAnimation, false); layersActionBarLayout.removeAllFragments(); @@ -1765,9 +1808,9 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa public boolean needAddFragmentToStack(BaseFragment fragment, ActionBarLayout layout) { if (AndroidUtilities.isTablet()) { drawerLayoutContainer.setAllowOpenDrawer(!(fragment instanceof LoginActivity || fragment instanceof CountrySelectActivity) && layersActionBarLayout.getVisibility() != View.VISIBLE, true); - if (fragment instanceof MessagesActivity) { - MessagesActivity messagesActivity = (MessagesActivity)fragment; - if (messagesActivity.isMainDialogList() && layout != actionBarLayout) { + if (fragment instanceof DialogsActivity) { + DialogsActivity dialogsActivity = (DialogsActivity)fragment; + if (dialogsActivity.isMainDialogList() && layout != actionBarLayout) { actionBarLayout.removeAllFragments(); actionBarLayout.addFragmentToStack(fragment); layersActionBarLayout.removeAllFragments(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java index 4f944cfe..36cec820 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LocationActivity.java @@ -21,7 +21,6 @@ import android.os.Build; import android.text.TextUtils; import android.util.TypedValue; import android.view.Gravity; -import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; @@ -40,6 +39,7 @@ import com.google.android.gms.maps.CameraUpdate; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.MapView; + import com.google.android.gms.maps.MapsInitializer; import com.google.android.gms.maps.model.BitmapDescriptorFactory; import com.google.android.gms.maps.model.CircleOptions; @@ -106,7 +106,7 @@ public class LocationActivity extends BaseFragment implements NotificationCenter private CircleOptions circleOptions; private LocationActivityDelegate delegate; - private int overScrollHeight = AndroidUtilities.displaySize.x - AndroidUtilities.getCurrentActionBarHeight() - AndroidUtilities.dp(66); + private int overScrollHeight = AndroidUtilities.displaySize.x - ActionBar.getCurrentActionBarHeight() - AndroidUtilities.dp(66); private int halfHeight; private final static int share = 1; @@ -151,7 +151,7 @@ public class LocationActivity extends BaseFragment implements NotificationCenter } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); if (AndroidUtilities.isTablet()) { @@ -500,7 +500,7 @@ public class LocationActivity extends BaseFragment implements NotificationCenter View shadow = new View(context); shadow.setBackgroundResource(R.drawable.header_shadow_reverse); - mapViewClip.addView(shadow, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, AndroidUtilities.dp(3), Gravity.LEFT | Gravity.BOTTOM)); + mapViewClip.addView(shadow, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 3, Gravity.LEFT | Gravity.BOTTOM)); markerImageView = new ImageView(context); markerImageView.setImageResource(R.drawable.map_pin); @@ -695,7 +695,7 @@ public class LocationActivity extends BaseFragment implements NotificationCenter private void fixLayoutInternal(final boolean resume) { if (listView != null) { - int height = (actionBar.getOccupyStatusBar() ? AndroidUtilities.statusBarHeight : 0) + AndroidUtilities.getCurrentActionBarHeight(); + int height = (actionBar.getOccupyStatusBar() ? AndroidUtilities.statusBarHeight : 0) + ActionBar.getCurrentActionBarHeight(); int viewHeight = fragmentView.getMeasuredHeight(); if (viewHeight == 0) { return; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java index fd522912..0c75d092 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java @@ -110,7 +110,7 @@ public class LoginActivity extends BaseFragment { } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { actionBar.setTitle(LocaleController.getString("AppName", R.string.AppName)); actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { @@ -396,9 +396,9 @@ public class LoginActivity extends BaseFragment { public void needFinishActivity() { clearCurrentState(); - presentFragment(new MessagesActivity(null), true); - NotificationCenter.getInstance().postNotificationName(NotificationCenter.mainUserInfoChanged); - } + presentFragment(new DialogsActivity(null), true); + NotificationCenter.getInstance().postNotificationName(NotificationCenter.mainUserInfoChanged); + } public class PhoneView extends SlideView implements AdapterView.OnItemSelectedListener { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/MediaActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/MediaActivity.java index 8866ae01..de99c24b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/MediaActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/MediaActivity.java @@ -21,7 +21,6 @@ import android.os.Bundle; import android.text.TextUtils; import android.util.TypedValue; import android.view.Gravity; -import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.Surface; import android.view.View; @@ -42,6 +41,7 @@ import org.telegram.android.AndroidUtilities; import org.telegram.android.AnimationCompat.AnimatorSetProxy; import org.telegram.android.AnimationCompat.ObjectAnimatorProxy; import org.telegram.android.LocaleController; +import org.telegram.android.MediaController; import org.telegram.android.MessageObject; import org.telegram.android.MessagesController; import org.telegram.android.NotificationCenter; @@ -217,7 +217,7 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setTitle(""); actionBar.setAllowOverlayTitle(false); @@ -284,10 +284,10 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No Bundle args = new Bundle(); args.putBoolean("onlySelect", true); args.putInt("dialogsType", 1); - MessagesActivity fragment = new MessagesActivity(args); - fragment.setDelegate(new MessagesActivity.MessagesActivityDelegate() { + DialogsActivity fragment = new DialogsActivity(args); + fragment.setDelegate(new DialogsActivity.MessagesActivityDelegate() { @Override - public void didSelectDialog(MessagesActivity fragment, long did, boolean param) { + public void didSelectDialog(DialogsActivity fragment, long did, boolean param) { int lower_part = (int) did; if (lower_part != 0) { Bundle args = new Bundle(); @@ -374,14 +374,7 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No dropDownContainer.setSubMenuOpenSide(1); 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(); - layoutParams.height = LayoutHelper.MATCH_PARENT; - layoutParams.width = LayoutHelper.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); + actionBar.addView(dropDownContainer, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT, AndroidUtilities.isTablet() ? 64 : 56, 0, 40, 0)); dropDownContainer.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { @@ -400,13 +393,7 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No 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 = LayoutHelper.WRAP_CONTENT; - layoutParams.height = LayoutHelper.WRAP_CONTENT; - layoutParams.leftMargin = AndroidUtilities.dp(16); - layoutParams.gravity = Gravity.CENTER_VERTICAL; - dropDown.setLayoutParams(layoutParams); + dropDownContainer.addView(dropDown, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_VERTICAL, 16, 0, 0, 0)); final ActionBarMenu actionMode = actionBar.createActionMode(); actionModeViews.add(actionMode.addItem(-2, R.drawable.ic_ab_back_grey, R.drawable.bar_selector_mode, null, AndroidUtilities.dp(54))); @@ -426,12 +413,7 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No return true; } }); - actionMode.addView(selectedMessagesCountTextView); - LinearLayout.LayoutParams layoutParams1 = (LinearLayout.LayoutParams) selectedMessagesCountTextView.getLayoutParams(); - layoutParams1.weight = 1; - layoutParams1.width = 0; - layoutParams1.height = LayoutHelper.MATCH_PARENT; - selectedMessagesCountTextView.setLayoutParams(layoutParams1); + actionMode.addView(selectedMessagesCountTextView, LayoutHelper.createLinear(0, LayoutHelper.MATCH_PARENT, 1.0f)); if ((int) dialog_id != 0) { actionModeViews.add(actionMode.addItem(forward, R.drawable.ic_ab_fwd_forward, R.drawable.bar_selector_mode, null, AndroidUtilities.dp(54))); @@ -450,12 +432,7 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No listView.setDividerHeight(0); listView.setDrawSelectorOnTop(true); listView.setClipToPadding(false); - frameLayout.addView(listView); - layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); - layoutParams.width = LayoutHelper.MATCH_PARENT; - layoutParams.height = LayoutHelper.MATCH_PARENT; - layoutParams.gravity = Gravity.TOP; - listView.setLayoutParams(layoutParams); + frameLayout.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView adapterView, View view, final int i, long l) { @@ -515,11 +492,7 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No emptyView.setGravity(Gravity.CENTER); emptyView.setVisibility(View.GONE); emptyView.setBackgroundColor(0xfff0f0f0); - frameLayout.addView(emptyView); - layoutParams = (FrameLayout.LayoutParams) emptyView.getLayoutParams(); - layoutParams.width = LayoutHelper.MATCH_PARENT; - layoutParams.height = LayoutHelper.MATCH_PARENT; - emptyView.setLayoutParams(layoutParams); + frameLayout.addView(emptyView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); emptyView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { @@ -528,42 +501,24 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No }); emptyImageView = new ImageView(context); - emptyView.addView(emptyImageView); - layoutParams1 = (LinearLayout.LayoutParams) emptyImageView.getLayoutParams(); - layoutParams1.width = LayoutHelper.WRAP_CONTENT; - layoutParams1.height = LayoutHelper.WRAP_CONTENT; - emptyImageView.setLayoutParams(layoutParams1); + emptyView.addView(emptyImageView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT)); emptyTextView = new TextView(context); emptyTextView.setTextColor(0xff8a8a8a); emptyTextView.setGravity(Gravity.CENTER); emptyTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 17); emptyTextView.setPadding(AndroidUtilities.dp(40), 0, AndroidUtilities.dp(40), AndroidUtilities.dp(128)); - emptyView.addView(emptyTextView); - layoutParams1 = (LinearLayout.LayoutParams) emptyTextView.getLayoutParams(); - layoutParams1.topMargin = AndroidUtilities.dp(24); - layoutParams1.width = LayoutHelper.WRAP_CONTENT; - layoutParams1.height = LayoutHelper.WRAP_CONTENT; - layoutParams1.gravity = Gravity.CENTER; - emptyTextView.setLayoutParams(layoutParams1); + emptyView.addView(emptyTextView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER, 0, 24, 0, 0)); progressView = new LinearLayout(context); 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 = LayoutHelper.MATCH_PARENT; - layoutParams.height = LayoutHelper.MATCH_PARENT; - progressView.setLayoutParams(layoutParams); + frameLayout.addView(progressView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); ProgressBar progressBar = new ProgressBar(context); - progressView.addView(progressBar); - layoutParams1 = (LinearLayout.LayoutParams) progressBar.getLayoutParams(); - layoutParams1.width = LayoutHelper.WRAP_CONTENT; - layoutParams1.height = LayoutHelper.WRAP_CONTENT; - progressBar.setLayoutParams(layoutParams1); + progressView.addView(progressBar, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT)); switchToCurrentSelectedMode(); @@ -639,7 +594,6 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No } 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; @@ -804,7 +758,6 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No } 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); @@ -887,6 +840,11 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No if (view instanceof SharedDocumentCell) { SharedDocumentCell cell = (SharedDocumentCell) view; if (cell.isLoaded()) { + if (message.isMusic()) { + if (MediaController.getInstance().setPlaylist(sharedMediaData[1].messages, message)) { + return; + } + } File f = null; String fileName = FileLoader.getAttachFileName(message.messageOwner.media.document); if (message.messageOwner.attachPath != null && message.messageOwner.attachPath.length() != 0) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java deleted file mode 100644 index b34bcb55..00000000 --- a/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java +++ /dev/null @@ -1,988 +0,0 @@ -/* - * This is the source code of Telegram for Android v. 1.3.2. - * 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. - */ - -package org.telegram.ui; - -import android.animation.ObjectAnimator; -import android.animation.StateListAnimator; -import android.annotation.SuppressLint; -import android.app.Activity; -import android.app.AlertDialog; -import android.content.Context; -import android.content.DialogInterface; -import android.content.SharedPreferences; -import android.content.res.Configuration; -import android.graphics.Outline; -import android.graphics.PorterDuff; -import android.graphics.drawable.Drawable; -import android.os.Build; -import android.os.Bundle; -import android.util.TypedValue; -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewOutlineProvider; -import android.view.ViewTreeObserver; -import android.view.animation.AccelerateDecelerateInterpolator; -import android.widget.EditText; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.ListView; -import android.widget.ProgressBar; -import android.widget.TextView; - -import org.telegram.android.AndroidUtilities; -import org.telegram.android.AnimationCompat.ObjectAnimatorProxy; -import org.telegram.android.AnimationCompat.ViewProxy; -import org.telegram.android.ContactsController; -import org.telegram.android.LocaleController; -import org.telegram.android.MessageObject; -import org.telegram.android.MessagesController; -import org.telegram.android.MessagesStorage; -import org.telegram.android.NotificationCenter; -import org.telegram.android.NotificationsController; -import org.telegram.android.UserObject; -import org.telegram.android.support.widget.LinearLayoutManager; -import org.telegram.android.support.widget.RecyclerView; -import org.telegram.messenger.ApplicationLoader; -import org.telegram.messenger.FileLog; -import org.telegram.messenger.R; -import org.telegram.messenger.TLRPC; -import org.telegram.messenger.UserConfig; -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.ActionBar.BottomSheet; -import org.telegram.ui.ActionBar.MenuDrawable; -import org.telegram.ui.Adapters.DialogsAdapter; -import org.telegram.ui.Adapters.DialogsSearchAdapter; -import org.telegram.ui.Cells.DialogCell; -import org.telegram.ui.Cells.UserCell; -import org.telegram.ui.Components.AlertsCreator; -import org.telegram.ui.Components.EmptyTextProgressView; -import org.telegram.ui.Components.LayoutHelper; -import org.telegram.ui.Components.RecyclerListView; -import org.telegram.ui.Components.ResourceLoader; - -import java.util.ArrayList; - -public class MessagesActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate { - - private RecyclerListView listView; - private LinearLayoutManager layoutManager; - private DialogsAdapter dialogsAdapter; - private DialogsSearchAdapter dialogsSearchAdapter; - private EmptyTextProgressView searchEmptyView; - private ProgressBar progressView; - private LinearLayout emptyView; - private ActionBarMenuItem passcodeItem; - private ImageView floatingButton; - - private int prevPosition; - private int prevTop; - private boolean scrollUpdated; - private boolean floatingHidden; - private final AccelerateDecelerateInterpolator floatingInterpolator = new AccelerateDecelerateInterpolator(); - - private String selectAlertString; - private String selectAlertStringGroup; - private String addToGroupAlertString; - private int dialogsType; - - private static boolean dialogsLoaded; - private boolean searching; - private boolean searchWas; - private boolean onlySelect; - private long selectedDialog; - private String searchString; - private long openedDialogId; - - private MessagesActivityDelegate delegate; - - public interface MessagesActivityDelegate { - void didSelectDialog(MessagesActivity fragment, long dialog_id, boolean param); - } - - public MessagesActivity(Bundle args) { - super(args); - } - - @Override - public boolean onFragmentCreate() { - super.onFragmentCreate(); - - if (getArguments() != null) { - onlySelect = arguments.getBoolean("onlySelect", false); - dialogsType = arguments.getInt("dialogsType", 0); - selectAlertString = arguments.getString("selectAlertString"); - selectAlertStringGroup = arguments.getString("selectAlertStringGroup"); - addToGroupAlertString = arguments.getString("addToGroupAlertString"); - } - - if (searchString == null) { - NotificationCenter.getInstance().addObserver(this, NotificationCenter.dialogsNeedReload); - NotificationCenter.getInstance().addObserver(this, NotificationCenter.emojiDidLoaded); - NotificationCenter.getInstance().addObserver(this, NotificationCenter.updateInterfaces); - NotificationCenter.getInstance().addObserver(this, NotificationCenter.encryptedChatUpdated); - NotificationCenter.getInstance().addObserver(this, NotificationCenter.contactsDidLoaded); - 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 (!dialogsLoaded) { - MessagesController.getInstance().loadDialogs(0, 0, 100, true); - ContactsController.getInstance().checkInviteText(); - dialogsLoaded = true; - } - return true; - } - - @Override - public void onFragmentDestroy() { - super.onFragmentDestroy(); - if (searchString == null) { - NotificationCenter.getInstance().removeObserver(this, NotificationCenter.dialogsNeedReload); - NotificationCenter.getInstance().removeObserver(this, NotificationCenter.emojiDidLoaded); - NotificationCenter.getInstance().removeObserver(this, NotificationCenter.updateInterfaces); - NotificationCenter.getInstance().removeObserver(this, NotificationCenter.encryptedChatUpdated); - NotificationCenter.getInstance().removeObserver(this, NotificationCenter.contactsDidLoaded); - 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(final Context context, LayoutInflater inflater) { - searching = false; - searchWas = false; - - ResourceLoader.loadRecources(context); - - SharedPreferences themePrefs = ApplicationLoader.applicationContext.getSharedPreferences(AndroidUtilities.THEME_PREFS, AndroidUtilities.THEME_PREFS_MODE); - ActionBarMenu menu = actionBar.createMenu(); - if (!onlySelect && searchString == null) { - Drawable lock = getParentActivity().getResources().getDrawable(R.drawable.lock_close); - lock.setColorFilter(themePrefs.getInt("chatsHeaderIconsColor", 0xffffffff), PorterDuff.Mode.MULTIPLY); - passcodeItem = menu.addItem(1, lock); - updatePasscodeButton(); - } - //ActionBarMenuItem item = menu.addItem(0, R.drawable.ic_ab_search).setIsSearchField(true).setActionBarMenuItemSearchListener(new ActionBarMenuItem.ActionBarMenuItemSearchListener() { - Drawable search = getParentActivity().getResources().getDrawable(R.drawable.ic_ab_search); - ActionBarMenuItem item = menu.addItem(0, search).setIsSearchField(true).setActionBarMenuItemSearchListener(new ActionBarMenuItem.ActionBarMenuItemSearchListener() { - @Override - public void onSearchExpand() { - searching = true; - if (listView != null) { - if (searchString != null) { - listView.setEmptyView(searchEmptyView); - progressView.setVisibility(View.GONE); - emptyView.setVisibility(View.GONE); - } - if (!onlySelect) { - floatingButton.setVisibility(View.GONE); - } - } - updatePasscodeButton(); - } - - @Override - public boolean canCollapseSearch() { - if (searchString != null) { - finishFragment(); - return false; - } - return true; - } - - @Override - public void onSearchCollapse() { - searching = false; - searchWas = false; - if (listView != null) { - searchEmptyView.setVisibility(View.GONE); - if (MessagesController.getInstance().loadingDialogs && MessagesController.getInstance().dialogs.isEmpty()) { - emptyView.setVisibility(View.GONE); - listView.setEmptyView(progressView); - } else { - progressView.setVisibility(View.GONE); - listView.setEmptyView(emptyView); - } - if (!onlySelect) { - floatingButton.setVisibility(View.VISIBLE); - floatingHidden = true; - ViewProxy.setTranslationY(floatingButton, AndroidUtilities.dp(100)); - hideFloatingButton(false); - } - if (listView.getAdapter() != dialogsAdapter) { - listView.setAdapter(dialogsAdapter); - dialogsAdapter.notifyDataSetChanged(); - } - } - if (dialogsSearchAdapter != null) { - dialogsSearchAdapter.searchDialogs(null, dialogsType); - } - updatePasscodeButton(); - } - - @Override - public void onTextChanged(EditText editText) { - String text = editText.getText().toString(); - if (text.length() != 0) { - searchWas = true; - if (dialogsSearchAdapter != null) { - listView.setAdapter(dialogsSearchAdapter); - dialogsSearchAdapter.notifyDataSetChanged(); - } - if (searchEmptyView != null && listView.getEmptyView() != searchEmptyView) { - emptyView.setVisibility(View.GONE); - progressView.setVisibility(View.GONE); - searchEmptyView.showTextView(); - listView.setEmptyView(searchEmptyView); - } - } - if (dialogsSearchAdapter != null) { - dialogsSearchAdapter.searchDialogs(text, dialogsType); - } - } - }); - item.getSearchField().setHint(LocaleController.getString("Search", R.string.Search)); - item.getSearchField().setTextColor(themePrefs.getInt("chatsHeaderTitleColor", 0xffffffff)); - Drawable clear = getParentActivity().getResources().getDrawable(R.drawable.ic_close_white); - clear.setColorFilter(AndroidUtilities.getIntDef("chatsHeaderIconsColor", 0xffffffff), PorterDuff.Mode.MULTIPLY); - item.getClearButton().setImageDrawable(clear); - if (onlySelect) { - //actionBar.setBackButtonImage(R.drawable.ic_ab_back); - Drawable back = getParentActivity().getResources().getDrawable(R.drawable.ic_ab_back); - back.setColorFilter(themePrefs.getInt("chatsHeaderIconsColor", 0xffffffff), PorterDuff.Mode.MULTIPLY); - actionBar.setBackButtonDrawable(back); - actionBar.setTitle(LocaleController.getString("SelectChat", R.string.SelectChat)); - } else { - if (searchString != null) { - actionBar.setBackButtonImage(R.drawable.ic_ab_back); - } else { - actionBar.setBackButtonDrawable(new MenuDrawable()); - } - actionBar.setTitle(LocaleController.getString("AppName", R.string.AppName)); - } - actionBar.setAllowOverlayTitle(true); - - actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { - @Override - public void onItemClick(int id) { - if (id == -1) { - if (onlySelect) { - finishFragment(); - } else if (parentLayout != null) { - parentLayout.getDrawerLayoutContainer().openDrawer(false); - } - } else if (id == 1) { - UserConfig.appLocked = !UserConfig.appLocked; - UserConfig.saveConfig(false); - updatePasscodeButton(); - } - } - }); - - - FrameLayout frameLayout = new FrameLayout(context); - fragmentView = frameLayout; - - listView = new RecyclerListView(context); - listView.setVerticalScrollBarEnabled(true); - listView.setItemAnimator(null); - listView.setInstantClick(true); - listView.setLayoutAnimation(null); - layoutManager = new LinearLayoutManager(context) { - @Override - public boolean supportsPredictiveItemAnimations() { - return false; - } - }; - layoutManager.setOrientation(LinearLayoutManager.VERTICAL); - listView.setLayoutManager(layoutManager); - if (Build.VERSION.SDK_INT >= 11) { - listView.setVerticalScrollbarPosition(LocaleController.isRTL ? ListView.SCROLLBAR_POSITION_LEFT : ListView.SCROLLBAR_POSITION_RIGHT); - } - frameLayout.addView(listView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); - listView.setOnItemClickListener(new RecyclerListView.OnItemClickListener() { - @Override - public void onItemClick(View view, int position) { - if (listView == null || listView.getAdapter() == null) { - return; - } - long dialog_id = 0; - int message_id = 0; - RecyclerView.Adapter adapter = listView.getAdapter(); - if (adapter == dialogsAdapter) { - TLRPC.TL_dialog dialog = dialogsAdapter.getItem(position); - if (dialog == null) { - return; - } - dialog_id = dialog.id; - } else if (adapter == dialogsSearchAdapter) { - Object obj = dialogsSearchAdapter.getItem(position); - if (obj instanceof TLRPC.User) { - dialog_id = ((TLRPC.User) obj).id; - if (dialogsSearchAdapter.isGlobalSearch(position)) { - ArrayList users = new ArrayList<>(); - users.add((TLRPC.User) obj); - MessagesController.getInstance().putUsers(users, false); - MessagesStorage.getInstance().putUsersAndChats(users, null, false, true); - } - } else if (obj instanceof TLRPC.Chat) { - if (((TLRPC.Chat) obj).id > 0) { - dialog_id = -((TLRPC.Chat) obj).id; - } else { - dialog_id = AndroidUtilities.makeBroadcastId(((TLRPC.Chat) obj).id); - } - } else if (obj instanceof TLRPC.EncryptedChat) { - dialog_id = ((long) ((TLRPC.EncryptedChat) obj).id) << 32; - } else if (obj instanceof MessageObject) { - MessageObject messageObject = (MessageObject) obj; - dialog_id = messageObject.getDialogId(); - message_id = messageObject.getId(); - dialogsSearchAdapter.addHashtagsFromMessage(dialogsSearchAdapter.getLastSearchString()); - } else if (obj instanceof String) { - actionBar.openSearchField((String) obj); - } - } - - if (dialog_id == 0) { - return; - } - - if (onlySelect) { - didSelectResult(dialog_id, true, false); - } else { - Bundle args = new Bundle(); - int lower_part = (int) dialog_id; - int high_id = (int) (dialog_id >> 32); - if (lower_part != 0) { - if (high_id == 1) { - args.putInt("chat_id", lower_part); - } else { - if (lower_part > 0) { - args.putInt("user_id", lower_part); - } else if (lower_part < 0) { - args.putInt("chat_id", -lower_part); - } - } - } else { - args.putInt("enc_id", high_id); - } - if (message_id != 0) { - args.putInt("message_id", message_id); - } else { - if (actionBar != null) { - actionBar.closeSearchField(); - } - } - if (AndroidUtilities.isTablet()) { - if (openedDialogId == dialog_id && adapter != dialogsSearchAdapter) { - return; - } - if (dialogsAdapter != null) { - dialogsAdapter.setOpenedDialogId(openedDialogId = dialog_id); - updateVisibleRows(MessagesController.UPDATE_MASK_SELECT_DIALOG); - } - } - if (searchString != null) { - NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats); - presentFragment(new ChatActivity(args)); - } else { - presentFragment(new ChatActivity(args)); - } - } - } - }); - listView.setOnItemLongClickListener(new RecyclerListView.OnItemLongClickListener() { - @Override - public void onItemClick(View view, int position) { - if (onlySelect || searching && searchWas || getParentActivity() == null) { - if (searchWas && searching) { - RecyclerView.Adapter adapter = listView.getAdapter(); - if (adapter == dialogsSearchAdapter) { - Object item = dialogsSearchAdapter.getItem(position); - if (item instanceof String) { - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - builder.setMessage(LocaleController.getString("ClearSearch", R.string.ClearSearch)); - builder.setPositiveButton(LocaleController.getString("ClearButton", R.string.ClearButton).toUpperCase(), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - dialogsSearchAdapter.clearRecentHashtags(); - } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showDialog(builder.create()); - return; - } - } - } - return; - } - TLRPC.TL_dialog dialog; - ArrayList dialogs = getDialogsArray(); - if (position < 0 || position >= dialogs.size()) { - return; - } - dialog = dialogs.get(position); - selectedDialog = dialog.id; - - /*AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - - - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showDialog(builder.create());*/ - - BottomSheet.Builder builder = new BottomSheet.Builder(getParentActivity()); - int lower_id = (int) selectedDialog; - int high_id = (int) (selectedDialog >> 32); - - final boolean isChat = lower_id < 0 && high_id != 1; - - int rightIcon = MessagesController.getInstance().isDialogMuted(selectedDialog) ? R.drawable.mute_fixed : 0; - - - builder.setItems(new CharSequence[]{ - - LocaleController.getString("ClearHistory", R.string.ClearHistory), - isChat ? LocaleController.getString("DeleteChat", R.string.DeleteChat) : LocaleController.getString("Delete", R.string.Delete), - rightIcon != 0 ? LocaleController.getString("UnmuteNotifications", R.string.UnmuteNotifications) : LocaleController.getString("MuteNotifications", R.string.MuteNotifications)}, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, final int which) { - if(which == 2){ - boolean muted = MessagesController.getInstance().isDialogMuted(selectedDialog); - if (!muted) { - showDialog(AlertsCreator.createMuteAlert(getParentActivity(), selectedDialog)); - } else { - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - editor.putInt("notify2_" + selectedDialog, 0); - MessagesStorage.getInstance().setDialogFlags(selectedDialog, 0); - editor.commit(); - TLRPC.TL_dialog dialg = MessagesController.getInstance().dialogs_dict.get(selectedDialog); - if (dialg != null) { - dialg.notify_settings = new TLRPC.TL_peerNotifySettings(); - } - NotificationsController.updateServerNotificationsSettings(selectedDialog); - } - }else{ - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - if (which == 0) { - builder.setMessage(LocaleController.getString("AreYouSureClearHistory", R.string.AreYouSureClearHistory)); - } else { - if (isChat) { - builder.setMessage(LocaleController.getString("AreYouSureDeleteAndExit", R.string.AreYouSureDeleteAndExit)); - } else { - builder.setMessage(LocaleController.getString("AreYouSureDeleteThisChat", R.string.AreYouSureDeleteThisChat)); - } - } - builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - if (which != 0) { - if (isChat) { - TLRPC.Chat currentChat = MessagesController.getInstance().getChat((int) -selectedDialog); - if (currentChat != null && currentChat.left || currentChat instanceof TLRPC.TL_chatForbidden) { - MessagesController.getInstance().deleteDialog(selectedDialog, 0, false); - } else { - MessagesController.getInstance().deleteUserFromChat((int) -selectedDialog, MessagesController.getInstance().getUser(UserConfig.getClientUserId()), null); - } - } else { - MessagesController.getInstance().deleteDialog(selectedDialog, 0, false); - } - if (AndroidUtilities.isTablet()) { - NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats, selectedDialog); - } - } else { - MessagesController.getInstance().deleteDialog(selectedDialog, 0, true); - } - } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showDialog(builder.create()); - } - } - }); - showDialog(builder.create()); - } - }); - - searchEmptyView = new EmptyTextProgressView(context); - searchEmptyView.setVisibility(View.GONE); - searchEmptyView.setShowAtCenter(true); - searchEmptyView.setText(LocaleController.getString("NoResult", R.string.NoResult)); - frameLayout.addView(searchEmptyView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); - - emptyView = new LinearLayout(context); - emptyView.setOrientation(LinearLayout.VERTICAL); - emptyView.setVisibility(View.GONE); - emptyView.setGravity(Gravity.CENTER); - frameLayout.addView(emptyView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT)); - emptyView.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - return true; - } - }); - - TextView textView = new TextView(context); - textView.setText(LocaleController.getString("NoChats", R.string.NoChats)); - textView.setTextColor(0xff959595); - textView.setGravity(Gravity.CENTER); - textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); - emptyView.addView(textView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT)); - - textView = new TextView(context); - String help = LocaleController.getString("NoChatsHelp", R.string.NoChatsHelp); - if (AndroidUtilities.isTablet() && !AndroidUtilities.isSmallTablet()) { - help = help.replace("\n", " "); - } - textView.setText(help); - textView.setTextColor(0xff959595); - textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); - textView.setGravity(Gravity.CENTER); - textView.setPadding(AndroidUtilities.dp(8), AndroidUtilities.dp(6), AndroidUtilities.dp(8), 0); - textView.setLineSpacing(AndroidUtilities.dp(2), 1); - emptyView.addView(textView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT)); - - progressView = new ProgressBar(context); - progressView.setVisibility(View.GONE); - frameLayout.addView(progressView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER)); - - floatingButton = new ImageView(context); - floatingButton.setVisibility(onlySelect ? View.GONE : View.VISIBLE); - floatingButton.setScaleType(ImageView.ScaleType.CENTER); - floatingButton.setBackgroundResource(R.drawable.floating_states); - floatingButton.setImageResource(R.drawable.floating_pencil); - if (Build.VERSION.SDK_INT >= 21) { - StateListAnimator animator = new StateListAnimator(); - animator.addState(new int[]{android.R.attr.state_pressed}, ObjectAnimator.ofFloat(floatingButton, "translationZ", AndroidUtilities.dp(2), AndroidUtilities.dp(4)).setDuration(200)); - animator.addState(new int[]{}, ObjectAnimator.ofFloat(floatingButton, "translationZ", AndroidUtilities.dp(4), AndroidUtilities.dp(2)).setDuration(200)); - floatingButton.setStateListAnimator(animator); - floatingButton.setOutlineProvider(new ViewOutlineProvider() { - @SuppressLint("NewApi") - @Override - public void getOutline(View view, Outline outline) { - outline.setOval(0, 0, AndroidUtilities.dp(56), AndroidUtilities.dp(56)); - } - }); - } - frameLayout.addView(floatingButton, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, (LocaleController.isRTL ? Gravity.LEFT : Gravity.RIGHT) | Gravity.BOTTOM, LocaleController.isRTL ? 14 : 0, 0, LocaleController.isRTL ? 0 : 14, 14)); - floatingButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Bundle args = new Bundle(); - args.putBoolean("destroyAfterSelect", true); - presentFragment(new ContactsActivity(args)); - } - }); - - listView.setOnScrollListener(new RecyclerView.OnScrollListener() { - @Override - public void onScrollStateChanged(RecyclerView recyclerView, int newState) { - if (newState == RecyclerView.SCROLL_STATE_DRAGGING && searching && searchWas) { - AndroidUtilities.hideKeyboard(getParentActivity().getCurrentFocus()); - } - } - - @Override - public void onScrolled(RecyclerView recyclerView, int dx, int dy) { - int firstVisibleItem = layoutManager.findFirstVisibleItemPosition(); - int visibleItemCount = Math.abs(layoutManager.findLastVisibleItemPosition() - firstVisibleItem) + 1; - int totalItemCount = recyclerView.getAdapter().getItemCount(); - - if (searching && searchWas) { - if (visibleItemCount > 0 && layoutManager.findLastVisibleItemPosition() == totalItemCount - 1 && !dialogsSearchAdapter.isMessagesSearchEndReached()) { - dialogsSearchAdapter.loadMoreSearchMessages(); - } - return; - } - if (visibleItemCount > 0) { - if (layoutManager.findLastVisibleItemPosition() == getDialogsArray().size()) { - MessagesController.getInstance().loadDialogs(MessagesController.getInstance().dialogs.size(), MessagesController.getInstance().dialogsServerOnly.size(), 100, true); - } - } - - if (floatingButton.getVisibility() != View.GONE) { - final View topChild = recyclerView.getChildAt(0); - int firstViewTop = 0; - if (topChild != null) { - firstViewTop = topChild.getTop(); - } - boolean goingDown; - boolean changed = true; - if (prevPosition == firstVisibleItem) { - final int topDelta = prevTop - firstViewTop; - goingDown = firstViewTop < prevTop; - changed = Math.abs(topDelta) > 1; - } else { - goingDown = firstVisibleItem > prevPosition; - } - if (changed && scrollUpdated) { - hideFloatingButton(goingDown); - } - prevPosition = firstVisibleItem; - prevTop = firstViewTop; - scrollUpdated = true; - } - } - }); - - if (searchString == null) { - dialogsAdapter = new DialogsAdapter(context, dialogsType); - if (AndroidUtilities.isTablet() && openedDialogId != 0) { - dialogsAdapter.setOpenedDialogId(openedDialogId); - } - listView.setAdapter(dialogsAdapter); - } - int type = 0; - if (searchString != null) { - type = 2; - } else if (!onlySelect) { - type = 1; - } - dialogsSearchAdapter = new DialogsSearchAdapter(context, type); - dialogsSearchAdapter.setDelegate(new DialogsSearchAdapter.MessagesActivitySearchAdapterDelegate() { - @Override - public void searchStateChanged(boolean search) { - if (searching && searchWas && searchEmptyView != null) { - if (search) { - searchEmptyView.showProgress(); - } else { - searchEmptyView.showTextView(); - } - } - } - }); - - if (MessagesController.getInstance().loadingDialogs && MessagesController.getInstance().dialogs.isEmpty()) { - searchEmptyView.setVisibility(View.GONE); - emptyView.setVisibility(View.GONE); - listView.setEmptyView(progressView); - } else { - searchEmptyView.setVisibility(View.GONE); - progressView.setVisibility(View.GONE); - listView.setEmptyView(emptyView); - } - if (searchString != null) { - actionBar.openSearchField(searchString); - } - - return fragmentView; - } - - @Override - public void onResume() { - super.onResume(); - if (dialogsAdapter != null) { - dialogsAdapter.notifyDataSetChanged(); - } - if (dialogsSearchAdapter != null) { - dialogsSearchAdapter.notifyDataSetChanged(); - } - updateTheme(); - } - - private void updateTheme(){ - SharedPreferences themePrefs = ApplicationLoader.applicationContext.getSharedPreferences(AndroidUtilities.THEME_PREFS, AndroidUtilities.THEME_PREFS_MODE); - int def = themePrefs.getInt("themeColor", AndroidUtilities.defColor); - //UpdateupdateActionBarTitle - int value = themePrefs.getInt("chatsHeaderTitle", 0); - String title = LocaleController.getString("AppName", R.string.AppName); - TLRPC.User user = UserConfig.getCurrentUser(); - if( value == 1){ - title = LocaleController.getString("ShortAppName", R.string.ShortAppName); - } else if( value == 2){ - if (user != null && (user.first_name != null || user.last_name != null)) { - title = ContactsController.formatName(user.first_name, user.last_name); - } - } else if(value == 3){ - if (user != null && user.username != null && user.username.length() != 0) { - title = "@" + user.username; - } - } else if(value == 4){ - title = ""; - } - actionBar.setTitle(title); - actionBar.setTitleColor(themePrefs.getInt("chatsHeaderTitleColor", 0xffffffff)); - - actionBar.setBackgroundColor(themePrefs.getInt("chatsHeaderColor", def)); - Drawable floatingDrawableWhite = fragmentView.getResources().getDrawable(R.drawable.floating_white); - floatingDrawableWhite.setColorFilter(themePrefs.getInt("chatsFloatingBGColor", def), PorterDuff.Mode.MULTIPLY); - floatingButton.setBackgroundDrawable(floatingDrawableWhite); - Drawable pencilDrawableWhite = fragmentView.getResources().getDrawable(R.drawable.floating_pencil); - pencilDrawableWhite.setColorFilter(themePrefs.getInt("chatsFloatingPencilColor", 0xffffffff), PorterDuff.Mode.MULTIPLY); - floatingButton.setImageDrawable(pencilDrawableWhite); - Drawable search = getParentActivity().getResources().getDrawable(R.drawable.ic_ab_search); - search.setColorFilter(themePrefs.getInt("chatsHeaderIconsColor", 0xffffffff), PorterDuff.Mode.MULTIPLY); - Drawable lock = getParentActivity().getResources().getDrawable(R.drawable.lock_close); - lock.setColorFilter(themePrefs.getInt("chatsHeaderIconsColor", 0xffffffff), PorterDuff.Mode.MULTIPLY); - lock = getParentActivity().getResources().getDrawable(R.drawable.lock_open); - lock.setColorFilter(themePrefs.getInt("chatsHeaderIconsColor", 0xffffffff), PorterDuff.Mode.MULTIPLY); - Drawable clear = getParentActivity().getResources().getDrawable(R.drawable.ic_close_white); - clear.setColorFilter(AndroidUtilities.getIntDef("chatsHeaderIconsColor", 0xffffffff), PorterDuff.Mode.MULTIPLY); - - } - - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - if (!onlySelect && floatingButton != null) { - floatingButton.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { - @Override - public void onGlobalLayout() { - ViewProxy.setTranslationY(floatingButton, floatingHidden ? AndroidUtilities.dp(100) : 0); - floatingButton.setClickable(!floatingHidden); - if (floatingButton != null) { - if (Build.VERSION.SDK_INT < 16) { - floatingButton.getViewTreeObserver().removeGlobalOnLayoutListener(this); - } else { - floatingButton.getViewTreeObserver().removeOnGlobalLayoutListener(this); - } - } - } - }); - } - } - - @Override - @SuppressWarnings("unchecked") - public void didReceivedNotification(int id, Object... args) { - if (id == NotificationCenter.dialogsNeedReload) { - if (dialogsAdapter != null) { - if (dialogsAdapter.isDataSetChanged()) { - dialogsAdapter.notifyDataSetChanged(); - } else { - updateVisibleRows(MessagesController.UPDATE_MASK_NEW_MESSAGE); - } - } - if (dialogsSearchAdapter != null) { - dialogsSearchAdapter.notifyDataSetChanged(); - } - if (listView != null) { - try { - if (MessagesController.getInstance().loadingDialogs && MessagesController.getInstance().dialogs.isEmpty()) { - searchEmptyView.setVisibility(View.GONE); - emptyView.setVisibility(View.GONE); - listView.setEmptyView(progressView); - } else { - progressView.setVisibility(View.GONE); - if (searching && searchWas) { - emptyView.setVisibility(View.GONE); - listView.setEmptyView(searchEmptyView); - } else { - searchEmptyView.setVisibility(View.GONE); - listView.setEmptyView(emptyView); - } - } - } catch (Exception e) { - FileLog.e("tmessages", e); //TODO fix it in other way? - } - } - } else if (id == NotificationCenter.emojiDidLoaded) { - if (listView != null) { - updateVisibleRows(0); - } - } else if (id == NotificationCenter.updateInterfaces) { - updateVisibleRows((Integer) args[0]); - } else if (id == NotificationCenter.appDidLogout) { - dialogsLoaded = false; - } else if (id == NotificationCenter.encryptedChatUpdated) { - updateVisibleRows(0); - } else if (id == NotificationCenter.contactsDidLoaded) { - updateVisibleRows(0); - } else if (id == NotificationCenter.openedChatChanged) { - if (dialogsType == 0 && AndroidUtilities.isTablet()) { - boolean close = (Boolean) args[1]; - long dialog_id = (Long) args[0]; - if (close) { - if (dialog_id == openedDialogId) { - openedDialogId = 0; - } - } else { - openedDialogId = dialog_id; - } - if (dialogsAdapter != null) { - dialogsAdapter.setOpenedDialogId(openedDialogId); - } - updateVisibleRows(MessagesController.UPDATE_MASK_SELECT_DIALOG); - } - } else if (id == NotificationCenter.notificationsSettingsUpdated) { - 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 ArrayList getDialogsArray() { - if (dialogsType == 0) { - return MessagesController.getInstance().dialogs; - } else if (dialogsType == 1) { - return MessagesController.getInstance().dialogsServerOnly; - } else if (dialogsType == 2) { - return MessagesController.getInstance().dialogsGroupsOnly; - } - return null; - } - - 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); - Drawable lock = getParentActivity().getResources().getDrawable(R.drawable.lock_close); - lock.setColorFilter(AndroidUtilities.getIntDef("chatsHeaderIconsColor", 0xffffffff), PorterDuff.Mode.MULTIPLY); - passcodeItem.setIcon(lock); - } else { - //passcodeItem.setIcon(R.drawable.lock_open); - Drawable lock = getParentActivity().getResources().getDrawable(R.drawable.lock_open); - passcodeItem.setIcon(lock); - } - } else { - passcodeItem.setVisibility(View.GONE); - } - } - - private void hideFloatingButton(boolean hide) { - if (floatingHidden == hide) { - return; - } - floatingHidden = hide; - ObjectAnimatorProxy animator = ObjectAnimatorProxy.ofFloatProxy(floatingButton, "translationY", floatingHidden ? AndroidUtilities.dp(100) : 0).setDuration(300); - animator.setInterpolator(floatingInterpolator); - floatingButton.setClickable(!hide); - animator.start(); - } - - private void updateVisibleRows(int mask) { - if (listView == null) { - return; - } - int count = listView.getChildCount(); - for (int a = 0; a < count; a++) { - View child = listView.getChildAt(a); - if (child instanceof DialogCell) { - if (listView.getAdapter() != dialogsSearchAdapter) { - DialogCell cell = (DialogCell) child; - if ((mask & MessagesController.UPDATE_MASK_NEW_MESSAGE) != 0) { - cell.checkCurrentDialogIndex(); - if (dialogsType == 0 && AndroidUtilities.isTablet()) { - cell.setDialogSelected(cell.getDialogId() == openedDialogId); - } - } else if ((mask & MessagesController.UPDATE_MASK_SELECT_DIALOG) != 0) { - if (dialogsType == 0 && AndroidUtilities.isTablet()) { - cell.setDialogSelected(cell.getDialogId() == openedDialogId); - } - } else { - cell.update(mask); - } - } - } else if (child instanceof UserCell) { - ((UserCell) child).update(mask); - } - } - } - - public void setDelegate(MessagesActivityDelegate delegate) { - this.delegate = delegate; - } - - public void setSearchString(String string) { - searchString = string; - } - - public boolean isMainDialogList() { - return delegate == null && searchString == null; - } - - private void didSelectResult(final long dialog_id, boolean useAlert, final boolean param) { - if (useAlert && (selectAlertString != null && selectAlertStringGroup != null || addToGroupAlertString != null)) { - if (getParentActivity() == null) { - return; - } - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); - int lower_part = (int) dialog_id; - int high_id = (int) (dialog_id >> 32); - if (lower_part != 0) { - if (high_id == 1) { - TLRPC.Chat chat = MessagesController.getInstance().getChat(lower_part); - if (chat == null) { - return; - } - builder.setMessage(LocaleController.formatStringSimple(selectAlertStringGroup, chat.title)); - } else { - if (lower_part > 0) { - TLRPC.User user = MessagesController.getInstance().getUser(lower_part); - if (user == null) { - return; - } - builder.setMessage(LocaleController.formatStringSimple(selectAlertString, UserObject.getUserName(user))); - } else if (lower_part < 0) { - TLRPC.Chat chat = MessagesController.getInstance().getChat(-lower_part); - if (chat == null) { - return; - } - if (addToGroupAlertString != null) { - builder.setMessage(LocaleController.formatStringSimple(addToGroupAlertString, chat.title)); - } else { - builder.setMessage(LocaleController.formatStringSimple(selectAlertStringGroup, chat.title)); - } - } - } - } else { - TLRPC.EncryptedChat chat = MessagesController.getInstance().getEncryptedChat(high_id); - TLRPC.User user = MessagesController.getInstance().getUser(chat.user_id); - if (user == null) { - return; - } - builder.setMessage(LocaleController.formatStringSimple(selectAlertString, UserObject.getUserName(user))); - } - - builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - didSelectResult(dialog_id, false, false); - } - }); - builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); - showDialog(builder.create()); - } else { - if (delegate != null) { - delegate.didSelectDialog(MessagesActivity.this, dialog_id, param); - delegate = null; - } else { - finishFragment(); - } - } - } -} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/NotificationsSettingsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/NotificationsSettingsActivity.java index 49e235ad..9da47e26 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/NotificationsSettingsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/NotificationsSettingsActivity.java @@ -22,7 +22,6 @@ import android.net.Uri; import android.os.Build; import android.provider.Settings; import android.view.Gravity; -import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; @@ -90,7 +89,6 @@ public class NotificationsSettingsActivity extends BaseFragment implements Notif private int otherSectionRow2; private int otherSectionRow; private int badgeNumberRow; - private int pebbleAlertRow; private int androidAutoAlertRow; private int repeatRow; private int resetSectionRow2; @@ -145,7 +143,6 @@ public class NotificationsSettingsActivity extends BaseFragment implements Notif otherSectionRow = rowCount++; badgeNumberRow = rowCount++; androidAutoAlertRow = -1; - pebbleAlertRow = rowCount++; repeatRow = rowCount++; resetSectionRow2 = rowCount++; resetSectionRow = rowCount++; @@ -163,7 +160,7 @@ public class NotificationsSettingsActivity extends BaseFragment implements Notif } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); actionBar.setTitle(LocaleController.getString("NotificationsAndSounds", R.string.NotificationsAndSounds)); @@ -325,12 +322,6 @@ public class NotificationsSettingsActivity extends BaseFragment implements Notif MessagesController.getInstance().enableJoined = !enabled; editor.putBoolean("EnableContactJoined", !enabled); editor.commit(); - } else if (i == pebbleAlertRow) { - SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); - SharedPreferences.Editor editor = preferences.edit(); - enabled = preferences.getBoolean("EnablePebbleNotifications", false); - editor.putBoolean("EnablePebbleNotifications", !enabled); - editor.commit(); } else if (i == androidAutoAlertRow) { SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); @@ -452,7 +443,7 @@ public class NotificationsSettingsActivity extends BaseFragment implements Notif builder.setTitle(LocaleController.getString("Vibrate", R.string.Vibrate)); builder.setItems(new CharSequence[]{ LocaleController.getString("VibrationDisabled", R.string.VibrationDisabled), - LocaleController.getString("Default", R.string.Default), + LocaleController.getString("VibrationDefault", R.string.VibrationDefault), LocaleController.getString("Short", R.string.Short), LocaleController.getString("Long", R.string.Long), LocaleController.getString("OnlyIfSilent", R.string.OnlyIfSilent) @@ -729,8 +720,6 @@ public class NotificationsSettingsActivity extends BaseFragment implements Notif checkCell.setTextAndCheck(LocaleController.getString("NotificationsPriority", R.string.NotificationsPriority), preferences.getBoolean("EnableInAppPriority", false), false); } else if (i == contactJoinedRow) { checkCell.setTextAndCheck(LocaleController.getString("ContactJoined", R.string.ContactJoined), preferences.getBoolean("EnableContactJoined", true), false); - } else if (i == pebbleAlertRow) { - checkCell.setTextAndCheck(LocaleController.getString("Pebble", R.string.Pebble), preferences.getBoolean("EnablePebbleNotifications", false), true); } else if (i == androidAutoAlertRow) { checkCell.setTextAndCheck("Android Auto", preferences.getBoolean("EnableAutoNotifications", false), true); } else if (i == notificationsServiceRow) { @@ -792,7 +781,7 @@ public class NotificationsSettingsActivity extends BaseFragment implements Notif value = preferences.getInt("vibrate_group", 0); } if (value == 0) { - textCell.setTextAndValue(LocaleController.getString("Vibrate", R.string.Vibrate), LocaleController.getString("Default", R.string.Default), true); + textCell.setTextAndValue(LocaleController.getString("Vibrate", R.string.Vibrate), LocaleController.getString("VibrationDefault", R.string.VibrationDefault), true); } else if (value == 1) { textCell.setTextAndValue(LocaleController.getString("Vibrate", R.string.Vibrate), LocaleController.getString("Short", R.string.Short), true); } else if (value == 2) { @@ -858,7 +847,7 @@ public class NotificationsSettingsActivity extends BaseFragment implements Notif return 0; } else if (i == messageAlertRow || i == messagePreviewRow || i == groupAlertRow || i == groupPreviewRow || i == inappSoundRow || i == inappVibrateRow || - i == inappPreviewRow || i == contactJoinedRow || i == pebbleAlertRow || + i == inappPreviewRow || i == contactJoinedRow || i == notificationsServiceRow || i == badgeNumberRow || i == inappPriorityRow || i == inchatSoundRow || i == androidAutoAlertRow) { return 1; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PasscodeActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PasscodeActivity.java index 819e17ac..2051cd51 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PasscodeActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PasscodeActivity.java @@ -30,7 +30,6 @@ 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; @@ -111,7 +110,7 @@ public class PasscodeActivity extends BaseFragment implements NotificationCenter } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { if (type != 3) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PhotoAlbumPickerActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PhotoAlbumPickerActivity.java index 217adb48..09703b1b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PhotoAlbumPickerActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PhotoAlbumPickerActivity.java @@ -15,7 +15,6 @@ import android.graphics.drawable.ColorDrawable; import android.os.Build; import android.text.TextUtils; import android.view.Gravity; -import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.Surface; import android.view.View; @@ -42,7 +41,7 @@ import org.telegram.ui.Adapters.BaseFragmentAdapter; import org.telegram.ui.Cells.PhotoPickerAlbumsCell; import org.telegram.ui.Cells.PhotoPickerSearchCell; import org.telegram.ui.Components.LayoutHelper; -import org.telegram.ui.Components.PhotoPickerBottomLayout; +import org.telegram.ui.Components.PickerBottomLayout; import java.util.ArrayList; import java.util.HashMap; @@ -72,7 +71,7 @@ public class PhotoAlbumPickerActivity extends BaseFragment implements Notificati private TextView emptyView; private TextView dropDown; private ActionBarMenuItem dropDownContainer; - private PhotoPickerBottomLayout photoPickerBottomLayout; + private PickerBottomLayout pickerBottomLayout; private boolean sendPressed = false; private boolean singlePhoto = false; private int selectedMode; @@ -114,7 +113,7 @@ public class PhotoAlbumPickerActivity extends BaseFragment implements Notificati @SuppressWarnings("unchecked") @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { actionBar.setBackgroundColor(0xff333333); actionBar.setItemsBackground(R.drawable.bar_selector_picker); actionBar.setBackButtonImage(R.drawable.ic_ab_back); @@ -261,20 +260,20 @@ public class PhotoAlbumPickerActivity extends BaseFragment implements Notificati layoutParams.gravity = Gravity.CENTER; progressView.setLayoutParams(layoutParams); - photoPickerBottomLayout = new PhotoPickerBottomLayout(context); - frameLayout.addView(photoPickerBottomLayout); - layoutParams = (FrameLayout.LayoutParams) photoPickerBottomLayout.getLayoutParams(); + pickerBottomLayout = new PickerBottomLayout(context); + frameLayout.addView(pickerBottomLayout); + layoutParams = (FrameLayout.LayoutParams) pickerBottomLayout.getLayoutParams(); layoutParams.width = LayoutHelper.MATCH_PARENT; layoutParams.height = AndroidUtilities.dp(48); layoutParams.gravity = Gravity.BOTTOM; - photoPickerBottomLayout.setLayoutParams(layoutParams); - photoPickerBottomLayout.cancelButton.setOnClickListener(new View.OnClickListener() { + pickerBottomLayout.setLayoutParams(layoutParams); + pickerBottomLayout.cancelButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { finishFragment(); } }); - photoPickerBottomLayout.doneButton.setOnClickListener(new View.OnClickListener() { + pickerBottomLayout.doneButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { sendSelectedPhotos(); @@ -289,7 +288,7 @@ public class PhotoAlbumPickerActivity extends BaseFragment implements Notificati progressView.setVisibility(View.GONE); listView.setEmptyView(emptyView); } - photoPickerBottomLayout.updateSelectedCount(selectedPhotos.size() + selectedWebPhotos.size(), true); + pickerBottomLayout.updateSelectedCount(selectedPhotos.size() + selectedWebPhotos.size(), true); return fragmentView; } @@ -469,8 +468,8 @@ public class PhotoAlbumPickerActivity extends BaseFragment implements Notificati fragment.setDelegate(new PhotoPickerActivity.PhotoPickerActivityDelegate() { @Override public void selectedPhotosChanged() { - if (photoPickerBottomLayout != null) { - photoPickerBottomLayout.updateSelectedCount(selectedPhotos.size() + selectedWebPhotos.size(), true); + if (pickerBottomLayout != null) { + pickerBottomLayout.updateSelectedCount(selectedPhotos.size() + selectedWebPhotos.size(), true); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PhotoCropActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PhotoCropActivity.java index a215bc91..db5fba6e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PhotoCropActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PhotoCropActivity.java @@ -16,15 +16,14 @@ import android.graphics.drawable.BitmapDrawable; import android.net.Uri; import android.os.Bundle; import android.util.AttributeSet; -import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.widget.FrameLayout; import org.telegram.android.AndroidUtilities; import org.telegram.android.ImageLoader; -import org.telegram.android.LocaleController; import org.telegram.messenger.FileLog; +import org.telegram.android.LocaleController; import org.telegram.messenger.R; import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.ActionBarMenu; @@ -400,7 +399,7 @@ public class PhotoCropActivity extends BaseFragment { return false; } } - int size = 0; + int size; if (AndroidUtilities.isTablet()) { size = AndroidUtilities.dp(520); } else { @@ -432,7 +431,7 @@ public class PhotoCropActivity extends BaseFragment { } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { actionBar.setBackgroundColor(0xff333333); actionBar.setItemsBackground(R.drawable.bar_selector_picker); actionBar.setBackButtonImage(R.drawable.ic_ab_back); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PhotoPickerActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PhotoPickerActivity.java index a9f420e8..4c0f327a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PhotoPickerActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PhotoPickerActivity.java @@ -61,7 +61,7 @@ import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.Cells.PhotoPickerPhotoCell; import org.telegram.ui.Components.BackupImageView; import org.telegram.ui.Components.LayoutHelper; -import org.telegram.ui.Components.PhotoPickerBottomLayout; +import org.telegram.ui.Components.PickerBottomLayout; import java.net.URLEncoder; import java.util.ArrayList; @@ -98,7 +98,7 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen private GridView listView; private ListAdapter listAdapter; - private PhotoPickerBottomLayout photoPickerBottomLayout; + private PickerBottomLayout pickerBottomLayout; private FrameLayout progressView; private TextView emptyView; private ActionBarMenuItem searchItem; @@ -150,7 +150,7 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen @SuppressWarnings("unchecked") @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { actionBar.setBackgroundColor(0xff333333); actionBar.setItemsBackground(R.drawable.bar_selector_picker); actionBar.setBackButtonImage(R.drawable.ic_ab_back); @@ -395,32 +395,32 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen updateSearchInterface(); } - photoPickerBottomLayout = new PhotoPickerBottomLayout(context); - frameLayout.addView(photoPickerBottomLayout); - layoutParams = (FrameLayout.LayoutParams) photoPickerBottomLayout.getLayoutParams(); + pickerBottomLayout = new PickerBottomLayout(context); + frameLayout.addView(pickerBottomLayout); + layoutParams = (FrameLayout.LayoutParams) pickerBottomLayout.getLayoutParams(); layoutParams.width = LayoutHelper.MATCH_PARENT; layoutParams.height = AndroidUtilities.dp(48); layoutParams.gravity = Gravity.BOTTOM; - photoPickerBottomLayout.setLayoutParams(layoutParams); - photoPickerBottomLayout.cancelButton.setOnClickListener(new View.OnClickListener() { + pickerBottomLayout.setLayoutParams(layoutParams); + pickerBottomLayout.cancelButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { delegate.actionButtonPressed(true); finishFragment(); } }); - photoPickerBottomLayout.doneButton.setOnClickListener(new View.OnClickListener() { + pickerBottomLayout.doneButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { sendSelectedPhotos(); } }); if (singlePhoto) { - photoPickerBottomLayout.setVisibility(View.GONE); + pickerBottomLayout.setVisibility(View.GONE); } listView.setEmptyView(emptyView); - photoPickerBottomLayout.updateSelectedCount(selectedPhotos.size() + selectedWebPhotos.size(), true); + pickerBottomLayout.updateSelectedCount(selectedPhotos.size() + selectedWebPhotos.size(), true); return fragmentView; } @@ -650,7 +650,7 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen break; } } - photoPickerBottomLayout.updateSelectedCount(selectedPhotos.size() + selectedWebPhotos.size(), true); + pickerBottomLayout.updateSelectedCount(selectedPhotos.size() + selectedWebPhotos.size(), true); delegate.selectedPhotosChanged(); } @@ -935,7 +935,7 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen listView.setSelection(position); if (selectedAlbum == null) { - emptyView.setPadding(0, 0, 0, (int)((AndroidUtilities.displaySize.y - AndroidUtilities.getCurrentActionBarHeight()) * 0.4f)); + emptyView.setPadding(0, 0, 0, (int)((AndroidUtilities.displaySize.y - ActionBar.getCurrentActionBarHeight()) * 0.4f)); } } @@ -1033,7 +1033,7 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen } ((PhotoPickerPhotoCell) v.getParent()).checkBox.setChecked(selectedWebPhotos.containsKey(photoEntry.id), true); } - photoPickerBottomLayout.updateSelectedCount(selectedPhotos.size() + selectedWebPhotos.size(), true); + pickerBottomLayout.updateSelectedCount(selectedPhotos.size() + selectedWebPhotos.size(), true); delegate.selectedPhotosChanged(); } }); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java b/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java index 2816c625..bffc3f51 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java @@ -78,7 +78,7 @@ import org.telegram.ui.Components.GifDrawable; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.PhotoCropView; import org.telegram.ui.Components.PhotoFilterView; -import org.telegram.ui.Components.PhotoPickerBottomLayout; +import org.telegram.ui.Components.PickerBottomLayout; import org.telegram.ui.Components.PhotoViewerCaptionEnterView; import org.telegram.ui.Components.SizeNotifierFrameLayoutPhoto; @@ -114,8 +114,8 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat private ImageView shareButton; private BackgroundDrawable backgroundDrawable = new BackgroundDrawable(0xff000000); private CheckBox checkImageView; - private PhotoPickerBottomLayout pickerView; - private PhotoPickerBottomLayout editorDoneLayout; + private PickerBottomLayout pickerView; + private PickerBottomLayout editorDoneLayout; private RadialProgressView radialProgressViews[] = new RadialProgressView[3]; private GifDrawable gifDrawable; private ActionBarMenuItem cropItem; @@ -522,8 +522,6 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - int widthMode = MeasureSpec.getMode(widthMeasureSpec); - int heightMode = MeasureSpec.getMode(heightMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); @@ -1209,7 +1207,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat dateTextView.setGravity(Gravity.LEFT); bottomLayout.addView(dateTextView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.TOP | Gravity.LEFT, 16, 25, 50, 0)); - pickerView = new PhotoPickerBottomLayout(parentActivity); + pickerView = new PickerBottomLayout(parentActivity); pickerView.setBackgroundColor(0x7f000000); containerView.addView(pickerView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 48, Gravity.BOTTOM | Gravity.LEFT)); pickerView.cancelButton.setOnClickListener(new View.OnClickListener() { @@ -1231,7 +1229,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } }); - editorDoneLayout = new PhotoPickerBottomLayout(parentActivity); + editorDoneLayout = new PickerBottomLayout(parentActivity); editorDoneLayout.setBackgroundColor(0x7f000000); editorDoneLayout.updateSelectedCount(0, false); editorDoneLayout.setVisibility(View.GONE); @@ -1310,7 +1308,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat @Override public void onWindowSizeChanged(int size) { int height = AndroidUtilities.dp(36 * Math.min(3, mentionsAdapter.getCount()) + (mentionsAdapter.getCount() > 3 ? 18 : 0)); - if (size - AndroidUtilities.getCurrentActionBarHeight() * 2 < height) { + if (size - ActionBar.getCurrentActionBarHeight() * 2 < height) { allowMentions = false; if (mentionListView != null && mentionListView.getVisibility() == View.VISIBLE) { mentionListView.clearAnimation(); @@ -1613,8 +1611,6 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat 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; @@ -1767,8 +1763,6 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat 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; @@ -1887,8 +1881,6 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat 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; @@ -2557,7 +2549,6 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat captionTextViewNew = captionTextView; captionItem.setIcon(R.drawable.photo_text2); - CharSequence oldText = captionTextView.getText(); captionTextView.setTag(caption); captionTextView.setText(caption); ViewProxy.setAlpha(captionTextView, bottomLayout.getVisibility() == View.VISIBLE || pickerView.getVisibility() == View.VISIBLE ? 1.0f : 0.0f); @@ -3055,7 +3046,6 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat if (animated) { animationInProgress = 1; - int visibility = animatingImageView.getVisibility(); animatingImageView.setVisibility(View.VISIBLE); containerView.invalidate(); @@ -3739,7 +3729,6 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat } ImageReceiver sideImage = null; - Bitmap bitmap; if (currentEditMode == 0) { if (scale >= 1.0f && !zoomAnimation && !zooming) { if (currentTranslationX > maxX + AndroidUtilities.dp(5)) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java index f0c481eb..68b6c659 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java @@ -153,6 +153,12 @@ public class PopupNotificationActivity extends Activity implements NotificationC @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + + int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); + if (resourceId > 0) { + AndroidUtilities.statusBarHeight = getResources().getDimensionPixelSize(resourceId); + } + classGuid = ConnectionsManager.getInstance().generateClassGuid(); NotificationCenter.getInstance().addObserver(this, NotificationCenter.appDidLogout); NotificationCenter.getInstance().addObserver(this, NotificationCenter.pushMessagesUpdated); @@ -823,7 +829,7 @@ public class PopupNotificationActivity extends Activity implements NotificationC if (avatarContainer != null) { avatarContainer.getViewTreeObserver().removeOnPreDrawListener(this); } - int padding = (AndroidUtilities.getCurrentActionBarHeight() - AndroidUtilities.dp(48)) / 2; + int padding = (ActionBar.getCurrentActionBarHeight() - AndroidUtilities.dp(48)) / 2; avatarContainer.setPadding(avatarContainer.getPaddingLeft(), padding, avatarContainer.getPaddingRight(), padding); return true; } @@ -836,7 +842,7 @@ public class PopupNotificationActivity extends Activity implements NotificationC messageContainer.getViewTreeObserver().removeOnPreDrawListener(this); if (!checkTransitionAnimation() && !startedMoving) { ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) messageContainer.getLayoutParams(); - layoutParams.topMargin = AndroidUtilities.getCurrentActionBarHeight(); + layoutParams.topMargin = ActionBar.getCurrentActionBarHeight(); layoutParams.bottomMargin = AndroidUtilities.dp(48); layoutParams.width = ViewGroup.MarginLayoutParams.MATCH_PARENT; layoutParams.height = ViewGroup.MarginLayoutParams.MATCH_PARENT; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PrivacySettingsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PrivacySettingsActivity.java index a02004cb..4a28cf9f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PrivacySettingsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PrivacySettingsActivity.java @@ -16,7 +16,6 @@ import android.content.DialogInterface; import android.content.SharedPreferences; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; -import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; @@ -98,7 +97,7 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); actionBar.setTitle(LocaleController.getString("PrivacySettings", R.string.PrivacySettings)); @@ -209,6 +208,7 @@ public class PrivacySettingsActivity extends BaseFragment implements Notificatio if (view instanceof TextCheckCell) { ((TextCheckCell) view).setChecked(!scr); } + NotificationCenter.getInstance().postNotificationName(NotificationCenter.mainUserInfoChanged); } } }); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java index cfae2e80..d42c7404 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java @@ -28,7 +28,6 @@ import android.os.Bundle; import android.text.TextUtils; import android.util.TypedValue; import android.view.Gravity; -import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewOutlineProvider; @@ -90,7 +89,7 @@ import java.util.Comparator; import java.util.HashMap; import java.util.concurrent.Semaphore; -public class ProfileActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate, MessagesActivity.MessagesActivityDelegate, PhotoViewer.PhotoViewerProvider { +public class ProfileActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate, DialogsActivity.MessagesActivityDelegate, PhotoViewer.PhotoViewerProvider { private ListView listView; private ListAdapter listAdapter; @@ -248,7 +247,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { actionBar.setBackgroundColor(AvatarDrawable.getProfileBackColorForId(user_id != 0 ? 5 : chat_id)); actionBar.setItemsBackground(AvatarDrawable.getButtonColorForId(user_id != 0 ? 5 : chat_id)); //actionBar.setBackButtonImage(R.drawable.ic_ab_back); @@ -297,7 +296,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. Bundle args = new Bundle(); args.putBoolean("onlySelect", true); args.putInt("dialogsType", 1); - MessagesActivity fragment = new MessagesActivity(args); + DialogsActivity fragment = new DialogsActivity(args); fragment.setDelegate(ProfileActivity.this); presentFragment(fragment); } else if (id == edit_contact) { @@ -349,10 +348,10 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. args.putBoolean("onlySelect", true); args.putInt("dialogsType", 2); args.putString("addToGroupAlertString", LocaleController.formatString("AddToTheGroupTitle", R.string.AddToTheGroupTitle, UserObject.getUserName(user), "%1$s")); - MessagesActivity fragment = new MessagesActivity(args); - fragment.setDelegate(new MessagesActivity.MessagesActivityDelegate() { + DialogsActivity fragment = new DialogsActivity(args); + fragment.setDelegate(new DialogsActivity.MessagesActivityDelegate() { @Override - public void didSelectDialog(MessagesActivity fragment, long did, boolean param) { + public void didSelectDialog(DialogsActivity fragment, long did, boolean param) { NotificationCenter.getInstance().removeObserver(ProfileActivity.this, NotificationCenter.closeChats); NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats); MessagesController.getInstance().addUserToChat(-(int) did, user, null, 0, null); @@ -708,7 +707,6 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. builder.setItems(items, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { - int action = 0; if (i == 0) { avatarUpdater.openCamera(); } else if (i == 1) { @@ -815,7 +813,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. FrameLayout.LayoutParams layoutParams; if (listView != null) { layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); - layoutParams.topMargin = (actionBar.getOccupyStatusBar() ? AndroidUtilities.statusBarHeight : 0) + AndroidUtilities.getCurrentActionBarHeight(); + layoutParams.topMargin = (actionBar.getOccupyStatusBar() ? AndroidUtilities.statusBarHeight : 0) + ActionBar.getCurrentActionBarHeight(); listView.setLayoutParams(layoutParams); } @@ -825,7 +823,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. int avatarSize = 42 + (int)(18 * diff); int avatarX = 17 + (int)(47 * diffm); - int avatarY = AndroidUtilities.dp(22) - (int)((AndroidUtilities.dp(22) - (AndroidUtilities.getCurrentActionBarHeight() - AndroidUtilities.dp(42)) / 2) * (1.0f - diff)); + int avatarY = AndroidUtilities.dp(22) - (int)((AndroidUtilities.dp(22) - (ActionBar.getCurrentActionBarHeight() - AndroidUtilities.dp(42)) / 2) * (1.0f - diff)); int nameX = 97 + (int)(21 * diffm); int nameEndX = 16 + (int)(32 * diffm); int nameY = avatarY + AndroidUtilities.dp(29 - 10 * diffm); @@ -834,7 +832,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. if (writeButton != null) { layoutParams = (FrameLayout.LayoutParams) writeButton.getLayoutParams(); - layoutParams.topMargin = (actionBar.getOccupyStatusBar() ? AndroidUtilities.statusBarHeight : 0) + AndroidUtilities.getCurrentActionBarHeight() + actionBar.getExtraHeight() - AndroidUtilities.dp(29.5f); + layoutParams.topMargin = (actionBar.getOccupyStatusBar() ? AndroidUtilities.statusBarHeight : 0) + ActionBar.getCurrentActionBarHeight() + actionBar.getExtraHeight() - AndroidUtilities.dp(29.5f); writeButton.setLayoutParams(layoutParams); /*ViewProxy.setAlpha(writeButton, diff); writeButton.setVisibility(diff <= 0.02 ? View.GONE : View.VISIBLE); @@ -1262,7 +1260,6 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. emptyRowChat2 = rowCount++; rowCount += info.participants.size(); membersEndRow = rowCount; - int maxCount = chat_id > 0 ? MessagesController.getInstance().maxGroupCount : MessagesController.getInstance().maxBroadcastCount; addMemberRow = rowCount++; } else { membersEndRow = -1; @@ -1330,7 +1327,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. photoBig = chat.photo.photo_big; } //Profile avatar - int radius = themePrefs.getInt("profileAvatarRadius", 32); + int radius = AndroidUtilities.dp(themePrefs.getInt("profileAvatarRadius", 32)); //int radius = AndroidUtilities.dp(32); AvatarDrawable avatarDrawable = new AvatarDrawable(chat, true); avatarImage.getImageReceiver().setRoundRadius(radius); @@ -1406,7 +1403,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } @Override - public void didSelectDialog(MessagesActivity messageFragment, long dialog_id, boolean param) { + public void didSelectDialog(DialogsActivity messageFragment, long dialog_id, boolean param) { if (dialog_id != 0) { Bundle args = new Bundle(); args.putBoolean("scrollToTopOnResume", true); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ProfileNotificationsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ProfileNotificationsActivity.java index 6a6f0b7d..dc1cd8bf 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ProfileNotificationsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ProfileNotificationsActivity.java @@ -22,7 +22,6 @@ import android.os.Bundle; import android.provider.Settings; import android.util.TypedValue; import android.view.Gravity; -import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; @@ -32,21 +31,21 @@ import android.widget.ListView; import android.widget.TextView; import org.telegram.android.AndroidUtilities; -import org.telegram.android.LocaleController; import org.telegram.android.MessagesController; import org.telegram.android.MessagesStorage; -import org.telegram.android.NotificationCenter; import org.telegram.android.NotificationsController; import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.ConnectionsManager; import org.telegram.messenger.FileLog; +import org.telegram.android.LocaleController; +import org.telegram.android.NotificationCenter; import org.telegram.messenger.R; import org.telegram.messenger.TLRPC; -import org.telegram.ui.ActionBar.ActionBar; -import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.Adapters.BaseFragmentAdapter; import org.telegram.ui.Cells.TextColorCell; import org.telegram.ui.Cells.TextDetailSettingsCell; +import org.telegram.ui.ActionBar.ActionBar; +import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.Components.AvatarDrawable; import org.telegram.ui.Components.ColorPickerView; import org.telegram.ui.Components.LayoutHelper; @@ -98,7 +97,7 @@ public class ProfileNotificationsActivity extends BaseFragment implements Notifi } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); actionBar.setTitle(LocaleController.getString("NotificationsAndSounds", R.string.NotificationsAndSounds)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/SessionsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/SessionsActivity.java index a205a3b8..643446ee 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/SessionsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/SessionsActivity.java @@ -18,7 +18,6 @@ import android.graphics.drawable.Drawable; import android.os.Build; import android.util.TypedValue; import android.view.Gravity; -import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; @@ -90,7 +89,7 @@ public class SessionsActivity extends BaseFragment implements NotificationCenter } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); actionBar.setTitle(LocaleController.getString("SessionsTitle", R.string.SessionsTitle)); @@ -112,11 +111,10 @@ public class SessionsActivity extends BaseFragment implements NotificationCenter int bgColor = preferences.getInt("prefBGColor", 0xffffffff); int summaryColor = preferences.getInt("prefSummaryColor", 0xff8a8a8a); emptyLayout = new LinearLayout(context); - emptyLayout.setOrientation(LinearLayout.VERTICAL); emptyLayout.setGravity(Gravity.CENTER); emptyLayout.setBackgroundResource(R.drawable.greydivider_bottom); - emptyLayout.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, AndroidUtilities.displaySize.y - AndroidUtilities.getCurrentActionBarHeight())); + emptyLayout.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, AndroidUtilities.displaySize.y - ActionBar.getCurrentActionBarHeight())); if(bgColor != 0xffffffff)emptyLayout.setBackgroundColor(bgColor); ImageView imageView = new ImageView(context); imageView.setImageResource(R.drawable.devices); @@ -131,7 +129,6 @@ public class SessionsActivity extends BaseFragment implements NotificationCenter layoutParams2.height = LayoutHelper.WRAP_CONTENT; imageView.setLayoutParams(layoutParams2); - TextView textView = new TextView(context); //textView.setTextColor(0xff8a8a8a); textView.setTextColor(summaryColor); @@ -461,7 +458,7 @@ public class SessionsActivity extends BaseFragment implements NotificationCenter } else if (type == 3) { ViewGroup.LayoutParams layoutParams = emptyLayout.getLayoutParams(); if (layoutParams != null) { - layoutParams.height = Math.max(AndroidUtilities.dp(220), AndroidUtilities.displaySize.y - AndroidUtilities.getCurrentActionBarHeight() - AndroidUtilities.dp(128) - (Build.VERSION.SDK_INT >= 21 ? AndroidUtilities.statusBarHeight : 0)); + layoutParams.height = Math.max(AndroidUtilities.dp(220), AndroidUtilities.displaySize.y - ActionBar.getCurrentActionBarHeight() - AndroidUtilities.dp(128) - (Build.VERSION.SDK_INT >= 21 ? AndroidUtilities.statusBarHeight : 0)); emptyLayout.setLayoutParams(layoutParams); } return emptyLayout; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java index a6464c4d..0f9f5c6c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java @@ -35,7 +35,6 @@ import android.text.method.LinkMovementMethod; import android.util.Base64; import android.util.TypedValue; import android.view.Gravity; -import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; @@ -128,7 +127,7 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter private int wifiDownloadRow; private int roamingDownloadRow; private int saveToGalleryRow; - private int messagesSectionRow; + //private int messagesSectionRow; private int messagesSectionRow2; private int textSizeRow; private int stickersRow; @@ -258,9 +257,7 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter saveToGalleryRow = rowCount++; keepOriginalFilenameRow = rowCount++; keepOriginalFilenameDetailRow = rowCount++; - messagesSectionRow = rowCount++; - - + //messagesSectionRow = rowCount++; messagesSectionRow2 = rowCount++; textSizeRow = rowCount++; @@ -305,7 +302,7 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { actionBar.setBackgroundColor(AvatarDrawable.getProfileBackColorForId(5)); actionBar.setItemsBackground(AvatarDrawable.getButtonColorForId(5)); actionBar.setBackButtonImage(R.drawable.ic_ab_back); @@ -412,7 +409,7 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter onlineTextView = new TextView(context); //onlineTextView.setTextColor(AvatarDrawable.getProfileTextColorForId(5)); - onlineTextView.setTextColor(AndroidUtilities.getIntDarkerColor("themeColor", -0x40)); + onlineTextView.setTextColor(preferences.getInt("prefHeaderStatusColor", AndroidUtilities.getIntDarkerColor("themeColor", -0x40))); onlineTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); onlineTextView.setLines(1); onlineTextView.setMaxLines(1); @@ -1043,7 +1040,7 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter FrameLayout.LayoutParams layoutParams; if (listView != null) { layoutParams = (FrameLayout.LayoutParams) listView.getLayoutParams(); - layoutParams.topMargin = (actionBar.getOccupyStatusBar() ? AndroidUtilities.statusBarHeight : 0) + AndroidUtilities.getCurrentActionBarHeight(); + layoutParams.topMargin = (actionBar.getOccupyStatusBar() ? AndroidUtilities.statusBarHeight : 0) + ActionBar.getCurrentActionBarHeight(); listView.setLayoutParams(layoutParams); } @@ -1053,7 +1050,7 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter int avatarSize = 42 + (int) (18 * diff); int avatarX = 17 + (int) (47 * diffm); - int avatarY = AndroidUtilities.dp(22) - (int) ((AndroidUtilities.dp(22) - (AndroidUtilities.getCurrentActionBarHeight() - AndroidUtilities.dp(42)) / 2) * (1.0f - diff)); + int avatarY = AndroidUtilities.dp(22) - (int) ((AndroidUtilities.dp(22) - (ActionBar.getCurrentActionBarHeight() - AndroidUtilities.dp(42)) / 2) * (1.0f - diff)); int nameX = 97 + (int) (21 * diffm); int nameEndX = 16 + (int) (32 * diffm); int nameY = avatarY + AndroidUtilities.dp(29 - 13 * diffm); @@ -1061,7 +1058,7 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter float scale = 1.0f - 0.12f * diffm; layoutParams = (FrameLayout.LayoutParams) writeButton.getLayoutParams(); - layoutParams.topMargin = (actionBar.getOccupyStatusBar() ? AndroidUtilities.statusBarHeight : 0) + AndroidUtilities.getCurrentActionBarHeight() + actionBar.getExtraHeight() - AndroidUtilities.dp(29.5f); + layoutParams.topMargin = (actionBar.getOccupyStatusBar() ? AndroidUtilities.statusBarHeight : 0) + ActionBar.getCurrentActionBarHeight() + actionBar.getExtraHeight() - AndroidUtilities.dp(29.5f); writeButton.setLayoutParams(layoutParams); //ViewProxy.setScaleX(writeButton, diff > 0.2f ? 1.0f : diff / 0.2f); @@ -1110,8 +1107,11 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter }); writeButtonAnimation.start(); } - - avatarImage.setRoundRadius(AndroidUtilities.dp(avatarSize / 2)); + int aSize = AndroidUtilities.getIntDef("prefAvatarSize", 64);//Plus + avatarSize = aSize > 46 ? (aSize - 20) + (int) (18 * diff) : aSize;//Plus + //avatarImage.setRoundRadius(AndroidUtilities.dp(avatarSize / 2)); + int radius = AndroidUtilities.getIntDef("prefAvatarRadius", 32); + avatarImage.setRoundRadius(AndroidUtilities.dp(radius)); layoutParams = (FrameLayout.LayoutParams) avatarImage.getLayoutParams(); layoutParams.width = AndroidUtilities.dp(avatarSize); layoutParams.height = AndroidUtilities.dp(avatarSize); @@ -1164,15 +1164,16 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter } AvatarDrawable avatarDrawable = new AvatarDrawable(user, true); //avatarDrawable.setColor(0xff5c98cd); - avatarDrawable.setColor(AndroidUtilities.getIntDarkerColor("themeColor",0x10)); - int radius = AndroidUtilities.dp(AndroidUtilities.getIntDef("drawerAvatarRadius", 32)); + avatarDrawable.setColor(AndroidUtilities.getIntDef("prefAvatarColor", AndroidUtilities.getIntDarkerColor("themeColor", 0x10))); + int radius = AndroidUtilities.dp(AndroidUtilities.getIntDef("prefAvatarRadius", 32)); + avatarImage.getImageReceiver().setRoundRadius(radius); avatarDrawable.setRadius(radius); if (avatarImage != null) { - avatarImage.setImage(photo, "50_50", avatarDrawable); + avatarImage.setImage(photo, "50_50", avatarDrawable); avatarImage.getImageReceiver().setVisible(!PhotoViewer.getInstance().isShowingImage(photoBig), false); nameTextView.setText(UserObject.getUserName(user)); - onlineTextView.setText(LocaleController.getString("Online", R.string.Online)); + onlineTextView.setText(LocaleController.getString("Online", R.string.Online)); avatarImage.getImageReceiver().setVisible(!PhotoViewer.getInstance().isShowingImage(photoBig), false); } @@ -1447,7 +1448,7 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter if (i == emptyRow || i == overscrollRow) { return 0; } - if (i == settingsSectionRow || i == supportSectionRow || i == messagesSectionRow || i == mediaDownloadSection || i == contactsSectionRow) { + if (i == settingsSectionRow || i == supportSectionRow /*|| i == messagesSectionRow*/ || i == mediaDownloadSection || i == contactsSectionRow) { return 1; } else if (i == enableAnimationsRow || i == sendByEnterRow || i == saveToGalleryRow || i == disableMessageClickRow || i == showAndroidEmojiRow || i == useDeviceFontRow || i == keepOriginalFilenameRow ) { return 3; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ThemingActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ThemingActivity.java index 5172d67f..87297541 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ThemingActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ThemingActivity.java @@ -117,7 +117,7 @@ public class ThemingActivity extends BaseFragment { } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { if (fragmentView == null) { actionBar.setItemsBackground(AvatarDrawable.getButtonColorForId(5)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ThemingChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ThemingChatActivity.java index 749ec990..17080859 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ThemingChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ThemingChatActivity.java @@ -92,6 +92,7 @@ public class ThemingChatActivity extends BaseFragment { private int avatarSizeRow; private int avatarAlignTopRow; private int avatarMarginLeftRow; + private int contactNameColorRow; private int rowCount; @@ -142,6 +143,7 @@ public class ThemingChatActivity extends BaseFragment { memberColorCheckRow = rowCount++; memberColorRow = rowCount++; + contactNameColorRow = rowCount++; forwardRightNameColorRow = rowCount++; forwardLeftNameColorRow = rowCount++; @@ -164,7 +166,7 @@ public class ThemingChatActivity extends BaseFragment { } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { if (fragmentView == null) { actionBar.setItemsBackground(AvatarDrawable.getButtonColorForId(5)); @@ -294,6 +296,20 @@ public class ThemingChatActivity extends BaseFragment { },themePrefs.getInt("chatMemberColor", darkColor), CENTER, 0, true); colorDialog.show(); + } else if (i == contactNameColorRow) { + if (getParentActivity() == null) { + return; + } + LayoutInflater li = (LayoutInflater)getParentActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); + li.inflate(R.layout.colordialog, null, false); + ColorSelectorDialog colorDialog = new ColorSelectorDialog(getParentActivity(), new OnColorChangedListener() { + @Override + public void colorChanged(int color) { + commitInt("chatContactNameColor", color); + } + + },themePrefs.getInt("chatContactNameColor", defColor), CENTER, 0, true); + colorDialog.show(); } else if (i == forwardRightNameColorRow) { if (getParentActivity() == null) { return; @@ -877,6 +893,8 @@ public class ThemingChatActivity extends BaseFragment { ApplicationLoader.reloadWallpaper(); } else if (i == memberColorRow) { resetPref("chatMemberColor"); + } else if (i == contactNameColorRow) { + resetPref("chatContactNameColor"); } else if (i == rTextColorRow) { resetPref("chatRTextColor"); } else if (i == lTextColorRow) { @@ -1029,7 +1047,7 @@ public class ThemingChatActivity extends BaseFragment { return i == headerColorRow || i == muteColorRow || i == headerIconsColorRow || i == rBubbleColorRow || i == lBubbleColorRow || i == bubblesRow || i == solidBGColorCheckRow || AndroidUtilities.getBoolPref("chatSolidBGColorCheck") && i == solidBGColorRow || i == avatarRadiusRow || i == avatarSizeRow || i == avatarMarginLeftRow || i == avatarAlignTopRow || i == nameColorRow || i == nameSizeRow || i == statusColorRow || i == statusSizeRow || i == textSizeRow || i == timeSizeRow || i == dateColorRow || i == dateSizeRow || i == dateBubbleColorRow || i == rTextColorRow || i == rLinkColorRow || i == lTextColorRow || i == lLinkColorRow || - i == rTimeColorRow|| i == lTimeColorRow || i == checksColorRow || i == memberColorCheckRow || AndroidUtilities.getBoolPref("chatMemberColorCheck") && i == memberColorRow || i == forwardRightNameColorRow || i == forwardLeftNameColorRow || + i == rTimeColorRow|| i == lTimeColorRow || i == checksColorRow || i == memberColorCheckRow || AndroidUtilities.getBoolPref("chatMemberColorCheck") && i == memberColorRow || i == contactNameColorRow || i == forwardRightNameColorRow || i == forwardLeftNameColorRow || i == editTextSizeRow || i == editTextColorRow || i == editTextIconsColorRow || i == sendColorRow || i == editTextBGColorRow || i == emojiViewBGColorRow || i == emojiViewTabColorRow; } @@ -1147,6 +1165,8 @@ public class ThemingChatActivity extends BaseFragment { textCell.setTextAndColor(LocaleController.getString("SolidBGColor", R.string.SolidBGColor), themePrefs.getBoolean("chatSolidBGColorCheck", false) ? themePrefs.getInt("chatSolidBGColor", 0xffffffff) : 0x00000000, true); } else if (i == memberColorRow) { textCell.setTextAndColor(LocaleController.getString("MemberColor", R.string.MemberColor), themePrefs.getBoolean("chatMemberColorCheck", false) ? themePrefs.getInt("chatMemberColor", darkColor) : 0x00000000, true); + } else if (i == contactNameColorRow) { + textCell.setTextAndColor(LocaleController.getString("SharedContactNameColor", R.string.SharedContactNameColor), themePrefs.getInt("chatContactNameColor", defColor) , true); } else if (i == forwardRightNameColorRow) { textCell.setTag("chatForwardRColor"); textCell.setTextAndColor(LocaleController.getString("ForwardRightNameColor", R.string.ForwardRightNameColor), themePrefs.getInt("chatForwardRColor", darkColor), true); @@ -1218,7 +1238,7 @@ public class ThemingChatActivity extends BaseFragment { else if ( i == headerColorRow || i == muteColorRow || i == headerIconsColorRow || i == solidBGColorRow || i == rBubbleColorRow || i == lBubbleColorRow || i == nameColorRow || i == statusColorRow || i == dateColorRow || i == dateBubbleColorRow || - i == rTextColorRow || i == rLinkColorRow || i == lTextColorRow || i == lLinkColorRow || i == rLinkColorRow || i == rTimeColorRow || i == lTimeColorRow || i == checksColorRow || i == memberColorRow || i == forwardRightNameColorRow || i == forwardLeftNameColorRow || + i == rTextColorRow || i == rLinkColorRow || i == lTextColorRow || i == lLinkColorRow || i == rLinkColorRow || i == rTimeColorRow || i == lTimeColorRow || i == checksColorRow || i == memberColorRow || i == contactNameColorRow || i == forwardRightNameColorRow || i == forwardLeftNameColorRow || i == sendColorRow || i == editTextColorRow || i == editTextBGColorRow || i == editTextIconsColorRow || i == emojiViewBGColorRow || i == emojiViewTabColorRow) { return 3; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ThemingChatsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ThemingChatsActivity.java index 32395a63..64f5769e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ThemingChatsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ThemingChatsActivity.java @@ -145,7 +145,7 @@ public class ThemingChatsActivity extends BaseFragment { } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { if (fragmentView == null) { actionBar.setItemsBackground(AvatarDrawable.getButtonColorForId(5)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ThemingContactsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ThemingContactsActivity.java index 108bb9cf..c7ee8f9d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ThemingContactsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ThemingContactsActivity.java @@ -97,7 +97,7 @@ public class ThemingContactsActivity extends BaseFragment { } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { if (fragmentView == null) { actionBar.setItemsBackground(AvatarDrawable.getButtonColorForId(5)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ThemingDrawerActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ThemingDrawerActivity.java index e6729824..9542b5d7 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ThemingDrawerActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ThemingDrawerActivity.java @@ -26,6 +26,8 @@ import android.widget.ListView; import org.telegram.android.AndroidUtilities; import org.telegram.android.LocaleController; +import org.telegram.android.MediaController; +import org.telegram.android.NotificationCenter; import org.telegram.messenger.ApplicationLoader; import org.telegram.messenger.R; import org.telegram.ui.ActionBar.ActionBar; @@ -71,6 +73,9 @@ public class ThemingDrawerActivity extends BaseFragment { public final static int CENTER = 0; + private boolean player = false; + private boolean drawer = false; + @Override public boolean onFragmentCreate() { super.onFragmentCreate(); @@ -103,11 +108,16 @@ public class ThemingDrawerActivity extends BaseFragment { @Override public void onFragmentDestroy() { super.onFragmentDestroy(); - + if(player){ + if(MediaController.getInstance().getPlayingMessageObject() != null)NotificationCenter.getInstance().postNotificationName(NotificationCenter.audioPlayStateChanged, MediaController.getInstance().getPlayingMessageObject().getId()); + } + if(drawer){ + NotificationCenter.getInstance().postNotificationName(NotificationCenter.mainUserInfoChanged); + } } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { if (fragmentView == null) { actionBar.setItemsBackground(AvatarDrawable.getButtonColorForId(5)); @@ -200,6 +210,7 @@ public class ThemingDrawerActivity extends BaseFragment { @Override public void colorChanged(int color) { commitInt("drawerListColor", color); + player = true; } },themePrefs.getInt("drawerListColor", 0xffffffff), CENTER, 0, false); @@ -214,6 +225,7 @@ public class ThemingDrawerActivity extends BaseFragment { @Override public void colorChanged(int color) { commitInt("drawerIconColor", color); + player = true; } @@ -229,6 +241,7 @@ public class ThemingDrawerActivity extends BaseFragment { @Override public void colorChanged(int color) { commitInt("drawerOptionColor", color); + player = true; } },themePrefs.getInt("drawerOptionColor", 0xff444444), CENTER, 0, false); @@ -417,6 +430,7 @@ public class ThemingDrawerActivity extends BaseFragment { }); showDialog(builder.create()); } + drawer = true; } }); @@ -430,6 +444,7 @@ public class ThemingDrawerActivity extends BaseFragment { resetInt("drawerHeaderColor"); } else if (i == listColorRow) { resetInt("drawerListColor"); + player = true; } else if (i == avatarColorRow) { resetInt("drawerAvatarColor"); } else if (i == avatarRadiusRow) { @@ -446,8 +461,10 @@ public class ThemingDrawerActivity extends BaseFragment { resetInt("drawerPhoneSize"); } else if (i == iconColorRow) { resetInt("drawerIconColor"); + player = true; } else if (i == optionColorRow) { resetInt("drawerOptionColor"); + player = true; } else if (i == optionSizeRow) { resetInt("drawerOptionSize"); } else if (i == versionColorRow) { @@ -459,6 +476,8 @@ public class ThemingDrawerActivity extends BaseFragment { resetPref(view.getTag().toString()); } } + drawer = true; + return true; } }); @@ -546,6 +565,9 @@ public class ThemingDrawerActivity extends BaseFragment { }); listView.setAdapter(listAdapter); //actionBar.setBackgroundColor(AndroidUtilities.getIntColor("themeColor")); + if(drawer){ + + } } private class ListAdapter extends BaseFragmentAdapter { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ThemingProfileActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ThemingProfileActivity.java index cc25b8bb..d80fa0e7 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ThemingProfileActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ThemingProfileActivity.java @@ -99,7 +99,7 @@ public class ThemingProfileActivity extends BaseFragment { } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { if (fragmentView == null) { actionBar.setItemsBackground(AvatarDrawable.getButtonColorForId(5)); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/TwoStepVerificationActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/TwoStepVerificationActivity.java index a2e1cc48..c7f4fdd1 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/TwoStepVerificationActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/TwoStepVerificationActivity.java @@ -23,7 +23,6 @@ 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.MotionEvent; @@ -146,7 +145,7 @@ public class TwoStepVerificationActivity extends BaseFragment implements Notific } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(false); actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/VideoEditorActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/VideoEditorActivity.java index 0cfdc833..5d27d6a9 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/VideoEditorActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/VideoEditorActivity.java @@ -19,7 +19,6 @@ import android.media.MediaPlayer; import android.os.Build; import android.os.Bundle; import android.view.Gravity; -import android.view.LayoutInflater; import android.view.Surface; import android.view.TextureView; import android.view.View; @@ -229,7 +228,7 @@ public class VideoEditorActivity extends BaseFragment implements TextureView.Sur } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { actionBar.setBackgroundColor(0xff333333); actionBar.setItemsBackground(R.drawable.bar_selector_white); actionBar.setBackButtonImage(R.drawable.ic_ab_back); @@ -266,7 +265,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, null, false); + fragmentView = getParentActivity().getLayoutInflater().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); @@ -583,7 +582,7 @@ public class VideoEditorActivity extends BaseFragment implements TextureView.Sur if (AndroidUtilities.isTablet()) { viewHeight = AndroidUtilities.dp(472); } else { - viewHeight = AndroidUtilities.displaySize.y - AndroidUtilities.statusBarHeight - AndroidUtilities.getCurrentActionBarHeight(); + viewHeight = AndroidUtilities.displaySize.y - AndroidUtilities.statusBarHeight - ActionBar.getCurrentActionBarHeight(); } int width; @@ -781,7 +780,6 @@ public class VideoEditorActivity extends BaseFragment implements TextureView.Sur } videoDuration = (float)mediaHeaderBox.getDuration() / (float)mediaHeaderBox.getTimescale(); trackBitrate = (int)(sampleSizes * 8 / videoDuration); - } catch (Exception e) { FileLog.e("tmessages", e); } @@ -812,13 +810,14 @@ public class VideoEditorActivity extends BaseFragment implements TextureView.Sur } resultWidth = originalWidth = (int)trackHeaderBox.getWidth(); resultHeight = originalHeight = (int)trackHeaderBox.getHeight(); + if (resultWidth > 640 || resultHeight > 640) { float scale = resultWidth > resultHeight ? 640.0f / resultWidth : 640.0f / resultHeight; resultWidth *= scale; resultHeight *= scale; if (bitrate != 0) { bitrate *= Math.max(0.5f, scale); - videoFramesSize = (long) (bitrate / 8 * videoDuration); + videoFramesSize = (long)(bitrate / 8 * videoDuration); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/WallpapersActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/WallpapersActivity.java index 8718183b..d7b2f506 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/WallpapersActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/WallpapersActivity.java @@ -23,7 +23,6 @@ import android.os.Build; import android.os.Bundle; import android.provider.MediaStore; import android.view.Gravity; -import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; @@ -34,22 +33,23 @@ import android.widget.ProgressBar; import org.telegram.android.AndroidUtilities; import org.telegram.android.ImageLoader; import org.telegram.android.LocaleController; -import org.telegram.android.MessagesStorage; -import org.telegram.android.NotificationCenter; import org.telegram.android.support.widget.LinearLayoutManager; import org.telegram.android.support.widget.RecyclerView; import org.telegram.messenger.ApplicationLoader; +import org.telegram.messenger.TLObject; +import org.telegram.messenger.TLRPC; import org.telegram.messenger.ConnectionsManager; import org.telegram.messenger.FileLoader; import org.telegram.messenger.FileLog; +import org.telegram.android.MessagesStorage; +import org.telegram.android.NotificationCenter; import org.telegram.messenger.R; import org.telegram.messenger.RPCRequest; -import org.telegram.messenger.TLObject; -import org.telegram.messenger.TLRPC; + import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.ActionBarMenu; -import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.Cells.WallpaperCell; +import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.RecyclerListView; @@ -103,7 +103,7 @@ public class WallpapersActivity extends BaseFragment implements NotificationCent } @Override - public View createView(Context context, LayoutInflater inflater) { + public View createView(Context context) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); actionBar.setTitle(LocaleController.getString("ChatBackground", R.string.ChatBackground)); diff --git a/TMessagesProj/src/main/res/drawable-hdpi/Thumbs.db b/TMessagesProj/src/main/res/drawable-hdpi/Thumbs.db index d2eb28c12b633373ba794946090e2e3bcf1871f2..414c179f528fd309713c9a2c146af88e01d992cc 100644 GIT binary patch delta 72000 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 z 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 delta 5446 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 UTbp#d^O5naIWx#38~mmJ0|1-WoB#j- diff --git a/TMessagesProj/src/main/res/drawable-hdpi/ic_attach_gallery.png b/TMessagesProj/src/main/res/drawable-hdpi/ic_attach_gallery.png deleted file mode 100644 index 1c60351cba0a88777282645de89328a6df77fbb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1248 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?+{oC;*u~M@%)-Uk(9qSy!qmjV$F! zNq_$Tw?CY~)U%jRN{mlSQ!|kzXrIFx{v&5Xwtbcth-Y|o*5S|o<;&S!C$Y9CUt=s} z=w(i37GQ6bY1KK=;<`{@R^~9n*2CB`sq{k}biX+hA z(hCKp0agO>(mH&zxQ=XYun_6kfAO$mcf$`;zMaAjF)XRgP8zeX@mcX4IeDS%jK0av z>lXqX#o`%`aA!VU@Z3R$E$881#z)E*N|>1I8!ebR<|ka7?&?*gbj`7TL0=`KFvBLt zeeGNAvl}Yp`S#xT@bo`owSq@V>%{_@4(`SslN;(5T^2Uvi{dTuu{YyfV6oz$9pm2E z9%g~5^EfPDSP7^HZuC%?F)xBcVgcuo`Hi*{8Fg3wzqoPP5AU94y$cr|pLZ5sNXt;~ zyOzK!kgvK_`z`ZZbHmFDv(7ooHeZ}7C;L~TRA4EC!U2ZJ>|BpxuUYp%Wsaw-pUXO@ GgeCy+_n_1O diff --git a/TMessagesProj/src/main/res/drawable-hdpi/ic_attach_location.png b/TMessagesProj/src/main/res/drawable-hdpi/ic_attach_location.png deleted file mode 100644 index 52bf605163d220aed9116340bfe955ed90dcc9fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1490 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?!r08w+0ekq%)-Uk(9qSy(#hP})zr<&)XmM& z&C$>Trq?AuximL5uLPzy1)4hbZ=6+Cv!6w_#HElf1n^*K5H*|KH)QY$ik#qMBkKC}D%zUupDSkATDr&m1RW4yom-tPGI zdh^fE|1m!*mUo4W!^et0HqZFF7D&I?R8s3Ce<9msvWH6D6j6=|49^s$+{9xK*)Kk> z!FeP8eq%%CfisKr`sc>E)H>9D=jE7DJVUkQ^oOez+Ez><=X4Dg%rwYkRF2~4{Slc#d9t16mzxa%H1q&%@=8ich^6a?Rm7;QF=jDYkv5{ z+s0>Ja(xMXxO>%y*x(-(X!z?Gwxn-nZyZr4Di?@&Ld-E2ViA&6liE@~H;`6>` zF2a_})--B-G(WS0-yzv5THx;0f0Cyn5Bw3Sz07%qX_EILZtexok9zmWiweEvv@&S; z*)i`GTQ>8_=kmr3T`%+Ed;Mh3cxN8{_9(-fx%jsCzXr#C_B+>?9Wo)7N6P3{7d}+L&L<&E57?(JO(OdJzf1=);T3K F0RVxFE1m!V diff --git a/TMessagesProj/src/main/res/drawable-hdpi/ic_attach_music.png b/TMessagesProj/src/main/res/drawable-hdpi/ic_attach_music.png deleted file mode 100644 index 5a8f5cf4e2e899767663da154a0f8a4512462073..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1206 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?!qwQ)&D6lqz`)$h(9qS?$w_6Nw>eUB2MjsThND&Pa0;V1i6P|2=9C*S{%>$Eakt zaVzQ1|Nr)f6PSE>nt6Dv*f$C+Ua@3Ji>yZ}W1)-ycfiSa{tkN>I=ri^s_G^_QCN}u zX@!hLjYrzE$x^9>COu0niY`rH;FVQzD3VfQHhCnle!15oHD;55qmBpeu;{BcYR)gb zkXCKf$SlII#eQ}2s?05~Bqs7%u^cgT;92$lh{McMg<{DQhUXmqu%D{uJ+hZs(kaxV zPf{eXEN#P5MLU}!A?Ak*B4i%zagebP;LBo6D%a_Y diff --git a/TMessagesProj/src/main/res/drawable-hdpi/ic_attach_photo.png b/TMessagesProj/src/main/res/drawable-hdpi/ic_attach_photo.png deleted file mode 100644 index b2b0caaa531326f1d95350eba50670a02289d9b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1442 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?!r8^y*ucWV%)-Uk(9qSy(Z$@^(ap`p%+lG= z$;`kRrq?AuximL5uLPzy1)4yySlYfd_)c>y;aK9U@|fjNlyrQ@H_c| z$d(sUMkc4?dKmZ%Jp88n3$QctM6dgCAxP{}gW=(^x$xFj~%v%zJRBg@`Q@X;XBOVuNsXA*MzN)^uWB#L8{6;NBTV;w< zI6k`fz1DhkIi@zCZG!a4oTb0yeq8MM%k=w>)5}SUPnL+znEUBQW&vwW_=HHd^Cj(rzAaU+Cnw*_Vb$~{H_mW3L?%ssEvYtH;BLm( zoOQ|%*n%9RzFaX2*Z+VT;f+f&-4wntdOov z-P-bqSD-7CH?qOH!kXuWq}t}Ie>N}Fydq-s>6d5%L)EV7KYqQr`5jbhdb;|#taD0e F0sz*z4ub#y diff --git a/TMessagesProj/src/main/res/drawable-hdpi/ic_attach_video.png b/TMessagesProj/src/main/res/drawable-hdpi/ic_attach_video.png deleted file mode 100644 index 1933735218a6e9324e319ffd67addc595f4e2575..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1045 zcmaJ=&rj1(9B+bV$jl?xKo#9s#lW8xXah(-^_;MJ4yb!@|fvuXR@_vQ2Xe1E=$k>N}2t(~m| zL9{0ar4(Mfz0cQz|9iypGG01RJcGty4wV!e5K#?g0hu(EJV*gWD^G2Leu8MC^mGPg zJD%G>T9-(t{KXt1fFg)iU9NF|J}U z9L;(u)qt}6f2d*9(GE(1!+8HG?4-*UU{b(=)3%Bmm+SIeSz^ov3W9bT!pT|{M+y)@ zrvNQ7HYSi~#&uJJCFg7fFUw-mbdX}IASp#CtU&9!CWZwz-Wv#VLZ1}ixOgxcV1rU0 z$0uTZG!}@nHLe8JX#<$3#?=nFd_%4`3WkL}OTgBz11(`ggRG=1>J4KFBpT{fxmx2` z*oIsN2g7)c{j1TnBRoCcwm!Dls1H6c@wD4`tWSJ;^%`G^g`^ZsyW2mOxuY*gUwn1% z&Hnq{b33#=)OCC-`)=-Dl=GDr*H@RWd>&l9F`v8hc=Yn!{I%l!(GT-WI~#KIuC;dZ zv>9zH{kF92U(Z};)4kPn`&-06JJs^!>(+x~-|Y*tA02I_ZRsVSX?Z)*(Q^}EL%wP( k%x?5{f0^?&H?JQ#MRYzIT`MyCE8ay-#)qYc7boWb02whnA_7PX zO)C_KnxHb2hYHXMR1DK^!V-c$-UoF-%`ZGkZqGr#pkpUMfayl_5vr4f0@TLphqBOl zRe%7Z& z|Ekl)O$#rHmVHJX4Cl2AG2a`1ge%8qy`oz2Tke+xuO~UUuY;y6E%MA&&HPiCM=N_X zr0%CIs1GkXq5R5s{@-Z0JSRfdxQjbO`B3ZRv>Yh4ckDi>7Ug)kqYm3bGcVg%G)72}Cu zegv)Jpc0m#vRt4?nLbLk-y}yOCFu=NxCMsVGs3&S>;!oL7D_&~=nP-~S)_?|>cz7y#P! VxnE#JB>n&Z002ovPDHLkV1jlWF#7-i diff --git a/TMessagesProj/src/main/res/drawable-hdpi/player1_pressed.png b/TMessagesProj/src/main/res/drawable-hdpi/player1_pressed.png deleted file mode 100644 index f5698eb118e03763c232b830be19d3a847dd8495..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1210 zcmV;r1V#IaP)Nh!Q4v(cKb4Bb4-x!O@S_z( zs-R#M7c5m#5$l2lam9ryYOGb8WoDk|#YuXTChbcz!3T$A-n^MPbKkw^-aC9zLpl4O z<4X18xMODq_bLG<10G;J5Cq-;9Y8Datv@$Smyk5)LZA{D(Z|}Cz*XQ9@WpOI(h@s> z(lp4AwXg}O2hN#Af%kS0+5)WWG0T~sanXj~u+YQ@&X|jtd>9kVhhItDOIEK1sS#beDBkyoC)CzKLg2U{Ezb*4>(pa!N*uY&4;pgM#(UX%qS5XewwyI== zDq*;_g=#UzNyoxL1Hg zMb9we%cRxR%qu>VqfwNQFJ?;4x|D8aBq0-hj=|?D8ks)JM+up6ndm=`D50O-R%E$K zSH|b2c!za}7RBf1k^g>5=q>Sq;fjje2=*;Wgzq90{;FE+^P%ME9S!?dvS^%g8Ym2I zg99&t&&>Q6_7K!OwM5K=jzZK;h1Ov^iv4y<=#!iTWW`s=yPU<)i4RIInICFG-P4q= zuYk}La@d+oshi2-`Pr3e1dgs%l9`*y2%RG#J%)S$5hl0Z{flu4_xl)RErmp+h9vO0^Epa(jy*?&O`W8oX#h)OTT>rrrp>0P4ur zEkP8`vx^MU&4z?1KB!VtHvpH3iL13Ap6ZOYPuFs_AMS0WC6c2SoyT3(HfSF(1ej)7 zY96w9iSQZ?s&dfnz^gtv>6~WGU0S>Dl#gq^Z}sF>eDpK7bfx$pU6UPgd&5rL;z=`usU$AIMPCk zh;vK#j0i!Xr{rix7+eQn_YMUgf(bDxT*^q1A_ctJ&8LG>R9@RpIXB8sS#A_{_dA>vDUb;s0|XF1h9Fc1 zH9&7r0!l$w(5rP10YdzF57YrQ{_v>ClsI$@omv3`Oecl`sG9M(1GPx?Lfg=7QGfs< z0)GhV_PDxD(1e7F839R{F&QhS**qe>yK9p6!$pAkZhbQT^nu`=E(~23N=*o=)dB*H zSjv8j#duKHLn46v77KD46wm?c`GsAgo0Vl)E>U%B*wbFpBt26YmFFEfv`Wns)$kH4 z?E`F>7|l^STNXYoMKknB5v0NbUHb#DK^HEYS4IXLlvznfAg~gJH-J?Fmq%P4v!WH)d=?ZWhPL96ED{qm1LeS zXbSNZ%BH;^UJKF&^X(_8+`gsIsROlWN_K%Z?Eu=zZ(&uH`p_~=M%5dsfJE#0U=b*$ zidCQDBp|+E$5IIpnYE|g4*@Ff*4=rqcPN@IonAUdK#?#~!6OPTW2szYaMj*DHJ?<{WYKu0R{l0x0VEb%Uj6+0000< KMNUMnLSTZPxFB5s diff --git a/TMessagesProj/src/main/res/drawable-hdpi/player2_pressed.png b/TMessagesProj/src/main/res/drawable-hdpi/player2_pressed.png deleted file mode 100644 index 879278c30e36f4b656072ffc13c8b51372fe7db4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1250 zcmV<81ReW{P)C?@=zodEEozZk=UX|jTRaZFNqoxW7sppGmrHn86YwhF1zrZyzNvoF)uBaP#drvXa^b!?7aj0 z0{je2m75Tk#3#VoBFMLxcpvBmPFJt2epn7d9|8ydw<@rRD2XGu%ZRf0h#5@Lvw9t_ zL0ma;KiRz>=$v^la}=b0S}dVgfWts5S<6U@bU_Iy*L*Md#_~OA7>1CHBwMwlwh`nu zn9CyY1xU4k)Yti*74mo)C-W^}y8xtc#aHb+;|X~FF2?9mGpXiuJl$dF#%i)W2vXbx z*!69>G7udEEzsLau zgO^H)HG(8)I8d+Tk4E|)tphn9y<34&n7rKP~$e1zJ}h&yMC{%Zf(N~8*|KE*fbW9^!*@A{B*kPnE}g zVw_+*n94TcPDh%($m-aTo5yhI;Y>1fkff#@3ANceekRJoW0du|J0NOCXqz zv9DZ8XqFgv7;0;xgc@yzk~r;(%sAV_vd`3P4^ECt&5ePJ!V@xmkrE1$q?vR@DC0oJ z8Y+9+oy+C?R*(|XbGALlVG)YjnOZjjuAWp_{&eDTXV|C;LS!1DghmOWdRK&2uzn^v z{IJZF?CDL@?FZrZt`f02tJXk5HRf~@ z#r`BE^q4OKb$nAQnrifgeUDs`YG4ESJ5a2xs4?|5G97k`)b`2LxVp8HhRZ9;teR~n zOBbC8owil0>2IZD>4r)XN<2+$1}V#aB2d?PCqnmtTbAoXZ5{k1=42V z_2Q#$YU)1V91(G6Y$DcKiu$0UKy)J7OQ@8Wxo zfy}R^_V&CNziHOo9XW=|3H*0$S>X9N@V)u5Aycp-De{9AuUUBU#YiN z@&7o@z^f4SrL__QSE>ZVlB8?@*ks`S35H2|{!wc20R*Pf2$(+54F7mKx$YV0LIP6+ zlmcYJ|7u=HU`9cy4_apbBWIwW5%m4%wCn$oYthdM`lQoZsibPr^8{w>l;{4ZueJDN zaFpMjMI+$A@yV4T|EC+ZcqX_hH3F6fyb}GFXCZi>3<8n_TFZawj__fA(xv~B?!e8I zC^>=Go_}S01H4ZF0n`2ex-<_rW&C|B(ED&dLfE;qxi&^?Bmo5J05kxa04;zvKo?*R z&;#fL3;>3JBXA-{pfm=U089a901Lp$K1)zqWx$T%Rn>&8`UuDbbWQ1>6VJfw6aKlP zod4Bp1HwL11k4I(jQ{8vcnd0)if+2@(9#kQ^irU4RrIH}L&Z zgrvci6sSu9T?uSSL$Z)e8aE+p8nQ-KrV5z4ftz`<{IzrkEiV4vlKk!ABCwPK{#=1K zS4auiGN&~Y$`Zc?w!DP3`?m=@2-2_=q%`OLI1;X>C?Ky!sii%jKw@Bc18of}Mbn&g zbw6WsDBAR+iv{H!4Fe+|O^chcu@!fUy|qPOm1-MKKU}L(sBUYjm`o3})O6X3H z%orfZZ2onFXlAzd(fG}SEzvIeV(~{jj2!QSq@uKL@OH$hvFT^YjBW=exTX%e6DwR4 zTM(R#@Y)i%Z-7pKc=id5lxIPMfD?6XGsDd? zhYL;u>aFG!xB5QcWU+0nlBGId$G`L{AlOg!uP@px}O>DKb-H% zZDaBj3PG&|$g+G?*kV$chq1jYs-wcpC#OgEr!D4W>t;S))9m_~rxn+|S8|i=x=r3u zFM;!;HUC4V&RWMSB-iJJv)}9VJots1$sV#ktx1Z38i)cFANLYaV$*Jyi2VM3P@Ig# zU@`yHX>p2#*f_&39j<|Sb@KhtH%z>*YGi3n|Na7}ncBX_kRmNSf+&_S)}Tn+$)1^8 z02w$?=VKSx|E^T#a>~25S%Q?vP6IfLffmWbyLV^v%SXbrZd)8Ttv2j(y9B4Eh0N41 zAFFfzcr!|DV{4n!+NxDzQ^tJB+q-`C^@iOOt8=n)aymK0j~ps6OIii}j1`+nNlDIb zbR>>RWL&%^t+$c0iFbB6IXRWzx%3nIX-5Q6QBn1XOy1wBy*DWUb4*BuF)PqNYO1eS z5-agm!gp~CgcvP*iFobJewvs#E9S^T#a~mf1FM4@8XCe?o6A(Yle+wqk%7-Ia1UfhX_Yj@L4);M*6 zaoo!=fhU-1bA6q`NUpoP`!R|1HJ{F^5|0kq6#WMu&wN_>{{8zJ4u`We?#+5yKPOnC z<9xStgzaH4L{{XLARpwEN@RDLBC^G_H&m1(c_y__FJW)_iV|IO*#nO%KO7}?ECKrD zWi8G7sZ5_Qm4gMt@|u$QnutlU1@7pmv7Wc{7(Vur`vt5{JLP!x7Fl$wyU$cy?*jvo zjP4_!RhUVm25mMMKb`)%wn2yX82_hdq_*gRB=Nz4HxGOI(kvOajAPr~aI>>6Zwai# z^p|&j!p1jNZo(e+J|H~&cn%kE>Y_~R{#h1?@9Qt)UOb601}Cw5eCIF;(URsTe?Cvv z)P#hFx#Nu&C!Xf(*=7KD#Hy!LnS)nia zp27Dxad~m0@lkT#H)p~IZvN5<(y_W@#T>!CwA#7&l%2SgD>*RzlJl6f7$0;dt(BRa zN`;&;dtSUD7~^VT6b|u16*9%{qdVCjE|5z0DIr(&B8Aoq-29xkPQ93)_At5-a#58# z2qHbB${-|spq1IE;l{xI!0D2t;;b~u{582?3U+q(2A;3BH{(69v!r*+%^X_d?A)5h zx@NHyCUs7iT-ff}T$L0re10W6^}D_@(VEArke@llsx3MuwWddqjZtZ!*(DrS~~Sd=aBm(u0zna{IBC7+`s z>cKNE{QDVC1+##Y?81`KnxVH{PpAsJh=akm>2(a=A>JSkVghLGt5$I1DM=DnZNyG zA`1?t2m-1sK<0PjlQ8QE0;CKin^rK$dJ-Zji9l4|{9{>*4JOcs(Qy7b_GZ~q9g#of zLB`k(FbH;@41zbD*B_quW6)uGznpC;q#%(v>DO;_E>1h~lu<&gu3uRr>Mh^atP>s2 zUDSNBn(%fi>W$i-g_iaLzuIiL_62(Qpo^OV^gd#OvLebaNAQrU=|Bk$1yjwx%9)pjmNg}`-u9m@<+wuhd{?#&`G#QI z8DkR2fNdynG9$6_AN7``3ntiSejQDcnp#SYJWyv{5<}^HX>Qv&RZae@**x==;5BIW zuw61wGyWWj$osGrPr}=B{aJR#5bgre4uh5Va;HxJHI<={(!SAG5oWl6+hZJMv2 zJ}nB;zERe|nD&7<%H#`jcYyj852<=5#!t2bhTU0i4kfYHdPN<6tK}YPi)$w0{bOo7 zYU_rbh+8en(#(nGklFtAmh$v^qy8kXr7^zL4+2<4s3FeBE9EVx zkBpZm@lV%R>l%HG_+@1tBd4s}rZ!9(jn_bw65U=UbCtu!Gvl(KYs@vG?KM_a=Dbu& zW@~u*qgO8un%Y7Bwj*R>K|5~OE@7&{9){(!x~qm`Idut(2^X&}wfh7;<5mz^<&}g` z$2%_BN&B87r4casWtPE5q2CJ1U>Rpt6SP`IT(Q0NryUE|6wxrd@^YD)??v$n9^KqK zL1LtM14b-G`qd6xQSO);&AJ^U!N*%YKd~{gLdsN5&|Xnw(8$%~xB%)^OwNK=-x`ax z(sH25f)*pz;bM+O#3s9XQq1U&ggDNm8*Zdpba7us0~7MLv(smTqmr9bxPp7AT{cqd z@j^eozlXm^;eOH-Y2=x{W(hPJw<=hm`>aCdcy^SC>-*UTvLVTCJ4sc+(|P>uvdP6p zE(Kq+np-6UJ~&?SIpvwO@eEVi9q(xr!y>s__VB5i6=iNq&uWC=HFqBTFBkJQWRv7t zjk;sJK>w4$;{u9iW68Wu$I!3lFKa(8OV#u-_rg1*x00i`v4Zlu3_3Fgf~vf>@juV( zfGaZlBE|4rrF|ur1c!qijU_s<=k5^G+44 zf&+#AR64UR7FQeMUK`7y$hk*%%kF1jkfx}kvgwAF8C|m~@$Cqwd&)9L5`GpVdUjA_ zL|u0J)jF=PtA|}EI99%uyNfupYT+$>!z+mFS-r+j+L#(Tz7;R)*E`c+=zRI&Jl z_{rBxtSTNcILYN$gHg;r55CsOlU!|wLi!09tz%}ndKRQJgwJlRr4TVrkR%ZOdZ+u~ z+@+|Oi*$;ZvUAaHgM?k>cj`i_CguV%sk=PDmQ49u>~@b0L&Uew z5BT3s%Am4hoaAd?ztV9K9%BuW`Zqh-RhY@WWv=5aHCBDdFoJ<`ebpUB9)QQ0g2ZQZ zKC|(@y|Nn-b~dW1Sv0)P>6OLSwBfdB<+a$u z4OkqHIn>d75$#|2+2-2O0k7ED&qnfX=gl3Yg(DI61z&CiOTjYthWO?7O`7MOzCngz zg%+Ig-B9}6C#Tz(2eVN+jbhUg^OX5}>|wQt!i6^iGdm_y9OSFbH1@?jbDC!`g-g$? z4~OV~u=ZhZz~osQyX<`TN}lAHEgj3saa*ZC_JWCOT$b5n*q3Sa+($$^9F?1_lAUI0 za{>%$&1Xqz!v2H;cG`spjstH;|10O z!w5c@0L%au04snEaB=_+P;vse0Nel`055_r8AoB}MA=yawAgFfUZiDzrv71cRR1Q5WFG@t*DI)g38OQY z2&S0|_bgOAjA}&Y6(Uv$pK@2gcA4Nft>;BkD0YX0d3om*nf)~fJV`M8OM?u*AsnX> zP~?PSeoc5WvT@a#k9S&U!dAfJVsp`o9-ilE_UJD1*Dc|RB#zOj>PIYa#p6DnP%MW? z07@k7jNBl-P9d1(96C_WYIVO!wEl zHVda3Na{MM^Ux^S7%=FBI-{vpOU<^@kemP204_`ay}K*dKB} zk^YAWa!aJ~v&i0p`iexAtG)%%diDB{k1nPNA#->V(%~nJ?Jj&OwVTp@{tLtUllG zaTj6pA4e1ygWd%u#U%e4dRHOkPVaIns_gfb8jtV<-ix>1V-9>0j|lHhFL`X_sofLR?O5K@2dP%06l6=Dyz9gI zGk%J#aw>1Z^g(?MkFT}$VR^-C=yDC0!-)Buy#idR8tfwTV2wlX*@|MF5MjhC1C|X1 z))g#=lzX`LYicDBoUZx<@~9C1y9>~t<6bAC_4Fv@L+ zV6TS%12z%$Tui`gRZY3buyrfeijGGt_K8^T9!s+lrf9~*G~8l)$z{NATE<70uDYPj zD@@5s+E9Uh>b`dQW3k5THS3L{&PW-_<{ym$EA(a(dkFb2>G;R=LKmO&(dt-m6t1={_0jzx;ssk{m}YXtgESVyyq=X|Lu%V~V>$I==`l zE7w@%$T-^DYW@mu#z6Y<4xvM{6yXvSnbL*Dq}hcB_bclMV1_9Wjb~Cgrfxk#cz1R| z1sCS|W!b+h62Fy9VaOU3*W2F+OaE%Co+*kb%`Xf87MK2_w5&Zus1uQ{R@5hAs)4Z0 zO@6kMN&C}gjM_iNNtk|-%`qIGZX;nVJhO+Ey@Q@uv3TrUl<~M4n|YA&m_>64@j-c) zo(X=XT^R1jR>HKSZYy@{(mpqdRI}Z8 z`n<&DF02VIKP4=vw!2=j*^=WOCZ>P>+UOZCI{l&BjYht4tWv+liUEpfnE1;U<1o>s+cg?#cN0sA+oVVwsoxUiU~4obG+!qQ9wIOY z@buf$Q8)aH9>~r*tZ1z$;swxj9^|>Jh#1}S$Qxq34=~cR_A5{|@zaD=#X52a1balT zyM`4{FO2EfmiH%RaFIE(K2PC+zaU!Fv~ikbL=qD2N54 zp6XvZohVp~R4+22?keY)P({ie>BTHa86;>L4$uXA$TK+*=WoZS_(eOE-}x*>C>Bn3 zOM2DR1q1Kj^S!$kmD<1lb~ZbZ(@2rGYI>yymWMP5P?^i#s#n1a-i6g2nDW~52R+GW zzq-^AE77P03C>p?NurCa?{b)E#7ogfT^z~eQk}gjbSY7=TxNA6){DA%YI#0<^ZVt- z=?;TaK3Wn?ckPwKhy$(PM<$-$dDdX0^5V*Els6{lOxCjOlfl6B$6aocmh`IUugo82 zl371(Z;-@N2J*gq7s^S>S-p7Oa9b74^k1-M&9=kZ+k%J)S3?E{-I_A)Vl;)K#+AxpZ8Qc^Y+ z_1;v!ENJSF%rD=t)%a|h^u%I8(LbkwnI`-?5Cqe$Ao|x3V}znaj@)U*bi)C^vk@17%#2&n5OB^yUjC z8DXC5-dw)!*A@3mIa|ShoHtmR#MrbwLFvUD3L3#tnkb3{4SYDfY~rzxdon3o~qz<^F-k-2y;x-nBu$-c0%hDS5WZUqzYG*^yFQ+*8bSS ztGK&1!BFbjni7hRva_~ z&BV>-jTtpslv)NN+0~!I(Z9&gs$vBs>DMo>+_AnZ%EZ?mSl_&@q1_GLp^zl^Wln!2 z2+z3JZ9P@pFOMyyP$guxm(q=p@S!d;Y4ET~HY28S+@eVh;f^XBp>RIn80NQ17b3d^ zy^E~x>zEZL7MBqyvDtFy(<(C~>0{!;sPizJwKLL$3o&=$j*ns}Od40YoPBvI3f;P( z7UgY`YSLg5H*~Bp6H80bw@J#*Wb|m6lsA${jh)H14XdLjrWV!m2Dzv=Yb;-N7xU0XvZt^~PQ8tVz(zEah ziihPkG50q7mL~fO+3RGrd}JycR;`qyLdS4`k3MpFh1^GHwEsf7UL{PZolTN$UF-S4 z#cCp*tIjJ5`xQKg24%TvUUxS>~g4 z;zT|nB*8KAE67TEITFbu5_gk=j>+5KhVIDAP>0HVT%l)!vh$L>wbFt>K8d3G4wn#| z*Rr3c`RC0Ctfhmvc(RqVx3U7B4#Z@`Mt+u|TsDwb_9DM_Mx1}llBCa!-I0+zckoC_ zf;eA(zcji6(;tC@SU95U6Y=yJ9_glg8 zriI${{nQy0t^F3xYKN=~dr7DQ7k`8*6AoVJfu4n7E+jZ>Ergbp5e5t>zHAOseJ24w zT~Mto@i{znyG;T@jCjIIB*I{Jo|jGs?$0ZMD{__MGA>)V`2J0C@$=;4F&XG4;`c}2M`-aStH?#XzMSN%bJjV>>X1>aOyt!jv(7LLM ztdmBrd)Hht1RM`^7!cyrqVU^Cy5K33oGZHasbg^W5jS zF-M@DbZuZ_Fzi%S*D!4#fA)n--Hj2<1WtaM5=K%3rO97?g)~W;sfaE%zn{GAQP@~f za|@x9PH9H7;c8QuR}b&heE7&_@O{I{?T681BO6|vF5;VFMz?2-HR|wSu0Rp00|a={ z>-jHHJra*h6^!Lrh=`DZnwK7ChF61Z#>!;X7ekE(ZJl?(+HTd)Sf4fHRg{@H`dMOW ztlHiNjJ&WELNBO1)tcyX?z&E5+^Cm=yJ|ub$Nvl>b&AbFshq{)qhssL&ih#A)mHO2 zm6lECD8lmboBdp~`#WjL6MLcdAHw^@QjGC}`SUGc3Q=PnF_SE=&0_Mcm$KF1C zgGbZq`mMUP(oWvLywCNqJ~>4VnlqVXd~+p%EKlIk{s<2~Dx|Qrk8KOh=_p zhBm47--&SW8}?L7tW<1%f2^5_9)g^O9LNX*eeIKfdC&tWNl!A}Zj?C(X+P<>Fc~L9 zpQ34EzZ6xtB#pND`FRuidUG>E#sZ|lDe-uj@G+ERO~yUvcN0fM+{GTbFOcau(bv6h zjN_*#M*GZ+2p&m@&WOKL7?kgB_ee5LMU V9*zg+r=CH>4wL+!4=}8e{y!If%d`Lh delta 863 zcma))KWG#|6vlUEM_A9DRbp|$KU_4q5cL9=D9Xi)6EaNL5vV`HiEb(ENCfLScsKO8U^FqTfujo3y+=s&G)|d-s~)X?pu7= z_h^b7TCbgA-hq49T@tm4ZCTb#5(;Ye%883D?DG|%6fn*n+@MC=_ zGWq0~a}MY~QW3+PTmjKrBn;)X#5vvrnt_`p{Xj4>&GwMH2gn^nLvufH*8rSFFp>|1 z$4L=N3yjT*7|1%`NSq^hN9uO2TXCU>Zi^A#?fwnM=9?Jhqzdkv2y59-;#_L4A2dd(hr=Z%iACVYjkmM>`BwbQaggQMY$SJq}1jMelU zj3v1ZW(j2E(BIXj-xmA3bITDsKFvuP6x%(%SM8)2`d&%PB|E6N6OjHM3(RXf9?p)g zV~c!d_S0Tq#ourq6V$TKLsTIqAud2nL8N=N^u65t^^&!GP8wiZLA@#Cv%iBDdg@(b zaCNPDV0pxqnPu4xEFcpt=h)@K`i(Q>nPfctR6h}ZsUKD|Pub?i65FEiHSj<22ewdk A-2eap diff --git a/TMessagesProj/src/main/res/drawable-mdpi/ic_attach_gallery.png b/TMessagesProj/src/main/res/drawable-mdpi/ic_attach_gallery.png deleted file mode 100644 index a530569673d15792fa2f35861e37518400a7c0ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1131 zcmaJ=PfXKL94;V;Lv)FXpcrd4@lV*gj;*qW3Zoq|b<0u~LFHiAK3IkJmGhRz*&`c0z zl$P#B-H9Wd0(HOaV*HM7Vm3iEw>YM(^aDg@K%Zvt)aQp!C{j~-swUUDzi4-Y73y@)d zqfZGi49T*7CKP5_rhyCwm>?a%FY9AMT$ts8`^n{p!qF_Xmy^Wy zcrMYRddpn3crI;4xin6Ob{qRwqYGQuJ??bHws^5(d|+U=TiDj?zUC+Km3S8yqiN@D z=Eve*0AQa9T1llssjWwzbkJpcS#>TsPr*U&WkvgFh?;gb6Ox~KQ?bYFCz_sPwf{H)xw d`&B8is+Ra-OYsep^X2aKkH?bYy|$C*egQ2&ZWI6j diff --git a/TMessagesProj/src/main/res/drawable-mdpi/ic_attach_location.png b/TMessagesProj/src/main/res/drawable-mdpi/ic_attach_location.png deleted file mode 100644 index 193306974c11fdb1a9e38200ccb4ed5ad78f4e44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1261 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(gnVDi`Y2@T$X5i>-X5nIDXy|IEh<( zWNGdQ)9aF-T$-DjR|3v4~Pj*wm=R%;iu*SQ+p9GSzoH(^n!tbG11e-F{I*F z(x3nT?U{8Mg_(O9xfNMeRaGxJXo+{!Hbk&$)kt@2XZZMJ-n@C~KfV}0;#OMl@S;PO znn3a6fKRL)!Hv__DBNUP@vz%5i=#p)#X&^RdqWfh@3h$!F@1b?%p0XHOcFohR-`9( zIG*{Vi^4pXBl#DeR4lCO@N>0`;4x>}wSl4Ivty3Vv>y|a8o8wEB`-W!ZooI;FN=q+ zd+=hnF4q4S9(Q$A{BZAL-G1>$;DL_mj$SN93WiKoAJVqeI;?3wBF^~evqN*@K_;UZ ziEgMAiaF8r zi81IF`&4H)hwJvsyry!RY6x}wcPdmdY!iOVtTO*eqn5;ihm$+69=3QAEy}>i#xO0m W`tUI^D`3&Yz~JfX=d#Wzp$P!%Zmhxp diff --git a/TMessagesProj/src/main/res/drawable-mdpi/ic_attach_music.png b/TMessagesProj/src/main/res/drawable-mdpi/ic_attach_music.png deleted file mode 100644 index 3440214d1790323c77be51ff46462ae611d4ecc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1102 zcmaJ=TSyd97@lplqBOSjq02*uG3Y`&m%WVc;AZR0rVFjC>qcr&&CVR%QD@FHb8JT+ z?PW~@@gWGJ+e6t)4?z$FNl}DP712w*2!%v1B}GJpc1B(8p>3F%bK(2G|3Cl#o$*XZ zTkV$JTPTXEO|{EeGVb)g%^S&ot{DGGhFv(>jk{1EE-E&p5*o@wkTR5hn1zZqa&8tj zQ5ctC&#PK1PBd-wTBVtq#Lychdp-D7b>l3r`vDH{)6{iarTO!LA zi$$gwW{};_^08RV(+Guv1QB#bOsu#;(`hIx$k0)3-NHIDfv2eC(J+qFB-5267}lDs z>8zHC6pVEhi{%;4J5m{#PX8Zj7;9(;XW@Fj{}gs|BNk+{&_TntN*dSK;Dxe8$%YC> zb`GJTauqWLgppG~7Ld9GaNwkFYN+TOT*jx4$zsj;&?IiRiLLMV`1g}5@iZkTa_+nQ z@1>;{f6!OwzvSD>j89EX9R*Q;>3MtPTQqRz$M^3;`#$>ZnoYh=a4mT}Fy0vm<*P1~ z0@OxdL+|9`i#@ZT`eFU+eN*GUXHBK~S)A#yHkE=mpA1M7O{MDFSL-rAI(vW4)$~?{ zJKt{zM;=EXTqtaR^>*Rtulm3#YN2)D)Qy^FZPQmSp6;3y&+JeWhXOP7o3FXCL{;!* zoIYwPE4eY`yV>3O5DcXH3X>-#W?PEb`lsfp{M#Zmk@=H2jAvO~VtdUos&v>IYw diff --git a/TMessagesProj/src/main/res/drawable-mdpi/ic_attach_photo.png b/TMessagesProj/src/main/res/drawable-mdpi/ic_attach_photo.png deleted file mode 100644 index 9a70e6b581c41fdf9492cc3d7f8194e75c1a0297..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1227 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(gnVDi`;%08)WMpb;X5nIDXy|HU;o@xSVrJ}OY-r?Y z>S$&T)9aF-T$-DjR|3v4~Pj*wm=R%;iu*SQ+p9GStlHIIn2PoXz%Ib7*cU7 z>DT}N_RPA5!pyyl+={HKs;a3DtAyK2BK`gS&F%jBu<-aFOSa%BVY;gFz_?jZ#4q45 zQ{xpL1+m2jA#u!wS{Kr#FV;Hn9(HsP=}1rHRx;E&wpJpruz}?o(?(r^VyBI=0_)Y? zlnup1m=7DXc*wIRu_{bsf28cNQ6WHU(UqpH4$Z$BI2}Y!?Bh6cz3~T|z%DO%p}!!CsPrkDtmve1*}1O>b9vbP0l+XkKpp%Ld diff --git a/TMessagesProj/src/main/res/drawable-mdpi/ic_attach_video.png b/TMessagesProj/src/main/res/drawable-mdpi/ic_attach_video.png deleted file mode 100644 index b6ebbb60a8de6a1d4105ec3f129d86e1814d4b73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 990 zcmaJ=&ui0A9M34|7>*4+%pU_EsfP{BueM3o&{*4MKdNRcS)mm#OOw|&bjgd!tH}ml zyf{G*-Ua^y{{aso!e9qMufjm^D5wVy9+d5+Yda6t@bZ4~`Fy@V-;?V4>h#p*DT<<| zD{HDw){F5!d4|lNL**A)F5%?{-b5`N8a||o7HUFJaf~+9p<(UZKY)3PO3-$#fg9Q# z*+dRYmJi?}^d?E4-vkNh3!nW-y^!L|qXkc3kT^BW8^UAPeukHG9b9cRF?smd?XVA2Vw(6&bAxKkwW)%WwMX2IU4jKxU0}7PBpYDC?g*NkxeruF9<-ASRo@y zl5icQcp=5{WJrvVkwr;PWx?R1i8bG9$-25SutiP^-ND$CIW7!CHcYd~Z*xK}my0!0 zDTW}JV8_Kq#JE9nsG!2Y^lcB@$OW;Y(L_D0(8SY|5FBqL>jr}~k%V!P;c)`X#~}@Y zn)ZLFxpptU}*@0Id}tIiMf1Y>)RPGgfcFwZ{7*j^%R187?mD zUxglCk?x7NqqZf7QR73Gbh}U5x_ag7JMtv-idw8ipPIjqjtU88;zHut#Cv9|IJdC4 zIPv)I#>PxCb#?A${p^>S7c(ComL_NQtoQuf)a{=?uB{$+=AZ7r?N57qiT#haUd~dJ YJoRV3aPQ#T;raN*RhHM)SEa2-$IOW``Tzg` diff --git a/TMessagesProj/src/main/res/drawable-mdpi/player1.png b/TMessagesProj/src/main/res/drawable-mdpi/player1.png deleted file mode 100644 index ff66a1aa59723eac72be41a18b395febdf4d50d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 516 zcmV+f0{i`mP)G7HQA(|{v>wSZ^f?r`VkQD=jy zascB~SXO|d!O0ik5=36#1TbE~QcV%U5I6cc@X)P6x1c4!2L8S}VDd+R zWzz|GLdS+EnlhX$>8fa6sT$D&{j}Hd6f?JdLM#?2cFq9}6~VZ|xN9}?`-COsN@!r+ z#-(77iAJ$qAeg1jmRv8G#Oo~rgUDFJFY67}4x z;kJ(nCG{UdQcJ$c#n&a7cV)RpCC9wD)Y?T@Heftvqe!wm{zQxrB|%L}@J-^gVt8aI zQy!kWvJViZ2P|(x^Z_4!AEt4Ap~{6pn!vSj7Qq94g7d%0>cjXMbi*{`n)k$#=uB-` zfGe4CEkPI2B$kS}aQL*0#D((&+{5tuKo`#crQeY+0R{kT!HiRYuJLUE0000K|xPmyol$DSZ{)e zMGHkwg*K8_FCJ2*Md`t6i%FZNo81||+02$D+59^2!OZTw?|bjfn>TcL;wbr_@&4-P zn*V7Xfga#2FbKqfcKLk`muXtZ@;zKpYyXx=&?uau#>9Cl`lZfspev(5R?H zm7MV$mD1~0&fm}?4t7N3z9I^ZEunnHbij+CL*CFWug)uOU0zFiZ)(>mVsn&1 zALmY)P6B_>xZ-q6+u!Ovpc}?Xh;(C`Mn6jX1;iD1a|(fxYG+ZCyrAwym%SpFZ-aV~ zXmktkV4srJZ&FL`YKlCsk761Drr`bSAOSJ%0Lz5a7|rSTXwFE~CC47L>@k@dk@x%c z9voA?X2Yc&{2MM$8f_$lHn0wH9j&4h1<{WKJptk#X*VUv;l0)9n=GEo%fO*JK`h93 z`Bf{Az8FLD(H9M|TVBlHl6V%xvo)WJ2F~zWhrx1O z1d7nH0g5KiAtzl`wBX2cP99~0r#AJp&(4NLa~?d~984IuG-On+WEazg=)Eo%nAsuo zfkAu9m?A>UcGP)yA(nrQOBBN*-?l6fjMzA6+q=bZQqQU%8XZu>EnUxl#g{!aYaP3) z(KoXME|OJO<_!f{C+FLcyctF6L$W#lqDP3;LDlHsyOjc&l}b#Rs`S*XeL$LSSY8I` z12z2K;>Pufl?%7LgY(!~#0gXcN8M!gVEmB1%_QSm^~93yOlMlanaQ}*L5HJhmZH9J t)U<5r3+E18WB9eN3+MmR|B){N1^~IqczM6>HpTz|002ovPDHLkV1fZN;!6Mk diff --git a/TMessagesProj/src/main/res/drawable-mdpi/player2_pressed.png b/TMessagesProj/src/main/res/drawable-mdpi/player2_pressed.png deleted file mode 100644 index 946cf59d7efe46f6986c129d26ebfd08608a12a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 845 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 WuRr`ca8h^r=b!O%*-ptkSPd+K^ zat*@(wEh}33=Xr!{iJ}-;JMbDNtVwE80*+@1L+M1lAuz)B^;D^CsuNS(mQ`V9PDeS}? zVFIuFrAFJH5h?@W9ez51f?!RM7yFPY@W(0a#;9rSK0=L{{sn5B#Y|P5vrDEwF?j1| zt%^_&OnH=71Hd}3%;2OKqjyLP?x0W{%C@E`Sjq9X51L(d{9*pfPWKAkL`~1Wl3^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&$iQ6q^IL(9V zO~LIJbDVnhfsWA!MJ!T8!-RmT2gHOYTObFX@Kf`Esl5o8tTQL7Ok-eRTXFL+-y}qv_p@hDtA7$6Fx_*7*NWE%9?X*m?O;sHkw;vWgcO#S2)>0r|!yn$!ifwZYc25i+2g!eSp7H-iKnC_y#{H%yf z)AK7k-6!&{RyEP@%-_IQrt;S6f!^a9`JCotX-SXiN5m}{65V!3D=Ks^JK?sH$#R&g|)#@F6)YV8$7C*+wxdiH%Lp<#sFV z-dSy}WHZcv_^;PbM(X+O&I1<|8yhl3^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`vLFjeCsTY(KatnYqyQCInmZhe+73JqDfW2&$iQ6rXIL(9V zO~LIJC!BiqfsWA!MJ!T8!-RmT2gHOYTObFX@Kf`Esl5o8tox7n&0=6++U@D$7*cWT z%`9J!kU){+@1=7C+Y)AfJ0zg%&C0BMeQL_ZWlbXH+cp>V7~Pt7MMYOhsLO0Cr&G7m ztsi?QglK4p|J=AD*L4|p;gyf|vy``Fe7RHpzS7va_`&h&GuGelecu25?s;=ZtGQ;a zIflUx!bB!yYnPr?nCOvnk8J^?4D(h6KCK@&{SBCp9n3ah`d6|q#b{DX1zw7SHT=4f8QbS;*PKgLb*%D=jpc}>lVn`f{*zrYo*B;N3#|IsIzDVEzF2wCt7 zzE=`HaPWJx?7Uw|TqbRTiMkE(vpM-q|F566VpHwhq-h6(+iRBz*xbx}<*%W+%Dl=Tjp&SBPG#IWKnpeZ%yo8oo@94(^(FoHbQ8Q&V*pIPEa`@Nl!c z^MS0E)lWis8SPsh@8F;RUWzG=#cq1b;wxols}&#YJ@8!R#hpi%ZzZK{ftnHmUX;%c zUu9DHHYr1>hBc4#v&5wv6DKy@Ul8-4x`{J+|AB_@Vh3)e98I!(kW{Ooy>zQotwdu( z+*@8=Uzbp?gZ>M@t=@XRb(d)N|7E#N222?TzeOtk@K5|TV=KeGj1oB4Zxd_^gX+c%xe(qjXoOa?H}d~zmruGc6dH3-RIeaGHdUR z?}O|(Z`^6|P}`BMR&0^;$(P|~?7bZ+o9n(A{?uw%_Vsh*xAR}3yWf9pKNfz9^#aR3 zIXUs4+gqIk9L#vn%{s%rr}W*H%TlaUrEC|UUpf8fzuquK$B+AkTp9oGY~W>NW4Qc! V`x9%~J5HdY-P6_2Wt~$(69E0FU!?#5 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/ic_attach_music.png b/TMessagesProj/src/main/res/drawable-xhdpi/ic_attach_music.png deleted file mode 100644 index 12336bf80a1d477ece58bbe7780b80aef69090bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1272 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)ylsbTTkB zvote@>2=9ZF3nBND}m`vLFjeDsTY(KatnYqyQCInmZhe+73JqDfW2&$iQ6p}IL(9V zO~LIJOPqT3fsWA!MJ!T8!-RmT2gHOYTObFX@Kf`Esl5o8tP3?y-C|&1%<*(_45_&F zW~OfzlcPXu`jOuHCsJ_^1&bSRvVRo1$$osk^pO(+MS=%+h?(cbJYi6rF5r0mvGkgT zElQHXex=!>HZJZP_q|(Xp8N86;hUW@mghePFuXhw|7oEC&*};ZC&rMSMSam3d|wx7 z{4&%3l{tIHq8Up|XG9=ibHaOa~|NTQF!fF{G9%wte8Azd+M> zvd2@c?c153aV50Y>=nKr!T-n2$9i46C2If!>khx3g=`@TrVIVUbG9(=m0qvwaqazq zA1gi*voCY|+W=@7tIY^f(M2GrXw$?U;RSW7DtyYztl%%#}%<9C%ZuZ<^1t`iPhg zg(#U|)?%aOdMRvSKW>&v%iiEA{30$q$#>Q=m8k)@B6H3e%}>`<)SUmEQQ$-6J-Hq2 ihvzV99B_QYBEc~6PMF;W7p7uRS>);J=d#Wzp$P!SaJSe1 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/ic_attach_photo.png b/TMessagesProj/src/main/res/drawable-xhdpi/ic_attach_photo.png deleted file mode 100644 index 25f0d3c8177eab985f937e2cfc5f0bebcfd02a81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1588 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)y2=9ZF3nBND}m`vLFhHbsTY(KatnYqyQCInmZhe+73JqDfW2&$iQ6qkIL(9V zO~LIJW1M>RfsWA!MJ!T8!-RmT2gHOYTObFX@Kf`Esl5o8tmXah&tqU6X&d0>LT*!sP|;OLo;QhTn`DEGVPdd5eo9K(P2P-!PUU>ZVp`v~u$NoBDz5556 zWtRV7j@rPbT`A7+T)Hrl^{8C^k>U?bN@lgf49~L)JR3MPF4p*+KVUUivg6DSu7u~? z9abhXK4&pGq4b8Y@Q}lE-EWy8s$8x-e7^-n8CBW1D`ch!>6J02IcTq7arIHXKl`bj z8<$7p^99m1?7ts$-F#jhyMRk)hROr|7tC`Xcr5&{_=4fDO<2Amdo}N}rPU!(SDLf_ z%})AmwnOZf&&SfB>N`ukbE3*nRTCoXG6ffSJ#1^~2{ge~I-dH?>j>oxWZ5 zTc3B6)Rss`-AaWssvm7C7G0SC&8GJ3?>EOk|BYyjUOZ_>=l1hT|9>5KnzR0K#^qP3 z=kG6P=$5TMD)Pj8ui(-nGY|fow~8aeJmSEtE{0#{Pj)t*`@ik@vYNf7YgJT=%C<>k78iu5QJHm?f`U=#rNuuQn~> z=AaBg?;Zt*=*5HLE~0LDQbfGzJa`rn6;wp<;7iwb9;_kB`@{Erzu)`)zIQd7Io0nQ z^Z@|+Q`1t8jI8_hc9Z{H*RORl9KneKoe@iacayFiGU8VOgZ|JVT(?bZs>|+?rt+Q)qvnql-^CMkj_$ZWI-wv81XAC z$5Db1;DRAR;7(9H%kd0LUct`=#gHKKVXFDiB$}lb#hjFE#v-dIy@;_XGEAjX2~4de&uNB=D)#XPKAjd*hK*%Ifhj3U6NP}LsUj~(;UFuG3Zqhx;}XFb z$A_m9d?YD_L&;HrZE+=}lyzv}7FXTlMmlm`E9fSPEI~`V2-T#8bgFS=QR|$G&{40+ zRXgVr?#N|GGK|~UzZ%`zBJOdgZQGJX+xXBRZnuc7`8(?ytn|En(06dTcKclE$LHVL{puUr z=ehCNyOX(A#7FDk<@+l;(aB?=wi*N9K^=VX_&l$@hq`X|4DXv9$o6ja-M#$L1He~p Zzo#4A$|T}zXScoX-ApAi(!JP)wLfzkMQi{7 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/player1.png b/TMessagesProj/src/main/res/drawable-xhdpi/player1.png deleted file mode 100644 index 2a11310e6a6bda35d49508a843c9891c1c868b91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 858 zcmV-g1Eu_lP)`6pHRCwC# zSvzkNK@h&ZJ3CI4_lrmf1tLfg&?JZ;AzJ8YC@3h>@jv(<5d|V89ij;}9iSA!!QmOi zBLoPLw|(bZz7cEb0NK8sTi?afjr7The7pC3J2ShpVEDxu>KbD@N1gf`x&j7S;}bJw>J4b_soCfLyILU_AT-bLqNA~4&*qO9Z`1XnvApY%r%C90!M(p z1>$&wXE+{kbp^D|O~0N1k2jlq7vY&z#>}3U02EQ4y2omn?5HkKkTeP)JoA7dV4ri4 z?Pv?=@|R^USg7;0FZ01X&I67IwmApcH=tizL~rH3wdWSG+uR5pWF-*4%RI=)HaP;m zs$$M!c%lg0Hk7BH>R@Px(Dz2Mm!N$>PD*V7YS7!1$rFdQIQIb>TuD*DCoJSPTYzeB zET=@C-d!}(RzYz$gO8&L3wVMBY}$5=TCgoye_DV^*=iK>kv$N);8SC(tHtC$g8VaM zeW8CuP?dVYGT#@inRb7a)7+)7qxSf?;e=g^8aA;6goN}fA#s{s^z!#W3FOPHE3ARv z$i`IrWmIERAhPSg8xY@#^L`Uet91pMYdF-7p?j=Qt4t;KmO2!_G^%aV5D<>znwZ2a k`<*xwkO^pW0lx(p0G=Zk>nRF?&j0`b07*qoM6N<$f-PEo4gdfE diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/player1_pressed.png b/TMessagesProj/src/main/res/drawable-xhdpi/player1_pressed.png deleted file mode 100644 index e3ebd1b5e417967076f6afd7276708a7bce5417c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1470 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 delta 5589 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 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/ic_attach_location.png b/TMessagesProj/src/main/res/drawable-xxhdpi/ic_attach_location.png deleted file mode 100644 index b6bd6ca9ae7a9f9213d51bc5cad4b35979054291..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1993 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 Dm|7&O diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/ic_attach_photo.png b/TMessagesProj/src/main/res/drawable-xxhdpi/ic_attach_photo.png deleted file mode 100644 index ccf61d6965a8e50fddaf9aba59745995e569a886..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1949 zcmaJ?X;2eq7!F7bU=V=_3W(cKFrc|ZAb}`Hzyt`!a4JU)$wC4o8+TU|ylO=2QR|?9 zj)ImdMW|REK~SWER0Y&Qq^M{Cv7n_D#fuh@mToNA{wUqq-S_*xd7kGzcXqclYPpTI zvo#Kfvk{AgGR%rhkL6749s9g;IcDagp$TX-l!of%Fo+9MLa87i*2vRA87Nm~uWbPX zaJU&{bxZ=9Ac^EFAPr4!!q5yF9mdAt0+tzcaz!SH0;yoSS}PzAU8*MoYNdc2?;~MI zbRnQhE!qHs(Ho*-6dN)XJSBPAQXs&<#{@JWDhCXjEG@z}2*~es`PkZYOeX{HA!w$6 z{C7|Z5-AV@!64v6V^b9jCKKRtX-tj}m&;rNuoz4hoq^q4DwD(a;qqC&z~n{7yur#e zzDyW4=?mKl$SM@o@#%EEUQg4rX%L)FXYzPFlLm`L#Sl~^TZ_sKR4w8@r62?m1+3Pg zYDf#16y>SVI#fW$BK&f8za5 zVI(G72hwFA07c(qmu=@GB@ zc!`8B)*`4}s{qA90U1-Esntq;C?`zF;o)GBL^O9Lsi|r3CWF`# z+-2cu+)TUW7<%!X@VIV2iIxF^s)LT2ZD%FJ;m`9_hn1dl=Nc~_5H+`#rjqh7_+QtfV-rZDxDGKx0G$`z)DuVqRGJ=!h2q1e{7ddsRhN zOA`auyS_Dg>T)Iy68tM$ysx%2-i|)ob5b2er!-2JkV+~AVkDupx~ zclD!0!t4iD?V#C_mH7|sD87N_r>oti8CxyF?^I?dzYw*-%Zc1857zq+n9b;Q8j9%4 z3a}+@Td*cYYT=9@?&Xho@tzXi*eBs5g79U(smAPUX!nS5M!v&ZA=kY1<;CB}DQydN za|Zhk%I{w`%5>W|j|Br8as|DmIZMwNzf0NGA4)vl`Km!VVJ^kJ&W?-X5^Dnq1Z4mD zZA8b2RmLNd)ve?s4msYrTKkR84IT{7&K1TjE;Z68wVjk@b8t8W;k?)tymwZ^US`5toY*fE!%&QYjI#|zF3cO8H2&g%cj?S{XH z8Sh+X!G%#=N=Jzc?`c)|Z!2KyHoLDM$sFTbBKhsA9gFXl+WHUVt!`aFfAQ$l#RQhV z(ox)7ok7YSLQcKy@A>Xng)DMRwf*zqJNe08x6AvGh`PGRhPuL&cb;?n!0o5D{_wfe z*cTH{^!|Ahj&#!XUsC#NYjff@7@xKk>xS?4ty=aq=q^%__mSm*U&a)y9CDdUGPKulWYf-lD$Q^urW~MhU+SUbF2l D7A^eR diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/ic_attach_video.png b/TMessagesProj/src/main/res/drawable-xxhdpi/ic_attach_video.png deleted file mode 100644 index 66843485ea8921aea39abc8295a1b6d792dfccaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1092 zcmaJ=(QDH{7|*sUb8IM+f%)3n{O_SRiy5zFtX0xIw zBEt4G1RwOxe_$^P3Uf@5%BF&Xh)e_p_n_h&`miTKFJ0UDU=2y`yYGI#-}l{j-_4Jt zhT2+=wNMn*mP`m~GA5j_c|ZA&ZQUCp!%-ZYz@umq7bFu>VFhI&NNUm)OhZYTn^}iJ zifW?O%mkhghj|%k9?8LYY|S8SiV6LGf2d6fpL5~9cbqE|GcFsCMp zCLArMGIB952NZhnGzi)}5zru(fUQmI7H@~>vMx_-$IZ~748i#jy_?j8I0B-`guw6V zb<19s1svyL`}`co_5h!k^)X)Za&ESd_jA0jA5d{E!k8JtRfvaic%KM;t)+T-Q9v_)MRz5 zQYKO`#+D3*^?02vRe_@Tf2gL_&=yX^y?p;EY-Q#Q$fTi#W=)wK++?Q{%HX3WlrSw2nbaB|>ZIFE($*y@)kCht!=w<-*zdl* z54Sw=wz?h9O*``wd&M)U) MCu1pLDRSZ3ADw(*_y7O^ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/player1.png b/TMessagesProj/src/main/res/drawable-xxhdpi/player1.png deleted file mode 100644 index 6eee90a8e5e909b90c72803c984752bb7c0c0552..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1312 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 Z3;?8)3)kRq7FGZN002ovPDHLkV1nzVWkdh~ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/player2.png b/TMessagesProj/src/main/res/drawable-xxhdpi/player2.png deleted file mode 100644 index 7a099f7cbc6b3b37f9fde3d8991ebc8dfd7f54c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1290 zcmV+l1@-!gP)xa#EWr`qimBzPd%svMh?QJK~W9kwB3^kwB3^ zkwBqEVXl9m`&lZ~0`&J3hRT8}!J@pfAQxZ(>c9k8A!{h#VJ*MGlpL4A32-4_1u6v_ z!FmxVX5*T2IabTD9b5y)!6|SWw8AdXKDn`GMWI`SE8qY)8b*QGjoQGYV1c3EDB~Of zwt^qQnXm}N)^f_jU|R)V61RH?CWBfBaa`#H&-j#yIKEv0_Xkm+B6*4}K4)c)d6&Va zAh{UVE*G-0j^E&zcTQYyz*m7#MRQiUDA^@wXcM>pcDb@++c@yiHr%u|C1W-()R6`#OThWlFKnWwuwD2^?={l`}R#wZxyU_ErL}l~<<>*rb zzg#O>&C;|WT`W^0&Co4aPx~(7RYItnG>m?)f$l**%?At;;A^Nz-mf}h* zErE2$Hwx0PjNPFap<1&%RT5}JRiJ8m@5&NlG>dD$E3RZiOQ58xX_ufvE_P8Jm(r6Q z-Sc0ps0h^GQ)p3U{6w=8>Pt5n_TBOe!t-P0I%r9AyJJapX>3JxsHFME_fE$B=*RBj zT z9-(dQ!m(CL(@Cm9FxQPat{%88fe?pQ(335yH?4nHu}%qkP2OS5?ukySl>?Hy^~$cTt^noJEm?2MEYf$Bx9 zi6_k)Q7miE88T+ z{Q{3z^#6m*7mATUkw6h5fg*t-fg*tdi9Z4i03sp*7@m4q%>V!Z07*qoM6N<$g1rk{ AZ~y=R diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/player2_pressed.png b/TMessagesProj/src/main/res/drawable-xxhdpi/player2_pressed.png deleted file mode 100644 index 8fb075f6f02e2a44448241afc99f5f22f5d2a99a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2436 zcmV-~348X5P)^Q05ILxH@;DEeGmWK_G^!jEkLV-(^Ik{pOn4wX~nBtlw?Wu zhP?0N-|4GQQsZieuIWK7t99r(y%Xp&bYrp2wR?fzqdilqhGz8UuWW7SfFFaTH%ndf=p7!{2;w>V z&w;)YE;H`&d!B9TXnI+6Y)}*G{PgAYdMImEsnfW!LDHd02~t|`*<4BcJ`MZ=SZd`) zAZA~>qL?Ix9XUg=-&!hK_5h*2xS;6;%qb7DT23^8%!jHZ75b6T}m|9l*!P z)Z8P#+|=Im8#L$?;*0Kjp5ph!0+GP0h*v{!J)Sf9iPJsozr-kcqy$N8-6CjzNcg!ZupGCsN?9#KJi^^)DAt1BgFrKzB4hM2Rbu&`_d zL-P6}Ty2>6>cL70`dX2CWN8qtb%HgZ@d6o2+Di!mD(WqlpbmCrdbChI&$0$K#G+Fc z0sEeE3A&$9&j`}_|F8x(Z@{~sIDBWh1g#*d=YO(UV95AS5F=U`ZnnZHL0)2x$3VsW zuh~ElANDP3wOh#90w?N$d;J%c`jl&}&Y@GrSU*0y%`O^36g=wI?J(q@P;=_7cF*mY zAf)T3TxqEe1)s+-tLBH=kCujb5)o%H=4X$Avb~~j>yP-~Q4^}crcc@S!OfI28y9GH zF4jlHpR>ZrnPiLDFxw4szQw3@GlNAy)K+$u?PLi@ivf;}=W!M}(NZTdsE3IB=Y^7! z#KVu{!FAT_KxG3g%68=4P-HBUC8~~GY)25E6l*UymK9#HUxI3k50{pmxMDARk9}1z zK^KX`AGaf@oyb5ZgsUgV?kf9tD!VTqvjiDNvT@>YmmNV7YTidEL6`G2p1Tzb$_9bR`5)%QTYU@k^Vb-xdvKPOe`_P@Ir< zP$)eL!fnM9JM4m}W*EBRBMzs^CdgohSc2xUBNj@v2^tveTiM$JlT_-t;&ud$5ejNC zG(+5rRv~1_o(i&KANvbhD{Q4!*Y$Sd@Q58j+y_q=_FX2C=@P1-I-Po^vraPUqLZ|YwooWRTt#i{;rxT!lXDn_>myKIRwzNbK|RwMCj=cUA}Fi% z2(QIjprFNUBV6ZkM!&flM_&IZyADJ)F`>z-npE2i!{{tHJb^-W*hw{ioRH&vp_GUiN6rxMv7C(ms~(4ZO3!ygi481vJy^fiG}pFJAW$X?jomz4-b@Actqo zQ2c`ymHQ6+T-M(B+w^Y}<;S|jrNpXwCI<;&Fg2cf2(Cr#V&r={k|GGoUyMxIQ`rsh z?Pc{kq{pN2hb%V08~{1bIje@8*+~nMJdp3Eh# zff-8#M-%<2$<$_^uUVY3*=~DOwFGhFYw7={zQ9mAfYEI$0^`z}24i%})Wxa$vdQcw zc4c+gik!pcUc1u$Vths5cdW!-G5!utpe69MugN#&S|CO)26tMMO=rKHf7yXHzQoKo z){*Zwxw)Z^o84|hL-xq8_`<#yM9w8~#UNQ-h1zf(pQ|cyDo;;-2y)I?onS{$wS_0& zj?H~~D?s_Z#N94EnI1s!Jg<0_*S#U{u}a?1=Q&MgD$|2fXC%PhTkE$uyDN*yvOFlsQWUNjRs6~b5zit3-`LxQ5vd!v-swPQ665HN zT(=eU0ZIH#iSL1^H6~G|S3wXj@ZkM?kqPd?5JNloX-#%5Vs-I8rJpl|8ZL+Zi?kmV5HgWLxkG}}q?7}^G6@C!-6L7&T<~=p&S&pz7 zpZID5e@S#v1=r$BKzw5TF#G6#f^pqyHGLX4RNy*3wT`P%hP;_9yCYG zn%hjxFOLE*G{St++<(zEM^JSpAyuDap@jWUfB^u%Ivn7*IAxju0000wy diff --git a/TMessagesProj/src/main/res/drawable-xxxhdpi/Thumbs.db b/TMessagesProj/src/main/res/drawable-xxxhdpi/Thumbs.db index 578750c037738650c135791c72d75f77edcdd4d5..a64b9e825f238b62628e97fa5e3ec628a941101d 100644 GIT binary patch delta 19 acmZqhY4F*Q!@_pqZ*!#3(al9HeTo25zz7!r delta 19 acmZqhY4F*Q!@{O8$M41M&6|r@`V;|A6bKgp diff --git a/TMessagesProj/src/main/res/drawable/floating_states.xml b/TMessagesProj/src/main/res/drawable/floating_states.xml index c2c53d12..55cb84eb 100644 --- a/TMessagesProj/src/main/res/drawable/floating_states.xml +++ b/TMessagesProj/src/main/res/drawable/floating_states.xml @@ -1,13 +1,4 @@ - - - diff --git a/TMessagesProj/src/main/res/drawable/search_dark_states.xml b/TMessagesProj/src/main/res/drawable/search_dark_states.xml deleted file mode 100644 index d1d4b459..00000000 --- a/TMessagesProj/src/main/res/drawable/search_dark_states.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/TMessagesProj/src/main/res/drawable/search_light_states.xml b/TMessagesProj/src/main/res/drawable/search_light_states.xml deleted file mode 100644 index d1d4b459..00000000 --- a/TMessagesProj/src/main/res/drawable/search_light_states.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/TMessagesProj/src/main/res/values-ar/strings.xml b/TMessagesProj/src/main/res/values-ar/strings.xml index 2f213b97..cdffbf72 100644 --- a/TMessagesProj/src/main/res/values-ar/strings.xml +++ b/TMessagesProj/src/main/res/values-ar/strings.xml @@ -15,7 +15,7 @@ رمز التفعيل تم إرسال رسالة قصيرة تحتوي على رمز التفعيل الخاص بك - %1$d:%2$02d سنتصل بك خلال + سنتصل بك خلال %1$d:%2$02d جاري الاتصال بك ... رمز التفعيل الرقم خاطئ؟ @@ -65,6 +65,11 @@ أنت قمت بإنشاء قائمة رسالة جماعية إضافة مستلم إزالة من قائمة الرسالة الجماعية + + فضلًا قم بإضافة ملفات لمكتبتك الموسيقية على جهازك لتتمكن من مشاهدتها هنا. + موسيقى + الفنان غير معروف + العنوان غير معروف اختر ملف متاح %1$s من %2$s @@ -121,6 +126,7 @@ حذف هذه الدردشة قم بالسحب للإلغاء حفظ في الجهاز + احفظ في الموسيقى مشاركة تطبيق ملف التعريب المرفق غير مدعوم @@ -347,6 +353,7 @@ إيقاف الأصوات داخل المحادثات افتراضي + تلقائي إشعارات ذكية تعطيل أعلى صوت %1$s خلال %2$s @@ -827,8 +834,8 @@ h:mm a %1$s الساعة %2$s - تيليجرام نسخة الأندرويد تم تحديثه. الجديد في نسخة ٣.٠:\n\n- أقسام مخصصة خاصة ومرتبة لكل لحزم الملصقات. يمكنك إضافة حزم الملصقات كهذه https://telegram.me/addstickers/Animals\n- واجهة برمجية خاصة جديدة بالبوت، مجانًا للجميع. إذا كنت مبرمج، اصنع البوت الخاص بك مثل @quiz_bot و @hot_or_bot باستخدام حساب @botfather. للإستزادة، فضلًا اطلع على https://telegram.org/blog/bot-revolution - 576 + تم تحديث تيليجرام نسخة الأندرويد. الجديد في النسخة رقم 3.1:\n\n- بحث عن الرسائل داخل محادثات محددة. \n- إعادة تصميم كاملة لشاشة ارفاق الملفات. إرسال جهات اتصال وملفات صوتية مباشرة من خيار المرفقات. \n- تطوير لتشغيل الوسائط داخل التطبيق (يوتيوب, ڤيميو, ساوندكلاود وغيرها.),.\n\nللاستزادة، اطلع هنا:\nhttps://telegram.org/blog/search-and-media + 583 بلاس مسنجر للأندرويد diff --git a/TMessagesProj/src/main/res/values-ca/strings.xml b/TMessagesProj/src/main/res/values-ca/strings.xml index 226329b2..a2e3667b 100644 --- a/TMessagesProj/src/main/res/values-ca/strings.xml +++ b/TMessagesProj/src/main/res/values-ca/strings.xml @@ -55,12 +55,17 @@ Restaura les notificacions D\'aquí %1$s Inhabilita + ETIQUETES Llista de difusió nova Introduïu el nom de la llista Heu creat una llista de difusió Afegeix un destinatari Treu de la llista de difusió + + Música + Artista desconegut + Títol desconegut Trieu un fitxer %1$s disponibles de %2$s @@ -81,12 +86,21 @@ està escrivint... està escrivint... estan escrivint... + %1$s està enregistrant àudio... + %1$s està enviant una foto... + %1$s està enviant un vídeo... + %1$s està enviant un fitxer... + s\'està enregistrant l\'àudio… + s\'està enviant la foto… + s\'està enviant el vídeo… + s\'està enviant el fitxer… Teniu cap dubte\namb el Telegram? Fes una foto Galeria Ubicació Vídeo Fitxer + Càmera Encara no hi ha cap missatge... Missatge reenviat De @@ -108,11 +122,16 @@ Elimina aquest xat LLISQUEU PER CANCEL·LAR Desa a «Baixades» + Desa a música Comparteix Aplica la localització El fitxer adjunt no és compatible Estableix l\'autodestrucció Notificacions del servei + S\'està obtenint la informació de l\'enllaç... + Obre al navegador + Copia la URL + Envia %1$s %1$s ha definit l\'autodestrucció en %2$s Heu definit l\'autodestrucció en %1$s @@ -146,8 +165,9 @@ %1$s us ha fet fora del grup %2$s %1$s ha abandonat el grup %2$s %1$s s\'ha unit al Telegram. - %1$s,\nHem detectat un inici de sessió al vostre compte des d\'un nou dispositiu el %2$s\n\nDispositiu: %3$s\nUbicació: %4$s\n\nSi no en sabeu res potser era algú altre! Podeu anar a «Configuració» - «Privadesa i seguretat» - «Tanca les altres sessions».\n\nGràcies,\nL\'equip del Telegram + %1$s,\nHem detectat un inici de sessió al vostre compte en un dispositiu nou el %2$s\n\nDispositiu: %3$s\nUbicació: %4$s\n\nSi no sou vós, aneu a Configuració - Privadesa i seguretat - Sessions i finalitzeu aquesta sessió.\n\nSi penseu que algú altre ha iniciat sessió en el vostre compte contra la vostra voluntat, podeu activar la Verificació en dos passos a la configuració de Privadesa i seguretat.\n\nAtentament,\nL\'equip del Telegram %1$s ha actualitzat la foto del perfil + %1$s s\'ha unit al grup %2$s via enllaç d\'invitació Respon Respon a %1$s Respon a %1$s @@ -161,7 +181,7 @@ en línia vist: vist: - Convida als contactes + Convida els contactes CERCA GLOBAL vist fa poc vist fa uns dies @@ -173,6 +193,19 @@ Introduïu el nom del grup Nom del grup %1$d/%2$d membres + Voleu unir-vos al grup \'%1$s\'? + El grup ja està ple. + Sembla que aquest grup no existeix. + S\'ha copiat l\'enllaç al porta-retalls + Convida al grup amb un enllaç + Enllaç d\'invitació + Voleu revocar l\'enllaç? Un cop ho feu, ningú podrà unir-se al grup utilitzant-lo. + L\'enllaç d\'invitació anterior no està actiu. S\'ha generat un enllaç nou. + Revoca + Enllaç de revocació + Copia l\'enllaç + Comparteix l\'enllaç + Qualsevol qui tingui Telegram instal·lat serà capaç d\'unir-se al grup tot seguint l\'enllaç. Fitxers compartits Configuració @@ -214,6 +247,20 @@ %1$s està disponible. Cap S\'ha produït un error. + + Adhesius + Els artistes són benvinguts i poden afegir els seus paquets d\'adhesius a través del nostre bot @stickers.\n\nEls usuaris poden afegir els adhesius prement-los i triant «Afegeix a Adhesius». + Afegeix adhesius + Afegeix als adhesius + No s\'han trobat adhesius + S\'han eliminat els adhesius + S\'han afegit nous adhesius + Amaga + Mostra + Comparteix + Copia l\'enllaç + Elimina + Encara no hi ha adhesius S\'han reinicialitzat totes les notificacions als valors per defecte Mida del text dels missatges @@ -241,6 +288,7 @@ Sense so Per defecte Ajuda + Només en mode Silenci Fons de pantalla Missatges Envia amb «Retorn» @@ -249,14 +297,14 @@ En unir-se un contacte al Telegram PEBBLE Llengua - Tingueu en compte que l\'assistència del Telegram es basa en voluntariat. Intentem respondre al més ràpid possible, però pot ser que triguem una mica.
]]>Doneu un cop d\'ull a les PMF del Telegram]]>; hi trobareu respostes a la majoria de preguntes i consells importants per a la resolució de problemes]]>.
+ Tingueu present que el suport del Telegram és fet per voluntaris. Intentem respondre tan ràpid com és possible, però podem trigar una mica.
]]>Sisplau, feu una ullada a les PMF del Telegram]]>. Tenen resposta a la majoria de preguntes i també consells importants per a la resolució de problemes]]>.
Pregunta-ho a un voluntari PMF del Telegram https://telegram.org/faq Voleu eliminar la localització? El fitxer de localització no és vàlid Activat - Desactivat + Inhabilitat Servei de notificacions Si Google Play Services us és suficient per rebre notificacions, podeu desactivar el Servei de Notificacions aquí. De totes maneres recomanem deixar-lo activat per mantenir l\'app en segon pla i rebre notificacions a l\'instant. Ordena per @@ -272,8 +320,8 @@ Número sobre la icona Curta Llarga - Definit pel sistema - Definit per l\'aplicació + Definida pel sistema + Definida per l\'aplicació Baixada automàtica de fitxers Amb connexió de dades mòbils Amb connexió Wi-Fi @@ -297,6 +345,28 @@ Altres Inhabilitades Inhabilitada + Inhabilitat + Inactiva + Sons dins del xat + Per defecte + Per defecte + Notificacions intel·ligents + Inhabilitat + So al màxim %1$s durant %2$s + So al màxim + vegades + durant + minuts + + Sessions actives + Sessió actual + No hi ha cap altra sessió activa + Podeu entrar al Telegram des d\'un altre telèfon mòbil, tauleta i dispositius de sobretaula, usant el mateix número de telèfon. Totes les dades seran instantàniament sincronitzades. + Sessions actives + Controleu les sessions en altres dispositius. + Pressioneu sobre una sessió per finalitzar-la. + Voleu tancar aquesta sessió? + aplicació no oficial Codi d\'accés Canvia el codi d\'accés @@ -305,6 +375,7 @@ PIN Contrasenya Introduïu el codi d\'accés actual + Introduïu un codi d\'accés Introduïu un nou codi d\'accés Introduïu el codi d\'accés Torneu a introduir el nou codi d\'accés @@ -312,7 +383,7 @@ Els codis d\'accés no coincideixen Autoblocatge Demana el codi d\'accés en absentar-me. - a %1$s + en %1$s Inhabilitat Compartiu fotos i vídeos a aquest xat i accediu-hi des de qualsevol dispositiu. @@ -325,15 +396,20 @@ Híbrid m lluny km lluny - Envia la ubicació - Comparteix la ubicació + Envieu la vostra ubicació actual + Envia la ubicació seleccionada + Ubicació + Precís a %1$s + O TRIEU UN LLOC Mostra tots els fitxers Desa a la galeria %1$d de %2$d Galeria Totes les fotos + Tots els vídeos No hi ha fotos encara + Encara no hi ha vídeos Descarregueu els fitxers primer Cap foto recent No hi ha GIF recents @@ -355,9 +431,69 @@ Gra Nitidesa Difuminat + Inactiu + Lineal + Radial Voleu suprimir aquesta foto? Voleu suprimir aquest vídeo? Voleu descartar els canvis? + Voleu esborrar l\'historial de cerca? + Esborra + Fotos + Vídeo + Afegiu una llegenda... + Llegenda de la foto + Llegenda del vídeo + + Verificació en dos passos + Configura una contrasenya addicional + Podeu configurar una contrasenya que se us demanarà quan inicieu sessió en un nou dispositiu a més del codi que rebreu per SMS. + Contrasenya + Introduïu la contrasenya + Introduïu una contrasenya + Introduïu la nova contrasenya + Introduïu la contrasenya de nou + Correu de recuperació + El vostre correu + Afegiu un correu vàlid. És l\'única manera de recuperar una contrasenya perduda. + Omet + Avís + No, de debò.\n\nSi oblideu la contrasenya, perdreu l\'accés al vostre compte de Telegram. No hi haurà cap manera de restaurar-lo. + Ja gaire acabem! + Comproveu la bústia de correu electrònic (no oblideu la carpeta brossa) per acabar de configurar la verificació en dos passos. + Correcte! + S\'ha activat la contrasenya per la verificació en dos passos. + Canvia la contrasenya + Desactiva la contrasenya + Configura un correu de recuperació + Canvia el correu de recuperació + Segur que voleu desactivar la contrasenya? + Pista de la contrasenya + Creeu una pista per a la contrasenya + Les contrasenyes no concorden + Interromp la configuració de la verificació en dos passos + Seguiu aquests passos per configurar la verificació en dos passos:\n\n1. Reviseu la bústia de correu electrònic (no oblideu la carpeta de correu brossa)\n%1$s\n\n2. Feu clic a l\'enllaç de validació. + La pista ha de ser diferent de la contrasenya + Correu electrònic no vàlid + Ho sentim + Atès que no heu proporcionat una adreça electrònica de recuperació en establir la contrasenya, les opcions disponibles són recordar la contrasenya o restablir el compte. + Us hem enviat un codi de recuperació a l\'adreça de correu electrònic proporcionada:\n\n%1$s + Reviseu la bústia de correu electrònic i introduïu el codi de 6 dígits que us hem enviat. + Teniu dificultats per accedir al vostre correu electrònic %1$s? + Si no podeu recuperar l\'accés al vostre correu electrònic, les opcions disponibles són recordar la contrasenya o restablir el compte. + RESTABLEIX EL MEU COMPTE + Si procediu amb el restabliment del vostre compte, perdreu tots els xats i missatges, i també tots els fitxers que heu compartit. + Avís + Aquesta acció no es pot desfer.\n\nSi restabliu el compte, tots els vostres missatges i xats se suprimiran. + Restableix + Contrasenya + Heu habilitat la Verificació en dos passos, per tant el vostre compte està protegit amb una contrasenya addicional. + Heu oblidat la contrasenya? + Recuperació de la contrasenya + Codi + Contrasenya desactivada + Heu habilitat la Verificació en dos passos.\nEs requerirà la contrasenya que heu establert aquí per iniciar sessió a Telegram. + La vostra adreça electrònica de recuperació %1$s encara no és activa i està pendent de confirmació. Privadesa i seguretat Privadesa @@ -396,12 +532,23 @@ Vídeo editat S\'està enviant el vídeo... Comprimeix el vídeo + + bot + Comparteix + Afegeix-lo a un grup + Configuració + Ajuda + té accés als missatges + no té accés als missatges + Què pot fer aquest bot? + INICIA Endavant Enrere Fet Obre Cancel·la + Tanca Afegeix Edita Envia @@ -417,6 +564,8 @@ D\'acord RETALLA + Us heu unit al grup via enllaç d\'invitació + un1 s\'ha unit al grup via l\'enllaç d\'invitació un1 ha fet fora un2 un1 ha abandonat el grup un1 ha afegit un2 @@ -434,7 +583,8 @@ un1 us ha fet fora un1 us ha afegit un1 ha tornat al grup - Aquest missatge no és compatible amb la vostra versió del Telegram. Actualitzeu l\'app per veure\'l: http://telegram.org/update + Heu tornat al grup + Aquest missatge no és compatible amb la vostra versió del Telegram. Actualitzeu l\'aplicació per veure\'l: https://telegram.org/update Foto Vídeo Ubicació @@ -449,16 +599,20 @@ Número de telèfon no vàlid El codi ha vençut. Torneu a iniciar la sessió. Heu excedit el nombre d\'intents. Torneu-ho a provar més tard. + Massa intents, torneu-ho a provar-ho d\'aquí %1$s Codi no vàlid Nom no vàlid Cognoms no vàlids S\'està carregant... No teniu cap reproductor de vídeo. Instal·leu-ne un per continuar - Envieu un missatge a sms@telegram.org i expliqueu-nos el problema. + Envieu un correu a sms@stel.com i expliqueu-nos quin és el problema. No teniu cap aplicació que permeti obrir fitxers de tipus MIME «%1$s». Instal·leu-ne una per continuar Aquest usuari encara no té el Telegram. Voleu enviar-li una invitació? N\'esteu segur? - Voleu afegir %1$s al grup?\n\nNúmero d\'últims missatges a reenviar: + Voleu afegir %1$s al grup %2$s? + Nombre d\'últims missatges a reenviar: + Voleu afegir %1$s al grup? + Aquest usuari ja és en aquest grup Voleu reenviar els missatges a %1$s? Voleu enviar els missatges a %1$s? Esteu segur que voleu sortir?\n\nPodeu utilitzar igualment el Telegram en tots els vostres dispositius alhora.\n\nRecordeu que en tancar la sessió s\'eliminen els Xats Secrets. @@ -476,6 +630,8 @@ Voleu enviar els missatges a %1$s? Voleu reenviar els missatges a %1$s? Aquesta característica no es troba disponible al teu país. + No hi ha cap compte de Telegram amb aquest nom d\'usuari. + Aquest bot no pot unir-se a grups. Plus Messenger Ràpid @@ -513,10 +669,10 @@ i %1$d persones més estan escrivint no hi ha missatges nous %1$d missatge nou - %1$d missatge nou - %1$d missatge nou - %1$d missatge nou - %1$d missatge nou + %1$d missatges nous + %1$d missatges nous + %1$d missatges nous + %1$d missatges nous no hi ha missatges %1$d missatge %1$d missatges @@ -583,11 +739,90 @@ %1$d usuaris %1$d usuaris %1$d usuaris + %1$d vegades + %1$d vegada + %1$d vegades + %1$d vegades + %1$d vegades + %1$d vegades + %1$d metres + %1$d metre + %1$d metres + %1$d metres + %1$d metres + %1$d metres + %1$d adhesius + %1$d adhesiu + %1$d adhesius + %1$d adhesius + %1$d adhesius + %1$d adhesius + %1$d fotos + %1$d foto + %1$d fotos + %1$d fotos + %1$d fotos + %1$d fotos + + %1$d missatges a reenviar + Missatge a reenviar + %1$d missatges a reenviar + %1$d missatges a reenviar + %1$d missatges a reenviar + %1$d missatges a reenviar + %1$d fitxers a reenviar + Fitxer a reenviar + %1$d fitxers a reenviar + %1$d fitxers a reenviar + %1$d fitxers a reenviar + %1$d fitxers a reenviar + %1$d fotos a reenviar + Foto a reenviar + %1$d fotos a reenviar + %1$d fotos a reenviar + %1$d fotos a reenviar + %1$d fotos a reenviar + %1$d vídeos a reenviar + Vídeo a reenviar + %1$d vídeos a reenviar + %1$d vídeos a reenviar + %1$d vídeos a reenviar + %1$d vídeos a reenviar + %1$d àudios a reenviar + Àudio a reenviar + %1$d àudios a reenviar + %1$d àudios a reenviar + %1$d àudios a reenviar + %1$d àudios a reenviar + %1$d ubicacions a reenviar + Ubicació a reenviar + %1$d ubicacions a reenviar + %1$d ubicacions a reenviar + %1$d ubicacions a reenviar + %1$d ubicacions a reenviar + %1$d contactes a reenviar + Contacte a reenviar + %1$d contactes a reenviar + %1$d contactes a reenviar + %1$d contactes a reenviar + %1$d contactes a reenviar + %1$d adhesius a reenviar + Adhesiu a reenviar + %1$d adhesius a reenviar + %1$d adhesius a reenviar + %1$d adhesius a reenviar + %1$d adhesius a reenviar + i %1$d altres + i %1$d altre + i %1$d altres + i %1$d altres + i %1$d altres + i %1$d altres MMMM \'del\' yyyy dd MMM - dd.MM.yy - dd.MM.yyyy + dd-MM-yy + dd-MM-yyyy d MMMM d MMMM \'del\' yyyy EEE diff --git a/TMessagesProj/src/main/res/values-de/strings.xml b/TMessagesProj/src/main/res/values-de/strings.xml index 88c1198c..8ebca550 100644 --- a/TMessagesProj/src/main/res/values-de/strings.xml +++ b/TMessagesProj/src/main/res/values-de/strings.xml @@ -65,6 +65,11 @@ Du hast eine Broadcast Liste erstellt Empfänger hinzufügen Aus Broadcast Liste entfernen + + Bitte füge Musikdateien einfach deiner Android Musikbibliothek hinzu, um sie hier zu sehen. + Musik + Unbekannter Künstler + Unbekannter Titel Datei auswählen Freier Speicher: %1$s von %2$s @@ -121,6 +126,7 @@ Diesen Chat löschen WISCHEN UM ABZUBRECHEN In Downloads speichern + Musik speichern Teilen Sprachdatei benutzen Nicht unterstützte Datei @@ -208,7 +214,7 @@ Geteilte Medien Einstellungen Mitglied hinzufügen - Gruppe löschen und verlassen + Löschen und Gruppe verlassen Mitteilungen Aus der Gruppe entfernen @@ -347,6 +353,7 @@ Aus In-Chat-Töne Standard + Standard Intelligente Benachrichtigungen Deaktiviert Höchstens %1$s innerhalb von %2$s @@ -827,8 +834,8 @@ h:mm a %1$s um %2$s - Plus Messenger für Android wurde aktualisiert. Neu in Version 3.0:\n\n- Neue Tabs im Sticker Panel für alle deine eigenen Sticker-Pakete. Füge neue Sticker wie beispielsweise https://telegram.me/addstickers/Animals hinzu.\n- Neue Bot API, für alle kostenlos verfügbar. Kannst du programmieren? Erstelle deine eigenen Bots für Spiele, Dienste oder Integrationen. Mehr dazu unter https://telegram.org/blog/bot-revolution\n- Überprüfe, lade herunter und installiere die Themes for Plus Messenger App. Neue Themen jeden Tag:\n https://play.google.com/store/apps/details?id=es.rafalense.themes - 576 + Plus Messenger für Android wurde aktualisiert. Neu in Version 3.1:\n\n- Direkte Suche in Chats.\n- In Chats versteckt sich ein komplett neues Menü hinter der Büroklammer. Nun kann man dort auch Musik und Kontakte versenden.\n- In-App Medienwiedergabe für YouTube, Vimeo, SoundCloud, etc. optimiert und neuer Player für Audiodateien.\n\nMehr dazu unter:\nhttps://telegram.org/blog/search-and-media + 583 diff --git a/TMessagesProj/src/main/res/values-es/strings.xml b/TMessagesProj/src/main/res/values-es/strings.xml index 1e45fea9..36da5c70 100644 --- a/TMessagesProj/src/main/res/values-es/strings.xml +++ b/TMessagesProj/src/main/res/values-es/strings.xml @@ -65,6 +65,11 @@ Creaste una lista de difusión Añadir destinatario Quitar de la lista de difusión + + Por favor, añade archivos a la carpeta de música en tu dispositivo para verlos aquí. + Música + Artista desconocido + Título desconocido Elegir archivo %1$s de %2$s libres @@ -121,6 +126,7 @@ Eliminar este chat DESLIZA PARA CANCELAR Guardar en descargas + Guardar en música Compartir Aplicar traducción Adjunto no soportado @@ -347,6 +353,7 @@ Apagado Sonidos en el chat Por defecto + Por defecto Notificaciones inteligentes Desactivadas Sonar como máximo %1$s en %2$s @@ -827,10 +834,10 @@ h:mm a %1$s a las %2$s - Plus Messenger para Android fue actualizada. Novedades en la versión 3.0:\n\n- Pestañas dedicadas para cada uno de tus packs de stickers personalizados en el panel de stickers. Añade stickers personalizados como: https://telegram.me/addstickers/Animals\n- Nueva API para bots, gratis para todos. Si eres un ingeniero, crea tus propios bots para juegos, servicios o integraciones. Conoce más en: https://telegram.org/blog/bot-revolution\n - Ojea, descarga y aplica temas para Plus Messenger. Nuevos temas cada día:\n https://play.google.com/store/apps/details?id=es.rafalense.themes - 576 + Plus Messenger para Android fue actualizada. Novedades en la versión 3.1:\n\n- Busca mensajes dentro de un chat en específico.\n- Menú para adjuntar completamente rediseñado. Envía contactos y archivos de audio directamente desde el menú para adjuntar.\n- Reproducción de multimedia dentro de la aplicación mejorada (YouTube, Vimeo, SoundCloud etc.), nuevo reproductor para archivos de audio largos.\n\nMás sobre esta actualización:\nhttps://telegram.org/blog/search-and-media + 583 - \n\nNovedades en 3.0.1.5:\n\n- Arregladas opciones para compartir música y sticker\n- Añadida opción para compartir tlf de un contacto\n - Añadida opción para añadir miembro directamente desde las opciones de grupo\n- Añadida opción para silenciar o activar notificaciones desde pantalla principal\n- Solución de errores + \n\nNovedades en 3.1.1.3:\n\n- Nuevo MOD para ajustar color de estado en pantalla Ajustes\n- Solución de errores Plus Messenger para Android Tematización ¡Color hexadecimal inválido! @@ -957,4 +964,5 @@ Usa fuente del teléfono Plus Messenger se reiniciará Color de icono de grupo + Color de nombre de contacto compartido \ No newline at end of file diff --git a/TMessagesProj/src/main/res/values-fr/strings.xml b/TMessagesProj/src/main/res/values-fr/strings.xml index 310043e7..19f7879a 100644 --- a/TMessagesProj/src/main/res/values-fr/strings.xml +++ b/TMessagesProj/src/main/res/values-fr/strings.xml @@ -62,6 +62,11 @@ Vous avez créé un liste de diffusion Ajouter un destinataire Supprimer de la liste de diffusion + + Merci d\'ajouter des fichiers à votre bibliothèque musicale sur votre appareil pour les voir ici. + Musique + Artiste inconnu + Titre inconnu Sélectionnez un fichier %1$s sur %2$s disponible @@ -96,6 +101,7 @@ Localisation Vidéo Fichier + Appareil photo Aucun message pour l\'instant… Message transféré De @@ -118,6 +124,7 @@ GLISSER POUR ANNULER Enregistrer dans les téléchargements + Enregistrer dans musique Partager Appliquer le fichier de localisation Type de pièce-jointe inconnu @@ -126,6 +133,7 @@ Obtention d\'informations sur le lien… Ouvrir dans un navigateur Copier l\'URL + Envoyer %1$s %1$s a défini l\'auto-destruction des messages à %2$s Vous avez défini l\'auto-destruction des messages à %1$s @@ -525,6 +533,16 @@ Vidéo éditée Envoi de la vidéo... Compresser la vidéo + + bot + Partager + Ajouter au groupe + Paramètres + Aide + a accès aux messages + n\'a pas accès aux messages + Que peux faire ce bot ? + DEMARRER Suivant Précédent @@ -567,7 +585,7 @@ un1 vous a ajouté un1 est revenu dans le groupe Vous êtes revenu au groupe - Ce message n\'est pas supporté dans votre version de Telegram. Veuillez mettre à jour l\'appli pour le voir: http://telegram.org/update + Ce message n\'est pas supporté sur votre version de Telegram. Mettez à jour l\'application pour le voir: https://telegram.org/update Photo Vidéo Localisation @@ -592,7 +610,10 @@ Vous ne disposez d\'aucune application compatible avec le type de fichier \'%1$s\'. Veuillez en installer une pour continuer Cet utilisateur ne dispose pas de Telegram, envoyer une invitation ? Êtes-vous sûr ? - Ajouter %1$s au groupe?\n\nNombre des derniers messages à transmettre : + Ajouter %1$s au groupe %2$s? + Nombre des derniers messages à transmettre : + Ajouter %1$s au groupe ? + L\'utilisateur est déjà dans le groupe. Transférer le message à %1$s ? Envoyer des messages à %1$s ? Êtes-vous sûr de vouloir vous déconnecter?\n\nNotez que vous pouvez utiliser Telegram simultanément sur tous vos appareils.\n\nPour rappel, une déconnexion détruit toutes vos Conversations Secrètes. @@ -610,6 +631,8 @@ Envoyer des messages à %1$s ? Transférer les messages à %1$s ? Désolé, cette option n\'est actuellement pas disponible dans votre pays. + Il n\'y a pas de compte Telegram associé à cet utilisateur. + Ce bot ne peut pas rejoindre des groupes. Plus Messenger Rapide @@ -735,6 +758,12 @@ %1$d stickers %1$d stickers %1$d stickers + %1$d photos + %1$d photo + %1$d photos + %1$d photos + %1$d photos + %1$d photos %1$d messages transférés Message transféré @@ -803,7 +832,7 @@ %1$s à %2$s - 547 + 583 Plus Messenger pour Android Thème diff --git a/TMessagesProj/src/main/res/values-gl/strings.xml b/TMessagesProj/src/main/res/values-gl/strings.xml index 3f7445ad..c124aca6 100644 --- a/TMessagesProj/src/main/res/values-gl/strings.xml +++ b/TMessagesProj/src/main/res/values-gl/strings.xml @@ -22,7 +22,7 @@ e introduce o teu número.
O teu nome Pon o teu nome e apelidos - Nome (requerido) + Nome (requirido) Apelidos (opcional) Cancelar o rexistro @@ -40,7 +40,7 @@ e introduce o teu número. Agardando a que %s se conecte... Chat secreto cancelado Intercambiando as claves de cifrado... - %s uníuse á teu chat secreto. + %s uniuse ao teu chat secreto. Unícheste ao chat secreto. Borrar o historial Eliminar e saír @@ -56,14 +56,16 @@ e introduce o teu número. Non silenciar En %1$s Desactivar + HASHTAGS Nova difusión Introduce o nome da lista Creaches unha lista de difusión Engadir destinatario Eliminar da lista de difusión + - Seleccionar un arquivo + Seleccionar un ficheiro %1$s libres de %2$s Erro descoñecido Erro ao acceder @@ -82,12 +84,21 @@ e introduce o teu número. escribindo... está a escribir... están a escribir... + %1$s está a gravar audio... + %1$s está a enviar unha foto + %1$s está a enviar video + %1$s está a enviar un ficheiro... + gravando audio... + enviando foto... + enviando vídeo... + enviando ficheiro Tes algunha pregunta\nsobre Telegram? Tira unha foto Galería Localización Vídeo Ficheiro + Cámara Aínda non hai mensaxes... Mensaxe reenviada De @@ -114,6 +125,10 @@ e introduce o teu número. Adxunto non soportado Establecer a autodestrución Notificacións de servizos + Obtendo información da ligazón... + Abrir no navegador + Copiar URL + Enviar %1$s %1$s puxo o temporizador para a autodestrución en %2$s Puxeches o temporizador para a autodestrución en %1$s @@ -147,17 +162,9 @@ e introduce o teu número. %1$s eliminoute do grupo %2$s %1$s abandonou o grupo %2$s %1$s uniuse ao Telegram! - %1$s, -Detectamos un acceso á túa conta desde un dispositivo novo o %2$s - -Dispositivo: %3$s -Localización: %4$s - -Se non foches ti, podes ir a Axustes - Privacidade e seguridade - Cancelar todos os outros accesos. - -Grazas, -O equipo de Telegram + %1$s,\nDetectamos un acceso á túa conta desde un dispositivo novo o %2$s\n\nDispositivo: %3$s\nLocalización: %4$s\n\nSe non fuches ti, vai a Axustes - Privacidade e Seguridade - Pechar todas as outras conexións.\n\nSe cres que alguén iniciou sesión coa túa conta, podes activar a verificación de dous pasos nos axustes de Privacidade e Seguridade.\n\nGrazas,\nO equipo de Telegram %1$s actualizou a foto de perfil + %1$s uniuse ao grupo %2$s por medio da ligazón de invitación Responder Responder a %1$s Responder a %1$s @@ -172,17 +179,30 @@ O equipo de Telegram últ. vez últ. vez Invitar amigos - BÚSQUEDA GLOBAL - últ. conexión recentemente + BUSCA GLOBAL + últ. vez recentemente últ. vez hai uns días últ. vez hai unhas semanas - conexión hai moito tempo + últ. vez hai moito tempo Nova mensaxe Enviar mensaxe a... Pon o nome do grupo Nome do grupo %1$d/%2$d membros + Queres unirte ao grupo \'%1$s\'? + Sentímolo, este grupo alcanzou o límite de usuarios. + Sentímolo, o grupo non existe. + Ligazón copiada ao portapapeis + Invitar ao grupo mediante unha ligazón + Ligazón de invitación + Estás seguro de anular esta ligazón? unha vez anulada ninguén mais poderá unirse ao grupo usándoa. + A ligazón de invitación anterior agora está inactiva. Unha nova ligazón foi xerada. + Anular + Anular a ligazón + Copiar a ligazón + Compartir a ligazón + Calquera que teña instalado Telegram poderá unirse ao teu grupo premendo esta ligazón. Multimedia compartida Axustes @@ -212,18 +232,32 @@ O equipo de Telegram Información Teléfono - Alcume - O teu alcume - Síntoo, este alcume xa está en uso. - Síntoo, este alcume é inválido. - Un alcume debe ter polo menos 5 caracteres. - O alcume non debe exceder os 32 caracteres. - Sentímolo, un alcume non pode comezar cun número. - Podes escoller un alcume para o ]]>Plus Messenger]]>. Se o fas, a xente poderá atoparte por este nome e contactar contigo sen coñecer o teu número de teléfono.
]]>Podes usar os caracteres ]]>a–z]]>, ]]>0–9]]> e guións baixos. A lonxitude mínima son ]]>5]]> caracteres.
- Comprobando alcume... - %1$s está disponible. + Alias + O teu alias + Sentímolo, este alias xa está en uso. + Sentímolo, este alias é inválido. + Un alias debe ter polo menos 5 caracteres. + O alias non debe exceder os 32 caracteres. + Sentímolo, un alias non pode comezar cun número. + Podes escoller un alias para o ]]>Telegram]]>. Se o fas, a xente poderá atoparte por este nome e contactar contigo sen coñecer o teu número de teléfono.
]]>Podes usar os caracteres ]]>a–z]]>, ]]>0–9]]> e guións baixos. A lonxitude mínima son ]]>5]]> caracteres.
+ Comprobando alias... + %1$s está dispoñible. Ningún Produciuse un erro. + + Stickers + Os artistas poden engadir os seus propios paquetes de stickers usando o bot @stickers. Os usuarios poden engadir stickers premendo e elixindo \"Engadir stickers\". + Engadir Stickers + Engadir aos Stickers + Stickers non encontrados + Stickers eliminados + Engadidos novos stickers + Ocultar + Mostrar + Compartir + Copiar ligazón + Quitar + Sen stickers aínda Restaurar os axustes de notificacións ás predefinicións Tamaño do texto @@ -232,7 +266,7 @@ O equipo de Telegram Desbloquear Mantén premido sobre o usuario para desbloquealo. Non hai usuarios bloqueados - Notificacións das nensaxes + Notificacións das mensaxes Aviso Vista previa da mensaxe Notificacións os grupos @@ -251,15 +285,16 @@ O equipo de Telegram Sen son Predefinicións Asistencia + Só se está silenciado Fondo de chat Mensaxes Enviar con INTRO - Pechas todas as outras conexións + Pechar todas as outras conexións Actividades Un contacto uniuse a Telegram PEBBLE Idioma - Por favor, ten en conta que a asistencia técnica do Telegram proporciónana persoas voluntarias. Tentamos responder o antes posíbel, pero pode demorar un tempo.
]]>Bótalle un ollo ás Preguntas Frecuentes do Telegram]]>: aparecen respostas ás dúbidas máis habituais e importantes consellos para a resolución de problemas]]>.
+ Por favor, ten en conta que a asistencia técnica do Telegram lévana a cabo persoas voluntarias. Tentamos responder o antes posíbel, pero pode levar un tempo.
]]>Por favor, bótalle un ollo ás Preguntas Frecuentes de Telegram]]>: aparecen respostas ás dúbidas máis habituais e importantes consellos para a resolución de problemas]]>.
Pregunta a un voluntario Preguntas frecuentes https://telegram.org/faq @@ -307,14 +342,36 @@ O equipo de Telegram Outro Desactivadas Desactivadas + Desactivado + Apagado + Sons no chat + Predeterminado + Notificacións intelixentes + Desactivado + Soar como máximo %1$s en %2$s + Soar como máximo + veces + en + minutos + + Conexións activas + Conexión actual + Non hai outras conexións activas + Pode iniciar sesión en Telegram desde outro móbil, tableta ou PC usando o mesmo número de teléfono. Todas as súas conversas estarán sincronizadas ao instante. + Conexións activas + Controla as túas conexións noutros dispositivos. + Preme nunha conexións para pechala. + Pechar esta conexión? + aplicativo non oficial - Código + Codigo de acceso Cambiar código - Cando configuras un código, aparece un cadeado na pantalla de chats. Touca sobre el para bloquear e desbloquear a aplicación.\n\nNota: se esqueces o código, terás que eliminar e reinstalar a aplicación. Perderás todos os chats secretos. - Agora verás un cadeado na pantalla de chats. Púlsao para bloquear o teu Telegram co teu novo código. + Cando configuras un código, aparece un cadeado na pantalla de chats. Preme nel para bloquear e desbloquear a aplicación.\n\nNota: se esqueces o código, terás que eliminar e reinstalar a aplicación. Perderás todos os chats secretos. + Agora verás un cadeado na pantalla de chats. Prémeo para bloquear o teu Telegram co teu novo código. PIN Contrasinal Pon o teu código de acceso + Introduce un código de acceso Pon o teu novo código de acceso Introduce o código Pon, outra vez, o teu novo código @@ -335,15 +392,20 @@ O equipo de Telegram Híbrido m de distancia km de distancia - Enviar a localización - Compartir a localización + Enviar a túa localización + Enviar a localización seleccionada + Localización + Exacto a %1$s + OU ESCOLLE UN LUGAR Mostrar todas as fotos Gardar na galería %1$d de %2$d Galería Todas as fotos + Todos os vídeos Non hai fotos + Non hai vídeos Descargar primeiro o multimedia Non hai fotos recentes Non hai GIF recentes @@ -362,12 +424,72 @@ O equipo de Telegram Saturación Viñeta Sombras - Grano + Gran Nitidez Desenfoque + Apagado + Lineal + Radial Queres eliminar esta foto? Queres eliminar este vídeo? Descartar cambios? + Queres borrar o historial de busca? + Borrar + Fotos + Vídeos + Engadir comentario + Comentario de foto + Comentario de vídeo + + Verificación de dous pasos + Activar contrasinal adicional + Podes activar un contrasinal que serache requirido, ademais do código que che enviamos por SMS, cando inicias sesión nun novo dispositivo. + O teu contrasinal + Introduce o teu contrasinal + Introduce un contrasinal + Introduce o novo contrasinal + Introduce outra vez o novo contrasinal + E-mail de recuperación + O teu e-mail + Engade un enderezo de correo-e válido. É o único xeito de recuperar un contrasinal esquecido. + Omitir + Atención + En serio.\n\nSe esqueces o contrasinal perderás o acceso a túa conta de Telegram. Non hai xeito de recuperala. + Case está! + Revisa o teu correo-e (non esquezas o cartafol de correo lixo) para completar a activación da verificación de dous pasos. + Conseguíchelo! + O teu contrasinal para a verificación de dous pasos está activo agora. + Cambiar contrasinal + Desactivar contrasinal + Establecer correo-e de recuperación + Cambiar correo-e de recuperación + Estás seguro de querer desactivar o teu contrasinal? + Pista para o contrasinal + Crea unha pista para recuperar o contrasinal + Os contrasinais non coinciden + Cancelar o establecemento da verificación de dous pasos + Segue estes pasos para completar a verificación de dous pasos:\n\n1. Revisa o teu correo-e (non esquezas o cartafol do correo lixo)\n%1$s\n\n2. Preme na ligazón de validación. + A pista ten que ser diferente do contrasinal + Correo-e inválido + Sentímolo + Ao non fornecer un correo-e de recuperación cando estableciches o contrasinal, as opcións que tes son lembrar o teu contrasinal ou reiniciar a túa conta. + Enviamos un código de recuperación á conta de correo-e que nos forneceches:\n\n%1$s + Revisa o teu correo-e e introduce o código de 6 díxitos que che enviamos. + Tes problemas para acceder a túa conta de correo-e %1$s + Se non podes restablecer o acceso a túa conta de correo-e, as opcións que tes son lembrar o teu contrasinal ou reiniciar a túa conta. + REINICIAR A MIÑA CONTA + Perderás todas as túas conversas e mensaxes, e tamén as fotos, vídeos e calquera outro ficheiro compartido se reinicias a túa conta. + Atención + Esta acción non se pode desfacer.\n\nSe reinicias a túa conta, todas as túas mensaxes e conversas serán eliminadas. + Reiniciar + Contrasinal + Activaches a verificación de dous pasos, polo tanto a túa conta está protexida cun contrasinal adicional. + Esqueciches o contrasinal? + Recuperación do contrasinal + Código + Contrasinal desactivado + Activaches a verificación de dous pasos.\nPrecisarás o contrasinal que introduciches aquí para iniciar sesión na túa conta de Telegram. + O teu enderezo de correo-e de recuperación %1$s aínda non foi activado, está pendente de confirmación. Privacidade e seguridade Privacidade @@ -388,7 +510,7 @@ O equipo de Telegram Elixe quen pode ver a túa última conexión. Quen pode ver a última conexión? Engadir excepcións - Importante: Non verása última conexión das persoas coas que non compartes a túa. No seu lugar verás unha aproximación (recentemente, hai uns días, hai unhas semanas). + Importante: Non verás a última conexión das persoas coas que non compartes a túa. No seu lugar verás unha aproximación (recentemente, hai uns días, hai unhas semanas). Compartir con Non compartir con Estes axustes anularán os valores de arriba. @@ -406,12 +528,23 @@ O equipo de Telegram Vídeo editado Enviando o vídeo... Comprimir vídeo + + bot + Compartir + Engadir a un grupo + Axustes + Axuda + ten acceso ás mensaxes + non ten acceso ás mensaxes + Que pode facer este bot? + INICIAR Seguinte Atrás Feito Abrir Cancelar + Pechar Engadir Editar Enviar @@ -425,8 +558,10 @@ O equipo de Telegram Eliminar a foto Definir Aceptar - CORTAR + RECORTAR + Unícheste ao grupo por medio da ligazón de invitación + un1 uniuse ao grupo por medio da ligazón de invitación un1 eliminou a un2 un1 abandonou o grupo un1 engadiu a un2 @@ -444,9 +579,8 @@ O equipo de Telegram un1 eliminoute un1 engadiute un1 volveu ao grupo - Esta mensaxe non é compatíbel coa versión do Telegram que utilizas. -Actualiza a aplicación para poderes vela: -http://telegram.org/update + Volviches ao grupo + Esta mensaxe non é compatíbel coa versión de Telegram que utilizas. Actualiza o aplicativo para poderes vela: https://telegram.org/update Foto Vídeo Localización @@ -461,24 +595,24 @@ http://telegram.org/update O número de teléfono non é válido. Caducou o código, conéctate de novo Demasiados intentos, proba máis tarde + Demasiados intentos, téntao de novo en %1$s Código non válido Nome non válido Apelidos non válidos Cargando... Non tes reprodutor de vídeo, instala un para continuares - Por favor, envía un correo electrónico a sms@telegram.org e explica o teu problema. + Por favor, envía un correo electrónico a sms@stel.com e cóntanos o teu problema. Non tes aplicacións instaladas que poidan manexar o tipo de ficheiro «%1$s», intala unha para continuar Este usuario aínda non ten Telegram, queres convidalo? Estás seguro? - Queres engadir a %1$s ao grupo?\n\nNúmero das últimas mensaxes a reenviar: - - - - + Queres engadir a %1$s ao grupo %2$s? + Número das últimas mensaxes a reenviar: + Engadir a %1$s ao grupo? + Este usuario xa é membro deste grupo. Queres reenviar mensaxes a %1$s? Desexas enviar as mensaxes a %1$s? Estás seguro de saír da sesión?\n\nTen en conta que podes usar o Telegram en todos os dispositivos á vez.\n\nLembra, ao saír da sesión eliminas as conversas secretas. - Estás seguro de cancelar todos os outros accesos? + Estás seguro de pechar todos as outras conexións? Estás seguro de eliminar e abandonar o grupo? Estás seguro de eliminar esta conversa? Estás seguro de compartir a túa información de contacto? @@ -492,6 +626,8 @@ http://telegram.org/update Desexas enviar as mensaxes a %1$s? Desexas reenviar as mensaxes a %1$s? Sentímolo, esta funcionalidade non está dispoñíbel no teu país. + Non hai unha conta en Telegram con este alcume. + Este bot non pode unirse a grupos. Plus Messenger Rápido @@ -545,7 +681,7 @@ http://telegram.org/update %1$d ítems %1$d ítems %1$d ítems - dende ningún chat + desde ningún chat desde %1$d chat desde %1$d chats desde %1$d chats @@ -599,6 +735,85 @@ http://telegram.org/update %1$d usuarios %1$d usuarios %1$d usuarios + %1$d veces + %1$d veces + %1$d veces + %1$d veces + %1$d veces + %1$d veces + %1$d metros + %1$d metro + %1$d metros + %1$d metros + %1$d metros + %1$d metros + %1$d stickers + %1$d sticker + %1$d stickers + %1$d stickers + %1$d stickers + %1$d stickers + %1$d fotos + %1$d foto + %1$d fotos + %1$d fotos + %1$d fotos + %1$d fotos + + %1$d mensaxes reenviadas + Mensaxe adxunta + %1$d mensaxes adxuntas + %1$d mensaxes adxuntas + %1$d mensaxes adxuntas + %1$d mensaxes adxuntas + %1$d ficheiros adxuntos + Ficheiro adxunto + %1$d ficheiros adxuntos + %1$d ficheiros adxuntos + %1$d ficheiros adxuntos + %1$d ficheiros adxuntos + %1$d fotos adxuntas + Foto adxunta + %1$d fotos adxuntas + %1$d fotos adxuntas + %1$d fotos adxuntas + %1$d fotos adxuntas + %1$d fotos adxuntas + Vídeo adxunto + %1$d vídeos adxuntos + %1$d vídeos adxuntos + %1$d vídeos adxuntos + %1$d vídeos adxuntos + %1$d audios adxuntos + Audio adxunto + %1$d audios adxuntos + %1$d audios adxuntos + %1$d audios adxuntos + %1$d audios adxuntos + %1$d localizacións adxuntas + Localización adxunta + %1$d localizacións adxuntas + %1$d localizacións adxuntas + %1$d localizacións adxuntas + %1$d localizacións adxuntas + %1$d localizacións adxuntas + Contacto adxunto + %1$d contactos adxuntos + %1$d contactos adxuntos + %1$d contactos adxuntos + %1$d contactos adxuntos + %1$d stickers adxuntos + Sticker adxunto + %1$d stickers adxuntos + %1$d stickers adxuntos + %1$d stickers adxuntos + %1$d stickers adxuntos + e %1$d outros + e %1$d outro + e outros %1$d + e outros %1$d + e outros %1$d + e outros %1$d MMMM de yyyy dd \'de\' MMM @@ -609,7 +824,7 @@ http://telegram.org/update EEE HH:mm h:mm a - %1$s en %2$s + %1$s ás %2$s Plus Messenger para Android Tematización diff --git a/TMessagesProj/src/main/res/values-hi/strings.xml b/TMessagesProj/src/main/res/values-hi/strings.xml index 5ff3738a..3d7bacae 100644 --- a/TMessagesProj/src/main/res/values-hi/strings.xml +++ b/TMessagesProj/src/main/res/values-hi/strings.xml @@ -515,7 +515,7 @@ %1$s पर %2$s Plus Messenger for Android has been updated. New in Version 3.0:\n\n\n\n- Dedicated tabs for each one of your custom sticker sets in the sticker panel. Add custom stickers like https://telegram.me/addstickers/Animals\n- New bot API, free for everyone. If you\'re an engineer, create your own bots for games, services or integrations. Learn more at https://telegram.org/blog/bot-revolution\n https://play.google.com/store/apps/details?id=es.rafalense.themes - 576 + 583 Android के लिए प्लस मैसेंजर diff --git a/TMessagesProj/src/main/res/values-it/strings.xml b/TMessagesProj/src/main/res/values-it/strings.xml index 163798d0..34340b36 100644 --- a/TMessagesProj/src/main/res/values-it/strings.xml +++ b/TMessagesProj/src/main/res/values-it/strings.xml @@ -65,6 +65,11 @@ Hai creato una lista broadcast Aggiungi destinatario Rimuovi dalla lista broadcast + + Aggiungi file nella libreria musicale del tuo dispositivo per vederli qui. + Musica + Artista sconosciuto + Titolo sconosciuto Seleziona file Liberi %1$s di %2$s @@ -121,6 +126,7 @@ Elimina questa chat ANNULLA Salva nei download + Salva nella musica Condividi Applica traduzione Allegato non supportato @@ -158,7 +164,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 è tornato nel gruppo %2$s %1$s ha rimosso %3$s dal gruppo %2$s %1$s ti ha rimosso dal gruppo %2$s %1$s ha lasciato il gruppo %2$s @@ -284,7 +290,7 @@ Utenti bloccati Disconnetti Nessun suono - Predefinita + Predefinite Supporto Solo se silenzioso Sfondo chat @@ -347,6 +353,7 @@ No Suoni in-chat Predefinito + Predefinita Notifiche intelligenti Disabilitate Suona al massimo %1$s in %2$s @@ -452,12 +459,12 @@ Reinserisci la tua password E-mail di recupero La tua e-mail - Per favore inserisci un\'e-mail valida. È l\'unico modo di recuperare una password dimenticata. + Inserisci un\'e-mail valida. È l\'unico modo di recuperare una password dimenticata. Salta Attenzione No, seriamente.\n\nSe dimentichi la tua password, perderai l\'accesso al tuo account Telegram. Non ci sarà modo di ripristinarlo. Ci siamo quasi! - Per favore controlla la tua e-mail (anche lo spam) per completare la configurazione della verifica in due passaggi. + Controlla la tua e-mail (anche lo spam) per completare la configurazione della verifica in due passaggi. Fatto! La password per la verifica in due passaggi è ora attiva. Cambia password @@ -466,16 +473,16 @@ Cambia e-mail di recupero Sei sicuro di voler disabilitare la tua password? Suggerimento password - Per favore crea un suggerimento per la tua password + Crea un suggerimento per la tua password Le password non corrispondono Annulla configurazione della verifica in due passaggi - Per favore segui questi step per completare la configurazione della verifica in due passaggi:\n\n1. Controlla la tua e-mail (anche lo spam)\n%1$s\n\n2. Clicca sul link di conferma. + Segui questi step per completare la configurazione della verifica in due passaggi:\n\n1. Controlla la tua e-mail (anche lo spam)\n%1$s\n\n2. Clicca sul link di conferma. Il suggerimento deve essere diverso dalla password E-mail non valida Scusa Siccome non hai fornito un\'email di recupero quando hai impostato la tua password, non ti resta che ricordarti la password o ripristinare il tuo account. Abbiamo inviato un codice di ripristino alla e-mail che ci hai fornito:\n\n%1$s - Per favore controlla la tua e-mail e inserisci il codice a 6 cifre che ti abbiamo inviato. + Controlla la tua e-mail e inserisci il codice a 6 cifre che ti abbiamo inviato. Hai problemi ad accedere alla tua e-mail %1$s? Se non puoi ripristinare l\'accesso alla tua e-mail, non ti resta che ricordarti la password o ripristinare il tuo account. RIPRISTINA IL MIO ACCOUNT @@ -579,8 +586,8 @@ Hai creato il gruppo un1 ti ha rimosso un1 ti ha aggiunto - un1 è rientrato nel gruppo - Sei rientrato nel gruppo + un1 è tornato nel gruppo + Sei tornato nel gruppo Questo messaggio non è supportato sulla tua versione di Telegram. Aggiorna l\'applicazione per visualizzarlo: https://telegram.org/update Foto Video @@ -641,7 +648,7 @@ Plus Messenger
]]> consegna i messaggi più]]>velocemente di qualsiasi altra app. Plus Messenger
]]> sarà sempre gratuito.]]>Nessuna pubblicità. Nessun abbonamento. Plus Messenger
]]> protegge i tuoi messaggi]]>dagli attacchi degli hacker. - Plus Messenger]]> non ha limiti sulle dimensioni]]>dei tuoi file multimediali e delle chat. + Plus Messenger]]> non ha limiti di dimensione]]>per le tue chat e i file multimediali. Plus Messenger]]> ti consente di accedere]]>ai messaggi da più dispositivi. Plus Messenger]]> cifra in maniera sicura i messaggi]]>e può far sì che si autodistruggano. Inizia a inviare messaggi @@ -682,12 +689,12 @@ %1$d oggetti %1$d oggetti %1$d oggetti - in nessuna chat - in %1$d chat - in %1$d chat - in %1$d chat - in %1$d chat - in %1$d chat + da nessuna chat + da %1$d chat + da %1$d chat + da %1$d chat + da %1$d chat + da %1$d chat %1$d secondi %1$d secondo %1$d secondi @@ -827,8 +834,8 @@ h:mm a %1$s alle %2$s - Plus Messenger per Android è stato aggiornato. Nuovo nella versione 3.0:\n\n- Pagine dedicate per ognuno dei tuoi pacchetti sticker nel pannello sticker. Aggiunti sticker personalizzati come https://telegram.me/addstickers/Animals\n- Nuova API per i bot, gratis per tutti. Se sei un ingegnere, crea i tuoi bot per giochi, servizi o integrazioni. Scopri di più su https://telegram.org/blog/bot-revolution\n- Scegli, scarica ed applica temi per Plus Messenger. Nuovi temi ogni giorno\n https://play.google.com/store/apps/details?id=es.rafalense.themes - 576 + Plus Messenger per Android si è aggiornato. Nuovo nella versione 3.1:\n\n- Cerca messaggi all\'interno di una specifica chat.\n- Menu degli allegati completamente ridisegnato. Invia contatti e audio direttamente dal menu degli allegati.\n- Riproduzione in-app migliorata (YouTube, Vimeo, SoundCloud etc.), nuovo player per i file audio.\n\nMaggiori informazioni su questo aggiornamento:\nhttps://telegram.org/blog/search-and-media + 583 Plus Messenger per Android diff --git a/TMessagesProj/src/main/res/values-ko/strings.xml b/TMessagesProj/src/main/res/values-ko/strings.xml index 3f1ccf01..1d288d64 100644 --- a/TMessagesProj/src/main/res/values-ko/strings.xml +++ b/TMessagesProj/src/main/res/values-ko/strings.xml @@ -65,6 +65,11 @@ 단체 메시지 리스트를 만들었습니다 받는 사람 추가 리스트에서 제외 + + 음악 라이브러리에 파일을 추가하셔야지만 볼 수 있습니다. + 음악 + 알수 없는 아티스트 + 알 수 없는 제목 파일 선택 %2$s 중 %1$s 남음 @@ -121,6 +126,7 @@ 이 채팅방 삭제 밀어서 취소 다운로드 폴더에 저장 + 음악으로 저장 공유 언어 파일 적용 지원하지 않는 형식입니다 @@ -347,6 +353,7 @@ 채팅중 소리 설정 기본값 + 기본값 스마트 알림 비활성화됨 최대 %1$s번, %2$s번 이내 알림 @@ -827,6 +834,6 @@ a h:mm %1$s %2$s - 텔레그램 안드로이드 버전이 업데이트 되었습니다. 새로운 버전은 3.0 입니다:\n\n- 스티커 패널에 커스텀 스티커별 탭 지원. https://telegram.me/addstickers/Animals 와 같은 커스텀 스티커 추가 기능\n- 신규 봇 API를 무료로 공개합니다. 개발자라면 누구나 게임, 서비스나 통합 봇등 개발이 가능합니다. https://telegram.org/blog/bot-revolution 에서 자세한 사항을 알아보세요. - 576 + 텔레그램 안드로이드 버전이 업데이트 되었습니다. 새로운 버전은 3.1 입니다:\n\n- 특정 대화창에서 검색. \n- 첨부 메뉴 개선. 해당 메뉴에서 바로 연락처, 오디오를 전송 가능. \n- 인앱 미디어 재생 기능 향상 (YouTube, Vimeo, SoundCloud etc). 대용량 오디오 파일 별도 플레이어 기능. \n\nhttps://telegram.org/blog/search-and-media에서 자세한 사항을 알아보세요. + 583 \ No newline at end of file diff --git a/TMessagesProj/src/main/res/values-nl/strings.xml b/TMessagesProj/src/main/res/values-nl/strings.xml index 0d317b5a..8c3bd697 100644 --- a/TMessagesProj/src/main/res/values-nl/strings.xml +++ b/TMessagesProj/src/main/res/values-nl/strings.xml @@ -65,6 +65,11 @@ Je hebt een verzendlijst gemaakt Ontvanger toevoegen Verwijder van verzendlijst + + Voeg bestanden toe aan de muziekbibliotheek op je apparaat om ze hier te zien. + Muziek + Onbekende artiest + Onbekende titel Kies een bestand Vrij: %1$s van %2$s @@ -121,6 +126,7 @@ Chat verwijderen SLEEP OM TE ANNULEREN Opslaan in Downloads + Opslaan in muziek Delen Vertaling toepassen Bestandstype niet ondersteund @@ -347,6 +353,7 @@ Uit Chatgeluiden Standaard + Standaard Slimme meldingen Uitgeschakeld Geluid maximaal %1$s per %2$s @@ -827,8 +834,8 @@ h:mm a %1$s om %2$s - Plus Messenger voor Android is geüpdatet. Nieuw in versie 3.0:\n\n- Tabbladen voor al je eigen stickerbundels in het stickerpaneel. Voeg stickerbundels zoals: https://telegram.me/addstickers/Animals toe.\n- Nieuwe bot-API, gratis voor iedereen. Handig met programmeren? Maak dan je eigen bots voor spelletjes, diensten of integraties. Meer weten? kijk op: https://telegram.org/blog/bot-revolution - 576 + Plus Messenger voor Android is bijgewerkt. Nieuw in versie 3.1:\n\n- Zoek naar berichten in een specifieke chat.\n- Volledig opnieuw ontworpen bijlagemenu. Verstuur contacten en audiobestanden rechtstreeks vanuit het bijlagemenu.\n- Afspelen van media in de app verbeterd (YouTube, Vimeo, SoundCloud, etc.), nieuwe speler voor grote audiobestanden.\n\nMeer weten? Kijk op:\nhttps://telegram.org/blog/search-and-media + 583 Plus Messenger voor Android diff --git a/TMessagesProj/src/main/res/values-pt-rBR/strings.xml b/TMessagesProj/src/main/res/values-pt-rBR/strings.xml index 7b9c66ff..e5be1c22 100644 --- a/TMessagesProj/src/main/res/values-pt-rBR/strings.xml +++ b/TMessagesProj/src/main/res/values-pt-rBR/strings.xml @@ -65,6 +65,11 @@ Você criou uma lista de transmissão Adicionar destinatário Remover da lista de transmissão + + Por favor, adicione arquivos à biblioteca de música de seu dispositivo para vê-los aqui. + Música + Artista desconhecido + Título desconhecido Selecione um Arquivo Disponível %1$s de %2$s @@ -121,6 +126,7 @@ Apagar este chat DESLIZE PARA CANCELAR Salvar em downloads + Salvar em músicas Compartilhar Aplicar arquivo de localização Anexo não suportado @@ -347,6 +353,7 @@ Desativado Sons no Chat Padrão + Padrão Notificações Inteligentes Desativado Tocar no máximo %1$s a cada %2$s @@ -827,11 +834,10 @@ h:mm a %1$s às %2$s - Plus Messenger para Android acaba de ser atualizado. Novo na versão 3.0:\n\n- Abas dedicadas para cada um dos pacotes customizados de stickers no painel de stickers. Adicione stickers customizados como https://telegram.me/addstickers/Animals\n- Nova API de bots, gratuita para todos. Se você for um engenheiro, crie seus próprios bots como @quiz_bot ou @hot_or_bot usando o @botfather. Leia mais em https://telegram.org/blog/bot-revolution\n- Confira, baixe e aplique temas para o app Plus Messenger. Novos temas todos os dias:\n https://play.google.com/store/apps/details?id=es.rafalense.themes - 576 - + Plus Messenger para Android foi atualizado. Novo na versão 3.1:\n\n- Busca por mensagens dentro de um chat específico.\n-Menu de anexo totalmente redesenhado. Envie contatos e arquivos de áudio diretamente do menu de anexo.\n- Reprodução melhorada de mídia dentro do aplicativo (YouTube, Vimeo, SoundCloud, etc.), novo player para grandes arquivos de áudio.\n\nMais sobre a atualização:\nhttps://telegram.org/blog/search-and-media + 583 + + \n\nNovidades na versão 3.1.1.3:\n\n- Novo MOD para mudar a cor, tamanho e arredondamento do avatar nas configurações\n- Novo MOD para mudar a cor do nome de contatos compartilhados na tela de conversas\n- Correção de bugs Plus Messenger para Android Personalização Código de cor hexadecimal inválido! @@ -958,4 +964,5 @@ Usar Fonte do Dispositivo O Plus Messenger irá reiniciar Cor do Ícone de Grupo + Cor do Nome do Contato Compartilhado \ No newline at end of file diff --git a/TMessagesProj/src/main/res/values-pt-rPT/strings.xml b/TMessagesProj/src/main/res/values-pt-rPT/strings.xml index bfcd2254..b91f4e55 100644 --- a/TMessagesProj/src/main/res/values-pt-rPT/strings.xml +++ b/TMessagesProj/src/main/res/values-pt-rPT/strings.xml @@ -65,6 +65,11 @@ Você criou uma lista de transmissão Adicionar destinatário Remover da lista de transmissão + + Por favor, adicione arquivos à biblioteca de música de seu dispositivo para vê-los aqui. + Música + Artista desconhecido + Título desconhecido Selecione um Arquivo Disponível %1$s de %2$s @@ -121,6 +126,7 @@ Apagar este chat DESLIZE PARA CANCELAR Salvar em downloads + Salvar em músicas Compartilhar Aplicar arquivo de localização Anexo não suportado @@ -347,6 +353,7 @@ Desativado Sons no Chat Padrão + Padrão Notificações Inteligentes Desativado Tocar no máximo %1$s a cada %2$s @@ -827,8 +834,8 @@ h:mm a %1$s às %2$s - Plus Messenger para Android acaba de ser atualizado. Novo na versão 3.0:\n\n- Abas dedicadas para cada um dos pacotes customizados de stickers no painel de stickers. Adicione stickers customizados como https://telegram.me/addstickers/Animals\n- Nova API de bots, gratuita para todos. Se você for um engenheiro, crie seus próprios bots como @quiz_bot ou @hot_or_bot usando o @botfather. Leia mais em https://telegram.org/blog/bot-revolution - 576 + Plus Messenger para Android foi atualizado. Novo na versão 3.1:\n\n- Busca por mensagens dentro de um chat específico.\n-Menu de anexo totalmente redesenhado. Envie contatos e arquivos de áudio diretamente do menu de anexo.\n- Reprodução melhorada de mídia dentro do aplicativo (YouTube, Vimeo, SoundCloud, etc.), novo player para grandes arquivos de áudio.\n\nMais sobre a atualização:\nhttps://telegram.org/blog/search-and-media + 583 Plus Messenger para Android Temas diff --git a/TMessagesProj/src/main/res/values-ru/strings.xml b/TMessagesProj/src/main/res/values-ru/strings.xml index 0e4dfd3d..13f907a8 100644 --- a/TMessagesProj/src/main/res/values-ru/strings.xml +++ b/TMessagesProj/src/main/res/values-ru/strings.xml @@ -55,12 +55,18 @@ Включить уведомления Через %1$s Отключить + ХЕШТЕГИ Новый список рассылки Введите имя списка Вы создали список рассылки Добавить получателя Исключить из списка рассылки + + Добавьте файлы в музыкальную библиотеку этого устройства, чтобы увидеть их здесь. + Музыка + Неизвестный исполнитель + Неизвестный трек Выберите файл Свободно %1$s из %2$s @@ -81,12 +87,21 @@ набирает… набирает… набирают… + %1$s записывает аудио... + %1$s отправляет фото... + %1$s отправляет видео... + %1$s отправляет файл... + запись аудио... + отправка фото... + отправка видео... + отправка файла... Есть вопрос\nо Telegram? Сделать снимок Галерея Место Видео Файл + Камера Здесь пока ничего нет… Пересланное сообщение От пользователя @@ -108,11 +123,16 @@ Удалить этот чат ПРОВЕДИТЕ ДЛЯ ОТМЕНЫ Сохранить в загрузки + Сохранить в музыку Поделиться Применить файл локализации Неподдерживаемое вложение Установить таймер самоуничтожения Служебные уведомления + Получение информации о соединении... + Открыть в браузере + Копировать URL + Отправить %1$s %1$s поставил(а) таймер самоуничтожения на %2$s Вы поставили таймер самоуничтожения на %1$s @@ -146,8 +166,9 @@ %1$s исключил(а) вас из группы %2$s %1$s покинул(а) группу %2$s %1$s присоединился(-лась) к Telegram! - %1$s, мы обнаружили вход под вашим аккаунтом на новом устройстве.\n\nДата: %2$s\nУстройство: %3$s\nМестоположение: %4$s\n\nЕсли это были не вы, можете перейти в Настройки — Приватность и безопасность — Завершить все другие сеансы.\n\nИскренне ваша, команда Telegram. + %1$s, мы обнаружили вход в ваш аккаунт с нового устройства %2$s\n\nУстройство: %3$s\nМестоположение: %4$s\n\nЕсли это были не вы, можете перейти в Настройки - Приватность и безопасность - Сеансы и завершить этот сеанс.\n\nЕсли вы считаете, что кто-то вошёл в ваш аккаунт без вашего ведома, можете включить двухэтапную аутентификацию в разделе Приватность и безопасность.\n\nИскренне ваша, команда Telegram. %1$s обновил(а) фото профиля + %1$s вступил(а) в группу %2$s по приглашению Ответить Ответить группе %1$s Ответить пользователю %1$s @@ -173,6 +194,19 @@ Введите имя группы Имя группы %1$d/%2$d участников + Хотите вступить в группу \'%1$s\'? + К сожалению, эта группа уже заполнена. + К сожалению, такой группы не существует. + Ссылка скопирована в буфер обмена. + Пригласить в группу по ссылке + Приглашение + Уверены, что хотите отозвать эту ссылку? После того, как вы это сделаете, никто не сможет вступить в группу с её помощью. + Прежняя ссылка не активна. Сгенерирована новая. + Отозвать + Отозвать ссылку + Копировать ссылку + Поделиться ссылкой + Любой пользователь Telegram сможет вступить в вашу группу, перейдя по этой ссылке. Общие медиа Настройки @@ -214,6 +248,20 @@ Имя пользователя %1$s доступно. Не задано Произошла ошибка. + + Стикеры + Приглашаем художников добавлять свои собственные наборы стикеров с помощью нашего бота @stickers.\n\nПользователи могут добавлять себе стикеры, нажимая на них и выбирая «Добавить в стикеры». + Добавить стикеры + Добавить в стикеры + Стикеры не найдены + Стикеры удалены + Добавлены новые стикеры + Скрыть + Показать + Поделиться + Копировать ссылку + Удалить + Стикеров пока нет Сброс всех настроек уведомлений на стандартные Размер текста сообщений @@ -241,6 +289,7 @@ Без звука По умолчанию Поддержка + Только в беззвучном Фон чата Сообщения Отправка по Enter @@ -297,14 +346,37 @@ Другое Отключены Отключён + Отключён + Отключён + Звук в чате + По умолчанию + По умолчанию + Умные уведомления + Отключены + Звучать не более %1$s в течение %2$s + Звучать не более + раз(а) + в течение + минут(ы) + + Активные сеансы + Текущий сеанс + Нет других активных сеансов + Вы можете войти в Telegram с другого смартфона, планшета или компьютера, используя единый номер. Все ваши данные будут мгновенно синхронизированы. + Активные сеансы + Контролируйте ваши сеансы на других устройствах. + Нажмите на сеанс для завершения. + Завершить этот сеанс? + неофициальное приложение Код доступа - Изменить код доступа + Сменить код доступа После установки дополнительного кода блокировки на странице чатов появится значок замка. Нажимайте на него для блокировки и разблокировки приложения Telegram.\n\nВнимание: если вы забудете код доступа, вам нужно будет удалить и переустановить это приложение. Все секретные чаты будут утрачены. Теперь вы будете видеть значок замка на странице чатов. Нажмите на него, чтобы заблокировать приложение Telegram с помощью вашего нового кода доступа. ПИН-код Пароль Введите ваш текущий код доступа + Введите код доступа Введите ваш новый код доступа Введите ваш код доступа Повторите ваш новый код доступа @@ -325,15 +397,20 @@ Гибрид м отсюда км отсюда - Отправить место - Поделиться местом + Отправить текущее место + Отправить выбранное место + Место + С точностью до %1$s + ИЛИ ВЫБЕРИТЕ МЕСТО Показать все медиа Сохранить в галерею %1$d из %2$d Галерея Все фото + Все видео Фото пока нет + Видео пока нет Сначала загрузите медиа Нет недавних фото Нет недавних GIF @@ -346,18 +423,78 @@ Редактировать изображение Автоулучшение Блики - Контраст + Контрастность Экспозиция - Тепло + Теплота Насыщенность - Виньетирование + Виньетка Тени Зернистость Резкость Размытие + Отключено + Линейное + Радиальное Уверены, что хотите удалить это фото? Уверены, что хотите удалить это видео? Отменить изменения? + Очистить историю поиска? + Очистить + Фото + Видео + Добавить подпись... + Подпись к фото + Подпись к видео + + Двухэтапная аутентификация + Установить дополнительный пароль + Вы можете установить пароль, который будет запрашиваться при входе с нового устройства в дополнение к коду, получаемому вами в SMS. + Пароль + Введите ваш пароль + Введите ваш пароль + Введите ваш новый пароль + Повторите ваш пароль + Электронная почта + Введите ваш адрес электронной почты + Пожалуйста, добавьте ваш настоящий адрес электронной почты. Это единственный способ восстановления забытого пароля. + Пропустить + Внимание + Нет, серьёзно.\n\nЕсли вы забудете ваш пароль, вы потеряете доступ к вашему аккаунту Telegram. Не будет никакого способа его восстановить. + Почти готово! + Пожалуйста, проверьте вашу электронную почту (не забудьте о папке со спамом) для завершения настройки двухэтапной аутентификации. + Готово! + Ваш пароль для двухэтапной аутентификации активен. + Сменить пароль + Отключить пароль + Указать адрес электронной почты + Сменить адрес электронной почты + Уверены, что хотите отключить пароль? + Подсказка + Введите подсказку для вашего пароля + Пароли не совпадают + Отменить настройку двухэтапной аутентификации + Пожалуйста, выполните эти шаги для завершения настройки двухэтапной аутентификации:\n\n1. Проверьте вашу электронную почту (не забудьте о папке со спамом)\n%1$s\n\n2. Перейдите по ссылке для подтверждения. + Подсказка должна отличаться от вашего пароля + Неверный адрес электронной почты + Извините + Так как вы не указали адрес электронной почты для восстановления пароля, то оставшиеся варианты — вспомнить пароль или сбросить аккаунт. + Мы отправили код восстановления на указанный вами адрес электронной почты:\n\n%1$s + Пожалуйста, проверьте вашу электронную почту и введите 6-значный код, который мы вам отправили. + Проблемы с доступом к вашей электронной почте %1$s? + Если вы не можете восстановить доступ к вашей электронной почте, то оставшиеся варианты — вспомнить пароль или сбросить аккаунт. + СБРОСИТЬ МОЙ АККАУНТ + Вы потеряете все ваши чаты и сообщения, а также любые медиа и файлы, которыми вы делились, если выполните сброс своего аккаунта. + Внимание + Это действие не может быть отменено.\n\nЕсли вы сбросите свой аккаунт, все ваши сообщения и чаты будут удалены. + Сброс + Пароль + Включена двухэтапная аутентификация, ваш аккаунт защищён дополнительным паролем. + Забыли пароль? + Восстановление пароля + Код + Пароль отключён + Включена двухэтапная аутентификация.\nДля входа в свой аккаунт Telegram вам нужно будет вводить установленный здесь пароль. + Ваш адрес электронной почты для восстановления %1$s ещё не активирован и ожидает подтверждения. Приватность и безопасность Приватность @@ -396,12 +533,23 @@ Отредактированное видео Отправка видео... Сжать видео + + бот + Поделиться + Добавить в группу + Настройки + Помощь + имеет доступ к сообщениям + не имеет доступа к сообщениям + Что этот бот может делать? + СТАРТ Далее Назад Готово Открыть Отменить + Закрыть Добавить Редактировать Отправить @@ -415,8 +563,10 @@ Удалить фото Установить OK - КАДРИРОВАНИЕ + КАДРИРОВАТЬ + Вы вступили в группу по приглашению + un1 вступил(а) в группу по приглашению un1 исключил(а) пользователя un2 un1 покинул(а) группу un1 добавил(а) пользователя un2 @@ -434,7 +584,8 @@ un1 исключил(а) вас un1 добавил(а) вас un1 вернулся(-лась) в группу - Это сообщение не поддерживается в вашей версии Telegram. Обновите приложение для просмотра: http://telegram.org/update + Вы вернулись в группу + Это сообщение не поддерживается вашей версией Telegram. Для просмотра обновите приложение: https://telegram.org/update Фото Видео Место @@ -449,18 +600,22 @@ Неверный номер телефона Срок действия кода истёк, пожалуйста, войдите снова Слишком много попыток, пожалуйста, попробуйте снова позже + Слишком много попыток, попробуйте снова через %1$s Неверный код Неверное имя Неверная фамилия Загрузка... У вас нет видеоплеера, пожалуйста, установите его для продолжения - Пожалуйста, отправьте письмо на sms@telegram.org и сообщите нам о вашей проблеме. + Пожалуйста, отправьте нам письмо с описанием вашей проблемы на sms@stel.com. У вас нет приложений, которые могут обрабатывать файлы типа «%1$s», пожалуйста, установите одно для продолжения. У этого пользователя пока нет Telegram, отправить приглашение? Уверены? - Добавить %1$s в группу?\n\nКоличество последних сообщений для пересылки: - Переслать сообщения пользователю %1$s? - Отправить сообщения %1$s? + Добавить %1$s в группу %2$s? + Количество последних сообщений для пересылки: + Добавить пользователя %1$s в группу? + Этот пользователь уже в этой группе. + Переслать сообщение(-я) пользователю %1$s? + Отправить сообщение(-я) пользователю %1$s? Уверены, что хотите выйти?\n\nОбратите внимание на то, что вы можете с лёгкостью пользоваться Telegram на всех ваших устройствах одновременно.\n\nПомните, выход уничтожает все ваши секретные чаты. Уверены, что хотите завершить все другие сеансы? Уверены, что хотите удалить и покинуть эту группу? @@ -473,9 +628,11 @@ Уверены, что хотите прервать регистрацию? Уверены, что хотите очистить историю? Уверены, что хотите удалить %1$s? - Отправить сообщения %1$s? - Переслать сообщения %1$s? + Отправить сообщение(-я) группе %1$s? + Переслать сообщение(-я) %1$s? Извините, эта возможность пока не доступна в вашей стране. + Нет аккаунта Telegram с таким именем. + Этот бот не может вступать в группы. Plus Messenger Быстрый @@ -542,9 +699,9 @@ %1$d секунд %1$d секунд %1$d минут - %1$d минута - %1$d минуты - %1$d минуты + %1$d минуты + %1$d минут + %1$d минут %1$d минут %1$d минут %1$d часов @@ -583,6 +740,85 @@ %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 фото + %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 пересланных аудио + %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 других MMMM yyyy MMM dd @@ -594,6 +830,9 @@ HH:mm h:mm a %1$s в %2$s + + Plus Messenger для Android обновлён. Новое в версии 3.1:\n\n- Поиск сообщений внутри конкретного чата.\n- Полностью переработано меню вложений. Отправка контактов и аудиофайлов прямо из меню вложений.\n- Улучшено воспроизведение медиа в приложении (YouTube, Vimeo, SoundCloud и др.), новый плеер для больших аудиофайлов.\n\nБольше об этом обновлении:\nhttps://telegram.org/blog/search-and-media + 583 Plus Messenger для Android Кастомизация diff --git a/TMessagesProj/src/main/res/values-tr/strings.xml b/TMessagesProj/src/main/res/values-tr/strings.xml index bcd894bc..7b4767d5 100644 --- a/TMessagesProj/src/main/res/values-tr/strings.xml +++ b/TMessagesProj/src/main/res/values-tr/strings.xml @@ -395,7 +395,7 @@ SS:dd Plus Messenger için temalar indirin ve uygulayın. Hergün yeni temalar ekleniyor:\n https://play.google.com/store/apps/details?id=es.rafalense.themes - 576 + 583 diff --git a/TMessagesProj/src/main/res/values-zh-rCN/strings.xml b/TMessagesProj/src/main/res/values-zh-rCN/strings.xml index fff0573a..ae14b622 100644 --- a/TMessagesProj/src/main/res/values-zh-rCN/strings.xml +++ b/TMessagesProj/src/main/res/values-zh-rCN/strings.xml @@ -322,6 +322,7 @@ 关闭 聊天音效 默认 + 默认 智能通知 禁用智能通知 在 %2$s 分钟内,至少通知 %1$s 次 @@ -504,12 +505,23 @@ 编辑过的视频 正在发送视频... 压缩视频 + + 接口 + 分享 + 加入群组 + 设置 + 帮助 + 具有读取消息权限 + 没有读取消息权限 + 本接口的作用 + 开始 -下一个 + 下一步 返回 完成 打开 取消 + 关闭 添加 编辑 发送 @@ -518,11 +530,12 @@ 删除 转发 重试 -来自相机 -来自相册 -删除照片 + 拍照 + 从相册中选择 + 删除图片 设置 -OK + 确定 + 剪切 您通过邀请链接方式加入了这个群组 un1 通过邀请链接方式加入了这个群组 @@ -547,7 +560,7 @@ 当前版本不支持查看此条消息。请前往更新版本: http://telegram.org/update 图片 视频 -地理位置 + 位置 联系人 文件 图贴 @@ -556,36 +569,42 @@ 您截了一张图! un1 截了一张图! -无效电话号码 -密码过期,请重新输入 -请求过多,请稍候重试 -密码无效 -无效的名 -无效的姓 -加载中... -缺少视频播放器,请安装视频播放器后继续 -请发送邮件到 sms@telegram.org 并告诉我们你的问题。 -没有可以打开文件\'%1$s\'的应用,请安装之后继续 -该用户还未加入 Telegram,发送一封邀请? -你确定吗? -添加 %1$s 到群吗?\n\n最近的消息转发数: -转发给 %1$s 吗? -发送信息给 %1$s 吗? -你确定登出吗?\n\n注意:你可以立即在所有设备上无缝使用 Telegram。\n\n登出后所有私密会话都将被删除。 -你确定终止其他所有会话吗? -你确定删除并离开群吗? -你确定删除这个会话吗? -你确定共享你的联系人信息吗? -你确定屏蔽该联系人吗? -对该联系人解除屏蔽吗? -你确定删除这个联系人吗? -你确定开始私密会话吗? -你确定要取消登录吗? -你确定要清除历史吗? -你确定要删除 %1$s ? -发送消息给 %1$s 吗? -转发消息给 %1$s ? -抱歉,该功能在你所在国家尚未启用。 + 无效的手机号码 + 验证码已过期,请重新登录 + 尝试次数过多,请稍后再试 + 尝试次数过多,请于 %1$s 后再试 + 无效的验证码 + 无效的名字 + 无效的姓氏 + 载入中…… + 没有可用的视频播放器,请先安装 + 请发送电子邮件到 sms@telegram.org 告诉我们您遇到的问题。 + 您没有安装可执行 \'%1$s\' 类型文件的软件,请先安装以继续。 + 该用户还未加入Telegram,是否发送邀请? + 您确定吗? + 将 %1$s 加入到 %2$s 群组? + 最近要转发的消息数: + 将 %1$s 添加到群组? + 此用户已是本群组成员 + 转发信息给%1$s? + 要把消息发送给 %1$s 吗? + 确认退出登录? + 您确定要注销所有其它设备上的会话吗? + 您确定要删除并退出这个群组吗? + 您确定要删除这个对话吗? + 您确定要共享您的联系信息吗? + 您确定要屏蔽该联系人吗? + 您确定要取消对该联系人的屏蔽吗? + 您确定要删除该联系人吗? + 您确定要开始加密对话吗? + 确认取消注册? + 确认清除聊天记录? + 确认删除 %1$s ? + 要发送消息给 %1$s 吗? + 要转发消息给 %1$s 吗? + 对不起,本功能在您的国家暂不可用。 + 没有使用这个昵称的 Telegram 账号。 + 此接口账号无法加入群组。 Plus Messenger 快速 @@ -711,6 +730,12 @@ %1$d 张图贴 %1$d 张图贴 %1$d 张图贴 + 没有照片 + 一张照片 + 两张照片 + %1$d 张照片 + %1$d 张照片 + %1$d 张照片 无转发消息 一条转发的消息 @@ -778,8 +803,8 @@ h:mm a %1$s 的 %2$s - 为 Plus Messenger 查找、下载并应用主题。每天都有新主题,当有新的主题发布时能够立即获得通知。分享您的主题给全世界所有的 Plus Messenger 用户。\n https://play.google.com/store/apps/details?id=es.rafalense.themes - 576 + Android 版的 Plus Messenger 已更新。最新版本 3.1 的新增功能有:\n\n- 在特定聊天中搜索消息内容。\n- 全新设计的附件选择菜单。从附件选择菜单中直接发送联系人资料或语音文件。\n- 改进的程序内媒体播放功能 (YouTube, Vimoe, Soundcloud 等), 新播放器适用于大型语音文件。\n\n更多更新请查看:\nhttps://telegram.org/blog/search-and-media + 583 Plus Messenger for Android diff --git a/TMessagesProj/src/main/res/values-zh-rTW/strings.xml b/TMessagesProj/src/main/res/values-zh-rTW/strings.xml index b356963d..0accde7b 100644 --- a/TMessagesProj/src/main/res/values-zh-rTW/strings.xml +++ b/TMessagesProj/src/main/res/values-zh-rTW/strings.xml @@ -734,6 +734,12 @@ %1$d 張貼圖 %1$d 張貼圖 %1$d 張貼圖 + %1$d 張照片 + %1$d 張照片 + %1$d 張照片 + %1$d 張照片 + %1$d 張照片 + %1$d 張照片 %1$d 則轉寄的訊息 轉寄的訊息 @@ -801,8 +807,8 @@ a h:mm %1$s 於時間 %2$s - 檢查,下載並套用給 Plus Messenger 使用的主題。每天都有新的主題。當新的主題發布時,收到通知。與世界各地的所有 Plus Messenger 用戶分享您的主題:\n https://play.google.com/store/apps/details?id=es.rafalense.themes - 576 + Android 版的 Plus Messenger 已經更新。在版本 3.1 的新功能:\n\n- 在特定的聊天室裡搜尋訊息。\n- 完全重新設計的附件選單。從附件選單直接傳送「聯絡人」資訊和「音訊檔」。\n- 改進的程式內媒體播放( YouTube、Vimoe、SoundCloud 等 ),新的播放器適用於大型音訊檔。\n\n更多關於這次的更新:\nhttps://telegram.org/blog/search-and-media + 583 diff --git a/TMessagesProj/src/main/res/values/strings.xml b/TMessagesProj/src/main/res/values/strings.xml index 083e825b..62c52db1 100644 --- a/TMessagesProj/src/main/res/values/strings.xml +++ b/TMessagesProj/src/main/res/values/strings.xml @@ -1,5 +1,7 @@ + + Plus Messenger Plus @@ -64,6 +66,11 @@ You created a broadcast list Add recipient Remove from broadcast list + + Please add files to the music library on your device to see them here. + Music + Unknown artist + Unknown title Select File Free %1$s of %2$s @@ -120,6 +127,7 @@ Delete this chat SLIDE TO CANCEL Save to downloads + Save to music Share Apply localization file Unsupported attachment @@ -346,6 +354,7 @@ Off In-Chat Sounds Default + Default Smart Notifications Disabled Sound at most %1$s within %2$s @@ -826,10 +835,10 @@ h:mm a %1$s at %2$s - Plus Messenger for Android has been updated. New in version 3.0:\n\n- Dedicated tabs for each one of your custom sticker sets in the sticker panel. Add custom stickers like https://telegram.me/addstickers/Animals\n- New bot API, free for everyone. If you\'re an engineer, create your own bots for games, services or integrations. Learn more at https://telegram.org/blog/bot-revolution\n- Check, download and apply themes for Plus Messenger. New themes every day:\n https://play.google.com/store/apps/details?id=es.rafalense.themes - 576 + Plus Messenger for Android has been updated. New in version 3.1:\n\n- Search for messages inside a specific chat.\n- Fully redesigned attachment menu. Send contacts and audio files straight from the attachment menu.\n- Improved in-app media playback (YouTube, Vimeo, SoundCloud etc.), new player for large audio files.\n\nMore about this update:\nhttps://telegram.org/blog/search-and-media + 583 - \n\nNew in 3.0.1.5:\n\n- Fixed options to share music and stickers\n- Added option to share contact number\n- Added option to add member directly from group options\n- Added option to mute or activate notifications from main screen\n- Bug fixes + \n\nNew in 3.1.1.3:\n\n- New MOD to change status color in Settings screen\n- Bug fixes Plus Messenger for Android Theming Invalid color hex code! @@ -956,4 +965,5 @@ Use device font Plus Messenger will restart Group icon color + Shared contact name color \ No newline at end of file diff --git a/TMessagesProj/src/main/res/values/styles.xml b/TMessagesProj/src/main/res/values/styles.xml index d7964045..ecce24d7 100644 --- a/TMessagesProj/src/main/res/values/styles.xml +++ b/TMessagesProj/src/main/res/values/styles.xml @@ -73,8 +73,8 @@