From ce5e817fb5130d55ca32b55158dde668ddf75c7b Mon Sep 17 00:00:00 2001 From: DrKLO Date: Mon, 30 Mar 2020 19:49:17 +0300 Subject: [PATCH] Update to 6.0.1 (1910) --- TMessagesProj/build.gradle | 4 +- TMessagesProj/jni/Application.mk | 2 +- .../org/telegram/messenger/BuildVars.java | 2 +- .../messenger/MessagesController.java | 17 +- .../telegram/messenger/MessagesStorage.java | 46 +++- .../org/telegram/messenger/NativeLoader.java | 201 ++++++++++-------- .../messenger/NotificationsController.java | 8 +- .../org/telegram/ui/Cells/SharedLinkCell.java | 2 +- .../java/org/telegram/ui/ChatActivity.java | 10 +- .../ui/Components/ChatActivityEnterView.java | 78 ++++--- .../org/telegram/ui/Components/UndoView.java | 47 +++- .../java/org/telegram/ui/DialogsActivity.java | 15 +- .../src/main/res/drawable-mdpi/dice.png | Bin 0 -> 1101 bytes .../src/main/res/drawable-xhdpi/dice.png | Bin 0 -> 2478 bytes .../src/main/res/drawable-xxhdpi/dice.png | Bin 0 -> 3956 bytes TMessagesProj/src/main/res/drawable/dice.png | Bin 0 -> 1809 bytes TMessagesProj/src/main/res/values/strings.xml | 3 +- 17 files changed, 276 insertions(+), 159 deletions(-) create mode 100644 TMessagesProj/src/main/res/drawable-mdpi/dice.png create mode 100644 TMessagesProj/src/main/res/drawable-xhdpi/dice.png create mode 100644 TMessagesProj/src/main/res/drawable-xxhdpi/dice.png create mode 100644 TMessagesProj/src/main/res/drawable/dice.png diff --git a/TMessagesProj/build.gradle b/TMessagesProj/build.gradle index 5406b45f6..da98676cc 100644 --- a/TMessagesProj/build.gradle +++ b/TMessagesProj/build.gradle @@ -285,7 +285,7 @@ android { } } - defaultConfig.versionCode = 1908 + defaultConfig.versionCode = 1910 def tgVoipDexFileName = "libtgvoip.dex" def tgVoipDexClasses = ["AudioRecordJNI", "AudioTrackJNI", "NativeTgVoipDelegate", "NativeTgVoipInstance", "TgVoipNativeLoader", "Resampler", "VLog"] @@ -380,7 +380,7 @@ android { defaultConfig { minSdkVersion 16 targetSdkVersion 28 - versionName "6.0.0" + versionName "6.0.1" vectorDrawables.generatedDensities = ['mdpi', 'hdpi', 'xhdpi', 'xxhdpi'] diff --git a/TMessagesProj/jni/Application.mk b/TMessagesProj/jni/Application.mk index 3520a589b..c29d77286 100644 --- a/TMessagesProj/jni/Application.mk +++ b/TMessagesProj/jni/Application.mk @@ -1,3 +1,3 @@ APP_PLATFORM := android-16 NDK_TOOLCHAIN_VERSION := clang -APP_STL := c++_shared \ No newline at end of file +APP_STL := c++_static \ No newline at end of file diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java b/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java index 3511f82b2..736a96cb1 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java @@ -19,7 +19,7 @@ public class BuildVars { public static boolean USE_CLOUD_STRINGS = true; public static boolean CHECK_UPDATES = true; public static boolean TON_WALLET_STANDALONE = false; - public static int BUILD_VERSION = 1908; + public static int BUILD_VERSION = 1910; public static String BUILD_VERSION_STRING = "6.0.0"; public static int APP_ID = 4; public static String APP_HASH = "014b35b6184100b085b0d0572f9b5103"; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java index 590318030..8d1772b12 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java @@ -257,6 +257,7 @@ public class MessagesController extends BaseController implements NotificationCe public boolean backgroundConnection; public float animatedEmojisZoom; public boolean filtersEnabled; + public boolean showFiltersTooltip; public String venueSearchBot; public String gifSearchBot; public String imageSearchBot; @@ -524,6 +525,7 @@ public class MessagesController extends BaseController implements NotificationCe animatedEmojisZoom = mainPreferences.getFloat("animatedEmojisZoom", 0.625f); qrLoginCamera = mainPreferences.getBoolean("qrLoginCamera", false); filtersEnabled = mainPreferences.getBoolean("filtersEnabled", false); + showFiltersTooltip = mainPreferences.getBoolean("showFiltersTooltip", false); } private void sendLoadPeersRequest(TLObject req, ArrayList requests, TLRPC.messages_Dialogs pinnedDialogs, TLRPC.messages_Dialogs pinnedRemoteDialogs, ArrayList users, ArrayList chats, ArrayList filtersToSave, SparseArray filtersToDelete, ArrayList filtersOrder, HashMap> filterDialogRemovals, HashMap> filterUserRemovals, HashSet filtersUnreadCounterReset) { @@ -993,6 +995,15 @@ public class MessagesController extends BaseController implements NotificationCe filtersEnabled = bool.value; editor.putBoolean("filtersEnabled", filtersEnabled); changed = true; + } + } + } else if ("dialog_filters_tooltip".equals(value.key)) { + if (value.value instanceof TLRPC.TL_jsonBool) { + TLRPC.TL_jsonBool bool = (TLRPC.TL_jsonBool) value.value; + if (bool.value != showFiltersTooltip) { + showFiltersTooltip = bool.value; + editor.putBoolean("showFiltersTooltip", showFiltersTooltip); + changed = true; getNotificationCenter().postNotificationName(NotificationCenter.filterSettingsUpdated); } } @@ -11630,9 +11641,13 @@ public class MessagesController extends BaseController implements NotificationCe } public boolean isDialogMuted(long dialog_id) { + return isDialogMuted(dialog_id, null); + } + + public boolean isDialogMuted(long dialog_id, TLRPC.Chat chat) { int mute_type = notificationsPreferences.getInt("notify2_" + dialog_id, -1); if (mute_type == -1) { - return !getNotificationsController().isGlobalNotificationsEnabled(dialog_id); + return !getNotificationsController().isGlobalNotificationsEnabled(dialog_id, chat); } if (mute_type == 2) { return true; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java index acb05ed7b..6fdf7ad24 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java @@ -1728,6 +1728,9 @@ public class MessagesStorage extends BaseController { if (mentions > 0) { dialogsWithMentions.put(did, mentions); } + /*if (BuildVars.DEBUG_VERSION) { + FileLog.d("unread chat " + did + " counters = " + unread + " and " + mentions); + }*/ dialogsByFolders.put(did, folderId); int lower_id = (int) did; int high_id = (int) (did >> 32); @@ -1807,7 +1810,7 @@ public class MessagesStorage extends BaseController { continue; } int idx1 = dialogsByFolders.get(-chat.id); - int idx2 = getMessagesController().isDialogMuted(-chat.id) && dialogsWithMentions.indexOfKey(-chat.id) < 0 ? 1 : 0; + int idx2 = getMessagesController().isDialogMuted(-chat.id, chat) && dialogsWithMentions.indexOfKey(-chat.id) < 0 ? 1 : 0; if (ChatObject.isChannel(chat) && !chat.megagroup) { channels[idx1][idx2]++; } else { @@ -1816,6 +1819,15 @@ public class MessagesStorage extends BaseController { chatsDict.put(chat.id, chat); } } + /*if (BuildVars.DEBUG_VERSION) { + for (int b = 0; b < 2; b++) { + FileLog.d("contacts = " + contacts[b][0] + ", " + contacts[b][1]); + FileLog.d("nonContacts = " + nonContacts[b][0] + ", " + nonContacts[b][1]); + FileLog.d("groups = " + groups[b][0] + ", " + groups[b][1]); + FileLog.d("channels = " + channels[b][0] + ", " + channels[b][1]); + FileLog.d("bots = " + bots[b][0] + ", " + bots[b][1]); + } + }*/ for (int a = 0, N = dialogFilters.size(); a < N + 2; a++) { MessagesController.DialogFilter filter; int flags; @@ -1979,6 +1991,9 @@ public class MessagesStorage extends BaseController { } } filter.pendingUnreadCount = unreadCount; + /*if (BuildVars.DEBUG_VERSION) { + FileLog.d("filter " + filter.name + " flags = " + filter.flags + " unread count = " + filter.pendingUnreadCount); + }*/ if (apply) { filter.unreadCount = unreadCount; } @@ -3610,17 +3625,32 @@ public class MessagesStorage extends BaseController { if (read) { if (b == 0) { dialogsWithUnread.remove(did); + /*if (BuildVars.DEBUG_VERSION) { + FileLog.d("read remove = " + did); + }*/ } else { dialogsWithMentions.remove(did); + /*if (BuildVars.DEBUG_VERSION) { + FileLog.d("mention remove = " + did); + }*/ } } else { if (b == 0) { dialogsWithUnread.put(did, count); + /*if (BuildVars.DEBUG_VERSION) { + FileLog.d("read add = " + did); + }*/ } else { dialogsWithMentions.put(did, count); + /*if (BuildVars.DEBUG_VERSION) { + FileLog.d("mention add = " + did); + }*/ } } if (b == 0 && dialogsWithMentions.indexOfKey(did) >= 0 || b == 1 && dialogsWithUnread.indexOfKey(did) >= 0) { + /*if (BuildVars.DEBUG_VERSION) { + FileLog.d("read = " + read + " ignore " + b); + }*/ continue; } SQLiteCursor cursor = database.queryFinalized("SELECT folder_id FROM dialogs WHERE did = " + did); @@ -3708,7 +3738,7 @@ public class MessagesStorage extends BaseController { continue; } int idx1 = dialogsByFolders.get(-chat.id); - int idx2 = getMessagesController().isDialogMuted(-chat.id) && (dialogsToUpdateMentions == null || dialogsToUpdateMentions.indexOfKey(-chat.id) < 0) ? 1 : 0; + int idx2 = getMessagesController().isDialogMuted(-chat.id, chat) && (dialogsToUpdateMentions == null || dialogsToUpdateMentions.indexOfKey(-chat.id) < 0) ? 1 : 0; if (ChatObject.isChannel(chat) && !chat.megagroup) { channels[idx1][idx2]++; } else { @@ -3717,6 +3747,15 @@ public class MessagesStorage extends BaseController { chatsDict.put(chat.id, chat); } } + /*if (BuildVars.DEBUG_VERSION) { + for (int b = 0; b < 2; b++) { + FileLog.d("read = " + read + " contacts = " + contacts[b][0] + ", " + contacts[b][1]); + FileLog.d("read = " + read + " nonContacts = " + nonContacts[b][0] + ", " + nonContacts[b][1]); + FileLog.d("read = " + read + " groups = " + groups[b][0] + ", " + groups[b][1]); + FileLog.d("read = " + read + " channels = " + channels[b][0] + ", " + channels[b][1]); + FileLog.d("read = " + read + " bots = " + bots[b][0] + ", " + bots[b][1]); + } + }*/ for (int a = 0, N = dialogFilters.size(); a < N + 2; a++) { int unreadCount; @@ -4033,6 +4072,9 @@ public class MessagesStorage extends BaseController { } if (filter != null) { filter.pendingUnreadCount = unreadCount; + /*if (BuildVars.DEBUG_VERSION) { + FileLog.d("filter " + filter.name + " flags = " + flags + " read = " + read + " unread count = " + filter.pendingUnreadCount); + }*/ } else if (a == N) { pendingMainUnreadCount = unreadCount; } else if (a == N + 1) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/NativeLoader.java b/TMessagesProj/src/main/java/org/telegram/messenger/NativeLoader.java index a5ba47737..4bd3b1bed 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/NativeLoader.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/NativeLoader.java @@ -10,13 +10,13 @@ package org.telegram.messenger; import android.annotation.SuppressLint; import android.content.Context; +import android.content.pm.ApplicationInfo; import android.os.Build; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; -import java.util.Locale; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -24,36 +24,105 @@ public class NativeLoader { private final static int LIB_VERSION = 30; private final static String LIB_NAME = "tmessages." + LIB_VERSION; - private final static String SHARED_LIB_NAME = "c++_shared"; + private final static String LIB_SO_NAME = "lib" + LIB_NAME + ".so"; + private final static String LOCALE_LIB_SO_NAME = "lib" + LIB_NAME + "loc.so"; + private String crashPath = ""; private static volatile boolean nativeLoaded = false; - private NativeLoader() { + private static File getNativeLibraryDir(Context context) { + File f = null; + if (context != null) { + try { + f = new File((String)ApplicationInfo.class.getField("nativeLibraryDir").get(context.getApplicationInfo())); + } catch (Throwable th) { + th.printStackTrace(); + } + } + if (f == null) { + f = new File(context.getApplicationInfo().dataDir, "lib"); + } + if (f.isDirectory()) { + return f; + } + return null; } - public static synchronized void initNativeLibs(Context context) { - if (!nativeLoaded) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) { - if (!loadNativeLib(context, SHARED_LIB_NAME)) { - throw new IllegalStateException("unable to load shared c++ library: " + SHARED_LIB_NAME); + @SuppressLint({"UnsafeDynamicallyLoadedCode", "SetWorldReadable"}) + private static boolean loadFromZip(Context context, File destDir, File destLocalFile, String folder) { + try { + for (File file : destDir.listFiles()) { + file.delete(); + } + } catch (Exception e) { + FileLog.e(e); + } + + ZipFile zipFile = null; + InputStream stream = null; + try { + zipFile = new ZipFile(context.getApplicationInfo().sourceDir); + ZipEntry entry = zipFile.getEntry("lib/" + folder + "/" + LIB_SO_NAME); + if (entry == null) { + throw new Exception("Unable to find file in apk:" + "lib/" + folder + "/" + LIB_NAME); + } + stream = zipFile.getInputStream(entry); + + OutputStream out = new FileOutputStream(destLocalFile); + byte[] buf = new byte[4096]; + int len; + while ((len = stream.read(buf)) > 0) { + Thread.yield(); + out.write(buf, 0, len); + } + out.close(); + + destLocalFile.setReadable(true, false); + destLocalFile.setExecutable(true, false); + destLocalFile.setWritable(true); + + try { + System.load(destLocalFile.getAbsolutePath()); + nativeLoaded = true; + } catch (Error e) { + FileLog.e(e); + } + return true; + } catch (Exception e) { + FileLog.e(e); + } finally { + if (stream != null) { + try { + stream.close(); + } catch (Exception e) { + FileLog.e(e); } } - if (!loadNativeLib(context, LIB_NAME)) { - throw new IllegalStateException("unable to load native library: " + LIB_NAME); + if (zipFile != null) { + try { + zipFile.close(); + } catch (Exception e) { + FileLog.e(e); + } } - nativeLoaded = true; } + return false; } @SuppressLint("UnsafeDynamicallyLoadedCode") - private static boolean loadNativeLib(Context context, String libName) { + public static synchronized void initNativeLibs(Context context) { + if (nativeLoaded) { + return; + } + try { try { - System.loadLibrary(libName); + System.loadLibrary(LIB_NAME); + nativeLoaded = true; if (BuildVars.LOGS_ENABLED) { - FileLog.d("loaded normal lib: " + libName); + FileLog.d("loaded normal lib"); } - return true; + return; } catch (Error e) { FileLog.e(e); } @@ -89,17 +158,32 @@ public class NativeLoader { folder = "x86"; } + /*File destFile = getNativeLibraryDir(context); + if (destFile != null) { + destFile = new File(destFile, LIB_SO_NAME); + if (destFile.exists()) { + try { + System.loadLibrary(LIB_NAME); + nativeLoaded = true; + return; + } catch (Error e) { + FileLog.e(e); + } + } + }*/ + File destDir = new File(context.getFilesDir(), "lib"); destDir.mkdirs(); - File destLocalFile = new File(destDir, "lib" + libName + "loc.so"); + File destLocalFile = new File(destDir, LOCALE_LIB_SO_NAME); if (destLocalFile.exists()) { try { - System.load(destLocalFile.getAbsolutePath()); if (BuildVars.LOGS_ENABLED) { - FileLog.d("loaded local lib: " + libName); + FileLog.d("Load local lib"); } - return true; + System.load(destLocalFile.getAbsolutePath()); + nativeLoaded = true; + return; } catch (Error e) { FileLog.e(e); } @@ -107,89 +191,24 @@ public class NativeLoader { } if (BuildVars.LOGS_ENABLED) { - FileLog.e(String.format(Locale.US, "library %s not found, arch = %s", libName, folder)); + FileLog.e("Library not found, arch = " + folder); } - if (loadFromZip(context, destDir, destLocalFile, folder, libName)) { - return true; + if (loadFromZip(context, destDir, destLocalFile, folder)) { + return; } } catch (Throwable e) { e.printStackTrace(); } try { - System.loadLibrary(libName); - if (BuildVars.LOGS_ENABLED) { - FileLog.d("loaded lib: " + libName); - } - return true; + System.loadLibrary(LIB_NAME); + nativeLoaded = true; } catch (Error e) { FileLog.e(e); } - - return false; } - @SuppressLint({"UnsafeDynamicallyLoadedCode", "SetWorldReadable"}) - private static boolean loadFromZip(Context context, File destDir, File destLocalFile, String folder, String libName) { - try { - for (File file : destDir.listFiles()) { - file.delete(); - } - } catch (Exception e) { - FileLog.e(e); - } - - ZipFile zipFile = null; - InputStream stream = null; - try { - zipFile = new ZipFile(context.getApplicationInfo().sourceDir); - ZipEntry entry = zipFile.getEntry("lib/" + folder + "/lib" + libName + ".so"); - if (entry == null) { - throw new Exception("Unable to find file in apk:" + "lib/" + folder + "/" + libName); - } - stream = zipFile.getInputStream(entry); - - OutputStream out = new FileOutputStream(destLocalFile); - byte[] buf = new byte[4096]; - int len; - while ((len = stream.read(buf)) > 0) { - Thread.yield(); - out.write(buf, 0, len); - } - out.close(); - - destLocalFile.setReadable(true, false); - destLocalFile.setExecutable(true, false); - destLocalFile.setWritable(true); - - try { - System.load(destLocalFile.getAbsolutePath()); - if (BuildVars.LOGS_ENABLED) { - FileLog.d("loaded lib from zip: " + libName); - } - return true; - } catch (Error e) { - FileLog.e(e); - } - } catch (Exception e) { - FileLog.e(e); - } finally { - if (stream != null) { - try { - stream.close(); - } catch (Exception e) { - FileLog.e(e); - } - } - if (zipFile != null) { - try { - zipFile.close(); - } catch (Exception e) { - FileLog.e(e); - } - } - } - return false; - } + private static native void init(String path, boolean enable); + //public static native void crash(); } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java index 089b08b4e..4b57f812a 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java @@ -3805,10 +3805,16 @@ public class NotificationsController extends BaseController { } public boolean isGlobalNotificationsEnabled(long did) { + return isGlobalNotificationsEnabled(did, null); + } + + public boolean isGlobalNotificationsEnabled(long did, TLRPC.Chat chat) { int type; int lower_id = (int) did; if (lower_id < 0) { - TLRPC.Chat chat = getMessagesController().getChat(-lower_id); + if (chat == null) { + chat = getMessagesController().getChat(-lower_id); + } if (ChatObject.isChannel(chat) && !chat.megagroup) { type = TYPE_CHANNEL; } else { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedLinkCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedLinkCell.java index a7203281e..4e73e3d54 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedLinkCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/SharedLinkCell.java @@ -250,7 +250,7 @@ public class SharedLinkCell extends FrameLayout { } } if (link != null) { - if (link.toLowerCase().indexOf("http") != 0 && link.toLowerCase().indexOf("mailto") != 0) { + if (!link.contains("://") && link.toLowerCase().indexOf("http") != 0 && link.toLowerCase().indexOf("mailto") != 0) { links.add("http://" + link); } else { links.add(link); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index 2423350b1..01be1c63b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -16144,15 +16144,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not return; } if (message.isDice()) { - try { - if (currentToast != null) { - currentToast.cancel(); - } - } catch (Exception e) { - FileLog.e(e); - } - currentToast = Toast.makeText(getParentActivity(), LocaleController.getString("DiceInfo", R.string.DiceInfo), Toast.LENGTH_SHORT); - currentToast.show(); + undoView.showWithAction(0, chatActivityEnterView.getVisibility() == View.VISIBLE ? UndoView.ACTION_DICE_INFO : UndoView.ACTION_DICE_NO_SEND_INFO, null, null, () -> getSendMessagesHelper().sendMessage("\uD83C\uDFB2", dialog_id, null, null, false, null, null, null, true, 0)); } else if (message.isAnimatedEmoji()) { restartSticker(cell); } else if (message.needDrawBluredPreview()) { 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 c23cf8bb3..a79558433 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java @@ -944,7 +944,7 @@ public class ChatActivityEnterView extends FrameLayout implements NotificationCe @Override protected void onDraw(Canvas canvas) { float multilinTooltipOffset = 0; - if (tooltipLayout.getLineCount() > 1) { + if (tooltipLayout != null && tooltipLayout.getLineCount() > 1) { multilinTooltipOffset = tooltipLayout.getHeight() - tooltipLayout.getLineBottom(0); } int cx = getMeasuredWidth() - AndroidUtilities.dp2(26); @@ -1192,47 +1192,50 @@ public class ChatActivityEnterView extends FrameLayout implements NotificationCe } } + int alphaInt = (int) (tooltipAlpha * 255); tooltipBackground.setAlpha(alphaInt); tooltipBackgroundArrow.setAlpha(alphaInt); tooltipPaint.setAlpha(alphaInt); - canvas.save(); - rectF.set(0, 0, getMeasuredWidth(), getMeasuredHeight()); - canvas.translate(getMeasuredWidth() - tooltipWidth - AndroidUtilities.dp(44), AndroidUtilities.dpf2(16)); - tooltipBackground.setBounds( - -AndroidUtilities.dp(8), -AndroidUtilities.dp(2), - (int) (tooltipWidth + AndroidUtilities.dp(36)), (int) (tooltipLayout.getHeight() + AndroidUtilities.dpf2(4)) - ); - tooltipBackground.draw(canvas); - tooltipLayout.draw(canvas); - canvas.restore(); + if (tooltipLayout != null) { + canvas.save(); + rectF.set(0, 0, getMeasuredWidth(), getMeasuredHeight()); + canvas.translate(getMeasuredWidth() - tooltipWidth - AndroidUtilities.dp(44), AndroidUtilities.dpf2(16)); + tooltipBackground.setBounds( + -AndroidUtilities.dp(8), -AndroidUtilities.dp(2), + (int) (tooltipWidth + AndroidUtilities.dp(36)), (int) (tooltipLayout.getHeight() + AndroidUtilities.dpf2(4)) + ); + tooltipBackground.draw(canvas); + tooltipLayout.draw(canvas); + canvas.restore(); - canvas.save(); - canvas.translate(cx, AndroidUtilities.dpf2(17) + tooltipLayout.getHeight() / 2f - idleProgress * AndroidUtilities.dpf2(3f)); - path.reset(); - path.setLastPoint(-AndroidUtilities.dpf2(5), AndroidUtilities.dpf2(4)); - path.lineTo(0, 0); - path.lineTo(AndroidUtilities.dpf2(5), AndroidUtilities.dpf2(4)); + canvas.save(); + canvas.translate(cx, AndroidUtilities.dpf2(17) + tooltipLayout.getHeight() / 2f - idleProgress * AndroidUtilities.dpf2(3f)); + path.reset(); + path.setLastPoint(-AndroidUtilities.dpf2(5), AndroidUtilities.dpf2(4)); + path.lineTo(0, 0); + path.lineTo(AndroidUtilities.dpf2(5), AndroidUtilities.dpf2(4)); - Paint p = new Paint(Paint.ANTI_ALIAS_FLAG); - p.setColor(Color.WHITE); - p.setAlpha(alphaInt); - p.setStyle(Paint.Style.STROKE); - p.setStrokeCap(Paint.Cap.ROUND); - p.setStrokeJoin(Paint.Join.ROUND); - p.setStrokeWidth(AndroidUtilities.dpf2(1.5f)); - canvas.drawPath(path, p); - canvas.restore(); + Paint p = new Paint(Paint.ANTI_ALIAS_FLAG); + p.setColor(Color.WHITE); + p.setAlpha(alphaInt); + p.setStyle(Paint.Style.STROKE); + p.setStrokeCap(Paint.Cap.ROUND); + p.setStrokeJoin(Paint.Join.ROUND); + p.setStrokeWidth(AndroidUtilities.dpf2(1.5f)); + canvas.drawPath(path, p); + canvas.restore(); - canvas.save(); - tooltipBackgroundArrow.setBounds( - cx - tooltipBackgroundArrow.getIntrinsicWidth() / 2, (int) (tooltipLayout.getHeight() + AndroidUtilities.dpf2(20)), - cx + tooltipBackgroundArrow.getIntrinsicWidth() / 2, (int) (tooltipLayout.getHeight() + AndroidUtilities.dpf2(20)) + tooltipBackgroundArrow.getIntrinsicHeight() - ); - tooltipBackgroundArrow.draw(canvas); - canvas.restore(); + canvas.save(); + tooltipBackgroundArrow.setBounds( + cx - tooltipBackgroundArrow.getIntrinsicWidth() / 2, (int) (tooltipLayout.getHeight() + AndroidUtilities.dpf2(20)), + cx + tooltipBackgroundArrow.getIntrinsicWidth() / 2, (int) (tooltipLayout.getHeight() + AndroidUtilities.dpf2(20)) + tooltipBackgroundArrow.getIntrinsicHeight() + ); + tooltipBackgroundArrow.draw(canvas); + canvas.restore(); + } } canvas.save(); @@ -4437,9 +4440,12 @@ public class ChatActivityEnterView extends FrameLayout implements NotificationCe sendButton.setVisibility(GONE); cancelBotButton.setVisibility(GONE); setSlowModeButtonVisible(false); - audioVideoButtonContainer.setVisibility(VISIBLE); runningAnimation = null; runningAnimationType = 0; + + if (audioVideoButtonContainer != null) { + audioVideoButtonContainer.setVisibility(VISIBLE); + } } } @@ -5112,7 +5118,9 @@ public class ChatActivityEnterView extends FrameLayout implements NotificationCe messageEditText.requestFocus(); } recordedAudioBackground.setAlpha(1f); - attachLayout.setTranslationX(0); + if (attachLayout != null) { + attachLayout.setTranslationX(0); + } slideText.setCancelToProgress(0f); delegate.onAudioVideoInterfaceUpdated(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/UndoView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/UndoView.java index c2c3824a3..088a0abf0 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/UndoView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/UndoView.java @@ -87,6 +87,8 @@ public class UndoView extends FrameLayout { public final static int ACTION_QUIZ_CORRECT = 13; public final static int ACTION_QUIZ_INCORRECT = 14; public final static int ACTION_FILTERS_AVAILABLE = 15; + public final static int ACTION_DICE_INFO = 16; + public final static int ACTION_DICE_NO_SEND_INFO = 17; public UndoView(Context context) { super(context); @@ -267,6 +269,12 @@ public class UndoView extends FrameLayout { lastUpdateTime = SystemClock.elapsedRealtime(); undoTextView.setText(LocaleController.getString("Undo", R.string.Undo).toUpperCase()); undoImageView.setVisibility(VISIBLE); + infoTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15); + + infoTextView.setGravity(Gravity.LEFT | Gravity.TOP); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) infoTextView.getLayoutParams(); + layoutParams.height = LayoutHelper.WRAP_CONTENT; + layoutParams.bottomMargin = 0; if (isTooltipAction()) { CharSequence infoText; @@ -328,7 +336,6 @@ public class UndoView extends FrameLayout { leftImageView.setAnimation(icon, size, size); if (subInfoText != null) { - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) infoTextView.getLayoutParams(); layoutParams.leftMargin = AndroidUtilities.dp(58); layoutParams.topMargin = AndroidUtilities.dp(6); layoutParams.rightMargin = 0; @@ -339,7 +346,6 @@ public class UndoView extends FrameLayout { infoTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); infoTextView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf")); } else { - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) infoTextView.getLayoutParams(); layoutParams.leftMargin = AndroidUtilities.dp(58); layoutParams.topMargin = AndroidUtilities.dp(13); layoutParams.rightMargin = 0; @@ -359,7 +365,6 @@ public class UndoView extends FrameLayout { infoTextView.setText(LocaleController.getString("AuthAnotherClientOk", R.string.AuthAnotherClientOk)); leftImageView.setAnimation(R.raw.contact_check, 36, 36); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) infoTextView.getLayoutParams(); layoutParams.leftMargin = AndroidUtilities.dp(58); layoutParams.topMargin = AndroidUtilities.dp(6); subinfoTextView.setText(authorization.app_name); @@ -381,7 +386,6 @@ public class UndoView extends FrameLayout { leftImageView.setAnimation(R.raw.filter_new, 36, 36); int margin = (int) Math.ceil(undoTextView.getPaint().measureText(undoTextView.getText().toString())) + AndroidUtilities.dp(26); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) infoTextView.getLayoutParams(); layoutParams.leftMargin = AndroidUtilities.dp(58); layoutParams.rightMargin = margin; layoutParams.topMargin = AndroidUtilities.dp(6); @@ -408,13 +412,38 @@ public class UndoView extends FrameLayout { leftImageView.setProgress(0); leftImageView.playAnimation(); - } else if (currentAction == ACTION_THEME_CHANGED) { - TLRPC.TL_authorization authorization = (TLRPC.TL_authorization) infoObject; + } else if (currentAction == ACTION_DICE_INFO || currentAction == ACTION_DICE_NO_SEND_INFO) { + timeLeft = 4000; + infoTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); + infoTextView.setGravity(Gravity.CENTER_VERTICAL); + infoTextView.setText(AndroidUtilities.replaceTags(LocaleController.getString("DiceInfo2", R.string.DiceInfo2))); + undoTextView.setText(LocaleController.getString("SendDice", R.string.SendDice)); + leftImageView.setImageResource(R.drawable.dice); + int margin; + if (currentAction == ACTION_DICE_INFO) { + margin = (int) Math.ceil(undoTextView.getPaint().measureText(undoTextView.getText().toString())) + AndroidUtilities.dp(26); + undoTextView.setVisibility(VISIBLE); + undoTextView.setTextColor(Theme.getColor(Theme.key_undo_cancelColor)); + undoImageView.setVisibility(GONE); + undoButton.setVisibility(VISIBLE); + } else { + margin = 0; + undoTextView.setVisibility(GONE); + undoButton.setVisibility(GONE); + } + layoutParams.leftMargin = AndroidUtilities.dp(58); + layoutParams.rightMargin = margin; + layoutParams.topMargin = 0; + layoutParams.bottomMargin = AndroidUtilities.dp(1); + layoutParams.height = TableLayout.LayoutParams.MATCH_PARENT; + + subinfoTextView.setVisibility(GONE); + leftImageView.setVisibility(VISIBLE); + } else if (currentAction == ACTION_THEME_CHANGED) { infoTextView.setText(LocaleController.getString("ColorThemeChanged", R.string.ColorThemeChanged)); leftImageView.setImageResource(R.drawable.toast_pallete); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) infoTextView.getLayoutParams(); layoutParams.leftMargin = AndroidUtilities.dp(58); layoutParams.rightMargin = AndroidUtilities.dp(48); layoutParams.topMargin = AndroidUtilities.dp(6); @@ -445,7 +474,6 @@ public class UndoView extends FrameLayout { infoTextView.setText(LocaleController.getString("ChatsArchived", R.string.ChatsArchived)); } - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) infoTextView.getLayoutParams(); layoutParams.leftMargin = AndroidUtilities.dp(58); layoutParams.topMargin = AndroidUtilities.dp(13); layoutParams.rightMargin = 0; @@ -460,7 +488,6 @@ public class UndoView extends FrameLayout { leftImageView.setProgress(0); leftImageView.playAnimation(); } else { - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) infoTextView.getLayoutParams(); layoutParams.leftMargin = AndroidUtilities.dp(45); layoutParams.topMargin = AndroidUtilities.dp(13); layoutParams.rightMargin = 0; @@ -509,7 +536,7 @@ public class UndoView extends FrameLayout { width = AndroidUtilities.displaySize.x; } measureChildWithMargins(infoTextView, MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), 0, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 0); - undoViewHeight = infoTextView.getMeasuredHeight() + AndroidUtilities.dp(28); + undoViewHeight = infoTextView.getMeasuredHeight() + AndroidUtilities.dp(currentAction == ACTION_DICE_INFO ? 14 : 28); } if (getVisibility() != VISIBLE) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java index 6a2dcac20..bc1e8bc68 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java @@ -1731,6 +1731,10 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. if (viewPages[0].selectedType == id) { return; } + ArrayList dialogFilters = getMessagesController().dialogFilters; + if (id != Integer.MAX_VALUE && (id < 0 || id >= dialogFilters.size())) { + return; + } if (parentLayout != null) { parentLayout.getDrawerLayoutContainer().setAllowOpenDrawerBySwipe(id == filterTabsView.getFirstTabId()); } @@ -1774,9 +1778,12 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. public int getTabCounter(int tabId) { if (tabId == Integer.MAX_VALUE) { return getMessagesStorage().getMainUnreadCount(); - } else { - return getMessagesController().dialogFilters.get(tabId).unreadCount; } + ArrayList dialogFilters = getMessagesController().dialogFilters; + if (tabId < 0 || tabId >= dialogFilters.size()) { + return 0; + } + return getMessagesController().dialogFilters.get(tabId).unreadCount; } @Override @@ -3138,7 +3145,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } else if (actionBar != null && actionBar.isActionModeShowed()) { hideActionMode(true); return false; - } else if (filterTabsView != null && filterTabsView.getVisibility() == View.VISIBLE && !filterTabsView.isAnimatingIndicator() && filterTabsView.getCurrentTabId() != Integer.MAX_VALUE && !startedTracking) { + } else if (filterTabsView != null && filterTabsView.getVisibility() == View.VISIBLE && !tabsAnimationInProgress && !filterTabsView.isAnimatingIndicator() && filterTabsView.getCurrentTabId() != Integer.MAX_VALUE && !startedTracking) { filterTabsView.selectFirstTab(); return false; } else if (commentView != null && commentView.isPopupShowing()) { @@ -4839,7 +4846,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } private void showFiltersHint() { - if (askingForPermissions || !getMessagesController().filtersEnabled || filterTabsView == null || filterTabsView.getVisibility() == View.VISIBLE || isPaused || !getUserConfig().filtersLoaded) { + if (askingForPermissions || !getMessagesController().showFiltersTooltip || filterTabsView == null || filterTabsView.getVisibility() == View.VISIBLE || isPaused || !getUserConfig().filtersLoaded) { return; } SharedPreferences preferences = MessagesController.getGlobalMainSettings(); diff --git a/TMessagesProj/src/main/res/drawable-mdpi/dice.png b/TMessagesProj/src/main/res/drawable-mdpi/dice.png new file mode 100644 index 0000000000000000000000000000000000000000..99d1452b3413bf5e9cd8164db6ca6b9aaaff05e9 GIT binary patch literal 1101 zcmV-T1hV^yP)HxY78m9TC;JimwRgTXSd=`Vj;KRehm3Bk9 zTt3c)_<);cvdQ_0Mx((v=PhoEqJXAppzC^C)Aei7aQHjanQkWsxKJp(k3iQNra8cy zO|UG>@iU%1gX)6^zybjXpFRz0Eauoe9uN5Z{&iK;K8!~qOSVA*?-U9bg=KwHtJMHk z+vco)UAhE~=g;MLWNZvxo0)NJ_69Szbg%c*u0-Mn>6B8b6yM6_Ho0Z#!EhK9A%HS= zi?z20wMUOY(RBz64uazKy3N2;6;#ZevIoX4b|(_wDyx~y7kib;XXHt>i^k*NMF0Zt zl)dz$7lGk}mkNd5UBF8QpU(%c_w|+gySrcUSezfr<#Le8WME`u1pdkAAsC53Fcbn| z*BVbD0T}}YpIW^RMT{w;FO|HWQ^A#&N3gdV7%lO~GcP0hD>W z{FF+;orMKiUz{04Z^y+nO@ra}A38_~m`d@o*_=4JSy@?;YY0Kx1>3a9aM;WffLo}o zWR{dM0e7Hz42cwtM&WI|^mgHlJ(08Gm!+i&vL<9Ze17>d3=Ivzx%20tT&X~*Sd`sC z_EoGaW!c-;XS=to$X8rzrAj01Ny5a)4uaV>kPAsNIrEr4ZZ9l+ z6_3ScXo%x{hA_^IzmdXJV>-?~?1U_`@7%9`XFQ6LAd`HkfiR7 T{?W)J00000NkvXXu0mjfv3eb# literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/dice.png b/TMessagesProj/src/main/res/drawable-xhdpi/dice.png new file mode 100644 index 0000000000000000000000000000000000000000..527ab27ca6266a98936c9b54a9e72383702bd739 GIT binary patch literal 2478 zcmV;f2~qZmP)+O>1?5#*wIxkcKu${IG@-#HPHe|-d;Q$? zV|Op#H}+iLUGLLXe{rPUnLCd&-<-P6<4Ymu&-o161GozAe!P-&2{FC^q__au<#tO}R+cy%jvJ<7 zyx=g+KYG31k@&rqmZk&@kQHImYyg-8K=g$Wz|9dLfCBtdjcJr{P&a^kJRUKe&VWPY zMdY8$$;s(X)jcj?fOC(GjWwb3cg;xTD+Eb^{3W*G{7~lXtc1qK#F>*Lj@;Z-IwEEgl4Ie(ozMcowS>PSkM;U;zClc=(%0C{#Af!2vcM2@MR$z|o@;xN=2I(1YSG zDUrf``^39zS4tIb&_q$iF#ZARJmK^CZpP~r1$fBsKLqQ(h^2Q1rlvAl^6qDzk>Dqv z#2Z7_KK-=h-gjTzI(s2`u7GoIBYYfay`BX_!(Fi$QGise~Y%07t!UtfmuVV6)5k=%@@14$9=@q|y&B zm4)9?J(#laM{RARa9LhmXiurwS5%~2k02kx1eR-U>f(wiOJee*+RXH{j0_K}AAG)j zXf@`R@^bO|eBu_VDk&+s0{bfgVMNW)KQbaKSFM^a#XpsTE|Tx{N=|;h7_bWB0!0(d z+-jFF1CRXeL9mca*4*q+YLhuFn|xvthr1!rxkX>Dzl$%zT;TW9958OQy8WnBWIl@SC9 z;tiqyW*L8XySn6~OP5s20n-t>(2v{NMWb$09^uNOskUMyM6ksivz3l`Ou?ds^r7%a7(J9o|k%WrbN2XwN;G{HSkVlEuc zncur2U%clYDaVG>f*@OGm!uH@MS!G0(_8R20k<>+ADXFfHF~$a5a{G4OK5ojm*dBBA_w>YVm#VNI2UM(3@0vAh7K=?&c`_F) zL&R1E1M6MY)z){i48uqUlJpn>Y!dp{OgB}2 zc)>G}4$GBIn>S0LEu!N&@U@*gqtpSgVy?>wg$Cd$qAJt&r%osx&sG>QrfjR08Dzy;sizeotJBE6J4)a?S4NcUz!%|Yys_uqR@`oP_d2tgl$ zHSq)>+s;+I@woP98@I%Ix@ttZy6*%CqG7-iH1U_$oB(3MGZ~#d2E3b$S zbcPX6_&^78HkrU}vrwB9ZS;O-;ph zZ(Kh6d4KKNH8la!fS?j__{^zO@~_L6)j=@?fBW`ZZ)v<4rMMH`*t2JkijXY8)z#HK zuAU60${r2AQbS+Kjh`fa=i z{5TlrlE~xJF1$#pO$Qz;3)?G^Z;#_|@thjdD)ncU+udASTdN*X*g6U@3u<@o{*~YF z|6MTV`n_q>CfR8Ny>9(_%dII6$GA1d3$ap>Bvy!R%Wu45w$|0vJz=lY?-KShsjIF1 z;a^Ul&hwe(p*-6gFI^CwJh{vJAL9b$8Q`w4E24by>eZ{|&Ye4!UV4`=Klq^aoiqbo zPQy5dC)dYG347bPfYAsiq4}Mb*Iy4z2ZM);`Nl>-kj-1RSp5kc4OI{ndvM(UzymUZ zH;CTeUNyOIJp6Ff#NV_U-#~Y!$!fQN*iRD0{V~<$GB!*RNr*JiDi0 zHN1)n5w#MPE=(+m%0yL@nDn#z_wRp>220dPkCmuimAACCtbrweR$NrnRN(bmydQ;6 zR@eCjkW^;B<0Vy!O0E$8dhufUi~QW&Kh)IJq`YIL1y~P!;>3w9IN^TlEi9}-;N#$O z^L0}Vj7FL^^xHbG`|6a0gjWfm&spS;HPqLiNoG;qPp26H)}5N0o7dvz`U4<+5(BT) zO|W&@ig#KV`F1mCLpz5rpp4X6##(a`0?ZS<{907*qoM6N<$g6pEp{r~^~ literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/dice.png b/TMessagesProj/src/main/res/drawable-xxhdpi/dice.png new file mode 100644 index 0000000000000000000000000000000000000000..06afa517427ab3be9f580054fad38e8d84846d78 GIT binary patch literal 3956 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 O0000wyqlj+hjLXP*}2%v5>(a;2%tkjAbw} zME>Y6qd!bY6#nZke;5;^AtwGDVMzhSg&~GZFhUH%#$^}6F6`Q_YrA&6eEmM3_iSHn zyWTYMP1^IGbKY~_%Xx2~ME?;qO)CoqgY~Ma)=H98jd>}?kilU1!(y@A1FjZ&wNwZp zm~D>7<8Ok|?zpP90)It`#q5d-KAI-3;ENyt8H`3U8jaJk!SJJ`Y3Ity%0~0?$STCr z(o&-)N$--XcEuEBr=lnni^VW4Ou-_PiOd#@Cd+caWH5Z`u-kvjCQOPD&{Xnzy(hr@ zBQS1NqETYzSYLNui$rMU@nedILR3^;P3A3I*3s|+tU|@b#cZXE5bT4Jl9IV}!h{fh zzuy^+#V#xHcw2a7B_m_~aBOOdCeNOwxZkfYk*&3rHlIG7n5QGAq9Q6Xo85S(p33s_ zf#iLeC(zUwQIxB3O>0}5C)2FMl|X>v%gZV2;gJ#2;_;NVSz@0m!`g~;CxRLA!4v^8|NWOa=F0VQ* z!5ReZKYXdG>N_S9LJU57J*{C$N+|j2%&K}9H#l{Y4UhH zv;rq)>y|;mE%o(9HmkJ-3smZKk_m!H@Nfy5ur|W5U=EWCGcz;y+#D@}F`Q4F&-I6dN8{t;TbV|N zvxuh%AuJgNA3h{Jk-+(n8T#CAV((@g5hOH579vhtD>yfdd@*?cKF!X|WEFs!jv|6) zK%+yz=QDF|GGeoo7i(*31QFv;aA{p#9isv`Sp{G|J9|G10ShpM@x~)hpRPKuSjqgy z39q-em*!_@aa5wN?ry3^g2TErJUr}_xd!mjRwNq^O@;`xP6v(@HZyC)moh%`KhvLDO=KJ zM6FmztmHvZ#zku8rzkjY;Lg2!_mYOQc368)d%Gz4Ix8t2FEXNH&gu(!M_k0rBS=8` zU~+Pjp2BJCVBMyzTj|KrqZyANA1N{%ZY<+&hD8-l#eR^_7skfM=)(E)G>E+O)8)$) zOe=QDS4ULUCr2HQQM|Ko&g9KZID0ln2b(q*+`4fiu`R+I**F_SgTY04Pi^fAF3oRW z+@cG?Nh=#f5#DHw65HHIR91mgO%}`Rt9kGrsuwR_P~U|Mv=0|GH#duf!q1V*5`6ld z&Q2PJQ&uAj*Wi~8Ph_HkbiTuj7AsrqK4beO*DGMTU{+eT^hbIel7g_O=%SF>@ z{TxW|yW84w3c$P|#GgD0Ar2lqcxgElx|pt^)oNuLq4^zjQ97RPnAZjd==RN<#8Ght z)wmFV1+-$5=`*GkLNH=Ao8JorgHw#_uzmY>(I4=92Kk;HQ>5)ApFo35LxY3*5m8kW zlN<>8kG~EdKKwhAB!p;hZw~|`k$w2y@atzCXlOe2?-x_u+4w1v9g{nzWT>gFO`c}N z(ZhIc7E8OnneL0^a=CUETdlWHWbC3Z1mzU6Uj-T){)U)YE5{rq4BSQiaPFMQANc&E z?&HUWPl(M7f4FnFth98`p+kof(ytSO&-J=ouUZU-pPf!;1BaXrVblyR!`u^yzG7`- z4jmO&)rO`fve|4pdCG`v=!e-q?dt0KK4k-wj6yKc_3PJ*(W-q83!FybG4UF{Nkx=! zdSyXm{DeTfnE}{`@S8(@`l6}6{+nI9b|oryGI>@ZbfUh#KBw7g{TiNpWXb0%=5{W@ z7($rP;EFy|KY$U@0 zAx2>pH`@H$vZlGZySpd!bN|~2K?)YW5F!2sHold the **word**, then move the cursor to select more text to copy. Card number copied to clipboard Copy - The result of this throw was randomly generated by Telegram.\nSend a 🎲 emoji to any chat to get a random number from Telegram. + Send a **:dice:** emoji to any chat to roll a die. + SEND %1$s set the self-destruct timer to %2$s You set the self-destruct timer to %1$s