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 a4559eb2c..9c4c66110 100644 Binary files a/TMessagesProj/src/main/res/drawable-hdpi/boxshadow.9.png and b/TMessagesProj/src/main/res/drawable-hdpi/boxshadow.9.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/boxshadow.9.png b/TMessagesProj/src/main/res/drawable-mdpi/boxshadow.9.png index e0ed0f591..c63d9ff95 100644 Binary files a/TMessagesProj/src/main/res/drawable-mdpi/boxshadow.9.png and b/TMessagesProj/src/main/res/drawable-mdpi/boxshadow.9.png differ diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/boxshadow.9.png b/TMessagesProj/src/main/res/drawable-xhdpi/boxshadow.9.png index ac112f7c5..6d5cbad08 100644 Binary files a/TMessagesProj/src/main/res/drawable-xhdpi/boxshadow.9.png and b/TMessagesProj/src/main/res/drawable-xhdpi/boxshadow.9.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/boxshadow.9.png b/TMessagesProj/src/main/res/drawable-xxhdpi/boxshadow.9.png index 25232d9c3..8226d849e 100644 Binary files a/TMessagesProj/src/main/res/drawable-xxhdpi/boxshadow.9.png and b/TMessagesProj/src/main/res/drawable-xxhdpi/boxshadow.9.png differ diff --git a/TMessagesProj/src/main/res/raw/sound_out.wav b/TMessagesProj/src/main/res/raw/sound_out.wav new file mode 100644 index 000000000..aef12c529 Binary files /dev/null and b/TMessagesProj/src/main/res/raw/sound_out.wav differ diff --git a/TMessagesProj/src/main/res/values-ar/strings.xml b/TMessagesProj/src/main/res/values-ar/strings.xml index 0df89c5ec..441433da9 100644 --- a/TMessagesProj/src/main/res/values-ar/strings.xml +++ b/TMessagesProj/src/main/res/values-ar/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-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?