From 08ac6a14e723569e4d5b93357a1960d9e533dd98 Mon Sep 17 00:00:00 2001 From: DrKLO Date: Thu, 26 Mar 2015 20:34:47 +0300 Subject: [PATCH] Update to 2.6.1 --- TMessagesProj/build.gradle | 6 +- .../telegram/android/AndroidUtilities.java | 2 + .../org/telegram/android/MessageObject.java | 36 ++- .../telegram/android/MessagesController.java | 14 +- .../org/telegram/android/MessagesStorage.java | 25 +- .../android/NotificationsController.java | 81 +++++++ .../telegram/android/SendMessagesHelper.java | 5 +- .../telegram/android/video/MP4Builder.java | 5 +- .../messenger/FileUploadOperation.java | 8 +- .../org/telegram/messenger/TLClassStore.java | 7 +- .../org/telegram/ui/ActionBar/ActionBar.java | 4 +- .../telegram/ui/ActionBar/ActionBarMenu.java | 6 +- .../Adapters/BaseContactsSearchAdapter.java | 61 ----- .../ui/Adapters/BaseSearchAdapter.java | 209 ++++++++++++++++ .../ui/Adapters/DialogsSearchAdapter.java | 95 +++++++- .../telegram/ui/Adapters/MentionsAdapter.java | 226 ++++++++++++------ ...sSearchAdapter.java => SearchAdapter.java} | 4 +- .../org/telegram/ui/Cells/ChatBaseCell.java | 25 +- .../org/telegram/ui/Cells/ChatMediaCell.java | 1 + .../org/telegram/ui/Cells/DialogCell.java | 32 +-- .../telegram/ui/Cells/DrawerProfileCell.java | 56 ++++- .../telegram/ui/Cells/HashtagSearchCell.java | 53 ++++ .../org/telegram/ui/Cells/MentionCell.java | 8 + .../telegram/ui/Cells/ProfileSearchCell.java | 26 +- .../java/org/telegram/ui/ChatActivity.java | 200 ++++++++++------ .../ui/Components/ChatActivityEnterView.java | 214 +++++++++-------- .../SizeNotifierRelativeLayout.java | 11 +- .../org/telegram/ui/ContactsActivity.java | 6 +- .../org/telegram/ui/GroupCreateActivity.java | 6 +- .../java/org/telegram/ui/LaunchActivity.java | 10 +- .../java/org/telegram/ui/LoginActivity.java | 12 +- .../org/telegram/ui/MessagesActivity.java | 25 +- .../ui/NotificationsSettingsActivity.java | 14 +- .../telegram/ui/PhotoAlbumPickerActivity.java | 2 +- .../org/telegram/ui/PhotoPickerActivity.java | 29 +++ .../java/org/telegram/ui/PhotoViewer.java | 2 +- .../ui/PopupNotificationActivity.java | 2 +- .../java/org/telegram/ui/ProfileActivity.java | 7 +- .../org/telegram/ui/SettingsActivity.java | 9 +- .../main/res/drawable-hdpi/boxshadow.9.png | Bin 299 -> 2124 bytes .../main/res/drawable-mdpi/boxshadow.9.png | Bin 220 -> 1310 bytes .../main/res/drawable-xhdpi/boxshadow.9.png | Bin 427 -> 2940 bytes .../main/res/drawable-xxhdpi/boxshadow.9.png | Bin 841 -> 4836 bytes TMessagesProj/src/main/res/raw/sound_out.wav | Bin 0 -> 17708 bytes .../src/main/res/values-ar/strings.xml | 6 +- .../src/main/res/values-de/strings.xml | 6 +- .../src/main/res/values-es/strings.xml | 6 +- .../src/main/res/values-it/strings.xml | 6 +- .../src/main/res/values-ko/strings.xml | 6 +- .../src/main/res/values-nl/strings.xml | 102 ++++---- .../src/main/res/values-pt-rBR/strings.xml | 6 +- .../src/main/res/values-pt-rPT/strings.xml | 6 +- TMessagesProj/src/main/res/values/strings.xml | 6 +- 53 files changed, 1215 insertions(+), 479 deletions(-) delete mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Adapters/BaseContactsSearchAdapter.java create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Adapters/BaseSearchAdapter.java rename TMessagesProj/src/main/java/org/telegram/ui/Adapters/{ContactsSearchAdapter.java => SearchAdapter.java} (98%) create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Cells/HashtagSearchCell.java create mode 100644 TMessagesProj/src/main/res/raw/sound_out.wav diff --git a/TMessagesProj/build.gradle b/TMessagesProj/build.gradle index a20711531..948e3eda4 100644 --- a/TMessagesProj/build.gradle +++ b/TMessagesProj/build.gradle @@ -22,7 +22,7 @@ dependencies { android { compileSdkVersion 22 - buildToolsVersion '22.0.0' + buildToolsVersion '22.0.1' compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 @@ -82,7 +82,7 @@ android { defaultConfig { minSdkVersion 8 targetSdkVersion 22 - versionCode 469 - versionName "2.6.0" + versionCode 475 + versionName "2.6.1" } } diff --git a/TMessagesProj/src/main/java/org/telegram/android/AndroidUtilities.java b/TMessagesProj/src/main/java/org/telegram/android/AndroidUtilities.java index 97f72977d..5134c3985 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/AndroidUtilities.java +++ b/TMessagesProj/src/main/java/org/telegram/android/AndroidUtilities.java @@ -65,10 +65,12 @@ public class AndroidUtilities { public static Point displaySize = new Point(); public static Integer photoSize = null; public static DisplayMetrics displayMetrics = new DisplayMetrics(); + public static int leftBaseline; private static Boolean isTablet = null; static { density = ApplicationLoader.applicationContext.getResources().getDisplayMetrics().density; + leftBaseline = isTablet() ? 80 : 72; checkDisplaySize(); } diff --git a/TMessagesProj/src/main/java/org/telegram/android/MessageObject.java b/TMessagesProj/src/main/java/org/telegram/android/MessageObject.java index 3cc2504fe..8c5f00ab2 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/MessageObject.java +++ b/TMessagesProj/src/main/java/org/telegram/android/MessageObject.java @@ -93,7 +93,7 @@ public class MessageObject { fromUser = MessagesController.getInstance().getUser(message.from_id); } if (message.action instanceof TLRPC.TL_messageActionChatCreate) { - if (isFromMe()) { + if (isOut()) { messageText = LocaleController.getString("ActionYouCreateGroup", R.string.ActionYouCreateGroup); } else { if (fromUser != null) { @@ -104,7 +104,7 @@ public class MessageObject { } } else if (message.action instanceof TLRPC.TL_messageActionChatDeleteUser) { if (message.action.user_id == message.from_id) { - if (isFromMe()) { + if (isOut()) { messageText = LocaleController.getString("ActionYouLeftUser", R.string.ActionYouLeftUser); } else { if (fromUser != null) { @@ -122,7 +122,7 @@ public class MessageObject { whoUser = MessagesController.getInstance().getUser(message.action.user_id); } if (whoUser != null && fromUser != null) { - if (isFromMe()) { + if (isOut()) { messageText = replaceWithLink(LocaleController.getString("ActionYouKickUser", R.string.ActionYouKickUser), "un2", whoUser); } else if (message.action.user_id == UserConfig.getClientUserId()) { messageText = replaceWithLink(LocaleController.getString("ActionKickUserYou", R.string.ActionKickUserYou), "un1", fromUser); @@ -143,7 +143,7 @@ public class MessageObject { whoUser = MessagesController.getInstance().getUser(message.action.user_id); } if (whoUser != null && fromUser != null) { - if (isFromMe()) { + if (isOut()) { messageText = replaceWithLink(LocaleController.getString("ActionYouAddUser", R.string.ActionYouAddUser), "un2", whoUser); } else if (message.action.user_id == UserConfig.getClientUserId()) { messageText = replaceWithLink(LocaleController.getString("ActionAddUserYou", R.string.ActionAddUserYou), "un1", fromUser); @@ -155,7 +155,7 @@ public class MessageObject { messageText = LocaleController.getString("ActionAddUser", R.string.ActionAddUser).replace("un2", "").replace("un1", ""); } } else if (message.action instanceof TLRPC.TL_messageActionChatEditPhoto) { - if (isFromMe()) { + if (isOut()) { messageText = LocaleController.getString("ActionYouChangedPhoto", R.string.ActionYouChangedPhoto); } else { if (fromUser != null) { @@ -165,7 +165,7 @@ public class MessageObject { } } } else if (message.action instanceof TLRPC.TL_messageActionChatEditTitle) { - if (isFromMe()) { + if (isOut()) { messageText = LocaleController.getString("ActionYouChangedTitle", R.string.ActionYouChangedTitle).replace("un2", message.action.title); } else { if (fromUser != null) { @@ -175,7 +175,7 @@ public class MessageObject { } } } else if (message.action instanceof TLRPC.TL_messageActionChatDeletePhoto) { - if (isFromMe()) { + if (isOut()) { messageText = LocaleController.getString("ActionYouRemovedPhoto", R.string.ActionYouRemovedPhoto); } else { if (fromUser != null) { @@ -186,7 +186,7 @@ public class MessageObject { } } else if (message.action instanceof TLRPC.TL_messageActionTTLChange) { if (message.action.ttl != 0) { - if (isFromMe()) { + if (isOut()) { messageText = LocaleController.formatString("MessageLifetimeChangedOutgoing", R.string.MessageLifetimeChangedOutgoing, AndroidUtilities.formatTTLString(message.action.ttl)); } else { if (fromUser != null) { @@ -196,7 +196,7 @@ public class MessageObject { } } } else { - if (isFromMe()) { + if (isOut()) { messageText = LocaleController.getString("MessageLifetimeYouRemoved", R.string.MessageLifetimeYouRemoved); } else { if (fromUser != null) { @@ -236,7 +236,7 @@ public class MessageObject { } } else if (message.action instanceof TLRPC.TL_messageEncryptedAction) { if (message.action.encryptedAction instanceof TLRPC.TL_decryptedMessageActionScreenshotMessages) { - if (isFromMe()) { + if (isOut()) { messageText = LocaleController.formatString("ActionTakeScreenshootYou", R.string.ActionTakeScreenshootYou); } else { if (fromUser != null) { @@ -248,7 +248,7 @@ public class MessageObject { } else if (message.action.encryptedAction instanceof TLRPC.TL_decryptedMessageActionSetMessageTTL) { TLRPC.TL_decryptedMessageActionSetMessageTTL action = (TLRPC.TL_decryptedMessageActionSetMessageTTL) message.action.encryptedAction; if (action.ttl_seconds != 0) { - if (isFromMe()) { + if (isOut()) { messageText = LocaleController.formatString("MessageLifetimeChangedOutgoing", R.string.MessageLifetimeChangedOutgoing, AndroidUtilities.formatTTLString(action.ttl_seconds)); } else { if (fromUser != null) { @@ -258,7 +258,7 @@ public class MessageObject { } } } else { - if (isFromMe()) { + if (isOut()) { messageText = LocaleController.getString("MessageLifetimeYouRemoved", R.string.MessageLifetimeYouRemoved); } else { if (fromUser != null) { @@ -553,7 +553,7 @@ public class MessageObject { } try { - Pattern pattern = Pattern.compile("(^|\\s)@[a-zA-Z\\d_]{5,32}|(^|\\s)#[\\w@\\.]+"); + Pattern pattern = Pattern.compile("(^|\\s)@[a-zA-Z\\d_]{5,32}|(^|\\s)#[\\w\\.]+"); Matcher matcher = pattern.matcher(messageText); while (matcher.find()) { int start = matcher.start(); @@ -571,13 +571,13 @@ public class MessageObject { int maxWidth; if (AndroidUtilities.isTablet()) { - if (messageOwner.to_id.chat_id != 0) { + if (messageOwner.to_id.chat_id != 0 && !isOut()) { maxWidth = AndroidUtilities.getMinTabletSide() - AndroidUtilities.dp(122); } else { maxWidth = AndroidUtilities.getMinTabletSide() - AndroidUtilities.dp(80); } } else { - if (messageOwner.to_id.chat_id != 0) { + if (messageOwner.to_id.chat_id != 0 && !isOut()) { maxWidth = Math.min(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y) - AndroidUtilities.dp(122); } else { maxWidth = Math.min(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y) - AndroidUtilities.dp(80); @@ -727,10 +727,6 @@ public class MessageObject { return (messageOwner.flags & TLRPC.MESSAGE_FLAG_OUT) != 0; } - public boolean isFromMe() { - return messageOwner.from_id == UserConfig.getClientUserId(); - } - public boolean isUnread() { return (messageOwner.flags & TLRPC.MESSAGE_FLAG_UNREAD) != 0; } @@ -776,7 +772,7 @@ public class MessageObject { } else { if (messageOwner.to_id.chat_id != 0) { return -messageOwner.to_id.chat_id; - } else if (isFromMe()) { + } else if (isOut()) { return messageOwner.to_id.user_id; } else { return messageOwner.from_id; diff --git a/TMessagesProj/src/main/java/org/telegram/android/MessagesController.java b/TMessagesProj/src/main/java/org/telegram/android/MessagesController.java index db5a3fa06..7f37da1f0 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/MessagesController.java +++ b/TMessagesProj/src/main/java/org/telegram/android/MessagesController.java @@ -1293,7 +1293,11 @@ public class MessagesController implements NotificationCenter.NotificationCenter if (label.length() != 0) { label += ", "; } - label += ContactsController.formatName(user.first_name, user.last_name); + if (user.first_name != null && user.first_name.length() > 0) { + label += user.first_name; + } else if (user.last_name != null && user.last_name.length() > 0) { + label += user.last_name; + } count++; } if (count == 2) { @@ -2597,7 +2601,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter public void getDifference() { registerForPush(UserConfig.pushString); - if (MessagesStorage.lastDateValue == 0) { + if (MessagesStorage.lastPtsValue == 0) { loadCurrentState(); return; } @@ -2713,7 +2717,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter } } - if (!obj.isFromMe() && obj.isUnread()) { + if (!obj.isOut() && obj.isUnread()) { pushMessages.add(obj); } @@ -2946,7 +2950,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter AndroidUtilities.runOnUIThread(new Runnable() { @Override public void run() { - if (!obj.isFromMe() && obj.isUnread()) { + if (!obj.isOut()) { NotificationsController.getInstance().processNewMessages(objArr, true); } } @@ -3192,7 +3196,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter messages.put(uid, arr); } arr.add(obj); - if (!obj.isFromMe() && obj.isUnread()) { + if (!obj.isOut() && obj.isUnread()) { pushMessages.add(obj); } } else if (update instanceof TLRPC.TL_updateReadMessages) { diff --git a/TMessagesProj/src/main/java/org/telegram/android/MessagesStorage.java b/TMessagesProj/src/main/java/org/telegram/android/MessagesStorage.java index 15daba188..1f3962192 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/MessagesStorage.java +++ b/TMessagesProj/src/main/java/org/telegram/android/MessagesStorage.java @@ -122,6 +122,7 @@ public class MessagesStorage { database.executeFast("CREATE TABLE messages_seq(mid INTEGER PRIMARY KEY, seq_in INTEGER, seq_out INTEGER);").stepThis().dispose(); database.executeFast("CREATE TABLE web_recent_v3(id TEXT, type INTEGER, image_url TEXT, thumb_url TEXT, local_url TEXT, width INTEGER, height INTEGER, size INTEGER, date INTEGER, PRIMARY KEY (id, type));").stepThis().dispose(); database.executeFast("CREATE TABLE stickers(id INTEGER PRIMARY KEY, data BLOB, date INTEGER);").stepThis().dispose(); + database.executeFast("CREATE TABLE hashtag_recent_v2(id TEXT PRIMARY KEY, date INTEGER);").stepThis().dispose(); database.executeFast("CREATE TABLE user_contacts_v6(uid INTEGER PRIMARY KEY, fname TEXT, sname TEXT)").stepThis().dispose(); database.executeFast("CREATE TABLE user_phones_v6(uid INTEGER, phone TEXT, sphone TEXT, deleted INTEGER, PRIMARY KEY (uid, phone))").stepThis().dispose(); @@ -162,7 +163,7 @@ public class MessagesStorage { database.executeFast("CREATE TABLE keyvalue(id TEXT PRIMARY KEY, value TEXT)").stepThis().dispose(); //version - database.executeFast("PRAGMA user_version = 14").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 15").stepThis().dispose(); } else { try { SQLiteCursor cursor = database.queryFinalized("SELECT seq, pts, date, qts, lsv, sg, pbytes FROM params WHERE id = 1"); @@ -193,7 +194,7 @@ public class MessagesStorage { } } int version = database.executeInt("PRAGMA user_version"); - if (version < 14) { + if (version < 15) { updateDbToLastVersion(version); } } @@ -373,6 +374,11 @@ public class MessagesStorage { database.executeFast("PRAGMA user_version = 14").stepThis().dispose(); version = 14; } + if (version == 14 && version < 15) { + database.executeFast("CREATE TABLE IF NOT EXISTS hashtag_recent_v2(id TEXT PRIMARY KEY, date INTEGER);").stepThis().dispose(); + database.executeFast("PRAGMA user_version = 15").stepThis().dispose(); + version = 15; + } } catch (Exception e) { FileLog.e("tmessages", e); } @@ -627,7 +633,7 @@ public class MessagesStorage { @Override public void run() { try { - SQLiteCursor cursor = database.queryFinalized("SELECT id, image_url, thumb_url, local_url, width, height, size, date FROM web_recent_v3 wallpapers WHERE type = " + type); + SQLiteCursor cursor = database.queryFinalized("SELECT id, image_url, thumb_url, local_url, width, height, size, date FROM web_recent_v3 WHERE type = " + type); final ArrayList arrayList = new ArrayList<>(); while (cursor.next()) { MediaController.SearchImage searchImage = new MediaController.SearchImage(); @@ -684,6 +690,19 @@ public class MessagesStorage { }); } + public void clearWebRecent(final int type) { + storageQueue.postRunnable(new Runnable() { + @Override + public void run() { + try { + database.executeFast("DELETE FROM web_recent_v3 WHERE type = " + type).stepThis().dispose(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + }); + } + public void putWebRecent(final ArrayList arrayList) { storageQueue.postRunnable(new Runnable() { @Override diff --git a/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java b/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java index b5501c521..951c701c4 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java +++ b/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java @@ -19,6 +19,8 @@ import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.graphics.drawable.BitmapDrawable; import android.media.AudioManager; +import android.media.MediaPlayer; +import android.media.SoundPool; import android.net.Uri; import android.os.Build; import android.os.SystemClock; @@ -64,6 +66,13 @@ public class NotificationsController { private int personal_count = 0; private boolean notifyCheck = false; private int lastOnlineFromOtherDevice = 0; + private boolean inChatSoundEnabled = true; + + private SoundPool soundPool; + private int inChatOutgoingSound; + private long lastSoundPlay; + private MediaPlayer mediaPlayer; + private String lastMediaPlayerUri; private static volatile NotificationsController Instance = null; public static NotificationsController getInstance() { @@ -81,6 +90,16 @@ public class NotificationsController { public NotificationsController() { notificationManager = NotificationManagerCompat.from(ApplicationLoader.applicationContext); + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Context.MODE_PRIVATE); + inChatSoundEnabled = preferences.getBoolean("EnableInChatSound", true); + + try { + soundPool = new SoundPool(1, AudioManager.STREAM_NOTIFICATION, 0); + inChatOutgoingSound = soundPool.load(ApplicationLoader.applicationContext, R.raw.sound_out, 1); + mediaPlayer = new MediaPlayer(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } } public void cleanup() { @@ -99,6 +118,10 @@ public class NotificationsController { editor.commit(); } + public void setInChatSoundEnabled(boolean value) { + inChatSoundEnabled = value; + } + public void setOpennedDialogId(long dialog_id) { openned_dialog_id = dialog_id; } @@ -797,6 +820,63 @@ public class NotificationsController { } } + private void playInChatSound() { + if (!inChatSoundEnabled) { + return; + } + if (lastSoundPlay > System.currentTimeMillis() - 1800) { + return; + } + try { + String choosenSoundPath = null; + String defaultPath = Settings.System.DEFAULT_NOTIFICATION_URI.getPath(); + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Context.MODE_PRIVATE); + choosenSoundPath = preferences.getString("sound_path_" + openned_dialog_id, null); + boolean isChat = (int)(openned_dialog_id) < 0; + if (isChat) { + if (choosenSoundPath != null && choosenSoundPath.equals(defaultPath)) { + choosenSoundPath = null; + } else if (choosenSoundPath == null) { + choosenSoundPath = preferences.getString("GroupSoundPath", defaultPath); + } + } else { + if (choosenSoundPath != null && choosenSoundPath.equals(defaultPath)) { + choosenSoundPath = null; + } else if (choosenSoundPath == null) { + choosenSoundPath = preferences.getString("GlobalSoundPath", defaultPath); + } + } + + if (choosenSoundPath != null && !choosenSoundPath.equals("NoSound")) { + if (lastMediaPlayerUri == null || !choosenSoundPath.equals(lastMediaPlayerUri)) { + lastMediaPlayerUri = choosenSoundPath; + mediaPlayer.reset(); + mediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION); + if (choosenSoundPath.equals(defaultPath)) { + mediaPlayer.setDataSource(ApplicationLoader.applicationContext, Settings.System.DEFAULT_NOTIFICATION_URI); + } else { + mediaPlayer.setDataSource(ApplicationLoader.applicationContext, Uri.parse(choosenSoundPath)); + } + mediaPlayer.prepare(); + } + mediaPlayer.start(); + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + + public void playOutChatSound() { + if (!inChatSoundEnabled) { + return; + } + try { + soundPool.play(inChatOutgoingSound, 1, 1, 1, 0, 1); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + public void processNewMessages(ArrayList messageObjects, boolean isLast) { if (messageObjects.isEmpty()) { return; @@ -815,6 +895,7 @@ public class NotificationsController { long dialog_id = messageObject.getDialogId(); long original_dialog_id = dialog_id; if (dialog_id == openned_dialog_id && ApplicationLoader.isScreenOn) { + playInChatSound(); continue; } if ((messageObject.messageOwner.flags & TLRPC.MESSAGE_FLAG_MENTION) != 0) { diff --git a/TMessagesProj/src/main/java/org/telegram/android/SendMessagesHelper.java b/TMessagesProj/src/main/java/org/telegram/android/SendMessagesHelper.java index 818c25042..7b043fe98 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/SendMessagesHelper.java +++ b/TMessagesProj/src/main/java/org/telegram/android/SendMessagesHelper.java @@ -1515,7 +1515,7 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter }); } } - }, (req instanceof TLRPC.TL_messages_forwardMessages ? null : new RPCRequest.RPCQuickAckDelegate() { + }, new RPCRequest.RPCQuickAckDelegate() { @Override public void quickAck() { final int msg_id = newMsgObj.id; @@ -1527,7 +1527,7 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter } }); } - }), true, RPCRequest.RPCRequestClassGeneric | RPCRequest.RPCRequestClassCanCompress, ConnectionsManager.DEFAULT_DATACENTER_ID); + }, true, RPCRequest.RPCRequestClassGeneric | RPCRequest.RPCRequestClassCanCompress, ConnectionsManager.DEFAULT_DATACENTER_ID); } private void processSentMessage(TLRPC.Message newMsg, TLRPC.Message sentMessage, String originalPath) { @@ -1811,6 +1811,7 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter } if (bmOptions.outWidth != 0 && bmOptions.outHeight != 0 && bmOptions.outWidth <= 800 && bmOptions.outHeight <= 800) { TLRPC.TL_documentAttributeSticker attributeSticker = new TLRPC.TL_documentAttributeSticker(); + attributeSticker.alt = ""; document.attributes.add(attributeSticker); TLRPC.TL_documentAttributeImageSize attributeImageSize = new TLRPC.TL_documentAttributeImageSize(); attributeImageSize.w = bmOptions.outWidth; diff --git a/TMessagesProj/src/main/java/org/telegram/android/video/MP4Builder.java b/TMessagesProj/src/main/java/org/telegram/android/video/MP4Builder.java index cdb693328..917d8c53d 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/video/MP4Builder.java +++ b/TMessagesProj/src/main/java/org/telegram/android/video/MP4Builder.java @@ -237,7 +237,10 @@ public class MP4Builder { } public long getTimescale(Mp4Movie mp4Movie) { - long timescale = mp4Movie.getTracks().iterator().next().getTimeScale(); + long timescale = 0; + if (!mp4Movie.getTracks().isEmpty()) { + timescale = mp4Movie.getTracks().iterator().next().getTimeScale(); + } for (Track track : mp4Movie.getTracks()) { timescale = gcd(track.getTimeScale(), timescale); } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/FileUploadOperation.java b/TMessagesProj/src/main/java/org/telegram/messenger/FileUploadOperation.java index 6048711dc..788a202a4 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/FileUploadOperation.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/FileUploadOperation.java @@ -108,7 +108,7 @@ public class FileUploadOperation { if (estimatedSize != 0 && finalSize != 0) { estimatedSize = 0; totalFileSize = finalSize; - totalPartsCount = (int) Math.ceil((float) totalFileSize / (float) uploadChunkSize); + totalPartsCount = (int) (totalFileSize + uploadChunkSize - 1) / uploadChunkSize; if (started) { SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("uploadinfo", Activity.MODE_PRIVATE); storeFileUploadInfo(preferences); @@ -162,7 +162,7 @@ public class FileUploadOperation { } } - uploadChunkSize = (int) Math.max(32, Math.ceil(totalFileSize / (1024.0f * 3000))); + uploadChunkSize = (int) Math.max(32, (totalFileSize + 1024 * 3000 - 1) / (1024 * 3000)); if (1024 % uploadChunkSize != 0) { int chunkSize = 64; while (uploadChunkSize > chunkSize) { @@ -172,7 +172,7 @@ public class FileUploadOperation { } uploadChunkSize *= 1024; - totalPartsCount = (int) Math.ceil((float) totalFileSize / (float) uploadChunkSize); + totalPartsCount = (int) (totalFileSize + uploadChunkSize - 1) / uploadChunkSize; readBuffer = new byte[uploadChunkSize]; fileKey = Utilities.MD5(uploadingFilePath + (isEncrypted ? "enc" : "")); @@ -355,7 +355,7 @@ public class FileUploadOperation { if (error == null) { if (response instanceof TLRPC.TL_boolTrue) { currentPartNum++; - delegate.didChangedUploadProgress(FileUploadOperation.this, (float) currentUploaded / (float) totalFileSize); + delegate.didChangedUploadProgress(FileUploadOperation.this, currentUploaded / (float) totalFileSize); if (isLastPart) { state = 3; if (key == null) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/TLClassStore.java b/TMessagesProj/src/main/java/org/telegram/messenger/TLClassStore.java index c25869052..016c62fe3 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/TLClassStore.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/TLClassStore.java @@ -464,8 +464,11 @@ public class TLClassStore { } } else { FileLog.e("tmessages", String.format("unknown class %x", constructor)); - return null; - //throw new RuntimeException(String.format("unknown class %x", constructor)); + if (BuildVars.DEBUG_VERSION) { + throw new RuntimeException(String.format("unknown class %x", constructor)); + } else { + return null; + } } } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBar.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBar.java index 5c7c76456..a04d43228 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBar.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBar.java @@ -419,10 +419,10 @@ public class ActionBar extends FrameLayout { } public void openSearchField(String text) { - if (isSearchFieldVisible || menu == null) { + if (menu == null || text == null) { return; } - menu.openSearchField(text); + menu.openSearchField(!isSearchFieldVisible, text); } @Override diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenu.java b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenu.java index c035b1d47..3a63dd188 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenu.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/ActionBarMenu.java @@ -153,13 +153,15 @@ public class ActionBarMenu extends LinearLayout { } } - public void openSearchField(String text) { + public void openSearchField(boolean toggle, String text) { for (int a = 0; a < getChildCount(); a++) { View view = getChildAt(a); if (view instanceof ActionBarMenuItem) { ActionBarMenuItem item = (ActionBarMenuItem)view; if (item.isSearchField()) { - parentActionBar.onSearchFieldVisibilityChanged(item.toggleSearch()); + if (toggle) { + parentActionBar.onSearchFieldVisibilityChanged(item.toggleSearch()); + } item.getSearchField().setText(text); item.getSearchField().setSelection(text.length()); break; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/BaseContactsSearchAdapter.java b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/BaseContactsSearchAdapter.java deleted file mode 100644 index e125d0a28..000000000 --- a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/BaseContactsSearchAdapter.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This is the source code of Telegram for Android v. 1.7.x. - * It is licensed under GNU GPL v. 2 or later. - * You should have received a copy of the license in this archive (see LICENSE). - * - * Copyright Nikolai Kudashov, 2013-2014. - */ - -package org.telegram.ui.Adapters; - -import org.telegram.android.AndroidUtilities; -import org.telegram.messenger.ConnectionsManager; -import org.telegram.messenger.RPCRequest; -import org.telegram.messenger.TLObject; -import org.telegram.messenger.TLRPC; - -import java.util.ArrayList; - -public class BaseContactsSearchAdapter extends BaseFragmentAdapter { - - protected ArrayList globalSearch = new ArrayList<>(); - private long reqId = 0; - private int lastReqId; - protected String lastFoundUsername = null; - - public void queryServerSearch(final String query) { - if (reqId != 0) { - ConnectionsManager.getInstance().cancelRpc(reqId, true); - reqId = 0; - } - if (query == null || query.length() < 5) { - globalSearch.clear(); - lastReqId = 0; - notifyDataSetChanged(); - return; - } - TLRPC.TL_contacts_search req = new TLRPC.TL_contacts_search(); - req.q = query; - req.limit = 50; - final int currentReqId = ++lastReqId; - reqId = ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { - @Override - public void run(final TLObject response, final TLRPC.TL_error error) { - AndroidUtilities.runOnUIThread(new Runnable() { - @Override - public void run() { - if (currentReqId == lastReqId) { - if (error == null) { - TLRPC.TL_contacts_found res = (TLRPC.TL_contacts_found) response; - globalSearch = res.users; - lastFoundUsername = query; - notifyDataSetChanged(); - } - } - reqId = 0; - } - }); - } - }, true, RPCRequest.RPCRequestClassGeneric | RPCRequest.RPCRequestClassFailOnServerErrors); - } -} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/BaseSearchAdapter.java b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/BaseSearchAdapter.java new file mode 100644 index 000000000..66ddd338b --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/BaseSearchAdapter.java @@ -0,0 +1,209 @@ +/* + * This is the source code of Telegram for Android v. 1.7.x. + * It is licensed under GNU GPL v. 2 or later. + * You should have received a copy of the license in this archive (see LICENSE). + * + * Copyright Nikolai Kudashov, 2013-2014. + */ + +package org.telegram.ui.Adapters; + +import org.telegram.SQLite.SQLiteCursor; +import org.telegram.SQLite.SQLitePreparedStatement; +import org.telegram.android.AndroidUtilities; +import org.telegram.android.MessagesStorage; +import org.telegram.messenger.ConnectionsManager; +import org.telegram.messenger.FileLog; +import org.telegram.messenger.RPCRequest; +import org.telegram.messenger.TLObject; +import org.telegram.messenger.TLRPC; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class BaseSearchAdapter extends BaseFragmentAdapter { + + protected static class HashtagObject { + String hashtag; + int date; + } + + protected ArrayList globalSearch = new ArrayList<>(); + private long reqId = 0; + private int lastReqId; + protected String lastFoundUsername = null; + + protected ArrayList hashtags; + protected HashMap hashtagsByText; + protected boolean hashtagsLoadedFromDb = false; + + public void queryServerSearch(final String query) { + if (reqId != 0) { + ConnectionsManager.getInstance().cancelRpc(reqId, true); + reqId = 0; + } + if (query == null || query.length() < 5) { + globalSearch.clear(); + lastReqId = 0; + notifyDataSetChanged(); + return; + } + TLRPC.TL_contacts_search req = new TLRPC.TL_contacts_search(); + req.q = query; + req.limit = 50; + final int currentReqId = ++lastReqId; + reqId = ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() { + @Override + public void run(final TLObject response, final TLRPC.TL_error error) { + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + if (currentReqId == lastReqId) { + if (error == null) { + TLRPC.TL_contacts_found res = (TLRPC.TL_contacts_found) response; + globalSearch = res.users; + lastFoundUsername = query; + notifyDataSetChanged(); + } + } + reqId = 0; + } + }); + } + }, true, RPCRequest.RPCRequestClassGeneric | RPCRequest.RPCRequestClassFailOnServerErrors); + } + + public void loadRecentHashtags() { + MessagesStorage.getInstance().getStorageQueue().postRunnable(new Runnable() { + @Override + public void run() { + try { + SQLiteCursor cursor = MessagesStorage.getInstance().getDatabase().queryFinalized("SELECT id, date FROM hashtag_recent_v2 WHERE 1"); + final ArrayList arrayList = new ArrayList<>(); + final HashMap hashMap = new HashMap<>(); + while (cursor.next()) { + HashtagObject hashtagObject = new HashtagObject(); + hashtagObject.hashtag = cursor.stringValue(0); + hashtagObject.date = cursor.intValue(1); + arrayList.add(hashtagObject); + hashMap.put(hashtagObject.hashtag, hashtagObject); + } + cursor.dispose(); + Collections.sort(arrayList, new Comparator() { + @Override + public int compare(HashtagObject lhs, HashtagObject rhs) { + if (lhs.date < rhs.date) { + return 1; + } else if (lhs.date > rhs.date) { + return -1; + } else { + return 0; + } + } + }); + AndroidUtilities.runOnUIThread(new Runnable() { + @Override + public void run() { + setHashtags(arrayList, hashMap); + } + }); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + }); + } + + public void addHashtagsFromMessage(String message) { + if (message == null) { + return; + } + boolean changed = false; + Pattern pattern = Pattern.compile("(^|\\s)#[\\w@\\.]+"); + Matcher matcher = pattern.matcher(message); + while (matcher.find()) { + int start = matcher.start(); + int end = matcher.end(); + if (message.charAt(start) != '@' && message.charAt(start) != '#') { + start++; + } + String hashtag = message.substring(start, end); + if (hashtagsByText == null) { + hashtagsByText = new HashMap<>(); + hashtags = new ArrayList<>(); + } + HashtagObject hashtagObject = hashtagsByText.get(hashtag); + if (hashtagObject == null) { + hashtagObject = new HashtagObject(); + hashtagObject.hashtag = hashtag; + hashtagsByText.put(hashtagObject.hashtag, hashtagObject); + } else { + hashtags.remove(hashtagObject); + } + hashtagObject.date = (int) (System.currentTimeMillis() / 1000); + hashtags.add(0, hashtagObject); + changed = true; + } + if (changed) { + putRecentHashtags(hashtags); + } + } + + private void putRecentHashtags(final ArrayList arrayList) { + MessagesStorage.getInstance().getStorageQueue().postRunnable(new Runnable() { + @Override + public void run() { + try { + MessagesStorage.getInstance().getDatabase().beginTransaction(); + SQLitePreparedStatement state = MessagesStorage.getInstance().getDatabase().executeFast("REPLACE INTO hashtag_recent_v2 VALUES(?, ?)"); + for (int a = 0; a < arrayList.size(); a++) { + if (a == 100) { + break; + } + HashtagObject hashtagObject = arrayList.get(a); + state.requery(); + state.bindString(1, hashtagObject.hashtag); + state.bindInteger(2, hashtagObject.date); + state.step(); + } + state.dispose(); + MessagesStorage.getInstance().getDatabase().commitTransaction(); + if (arrayList.size() >= 100) { + MessagesStorage.getInstance().getDatabase().beginTransaction(); + for (int a = 100; a < arrayList.size(); a++) { + MessagesStorage.getInstance().getDatabase().executeFast("DELETE FROM hashtag_recent_v2 WHERE id = '" + arrayList.get(a).hashtag + "'").stepThis().dispose(); + } + MessagesStorage.getInstance().getDatabase().commitTransaction(); + } + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + }); + } + + public void clearRecentHashtags() { + hashtags = new ArrayList<>(); + hashtagsByText = new HashMap<>(); + MessagesStorage.getInstance().getStorageQueue().postRunnable(new Runnable() { + @Override + public void run() { + try { + MessagesStorage.getInstance().getDatabase().executeFast("DELETE FROM hashtag_recent_v2 WHERE 1").stepThis().dispose(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + } + }); + } + + protected void setHashtags(ArrayList arrayList, HashMap hashMap) { + hashtags = arrayList; + hashtagsByText = hashMap; + hashtagsLoadedFromDb = true; + } +} 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 4ae9e1f19..452d09d17 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DialogsSearchAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/DialogsSearchAdapter.java @@ -33,6 +33,7 @@ import org.telegram.messenger.UserConfig; import org.telegram.messenger.Utilities; import org.telegram.ui.Cells.DialogCell; import org.telegram.ui.Cells.GreySectionCell; +import org.telegram.ui.Cells.HashtagSearchCell; import org.telegram.ui.Cells.LoadingCell; import org.telegram.ui.Cells.ProfileSearchCell; @@ -44,13 +45,14 @@ import java.util.Locale; import java.util.Timer; import java.util.TimerTask; -public class DialogsSearchAdapter extends BaseContactsSearchAdapter { +public class DialogsSearchAdapter extends BaseSearchAdapter { private Context mContext; private Timer searchTimer; private ArrayList searchResult = new ArrayList<>(); private ArrayList searchResultNames = new ArrayList<>(); private ArrayList searchResultMessages = new ArrayList<>(); + private ArrayList searchResultHashtags = new ArrayList<>(); private String lastSearchText; private long reqId = 0; private int lastReqId; @@ -87,6 +89,10 @@ public class DialogsSearchAdapter extends BaseContactsSearchAdapter { searchMessagesInternal(lastMessagesSearchString); } + public String getLastSearchString() { + return lastMessagesSearchString; + } + private void searchMessagesInternal(final String query) { if (needMessagesSearch == 0) { return; @@ -188,8 +194,8 @@ public class DialogsSearchAdapter extends BaseContactsSearchAdapter { dialogSearchResult.date = cursor.intValue(1); dialogsResult.put(id, dialogSearchResult); - int lower_id = (int)id; - int high_id = (int)(id >> 32); + int lower_id = (int) id; + int high_id = (int) (id >> 32); if (lower_id != 0) { if (high_id == 1) { if (!serverOnly && !chatsToLoad.contains(lower_id)) { @@ -389,7 +395,7 @@ public class DialogsSearchAdapter extends BaseContactsSearchAdapter { cursor = MessagesStorage.getInstance().getDatabase().queryFinalized("SELECT u.data, u.status, u.name, u.uid FROM users as u INNER JOIN contacts as c ON u.uid = c.uid"); while (cursor.next()) { int uid = cursor.intValue(3); - if (dialogsResult.containsKey((long)uid)) { + if (dialogsResult.containsKey((long) uid)) { continue; } String name = cursor.stringValue(2); @@ -477,6 +483,25 @@ public class DialogsSearchAdapter extends BaseContactsSearchAdapter { return i > searchResult.size() && i <= globalSearch.size() + searchResult.size(); } + @Override + public void clearRecentHashtags() { + super.clearRecentHashtags(); + searchResultHashtags.clear(); + notifyDataSetChanged(); + } + + @Override + protected void setHashtags(ArrayList arrayList, HashMap hashMap) { + super.setHashtags(arrayList, hashMap); + for (HashtagObject hashtagObject : arrayList) { + searchResultHashtags.add(hashtagObject.hashtag); + } + if (delegate != null) { + delegate.searchStateChanged(false); + } + notifyDataSetChanged(); + } + public void searchDialogs(final String query, final boolean serverOnly) { if (query != null && lastSearchText != null && query.equals(lastSearchText)) { return; @@ -489,14 +514,38 @@ public class DialogsSearchAdapter extends BaseContactsSearchAdapter { FileLog.e("tmessages", e); } if (query == null || query.length() == 0) { + hashtagsLoadedFromDb = false; searchResult.clear(); searchResultNames.clear(); + searchResultHashtags.clear(); if (needMessagesSearch != 2) { queryServerSearch(null); } searchMessagesInternal(null); notifyDataSetChanged(); } else { + if (query.startsWith("#") && query.length() == 1) { + messagesSearchEndReached = true; + if (!hashtagsLoadedFromDb) { + loadRecentHashtags(); + if (delegate != null) { + delegate.searchStateChanged(true); + } + notifyDataSetChanged(); + return; + } + searchResultHashtags.clear(); + for (HashtagObject hashtagObject : hashtags) { + searchResultHashtags.add(hashtagObject.hashtag); + } + if (delegate != null) { + delegate.searchStateChanged(false); + } + notifyDataSetChanged(); + return; + } else { + searchResultHashtags.clear(); + } final int searchId = ++lastSearchId; searchTimer = new Timer(); searchTimer.schedule(new TimerTask() { @@ -530,11 +579,27 @@ public class DialogsSearchAdapter extends BaseContactsSearchAdapter { @Override public boolean isEnabled(int i) { - return i != searchResult.size() && i != searchResult.size() + (globalSearch.isEmpty() ? 0 : globalSearch.size() + 1); + if (!searchResultHashtags.isEmpty()) { + return i != 0; + } + int localCount = searchResult.size(); + int globalCount = globalSearch.isEmpty() ? 0 : globalSearch.size() + 1; + int messagesCount = searchResultMessages.isEmpty() ? 0 : searchResultMessages.size() + 1; + if (i >= 0 && i < localCount || i > localCount && i < globalCount + localCount) { + return true; + } else if (i > globalCount + localCount && i < globalCount + localCount + messagesCount) { + return true; + } else if (messagesCount != 0 && i == globalCount + localCount + messagesCount) { + return true; + } + return false; } @Override public int getCount() { + if (!searchResultHashtags.isEmpty()) { + return searchResultHashtags.size() + 1; + } int count = searchResult.size(); int globalCount = globalSearch.size(); int messagesCount = searchResultMessages.size(); @@ -549,6 +614,9 @@ public class DialogsSearchAdapter extends BaseContactsSearchAdapter { @Override public Object getItem(int i) { + if (!searchResultHashtags.isEmpty()) { + return searchResultHashtags.get(i - 1); + } int localCount = searchResult.size(); int globalCount = globalSearch.isEmpty() ? 0 : globalSearch.size() + 1; int messagesCount = searchResultMessages.isEmpty() ? 0 : searchResultMessages.size() + 1; @@ -580,7 +648,9 @@ public class DialogsSearchAdapter extends BaseContactsSearchAdapter { if (view == null) { view = new GreySectionCell(mContext); } - if (!globalSearch.isEmpty() && i == searchResult.size()) { + if (!searchResultHashtags.isEmpty()) { + ((GreySectionCell) view).setText(LocaleController.getString("Hashtags", R.string.Hashtags).toUpperCase()); + } else if (!globalSearch.isEmpty() && i == searchResult.size()) { ((GreySectionCell) view).setText(LocaleController.getString("GlobalSearch", R.string.GlobalSearch)); } else { ((GreySectionCell) view).setText(LocaleController.getString("SearchMessages", R.string.SearchMessages)); @@ -646,6 +716,12 @@ public class DialogsSearchAdapter extends BaseContactsSearchAdapter { if (view == null) { view = new LoadingCell(mContext); } + } else if (type == 4) { + if (view == null) { + view = new HashtagSearchCell(mContext); + } + ((HashtagSearchCell) view).setText(searchResultHashtags.get(i - 1)); + ((HashtagSearchCell) view).setNeedDivider(i != searchResultHashtags.size()); } return view; @@ -653,6 +729,9 @@ public class DialogsSearchAdapter extends BaseContactsSearchAdapter { @Override public int getItemViewType(int i) { + if (!searchResultHashtags.isEmpty()) { + return i == 0 ? 1 : 4; + } int localCount = searchResult.size(); int globalCount = globalSearch.isEmpty() ? 0 : globalSearch.size() + 1; int messagesCount = searchResultMessages.isEmpty() ? 0 : searchResultMessages.size() + 1; @@ -668,11 +747,11 @@ public class DialogsSearchAdapter extends BaseContactsSearchAdapter { @Override public int getViewTypeCount() { - return 4; + return 5; } @Override public boolean isEmpty() { - return searchResult.isEmpty() && globalSearch.isEmpty() && searchResultMessages.isEmpty(); + return searchResult.isEmpty() && globalSearch.isEmpty() && searchResultMessages.isEmpty() && searchResultHashtags.isEmpty(); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/MentionsAdapter.java b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/MentionsAdapter.java index f06c8311e..6c500386e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/MentionsAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/MentionsAdapter.java @@ -20,8 +20,9 @@ import org.telegram.ui.Cells.MentionCell; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.HashMap; -public class MentionsAdapter extends BaseFragmentAdapter { +public class MentionsAdapter extends BaseSearchAdapter { public interface MentionsAdapterDelegate { void needChangePanelVisibility(boolean show); @@ -29,13 +30,15 @@ public class MentionsAdapter extends BaseFragmentAdapter { private Context mContext; private TLRPC.ChatParticipants info; - private ArrayList searchResult = new ArrayList<>(); + private ArrayList searchResultUsernames; + private ArrayList searchResultHashtags; private MentionsAdapterDelegate delegate; - private int usernameStartPosition; - private int usernameLength; + private int resultStartPosition; + private int resultLength; private String lastText; private int lastPosition; private ArrayList messages; + private boolean needUsernames = true; public MentionsAdapter(Context context, MentionsAdapterDelegate delegate) { mContext = context; @@ -45,91 +48,152 @@ public class MentionsAdapter extends BaseFragmentAdapter { public void setChatInfo(TLRPC.ChatParticipants chatParticipants) { info = chatParticipants; if (lastText != null) { - searchUsername(lastText, lastPosition, messages); + searchUsernameOrHashtag(lastText, lastPosition, messages); } } - public void searchUsername(String text, int position, ArrayList messageObjects) { - if (text == null || text.length() == 0 || position < text.length()) { + public void setNeedUsernames(boolean value) { + needUsernames = value; + } + + @Override + public void clearRecentHashtags() { + super.clearRecentHashtags(); + searchResultHashtags.clear(); + notifyDataSetChanged(); + if (delegate != null) { + delegate.needChangePanelVisibility(false); + } + } + + @Override + protected void setHashtags(ArrayList arrayList, HashMap hashMap) { + super.setHashtags(arrayList, hashMap); + if (lastText != null) { + searchUsernameOrHashtag(lastText, lastPosition, messages); + } + } + + public void searchUsernameOrHashtag(String text, int position, ArrayList messageObjects) { + if (text == null || text.length() == 0) { delegate.needChangePanelVisibility(false); lastText = null; return; } - if (info == null) { - lastText = text; - lastPosition = position; - messages = messageObjects; - delegate.needChangePanelVisibility(false); - return; + int searchPostion = position; + if (text.length() > 0) { + searchPostion--; } lastText = null; - StringBuilder username = new StringBuilder(); - boolean found = false; - for (int a = position; a >= 0; a--) { + StringBuilder result = new StringBuilder(); + int foundType = -1; + boolean hasIllegalUsernameCharacters = false; + for (int a = searchPostion; a >= 0; a--) { if (a >= text.length()) { continue; } char ch = text.charAt(a); - if (ch == '@' && (a == 0 || text.charAt(a - 1) == ' ' || text.charAt(a - 1) == '\n')) { - found = true; - usernameStartPosition = a; - usernameLength = username.length() + 1; - break; + if (a == 0 || text.charAt(a - 1) == ' ' || text.charAt(a - 1) == '\n') { + if (needUsernames && ch == '@') { + if (hasIllegalUsernameCharacters) { + delegate.needChangePanelVisibility(false); + return; + } + if (info == null) { + lastText = text; + lastPosition = position; + messages = messageObjects; + delegate.needChangePanelVisibility(false); + return; + } + foundType = 0; + resultStartPosition = a; + resultLength = result.length() + 1; + break; + } else if (ch == '#') { + if (!hashtagsLoadedFromDb) { + loadRecentHashtags(); + lastText = text; + lastPosition = position; + messages = messageObjects; + delegate.needChangePanelVisibility(false); + return; + } + foundType = 1; + resultStartPosition = a; + resultLength = result.length() + 1; + result.insert(0, ch); + break; + } } if (!(ch >= '0' && ch <= '9' || ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z' || ch == '_')) { - delegate.needChangePanelVisibility(false); - return; + hasIllegalUsernameCharacters = true; } - username.insert(0, ch); + result.insert(0, ch); } - if (!found) { + if (foundType == -1) { delegate.needChangePanelVisibility(false); return; } - final ArrayList users = new ArrayList<>(); - for (int a = 0; a < Math.min(100, messageObjects.size()); a++) { - int from_id = messageObjects.get(a).messageOwner.from_id; - if (!users.contains(from_id)) { - users.add(from_id); - } - } - String usernameString = username.toString().toLowerCase(); - ArrayList newResult = new ArrayList<>(); - for (TLRPC.TL_chatParticipant chatParticipant : info.participants) { - TLRPC.User user = MessagesController.getInstance().getUser(chatParticipant.user_id); - if (user == null || user instanceof TLRPC.TL_userSelf) { - continue; - } - if (user.username != null && user.username.length() > 0 && (usernameString.length() > 0 && user.username.toLowerCase().startsWith(usernameString) || usernameString.length() == 0)) { - newResult.add(user); - } - } - searchResult = newResult; - Collections.sort(searchResult, new Comparator() { - @Override - public int compare(TLRPC.User lhs, TLRPC.User rhs) { - int lhsNum = users.indexOf(lhs.id); - int rhsNum = users.indexOf(rhs.id); - if (lhsNum != -1 && rhsNum != -1) { - return lhsNum < rhsNum ? -1 : (lhsNum == rhsNum ? 0 : 1); - } else if (lhsNum != -1 && rhsNum == -1) { - return -1; - } else if (lhsNum == -1 && rhsNum != -1) { - return 1; + if (foundType == 0) { + final ArrayList users = new ArrayList<>(); + for (int a = 0; a < Math.min(100, messageObjects.size()); a++) { + int from_id = messageObjects.get(a).messageOwner.from_id; + if (!users.contains(from_id)) { + users.add(from_id); } - return 0; } - }); - notifyDataSetChanged(); - delegate.needChangePanelVisibility(!newResult.isEmpty()); + String usernameString = result.toString().toLowerCase(); + ArrayList newResult = new ArrayList<>(); + for (TLRPC.TL_chatParticipant chatParticipant : info.participants) { + TLRPC.User user = MessagesController.getInstance().getUser(chatParticipant.user_id); + if (user == null || user instanceof TLRPC.TL_userSelf) { + continue; + } + if (user.username != null && user.username.length() > 0 && (usernameString.length() > 0 && user.username.toLowerCase().startsWith(usernameString) || usernameString.length() == 0)) { + newResult.add(user); + } + } + searchResultHashtags = null; + searchResultUsernames = newResult; + Collections.sort(searchResultUsernames, new Comparator() { + @Override + public int compare(TLRPC.User lhs, TLRPC.User rhs) { + int lhsNum = users.indexOf(lhs.id); + int rhsNum = users.indexOf(rhs.id); + if (lhsNum != -1 && rhsNum != -1) { + return lhsNum < rhsNum ? -1 : (lhsNum == rhsNum ? 0 : 1); + } else if (lhsNum != -1 && rhsNum == -1) { + return -1; + } else if (lhsNum == -1 && rhsNum != -1) { + return 1; + } + return 0; + } + }); + notifyDataSetChanged(); + delegate.needChangePanelVisibility(!newResult.isEmpty()); + } else { + ArrayList newResult = new ArrayList<>(); + String hashtagString = result.toString().toLowerCase(); + for (HashtagObject hashtagObject : hashtags) { + if (hashtagString != null && hashtagObject.hashtag != null && hashtagObject.hashtag.startsWith(hashtagString)) { + newResult.add(hashtagObject.hashtag); + } + } + searchResultHashtags = newResult; + searchResultUsernames = null; + notifyDataSetChanged(); + delegate.needChangePanelVisibility(!newResult.isEmpty()); + } } - public int getUsernameStartPosition() { - return usernameStartPosition; + public int getResultStartPosition() { + return resultStartPosition; } - public int getUsernameLength() { - return usernameLength; + public int getResultLength() { + return resultLength; } @Override @@ -139,12 +203,22 @@ public class MentionsAdapter extends BaseFragmentAdapter { @Override public int getCount() { - return searchResult.size(); + if (searchResultUsernames != null) { + return searchResultUsernames.size(); + } else if (searchResultHashtags != null) { + return searchResultHashtags.size(); + } + return 0; } @Override public boolean isEmpty() { - return searchResult.isEmpty(); + if (searchResultUsernames != null) { + return searchResultUsernames.isEmpty(); + } else if (searchResultHashtags != null) { + return searchResultHashtags.isEmpty(); + } + return true; } @Override @@ -168,11 +242,19 @@ public class MentionsAdapter extends BaseFragmentAdapter { } @Override - public TLRPC.User getItem(int i) { - if (i < 0 || i >= searchResult.size()) { - return null; + public Object getItem(int i) { + if (searchResultUsernames != null) { + if (i < 0 || i >= searchResultUsernames.size()) { + return null; + } + return searchResultUsernames.get(i); + } else if (searchResultHashtags != null) { + if (i < 0 || i >= searchResultHashtags.size()) { + return null; + } + return searchResultHashtags.get(i); } - return searchResult.get(i); + return null; } @Override @@ -180,7 +262,11 @@ public class MentionsAdapter extends BaseFragmentAdapter { if (view == null) { view = new MentionCell(mContext); } - ((MentionCell) view).setUser(searchResult.get(i)); + if (searchResultUsernames != null) { + ((MentionCell) view).setUser(searchResultUsernames.get(i)); + } else if (searchResultHashtags != null) { + ((MentionCell) view).setText(searchResultHashtags.get(i)); + } return view; } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/ContactsSearchAdapter.java b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/SearchAdapter.java similarity index 98% rename from TMessagesProj/src/main/java/org/telegram/ui/Adapters/ContactsSearchAdapter.java rename to TMessagesProj/src/main/java/org/telegram/ui/Adapters/SearchAdapter.java index 17dd2fe2e..5a114dfdc 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/ContactsSearchAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/SearchAdapter.java @@ -31,7 +31,7 @@ import java.util.HashMap; import java.util.Timer; import java.util.TimerTask; -public class ContactsSearchAdapter extends BaseContactsSearchAdapter { +public class SearchAdapter extends BaseSearchAdapter { private Context mContext; private HashMap ignoreUsers; private ArrayList searchResult = new ArrayList<>(); @@ -41,7 +41,7 @@ public class ContactsSearchAdapter extends BaseContactsSearchAdapter { private boolean allowUsernameSearch; private boolean useUserCell; - public ContactsSearchAdapter(Context context, HashMap arg1, boolean usernameSearch) { + public SearchAdapter(Context context, HashMap arg1, boolean usernameSearch) { mContext = context; ignoreUsers = arg1; allowUsernameSearch = usernameSearch; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatBaseCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatBaseCell.java index bf268093b..3fb3d1105 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatBaseCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatBaseCell.java @@ -10,6 +10,7 @@ package org.telegram.ui.Cells; import android.annotation.SuppressLint; import android.content.Context; +import android.content.res.Configuration; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.drawable.Drawable; @@ -397,11 +398,15 @@ public class ChatBaseCell extends BaseCell { if (messageObject.type == 13) { int width; if (AndroidUtilities.isTablet()) { - int leftWidth = AndroidUtilities.displaySize.x / 100 * 35; - if (leftWidth < AndroidUtilities.dp(320)) { - leftWidth = AndroidUtilities.dp(320); + if (AndroidUtilities.isSmallTablet() && getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { + width = AndroidUtilities.displaySize.x; + } else { + int leftWidth = AndroidUtilities.displaySize.x / 100 * 35; + if (leftWidth < AndroidUtilities.dp(320)) { + leftWidth = AndroidUtilities.dp(320); + } + width = AndroidUtilities.displaySize.x - leftWidth; } - width = AndroidUtilities.displaySize.x - leftWidth; } else { width = AndroidUtilities.displaySize.x; } @@ -709,12 +714,20 @@ public class ChatBaseCell extends BaseCell { if (currentMessageObject.isOut()) { replyLinePaint.setColor(0xff8dc97a); replyNamePaint.setColor(0xff61a349); - replyTextPaint.setColor(0xff70b15c); + if (currentMessageObject.replyMessageObject != null && currentMessageObject.replyMessageObject.type == 0) { + replyTextPaint.setColor(0xff000000); + } else { + replyTextPaint.setColor(0xff70b15c); + } replyStartX = currentBackgroundDrawable.getBounds().left + AndroidUtilities.dp(11); } else { replyLinePaint.setColor(0xff6c9fd2); replyNamePaint.setColor(0xff377aae); - replyTextPaint.setColor(0xff999999); + if (currentMessageObject.replyMessageObject != null && currentMessageObject.replyMessageObject.type == 0) { + replyTextPaint.setColor(0xff000000); + } else { + replyTextPaint.setColor(0xff999999); + } if (currentMessageObject.contentType == 1 && media) { replyStartX = currentBackgroundDrawable.getBounds().left + AndroidUtilities.dp(11); } else { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMediaCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMediaCell.java index 48b337a0d..a2a6f9245 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMediaCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMediaCell.java @@ -859,6 +859,7 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD protected void onAfterBackgroundDraw(Canvas canvas) { boolean imageDrawn = false; if (gifDrawable != null) { + drawTime = !gifDrawable.isPlaying(); canvas.save(); gifDrawable.setBounds(photoImage.getImageX(), photoImage.getImageY(), photoImage.getImageX() + photoWidth, photoImage.getImageY() + photoHeight); gifDrawable.draw(canvas); 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 b18bacc25..cc8828f2d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DialogCell.java @@ -239,10 +239,10 @@ public class DialogCell extends BaseCell { drawNameLock = true; nameLockTop = AndroidUtilities.dp(16.5f); if (!LocaleController.isRTL) { - nameLockLeft = AndroidUtilities.dp(72); - nameLeft = AndroidUtilities.dp(76) + lockDrawable.getIntrinsicWidth(); + nameLockLeft = AndroidUtilities.dp(AndroidUtilities.leftBaseline); + nameLeft = AndroidUtilities.dp(AndroidUtilities.leftBaseline + 4) + lockDrawable.getIntrinsicWidth(); } else { - nameLockLeft = getMeasuredWidth() - AndroidUtilities.dp(72) - lockDrawable.getIntrinsicWidth(); + nameLockLeft = getMeasuredWidth() - AndroidUtilities.dp(AndroidUtilities.leftBaseline) - lockDrawable.getIntrinsicWidth(); nameLeft = AndroidUtilities.dp(14); } } else { @@ -256,15 +256,15 @@ public class DialogCell extends BaseCell { } if (!LocaleController.isRTL) { - nameLockLeft = AndroidUtilities.dp(72); - nameLeft = AndroidUtilities.dp(76) + (drawNameGroup ? groupDrawable.getIntrinsicWidth() : broadcastDrawable.getIntrinsicWidth()); + nameLockLeft = AndroidUtilities.dp(AndroidUtilities.leftBaseline); + nameLeft = AndroidUtilities.dp(AndroidUtilities.leftBaseline + 4) + (drawNameGroup ? groupDrawable.getIntrinsicWidth() : broadcastDrawable.getIntrinsicWidth()); } else { - nameLockLeft = getMeasuredWidth() - AndroidUtilities.dp(72) - (drawNameGroup ? groupDrawable.getIntrinsicWidth() : broadcastDrawable.getIntrinsicWidth()); + nameLockLeft = getMeasuredWidth() - AndroidUtilities.dp(AndroidUtilities.leftBaseline) - (drawNameGroup ? groupDrawable.getIntrinsicWidth() : broadcastDrawable.getIntrinsicWidth()); nameLeft = AndroidUtilities.dp(14); } } else { if (!LocaleController.isRTL) { - nameLeft = AndroidUtilities.dp(72); + nameLeft = AndroidUtilities.dp(AndroidUtilities.leftBaseline); } else { nameLeft = AndroidUtilities.dp(14); } @@ -329,7 +329,7 @@ public class DialogCell extends BaseCell { } else { if (chat != null && chat.id > 0) { String name = ""; - if (message.isFromMe()) { + if (message.isOut()) { name = LocaleController.getString("FromYou", R.string.FromYou); } else { if (fromUser != null) { @@ -370,7 +370,7 @@ public class DialogCell extends BaseCell { drawCount = false; } - if (message.isFromMe() && message.isOut()) { + if (message.isOut() && message.isOut()) { if (message.isSending()) { drawCheck1 = false; drawCheck2 = false; @@ -439,7 +439,7 @@ public class DialogCell extends BaseCell { if (!LocaleController.isRTL) { nameWidth = getMeasuredWidth() - nameLeft - AndroidUtilities.dp(14) - timeWidth; } else { - nameWidth = getMeasuredWidth() - nameLeft - AndroidUtilities.dp(72) - timeWidth; + nameWidth = getMeasuredWidth() - nameLeft - AndroidUtilities.dp(AndroidUtilities.leftBaseline) - timeWidth; nameLeft += timeWidth; } if (drawNameLock) { @@ -497,14 +497,14 @@ public class DialogCell extends BaseCell { FileLog.e("tmessages", e); } - int messageWidth = getMeasuredWidth() - AndroidUtilities.dp(88); + int messageWidth = getMeasuredWidth() - AndroidUtilities.dp(AndroidUtilities.leftBaseline + 16); int avatarLeft; if (!LocaleController.isRTL) { - messageLeft = AndroidUtilities.dp(72); - avatarLeft = AndroidUtilities.dp(9); + messageLeft = AndroidUtilities.dp(AndroidUtilities.leftBaseline); + avatarLeft = AndroidUtilities.dp(AndroidUtilities.isTablet() ? 13 : 9); } else { messageLeft = AndroidUtilities.dp(16); - avatarLeft = getMeasuredWidth() - AndroidUtilities.dp(61); + avatarLeft = getMeasuredWidth() - AndroidUtilities.dp(AndroidUtilities.isTablet() ? 65 : 61); } avatarImage.setImageCoords(avatarLeft, avatarTop, AndroidUtilities.dp(52), AndroidUtilities.dp(52)); if (drawError) { @@ -802,9 +802,9 @@ public class DialogCell extends BaseCell { if (useSeparator) { if (LocaleController.isRTL) { - canvas.drawLine(0, getMeasuredHeight() - 1, getMeasuredWidth() - AndroidUtilities.dp(72), getMeasuredHeight() - 1, linePaint); + canvas.drawLine(0, getMeasuredHeight() - 1, getMeasuredWidth() - AndroidUtilities.dp(AndroidUtilities.leftBaseline), getMeasuredHeight() - 1, linePaint); } else { - canvas.drawLine(AndroidUtilities.dp(72), getMeasuredHeight() - 1, getMeasuredWidth(), getMeasuredHeight() - 1, linePaint); + canvas.drawLine(AndroidUtilities.dp(AndroidUtilities.leftBaseline), getMeasuredHeight() - 1, getMeasuredWidth(), getMeasuredHeight() - 1, linePaint); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerProfileCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerProfileCell.java index f1dfbb2e5..74ee0a85b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerProfileCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/DrawerProfileCell.java @@ -9,15 +9,25 @@ package org.telegram.ui.Cells; import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; import android.os.Build; import android.util.TypedValue; import android.view.Gravity; import android.widget.FrameLayout; +import android.widget.ImageView; import android.widget.TextView; import org.telegram.PhoneFormat.PhoneFormat; import org.telegram.android.AndroidUtilities; import org.telegram.android.ContactsController; +import org.telegram.messenger.ApplicationLoader; +import org.telegram.messenger.R; import org.telegram.messenger.TLRPC; import org.telegram.ui.Components.AvatarDrawable; import org.telegram.ui.Components.BackupImageView; @@ -27,15 +37,30 @@ public class DrawerProfileCell extends FrameLayout { private BackupImageView avatarImageView; private TextView nameTextView; private TextView phoneTextView; + private ImageView shadowView; + private Rect srcRect = new Rect(); + private Rect destRect = new Rect(); + private Paint paint = new Paint(); public DrawerProfileCell(Context context) { super(context); setBackgroundColor(0xff4c84b5); + shadowView = new ImageView(context); + shadowView.setVisibility(INVISIBLE); + shadowView.setScaleType(ImageView.ScaleType.FIT_XY); + shadowView.setImageResource(R.drawable.bottom_shadow); + addView(shadowView); + LayoutParams layoutParams = (FrameLayout.LayoutParams) shadowView.getLayoutParams(); + layoutParams.width = LayoutParams.MATCH_PARENT; + layoutParams.height = AndroidUtilities.dp(70); + layoutParams.gravity = Gravity.LEFT | Gravity.BOTTOM; + shadowView.setLayoutParams(layoutParams); + avatarImageView = new BackupImageView(context); avatarImageView.imageReceiver.setRoundRadius(AndroidUtilities.dp(32)); addView(avatarImageView); - LayoutParams layoutParams = (LayoutParams) avatarImageView.getLayoutParams(); + layoutParams = (LayoutParams) avatarImageView.getLayoutParams(); layoutParams.width = AndroidUtilities.dp(64); layoutParams.height = AndroidUtilities.dp(64); layoutParams.gravity = Gravity.LEFT | Gravity.BOTTOM; @@ -88,6 +113,35 @@ public class DrawerProfileCell extends FrameLayout { } } + @Override + protected void onDraw(Canvas canvas) { + Drawable backgroundDrawable = ApplicationLoader.getCachedWallpaper(); + if (ApplicationLoader.isCustomTheme() && backgroundDrawable != null) { + phoneTextView.setTextColor(0xffffffff); + shadowView.setVisibility(VISIBLE); + if (backgroundDrawable instanceof ColorDrawable) { + backgroundDrawable.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight()); + backgroundDrawable.draw(canvas); + } else if (backgroundDrawable instanceof BitmapDrawable) { + Bitmap bitmap = ((BitmapDrawable) backgroundDrawable).getBitmap(); + float scaleX = (float) getMeasuredWidth() / (float) bitmap.getWidth(); + float scaleY = (float) getMeasuredHeight() / (float) bitmap.getHeight(); + float scale = scaleX < scaleY ? scaleY : scaleX; + int width = (int) (getMeasuredWidth() / scale); + int height = (int) (getMeasuredHeight() / scale); + int x = (bitmap.getWidth() - width) / 2; + int y = (bitmap.getHeight() - height) / 2; + srcRect.set(x, y, x + width, y + height); + destRect.set(0, 0, getMeasuredWidth(), getMeasuredHeight()); + canvas.drawBitmap(bitmap, srcRect, destRect, paint); + } + } else { + shadowView.setVisibility(INVISIBLE); + phoneTextView.setTextColor(0xffc2e5ff); + super.onDraw(canvas); + } + } + public void setUser(TLRPC.User user) { if (user == null) { return; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/HashtagSearchCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/HashtagSearchCell.java new file mode 100644 index 000000000..ccb8dbcef --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/HashtagSearchCell.java @@ -0,0 +1,53 @@ +/* + * This is the source code of Telegram for Android v. 2.x + * It is licensed under GNU GPL v. 2 or later. + * You should have received a copy of the license in this archive (see LICENSE). + * + * Copyright Nikolai Kudashov, 2013-2015. + */ + +package org.telegram.ui.Cells; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.util.TypedValue; +import android.view.Gravity; +import android.widget.TextView; + +import org.telegram.android.AndroidUtilities; + +public class HashtagSearchCell extends TextView { + + private boolean needDivider; + private static Paint paint; + + public HashtagSearchCell(Context context) { + super(context); + setGravity(Gravity.CENTER_VERTICAL); + setPadding(AndroidUtilities.dp(16), 0, AndroidUtilities.dp(16), 0); + setTextSize(TypedValue.COMPLEX_UNIT_DIP, 17); + setTextColor(0xff000000); + if (paint == null) { + paint = new Paint(); + paint.setColor(0xffdcdcdc); + } + } + + public void setNeedDivider(boolean value) { + needDivider = value; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), AndroidUtilities.dp(48) + 1); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + if (needDivider) { + canvas.drawLine(0, getHeight() - 1, getWidth(), getHeight() - 1, paint); + } + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/MentionCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/MentionCell.java index 64d5d7bbe..5ad6e43ef 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/MentionCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/MentionCell.java @@ -95,5 +95,13 @@ public class MentionCell extends LinearLayout { } nameTextView.setText(ContactsController.formatName(user.first_name, user.last_name)); usernameTextView.setText("@" + user.username); + imageView.setVisibility(VISIBLE); + usernameTextView.setVisibility(VISIBLE); + } + + public void setText(String text) { + imageView.setVisibility(INVISIBLE); + usernameTextView.setVisibility(INVISIBLE); + nameTextView.setText(text); } } 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 47b4773b3..a44ea6906 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ProfileSearchCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ProfileSearchCell.java @@ -149,10 +149,10 @@ public class ProfileSearchCell extends BaseCell { if (encryptedChat != null) { drawNameLock = true; if (!LocaleController.isRTL) { - nameLockLeft = AndroidUtilities.dp(72); - nameLeft = AndroidUtilities.dp(76) + lockDrawable.getIntrinsicWidth(); + nameLockLeft = AndroidUtilities.dp(AndroidUtilities.leftBaseline); + nameLeft = AndroidUtilities.dp(AndroidUtilities.leftBaseline + 4) + lockDrawable.getIntrinsicWidth(); } else { - nameLockLeft = getMeasuredWidth() - AndroidUtilities.dp(74) - lockDrawable.getIntrinsicWidth(); + nameLockLeft = getMeasuredWidth() - AndroidUtilities.dp(AndroidUtilities.leftBaseline + 2) - lockDrawable.getIntrinsicWidth(); nameLeft = AndroidUtilities.dp(11); } nameLockTop = AndroidUtilities.dp(16.5f); @@ -167,15 +167,15 @@ public class ProfileSearchCell extends BaseCell { nameLockTop = AndroidUtilities.dp(30); } if (!LocaleController.isRTL) { - nameLockLeft = AndroidUtilities.dp(72); - nameLeft = AndroidUtilities.dp(76) + (drawNameGroup ? groupDrawable.getIntrinsicWidth() : broadcastDrawable.getIntrinsicWidth()); + nameLockLeft = AndroidUtilities.dp(AndroidUtilities.leftBaseline); + nameLeft = AndroidUtilities.dp(AndroidUtilities.leftBaseline + 4) + (drawNameGroup ? groupDrawable.getIntrinsicWidth() : broadcastDrawable.getIntrinsicWidth()); } else { - nameLockLeft = getMeasuredWidth() - AndroidUtilities.dp(74) - (drawNameGroup ? groupDrawable.getIntrinsicWidth() : broadcastDrawable.getIntrinsicWidth()); + nameLockLeft = getMeasuredWidth() - AndroidUtilities.dp(AndroidUtilities.leftBaseline + 2) - (drawNameGroup ? groupDrawable.getIntrinsicWidth() : broadcastDrawable.getIntrinsicWidth()); nameLeft = AndroidUtilities.dp(11); } } else { if (!LocaleController.isRTL) { - nameLeft = AndroidUtilities.dp(72); + nameLeft = AndroidUtilities.dp(AndroidUtilities.leftBaseline); } else { nameLeft = AndroidUtilities.dp(11); } @@ -211,7 +211,7 @@ public class ProfileSearchCell extends BaseCell { if (!LocaleController.isRTL) { onlineWidth = nameWidth = getMeasuredWidth() - nameLeft - AndroidUtilities.dp(14); } else { - onlineWidth = nameWidth = getMeasuredWidth() - nameLeft - AndroidUtilities.dp(72); + onlineWidth = nameWidth = getMeasuredWidth() - nameLeft - AndroidUtilities.dp(AndroidUtilities.leftBaseline); } if (drawNameLock) { nameWidth -= AndroidUtilities.dp(6) + lockDrawable.getIntrinsicWidth(); @@ -226,7 +226,7 @@ public class ProfileSearchCell extends BaseCell { if (chat == null) { if (!LocaleController.isRTL) { - onlineLeft = AndroidUtilities.dp(72); + onlineLeft = AndroidUtilities.dp(AndroidUtilities.leftBaseline); } else { onlineLeft = AndroidUtilities.dp(11); } @@ -254,9 +254,9 @@ public class ProfileSearchCell extends BaseCell { int avatarLeft; if (!LocaleController.isRTL) { - avatarLeft = AndroidUtilities.dp(9); + avatarLeft = AndroidUtilities.dp(AndroidUtilities.isTablet() ? 13 : 9); } else { - avatarLeft = getMeasuredWidth() - AndroidUtilities.dp(61); + avatarLeft = getMeasuredWidth() - AndroidUtilities.dp(AndroidUtilities.isTablet() ? 65 : 61); } avatarImage.setImageCoords(avatarLeft, AndroidUtilities.dp(10), AndroidUtilities.dp(52), AndroidUtilities.dp(52)); @@ -384,9 +384,9 @@ public class ProfileSearchCell extends BaseCell { if (useSeparator) { if (LocaleController.isRTL) { - canvas.drawLine(0, getMeasuredHeight() - 1, getMeasuredWidth() - AndroidUtilities.dp(72), getMeasuredHeight() - 1, linePaint); + canvas.drawLine(0, getMeasuredHeight() - 1, getMeasuredWidth() - AndroidUtilities.dp(AndroidUtilities.leftBaseline), getMeasuredHeight() - 1, linePaint); } else { - canvas.drawLine(AndroidUtilities.dp(72), getMeasuredHeight() - 1, getMeasuredWidth(), getMeasuredHeight() - 1, linePaint); + canvas.drawLine(AndroidUtilities.dp(AndroidUtilities.leftBaseline), getMeasuredHeight() - 1, getMeasuredWidth(), getMeasuredHeight() - 1, linePaint); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index fdb89193d..d8c607d77 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -191,6 +191,8 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not private int loadsCount = 0; private int startLoadFromMessageId = 0; + private boolean needSelectFromMessageId; + private int returnToMessageId = 0; private int minDate = 0; private boolean first = true; @@ -419,6 +421,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not loading = true; if (startLoadFromMessageId != 0) { + needSelectFromMessageId = true; MessagesController.getInstance().loadMessages(dialog_id, AndroidUtilities.isTablet() ? 30 : 20, startLoadFromMessageId, true, 0, classGuid, 3, 0, 0, false); } else { MessagesController.getInstance().loadMessages(dialog_id, AndroidUtilities.isTablet() ? 30 : 20, 0, true, 0, classGuid, 2, 0, 0, true); @@ -1384,7 +1387,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not layoutParams2.gravity = Gravity.CENTER; progressBar.setLayoutParams(layoutParams2); - if (currentChat != null && !isBroadcast) { + if (currentEncryptedChat == null && !isBroadcast) { mentionListView = new ListView(getParentActivity()); mentionListView.setBackgroundResource(R.drawable.compose_panel); mentionListView.setVisibility(View.GONE); @@ -1408,8 +1411,9 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not public void needChangePanelVisibility(boolean show) { if (show) { RelativeLayout.LayoutParams layoutParams3 = (RelativeLayout.LayoutParams) mentionListView.getLayoutParams(); - layoutParams3.height = AndroidUtilities.dp(2 + 36 * Math.min(3, mentionsAdapter.getCount())); - layoutParams3.topMargin = -AndroidUtilities.dp(36 * Math.min(3, mentionsAdapter.getCount())); + int height = 36 * Math.min(3, mentionsAdapter.getCount()) + (mentionsAdapter.getCount() > 3 ? 18 : 0); + layoutParams3.height = AndroidUtilities.dp(2 + height); + layoutParams3.topMargin = -AndroidUtilities.dp(height); mentionListView.setLayoutParams(layoutParams3); if (mentionListAnimation != null) { @@ -1477,18 +1481,46 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } })); mentionsAdapter.setChatInfo(info); + mentionsAdapter.setNeedUsernames(currentChat != null); mentionListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { - TLRPC.User user = mentionsAdapter.getItem(position); - if (user != null) { - int start = mentionsAdapter.getUsernameStartPosition(); - int len = mentionsAdapter.getUsernameLength(); - chatActivityEnterView.replaceWithText(start, len, "@" + user.username + " "); + Object object = mentionsAdapter.getItem(position); + int start = mentionsAdapter.getResultStartPosition(); + int len = mentionsAdapter.getResultLength(); + if (object instanceof TLRPC.User) { + TLRPC.User user = (TLRPC.User) object; + if (user != null) { + chatActivityEnterView.replaceWithText(start, len, "@" + user.username + " "); + } + } else if (object instanceof String) { + chatActivityEnterView.replaceWithText(start, len, object + " "); } } }); + + mentionListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { + @Override + public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { + Object object = mentionsAdapter.getItem(position); + if (object instanceof String) { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setMessage(LocaleController.getString("ClearSearch", R.string.ClearSearch)); + builder.setPositiveButton(LocaleController.getString("ClearButton", R.string.ClearButton).toUpperCase(), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + mentionsAdapter.clearRecentHashtags(); + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + return true; + } + return false; + } + }); } if (chatActivityEnterView != null) { @@ -1506,9 +1538,15 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not chatActivityEnterView.setLayoutParams(layoutParams3); chatActivityEnterView.setDelegate(new ChatActivityEnterView.ChatActivityEnterViewDelegate() { @Override - public void onMessageSend() { + public void onMessageSend(String message) { moveScrollToLastMessage(); showReplyForMessageObjectOrForward(false, null, null, true); + if (mentionsAdapter != null) { + mentionsAdapter.addHashtagsFromMessage(message); + } + if (message != null) { + NotificationsController.getInstance().playOutChatSound(); + } } @Override @@ -1517,7 +1555,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not stickersAdapter.loadStikersForEmoji(text); } if (mentionsAdapter != null) { - mentionsAdapter.searchUsername(text.toString(), chatActivityEnterView.getCursorPosition(), messages); + mentionsAdapter.searchUsernameOrHashtag(text.toString(), chatActivityEnterView.getCursorPosition(), messages); } } @@ -1867,7 +1905,11 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not pagedownButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - scrollToLastMessage(); + if (returnToMessageId > 0) { + scrollToMessageId(returnToMessageId, 0, true); + } else { + scrollToLastMessage(); + } } }); @@ -2094,11 +2136,80 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not forward_end_reached = true; loading = true; startLoadFromMessageId = 0; + needSelectFromMessageId = false; chatAdapter.notifyDataSetChanged(); MessagesController.getInstance().loadMessages(dialog_id, 30, 0, true, 0, classGuid, 0, 0, 0, true); } } + private void scrollToMessageId(int id, int fromMessageId, boolean select) { + returnToMessageId = fromMessageId; + needSelectFromMessageId = select; + + MessageObject object = messagesDict.get(id); + boolean query = false; + if (object != null) { + int index = messages.indexOf(object); + if (index != -1) { + if (needSelectFromMessageId) { + highlightMessageId = id; + } else { + highlightMessageId = Integer.MAX_VALUE; + } + final int yOffset = Math.max(0, (chatListView.getHeight() - object.getApproximateHeight()) / 2); + if (messages.get(messages.size() - 1) == object) { + chatListView.setSelectionFromTop(0, AndroidUtilities.dp(-11) + yOffset); + } else { + chatListView.setSelectionFromTop(messages.size() - messages.indexOf(object), AndroidUtilities.dp(-11) + yOffset); + } + updateVisibleRows(); + showPagedownButton(true, true); + } else { + query = true; + } + } else { + query = true; + } + + if (query) { + messagesDict.clear(); + messagesByDays.clear(); + messages.clear(); + if (currentEncryptedChat == null) { + maxMessageId = Integer.MAX_VALUE; + minMessageId = Integer.MIN_VALUE; + } else { + maxMessageId = Integer.MIN_VALUE; + minMessageId = Integer.MAX_VALUE; + } + maxDate = Integer.MIN_VALUE; + endReached = false; + loading = false; + cacheEndReaced = false; + firstLoading = true; + loadsCount = 0; + minDate = 0; + first = true; + unread_to_load = 0; + first_unread_id = 0; + last_message_id = 0; + first_message_id = 0; + forward_end_reached = true; + loadingForward = false; + unreadMessageObject = null; + scrollToMessage = null; + highlightMessageId = Integer.MAX_VALUE; + scrollToMessageMiddleScreen = false; + loading = true; + startLoadFromMessageId = id; + MessagesController.getInstance().loadMessages(dialog_id, AndroidUtilities.isTablet() ? 30 : 20, startLoadFromMessageId, true, 0, classGuid, 3, 0, 0, false); + chatAdapter.notifyDataSetChanged(); + progressView.setVisibility(View.VISIBLE); + chatListView.setEmptyView(null); + emptyViewContainer.setVisibility(View.INVISIBLE); + } + } + private void showPagedownButton(boolean show, boolean animated) { if (pagedownButton == null) { return; @@ -2114,6 +2225,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } } } else { + returnToMessageId = 0; if (pagedownButton.getVisibility() == View.VISIBLE) { if (animated) { ObjectAnimatorProxy.ofFloatProxy(pagedownButton, "alpha", 0.0f).setDuration(200).addListener(new AnimatorListenerAdapterProxy() { @@ -2829,7 +2941,11 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not scrollToMessageMiddleScreen = false; newRowsCount++; } else if (load_type == 3 && obj.getId() == startLoadFromMessageId) { - highlightMessageId = obj.getId(); + if (needSelectFromMessageId) { + highlightMessageId = obj.getId(); + } else { + highlightMessageId = Integer.MAX_VALUE; + } scrollToMessage = obj; if (isCache) { startLoadFromMessageId = 0; @@ -3560,7 +3676,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not paused = false; if (readWhenResume && !messages.isEmpty()) { for (MessageObject messageObject : messages) { - if (!messageObject.isUnread() && !messageObject.isFromMe()) { + if (!messageObject.isUnread() && !messageObject.isOut()) { break; } if (!messageObject.isOut()) { @@ -4449,63 +4565,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not @Override public void didPressReplyMessage(ChatBaseCell cell, int id) { - MessageObject object = messagesDict.get(id); - boolean query = false; - if (object != null) { - int index = messages.indexOf(object); - if (index != -1) { - highlightMessageId = id; - final int yOffset = Math.max(0, (chatListView.getHeight() - object.getApproximateHeight()) / 2); - if (messages.get(messages.size() - 1) == object) { - chatListView.setSelectionFromTop(0, AndroidUtilities.dp(-11) + yOffset); - } else { - chatListView.setSelectionFromTop(messages.size() - messages.indexOf(object), AndroidUtilities.dp(-11) + yOffset); - } - updateVisibleRows(); - showPagedownButton(true, true); - } else { - query = true; - } - } else { - query = true; - } - - if (query) { - messagesDict.clear(); - messagesByDays.clear(); - messages.clear(); - if (currentEncryptedChat == null) { - maxMessageId = Integer.MAX_VALUE; - minMessageId = Integer.MIN_VALUE; - } else { - maxMessageId = Integer.MIN_VALUE; - minMessageId = Integer.MAX_VALUE; - } - maxDate = Integer.MIN_VALUE; - endReached = false; - loading = false; - cacheEndReaced = false; - firstLoading = true; - loadsCount = 0; - minDate = 0; - first = true; - unread_to_load = 0; - first_unread_id = 0; - last_message_id = 0; - first_message_id = 0; - forward_end_reached = true; - loadingForward = false; - unreadMessageObject = null; - scrollToMessage = null; - highlightMessageId = Integer.MAX_VALUE; - scrollToMessageMiddleScreen = false; - loading = true; - startLoadFromMessageId = id; - MessagesController.getInstance().loadMessages(dialog_id, AndroidUtilities.isTablet() ? 30 : 20, startLoadFromMessageId, true, 0, classGuid, 3, 0, 0, false); - chatAdapter.notifyDataSetChanged(); - progressView.setVisibility(View.VISIBLE); - chatListView.setEmptyView(null); - } + scrollToMessageId(id, cell.getMessageObject().getId(), true); } }); if (view instanceof ChatMediaCell) { 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 e42561c3f..0ba516488 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java @@ -21,7 +21,6 @@ import android.util.TypedValue; import android.view.Gravity; import android.view.KeyEvent; import android.view.MotionEvent; -import android.view.Surface; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; @@ -60,7 +59,7 @@ import java.lang.reflect.Field; public class ChatActivityEnterView extends FrameLayoutFixed implements NotificationCenter.NotificationCenterDelegate, SizeNotifierRelativeLayout.SizeNotifierRelativeLayoutDelegate { public interface ChatActivityEnterViewDelegate { - void onMessageSend(); + void onMessageSend(String message); void needSendTyping(); void onTextChanged(CharSequence text); void onAttachButtonHidden(); @@ -68,7 +67,7 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat void onWindowSizeChanged(int size); } - private EditText messsageEditText; + private EditText messageEditText; private ImageView sendButton; private PopupWindow emojiPopup; private ImageView emojiButton; @@ -169,28 +168,28 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat } }); - messsageEditText = new EditText(context); - messsageEditText.setHint(LocaleController.getString("TypeMessage", R.string.TypeMessage)); - messsageEditText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI); - messsageEditText.setInputType(messsageEditText.getInputType() | EditorInfo.TYPE_TEXT_FLAG_CAP_SENTENCES | EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE); - messsageEditText.setSingleLine(false); - messsageEditText.setMaxLines(4); - messsageEditText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); - messsageEditText.setGravity(Gravity.BOTTOM); - messsageEditText.setPadding(0, AndroidUtilities.dp(11), 0, AndroidUtilities.dp(12)); - messsageEditText.setBackgroundDrawable(null); - AndroidUtilities.clearCursorDrawable(messsageEditText); - messsageEditText.setTextColor(0xff000000); - messsageEditText.setHintTextColor(0xffb2b2b2); - frameLayout.addView(messsageEditText); - layoutParams1 = (FrameLayout.LayoutParams) messsageEditText.getLayoutParams(); + messageEditText = new EditText(context); + messageEditText.setHint(LocaleController.getString("TypeMessage", R.string.TypeMessage)); + messageEditText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI); + messageEditText.setInputType(messageEditText.getInputType() | EditorInfo.TYPE_TEXT_FLAG_CAP_SENTENCES | EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE); + messageEditText.setSingleLine(false); + messageEditText.setMaxLines(4); + messageEditText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); + messageEditText.setGravity(Gravity.BOTTOM); + messageEditText.setPadding(0, AndroidUtilities.dp(11), 0, AndroidUtilities.dp(12)); + messageEditText.setBackgroundDrawable(null); + AndroidUtilities.clearCursorDrawable(messageEditText); + messageEditText.setTextColor(0xff000000); + messageEditText.setHintTextColor(0xffb2b2b2); + frameLayout.addView(messageEditText); + layoutParams1 = (FrameLayout.LayoutParams) messageEditText.getLayoutParams(); layoutParams1.width = FrameLayout.LayoutParams.MATCH_PARENT; layoutParams1.height = FrameLayout.LayoutParams.WRAP_CONTENT; layoutParams1.gravity = Gravity.BOTTOM; layoutParams1.leftMargin = AndroidUtilities.dp(52); layoutParams1.rightMargin = AndroidUtilities.dp(isChat ? 50 : 2); - messsageEditText.setLayoutParams(layoutParams1); - messsageEditText.setOnKeyListener(new View.OnKeyListener() { + messageEditText.setLayoutParams(layoutParams1); + messageEditText.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View view, int i, KeyEvent keyEvent) { if (i == 4 && !keyboardVisible && emojiPopup != null && emojiPopup.isShowing()) { @@ -205,7 +204,7 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat return false; } }); - messsageEditText.setOnClickListener(new View.OnClickListener() { + messageEditText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (emojiPopup != null && emojiPopup.isShowing()) { @@ -213,7 +212,7 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat } } }); - messsageEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() { + messageEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) { if (i == EditorInfo.IME_ACTION_SEND) { @@ -228,7 +227,7 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat return false; } }); - messsageEditText.addTextChangedListener(new TextWatcher() { + messageEditText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { @@ -269,7 +268,7 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat int j = arrayOfImageSpan.length; while (true) { if (i >= j) { - Emoji.replaceEmoji(editable, messsageEditText.getPaint().getFontMetricsInt(), AndroidUtilities.dp(20)); + Emoji.replaceEmoji(editable, messageEditText.getPaint().getFontMetricsInt(), AndroidUtilities.dp(20)); return; } editable.removeSpan(arrayOfImageSpan[i]); @@ -520,23 +519,32 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat if (allowShowTopView) { topView.setVisibility(VISIBLE); if (animated) { - AnimatorSetProxy animatorSetProxy = new AnimatorSetProxy(); - animatorSetProxy.playTogether( - ObjectAnimatorProxy.ofFloat(ChatActivityEnterView.this, "topViewAnimation", 0.0f, 1.0f) - ); - animatorSetProxy.addListener(new AnimatorListenerAdapterProxy() { - @Override - public void onAnimationEnd(Object animation) { - LayoutParams layoutParams2 = (LayoutParams) textFieldContainer.getLayoutParams(); - layoutParams2.topMargin = AndroidUtilities.dp(2) + topView.getLayoutParams().height; - textFieldContainer.setLayoutParams(layoutParams2); - if (!forceShowSendButton) { - openKeyboard(); + if (keyboardVisible || emojiPopup != null && emojiPopup.isShowing()) { + AnimatorSetProxy animatorSetProxy = new AnimatorSetProxy(); + animatorSetProxy.playTogether( + ObjectAnimatorProxy.ofFloat(ChatActivityEnterView.this, "topViewAnimation", 0.0f, 1.0f) + ); + animatorSetProxy.addListener(new AnimatorListenerAdapterProxy() { + @Override + public void onAnimationEnd(Object animation) { + LayoutParams layoutParams2 = (LayoutParams) textFieldContainer.getLayoutParams(); + layoutParams2.topMargin = AndroidUtilities.dp(2) + topView.getLayoutParams().height; + textFieldContainer.setLayoutParams(layoutParams2); + if (!forceShowSendButton) { + openKeyboard(); + } } + }); + animatorSetProxy.setDuration(200); + animatorSetProxy.start(); + } else { + LayoutParams layoutParams2 = (LayoutParams) textFieldContainer.getLayoutParams(); + layoutParams2.topMargin = AndroidUtilities.dp(2) + topView.getLayoutParams().height; + textFieldContainer.setLayoutParams(layoutParams2); + if (!forceShowSendButton) { + openKeyboard(); } - }); - animatorSetProxy.setDuration(200); - animatorSetProxy.start(); + } } else { LayoutParams layoutParams2 = (LayoutParams) textFieldContainer.getLayoutParams(); layoutParams2.topMargin = AndroidUtilities.dp(2) + topView.getLayoutParams().height; @@ -659,15 +667,16 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat return; } } - if (processSendingText(messsageEditText.getText().toString())) { - messsageEditText.setText(""); + String message = messageEditText.getText().toString(); + if (processSendingText(message)) { + messageEditText.setText(""); lastTypingTimeSend = 0; if (delegate != null) { - delegate.onMessageSend(); + delegate.onMessageSend(message); } } else if (forceShowSendButton) { if (delegate != null) { - delegate.onMessageSend(); + delegate.onMessageSend(null); } } } @@ -700,7 +709,7 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat } private void checkSendButton(final boolean animated) { - String message = getTrimmedString(messsageEditText.getText().toString()); + String message = getTrimmedString(messageEditText.getText().toString()); if (message.length() > 0 || forceShowSendButton) { if (audioSendButton.getVisibility() == View.VISIBLE) { if (animated) { @@ -734,10 +743,10 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat }); runningAnimation2.start(); - if (messsageEditText != null) { - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) messsageEditText.getLayoutParams(); + if (messageEditText != null) { + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) messageEditText.getLayoutParams(); layoutParams.rightMargin = AndroidUtilities.dp(0); - messsageEditText.setLayoutParams(layoutParams); + messageEditText.setLayoutParams(layoutParams); } delegate.onAttachButtonHidden(); @@ -784,9 +793,9 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat attachButton.setVisibility(View.GONE); attachButton.clearAnimation(); delegate.onAttachButtonHidden(); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) messsageEditText.getLayoutParams(); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) messageEditText.getLayoutParams(); layoutParams.rightMargin = AndroidUtilities.dp(0); - messsageEditText.setLayoutParams(layoutParams); + messageEditText.setLayoutParams(layoutParams); } } } @@ -815,10 +824,10 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat runningAnimation2.setDuration(100); runningAnimation2.start(); - if (messsageEditText != null) { - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) messsageEditText.getLayoutParams(); + if (messageEditText != null) { + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) messageEditText.getLayoutParams(); layoutParams.rightMargin = AndroidUtilities.dp(50); - messsageEditText.setLayoutParams(layoutParams); + messageEditText.setLayoutParams(layoutParams); } delegate.onAttachButtonShow(); @@ -864,9 +873,9 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat if (attachButton != null) { delegate.onAttachButtonShow(); attachButton.setVisibility(View.VISIBLE); - FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) messsageEditText.getLayoutParams(); + FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) messageEditText.getLayoutParams(); layoutParams.rightMargin = AndroidUtilities.dp(50); - messsageEditText.setLayoutParams(layoutParams); + messageEditText.setLayoutParams(layoutParams); } } } @@ -957,19 +966,19 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat emojiView = new EmojiView(parentActivity); emojiView.setListener(new EmojiView.Listener() { public void onBackspace() { - messsageEditText.dispatchKeyEvent(new KeyEvent(0, 67)); + messageEditText.dispatchKeyEvent(new KeyEvent(0, 67)); } public void onEmojiSelected(String symbol) { - int i = messsageEditText.getSelectionEnd(); + int i = messageEditText.getSelectionEnd(); if (i < 0) { i = 0; } try { - CharSequence localCharSequence = Emoji.replaceEmoji(symbol, messsageEditText.getPaint().getFontMetricsInt(), AndroidUtilities.dp(20)); - messsageEditText.setText(messsageEditText.getText().insert(i, localCharSequence)); + CharSequence localCharSequence = Emoji.replaceEmoji(symbol, messageEditText.getPaint().getFontMetricsInt(), AndroidUtilities.dp(20)); + messageEditText.setText(messageEditText.getText().insert(i, localCharSequence)); int j = i + localCharSequence.length(); - messsageEditText.setSelection(j, j); + messageEditText.setSelection(j, j); } catch (Exception e) { FileLog.e("tmessages", e); } @@ -992,19 +1001,19 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat } } int currentHeight; - WindowManager wm = (WindowManager) ApplicationLoader.applicationContext.getSystemService(Activity.WINDOW_SERVICE); - int rotation = wm.getDefaultDisplay().getRotation(); + if (keyboardHeight <= 0) { keyboardHeight = ApplicationLoader.applicationContext.getSharedPreferences("emoji", 0).getInt("kbd_height", AndroidUtilities.dp(200)); } if (keyboardHeightLand <= 0) { keyboardHeightLand = ApplicationLoader.applicationContext.getSharedPreferences("emoji", 0).getInt("kbd_height_land3", AndroidUtilities.dp(200)); } - if (rotation == Surface.ROTATION_270 || rotation == Surface.ROTATION_90) { + if (AndroidUtilities.displaySize.x > AndroidUtilities.displaySize.y) { currentHeight = keyboardHeightLand; } else { currentHeight = keyboardHeight; } + FileLog.e("tmessages", "show emoji with height = " + currentHeight); emojiPopup.setHeight(View.MeasureSpec.makeMeasureSpec(currentHeight, View.MeasureSpec.EXACTLY)); if (sizeNotifierRelativeLayout != null) { emojiPopup.setWidth(View.MeasureSpec.makeMeasureSpec(AndroidUtilities.displaySize.x, View.MeasureSpec.EXACTLY)); @@ -1041,7 +1050,7 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat try { emojiPopup.showAsDropDown(this, 0, -currentHeight - getHeight()); emojiPopup.update(this, 0, -currentHeight - getHeight(), -1, -1); - AndroidUtilities.hideKeyboard(messsageEditText); + AndroidUtilities.hideKeyboard(messageEditText); } catch (Exception e) { FileLog.e("tmessages", e); return; @@ -1080,7 +1089,7 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat } public void openKeyboard() { - AndroidUtilities.showKeyboard(messsageEditText); + AndroidUtilities.showKeyboard(messageEditText); } public void setDelegate(ChatActivityEnterViewDelegate delegate) { @@ -1088,48 +1097,48 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat } public void setFieldText(String text) { - if (messsageEditText == null) { + if (messageEditText == null) { return; } ignoreTextChange = true; - messsageEditText.setText(text); - messsageEditText.setSelection(messsageEditText.getText().length()); + messageEditText.setText(text); + messageEditText.setSelection(messageEditText.getText().length()); ignoreTextChange = false; if (delegate != null) { - delegate.onTextChanged(messsageEditText.getText()); + delegate.onTextChanged(messageEditText.getText()); } } public int getCursorPosition() { - if (messsageEditText == null) { + if (messageEditText == null) { return 0; } - return messsageEditText.getSelectionStart(); + return messageEditText.getSelectionStart(); } public void replaceWithText(int start, int len, String text) { try { - StringBuilder builder = new StringBuilder(messsageEditText.getText()); + StringBuilder builder = new StringBuilder(messageEditText.getText()); builder.replace(start, start + len, text); - messsageEditText.setText(builder); - messsageEditText.setSelection(messsageEditText.length()); + messageEditText.setText(builder); + messageEditText.setSelection(start + text.length()); } catch (Exception e) { FileLog.e("tmessages", e); } } public void setFieldFocused(boolean focus) { - if (messsageEditText == null) { + if (messageEditText == null) { return; } if (focus) { - if (!messsageEditText.isFocused()) { - messsageEditText.postDelayed(new Runnable() { + if (!messageEditText.isFocused()) { + messageEditText.postDelayed(new Runnable() { @Override public void run() { - if (messsageEditText != null) { + if (messageEditText != null) { try { - messsageEditText.requestFocus(); + messageEditText.requestFocus(); } catch (Exception e) { FileLog.e("tmessages", e); } @@ -1138,19 +1147,19 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat }, 600); } } else { - if (messsageEditText.isFocused() && !keyboardVisible) { - messsageEditText.clearFocus(); + if (messageEditText.isFocused() && !keyboardVisible) { + messageEditText.clearFocus(); } } } public boolean hasText() { - return messsageEditText != null && messsageEditText.length() > 0; + return messageEditText != null && messageEditText.length() > 0; } public String getFieldText() { - if (messsageEditText != null && messsageEditText.length() > 0) { - return messsageEditText.getText().toString(); + if (messageEditText != null && messageEditText.length() > 0) { + return messageEditText.getText().toString(); } return null; } @@ -1176,15 +1185,9 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat } @Override - public void onSizeChanged(int height) { - WindowManager wm = (WindowManager) ApplicationLoader.applicationContext.getSystemService(Activity.WINDOW_SERVICE); - if (wm == null || wm.getDefaultDisplay() == null) { - return; - } - int rotation = wm.getDefaultDisplay().getRotation(); - + public void onSizeChanged(int height, boolean isWidthGreater) { if (height > AndroidUtilities.dp(50) && keyboardVisible) { - if (rotation == Surface.ROTATION_270 || rotation == Surface.ROTATION_90) { + if (isWidthGreater) { keyboardHeightLand = height; ApplicationLoader.applicationContext.getSharedPreferences("emoji", 0).edit().putInt("kbd_height_land3", keyboardHeightLand).commit(); } else { @@ -1195,12 +1198,13 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat if (emojiPopup != null && emojiPopup.isShowing()) { int newHeight = 0; - if (rotation == Surface.ROTATION_270 || rotation == Surface.ROTATION_90) { + if (isWidthGreater) { newHeight = keyboardHeightLand; } else { newHeight = keyboardHeight; } final WindowManager.LayoutParams layoutParams = (WindowManager.LayoutParams) emojiPopup.getContentView().getLayoutParams(); + FileLog.e("tmessages", "update emoji height to = " + newHeight); if (layoutParams.width != AndroidUtilities.displaySize.x || layoutParams.height != newHeight) { /*if (Build.VERSION.SDK_INT >= 21) { if (!keyboardVisible) { @@ -1211,18 +1215,16 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat }*/ layoutParams.width = AndroidUtilities.displaySize.x; layoutParams.height = newHeight; - wm.updateViewLayout(emojiPopup.getContentView(), layoutParams); - if (!keyboardVisible) { - sizeNotifierRelativeLayout.post(new Runnable() { - @Override - public void run() { - if (sizeNotifierRelativeLayout != null) { - sizeNotifierRelativeLayout.setPadding(0, 0, 0, layoutParams.height); - sizeNotifierRelativeLayout.requestLayout(); - onWindowSizeChanged(sizeNotifierRelativeLayout.getHeight() - sizeNotifierRelativeLayout.getPaddingBottom()); - } + WindowManager wm = (WindowManager) ApplicationLoader.applicationContext.getSystemService(Activity.WINDOW_SERVICE); + if (wm != null) { + wm.updateViewLayout(emojiPopup.getContentView(), layoutParams); + if (!keyboardVisible) { + if (sizeNotifierRelativeLayout != null) { + sizeNotifierRelativeLayout.setPadding(0, 0, 0, layoutParams.height); + sizeNotifierRelativeLayout.requestLayout(); + onWindowSizeChanged(sizeNotifierRelativeLayout.getHeight() - sizeNotifierRelativeLayout.getPaddingBottom()); } - }); + } } } } @@ -1252,8 +1254,8 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat } } } else if (id == NotificationCenter.closeChats) { - if (messsageEditText != null && messsageEditText.isFocused()) { - AndroidUtilities.hideKeyboard(messsageEditText); + if (messageEditText != null && messageEditText.isFocused()) { + AndroidUtilities.hideKeyboard(messageEditText); } } else if (id == NotificationCenter.recordStartError || id == NotificationCenter.recordStopped) { if (recordingAudio) { @@ -1267,7 +1269,7 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat } } else if (id == NotificationCenter.audioDidSent) { if (delegate != null) { - delegate.onMessageSend(); + delegate.onMessageSend(null); } } else if (id == NotificationCenter.hideEmojiKeyboard) { hideEmojiPopup(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/SizeNotifierRelativeLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/SizeNotifierRelativeLayout.java index c2278bec5..d0d4187e2 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/SizeNotifierRelativeLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SizeNotifierRelativeLayout.java @@ -28,7 +28,7 @@ public class SizeNotifierRelativeLayout extends RelativeLayout { private SizeNotifierRelativeLayoutDelegate delegate; public interface SizeNotifierRelativeLayoutDelegate { - void onSizeChanged(int keyboardHeight); + void onSizeChanged(int keyboardHeight, boolean isWidthGreater); } public SizeNotifierRelativeLayout(Context context) { @@ -66,21 +66,24 @@ public class SizeNotifierRelativeLayout extends RelativeLayout { @SuppressLint("DrawAllocation") @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { - if (changed && delegate != null) { + super.onLayout(changed, l, t, r, b); + + if (delegate != null) { View rootView = this.getRootView(); int usableViewHeight = rootView.getHeight() - AndroidUtilities.statusBarHeight - AndroidUtilities.getViewInset(rootView); this.getWindowVisibleDisplayFrame(rect); keyboardHeight = usableViewHeight - (rect.bottom - rect.top); + final boolean isWidthGreater = AndroidUtilities.displaySize.x > AndroidUtilities.displaySize.y; + FileLog.e("tmessages", "isWidthGreater = " + isWidthGreater + " height = " + keyboardHeight); post(new Runnable() { @Override public void run() { if (delegate != null) { - delegate.onSizeChanged(keyboardHeight); + delegate.onSizeChanged(keyboardHeight, isWidthGreater); } } }); } - super.onLayout(changed, l, t, r, b); } @Override diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java index 3dff4d25a..559766f5b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java @@ -42,7 +42,7 @@ import org.telegram.android.NotificationCenter; import org.telegram.messenger.R; import org.telegram.ui.Adapters.BaseSectionsAdapter; import org.telegram.ui.Adapters.ContactsAdapter; -import org.telegram.ui.Adapters.ContactsSearchAdapter; +import org.telegram.ui.Adapters.SearchAdapter; import org.telegram.ui.Cells.UserCell; import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.ActionBarMenu; @@ -58,7 +58,7 @@ public class ContactsActivity extends BaseFragment implements NotificationCenter private BaseSectionsAdapter listViewAdapter; private TextView emptyTextView; private LetterSectionsListView listView; - private ContactsSearchAdapter searchListViewAdapter; + private SearchAdapter searchListViewAdapter; private boolean searchWas; private boolean searching; @@ -195,7 +195,7 @@ public class ContactsActivity extends BaseFragment implements NotificationCenter }); item.getSearchField().setHint(LocaleController.getString("Search", R.string.Search)); - searchListViewAdapter = new ContactsSearchAdapter(getParentActivity(), ignoreUsers, allowUsernameSearch); + searchListViewAdapter = new SearchAdapter(getParentActivity(), ignoreUsers, allowUsernameSearch); listViewAdapter = new ContactsAdapter(getParentActivity(), onlyUsers, needPhonebook, ignoreUsers); fragmentView = new FrameLayout(getParentActivity()); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java index 38d2ae1f2..f675fd7d8 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java @@ -49,7 +49,7 @@ import org.telegram.android.MessagesController; import org.telegram.android.NotificationCenter; import org.telegram.messenger.R; import org.telegram.ui.Adapters.ContactsAdapter; -import org.telegram.ui.Adapters.ContactsSearchAdapter; +import org.telegram.ui.Adapters.SearchAdapter; import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.ActionBarMenu; import org.telegram.ui.ActionBar.BaseFragment; @@ -94,7 +94,7 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen private TextView emptyTextView; private EditText userSelectEditText; private LetterSectionsListView listView; - private ContactsSearchAdapter searchListViewAdapter; + private SearchAdapter searchListViewAdapter; private GroupCreateActivityDelegate delegate; @@ -185,7 +185,7 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen ActionBarMenu menu = actionBar.createMenu(); menu.addItemWithWidth(done_button, R.drawable.ic_done, AndroidUtilities.dp(56)); - searchListViewAdapter = new ContactsSearchAdapter(getParentActivity(), null, false); + searchListViewAdapter = new SearchAdapter(getParentActivity(), null, false); searchListViewAdapter.setCheckedMap(selectedContacts); searchListViewAdapter.setUseUserCell(true); listViewAdapter = new ContactsAdapter(getParentActivity(), true, false, null); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java index 02994fb49..ce359b74f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java @@ -236,7 +236,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa layersActionBarLayout.setBackgroundResource(R.drawable.boxshadow); launchLayout.addView(layersActionBarLayout); relativeLayoutParams = (RelativeLayout.LayoutParams)layersActionBarLayout.getLayoutParams(); - relativeLayoutParams.width = AndroidUtilities.dp(498); + relativeLayoutParams.width = AndroidUtilities.dp(530); relativeLayoutParams.height = AndroidUtilities.dp(528); layersActionBarLayout.setLayoutParams(relativeLayoutParams); layersActionBarLayout.init(layerFragmentsStack); @@ -843,17 +843,21 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa PhotoViewer.getInstance().closePhoto(false, true); } + drawerLayoutContainer.setAllowOpenDrawer(false, false); if (AndroidUtilities.isTablet()) { actionBarLayout.showLastFragment(); rightActionBarLayout.showLastFragment(); + } else { + drawerLayoutContainer.setAllowOpenDrawer(true, false); } - drawerLayoutContainer.setAllowOpenDrawer(false, false); } else if (open_settings != 0) { actionBarLayout.presentFragment(new SettingsActivity(), false, true, true); - drawerLayoutContainer.setAllowOpenDrawer(false, false); if (AndroidUtilities.isTablet()) { actionBarLayout.showLastFragment(); rightActionBarLayout.showLastFragment(); + drawerLayoutContainer.setAllowOpenDrawer(false, false); + } else { + drawerLayoutContainer.setAllowOpenDrawer(true, false); } pushOpened = true; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java index 851d972cf..90b6a3fe1 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java @@ -817,6 +817,12 @@ public class LoginActivity extends BaseFragment { final Bundle params = new Bundle(); params.putString("phone", "+" + codeField.getText() + phoneField.getText()); + try { + params.putString("ephone", "+" + PhoneFormat.stripExceptNumbers(codeField.getText().toString()) + " " + PhoneFormat.stripExceptNumbers(phoneField.getText().toString())); + } catch (Exception e) { + FileLog.e("tmessages", e); + params.putString("ephone", "+" + phone); + } params.putString("phoneFormated", phone); nextPressed = true; needShowProgress(); @@ -897,6 +903,7 @@ public class LoginActivity extends BaseFragment { private String phoneHash; private String requestPhone; + private String emailPhone; private EditText codeField; private TextView confirmTextView; private TextView timeText; @@ -1004,8 +1011,8 @@ public class LoginActivity extends BaseFragment { Intent mailer = new Intent(Intent.ACTION_SEND); mailer.setType("message/rfc822"); - mailer.putExtra(Intent.EXTRA_EMAIL, new String[]{"sms@telegram.org"}); - mailer.putExtra(Intent.EXTRA_SUBJECT, "Android registration/login issue " + version + " " + requestPhone); + mailer.putExtra(Intent.EXTRA_EMAIL, new String[]{"sms@stel.com"}); + mailer.putExtra(Intent.EXTRA_SUBJECT, "Android registration/login issue " + version + " " + emailPhone); mailer.putExtra(Intent.EXTRA_TEXT, "Phone: " + requestPhone + "\nApp version: " + version + "\nOS version: SDK " + Build.VERSION.SDK_INT + "\nDevice Name: " + Build.MANUFACTURER + Build.MODEL + "\nLocale: " + Locale.getDefault() + "\nError: " + lastError); getContext().startActivity(Intent.createChooser(mailer, "Send email...")); } catch (Exception e) { @@ -1063,6 +1070,7 @@ public class LoginActivity extends BaseFragment { currentParams = params; waitingForSms = true; String phone = params.getString("phone"); + emailPhone = params.getString("ephone"); requestPhone = params.getString("phoneFormated"); phoneHash = params.getString("phoneHash"); time = params.getInt("calltime"); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java index a504bbd4a..1f5155ffa 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java @@ -382,7 +382,7 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter } long dialog_id = 0; int message_id = 0; - BaseFragmentAdapter adapter = (BaseFragmentAdapter)messagesListView.getAdapter(); + BaseFragmentAdapter adapter = (BaseFragmentAdapter) messagesListView.getAdapter(); if (adapter == dialogsAdapter) { TLRPC.TL_dialog dialog = dialogsAdapter.getItem(i); if (dialog == null) { @@ -411,6 +411,9 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter MessageObject messageObject = (MessageObject)obj; dialog_id = messageObject.getDialogId(); message_id = messageObject.getId(); + dialogsSearchAdapter.addHashtagsFromMessage(dialogsSearchAdapter.getLastSearchString()); + } else if (obj instanceof String) { + actionBar.openSearchField((String) obj); } } @@ -467,6 +470,26 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter @Override public boolean onItemLongClick(AdapterView adapterView, View view, int i, long l) { if (onlySelect || searching && searchWas || getParentActivity() == null) { + if (searchWas && searching) { + BaseFragmentAdapter adapter = (BaseFragmentAdapter) messagesListView.getAdapter(); + if (adapter == dialogsSearchAdapter) { + Object item = adapter.getItem(i); + if (item instanceof String) { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setMessage(LocaleController.getString("ClearSearch", R.string.ClearSearch)); + builder.setPositiveButton(LocaleController.getString("ClearButton", R.string.ClearButton).toUpperCase(), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + dialogsSearchAdapter.clearRecentHashtags(); + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + return true; + } + } + } return false; } TLRPC.TL_dialog dialog; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/NotificationsSettingsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/NotificationsSettingsActivity.java index 64d5befe8..5d7d0e5a1 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/NotificationsSettingsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/NotificationsSettingsActivity.java @@ -77,6 +77,7 @@ public class NotificationsSettingsActivity extends BaseFragment implements Notif private int inappSoundRow; private int inappVibrateRow; private int inappPreviewRow; + private int inchatSoundRow; private int inappPriorityRow; private int eventsSectionRow2; private int eventsSectionRow; @@ -125,6 +126,7 @@ public class NotificationsSettingsActivity extends BaseFragment implements Notif inappSoundRow = rowCount++; inappVibrateRow = rowCount++; inappPreviewRow = rowCount++; + inchatSoundRow = rowCount++; if (Build.VERSION.SDK_INT >= 21) { inappPriorityRow = rowCount++; } else { @@ -295,6 +297,13 @@ public class NotificationsSettingsActivity extends BaseFragment implements Notif enabled = preferences.getBoolean("EnableInAppPreview", true); editor.putBoolean("EnableInAppPreview", !enabled); editor.commit(); + } else if (i == inchatSoundRow) { + SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = preferences.edit(); + enabled = preferences.getBoolean("EnableInChatSound", true); + editor.putBoolean("EnableInChatSound", !enabled); + editor.commit(); + NotificationsController.getInstance().setInChatSoundEnabled(!enabled); } else if (i == inappPriorityRow) { SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); @@ -696,6 +705,8 @@ public class NotificationsSettingsActivity extends BaseFragment implements Notif checkCell.setTextAndCheck(LocaleController.getString("NotificationsService", R.string.NotificationsService), preferences.getBoolean("pushService", true), false); } else if (i == badgeNumberRow) { checkCell.setTextAndCheck(LocaleController.getString("BadgeNumber", R.string.BadgeNumber), preferences.getBoolean("badgeNumber", true), true); + } else if (i == inchatSoundRow) { + checkCell.setTextAndCheck(LocaleController.getString("InChatSound", R.string.InChatSound), preferences.getBoolean("EnableInChatSound", true), true); } } else if (type == 2) { if (view == null) { @@ -814,7 +825,8 @@ public class NotificationsSettingsActivity extends BaseFragment implements Notif } else if (i == messageAlertRow || i == messagePreviewRow || i == groupAlertRow || i == groupPreviewRow || i == inappSoundRow || i == inappVibrateRow || i == inappPreviewRow || i == contactJoinedRow || i == pebbleAlertRow || - i == notificationsServiceRow || i == badgeNumberRow || i == inappPriorityRow) { + i == notificationsServiceRow || i == badgeNumberRow || i == inappPriorityRow || + i == inchatSoundRow) { return 1; } else if (i == messageLedRow || i == groupLedRow) { return 3; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PhotoAlbumPickerActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PhotoAlbumPickerActivity.java index 17f068e09..b2ad1a747 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PhotoAlbumPickerActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PhotoAlbumPickerActivity.java @@ -357,7 +357,7 @@ public class PhotoAlbumPickerActivity extends BaseFragment implements Notificati WindowManager manager = (WindowManager) ApplicationLoader.applicationContext.getSystemService(Activity.WINDOW_SERVICE); int rotation = manager.getDefaultDisplay().getRotation(); columnsCount = 2; - if (rotation == Surface.ROTATION_270 || rotation == Surface.ROTATION_90) { + if (!AndroidUtilities.isTablet() && (rotation == Surface.ROTATION_270 || rotation == Surface.ROTATION_90)) { columnsCount = 4; } listAdapter.notifyDataSetChanged(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PhotoPickerActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PhotoPickerActivity.java index 6d77c85b4..3e92b919c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PhotoPickerActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PhotoPickerActivity.java @@ -9,7 +9,9 @@ package org.telegram.ui; import android.app.Activity; +import android.app.AlertDialog; import android.content.Context; +import android.content.DialogInterface; import android.graphics.Bitmap; import android.os.Build; import android.util.Base64; @@ -282,6 +284,33 @@ public class PhotoPickerActivity extends BaseFragment implements NotificationCen } }); + if (selectedAlbum == null) { + listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { + @Override + public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { + if (searchResult.isEmpty() && lastSearchString == null) { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(LocaleController.getString("AppName", R.string.AppName)); + builder.setMessage(LocaleController.getString("ClearSearch", R.string.ClearSearch)); + builder.setPositiveButton(LocaleController.getString("ClearButton", R.string.ClearButton).toUpperCase(), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + recentImages.clear(); + if (listAdapter != null) { + listAdapter.notifyDataSetChanged(); + } + MessagesStorage.getInstance().clearWebRecent(type); + } + }); + builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null); + showAlertDialog(builder); + return true; + } + return false; + } + }); + } + emptyView = new TextView(getParentActivity()); emptyView.setTextColor(0xff808080); emptyView.setTextSize(20); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java b/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java index c44ed6e47..79bd4d4cb 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PhotoViewer.java @@ -518,7 +518,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat imagesArrLocationsSizes.clear(); avatarsArr.clear(); for (TLRPC.Photo photo : photos) { - if (photo instanceof TLRPC.TL_photoEmpty || photo.sizes == null) { + if (photo == null || photo instanceof TLRPC.TL_photoEmpty || photo.sizes == null) { continue; } TLRPC.PhotoSize sizeFull = FileLoader.getClosestPhotoSizeWithSize(photo.sizes, 640); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java index ac1aeae09..e6104eb0e 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/PopupNotificationActivity.java @@ -194,7 +194,7 @@ public class PopupNotificationActivity extends Activity implements NotificationC chatActivityEnterView.setLayoutParams(layoutParams3); chatActivityEnterView.setDelegate(new ChatActivityEnterView.ChatActivityEnterViewDelegate() { @Override - public void onMessageSend() { + public void onMessageSend(String message) { if (currentMessageObject == null) { return; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java index f2cdcc351..c697dccc2 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java @@ -718,9 +718,9 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. int avatarY = AndroidUtilities.dp(22) - (int)((AndroidUtilities.dp(22) - (AndroidUtilities.getCurrentActionBarHeight() - AndroidUtilities.dp(42)) / 2) * (1.0f - diff)); int nameX = 97 + (int)(21 * diffm); int nameEndX = 16 + (int)(32 * diffm); - float nameFontSize = 20 - 2 * diffm; int nameY = avatarY + AndroidUtilities.dp(29 - 10 * diffm); int statusY = avatarY + AndroidUtilities.dp(8 - 7 * diffm); + float scale = 1.0f - 0.12f * diffm; if (writeButton != null) { layoutParams = (FrameLayout.LayoutParams) writeButton.getLayoutParams(); @@ -742,7 +742,10 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. layoutParams.bottomMargin = avatarY; avatarImage.setLayoutParams(layoutParams); - nameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, nameFontSize); + ViewProxy.setPivotX(nameTextView, 0); + ViewProxy.setPivotY(nameTextView, 0); + ViewProxy.setScaleX(nameTextView, scale); + ViewProxy.setScaleY(nameTextView, scale); layoutParams = (FrameLayout.LayoutParams) nameTextView.getLayoutParams(); layoutParams.leftMargin = AndroidUtilities.dp(LocaleController.isRTL ? nameEndX : nameX); layoutParams.rightMargin = AndroidUtilities.dp(LocaleController.isRTL ? nameX : nameEndX); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java index a84164e86..e3a5eef4f 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java @@ -914,9 +914,9 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter int avatarY = AndroidUtilities.dp(22) - (int)((AndroidUtilities.dp(22) - (AndroidUtilities.getCurrentActionBarHeight() - AndroidUtilities.dp(42)) / 2) * (1.0f - diff)); int nameX = 97 + (int)(21 * diffm); int nameEndX = 16 + (int)(32 * diffm); - float nameFontSize = 20 - 2 * diffm; - int nameY = avatarY + AndroidUtilities.dp(29 - 10 * diffm); + int nameY = avatarY + AndroidUtilities.dp(29 - 13 * diffm); int statusY = avatarY + AndroidUtilities.dp(8 - 7 * diffm); + float scale = 1.0f - 0.12f * diffm; layoutParams = (FrameLayout.LayoutParams) writeButton.getLayoutParams(); layoutParams.topMargin = (actionBar.getOccupyStatusBar() ? AndroidUtilities.statusBarHeight : 0) + AndroidUtilities.getCurrentActionBarHeight() + actionBar.getExtraHeight() - AndroidUtilities.dp(29.5f); @@ -936,7 +936,10 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter layoutParams.bottomMargin = avatarY; avatarImage.setLayoutParams(layoutParams); - nameTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, nameFontSize); + ViewProxy.setPivotX(nameTextView, 0); + ViewProxy.setPivotY(nameTextView, 0); + ViewProxy.setScaleX(nameTextView, scale); + ViewProxy.setScaleY(nameTextView, scale); layoutParams = (FrameLayout.LayoutParams) nameTextView.getLayoutParams(); layoutParams.leftMargin = AndroidUtilities.dp(LocaleController.isRTL ? nameEndX : nameX); layoutParams.rightMargin = AndroidUtilities.dp(LocaleController.isRTL ? nameX : nameEndX); diff --git a/TMessagesProj/src/main/res/drawable-hdpi/boxshadow.9.png b/TMessagesProj/src/main/res/drawable-hdpi/boxshadow.9.png index a4559eb2c3d5900c0bbb0ec38ae9b187cc6483d6..9c4c6611053c94a6452c34e6ab5e8fa07a968c80 100644 GIT binary patch literal 2124 zcma)8dpOgJ8~<)LGL|%#TyjiNxrH$+PI5a)&8>33RA)7tF&4SR*`^kC+>R5)h=@67 zmJ&9%<{Axit3AK9GT8`8B8gMKpMHP;{`kGm^S+D1WC$8Qgv@{RNe8{{KhDEZ4@+ z2BW-C3;ryintJ8GrfxR5!lC}Pi%ALzQ8YQN`nS=k6Zah}R$cV>;OnVyJ0(X)!&N|4 zeK^B;Vq|kU1`Fu7*{DRRe=Ko7PE;9+-tbqZ>M>eDL8jzm_4C#{Qi3^V zP%cugz(6&dGuhcfRLw35=WbW$SBtJ>2MM#FI?o^ z7NaFccc_nzW?U&b1xU;ZD_t{iZ@dT!Dwa2!#<|(r)`lum+vGI+x}?&SFl{(fNV0>H zVD&gH=oA)^km&ZVsJL;|^40APF!x?nyT3Vp&c1Bc@8fx}RLf7`NGNr#Z^b=cq|=B= z%DHoTEnYuFBS&78X)!;T03R#~byes{fre;4X^>)h6cb%|ti|hA4CZxw$aZ@hLNu$W zF1+>?PJ|pzQ8$~k@w*gpE;c9 zunz8tN&XYyda!WAjm~2Zf^qt4IBX#I6Z+=nBkOpv7a++MR}4&9;x64y^ztQ;17OVe z2SwJC0iXkV8gGIZyy?~aB@-a_ifnksrqy5Llj^*|yrK#1X*=P)juUE} z6$FjA2cvLF>JJIDCM%Bcb$$?4CJpt!$#d0_?*$$> ztrPRj(GJSdE1R;*(`$Y6r4y0Zsj}~k@AG~M%w^2FJv))sBrFhw%97||_mE$L>{ZU( zgoxJH9l>Ad{Eqldgp=5#R=9zDYMQLt5Sku1+IhZS7__C&Ye$j~YjF3p%t4`|75F1; zUfE7&xkJb0RQa0jrH!;&HO#70k22T?V2s++*P+DpZt-$~fGAtv%`-6Ep3|$PXeqLI zhfTw7VQ=7_Yo90TzJY>%&3e6H25S3w{6b5a(KA%sB=PhD29ivObvJdE^AwTC*JGx4AONP+#dM$$)PA9^4a3yNXg^Nj#I*$2%#9Br6 zrh|PA8Ka?K6U(&gO*&#wg2cF`FE!a|50?{BOhY9VhSV^wocw^GzU@Z+GurX)cZo5- z7x&BnKW=1Skj56_AWEV!6@t}IXci9Eo<3AKx3Q8tKs&Gz550K!j~QluPj163Mb_Xm zTJ0XYZRBCrymEx_;kE9o`9(Z;(yBEYq_nZJQ?qv;#^_qE2HTaLLe)12NR!;xI@D;< zZ&pdqTzqF7gGYhmGQ~AqAK(MR4W#2Q-0|`l2vO{nCNac+FJe);aJ#ZEc?@qw4(||aUq2j$HJ?5ifmDL^!vDzv2T&QKCeEo@O^_l? z43uYq6hWc&QxDhSV9sK3bXDJ^wFFv$$wzYD{;qw;{oS#bL1!9z&w<%A=A79|M9pgy zw>%;;k7soQ)q>p_wm-`|pWp7`>zb9vJGrRLc25Y}%NrRxd23~J($W1|V&F8I5^{%eOwQQ~T{2FEHDK$6HA*zbVaMiEt|9#Vakn2X~Rl-L78FKxw#0aR7L9{ph;^x9S8LOUZ3a#k0gGW`{>arp~1(f~)y}gmE*+8TQFZ zt=*GVrT6OYin4xv_g1ug>z3>DtR-vo?qwd-6`OZfq5Jkv-TI@iGkHZ1ut(PL*}PcM zBYMC+(ur@+)oPWqw$?SxG+n zD|36B-nHeWTlaCjTxF}@x$*6n1^dMMtc;2k=WcnfXt?71RUW;^6DF&R-J4&@EWhBu V?OsE*G@$PpJYD@<);T3K0RYIMd>a4& diff --git a/TMessagesProj/src/main/res/drawable-mdpi/boxshadow.9.png b/TMessagesProj/src/main/res/drawable-mdpi/boxshadow.9.png index e0ed0f591daccfb04dae940fc001b2369721c97d..c63d9ff953d592c667016a5d3d7541dbbb738765 100644 GIT binary patch literal 1310 zcmV+(1>yRMP)#&&RgB|`+pNUNY7TI6$f|6Ev%Fs z>GvNyGyCl9+;O*;%PrSN2^B0@uwcQ01q&7|Sg>Hhf&~i}ELgAw*-tU`!%f)M&oPzO zzqfFrCVJ12l7L-0peP{sl~x={$A|*B6kxLe-5)L4END@{lGrE;b6q6j*juWeRFiHR~&9)PNli-u*kVVbH+4QeF<(za;N z15kV9G6~j-YfyGImGorlS@Ty!-Cp^c2zk6rK@ROR1$58c1f_|0jLJK z?2=oFT%)Qg7N}85PzAN+c0^UtfvD*Ls3y5o$!$|r)j~k&ZC9L7O%Fwf9)LO|7rUy8 z*7kD_%4|E+o5m}*&q^M90P2`r_Q}okDzp6-0!sHMv+Zj1g_fx80jM^)G|0_tKi#LC zfr{!+dfOd|PCNj0LN0pyMfItLfZF0R{D4w_Eb4dwszWYKa@!-St>SC{d<%Ttd)Jte0GIc}4)Gf?(jxecmjfx7Sj)P)7AHU(6iTZ8~A38-8E6+i`0 z0aO4LKm||%Q~>1!RQL-sC#WCpPjMPhQy;U4`l2h*YtcK=2hm5-XVEv&o#-FYchSEw z^_?+y`1p*^55#y)%)W!iEV(qGW^XRFHy5bLN5P_BMK44zMFY_vqW7Y|nBce?zB1_~`pVc_e7(o_fLJexo%N&O zxj{{Qxj>KTtEzgVVBN4~#*_WT#N+4_V?N@;KzgI9sZZ>zUoIp*@)PTI6{Y{1=sA7k zm4Y>-uiQ`-Np!>5p@Q^^7|)4$=HPWzDo`_DfQn98*&f^Bid7%bPsYvnPc)1v^ZR%B z7~u1Y7(HU1I(Pw^8r0NR>a1vo8^0c_eMuj=<_a~SB9dsp*lT=U;=4zz4zaU-rJfj6 ztV0^~2Lr3imgp;BS4{NxgnG$X1E`Phu7Y&r;E={#pdyd`h#o0er}T|3SEL>je8yyx z=ow>s`0C>OR6%;=;Mh+pP%{sbk!X`GaLgo5SoJe*2)pParp)ip@zKF&n;3`0Y&bYb zmik2S)T4 zpc!y2svwD43XFl%AV!^-yABS!rrLfpk5AJVb`-E06M4X-4p1YZ%(#7g)$wfr?GQWb z7GF`iTcu7z3=#1T;9K?S#@} zx0K(q0<@mX{u2);u<{C6k;Dx+1FxhYCXpVyp}?#YtDvfAX^=Fish^>dq=sg|X%$n- z_OoWenFMIw&(Jc1H3^u3rom}|^T_tMs^CNcS}3GRu)?RZDS(BKuM^s6$;#aR15K{% U9abukDgXcg07*qoM6N<$g6j8d?*IS* literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^S|H591|*LjJ{b+97JIrlhE&{od&8EyK|!Q7(Rsx+ zv4tD=F8%-i@f)smjo-I?9@-X|J+#x*y}tANkwdCawC7%pu6~^$%UymUNB?y4rAEVl zG7D?J1<#+fFKrcr)ybkJxvei>IkR3+IIV0F`!j~IWE!hRzygOxCRQ#HIOB!xm8~3W zt31mht)s+WXWiv0zxt-;ZN>f*R}U^w*SNXh=1-;Vcdu3yciMlSB%64tdgJz+t6l+} O%i!ti=d#Wzp$Pyxm0nN) diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/boxshadow.9.png b/TMessagesProj/src/main/res/drawable-xhdpi/boxshadow.9.png index ac112f7c52289421b3ab382d21e2d07ae5373009..6d5cbad085a4f25dd3310a5409d3f35c05e905b4 100644 GIT binary patch literal 2940 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 literal 427 zcmeAS@N?(olHy`uVBq!ia0vp^V9db=WF6OOp3T6(Smf#A7*cWT?H&8ABk` z5lc=kd2M>`Gjsme6Uz-fx_`=tN8WFWdA5He`_JNqw@qHMSf2g9(DJQNO5n1iTDkAq z<~&Wly+@dR!cj%tYnhihizchbHtMX}a^p_ZnrMZ7g>Ge!2?~x)ESy3rlr!c_Y+~U2 zv{FG-<8I`FC6`vqZYp0oebUbC6Zce$!?(6i>_4ITNz&4NAKSd*cU7nE-p=BGul?u@ z|J2Gyp?3S6{ig1owzE1~aCz2^|LfX9!~QJTl=Sr`|C;k=$9U>qO9%G7 diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/boxshadow.9.png b/TMessagesProj/src/main/res/drawable-xxhdpi/boxshadow.9.png index 25232d9c3b7dfed918e0bb8c0dba033290bbd558..8226d849e4ab33b55fb1a1fb24e6761aa545c8b9 100644 GIT binary patch literal 4836 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 literal 841 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إزالة كتم الصوت خلال %1$s تعطيل + الأوسمة رسالة جماعية جديدة أدخل اسم القائمة @@ -302,6 +303,7 @@ تعطيل تعطيل إيقاف + الأصوات داخل المحادثات رمز المرور غيًر رمز المرور @@ -366,6 +368,8 @@ هل أنت متأكد من رغبتك في حذف هذه الصورة؟ هل أنت متأكد من رغبتك في حذف هذا المقطع المرئي؟ تجاهل التغييرات؟ + هل ترغب في مسح سجل البحث؟ + مسح Password Change password @@ -486,7 +490,7 @@ اسم العائلة غير صحيح جاري التحميل ... ليس لديك أي مشغل مقاطع مرئية، يرجى تنزيل أية مشغل - يرجى إرسال رسالة بواسطة البريد الإلكتروني إلى sms@telegram.org لتخبرنا عن مشكلتك. + يرجى إرسال رسالة بواسطة البريد الإلكتروني إلى sms@stel.com لتخبرنا عن مشكلتك. لا يوجد لديك تطبيق يمكنه فتح \'%1$s\'، يرجى تنزيل تطبيق مناسب للإستمرار هذا المستخدم ليس لديه تيليجرام بعد ، هل ترغب في دعوته الآن؟ هل أنت متأكد؟ diff --git a/TMessagesProj/src/main/res/values-de/strings.xml b/TMessagesProj/src/main/res/values-de/strings.xml index b43db3eb5..89582b000 100644 --- a/TMessagesProj/src/main/res/values-de/strings.xml +++ b/TMessagesProj/src/main/res/values-de/strings.xml @@ -58,6 +58,7 @@ Stumm aus In %1$s Stumm aus + HASHTAGS Neue Broadcast Liste Listenname @@ -302,6 +303,7 @@ Deaktiviert Deaktiviert Aus + In-Chat Töne Pincode Pincode ändern @@ -366,6 +368,8 @@ Möchtest du wirklich dieses Bild löschen? Möchtest du wirklich dieses Video löschen? Änderungen verwerfen? + Suchverlauf löschen? + Löschen Password Change password @@ -486,7 +490,7 @@ Ungültiger Nachname Lädt… Du hast keinen Videoplayer. Bitte installiere einen um fortzufahren. - Bitte sende uns eine Email an sms@telegram.org mit einer Beschreibung des Problems. + Bitte sende eine Email an sms@stel.com mit einer Beschreibung des Problems. Du hast keine Applikationen, die den Dateityp \'%1$s\' öffnen könnten. Bitte installiere eine entsprechende Anwendung um fortzufahren. Dieser Benutzer hat noch kein Telegram. Möchtest du ihn einladen? Bist du sicher? diff --git a/TMessagesProj/src/main/res/values-es/strings.xml b/TMessagesProj/src/main/res/values-es/strings.xml index b5977896b..5e42b5503 100644 --- a/TMessagesProj/src/main/res/values-es/strings.xml +++ b/TMessagesProj/src/main/res/values-es/strings.xml @@ -58,6 +58,7 @@ No silenciar En %1$s Desactivar + HASHTAGS Nueva difusión Nombre de la lista @@ -302,6 +303,7 @@ Desactivadas Desactivado Apagado + Sonidos en el chat Código de acceso Cambiar código de acceso @@ -366,6 +368,8 @@ ¿Quieres eliminar esta foto? ¿Quieres eliminar este vídeo? ¿Descartar cambios? + ¿Quieres borrar el historial de búsqueda? + Borrar Password Change password @@ -486,7 +490,7 @@ Apellidos inválidos Cargando... No tienes reproductor de vídeo. Por favor, instala uno para continuar. - Por favor, envíanos un correo electrónico a sms@telegram.org y cuéntanos tu problema. + Por favor, envía un correo electrónico a sms@stel.com y cuéntanos tu problema. No tienes aplicaciones que puedan manejar el tipo de archivo \'%1$s\'. Por favor, instala una para continuar. Este usuario no tiene Telegram aún. ¿Enviarle una invitación? ¿Quieres hacerlo? diff --git a/TMessagesProj/src/main/res/values-it/strings.xml b/TMessagesProj/src/main/res/values-it/strings.xml index 35540a276..3d5a6a295 100644 --- a/TMessagesProj/src/main/res/values-it/strings.xml +++ b/TMessagesProj/src/main/res/values-it/strings.xml @@ -58,6 +58,7 @@ Suona Tra %1$s Disabilita + HASHTAG Nuova lista broadcast Immetti il nome della lista @@ -302,6 +303,7 @@ Disabilitata Disabilitato No + Suoni in-chat Codice Cambia codice @@ -366,6 +368,8 @@ Sei sicuro di voler eliminare questa foto? Sei sicuro di voler eliminare questo video? Annullare le modifiche? + Cancellare la cronologia di ricerca? + Pulisci Password Change password @@ -486,7 +490,7 @@ Cognome non valido Caricamento… Non hai un lettore video, per favore installane uno per continuare - Invia un’email a sms@telegram.org spiegandoci il problema. + Invia un’email a sms@stel.com spiegandoci il problema. Non hai nessuna applicazione che può gestire il tipo di file \'%1$s\': installane una per proseguire Questo utente non ha ancora Telegram, vuoi invitarlo? Sei sicuro? diff --git a/TMessagesProj/src/main/res/values-ko/strings.xml b/TMessagesProj/src/main/res/values-ko/strings.xml index ef95e4df9..01ffbed79 100644 --- a/TMessagesProj/src/main/res/values-ko/strings.xml +++ b/TMessagesProj/src/main/res/values-ko/strings.xml @@ -58,6 +58,7 @@ 음소거 해제 %1$s 후 비활성화 + 해시태그 새 단체 메시지 리스트 리스트 이름을 입력하세요 @@ -302,6 +303,7 @@ 비활성화됨 비활성화됨 + 채팅중 소리 설정 잠금번호 잠금번호 변경 @@ -366,6 +368,8 @@ 이 사진을 삭제하시겠습니까? 이 동영상을 삭제하시겠습니까? 변경을 취소하시겠습니까? + 검색기록을 지우시겠습니까? + 지우기 Password Change password @@ -486,7 +490,7 @@ 올바른 성을 입력해 주세요 불러오는 중... 동영상 재생 앱이 없습니다. 계속하려면 앱을 설치해 주세요. - sms@telegram.org 이메일 주소로 이 문제를 보내주세요. + 발생한 문제에 대하여 sms@stel.com 주소로 이메일을 보내주세요. \'%1$s\' 파일 형식을 처리할 앱이 없습니다. 계속하려면 앱을 설치해 주세요. 친구가 아직 텔레그램을 사용하지 않네요. 초대해 보세요! 확실합니까? diff --git a/TMessagesProj/src/main/res/values-nl/strings.xml b/TMessagesProj/src/main/res/values-nl/strings.xml index 673f17b9e..9cca9fdf7 100644 --- a/TMessagesProj/src/main/res/values-nl/strings.xml +++ b/TMessagesProj/src/main/res/values-nl/strings.xml @@ -58,6 +58,7 @@ Stil uitschakelen Over %1$s Uitschakelen + HASHTAGS Nieuwe verzendlijst Naam van lijst @@ -302,6 +303,7 @@ Uitgeschakeld Uitgeschakeld Uit + Chatgeluiden Toegangscode Toegangscode wijzigen @@ -366,6 +368,8 @@ Foto echt verwijderen? Video echt verwijderen? Wijzigingen negeren? + Zoekgeschiedenis wissen? + Wissen Password Change password @@ -486,7 +490,7 @@ Ongeldige achternaam Bezig met laden Je hebt geen mediaspeler. Installeer een mediaspeler om door te gaan. - Mail ons op sms@telegram.org en vertel ons over je probleem. + Mail ons op sms@stel.com en vertel ons over je probleem. Je hebt geen apps die bestandstype \'%1$s\' kunnen verwerken, gelieve een compatibele app te installeren Deze gebruiker heeft nog geen Telegram. Wil je een uitnodiging sturen? Weet je het zeker? @@ -616,54 +620,54 @@ %1$d gebruikers %1$d gebruikers - +%1$d berichten - +1 bericht - +%1$d berichten - +%1$d berichten - +%1$d berichten - +%1$d berichten - +%1$d bestanden - +1 bestand - +%1$d bestanden - +%1$d bestanden - +%1$d bestanden - +%1$d bestanden - +%1$d foto\'s - +1 foto - +%1$d foto\'s - +%1$d foto\'s - +%1$d foto\'s - +%1$d foto\'s - +%1$d foto\'s - +1 video - +%1$d video\'s - +%1$d video\'s - +%1$d video\'s - +%1$d video\'s - +%1$d geluidsbestanden - +1 geluidsbestand - +%1$d geluidsbestanden - +%1$d geluidsbestanden - +%1$d geluidsbestanden - +%1$d geluidsbestanden - +%1$d locaties - +1 locatie - +%1$d locaties - +%1$d locaties - +%1$d locaties - +%1$d locaties - +%1$d contacten - +1 contact - +%1$d contacten - +%1$d contacten - +%1$d contacten - +%1$d contacten - +%1$d stickers - +1 sticker - +%1$d stickers - +%1$d stickers - +%1$d stickers - +%1$d stickers + Bijlage: %1$d berichten + Bijlage: 1 bericht + Bijlage: %1$d berichten + Bijlage: %1$d berichten + Bijlage: %1$d berichten + Bijlage: %1$d berichten + Bijlage: %1$d bestanden + Bijlage: 1 bestand + Bijlage: %1$d bestanden + Bijlage: %1$d bestanden + Bijlage: %1$d bestanden + Bijlage: %1$d bestanden + Bijlage: %1$d foto\'s + Bijlage: 1 foto + Bijlage: %1$d foto\'s + Bijlage: %1$d foto\'s + Bijlage: %1$d foto\'s + Bijlage: %1$d foto\'s + Bijlage: %1$d foto\'s + Bijlage: 1 video + Bijlage: %1$d video\'s + Bijlage: %1$d video\'s + Bijlage: %1$d video\'s + Bijlage: %1$d video\'s + Bijlage: %1$d geluidsbestanden + Bijlage: 1 geluidsbestand + Bijlage: %1$d geluidsbestanden + Bijlage: %1$d geluidsbestanden + Bijlage: %1$d geluidsbestanden + Bijlage: %1$d geluidsbestanden + Bijlage: %1$d locaties + Bijlage: 1 locatie + Bijlage: %1$d locaties + Bijlage: %1$d locaties + Bijlage: %1$d locaties + Bijlage: %1$d locaties + Bijlage: %1$d contacten + Bijlage: 1 contact + Bijlage: %1$d contacten + Bijlage: %1$d contacten + Bijlage: %1$d contacten + Bijlage: %1$d contacten + Bijlage: %1$d stickers + Bijlage: 1 sticker + Bijlage: %1$d stickers + Bijlage: %1$d stickers + Bijlage: %1$d stickers + Bijlage: %1$d stickers en %1$d anderen en %1$d andere en %1$d anderen diff --git a/TMessagesProj/src/main/res/values-pt-rBR/strings.xml b/TMessagesProj/src/main/res/values-pt-rBR/strings.xml index 4e697f7cb..ca9ad7854 100644 --- a/TMessagesProj/src/main/res/values-pt-rBR/strings.xml +++ b/TMessagesProj/src/main/res/values-pt-rBR/strings.xml @@ -58,6 +58,7 @@ Restaurar Som Em %1$s Desativado + HASHTAGS Nova Lista de Transmissão Digite o nome da lista @@ -302,6 +303,7 @@ Desativar Desativado Desativado + Sons no Chat Senha Alterar Senha @@ -366,6 +368,8 @@ Você tem certeza que deseja apagar esta foto? Você tem certeza que deseja apagar este vídeo? Descartar mudanças? + Limpar histórico de busca? + Limpar Password Change password @@ -486,7 +490,7 @@ Sobrenome inválido Carregando... Você não possui um reprodutor de vídeo, instale um para continuar - Por favor, envie um email para sms@telegram.org e conte-nos sobre seu problema. + Por favor, envie um email para sms@stel.com e conte-nos sobre seu problema. Você não possui um aplicativo que suporte o tipo de arquivo \'%1$s\', por favor instale um para continuar Este usuário ainda não possui Telegram, deseja enviar um convite? Você tem certeza? diff --git a/TMessagesProj/src/main/res/values-pt-rPT/strings.xml b/TMessagesProj/src/main/res/values-pt-rPT/strings.xml index 6e74903b1..941b2c4fb 100644 --- a/TMessagesProj/src/main/res/values-pt-rPT/strings.xml +++ b/TMessagesProj/src/main/res/values-pt-rPT/strings.xml @@ -58,6 +58,7 @@ Restaurar Som Em %1$s Desativado + HASHTAGS Nova Lista de Transmissão Digite o nome da lista @@ -302,6 +303,7 @@ Desativar Desativado Desativado + Sons no Chat Senha Alterar Senha @@ -366,6 +368,8 @@ Você tem certeza que deseja apagar esta foto? Você tem certeza que deseja apagar este vídeo? Descartar mudanças? + Limpar histórico de busca? + Limpar Password Change password @@ -486,7 +490,7 @@ Sobrenome inválido Carregando... Você não possui um reprodutor de vídeo, instale um para continuar - Por favor, envie um email para sms@telegram.org e conte-nos sobre seu problema. + Por favor, envie um email para sms@stel.com e conte-nos sobre seu problema. Você não possui um aplicativo que suporte o tipo de arquivo \'%1$s\', por favor instale um para continuar Este usuário ainda não possui Telegram, deseja enviar um convite? Você tem certeza? diff --git a/TMessagesProj/src/main/res/values/strings.xml b/TMessagesProj/src/main/res/values/strings.xml index 10d21bff7..d4447c425 100644 --- a/TMessagesProj/src/main/res/values/strings.xml +++ b/TMessagesProj/src/main/res/values/strings.xml @@ -58,6 +58,7 @@ Unmute In %1$s Disable + HASHTAGS New Broadcast List Enter list name @@ -302,6 +303,7 @@ Disabled Disabled Off + In-Chat Sounds Passcode Change Passcode @@ -366,6 +368,8 @@ Are you sure you want to delete this photo? Are you sure you want to delete this video? Discard changes? + Clear search history? + Clear Password Change password @@ -486,7 +490,7 @@ Invalid last name Loading... You don\'t have a video player, please install one to continue - Please send an email to sms@telegram.org and tell us about your problem. + Please send an email to sms@stel.com and tell us about your problem. You don\'t have applications that can handle the file type \'%1$s\', please install one to continue This user does not have Telegram yet, send an invitation? Are you sure?