From 8558775967a177ad40f54c58713c2e07ba8cd713 Mon Sep 17 00:00:00 2001 From: dkaraush Date: Wed, 11 Sep 2024 01:59:53 +0400 Subject: [PATCH] update to 11.1.3 (5243) --- .../telegram/messenger/AndroidUtilities.java | 44 +++++ .../messenger/DatabaseMigrationHelper.java | 6 + .../telegram/messenger/LocaleController.java | 12 +- .../telegram/messenger/MediaController.java | 23 ++- .../org/telegram/messenger/MessageObject.java | 1 - .../telegram/messenger/MessagesStorage.java | 3 +- .../NotificationDismissReceiver.java | 2 + .../messenger/NotificationsController.java | 32 ++- .../messenger/PushListenerController.java | 1 + .../org/telegram/messenger/SharedConfig.java | 4 +- .../ui/ActionBar/ActionBarLayout.java | 4 +- .../ui/ActionBar/BottomSheetTabs.java | 3 + .../ui/Adapters/DialogsSearchAdapter.java | 4 +- .../ui/Adapters/MessagesSearchAdapter.java | 4 +- .../java/org/telegram/ui/ArticleViewer.java | 8 +- .../java/org/telegram/ui/AvatarPreviewer.java | 1 + .../java/org/telegram/ui/BubbleActivity.java | 1 + .../org/telegram/ui/Cells/AboutLinkCell.java | 2 +- .../org/telegram/ui/Cells/BotHelpCell.java | 2 +- .../telegram/ui/Cells/ChatMessageCell.java | 6 +- .../org/telegram/ui/Cells/DialogCell.java | 6 +- .../telegram/ui/Cells/ProfileSearchCell.java | 2 +- .../ui/ChannelMonetizationLayout.java | 5 +- .../java/org/telegram/ui/ChatActivity.java | 7 +- .../AvatarConstructorPreviewCell.java | 21 +- .../ui/Components/ChatActivityEnterView.java | 22 +-- .../ui/Components/DialogsBotsAdapter.java | 182 +++++++++++++++--- .../ui/Components/InstantCameraView.java | 22 +-- .../telegram/ui/Components/MediaActivity.java | 69 ++++--- .../ui/Components/PipRoundVideoView.java | 1 + .../ui/Components/PipVideoOverlay.java | 2 + .../cells/msg/GiveawayResultsMessageCell.java | 2 +- .../Reactions/CustomEmojiReactionsWindow.java | 1 + .../Reactions/ReactionsEffectOverlay.java | 1 + .../Reactions/ReactionsLayoutInBubble.java | 19 ++ .../ui/Components/SearchViewPager.java | 3 + .../ui/Components/SenderSelectPopup.java | 1 + .../ui/Components/ThemeEditorView.java | 2 + .../ui/Components/TranslateAlert2.java | 3 + .../ui/Components/UniversalAdapter.java | 6 +- .../Components/voip/RTMPStreamPipOverlay.java | 2 + .../ui/Components/voip/VoIPPiPView.java | 2 + .../java/org/telegram/ui/DialogsActivity.java | 3 +- .../telegram/ui/ExternalActionActivity.java | 1 + .../java/org/telegram/ui/LaunchActivity.java | 1 + .../ui/PopupNotificationActivity.java | 1 + .../java/org/telegram/ui/ProfileActivity.java | 2 +- .../java/org/telegram/ui/ShareActivity.java | 1 + .../telegram/ui/Stars/BotStarsActivity.java | 20 +- .../telegram/ui/Stars/StarsIntroActivity.java | 14 +- .../org/telegram/ui/Stories/StoryViewer.java | 1 + .../ui/Stories/StoryWaveEffectView.java | 1 + .../ui/Stories/recorder/StoryRecorder.java | 5 + .../telegram/ui/web/BotWebViewContainer.java | 5 +- .../org/telegram/ui/web/WebActionBar.java | 6 + TMessagesProj/src/main/res/values/strings.xml | 5 +- .../telegram/ui/Components/UpdateLayout.java | 106 ++++++---- gradle.properties | 4 +- 58 files changed, 527 insertions(+), 193 deletions(-) diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java b/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java index 61f78a855..de00100d0 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/AndroidUtilities.java @@ -272,6 +272,7 @@ public class AndroidUtilities { public static float density = 1; public static Point displaySize = new Point(); public static float screenRefreshRate = 60; + public static float screenMaxRefreshRate = 60; public static float screenRefreshTime = 1000 / screenRefreshRate; public static int roundMessageSize; public static int roundPlayingMessageSize; @@ -2565,6 +2566,17 @@ public class AndroidUtilities { display.getMetrics(displayMetrics); display.getSize(displaySize); screenRefreshRate = display.getRefreshRate(); + screenMaxRefreshRate = screenRefreshRate; + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { + float[] rates = display.getSupportedRefreshRates(); + if (rates != null) { + for (int i = 0; i < rates.length; ++i) { + if (rates[i] > screenMaxRefreshRate) { + screenMaxRefreshRate = rates[i]; + } + } + } + } screenRefreshTime = 1000 / screenRefreshRate; } } @@ -2601,6 +2613,35 @@ public class AndroidUtilities { } } + public static void setPreferredMaxRefreshRate(Window window) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return; + if (window == null) return; + final WindowManager wm = window.getWindowManager(); + if (wm == null) return; + WindowManager.LayoutParams params = window.getAttributes(); + params.preferredRefreshRate = screenMaxRefreshRate; + try { + wm.updateViewLayout(window.getDecorView(), params); + } catch (Exception e) { + FileLog.e(e); + } + } + + public static void setPreferredMaxRefreshRate(WindowManager wm, View windowView, WindowManager.LayoutParams params) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return; + if (wm == null) return; + if (Math.abs(params.preferredRefreshRate - screenMaxRefreshRate) > 0.2) { + params.preferredRefreshRate = screenMaxRefreshRate; + if (windowView.isAttachedToWindow()) { + try { + wm.updateViewLayout(windowView, params); + } catch (Exception e) { + FileLog.e(e); + } + } + } + } + public static double fixLocationCoord(double value) { return ((long) (value * 1000000)) / 1000000.0; } @@ -3505,6 +3546,9 @@ public class AndroidUtilities { } else if (name2 != null && name2.length() != 0) { wholeString += " " + name2; } + if (wholeString == null) { + return ""; + } wholeString = wholeString.trim(); String lower = " " + wholeString.toLowerCase(); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/DatabaseMigrationHelper.java b/TMessagesProj/src/main/java/org/telegram/messenger/DatabaseMigrationHelper.java index 9c4cbcbb3..176f3a61b 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/DatabaseMigrationHelper.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/DatabaseMigrationHelper.java @@ -1516,6 +1516,12 @@ public class DatabaseMigrationHelper { version = 155; } + if (version == 155) { + database.executeFast("CREATE TABLE popular_bots(uid INTEGER PRIMARY KEY, time INTEGER, offset TEXT);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 156").stepThis().dispose(); + version = 156; + } + return version; } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/LocaleController.java b/TMessagesProj/src/main/java/org/telegram/messenger/LocaleController.java index d1bea1815..3b9291eb3 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/LocaleController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/LocaleController.java @@ -19,7 +19,6 @@ import android.os.Build; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.text.format.DateFormat; -import android.util.Log; import android.util.Xml; import androidx.annotation.StringRes; @@ -32,13 +31,10 @@ import org.telegram.tgnet.TLRPC; import org.telegram.ui.RestrictedLanguagesSelectActivity; import org.xmlpull.v1.XmlPullParser; -import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; -import java.io.FileReader; import java.io.FileWriter; -import java.io.IOException; import java.text.NumberFormat; import java.util.ArrayList; import java.util.Calendar; @@ -1468,6 +1464,14 @@ public class LocaleController { return formatPluralStringComma(key, plural, ','); } + public static String formatPluralStringSpaced(String key, int plural) { + return formatPluralStringComma(key, plural, ' '); + } + + public static String formatPluralStringSpaced(String key, int plural, Object... args) { + return formatPluralStringComma(key, plural, ' ', args); + } + public static String formatPluralStringComma(String key, int plural, Object... args) { return formatPluralStringComma(key, plural, ',', args); } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java index e1e9a1c07..fb9da6eb0 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java @@ -50,7 +50,6 @@ import android.os.Build; import android.os.Environment; import android.os.PowerManager; import android.os.SystemClock; -import android.provider.DocumentsContract; import android.provider.MediaStore; import android.provider.OpenableColumns; import android.telephony.PhoneStateListener; @@ -65,8 +64,6 @@ import android.view.WindowManager; import android.webkit.MimeTypeMap; import android.widget.FrameLayout; -import androidx.core.content.FileProvider; - import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ui.AspectRatioFrameLayout; @@ -3884,7 +3881,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener, recordReplyingStory = storyItem; } - public void requestAudioFocus(boolean request) { + public void requestRecordAudioFocus(boolean request) { if (request) { if (!hasRecordAudioFocus && SharedConfig.pauseMusicOnRecord) { int result = NotificationsController.audioManager.requestAudioFocus(audioRecordFocusChangedListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); @@ -3902,7 +3899,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener, public void prepareResumedRecording(int currentAccount, MediaDataController.DraftVoice draft, long dialogId, MessageObject replyToMsg, MessageObject replyToTopMsg, TL_stories.StoryItem replyStory, int guid, String query_shortcut, int query_shortcut_id) { manualRecording = false; - requestAudioFocus(true); + requestRecordAudioFocus(true); recordQueue.cancelRunnable(recordStartRunnable); recordQueue.postRunnable(() -> { setBluetoothScoOn(true); @@ -4033,6 +4030,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener, audioToSend.attributes.add(attributeAudio); NotificationCenter.getInstance(recordingCurrentAccount).postNotificationName(NotificationCenter.recordPaused); NotificationCenter.getInstance(recordingCurrentAccount).postNotificationName(NotificationCenter.audioDidSent, recordingGuid, audioToSend, recordingAudioFileToSend.getAbsolutePath()); + requestRecordAudioFocus(false); }); }); } else { @@ -4050,6 +4048,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener, } AndroidUtilities.runOnUIThread(() -> { + requestRecordAudioFocus(true); MediaDataController.getInstance(recordingCurrentAccount).pushDraftVoiceMessage(recordDialogId, recordTopicId, null); audioRecorder = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, sampleRate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, recordBufferSize); @@ -4071,7 +4070,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener, paused = true; } manualRecording = manual; - requestAudioFocus(true); + requestRecordAudioFocus(true); try { feedbackView.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP, HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING); @@ -4280,7 +4279,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener, recordingAudioFileToSend.delete(); } } - requestAudioFocus(false); + requestRecordAudioFocus(false); }); }); } else { @@ -4288,7 +4287,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener, if (recordingAudioFile != null) { recordingAudioFile.delete(); } - requestAudioFocus(false); + requestRecordAudioFocus(false); } try { if (audioRecorder != null) { @@ -4423,7 +4422,11 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener, if (cancelled) { break; } - if (sourceFile.exists()) { + if (!sourceFile.exists()) { + sourceFile = FileLoader.getInstance(currentAccount.getCurrentAccount()).getPathToAttach(message.messageOwner, true); + FileLog.d("saving file: correcting path from " + path + " to " + (sourceFile == null ? null : sourceFile.getAbsolutePath())); + } + if (sourceFile != null && sourceFile.exists()) { saveFileInternal(isMusic ? 3 : 2, sourceFile, name); copiedFiles++; } @@ -4519,7 +4522,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener, } String fileName = FileLoader.getAttachFileName(document); loadingMessageObjects.put(fileName, messageObject); - currentAccount.getFileLoader().loadFile(document, messageObject, FileLoader.PRIORITY_LOW, messageObject.shouldEncryptPhotoOrVideo() ? 2 : 0); + currentAccount.getFileLoader().loadFile(document, messageObject, FileLoader.PRIORITY_HIGH, messageObject.shouldEncryptPhotoOrVideo() ? 2 : 0); }); } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java index 08bd8d1cd..45b206a92 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessageObject.java @@ -3609,7 +3609,6 @@ public class MessageObject { } message.reactions = reactions; message.flags |= 1048576; - FileLog.d("msg#"+message.id+" updateReactions out=" + message.out); } public boolean hasReactions() { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java index 865f90633..696a946da 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java @@ -105,7 +105,7 @@ public class MessagesStorage extends BaseController { } } - public final static int LAST_DB_VERSION = 155; + public final static int LAST_DB_VERSION = 156; private boolean databaseMigrationInProgress; public boolean showClearDatabaseAlert; private LongSparseIntArray dialogIsForum = new LongSparseIntArray(); @@ -724,6 +724,7 @@ public class MessagesStorage extends BaseController { database.executeFast("CREATE TABLE business_links(data BLOB, order_value INTEGER);").stepThis().dispose(); database.executeFast("CREATE TABLE fact_checks(hash INTEGER PRIMARY KEY, data BLOB, expires INTEGER);").stepThis().dispose(); + database.executeFast("CREATE TABLE popular_bots(uid INTEGER PRIMARY KEY, time INTEGER, offset TEXT);").stepThis().dispose(); database.executeFast("PRAGMA user_version = " + MessagesStorage.LAST_DB_VERSION).stepThis().dispose(); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationDismissReceiver.java b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationDismissReceiver.java index d3016505f..ab7c91db9 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationDismissReceiver.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationDismissReceiver.java @@ -30,8 +30,10 @@ public class NotificationDismissReceiver extends BroadcastReceiver { } else if (intent.hasExtra("storyReaction") && intent.getBooleanExtra("storyReaction", false)) { NotificationsController.getInstance(currentAccount).processIgnoreStoryReactions(); } else if (dialogId == 0) { + FileLog.d("set dismissDate of global to " + date); MessagesController.getNotificationsSettings(currentAccount).edit().putInt("dismissDate", date).commit(); } else { + FileLog.d("set dismissDate of " + dialogId + " to " + date); MessagesController.getNotificationsSettings(currentAccount).edit().putInt("dismissDate" + dialogId, date).commit(); } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java index 7f2ab4e03..62b284b84 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java @@ -963,6 +963,7 @@ public class NotificationsController extends BaseController { } public void processNewMessages(ArrayList messageObjects, boolean isLast, boolean isFcm, CountDownLatch countDownLatch) { + FileLog.d("NotificationsController: processNewMessages msgs.size()=" + (messageObjects == null ? "null" : messageObjects.size()) + " isLast=" + isLast + " isFcm=" + isFcm + ")"); if (messageObjects.isEmpty()) { if (countDownLatch != null) { countDownLatch.countDown(); @@ -988,6 +989,7 @@ public class NotificationsController extends BaseController { messageObject.messageOwner.action instanceof TLRPC.TL_messageActionSetMessagesTTL || messageObject.messageOwner.silent && (messageObject.messageOwner.action instanceof TLRPC.TL_messageActionContactSignUp || messageObject.messageOwner.action instanceof TLRPC.TL_messageActionUserJoined)) || MessageObject.isTopicActionMessage(messageObject)) { + FileLog.d("skipped message because 1"); continue; } if (messageObject.isStoryPush) { @@ -1062,9 +1064,11 @@ public class NotificationsController extends BaseController { getMessagesStorage().putPushMessage(messageObject); } } + FileLog.d("skipped message because old message with same dialog and message ids exist: did=" + did + ", mid="+mid); continue; } if (edited) { + FileLog.d("skipped message because edited"); continue; } if (isFcm) { @@ -1077,10 +1081,12 @@ public class NotificationsController extends BaseController { if (!isFcm) { playInChatSound(); } + FileLog.d("skipped message because chat is already opened (openedDialogId = " + openedDialogId + ")"); continue; } if (messageObject.messageOwner.mentioned) { if (!allowPinned && messageObject.messageOwner.action instanceof TLRPC.TL_messageActionPinMessage) { + FileLog.d("skipped message because message is mention of pinned"); continue; } dialogId = messageObject.getFromChatId(); @@ -1099,6 +1105,7 @@ public class NotificationsController extends BaseController { int notifyOverride = getNotifyOverride(preferences, dialogId, topicId); if (notifyOverride == -1) { value = isGlobalNotificationsEnabled(dialogId, isChannel, messageObject.isReactionPush, messageObject.isStoryReactionPush); + FileLog.d("NotificationsController: process new messages, isGlobalNotificationsEnabled("+dialogId+", "+isChannel+", "+messageObject.isReactionPush+", "+messageObject.isStoryReactionPush+") = " + value); /*if (BuildVars.DEBUG_PRIVATE_VERSION && BuildVars.LOGS_ENABLED) { FileLog.d("global notify settings for " + dialog_id + " = " + value); }*/ @@ -1109,6 +1116,7 @@ public class NotificationsController extends BaseController { settingsCache.put(dialogId, value); } + FileLog.d("NotificationsController: process new messages, value is " + value + " ("+dialogId+", "+isChannel+", "+messageObject.isReactionPush+", "+messageObject.isStoryReactionPush+")"); if (value) { if (!isFcm) { popup = addToPopupMessages(popupArrayAdd, messageObject, dialogId, isChannel, preferences); @@ -1162,9 +1170,11 @@ public class NotificationsController extends BaseController { } if (isFcm || hasScheduled) { if (edited) { + FileLog.d("NotificationsController processNewMessages: edited branch, showOrUpdateNotification " + notifyCheck); delayedPushMessages.clear(); showOrUpdateNotification(notifyCheck); } else if (added) { + FileLog.d("NotificationsController processNewMessages: added branch"); MessageObject messageObject = messageObjects.get(0); long dialog_id = messageObject.getDialogId(); long topicId = MessageObject.getTopicId(currentAccount, messageObject.messageOwner, getMessagesController().isForum(dialog_id)); @@ -1210,6 +1220,7 @@ public class NotificationsController extends BaseController { } if (old_unread_count != total_unread_count || storiesUpdated) { delayedPushMessages.clear(); + FileLog.d("NotificationsController processNewMessages: added branch: " + notifyCheck); showOrUpdateNotification(notifyCheck); int pushDialogsCount = pushDialogs.size(); AndroidUtilities.runOnUIThread(() -> { @@ -3045,6 +3056,7 @@ public class NotificationsController extends BaseController { } private void dismissNotification() { + FileLog.d("NotificationsController dismissNotification"); try { notificationManager.cancel(notificationId); pushMessages.clear(); @@ -4501,6 +4513,7 @@ public class NotificationsController extends BaseController { } private void resetNotificationSound(NotificationCompat.Builder notificationBuilder, long dialogId, long topicId, String chatName, long[] vibrationPattern, int ledColor, Uri sound, int importance, boolean isDefault, boolean isInApp, boolean isSilent, int chatType) { + FileLog.d("resetNotificationSound"); Uri defaultSound = Settings.System.DEFAULT_RINGTONE_URI; if (defaultSound != null && sound != null && !TextUtils.equals(defaultSound.toString(), sound.toString())) { SharedPreferences preferences = getAccountInstance().getNotificationsSettings(); @@ -4546,6 +4559,7 @@ public class NotificationsController extends BaseController { @SuppressLint("InlinedApi") private void showExtraNotifications(NotificationCompat.Builder notificationBuilder, String summary, long lastDialogId, long lastTopicId, String chatName, long[] vibrationPattern, int ledColor, Uri sound, int importance, boolean isDefault, boolean isInApp, boolean isSilent, int chatType) { + FileLog.d("showExtraNotifications pushMessages.size()=" + pushMessages.size()); if (Build.VERSION.SDK_INT >= 26) { notificationBuilder.setChannelId(validateChannelId(lastDialogId, lastTopicId, chatName, vibrationPattern, ledColor, sound, importance, isDefault, isInApp, isSilent, chatType)); } @@ -4571,6 +4585,7 @@ public class NotificationsController extends BaseController { long topicId = MessageObject.getTopicId(currentAccount, messageObject.messageOwner, getMessagesController().isForum(messageObject)); int dismissDate = preferences.getInt("dismissDate" + dialog_id, 0); if (!messageObject.isStoryPush && messageObject.messageOwner.date <= dismissDate) { + FileLog.d("showExtraNotifications: dialog " + dialog_id + " is skipped, message date (" + messageObject.messageOwner.date + " <= " + dismissDate + ")"); continue; } @@ -4578,6 +4593,7 @@ public class NotificationsController extends BaseController { if (arrayList == null) { arrayList = new ArrayList<>(); messagesByDialogs.put(dialog_id, arrayList); + FileLog.d("showExtraNotifications: sortedDialogs += " + dialog_id); sortedDialogs.add(new DialogKey(dialog_id, topicId, false)); } arrayList.add(messageObject); @@ -4633,11 +4649,13 @@ public class NotificationsController extends BaseController { long selfUserId = getUserConfig().getClientUserId(); boolean waitingForPasscode = AndroidUtilities.needShowPasscode() || SharedConfig.isWaitingForPasscodeEnter; boolean passcode = SharedConfig.passcodeHash.length() > 0; + FileLog.d("showExtraNotifications: passcode="+passcode+" waitingForPasscode=" + waitingForPasscode + " selfUserId=" + selfUserId + " useSummaryNotification=" + useSummaryNotification); int maxCount = 7; LongSparseArray personCache = new LongSparseArray<>(); for (int b = 0, size = sortedDialogs.size(); b < size; b++) { if (holders.size() >= maxCount) { + FileLog.d("showExtraNotifications: break from holders, count over " + maxCount); break; } DialogKey dialogKey = sortedDialogs.get(b); @@ -4649,6 +4667,7 @@ public class NotificationsController extends BaseController { if (dialogKey.story) { messageObjects = new ArrayList<>(); if (storyPushMessages.isEmpty()) { + FileLog.d("showExtraNotifications: ["+dialogKey.dialogId+"] continue; story but storyPushMessages is empty"); continue; } dialogId = storyPushMessages.get(0).dialogId; @@ -4915,6 +4934,7 @@ public class NotificationsController extends BaseController { if (hidden) { text.append(LocaleController.formatPluralString("StoryNotificationHidden", storiesCount)); } else if (names.isEmpty()) { + FileLog.d("showExtraNotifications: ["+dialogKey.dialogId+"] continue; story but names is empty"); continue; } else if (names.size() == 1) { if (storiesCount == 1) { @@ -4943,9 +4963,11 @@ public class NotificationsController extends BaseController { } } else { for (int a = messageObjects.size() - 1; a >= 0; a--) { - MessageObject messageObject = messageObjects.get(a); - long messageTopicId = MessageObject.getTopicId(currentAccount, messageObject.messageOwner, getMessagesController().isForum(messageObject)); + final MessageObject messageObject = messageObjects.get(a); + final boolean isForum = getMessagesController().isForum(messageObject); + final long messageTopicId = MessageObject.getTopicId(currentAccount, messageObject.messageOwner, isForum); if (topicId != messageTopicId) { + FileLog.d("showExtraNotifications: ["+dialogKey.dialogId+"] continue; topic id is not equal: topicId=" + topicId + " messageTopicId=" + messageTopicId + "; selfId=" + getUserConfig().getClientUserId()); continue; } String message = getShortStringForMessage(messageObject, senderName, preview); @@ -5303,6 +5325,7 @@ public class NotificationsController extends BaseController { if (Build.VERSION.SDK_INT >= 26) { setNotificationChannel(mainNotification, builder, useSummaryNotification); } + FileLog.d("showExtraNotifications: holders.add " + dialogId); holders.add(new NotificationHolder(internalId, dialogId, dialogKey.story, topicId, name, user, chat, builder)); wearNotificationsIds.put(dialogId, internalId); } @@ -5319,6 +5342,9 @@ public class NotificationsController extends BaseController { } } else { if (openedInBubbleDialogs.isEmpty()) { + if (BuildVars.LOGS_ENABLED) { + FileLog.d("cancel summary with id " + notificationId); + } notificationManager.cancel(notificationId); } } @@ -5336,6 +5362,7 @@ public class NotificationsController extends BaseController { } ArrayList ids = new ArrayList<>(holders.size()); + FileLog.d("showExtraNotifications: holders.size()=" + holders.size()); for (int a = 0, size = holders.size(); a < size; a++) { NotificationHolder holder = holders.get(a); ids.clear(); @@ -5345,6 +5372,7 @@ public class NotificationsController extends BaseController { ids.add(shortcutId); } } + FileLog.d("showExtraNotifications: holders["+a+"].call()"); holder.call(); if (!unsupportedNotificationShortcut() && !ids.isEmpty()) { ShortcutManagerCompat.removeDynamicShortcuts(ApplicationLoader.applicationContext, ids); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/PushListenerController.java b/TMessagesProj/src/main/java/org/telegram/messenger/PushListenerController.java index b2564db0b..4a92da512 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/PushListenerController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/PushListenerController.java @@ -1319,6 +1319,7 @@ public class PushListenerController { ArrayList arrayList = new ArrayList<>(); arrayList.add(messageObject); canRelease = false; + FileLog.d("PushListenerController push notification to NotificationsController of " + messageOwner.dialog_id); NotificationsController.getInstance(currentAccount).processNewMessages(arrayList, true, true, countDownLatch); } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/SharedConfig.java b/TMessagesProj/src/main/java/org/telegram/messenger/SharedConfig.java index bfab58458..1a1217a4b 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/SharedConfig.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/SharedConfig.java @@ -607,7 +607,7 @@ public class SharedConfig { useSystemEmoji = preferences.getBoolean("useSystemEmoji", false); streamMedia = preferences.getBoolean("streamMedia", true); saveStreamMedia = preferences.getBoolean("saveStreamMedia", true); - pauseMusicOnRecord = preferences.getBoolean("pauseMusicOnRecord", false); + pauseMusicOnRecord = preferences.getBoolean("pauseMusicOnRecord", true); pauseMusicOnMedia = preferences.getBoolean("pauseMusicOnMedia", false); forceDisableTabletMode = preferences.getBoolean("forceDisableTabletMode", false); streamAllVideo = preferences.getBoolean("streamAllVideo", BuildVars.DEBUG_VERSION); @@ -1682,7 +1682,7 @@ public class SharedConfig { performanceClass = PERFORMANCE_CLASS_HIGH; } if (BuildVars.LOGS_ENABLED) { - FileLog.d("device performance info selected_class = " + performanceClass + " (cpu_count = " + cpuCount + ", freq = " + maxCpuFreq + ", memoryClass = " + memoryClass + ", android version " + androidVersion + ", manufacture " + Build.MANUFACTURER + ", screenRefreshRate=" + AndroidUtilities.screenRefreshRate + ")"); + FileLog.d("device performance info selected_class = " + performanceClass + " (cpu_count = " + cpuCount + ", freq = " + maxCpuFreq + ", memoryClass = " + memoryClass + ", android version " + androidVersion + ", manufacture " + Build.MANUFACTURER + ", screenRefreshRate=" + AndroidUtilities.screenRefreshRate + ", screenMaxRefreshRate=" + AndroidUtilities.screenMaxRefreshRate + ")"); } return performanceClass; 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 9b0c72748..e5a1acb89 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarLayout.java @@ -1532,7 +1532,9 @@ public class ActionBarLayout extends FrameLayout implements INavigationLayout, F FileLog.d("present fragment " + fragment.getClass().getSimpleName() + " args=" + fragment.getArguments()); } StoryViewer.closeGlobalInstances(); - LaunchActivity.dismissAllWeb(); + if (bottomSheetTabs != null && !bottomSheetTabs.doNotDismiss) { + LaunchActivity.dismissAllWeb(); + } if (inPreviewMode && transitionAnimationPreviewMode) { if (delayedOpenAnimationRunnable != null) { AndroidUtilities.cancelRunOnUIThread(delayedOpenAnimationRunnable); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BottomSheetTabs.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BottomSheetTabs.java index 389ccc354..d1212bf7d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BottomSheetTabs.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/BottomSheetTabs.java @@ -58,6 +58,7 @@ public class BottomSheetTabs extends FrameLayout { private final Paint backgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG); public boolean drawTabs = true; + public boolean doNotDismiss = false; private final ActionBarLayout actionBarLayout; @@ -141,9 +142,11 @@ public class BottomSheetTabs extends FrameLayout { }; open.run(lastFragment); if (tab.needsContext && (!(lastFragment instanceof ChatActivity) || ((ChatActivity) lastFragment).getDialogId() != tab.props.botId)) { + doNotDismiss = true; BaseFragment chatActivity = ChatActivity.of(tab.props.botId); AndroidUtilities.runOnUIThread(() -> { lastFragment.presentFragment(chatActivity); + doNotDismiss = false; }, 220); } } 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 8d712a586..06a4988de 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DialogsSearchAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DialogsSearchAdapter.java @@ -1610,9 +1610,9 @@ public class DialogsSearchAdapter extends RecyclerListView.SelectionAdapter { if (chat != null && chat.participants_count != 0) { String membersString; if (ChatObject.isChannel(chat) && !chat.megagroup) { - membersString = LocaleController.formatPluralStringComma("Subscribers", chat.participants_count, ' '); + membersString = LocaleController.formatPluralStringSpaced("Subscribers", chat.participants_count); } else { - membersString = LocaleController.formatPluralStringComma("Members", chat.participants_count, ' '); + membersString = LocaleController.formatPluralStringSpaced("Members", chat.participants_count); } if (username instanceof SpannableStringBuilder) { ((SpannableStringBuilder) username).append(", ").append(membersString); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/MessagesSearchAdapter.java b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/MessagesSearchAdapter.java index f6411fd61..00b70eb06 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/MessagesSearchAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/MessagesSearchAdapter.java @@ -8,9 +8,7 @@ package org.telegram.ui.Adapters; -import static org.telegram.messenger.AndroidUtilities.checkAndroidTheme; import static org.telegram.messenger.AndroidUtilities.dp; -import static org.telegram.messenger.AndroidUtilities.statusBarHeight; import android.content.Context; import android.graphics.Canvas; @@ -317,7 +315,7 @@ public class MessagesSearchAdapter extends RecyclerListView.SelectionAdapter imp avatarsDrawable.setCount(actualCount); avatarsDrawable.commitTransition(false); - titleTextView.setText(LocaleController.formatPluralString("HashtagStoriesFound", list.getCount())); + titleTextView.setText(LocaleController.formatPluralStringSpaced("HashtagStoriesFound", list.getCount())); subtitleTextView.setText(LocaleController.formatString(R.string.HashtagStoriesFoundSubtitle, list.query)); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ArticleViewer.java b/TMessagesProj/src/main/java/org/telegram/ui/ArticleViewer.java index 17ba61a0d..f6ac12258 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ArticleViewer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ArticleViewer.java @@ -200,6 +200,7 @@ import org.telegram.ui.Components.VideoPlayer; import org.telegram.ui.Components.WebPlayerView; import org.telegram.ui.Stories.DarkThemeResourceProvider; import org.telegram.ui.Stories.recorder.ButtonWithCounterView; +import org.telegram.ui.Stories.recorder.HintView2; import org.telegram.ui.Stories.recorder.KeyboardNotifier; import org.telegram.ui.web.AddressBarList; import org.telegram.ui.web.BookmarksFragment; @@ -13284,7 +13285,12 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg try { try { Uri uri2 = Uri.parse(url); - url = Browser.replace(uri2, null, "", Browser.IDN_toUnicode(uri2.getHost()), null); + String hostname = Browser.IDN_toUnicode(uri2.getHost()); + String[] levels = hostname.split("\\."); + if (levels.length > 2 && actionBar != null && HintView2.measureCorrectly(hostname, actionBar.titlePaint) > AndroidUtilities.displaySize.x - dp(3 * 54)) { + hostname = levels[levels.length - 2] + '.' + levels[levels.length - 1]; + } + url = Browser.replace(uri2, null, "", hostname, null); } catch (Exception e) { FileLog.e(e, false); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/AvatarPreviewer.java b/TMessagesProj/src/main/java/org/telegram/ui/AvatarPreviewer.java index 4fcc93e78..c09fe4410 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/AvatarPreviewer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/AvatarPreviewer.java @@ -125,6 +125,7 @@ public class AvatarPreviewer { WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; } + AndroidUtilities.setPreferredMaxRefreshRate(windowManager, layout, layoutParams); windowManager.addView(layout, layoutParams); parentContainer.requestDisallowInterceptTouchEvent(true); visible = true; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/BubbleActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/BubbleActivity.java index a475603a2..c817ac042 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/BubbleActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/BubbleActivity.java @@ -320,6 +320,7 @@ public class BubbleActivity extends BasePermissionsActivity implements INavigati @Override public void onConfigurationChanged(android.content.res.Configuration newConfig) { AndroidUtilities.checkDisplaySize(this, newConfig); + AndroidUtilities.setPreferredMaxRefreshRate(getWindow()); super.onConfigurationChanged(newConfig); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/AboutLinkCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/AboutLinkCell.java index cb9678a53..e7355b07f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/AboutLinkCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/AboutLinkCell.java @@ -521,7 +521,7 @@ public class AboutLinkCell extends FrameLayout { } : null; if (pressedLink instanceof URLSpanNoUnderline) { String url = ((URLSpanNoUnderline) pressedLink).getURL(); - if (url.startsWith("@") || url.startsWith("#") || url.startsWith("/")) { + if (url.startsWith("@") || url.startsWith("#") || url.startsWith("$") || url.startsWith("/")) { didPressUrl(url, currentProgress); } } else { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/BotHelpCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/BotHelpCell.java index cc636f15e..6be21edde 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/BotHelpCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/BotHelpCell.java @@ -260,7 +260,7 @@ public class BotHelpCell extends View { ClickableSpan span = pressedLink.getSpan(); if (span instanceof URLSpanNoUnderline) { String url = ((URLSpanNoUnderline) span).getURL(); - if (url.startsWith("@") || url.startsWith("#") || url.startsWith("/")) { + if (url.startsWith("@") || url.startsWith("#") || url.startsWith("/") || url.startsWith("$")) { if (delegate != null) { delegate.didPressUrl(url); } 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 7cb7309a9..5bd532066 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java @@ -300,7 +300,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate } else { currentPhoto = null; } - if (currentChat.signature_profiles) { + if (currentChat.signature_profiles && messageObject.getDialogId() != UserObject.REPLY_BOT) { long did = DialogObject.getPeerDialogId(messageObject.messageOwner.from_id); if (did >= 0) { TLRPC.User user = MessagesController.getInstance(messageObject.currentAccount).getUser(did); @@ -9497,7 +9497,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate botButtonsByPosition.clear(); botButtonsLayout = null; } - if (!messageObject.isRestrictedMessage && !messageObject.isRepostPreview && currentPosition == null && (messageObject.messageOwner.reply_markup instanceof TLRPC.TL_replyInlineMarkup) && !messageObject.hasExtendedMedia()) { + if (!messageObject.isRestrictedMessage && !messageObject.isRepostPreview && (currentPosition == null || currentMessagesGroup != null && currentMessagesGroup.isDocuments && currentPosition.last) && (messageObject.messageOwner.reply_markup instanceof TLRPC.TL_replyInlineMarkup) && !messageObject.hasExtendedMedia()) { int rows; if (messageObject.messageOwner.reply_markup instanceof TLRPC.TL_replyInlineMarkup) { @@ -16894,7 +16894,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate if (currentUser != null) { return UserObject.getUserName(currentUser); } else if (currentChat != null) { - if (currentMessageObject != null && currentChat.signature_profiles) { + if (currentMessageObject != null && (currentMessageObject.getDialogId() != UserObject.REPLY_BOT) && currentChat.signature_profiles) { long did = DialogObject.getPeerDialogId(currentMessageObject.messageOwner.from_id); if (did >= 0) { TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(did); 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 375231d25..f0f081b11 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java @@ -1488,8 +1488,8 @@ public class DialogCell extends BaseCell implements StoriesListPlaceProvider.Ava if (!isSavedDialog && user != null && user.self && !message.isOutOwner()) { triedMessageName = AndroidUtilities.removeDiacritics(getMessageNameString()); } - if (isSavedDialog && user != null && !user.self && message != null && message.isOutOwner() || triedMessageName != null || chat != null && chat.id > 0 && fromChat == null && (!ChatObject.isChannel(chat) || ChatObject.isMegagroup(chat)) && !ForumUtilities.isTopicCreateMessage(message)) { - messageNameString = AndroidUtilities.removeDiacritics(triedMessageName != null ? triedMessageName : getMessageNameString()); + if (isSavedDialog && user != null && !user.self && message != null && message.isOutOwner() || triedMessageName != null || chat != null && chat.id > 0 && (fromChat == null || fromChat.id != chat.id) && (!ChatObject.isChannel(chat) || ChatObject.isMegagroup(chat)) && !ForumUtilities.isTopicCreateMessage(message)) { + messageNameString = AndroidUtilities.removeDiacritics(triedMessageName != null ? triedMessageName : getMessageNameString()); if (chat != null && chat.forum && !isTopic && !useFromUserAsAvatar) { CharSequence topicName = MessagesController.getInstance(currentAccount).getTopicsController().getTopicIconName(chat, message, currentMessagePaint); if (!TextUtils.isEmpty(topicName)) { @@ -5078,7 +5078,7 @@ public class DialogCell extends BaseCell implements StoriesListPlaceProvider.Ava return AndroidUtilities.removeDiacritics(fromChat.title.replace("\n", "")); } return null; - } else if (message.isOutOwner()) { + } else if (message.isOutOwner() && fromUser != null) { return LocaleController.getString(R.string.FromYou); } else if (!isSavedDialog && message != null && message.messageOwner != null && message.messageOwner.from_id instanceof TLRPC.TL_peerUser && (user = MessagesController.getInstance(currentAccount).getUser(message.messageOwner.from_id.user_id)) != null) { return AndroidUtilities.removeDiacritics(UserObject.getFirstName(user).replace("\n", "")); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ProfileSearchCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ProfileSearchCell.java index 0640c5baa..1e553ff80 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ProfileSearchCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ProfileSearchCell.java @@ -492,7 +492,7 @@ public class ProfileSearchCell extends BaseCell implements NotificationCenter.No if (MessagesController.isSupportUser(user)) { statusString = LocaleController.getString(R.string.SupportStatus); } else if (user.bot && user.bot_active_users != 0) { - statusString = LocaleController.formatPluralStringComma("BotUsers", user.bot_active_users, ' '); + statusString = LocaleController.formatPluralStringSpaced("BotUsers", user.bot_active_users); } else if (user.bot) { statusString = LocaleController.getString(R.string.Bot); } else if (UserObject.isService(user.id)) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChannelMonetizationLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/ChannelMonetizationLayout.java index d01058488..64e75b6b3 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChannelMonetizationLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChannelMonetizationLayout.java @@ -26,7 +26,6 @@ import android.text.TextUtils; import android.text.TextWatcher; import android.text.style.RelativeSizeSpan; import android.util.Base64; -import android.util.Log; import android.util.TypedValue; import android.view.Gravity; import android.view.MotionEvent; @@ -52,7 +51,6 @@ import org.telegram.messenger.ChatObject; import org.telegram.messenger.FileLog; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MessagesController; -import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.R; import org.telegram.messenger.UserConfig; import org.telegram.messenger.UserObject; @@ -90,7 +88,6 @@ import org.telegram.ui.Components.UniversalRecyclerView; import org.telegram.ui.Components.ViewPagerFixed; import org.telegram.ui.Stars.BotStarsActivity; import org.telegram.ui.Stars.BotStarsController; -import org.telegram.ui.Stars.StarsController; import org.telegram.ui.Stars.StarsIntroActivity; import org.telegram.ui.Stories.recorder.ButtonWithCounterView; @@ -471,7 +468,7 @@ public class ChannelMonetizationLayout extends SizeNotifierFrameLayout implement AndroidUtilities.runOnUIThread(this.setStarsBalanceButtonText, 1000); } else { starsBalanceButton.setSubText(null, true); - starsBalanceButton.setText(StarsIntroActivity.replaceStars(starsBalanceEditTextAll ? getString(R.string.MonetizationStarsWithdrawAll) : LocaleController.formatPluralStringComma("MonetizationStarsWithdraw", (int) starsBalanceEditTextValue, ' '), starRef), true); + starsBalanceButton.setText(StarsIntroActivity.replaceStars(starsBalanceEditTextAll ? getString(R.string.MonetizationStarsWithdrawAll) : LocaleController.formatPluralStringSpaced("MonetizationStarsWithdraw", (int) starsBalanceEditTextValue), starRef), true); } }; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index 9f6a1d5b8..0ffa5f905 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -7092,6 +7092,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not Bundle args = new Bundle(); args.putInt("type", MediaActivity.TYPE_STORIES_SEARCH); args.putString("hashtag", messagesSearchAdapter.storiesList.query); + args.putInt("storiesCount", messagesSearchAdapter.storiesList.getCount()); presentFragment(new MediaActivity(args, null)); } else if (obj instanceof MessageObject) { openMessageInOriginalDialog((MessageObject) obj); @@ -35401,7 +35402,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } if (!asForward && chat != null && chat.signature_profiles) { MessageObject msg = cell.getMessageObject(); - if (msg != null) { + if (msg != null && msg.getDialogId() != UserObject.REPLY_BOT) { long did = DialogObject.getPeerDialogId(msg.messageOwner.from_id); openUserProfile(did); return; @@ -35915,6 +35916,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not popupLayout.addView(removeTag); scrimPopupContainerLayout.addView(popupLayout); } else if (messageObject != null && messageObject.messageOwner != null && messageObject.messageOwner.reactions != null && messageObject.messageOwner.reactions.can_see_list || dialog_id >= 0) { + if (reaction.reaction instanceof TLRPC.TL_reactionCustomEmoji) { + button.stopAnimation(); + } scrimPopupContainerLayout.addView(new ReactedUsersListView(getParentActivity(), themeDelegate, currentAccount, messageObject, reaction, false, false) .setOnCustomEmojiSelectedListener((reactedUsersListView1, customEmojiStickerSets) -> { EmojiPacksAlert alert = new EmojiPacksAlert(ChatActivity.this, getParentActivity(), themeDelegate, customEmojiStickerSets) { @@ -35946,6 +35950,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not TLRPC.TL_reactionCustomEmoji customEmoji = (TLRPC.TL_reactionCustomEmoji) reaction.reaction; TLRPC.InputStickerSet inputStickerSet = AnimatedEmojiDrawable.getDocumentFetcher(currentAccount).findStickerSet(customEmoji.document_id); if (inputStickerSet != null) { + button.stopAnimation(); ArrayList arr = new ArrayList(); arr.add(inputStickerSet); MessageContainsEmojiButton setButton = new MessageContainsEmojiButton(currentAccount, getContext(), themeDelegate, arr, MessageContainsEmojiButton.SINGLE_REACTION_TYPE); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarConstructorPreviewCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarConstructorPreviewCell.java index cd4be4d4b..5be1a0079 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarConstructorPreviewCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarConstructorPreviewCell.java @@ -21,6 +21,7 @@ import java.util.ArrayList; public class AvatarConstructorPreviewCell extends FrameLayout { private AnimatedEmojiDrawable animatedEmojiDrawable; + private AnimatedEmojiDrawable nextAnimatedEmojiDrawable; BackupImageView currentImage; BackupImageView nextImage; @@ -37,13 +38,16 @@ public class AvatarConstructorPreviewCell extends FrameLayout { int emojiIndex = 0; float progressToNext = 1f; + private boolean isAllEmojiDrawablesLoaded; Runnable scheduleSwitchToNextRunnable = new Runnable() { @Override public void run() { AndroidUtilities.runOnUIThread(scheduleSwitchToNextRunnable, 1000); if (emojiList == null || emojiList.document_id.isEmpty() || progressToNext != 1f) { - + return; + } + if (!isAllEmojiDrawablesLoaded && (nextAnimatedEmojiDrawable.getImageReceiver() == null || !nextAnimatedEmojiDrawable.getImageReceiver().hasImageLoaded())) { return; } emojiIndex++; @@ -68,6 +72,7 @@ public class AvatarConstructorPreviewCell extends FrameLayout { nextBackgroundDrawable.setColors(color1, color2, color3, color4); progressToNext = 0f; + preloadNextEmojiDrawable(); invalidate(); } }; @@ -116,6 +121,7 @@ public class AvatarConstructorPreviewCell extends FrameLayout { if (emojiList != null && !emojiList.document_id.isEmpty()) { animatedEmojiDrawable = new AnimatedEmojiDrawable(AnimatedEmojiDrawable.CACHE_TYPE_ALERT_PREVIEW_LARGE, currentAccount, emojiList.document_id.get(0)); currentImage.setAnimatedEmojiDrawable(animatedEmojiDrawable); + preloadNextEmojiDrawable(); } int color1 = AvatarConstructorFragment.defaultColors[backgroundIndex][0]; @@ -137,6 +143,19 @@ public class AvatarConstructorPreviewCell extends FrameLayout { } + private void preloadNextEmojiDrawable() { + if (isAllEmojiDrawablesLoaded) { + return; + } + int nextEmojiIndex = emojiIndex + 1; + if (nextEmojiIndex > emojiList.document_id.size() - 1) { + isAllEmojiDrawablesLoaded = true; + return; + } + nextAnimatedEmojiDrawable = new AnimatedEmojiDrawable(AnimatedEmojiDrawable.CACHE_TYPE_ALERT_PREVIEW_LARGE, currentAccount, emojiList.document_id.get(nextEmojiIndex)); + nextAnimatedEmojiDrawable.preload(); + } + @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); 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 2d6c67603..acdfcb8fc 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java @@ -570,6 +570,9 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } }; + boolean ctrlPressed = false; + boolean shiftPressed = false; + @Nullable protected EditTextCaption messageEditText; private SlowModeBtn slowModeButton; @@ -5087,10 +5090,12 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific messageEditTextContainer.addView(messageEditText, 1, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.BOTTOM, 52, 0, isChat ? 50 : 2, 1.5f)); messageEditText.setOnKeyListener(new OnKeyListener() { - boolean ctrlPressed = false; - @Override public boolean onKey(View view, int keyCode, KeyEvent keyEvent) { + if (keyEvent != null) { + shiftPressed = keyEvent.isShiftPressed(); + ctrlPressed = keyEvent.isCtrlPressed(); + } if (keyCode == KeyEvent.KEYCODE_BACK && !keyboardVisible && isPopupShowing() && keyEvent.getAction() == KeyEvent.ACTION_UP) { if (ContentPreviewViewer.hasInstance() && ContentPreviewViewer.getInstance().isVisible()) { ContentPreviewViewer.getInstance().closeWithMenu(); @@ -5125,27 +5130,22 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific } } return true; - } else if (keyCode == KeyEvent.KEYCODE_ENTER && (ctrlPressed || sendByEnter) && keyEvent.getAction() == KeyEvent.ACTION_DOWN && editingMessageObject == null) { + } else if (keyCode == KeyEvent.KEYCODE_ENTER && !keyEvent.isShiftPressed() && (sendByEnter ? !keyEvent.isCtrlPressed() : keyEvent.isCtrlPressed()) && keyEvent.getAction() == KeyEvent.ACTION_DOWN && editingMessageObject == null) { sendMessage(); return true; - } else if (keyCode == KeyEvent.KEYCODE_CTRL_LEFT || keyCode == KeyEvent.KEYCODE_CTRL_RIGHT) { - ctrlPressed = keyEvent.getAction() == KeyEvent.ACTION_DOWN; - return true; } return false; } }); messageEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() { - boolean ctrlPressed = false; - @Override public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { if (i == EditorInfo.IME_ACTION_SEND) { sendMessage(); return true; } else if (keyEvent != null && i == EditorInfo.IME_NULL) { - if ((ctrlPressed || sendByEnter) && keyEvent.getAction() == KeyEvent.ACTION_DOWN && editingMessageObject == null) { + if (!keyEvent.isShiftPressed() && (sendByEnter ? !keyEvent.isCtrlPressed() : keyEvent.isCtrlPressed()) && keyEvent.getAction() == KeyEvent.ACTION_DOWN && editingMessageObject == null) { sendMessage(); return true; } @@ -5204,7 +5204,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific if (innerTextChange == 1) { return; } - if (sendByEnter && !ignoreTextChange && !isPaste && editingMessageObject == null && count > before && charSequence.length() > 0 && charSequence.length() == start + count && charSequence.charAt(charSequence.length() - 1) == '\n') { + if (sendByEnter && !ctrlPressed && !shiftPressed && !ignoreTextChange && !isPaste && editingMessageObject == null && count > before && charSequence.length() > 0 && charSequence.length() == start + count && charSequence.charAt(charSequence.length() - 1) == '\n') { nextChangeIsSend = true; } isPaste = false; @@ -9912,7 +9912,7 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific return; } - WebViewRequestProps props = WebViewRequestProps.of(currentAccount, messageObject.messageOwner.dialog_id, botId, button.text, button.url, button instanceof TLRPC.TL_keyboardButtonSimpleWebView ? BotWebViewSheet.TYPE_SIMPLE_WEB_VIEW_BUTTON : BotWebViewSheet.TYPE_WEB_VIEW_BUTTON, replyMessageObject != null ? replyMessageObject.messageOwner.id : 0, false, null, false, null, null, 0, false); + final WebViewRequestProps props = WebViewRequestProps.of(currentAccount, messageObject.messageOwner.dialog_id, botId, button.text, button.url, button instanceof TLRPC.TL_keyboardButtonSimpleWebView ? BotWebViewAttachedSheet.TYPE_SIMPLE_WEB_VIEW_BUTTON : BotWebViewAttachedSheet.TYPE_WEB_VIEW_BUTTON, replyMessageObject != null ? replyMessageObject.messageOwner.id : 0, false, null, false, null, null, 0, false); if (LaunchActivity.instance != null && LaunchActivity.instance.getBottomSheetTabs() != null && LaunchActivity.instance.getBottomSheetTabs().tryReopenTab(props) != null) { if (botCommandsMenuButton != null) { botCommandsMenuButton.setOpened(false); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/DialogsBotsAdapter.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/DialogsBotsAdapter.java index 9a93c53d6..1ff9f4fed 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/DialogsBotsAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/DialogsBotsAdapter.java @@ -3,11 +3,16 @@ package org.telegram.ui.Components; import static org.telegram.messenger.LocaleController.getString; import android.content.Context; +import android.database.sqlite.SQLiteStatement; import android.text.TextUtils; import android.view.View; +import org.telegram.SQLite.SQLiteCursor; +import org.telegram.SQLite.SQLiteDatabase; +import org.telegram.SQLite.SQLitePreparedStatement; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.DialogObject; +import org.telegram.messenger.FileLog; import org.telegram.messenger.MediaDataController; import org.telegram.messenger.MessageObject; import org.telegram.messenger.MessagesController; @@ -29,9 +34,7 @@ public class DialogsBotsAdapter extends UniversalAdapter { private final boolean showOnlyPopular; private final Theme.ResourcesProvider resourcesProvider; - private String popularBotsNextOffset; - private boolean popularBotsLoaded, popularBotsLoading; - public final ArrayList popularBots = new ArrayList<>(); + private final PopularBots popular; public final ArrayList searchMine = new ArrayList<>(); public final ArrayList searchGlobal = new ArrayList<>(); @@ -48,9 +51,9 @@ public class DialogsBotsAdapter extends UniversalAdapter { this.folderId = folderId; this.resourcesProvider = resourcesProvider; this.showOnlyPopular = showOnlyPopular; + this.popular = new PopularBots(currentAccount, () -> update(true)); update(false); MediaDataController.getInstance(currentAccount).loadHints(true); - loadPopularBots(); } private int topPeersStart, topPeersEnd; @@ -111,20 +114,20 @@ public class DialogsBotsAdapter extends UniversalAdapter { } } topPeersEnd = items.size(); - if (!popularBots.isEmpty()) { + if (!popular.bots.isEmpty()) { if (!showOnlyPopular) items.add(UItem.asGraySection(getString(R.string.SearchAppsPopular))); - for (int i = 0; i < popularBots.size(); ++i) { - final TLRPC.User user = popularBots.get(i); + for (int i = 0; i < popular.bots.size(); ++i) { + final TLRPC.User user = popular.bots.get(i); if (uids.contains(user.id)) continue; uids.add(user.id); items.add(UItem.asProfileCell(user).accent()); } - if (popularBotsNextOffset != null || popularBotsLoading) { + if (popular.loading) { items.add(UItem.asFlicker(FlickerLoadingView.PROFILE_SEARCH_CELL)); items.add(UItem.asFlicker(FlickerLoadingView.PROFILE_SEARCH_CELL)); items.add(UItem.asFlicker(FlickerLoadingView.PROFILE_SEARCH_CELL)); } - } else if (popularBotsNextOffset != null || popularBotsLoading) { + } else if (popular.loading) { if (!showOnlyPopular) items.add(UItem.asFlicker(FlickerLoadingView.GRAY_SECTION)); items.add(UItem.asFlicker(FlickerLoadingView.PROFILE_SEARCH_CELL)); items.add(UItem.asFlicker(FlickerLoadingView.PROFILE_SEARCH_CELL)); @@ -340,16 +343,18 @@ public class DialogsBotsAdapter extends UniversalAdapter { searchMessages(true); } + private boolean first = true; public void checkBottom() { if (!TextUtils.isEmpty(this.query)) { if (hasMore && !loadingMessages && seesLoading()) { searchMore(); } } else { - if (!popularBotsLoading && !TextUtils.isEmpty(popularBotsNextOffset) && seesLoading()) { - loadPopularBots(); + if (first || seesLoading()) { + popular.load(); } } + first = false; } public boolean seesLoading() { @@ -373,26 +378,145 @@ public class DialogsBotsAdapter extends UniversalAdapter { return false; } - public void loadPopularBots() { - if (popularBotsLoading || popularBotsLoaded && popularBotsNextOffset == null) return; + public static class PopularBots { - popularBotsLoading = true; - TL_bots.getPopularAppBots req = new TL_bots.getPopularAppBots(); - req.offset = popularBotsNextOffset == null ? "" : popularBotsNextOffset; - req.limit = 20; - ConnectionsManager.getInstance(currentAccount).sendRequest(req, (res, err) -> AndroidUtilities.runOnUIThread(() -> { - popularBotsLoading = false; - popularBotsLoaded = true; - if (res instanceof TL_bots.popularAppBots) { - TL_bots.popularAppBots r = (TL_bots.popularAppBots) res; - MessagesController.getInstance(currentAccount).putUsers(r.users, false); - popularBots.addAll(r.users); - popularBotsNextOffset = r.next_offset; - } else { - popularBotsNextOffset = null; + private final int currentAccount; + private final Runnable whenUpdated; + public PopularBots(int currentAccount, Runnable whenUpdated) { + this.currentAccount = currentAccount; + this.whenUpdated = whenUpdated; + } + + public boolean loading; + private boolean cacheLoaded; + private boolean endReached; + + private long cacheTime; + private String lastOffset; + public final ArrayList bots = new ArrayList<>(); + + private void loadCache(Runnable whenDone) { + final MessagesStorage storage = MessagesStorage.getInstance(currentAccount); + storage.getStorageQueue().postRunnable(() -> { + long time = 0; + String offset = null; + final ArrayList users = new ArrayList<>(); + final ArrayList userIds = new ArrayList<>(); + + final SQLiteDatabase db = storage.getDatabase(); + SQLiteCursor cursor = null; + try { + cursor = db.queryFinalized("SELECT uid, time, offset FROM popular_bots"); + while (cursor.next()) { + userIds.add(cursor.longValue(0)); + time = Math.max(time, cursor.longValue(1)); + offset = cursor.stringValue(2); + } + cursor.dispose(); + users.addAll(storage.getUsers(userIds)); + } catch (Exception e) { + FileLog.e(e); + } finally { + if (cursor != null) { + cursor.dispose(); + } + } + + final long finalTime = time; + final String finalOffset = offset; + AndroidUtilities.runOnUIThread(() -> { + MessagesController.getInstance(currentAccount).putUsers(users, true); + + bots.addAll(users); + this.cacheTime = finalTime; + this.lastOffset = finalOffset; + this.cacheLoaded = true; + + whenDone.run(); + }); + }); + } + + private boolean savingCache = false; + private void saveCache() { + if (savingCache) return; + savingCache = true; + + final long time = cacheTime; + final String offset = lastOffset; + final ArrayList ids = new ArrayList<>(); + for (int i = 0; i < bots.size(); ++i) { + ids.add(bots.get(i).id); } - update(true); - })); + + final MessagesStorage storage = MessagesStorage.getInstance(currentAccount); + storage.getStorageQueue().postRunnable(() -> { + final SQLiteDatabase db = storage.getDatabase(); + SQLitePreparedStatement state = null; + try { + db.executeFast("DELETE FROM popular_bots").stepThis().dispose(); + state = db.executeFast("REPLACE INTO popular_bots VALUES(?, ?, ?)"); + for (int i = 0; i < ids.size(); i++) { + state.requery(); + state.bindLong(1, ids.get(i)); + state.bindLong(2, time); + state.bindString(3, offset); + state.step(); + } + } catch (Exception e) { + FileLog.e(e); + } finally { + if (state != null) { + state.dispose(); + } + } + + AndroidUtilities.runOnUIThread(() -> { + savingCache = false; + }); + }); + } + + public void load() { + if (loading || endReached) return; + loading = true; + + if (!cacheLoaded) { + loadCache(() -> { + loading = false; + whenUpdated.run(); + + if (System.currentTimeMillis() - cacheTime > 60 * 60 * 1000) { + bots.clear(); + load(); + } + }); + return; + } + + TL_bots.getPopularAppBots req = new TL_bots.getPopularAppBots(); + req.limit = 20; + req.offset = lastOffset == null ? "" : lastOffset; + ConnectionsManager.getInstance(currentAccount).sendRequest(req, (res, err) -> AndroidUtilities.runOnUIThread(() -> { + if (res instanceof TL_bots.popularAppBots) { + TL_bots.popularAppBots r = (TL_bots.popularAppBots) res; + MessagesController.getInstance(currentAccount).putUsers(r.users, false); + MessagesStorage.getInstance(currentAccount).putUsersAndChats(r.users, null, false, true); + bots.addAll(r.users); + lastOffset = r.next_offset; + endReached = lastOffset == null; + cacheTime = System.currentTimeMillis(); + saveCache(); + loading = false; + whenUpdated.run(); + } else { + lastOffset = null; + endReached = true; + loading = false; + whenUpdated.run(); + } + })); + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/InstantCameraView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/InstantCameraView.java index 6372ab36e..344ef7ba1 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/InstantCameraView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/InstantCameraView.java @@ -694,7 +694,7 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter if (cancelled) { NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.audioRecordTooShort, recordingGuid, true, (int) recordedTime); startAnimation(false, false); - MediaController.getInstance().requestAudioFocus(false); + MediaController.getInstance().requestRecordAudioFocus(false); } else { videoEncoder.pause(); } @@ -765,8 +765,8 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter if (MediaController.getInstance().getPlayingMessageObject() != null) { if (MediaController.getInstance().getPlayingMessageObject().isVideo() || MediaController.getInstance().getPlayingMessageObject().isRoundVideo()) { MediaController.getInstance().cleanupPlayer(true, true); - } else { - MediaController.getInstance().pauseMessage(MediaController.getInstance().getPlayingMessageObject()); + } else if (SharedConfig.pauseMusicOnRecord) { + MediaController.getInstance().pauseByRewind(); } } @@ -874,7 +874,7 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter setVisibility(VISIBLE); startAnimation(true, fromPaused); - MediaController.getInstance().requestAudioFocus(true); + MediaController.getInstance().requestRecordAudioFocus(true); } public InstantViewCameraContainer getCameraContainer() { @@ -1020,7 +1020,7 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter if (scheduleDate != 0) { startAnimation(false, false); } - MediaController.getInstance().requestAudioFocus(false); + MediaController.getInstance().requestRecordAudioFocus(false); } else { cancelled = recordedTime < 800; recording = false; @@ -1049,7 +1049,7 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter if (cancelled) { NotificationCenter.getInstance(currentAccount).postNotificationName(NotificationCenter.audioRecordTooShort, recordingGuid, true, (int) recordedTime); startAnimation(false, false); - MediaController.getInstance().requestAudioFocus(false); + MediaController.getInstance().requestRecordAudioFocus(false); } } } @@ -1101,7 +1101,7 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter AutoDeleteMediaTask.unlockFile(cameraFile); cameraFile = null; } - MediaController.getInstance().requestAudioFocus(false); + MediaController.getInstance().requestRecordAudioFocus(false); startAnimation(false, false); blurBehindDrawable.show(false); invalidate(); @@ -1129,7 +1129,7 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter textureOverlayView.setTranslationX(0); animationTranslationY = 0; updateTranslationY(); - MediaController.getInstance().playMessage(MediaController.getInstance().getPlayingMessageObject()); + MediaController.getInstance().resumeByRewind(); if (textureView != null) { ViewGroup parent = (ViewGroup) textureView.getParent(); @@ -3106,7 +3106,7 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter videoEditedInfo.notReadyYet = false; } didWriteData(videoFile, 0, true); - MediaController.getInstance().requestAudioFocus(false); + MediaController.getInstance().requestRecordAudioFocus(false); }); } EGL14.eglDestroySurface(eglDisplay, eglSurface); @@ -3633,7 +3633,7 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter " float radius = 0.51 * resolution.x;\n" + " float d = length(coord - gl_FragCoord.xy) - radius;\n" + " float t = clamp(d, 0.0, 1.0);\n" + - " vec3 color = mix(textColor.rgb, vec3(0, 0, 0), t);\n" + + " vec3 color = mix(textColor.rgb, vec3(1, 1, 1), t);\n" + " gl_FragColor = vec4(color * alpha, alpha);\n" + "}\n"; } @@ -3669,7 +3669,7 @@ public class InstantCameraView extends FrameLayout implements NotificationCenter " vec4 x2 = mix(bl, br, frac.x);\n" + " gl_FragColor = mix(x1, x2, frac.y) * alpha;" + " } else {\n" + - " gl_FragColor = vec4(0, 0, 0, alpha);\n" + + " gl_FragColor = vec4(1, 1, 1, alpha);\n" + " }\n" + "}\n"; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/MediaActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/MediaActivity.java index 461fc7218..3f1405f82 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/MediaActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/MediaActivity.java @@ -78,6 +78,7 @@ public class MediaActivity extends BaseFragment implements SharedMediaLayout.Sha private long dialogId; private long topicId; private String hashtag; + private int storiesCount; private FrameLayout titlesContainer; private FrameLayout[] titles = new FrameLayout[2]; private SimpleTextView[] nameTextView = new SimpleTextView[2]; @@ -113,6 +114,7 @@ public class MediaActivity extends BaseFragment implements SharedMediaLayout.Sha dialogId = getArguments().getLong("dialog_id"); topicId = getArguments().getLong("topic_id", 0); hashtag = getArguments().getString("hashtag", ""); + storiesCount = getArguments().getInt("storiesCount", -1); int defaultTab = SharedMediaLayout.TAB_PHOTOVIDEO; if (type == TYPE_ARCHIVED_CHANNEL_STORIES) { defaultTab = SharedMediaLayout.TAB_ARCHIVED_STORIES; @@ -343,36 +345,32 @@ public class MediaActivity extends BaseFragment implements SharedMediaLayout.Sha boolean hasAvatar = type == TYPE_MEDIA; - if (type == TYPE_STORIES_SEARCH) { - actionBar.setTitle(hashtag); - } else { - titlesContainer = new FrameLayout(context); - avatarContainer.addView(titlesContainer, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.FILL)); - for (int i = 0; i < (type == TYPE_STORIES ? 2 : 1); ++i) { - titles[i] = new FrameLayout(context); - titlesContainer.addView(titles[i], LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.FILL)); + titlesContainer = new FrameLayout(context); + avatarContainer.addView(titlesContainer, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.FILL)); + for (int i = 0; i < (type == TYPE_STORIES ? 2 : 1); ++i) { + titles[i] = new FrameLayout(context); + titlesContainer.addView(titles[i], LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.MATCH_PARENT, Gravity.FILL)); - nameTextView[i] = new SimpleTextView(context); - nameTextView[i].setPivotX(0); - nameTextView[i].setPivotY(dp(9)); + nameTextView[i] = new SimpleTextView(context); + nameTextView[i].setPivotX(0); + nameTextView[i].setPivotY(dp(9)); - nameTextView[i].setTextSize(18); - nameTextView[i].setGravity(Gravity.LEFT); - nameTextView[i].setTypeface(AndroidUtilities.bold()); - nameTextView[i].setLeftDrawableTopPadding(-dp(1.3f)); - nameTextView[i].setScrollNonFitText(true); - nameTextView[i].setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO); - titles[i].addView(nameTextView[i], LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, hasAvatar ? 118 : 72, 0, 56, 0)); + nameTextView[i].setTextSize(18); + nameTextView[i].setGravity(Gravity.LEFT); + nameTextView[i].setTypeface(AndroidUtilities.bold()); + nameTextView[i].setLeftDrawableTopPadding(-dp(1.3f)); + nameTextView[i].setScrollNonFitText(true); + nameTextView[i].setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO); + titles[i].addView(nameTextView[i], LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, hasAvatar ? 118 : 72, 0, 56, 0)); - subtitleTextView[i] = new AnimatedTextView(context, true, true, true); - subtitleTextView[i].setAnimationProperties(.4f, 0, 320, CubicBezierInterpolator.EASE_OUT_QUINT); - subtitleTextView[i].setTextSize(AndroidUtilities.dp(14)); - subtitleTextView[i].setTextColor(Theme.getColor(Theme.key_player_actionBarSubtitle)); - titles[i].addView(subtitleTextView[i], LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, hasAvatar ? 118 : 72, 0, 56, 0)); + subtitleTextView[i] = new AnimatedTextView(context, true, true, true); + subtitleTextView[i].setAnimationProperties(.4f, 0, 320, CubicBezierInterpolator.EASE_OUT_QUINT); + subtitleTextView[i].setTextSize(AndroidUtilities.dp(14)); + subtitleTextView[i].setTextColor(Theme.getColor(Theme.key_player_actionBarSubtitle)); + titles[i].addView(subtitleTextView[i], LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.LEFT | Gravity.TOP, hasAvatar ? 118 : 72, 0, 56, 0)); - if (i != 0) { - titles[i].setAlpha(0f); - } + if (i != 0) { + titles[i].setAlpha(0f); } } @@ -754,7 +752,10 @@ public class MediaActivity extends BaseFragment implements SharedMediaLayout.Sha } TLObject avatarObject = null; if (type == TYPE_STORIES_SEARCH) { - + nameTextView[0].setText(hashtag); + if (storiesCount != -1) { + subtitleTextView[0].setText(LocaleController.formatPluralStringSpaced("FoundStories", storiesCount)); + } } else if (type == TYPE_ARCHIVED_CHANNEL_STORIES) { nameTextView[0].setText(LocaleController.getString("ProfileStoriesArchive")); } else if (type == TYPE_STORIES) { @@ -868,6 +869,9 @@ public class MediaActivity extends BaseFragment implements SharedMediaLayout.Sha return; } int id = sharedMediaLayout.getClosestTab(); + if (type == TYPE_STORIES_SEARCH && id != SharedMediaLayout.TAB_STORIES) { + return; + } int[] mediaCount = sharedMediaPreloader.getLastMediaCount(); final boolean animated = !LocaleController.isRTL; int i; @@ -888,8 +892,15 @@ public class MediaActivity extends BaseFragment implements SharedMediaLayout.Sha int count = sharedMediaLayout.getStoriesCount(SharedMediaLayout.TAB_STORIES); if (count > 0) { - showSubtitle(0, true, true); - subtitleTextView[0].setText(LocaleController.formatPluralString("ProfileMyStoriesCount", count), animated); + if (type == TYPE_STORIES_SEARCH) { + if (TextUtils.isEmpty(subtitleTextView[0].getText())) { + showSubtitle(0, true, true); + subtitleTextView[0].setText(LocaleController.formatPluralStringSpaced("FoundStories", count), animated); + } + } else { + showSubtitle(0, true, true); + subtitleTextView[0].setText(LocaleController.formatPluralString("ProfileMyStoriesCount", count), animated); + } } else { showSubtitle(0, false, true); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/PipRoundVideoView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/PipRoundVideoView.java index 5ddb693e6..985038682 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/PipRoundVideoView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/PipRoundVideoView.java @@ -290,6 +290,7 @@ public class PipRoundVideoView implements NotificationCenter.NotificationCenterD windowLayoutParams.gravity = Gravity.TOP | Gravity.LEFT; windowLayoutParams.type = WindowManager.LayoutParams.LAST_APPLICATION_WINDOW; windowLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; + AndroidUtilities.setPreferredMaxRefreshRate(windowManager, windowView, windowLayoutParams); windowManager.addView(windowView, windowLayoutParams); } catch (Exception e) { FileLog.e(e); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/PipVideoOverlay.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/PipVideoOverlay.java index 2e55a79a9..70e5cd7c6 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/PipVideoOverlay.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/PipVideoOverlay.java @@ -928,6 +928,7 @@ public class PipVideoOverlay { protected void onConfigurationChanged(Configuration newConfig) { AndroidUtilities.checkDisplaySize(getContext(), newConfig); pipConfig = null; + AndroidUtilities.setPreferredMaxRefreshRate(windowManager, contentView, windowLayoutParams); if (pipWidth != getSuggestedWidth() * scaleFactor || pipHeight != getSuggestedHeight() * scaleFactor) { windowLayoutParams.width = pipWidth = (int) (getSuggestedWidth() * scaleFactor); @@ -1127,6 +1128,7 @@ public class PipVideoOverlay { windowLayoutParams.dimAmount = 0f; windowLayoutParams.flags = FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; + AndroidUtilities.setPreferredMaxRefreshRate(windowManager, contentView, windowLayoutParams); // Animate is a flag for PhotoViewer transition, not ours if (animate) { windowManager.addView(contentView, windowLayoutParams); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/cells/msg/GiveawayResultsMessageCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/cells/msg/GiveawayResultsMessageCell.java index 14e109417..35969bedc 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/cells/msg/GiveawayResultsMessageCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Premium/boosts/cells/msg/GiveawayResultsMessageCell.java @@ -342,7 +342,7 @@ public class GiveawayResultsMessageCell { } isStars = (giveaway.flags & 32) != 0; if (isStars) { - bottomStringBuilder.append(LocaleController.formatPluralStringComma("BoostingStarsGiveawayResultsMsgAllWinnersReceivedLinks", (int) giveaway.stars, ' ')); + bottomStringBuilder.append(LocaleController.formatPluralStringSpaced("BoostingStarsGiveawayResultsMsgAllWinnersReceivedLinks", (int) giveaway.stars)); } else { bottomStringBuilder.append(LocaleController.getString(R.string.BoostingGiveawayResultsMsgAllWinnersReceivedLinks)); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Reactions/CustomEmojiReactionsWindow.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Reactions/CustomEmojiReactionsWindow.java index 7488b336c..d658d1430 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Reactions/CustomEmojiReactionsWindow.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Reactions/CustomEmojiReactionsWindow.java @@ -291,6 +291,7 @@ public class CustomEmojiReactionsWindow { } else { WindowManager.LayoutParams lp = createLayoutParams(false); windowManager = AndroidUtilities.findActivity(context).getWindowManager(); + AndroidUtilities.setPreferredMaxRefreshRate(windowManager, windowView, lp); windowManager.addView(windowView, lp); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Reactions/ReactionsEffectOverlay.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Reactions/ReactionsEffectOverlay.java index ea15f3b45..bc5caa796 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Reactions/ReactionsEffectOverlay.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Reactions/ReactionsEffectOverlay.java @@ -756,6 +756,7 @@ public class ReactionsEffectOverlay { lp.format = PixelFormat.TRANSLUCENT; reactionsEffectOverlay.windowManager = baseFragment.getParentActivity().getWindowManager(); + AndroidUtilities.setPreferredMaxRefreshRate(reactionsEffectOverlay.windowManager, reactionsEffectOverlay.windowView, lp); reactionsEffectOverlay.windowManager.addView(reactionsEffectOverlay.windowView, lp); } else { reactionsEffectOverlay.decorView = (FrameLayout) baseFragment.getParentActivity().getWindow().getDecorView(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/Reactions/ReactionsLayoutInBubble.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/Reactions/ReactionsLayoutInBubble.java index fc9f8d269..ced770f60 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/Reactions/ReactionsLayoutInBubble.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/Reactions/ReactionsLayoutInBubble.java @@ -1216,6 +1216,25 @@ public class ReactionsLayoutInBubble { } } + public void stopAnimation() { + ImageReceiver imageReceiver; + if (animatedEmojiDrawable != null && animatedEmojiDrawable.getImageReceiver() != null) { + imageReceiver = animatedEmojiDrawable.getImageReceiver(); + } else { + imageReceiver = this.imageReceiver; + } + if (imageReceiver != null) { + RLottieDrawable rLottieDrawable = imageReceiver.getLottieAnimation(); + if (rLottieDrawable != null) { + rLottieDrawable.stop(); + } else { + AnimatedFileDrawable animatedFileDrawable = imageReceiver.getAnimation(); + if (animatedFileDrawable != null) { + animatedFileDrawable.stop(); + } + } + } + } public ImageReceiver previewImageReceiver; public AnimatedEmojiDrawable previewAnimatedEmojiDrawable; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/SearchViewPager.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/SearchViewPager.java index bdbbf024b..85909a58b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/SearchViewPager.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SearchViewPager.java @@ -481,6 +481,9 @@ public class SearchViewPager extends ViewPagerFixed implements FilteredSearchVie // MessagesController.getInstance(currentAccount).getChannelRecommendations(0); botsSearchAdapter.search(query); botsEmptyView.setKeyboardHeight(keyboardSize, false); + if (TextUtils.isEmpty(query)) { + botsSearchAdapter.checkBottom(); + } } else if (view == searchContainer) { if (dialogId == 0 && minDate == 0 && maxDate == 0 || forumDialogId != 0) { lastSearchScrolledToTop = false; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/SenderSelectPopup.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/SenderSelectPopup.java index c61e3dd29..5bcc8dd9c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/SenderSelectPopup.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SenderSelectPopup.java @@ -274,6 +274,7 @@ public class SenderSelectPopup extends ActionBarPopupWindow { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; } + AndroidUtilities.setPreferredMaxRefreshRate(windowManager, bulletinContainer, params); windowManager.addView(bulletinContainer, params); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/ThemeEditorView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/ThemeEditorView.java index ba17215f8..c104d2af3 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ThemeEditorView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ThemeEditorView.java @@ -1517,6 +1517,7 @@ public class ThemeEditorView { windowLayoutParams.gravity = Gravity.TOP | Gravity.LEFT; windowLayoutParams.type = WindowManager.LayoutParams.LAST_APPLICATION_WINDOW; windowLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; + AndroidUtilities.setPreferredMaxRefreshRate(windowManager, windowView, windowLayoutParams); windowManager.addView(windowView, windowLayoutParams); } catch (Exception e) { FileLog.e(e); @@ -1608,6 +1609,7 @@ public class ThemeEditorView { if (parentActivity == null) { return; } + AndroidUtilities.setPreferredMaxRefreshRate(windowManager, windowView, windowLayoutParams); try { windowManager.addView(windowView, windowLayoutParams); hidden = false; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/TranslateAlert2.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/TranslateAlert2.java index 53d7d76fd..4d43d1e0e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/TranslateAlert2.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/TranslateAlert2.java @@ -1134,6 +1134,9 @@ public class TranslateAlert2 extends BottomSheet implements NotificationCenter.N } public static TranslateAlert2 showAlert(Context context, BaseFragment fragment, int currentAccount, String fromLanguage, String toLanguage, CharSequence text, ArrayList entities, boolean noforwards, Utilities.CallbackReturn onLinkPress, Runnable onDismiss) { + if (context == null) { + return null; + } TranslateAlert2 alert = new TranslateAlert2(context, fromLanguage, toLanguage, text, entities, null) { @Override public void dismiss() { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/UniversalAdapter.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/UniversalAdapter.java index 305a93afb..6793a0328 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/UniversalAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/UniversalAdapter.java @@ -846,7 +846,7 @@ public class UniversalAdapter extends AdapterWithDiffUtils { if (item.accent && object instanceof TLRPC.User && ((TLRPC.User) object).bot_active_users != 0) { // show bot dau TLRPC.User user = (TLRPC.User) object; if (user.bot_active_users != 0) { - s = LocaleController.formatPluralStringComma("BotUsers", user.bot_active_users, ' '); + s = LocaleController.formatPluralStringSpaced("BotUsers", user.bot_active_users); } } else if (item.withUsername) { String username = null; @@ -865,9 +865,9 @@ public class UniversalAdapter extends AdapterWithDiffUtils { if (chat.participants_count != 0) { String membersString; if (ChatObject.isChannel(chat) && !chat.megagroup) { - membersString = LocaleController.formatPluralStringComma("Subscribers", chat.participants_count, ' '); + membersString = LocaleController.formatPluralStringSpaced("Subscribers", chat.participants_count); } else { - membersString = LocaleController.formatPluralStringComma("Members", chat.participants_count, ' '); + membersString = LocaleController.formatPluralStringSpaced("Members", chat.participants_count); } if (s instanceof SpannableStringBuilder) { ((SpannableStringBuilder) s).append(", ").append(membersString); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/voip/RTMPStreamPipOverlay.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/voip/RTMPStreamPipOverlay.java index 53d5547e5..3246dd3cf 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/voip/RTMPStreamPipOverlay.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/voip/RTMPStreamPipOverlay.java @@ -462,6 +462,7 @@ public class RTMPStreamPipOverlay implements NotificationCenter.NotificationCent @Override protected void onConfigurationChanged(Configuration newConfig) { AndroidUtilities.checkDisplaySize(getContext(), newConfig); + AndroidUtilities.setPreferredMaxRefreshRate(windowManager, contentView, windowLayoutParams); bindTextureView(); } @@ -612,6 +613,7 @@ public class RTMPStreamPipOverlay implements NotificationCenter.NotificationCent contentView.setAlpha(0f); contentView.setScaleX(0.1f); contentView.setScaleY(0.1f); + AndroidUtilities.setPreferredMaxRefreshRate(windowManager, contentView, windowLayoutParams); windowManager.addView(contentView, windowLayoutParams); AnimatorSet set = new AnimatorSet(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/voip/VoIPPiPView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/voip/VoIPPiPView.java index 78468d699..a764d0869 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/voip/VoIPPiPView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/voip/VoIPPiPView.java @@ -687,6 +687,7 @@ public class VoIPPiPView implements VoIPService.StateListener, NotificationCente layoutParams.x = (int) (windowLayoutParams.x - (widthExpanded - widthNormal) * cX); layoutParams.y = (int) (windowLayoutParams.y - (heightExpanded - heightNormal) * cY); + AndroidUtilities.setPreferredMaxRefreshRate(windowManager, pipViewExpanded.windowView, layoutParams); windowManager.addView(pipViewExpanded.windowView, layoutParams); pipViewExpanded.windowView.setAlpha(1f); pipViewExpanded.windowLayoutParams = layoutParams; @@ -784,6 +785,7 @@ public class VoIPPiPView implements VoIPService.StateListener, NotificationCente } swapRender(expandedInstance, instance); instance.windowView.setAlpha(1f); + AndroidUtilities.setPreferredMaxRefreshRate(windowManager, instance.windowView, instance.windowLayoutParams); windowManager.addView(instance.windowView, instance.windowLayoutParams); AndroidUtilities.runOnUIThread(() -> { if (instance == null || expandedInstance == null) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java index 2e64c7dc2..580e05391 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java @@ -9,6 +9,7 @@ package org.telegram.ui; import static org.telegram.messenger.AndroidUtilities.dp; +import static org.telegram.messenger.LocaleController.formatPluralStringComma; import static org.telegram.messenger.LocaleController.formatString; import static org.telegram.messenger.LocaleController.getString; @@ -5860,7 +5861,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. updateDialogsHint(); }).show(); }); - dialogsHintCell.setText(StarsIntroActivity.replaceStarsWithPlain(formatString(R.string.StarsSubscriptionExpiredHintTitle, starsNeeded - c.balance <= 0 ? starsNeeded : starsNeeded - c.balance, starsNeededName), .72f), LocaleController.getString(R.string.StarsSubscriptionExpiredHintText)); + dialogsHintCell.setText(StarsIntroActivity.replaceStarsWithPlain(formatPluralStringComma("StarsSubscriptionExpiredHintTitle2", (int) (starsNeeded - c.balance <= 0 ? starsNeeded : starsNeeded - c.balance), starsNeededName), .72f), LocaleController.getString(R.string.StarsSubscriptionExpiredHintText)); dialogsHintCell.setOnCloseListener(v -> { MessagesController.getInstance(currentAccount).removeSuggestion(0, "STARS_SUBSCRIPTION_LOW_BALANCE"); ChangeBounds transition = new ChangeBounds(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ExternalActionActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ExternalActionActivity.java index f4272cb31..dd82a4d05 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ExternalActionActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ExternalActionActivity.java @@ -601,6 +601,7 @@ public class ExternalActionActivity extends Activity implements INavigationLayou @Override public void onConfigurationChanged(android.content.res.Configuration newConfig) { AndroidUtilities.checkDisplaySize(this, newConfig); + AndroidUtilities.setPreferredMaxRefreshRate(getWindow()); super.onConfigurationChanged(newConfig); fixLayout(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java index 6ea3d7777..0833de485 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java @@ -6481,6 +6481,7 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati @Override public void onConfigurationChanged(Configuration newConfig) { AndroidUtilities.checkDisplaySize(this, newConfig); + AndroidUtilities.setPreferredMaxRefreshRate(getWindow()); super.onConfigurationChanged(newConfig); checkLayout(); PipRoundVideoView pipRoundVideoView = PipRoundVideoView.getInstance(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java index 275774bfe..7319380de 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java @@ -536,6 +536,7 @@ public class PopupNotificationActivity extends Activity implements NotificationC public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); AndroidUtilities.checkDisplaySize(this, newConfig); + AndroidUtilities.setPreferredMaxRefreshRate(getWindow()); fixLayout(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java index 382b36633..04d551065 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java @@ -12574,7 +12574,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. private void openUrl(String url, Browser.Progress progress) { if (url.startsWith("@")) { getMessagesController().openByUserName(url.substring(1), ProfileActivity.this, 0, progress); - } else if (url.startsWith("#")) { + } else if (url.startsWith("#") || url.startsWith("$")) { DialogsActivity fragment = new DialogsActivity(null); fragment.setSearchString(url); presentFragment(fragment); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ShareActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ShareActivity.java index 10cedb987..a78679150 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ShareActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ShareActivity.java @@ -38,6 +38,7 @@ public class ShareActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { ApplicationLoader.postInitApplication(); AndroidUtilities.checkDisplaySize(this, getResources().getConfiguration()); + AndroidUtilities.setPreferredMaxRefreshRate(getWindow()); requestWindowFeature(Window.FEATURE_NO_TITLE); setTheme(R.style.Theme_TMessages_Transparent); super.onCreate(savedInstanceState); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stars/BotStarsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/Stars/BotStarsActivity.java index 9202b41cd..32a683560 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stars/BotStarsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stars/BotStarsActivity.java @@ -1,10 +1,7 @@ package org.telegram.ui.Stars; import static org.telegram.messenger.AndroidUtilities.dp; -import static org.telegram.messenger.AndroidUtilities.dpf2; -import static org.telegram.messenger.LocaleController.formatPluralString; import static org.telegram.messenger.LocaleController.getString; -import static org.telegram.ui.ActionBar.Theme.key_statisticChartLine_golden; import android.app.Activity; import android.content.Context; @@ -12,28 +9,23 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.Typeface; import android.graphics.drawable.Drawable; -import android.os.Bundle; import android.text.Editable; import android.text.InputType; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.TextUtils; import android.text.TextWatcher; -import android.text.method.PasswordTransformationMethod; import android.text.style.RelativeSizeSpan; -import android.util.Log; import android.util.TypedValue; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.view.inputmethod.EditorInfo; -import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Space; import android.widget.TextView; -import androidx.annotation.NonNull; import androidx.core.view.NestedScrollingParent3; import androidx.core.view.NestedScrollingParentHelper; import androidx.core.view.ViewCompat; @@ -51,25 +43,19 @@ import org.telegram.messenger.UserConfig; import org.telegram.messenger.UserObject; import org.telegram.messenger.browser.Browser; import org.telegram.tgnet.ConnectionsManager; -import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; -import org.telegram.tgnet.tl.TL_stats; import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.AlertDialog; import org.telegram.ui.ActionBar.BackDrawable; import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ChannelMonetizationLayout; -import org.telegram.ui.Charts.data.ChartData; import org.telegram.ui.Components.AnimatedTextView; import org.telegram.ui.Components.Bulletin; import org.telegram.ui.Components.BulletinFactory; import org.telegram.ui.Components.ChatAvatarContainer; -import org.telegram.ui.Components.CircularProgressDrawable; import org.telegram.ui.Components.ColoredImageSpan; -import org.telegram.ui.Components.CubicBezierInterpolator; import org.telegram.ui.Components.EditTextBoldCursor; -import org.telegram.ui.Components.FlickerLoadingView; import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.OutlineTextContainerView; import org.telegram.ui.Components.RecyclerListView; @@ -77,16 +63,12 @@ import org.telegram.ui.Components.SizeNotifierFrameLayout; import org.telegram.ui.Components.UItem; import org.telegram.ui.Components.UniversalAdapter; import org.telegram.ui.Components.UniversalRecyclerView; -import org.telegram.ui.GradientHeaderActivity; import org.telegram.ui.StatisticActivity; import org.telegram.ui.Stories.recorder.ButtonWithCounterView; import org.telegram.ui.TwoStepVerificationActivity; import org.telegram.ui.TwoStepVerificationSetupActivity; -import java.text.DecimalFormat; -import java.text.DecimalFormatSymbols; import java.util.ArrayList; -import java.util.List; import java.util.Locale; public class BotStarsActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate { @@ -460,7 +442,7 @@ public class BotStarsActivity extends BaseFragment implements NotificationCenter AndroidUtilities.runOnUIThread(this.setBalanceButtonText, 1000); } else { balanceButton.setSubText(null, true); - balanceButton.setText(StarsIntroActivity.replaceStars(balanceEditTextAll ? getString(R.string.BotStarsButtonWithdrawShortAll) : LocaleController.formatPluralStringComma("BotStarsButtonWithdrawShort", (int) balanceEditTextValue, ' '), starRef), true); + balanceButton.setText(StarsIntroActivity.replaceStars(balanceEditTextAll ? getString(R.string.BotStarsButtonWithdrawShortAll) : LocaleController.formatPluralStringSpaced("BotStarsButtonWithdrawShort", (int) balanceEditTextValue), starRef), true); } }; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stars/StarsIntroActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/Stars/StarsIntroActivity.java index 5cd7ee80a..7e2f4dd80 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stars/StarsIntroActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stars/StarsIntroActivity.java @@ -3,6 +3,7 @@ package org.telegram.ui.Stars; import static org.telegram.messenger.AndroidUtilities.dp; import static org.telegram.messenger.LocaleController.formatPluralString; import static org.telegram.messenger.LocaleController.formatPluralStringComma; +import static org.telegram.messenger.LocaleController.formatPluralStringSpaced; import static org.telegram.messenger.LocaleController.formatString; import static org.telegram.messenger.LocaleController.getString; import static org.telegram.ui.Stars.StarsIntroActivity.StarsTransactionView.getPlatformDrawable; @@ -54,9 +55,6 @@ import androidx.recyclerview.widget.DefaultItemAnimator; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import com.google.android.exoplayer2.scheduler.RequirementsWatcher; -import com.google.common.collect.Lists; - import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.BillingController; import org.telegram.messenger.BirthdayController; @@ -118,7 +116,6 @@ import org.telegram.ui.Components.RLottieDrawable; import org.telegram.ui.Components.RecyclerListView; import org.telegram.ui.Components.ScaleStateListAnimator; import org.telegram.ui.Components.StarAppsSheet; -import org.telegram.ui.Components.TableLayout; import org.telegram.ui.Components.TableView; import org.telegram.ui.Components.Text; import org.telegram.ui.Components.UItem; @@ -135,7 +132,6 @@ import org.telegram.ui.Stories.recorder.ButtonWithCounterView; import org.telegram.ui.Stories.recorder.HintView2; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.HashMap; @@ -823,7 +819,7 @@ public class StarsIntroActivity extends GradientHeaderActivity implements Notifi item.id = id; item.intValue = index; item.longValue = option.stars; - item.text = formatPluralStringComma("StarsCount", (int) option.stars, ' '); + item.text = formatPluralStringSpaced("StarsCount", (int) option.stars); item.subtext = option.loadingStorePrice ? null : BillingController.getInstance().formatCurrency(option.amount, option.currency); item.object = option; return item; @@ -834,7 +830,7 @@ public class StarsIntroActivity extends GradientHeaderActivity implements Notifi item.id = id; item.intValue = index; item.longValue = option.stars; - item.text = formatPluralStringComma("StarsCount", (int) option.stars, ' '); + item.text = formatPluralStringSpaced("StarsCount", (int) option.stars); item.subtext = option.loadingStorePrice ? null : BillingController.getInstance().formatCurrency(option.amount, option.currency); item.object = option; return item; @@ -3654,7 +3650,7 @@ public class StarsIntroActivity extends GradientHeaderActivity implements Notifi textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); textView.setTypeface(AndroidUtilities.bold()); textView.setGravity(Gravity.CENTER); - textView.setText(LocaleController.formatPluralStringComma("BoostStars", (int) boost.stars, ' ')); + textView.setText(LocaleController.formatPluralStringSpaced("BoostStars", (int) boost.stars)); linearLayout.addView(textView, LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER, 20, 0, 20, 4)); textView = new TextView(context); @@ -3664,7 +3660,7 @@ public class StarsIntroActivity extends GradientHeaderActivity implements Notifi textView.setPadding(dp(4), 0, dp(8.33f), 0); textView.setGravity(Gravity.CENTER); textView.setTypeface(AndroidUtilities.bold()); - final SpannableStringBuilder sb = new SpannableStringBuilder("x" + LocaleController.formatPluralStringComma("BoostingBoostsCount", boost.multiplier == 0 ? 1 : boost.multiplier, ' ')); + final SpannableStringBuilder sb = new SpannableStringBuilder("x" + LocaleController.formatPluralStringSpaced("BoostingBoostsCount", boost.multiplier == 0 ? 1 : boost.multiplier)); final ColoredImageSpan span = new ColoredImageSpan(R.drawable.mini_boost_badge, ColoredImageSpan.ALIGN_CENTER); span.translate(0, dp(0.66f)); sb.setSpan(span, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoryViewer.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoryViewer.java index 034037b35..af0e30a69 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoryViewer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoryViewer.java @@ -1628,6 +1628,7 @@ public class StoryViewer implements NotificationCenter.NotificationCenterDelegat }); containerView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); } + AndroidUtilities.setPreferredMaxRefreshRate(windowManager, windowView, windowLayoutParams); windowManager.addView(windowView, windowLayoutParams); } windowView.requestLayout(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoryWaveEffectView.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoryWaveEffectView.java index ed3e085df..29b55d538 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoryWaveEffectView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/StoryWaveEffectView.java @@ -166,6 +166,7 @@ public class StoryWaveEffectView extends TextureView implements TextureView.Surf } public StoryWaveEffectView start() { + AndroidUtilities.setPreferredMaxRefreshRate(windowManager, this, layoutParams); windowManager.addView(this, layoutParams); return this; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/StoryRecorder.java b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/StoryRecorder.java index 16c7ebd7a..a6911d506 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/StoryRecorder.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Stories/recorder/StoryRecorder.java @@ -485,6 +485,7 @@ public class StoryRecorder implements NotificationCenter.NotificationCenterDeleg forceBackgroundVisible = false; if (windowManager != null && windowView != null && windowView.getParent() == null) { + AndroidUtilities.setPreferredMaxRefreshRate(windowManager, windowView, windowLayoutParams); windowManager.addView(windowView, windowLayoutParams); } @@ -546,6 +547,7 @@ public class StoryRecorder implements NotificationCenter.NotificationCenterDeleg videoTextureHolder.active = false; if (windowManager != null && windowView != null && windowView.getParent() == null) { + AndroidUtilities.setPreferredMaxRefreshRate(windowManager, windowView, windowLayoutParams); windowManager.addView(windowView, windowLayoutParams); } @@ -603,6 +605,7 @@ public class StoryRecorder implements NotificationCenter.NotificationCenterDeleg forceBackgroundVisible = false; if (windowManager != null && windowView != null && windowView.getParent() == null) { + AndroidUtilities.setPreferredMaxRefreshRate(windowManager, windowView, windowLayoutParams); windowManager.addView(windowView, windowLayoutParams); } @@ -662,6 +665,7 @@ public class StoryRecorder implements NotificationCenter.NotificationCenterDeleg forceBackgroundVisible = false; if (windowManager != null && windowView != null && windowView.getParent() == null) { + AndroidUtilities.setPreferredMaxRefreshRate(windowManager, windowView, windowLayoutParams); windowManager.addView(windowView, windowLayoutParams); } @@ -722,6 +726,7 @@ public class StoryRecorder implements NotificationCenter.NotificationCenterDeleg forceBackgroundVisible = false; if (windowManager != null && windowView != null && windowView.getParent() == null) { + AndroidUtilities.setPreferredMaxRefreshRate(windowManager, windowView, windowLayoutParams); windowManager.addView(windowView, windowLayoutParams); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/web/BotWebViewContainer.java b/TMessagesProj/src/main/java/org/telegram/ui/web/BotWebViewContainer.java index d496fa8b0..4a09b097a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/web/BotWebViewContainer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/web/BotWebViewContainer.java @@ -2968,7 +2968,10 @@ public abstract class BotWebViewContainer extends FrameLayout implements Notific @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url == null) return false; - if (url.startsWith("tel:")) { + if (url.trim().startsWith("sms:")) { + return false; + } + if (url.trim().startsWith("tel:")) { if (opener != null) { if (botWebViewContainer.delegate != null) { botWebViewContainer.delegate.onInstantClose(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/web/WebActionBar.java b/TMessagesProj/src/main/java/org/telegram/ui/web/WebActionBar.java index 42efd7369..8a39df6ba 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/web/WebActionBar.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/web/WebActionBar.java @@ -21,6 +21,7 @@ import android.graphics.PorterDuffColorFilter; import android.graphics.RectF; import android.graphics.drawable.Drawable; import android.text.Editable; +import android.text.TextPaint; import android.text.TextUtils; import android.text.TextWatcher; import android.util.TypedValue; @@ -80,6 +81,8 @@ public class WebActionBar extends FrameLayout { public int textColor, iconColor; public int addressBackgroundColor, addressTextColor; + public final TextPaint titlePaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); + public boolean isMenuShown = false; public int height = dp(56); @@ -130,6 +133,9 @@ public class WebActionBar extends FrameLayout { super(context); this.resourcesProvider = resourcesProvider; + titlePaint.setTypeface(AndroidUtilities.bold()); + titlePaint.setTextSize(dp(18.33f)); + for (int i = 0; i < 2; ++i) { backgroundPaint[i] = new Paint(Paint.ANTI_ALIAS_FLAG); progressBackgroundPaint[i] = new Paint(Paint.ANTI_ALIAS_FLAG); diff --git a/TMessagesProj/src/main/res/values/strings.xml b/TMessagesProj/src/main/res/values/strings.xml index f048d0573..6f69b66bd 100644 --- a/TMessagesProj/src/main/res/values/strings.xml +++ b/TMessagesProj/src/main/res/values/strings.xml @@ -6095,6 +6095,8 @@ Saved stories can be viewed by others on your profile until you remove them. %d story is hidden from your profile %d stories are hidden from your profile + %d story + %d stories Open Link This story is shown to everyone. This story is shown to your close friends. @@ -7956,7 +7958,8 @@ Your subscription expired on %s. Join Channel You left channel, but you can still get back until %s. - ⭐️%1$d Stars needed for %2$s + ⭐️%1$d Star needed for %2$s + ⭐️%1$d Stars needed for %2$s Insufficient funds to cover your subscription. Subscriber appx. %1$s per month diff --git a/TMessagesProj_AppStandalone/src/main/java/org/telegram/ui/Components/UpdateLayout.java b/TMessagesProj_AppStandalone/src/main/java/org/telegram/ui/Components/UpdateLayout.java index 0926679b9..2e6db4394 100644 --- a/TMessagesProj_AppStandalone/src/main/java/org/telegram/ui/Components/UpdateLayout.java +++ b/TMessagesProj_AppStandalone/src/main/java/org/telegram/ui/Components/UpdateLayout.java @@ -2,6 +2,8 @@ package org.telegram.ui.Components; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; import android.app.Activity; import android.graphics.Canvas; import android.graphics.LinearGradient; @@ -9,6 +11,7 @@ import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Shader; import android.os.Build; +import android.text.TextUtils; import android.util.TypedValue; import android.view.Gravity; import android.view.View; @@ -27,13 +30,15 @@ import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.IUpdateLayout; import java.io.File; +import java.util.ArrayList; public class UpdateLayout extends IUpdateLayout { private FrameLayout updateLayout; private RadialProgress2 updateLayoutIcon; - private SimpleTextView updateTextView; + private SimpleTextView[] updateTextViews; private TextView updateSizeTextView; + private AnimatorSet updateTextAnimator; private Activity activity; private ViewGroup sideMenu; @@ -47,7 +52,8 @@ public class UpdateLayout extends IUpdateLayout { } public void updateFileProgress(Object[] args) { - if (updateTextView != null && SharedConfig.isAppUpdateAvailable()) { + if (updateTextViews == null || args == null) return; + if (updateTextViews[0] != null && SharedConfig.isAppUpdateAvailable()) { String location = (String) args[0]; String fileName = FileLoader.getAttachFileName(SharedConfig.pendingAppUpdate.document); if (fileName != null && fileName.equals(location)) { @@ -55,13 +61,13 @@ public class UpdateLayout extends IUpdateLayout { Long totalSize = (Long) args[2]; float loadProgress = loadedSize / (float) totalSize; updateLayoutIcon.setProgress(loadProgress, true); - updateTextView.setText(LocaleController.formatString("AppUpdateDownloading", R.string.AppUpdateDownloading, (int) (loadProgress * 100))); + updateTextViews[0].setText(LocaleController.formatString("AppUpdateDownloading", R.string.AppUpdateDownloading, (int) (loadProgress * 100))); } } } public void createUpdateUI(int currentAccount) { - if (sideMenuContainer == null) { + if (sideMenuContainer == null || updateLayout != null) { return; } updateLayout = new FrameLayout(activity) { @@ -121,13 +127,18 @@ public class UpdateLayout extends IUpdateLayout { updateLayoutIcon.setCircleRadius(AndroidUtilities.dp(11)); updateLayoutIcon.setAsMini(); - updateTextView = new SimpleTextView(activity); - updateTextView.setTextSize(15); - updateTextView.setTypeface(AndroidUtilities.bold()); - updateTextView.setText(LocaleController.getString(R.string.AppUpdate)); - updateTextView.setTextColor(0xffffffff); - updateTextView.setGravity(Gravity.LEFT); - updateLayout.addView(updateTextView, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_VERTICAL, 74, 0, 0, 0)); + updateTextViews = new SimpleTextView[2]; + for (int i = 0; i < 2; ++i) { + updateTextViews[i] = new SimpleTextView(activity); + updateTextViews[i].setTextSize(15); + updateTextViews[i].setTypeface(AndroidUtilities.bold()); + updateTextViews[i].setTextColor(0xffffffff); + updateTextViews[i].setGravity(Gravity.LEFT); + updateLayout.addView(updateTextViews[i], LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_VERTICAL, 74, 0, 0, 0)); + } + updateTextViews[0].setText(LocaleController.getString(R.string.AppUpdate)); + updateTextViews[1].setAlpha(0f); + updateTextViews[1].setVisibility(View.GONE); updateSizeTextView = new TextView(activity); updateSizeTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); @@ -142,26 +153,25 @@ public class UpdateLayout extends IUpdateLayout { return; } if (SharedConfig.isAppUpdateAvailable()) { - View prevUpdateLayout = updateLayout; createUpdateUI(currentAccount); updateSizeTextView.setText(AndroidUtilities.formatFileSize(SharedConfig.pendingAppUpdate.document.size)); String fileName = FileLoader.getAttachFileName(SharedConfig.pendingAppUpdate.document); File path = FileLoader.getInstance(currentAccount).getPathToAttach(SharedConfig.pendingAppUpdate.document, true); boolean showSize; if (path.exists()) { - updateLayoutIcon.setIcon(MediaActionDrawable.ICON_UPDATE, true, false); - updateTextView.setText(LocaleController.getString(R.string.AppUpdateNow)); + updateLayoutIcon.setIcon(MediaActionDrawable.ICON_UPDATE, true, animated); + setUpdateText(LocaleController.getString(R.string.AppUpdateNow), animated); showSize = false; } else { if (FileLoader.getInstance(currentAccount).isLoadingFile(fileName)) { - updateLayoutIcon.setIcon(MediaActionDrawable.ICON_CANCEL, true, false); + updateLayoutIcon.setIcon(MediaActionDrawable.ICON_CANCEL, true, animated); updateLayoutIcon.setProgress(0, false); Float p = ImageLoader.getInstance().getFileProgress(fileName); - updateTextView.setText(LocaleController.formatString("AppUpdateDownloading", R.string.AppUpdateDownloading, (int) ((p != null ? p : 0.0f) * 100))); + setUpdateText(LocaleController.formatString("AppUpdateDownloading", R.string.AppUpdateDownloading, (int) ((p != null ? p : 0.0f) * 100)), animated); showSize = false; } else { - updateLayoutIcon.setIcon(MediaActionDrawable.ICON_DOWNLOAD, true, false); - updateTextView.setText(LocaleController.getString(R.string.AppUpdate)); + updateLayoutIcon.setIcon(MediaActionDrawable.ICON_DOWNLOAD, true, animated); + setUpdateText(LocaleController.getString(R.string.AppUpdate), animated); showSize = true; } } @@ -194,22 +204,9 @@ public class UpdateLayout extends IUpdateLayout { updateLayout.setVisibility(View.VISIBLE); updateLayout.setTag(1); if (animated) { - updateLayout.animate().translationY(0).setInterpolator(CubicBezierInterpolator.EASE_OUT).setListener(null).setDuration(180).withEndAction(() -> { - if (prevUpdateLayout != null) { - ViewGroup parent = (ViewGroup) prevUpdateLayout.getParent(); - if (parent != null) { - parent.removeView(prevUpdateLayout); - } - } - }).start(); + updateLayout.animate().translationY(0).setInterpolator(CubicBezierInterpolator.EASE_OUT).setListener(null).setDuration(180).start(); } else { updateLayout.setTranslationY(0); - if (prevUpdateLayout != null) { - ViewGroup parent = (ViewGroup) prevUpdateLayout.getParent(); - if (parent != null) { - parent.removeView(prevUpdateLayout); - } - } } sideMenu.setPadding(0, 0, 0, AndroidUtilities.dp(44)); } else { @@ -233,5 +230,48 @@ public class UpdateLayout extends IUpdateLayout { sideMenu.setPadding(0, 0, 0, 0); } } -} + private void setUpdateText(String text, boolean animate) { + if (TextUtils.equals(updateTextViews[0].getText(), text)) { + return; + } + if (updateTextAnimator != null) { + updateTextAnimator.cancel(); + updateTextAnimator = null; + } + + if (animate) { + updateTextViews[1].setText(updateTextViews[0].getText()); + updateTextViews[0].setText(text); + + updateTextViews[0].setAlpha(0); + updateTextViews[1].setAlpha(1); + updateTextViews[0].setVisibility(View.VISIBLE); + updateTextViews[1].setVisibility(View.VISIBLE); + + ArrayList arrayList = new ArrayList<>(); + arrayList.add(ObjectAnimator.ofFloat(updateTextViews[1], View.ALPHA, 0)); + arrayList.add(ObjectAnimator.ofFloat(updateTextViews[0], View.ALPHA, 1)); + + updateTextAnimator = new AnimatorSet(); + updateTextAnimator.playTogether(arrayList); + updateTextAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + if (updateTextAnimator == animation) { + updateTextViews[1].setVisibility(View.GONE); + updateTextAnimator = null; + } + } + }); + updateTextAnimator.setDuration(320); + updateTextAnimator.setInterpolator(CubicBezierInterpolator.EASE_OUT_QUINT); + updateTextAnimator.start(); + } else { + updateTextViews[0].setText(text); + updateTextViews[0].setAlpha(1); + updateTextViews[0].setVisibility(View.VISIBLE); + updateTextViews[1].setVisibility(View.GONE); + } + } +} diff --git a/gradle.properties b/gradle.properties index 83358ec2b..d5929101f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,8 +13,8 @@ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true #Sat Mar 12 05:53:50 MSK 2016 -APP_VERSION_CODE=5240 -APP_VERSION_NAME=11.1.2 +APP_VERSION_CODE=5243 +APP_VERSION_NAME=11.1.3 APP_PACKAGE=org.telegram.messenger IS_PRIVATE=false RELEASE_KEY_PASSWORD=android