From 8ad87652460e5e091a795ab3a680ebe5dfd3f9a4 Mon Sep 17 00:00:00 2001 From: vivabelarus <74508922+vivabelarus@users.noreply.github.com> Date: Thu, 5 Jun 2025 19:38:11 +0300 Subject: [PATCH 01/27] fix secret group avatar in ChatRemoveCell --- .../ui/RemoveChatsAction/ChatRemoveCell.java | 11 +---------- .../ui/RemoveChatsAction/RemoveChatsFragment.java | 1 - .../RemoveChatsAction/items/EncryptedGroupItem.java | 6 ++++-- .../telegram/ui/RemoveChatsAction/items/Item.java | 13 ++++++++++--- .../ui/RemoveChatsAction/items/SearchItem.java | 6 ++++-- .../ui/RemoveChatsAction/items/UserItem.java | 8 +++++--- 6 files changed, 24 insertions(+), 21 deletions(-) diff --git a/TMessagesProj/src/main/java/org/telegram/ui/RemoveChatsAction/ChatRemoveCell.java b/TMessagesProj/src/main/java/org/telegram/ui/RemoveChatsAction/ChatRemoveCell.java index 344dd75f41b..e82e7ba7260 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/RemoveChatsAction/ChatRemoveCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/RemoveChatsAction/ChatRemoveCell.java @@ -167,16 +167,7 @@ private void updateSizes() { } private void updateAvatar() { - if (item.getAvatarType().isPresent()) { - avatarDrawable.setAvatarType(item.getAvatarType().get()); - avatarImageView.setImage(null, "50_50", avatarDrawable, item.getProfileObject()); - } else if (item.getProfileObject() != null) { - avatarDrawable.setInfo(currentAccount, item.getProfileObject()); - avatarImageView.setForUserOrChat(item.getProfileObject(), avatarDrawable); - } else { - avatarDrawable.setInfo(item.getId(), item.getDisplayName().toString(), ""); - avatarImageView.setForUserOrChat(null, avatarDrawable); - } + item.applyAvatar(avatarImageView, avatarDrawable); } private void updateName() { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/RemoveChatsAction/RemoveChatsFragment.java b/TMessagesProj/src/main/java/org/telegram/ui/RemoveChatsAction/RemoveChatsFragment.java index 8d6ba444950..8cce1712056 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/RemoveChatsAction/RemoveChatsFragment.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/RemoveChatsAction/RemoveChatsFragment.java @@ -40,7 +40,6 @@ import org.telegram.messenger.fakepasscode.FakePasscode; import org.telegram.messenger.fakepasscode.RemoveChatsAction; import org.telegram.messenger.partisan.Utils; -import org.telegram.messenger.partisan.secretgroups.EncryptedGroupUtils; import org.telegram.messenger.support.LongSparseIntArray; import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.ActionBarMenu; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/RemoveChatsAction/items/EncryptedGroupItem.java b/TMessagesProj/src/main/java/org/telegram/ui/RemoveChatsAction/items/EncryptedGroupItem.java index 5c7f025f601..fc49b4ee9f4 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/RemoveChatsAction/items/EncryptedGroupItem.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/RemoveChatsAction/items/EncryptedGroupItem.java @@ -3,8 +3,10 @@ import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.DialogObject; import org.telegram.messenger.partisan.secretgroups.EncryptedGroup; +import org.telegram.messenger.partisan.secretgroups.EncryptedGroupUtils; import org.telegram.tgnet.TLObject; import org.telegram.ui.Components.AvatarDrawable; +import org.telegram.ui.Components.BackupImageView; import java.util.Optional; @@ -50,7 +52,7 @@ public OptionPermission getHidingPermission() { } @Override - public Optional getAvatarType() { - return Optional.of(AvatarDrawable.AVATAR_TYPE_ANONYMOUS); + public void applyAvatar(BackupImageView avatarImageView, AvatarDrawable avatarDrawable) { + EncryptedGroupUtils.applyAvatar(avatarImageView, avatarDrawable, encryptedGroup); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/RemoveChatsAction/items/Item.java b/TMessagesProj/src/main/java/org/telegram/ui/RemoveChatsAction/items/Item.java index c1f25f8cb2c..b144c32a26d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/RemoveChatsAction/items/Item.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/RemoveChatsAction/items/Item.java @@ -1,6 +1,5 @@ package org.telegram.ui.RemoveChatsAction.items; -import org.telegram.messenger.AccountInstance; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.DialogObject; import org.telegram.messenger.LocaleController; @@ -12,6 +11,8 @@ import org.telegram.messenger.partisan.secretgroups.EncryptedGroup; import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; +import org.telegram.ui.Components.AvatarDrawable; +import org.telegram.ui.Components.BackupImageView; import java.util.Optional; import java.util.stream.Collectors; @@ -127,8 +128,14 @@ private boolean nameMatches(String name, String query) { || lowercaseName.contains(" " + lowercaseQuery); } - public Optional getAvatarType() { - return Optional.empty(); + public void applyAvatar(BackupImageView avatarImageView, AvatarDrawable avatarDrawable) { + if (getProfileObject() != null) { + avatarDrawable.setInfo(accountNum, getProfileObject()); + avatarImageView.setForUserOrChat(getProfileObject(), avatarDrawable); + } else { + avatarDrawable.setInfo(getId(), getDisplayName().toString(), ""); + avatarImageView.setForUserOrChat(null, avatarDrawable); + } } public OptionPermission getDeletePermission() { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/RemoveChatsAction/items/SearchItem.java b/TMessagesProj/src/main/java/org/telegram/ui/RemoveChatsAction/items/SearchItem.java index 81b6656fee1..81b75f52750 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/RemoveChatsAction/items/SearchItem.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/RemoveChatsAction/items/SearchItem.java @@ -1,6 +1,8 @@ package org.telegram.ui.RemoveChatsAction.items; import org.telegram.tgnet.TLObject; +import org.telegram.ui.Components.AvatarDrawable; +import org.telegram.ui.Components.BackupImageView; import java.util.Optional; @@ -66,8 +68,8 @@ public CharSequence getStatus() { } @Override - public Optional getAvatarType() { - return innerItem.getAvatarType(); + public void applyAvatar(BackupImageView avatarImageView, AvatarDrawable avatarDrawable) { + innerItem.applyAvatar(avatarImageView, avatarDrawable); } @Override diff --git a/TMessagesProj/src/main/java/org/telegram/ui/RemoveChatsAction/items/UserItem.java b/TMessagesProj/src/main/java/org/telegram/ui/RemoveChatsAction/items/UserItem.java index ff5552af0de..a6c1b535530 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/RemoveChatsAction/items/UserItem.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/RemoveChatsAction/items/UserItem.java @@ -7,6 +7,7 @@ import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; import org.telegram.ui.Components.AvatarDrawable; +import org.telegram.ui.Components.BackupImageView; import java.util.Optional; @@ -73,11 +74,12 @@ private boolean isBlocked() { } @Override - public Optional getAvatarType() { + public void applyAvatar(BackupImageView avatarImageView, AvatarDrawable avatarDrawable) { if (isSelf()) { - return Optional.of(AvatarDrawable.AVATAR_TYPE_SAVED); + avatarDrawable.setAvatarType(AvatarDrawable.AVATAR_TYPE_SAVED); + avatarImageView.setImage(null, "50_50", avatarDrawable, getProfileObject()); } else { - return super.getAvatarType(); + super.applyAvatar(avatarImageView, avatarDrawable); } } } From 6fdfe8f744d8e2f9a350e2edcbddccbbe96effef Mon Sep 17 00:00:00 2001 From: vivabelarus <74508922+vivabelarus@users.noreply.github.com> Date: Thu, 5 Jun 2025 21:12:04 +0300 Subject: [PATCH 02/27] fix secret group profile activity --- .../secretgroups/ui/EncryptedGroupProfileActivity.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/ui/EncryptedGroupProfileActivity.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/ui/EncryptedGroupProfileActivity.java index b8bd70b2eff..62e8ee939e1 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/ui/EncryptedGroupProfileActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/ui/EncryptedGroupProfileActivity.java @@ -165,6 +165,9 @@ private void updateRows() { if (SharedConfig.detailedEncryptedGroupMemberStatus) { statusRow = rowCount++; idRow = rowCount++; + } else { + statusRow = -1; + idRow = -1; } firstMemberRow = rowCount; lastMemberRow = firstMemberRow + encryptedGroup.getInnerChats().size(); From f925778d263da149e2be4be874ed0eb15635b08b Mon Sep 17 00:00:00 2001 From: vivabelarus <74508922+vivabelarus@users.noreply.github.com> Date: Thu, 5 Jun 2025 22:41:30 +0300 Subject: [PATCH 03/27] fix new messages loading in secret group --- .../main/java/org/telegram/ui/ChatActivity.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index 5aced79130e..f8361a48392 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -14068,10 +14068,12 @@ private void checkScrollForLoad(boolean scroll) { waitingForLoad.add(lastLoadIndex); getMessagesController().loadMessages(mergeDialogId, 0, false, 50, getMinMessageId(dialog_id, 1), 0, true, getMaxDate(dialog_id, 1), classGuid, 1, 0, chatMode, threadMessageId, replyMaxReadId, lastLoadIndex++, isTopic); loadingForward = true; - } else if (!getForwardEndReached(dialog_id, 0)) { - waitingForLoad.add(lastLoadIndex); - getMessagesController().loadMessages(dialog_id, mergeDialogId, false, 50, getMinMessageId(dialog_id, 0), 0, true, getMaxDate(dialog_id, 0), classGuid, 1, 0, chatMode, threadMessageId, replyMaxReadId, lastLoadIndex++, isTopic); - loadingForward = true; + } else if (!forwardEndReachedForAll(0)) { + forEachDialogId(dialog_id -> { + waitingForLoad.add(lastLoadIndex); + getMessagesController().loadMessages(dialog_id, mergeDialogId, false, 50, getMinMessageId(dialog_id, 0), 0, true, getMaxDate(dialog_id, 0), classGuid, 1, 0, chatMode, threadMessageId, replyMaxReadId, lastLoadIndex++, isTopic); + loadingForward = true; + }); } } }); @@ -43793,6 +43795,10 @@ public T get(long dialogId, int index) { if (!isEncryptedGroup()) { return singleArray[index]; } else { + if (dialogId == DialogObject.makeEncryptedDialogId(currentEncryptedGroup.getInternalId())) { + T defaultValue = mappingFunction.apply(dialogId)[index]; + return defaultValue; + } initEncryptedGroupMapIfNeeded(); return encryptedGroupMap.computeIfAbsent(dialogId, mappingFunction)[index]; } From efc6262929fab512368a48e6f013503650d11a04 Mon Sep 17 00:00:00 2001 From: vivabelarus <74508922+vivabelarus@users.noreply.github.com> Date: Thu, 5 Jun 2025 23:18:15 +0300 Subject: [PATCH 04/27] createEncryptedMessagesMapToDelete refactoring --- .../java/org/telegram/ui/ChatActivity.java | 55 +++++++++++-------- 1 file changed, 32 insertions(+), 23 deletions(-) diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index f8361a48392..91a0feed1ad 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -30577,38 +30577,47 @@ private Map> createEncryptedMessagesMap if (!isEncryptedGroup()) { return null; } - List srcMessages; + Map> encryptedGroupMessages = new HashMap<>(); + for (MessageObject message : getSrcMessages(finalSelectedObject)) { + for (MessageObject messageCopy : getMessageCopies(message)) { + TLRPC.EncryptedChat encryptedChat = getEncryptedChatByDialogId(messageCopy.getDialogId()); + List dialogMessages = encryptedGroupMessages.computeIfAbsent(encryptedChat, k -> new ArrayList<>()); + dialogMessages.add(messageCopy); + } + } + return encryptedGroupMessages; + } + + private List getSrcMessages(MessageObject finalSelectedObject) { if (finalSelectedObject != null) { - srcMessages = Collections.singletonList(finalSelectedObject); + return Collections.singletonList(finalSelectedObject); } else { - srcMessages = new ArrayList<>(); + ListsrcMessages = new ArrayList<>(); for (int a = 1; a >= 0; a--) { for (int b = 0; b < selectedMessagesIds[a].size(); b++) { srcMessages.add(selectedMessagesIds[a].valueAt(b)); } } + return srcMessages; } - Map> encryptedGroupMessages = new HashMap<>(); - for (MessageObject message : srcMessages) { - List messageCopies; - if (message.isOut()) { - long randomId = message.messageOwner.random_id; - messageCopies = new ArrayList<>(hiddenEncryptedGroupOutMessages.computeIfAbsent(randomId, k -> new ArrayList<>())); - messageCopies.add(message); - } else { - messageCopies = Collections.singletonList(message); - } - for (MessageObject messageCopy : messageCopies) { - long dialogId = messageCopy.getDialogId(); - TLRPC.EncryptedChat encryptedChat = getCurrentEncryptedChatList(false).stream() - .filter(c -> DialogObject.makeEncryptedDialogId(c.id) == dialogId) - .findAny() - .orElse(null); - List dialogMessages = encryptedGroupMessages.computeIfAbsent(encryptedChat, k -> new ArrayList<>()); - dialogMessages.add(messageCopy); - } + } + + private List getMessageCopies(MessageObject message) { + if (message.isOut()) { + long randomId = message.messageOwner.random_id; + List messageCopies = new ArrayList<>(hiddenEncryptedGroupOutMessages.computeIfAbsent(randomId, k -> new ArrayList<>())); + messageCopies.add(message); + return messageCopies; + } else { + return Collections.singletonList(message); } - return encryptedGroupMessages; + } + + private TLRPC.EncryptedChat getEncryptedChatByDialogId(long dialogId) { + if (!DialogObject.isEncryptedDialog(dialogId)) { + return null; + } + return getMessagesController().getEncryptedChat(DialogObject.getEncryptedChatId(dialogId)); } private void forEachMessageCopy(MessageObject message, Consumer action) { From 97ad8d732a2609839a7e28cb2684dd2a579e7102 Mon Sep 17 00:00:00 2001 From: vivabelarus <74508922+vivabelarus@users.noreply.github.com> Date: Fri, 6 Jun 2025 01:11:20 +0300 Subject: [PATCH 05/27] fix deleting message group in secret groups --- .../java/org/telegram/ui/ChatActivity.java | 31 +++++++++++++--- .../telegram/ui/Components/AlertsCreator.java | 36 ++++++++++++++----- .../ui/Components/SharedMediaLayout.java | 2 +- 3 files changed, 55 insertions(+), 14 deletions(-) diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index 91a0feed1ad..61c62f9cc68 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -21115,9 +21115,11 @@ public void didReceivedNotification(int id, int account, final Object... args) { previous = null; for (int i = messages.size() - 1; i >= 0; i--) { MessageObject otherMessage = messages.get(i); - if (otherMessage.getDialogId() == obj.getDialogId() && otherMessage.type != MessageObject.TYPE_DATE) { - previous = otherMessage; - break; + for (MessageObject otherMessageCopy : getMessageCopies(otherMessage)) { + if (otherMessageCopy.getDialogId() == obj.getDialogId() && otherMessageCopy.type != MessageObject.TYPE_DATE) { + previous = otherMessageCopy; + break; + } } } } else { @@ -30570,7 +30572,12 @@ private void createDeleteMessagesAlert(final MessageObject finalSelectedObject, AlertsCreator.createDeleteMessagesAlert(this, currentUser, currentChat, currentEncryptedChatSingle, chatInfo, mergeDialogId, finalSelectedObject, selectedMessagesIds, finalSelectedGroup, (int) getTopicId(), chatMode, null, () -> { hideActionMode(); updatePinnedMessageView(true); - }, hideDimAfter ? () -> dimBehindView(false) : null, themeDelegate, createEncryptedMessagesMapToDelete(finalSelectedObject)); + }, + hideDimAfter ? () -> dimBehindView(false) : null, + themeDelegate, + createEncryptedMessagesMapToDelete(finalSelectedObject), + createEncryptedMessagesGroupMapToDelete(finalSelectedGroup) + ); } private Map> createEncryptedMessagesMapToDelete(MessageObject finalSelectedObject) { @@ -30620,6 +30627,22 @@ private TLRPC.EncryptedChat getEncryptedChatByDialogId(long dialogId) { return getMessagesController().getEncryptedChat(DialogObject.getEncryptedChatId(dialogId)); } + private Map createEncryptedMessagesGroupMapToDelete(MessageObject.GroupedMessages finalSelectedGroup) { + if (!isEncryptedGroup() || finalSelectedGroup == null || finalSelectedGroup.messages.isEmpty()) { + return null; + } + + Map encryptedGroupMessageGroups = new HashMap<>(); + for (MessageObject message : getMessageCopies(finalSelectedGroup.messages.get(0))) { + MessageObject.GroupedMessages messageGroup = getValidGroupedMessage(message); + if (messageGroup != null) { + TLRPC.EncryptedChat encryptedChat = getEncryptedChatByDialogId(message.getDialogId()); + encryptedGroupMessageGroups.put(encryptedChat, messageGroup); + } + } + return encryptedGroupMessageGroups; + } + private void forEachMessageCopy(MessageObject message, Consumer action) { if (isEncryptedGroup() && message.isOut()) { if (hiddenEncryptedGroupOutMessages.containsKey(message.messageOwner.random_id)) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AlertsCreator.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AlertsCreator.java index af043a330b6..644e0bc4517 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AlertsCreator.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AlertsCreator.java @@ -6525,7 +6525,7 @@ public interface PaymentAlertDelegate { void didPressedNewCard(); } - public static void createDeleteMessagesAlert(BaseFragment fragment, TLRPC.User user, TLRPC.Chat chat, TLRPC.EncryptedChat encryptedChat, TLRPC.ChatFull chatInfo, long mergeDialogId, MessageObject selectedMessage, SparseArray[] selectedMessages, MessageObject.GroupedMessages selectedGroup, int topicId, int mode, TLRPC.ChannelParticipant[] channelParticipants, Runnable onDelete, Runnable hideDim, Theme.ResourcesProvider resourcesProvider, Map> encryptedGroupMessages) { + public static void createDeleteMessagesAlert(BaseFragment fragment, TLRPC.User user, TLRPC.Chat chat, TLRPC.EncryptedChat encryptedChat, TLRPC.ChatFull chatInfo, long mergeDialogId, MessageObject selectedMessage, SparseArray[] selectedMessages, MessageObject.GroupedMessages selectedGroup, int topicId, int mode, TLRPC.ChannelParticipant[] channelParticipants, Runnable onDelete, Runnable hideDim, Theme.ResourcesProvider resourcesProvider, Map> encryptedGroupMessages, Map encryptedGroupMessageGroups) { final boolean scheduled = mode == ChatActivity.MODE_SCHEDULED; final boolean isSavedMessages = mode == ChatActivity.MODE_SAVED; final boolean quickReplies = mode == ChatActivity.MODE_QUICK_REPLIES; @@ -6676,7 +6676,7 @@ public static void createDeleteMessagesAlert(BaseFragment fragment, TLRPC.User u } progressDialog[0] = null; - createDeleteMessagesAlert(fragment, user, chat, encryptedChat, chatInfo, mergeDialogId, selectedMessage, selectedMessages, selectedGroup, topicId, mode, channelParticipantsLoad, onDelete, hideDim, resourcesProvider, encryptedGroupMessages); + createDeleteMessagesAlert(fragment, user, chat, encryptedChat, chatInfo, mergeDialogId, selectedMessage, selectedMessages, selectedGroup, topicId, mode, channelParticipantsLoad, onDelete, hideDim, resourcesProvider, encryptedGroupMessages, encryptedGroupMessageGroups); } })); } @@ -6845,19 +6845,37 @@ public static void createDeleteMessagesAlert(BaseFragment fragment, TLRPC.User u }; AlertDialog.OnButtonClickListener encryptedGroupDeleteAction = (dialogInterface, i) -> { + for (Map.Entry> dialogEntry : encryptedGroupMessages.entrySet()) { TLRPC.EncryptedChat currentEncryptedChat = dialogEntry.getKey(); List messages = dialogEntry.getValue(); - ArrayList ids = messages.stream() - .map(MessageObject::getId) - .collect(toCollection(ArrayList::new)); - ArrayList random_ids = messages.stream() - .filter(m -> m.messageOwner.random_id != 0 && m.type != 10) - .map(m -> m.messageOwner.random_id) - .collect(toCollection(ArrayList::new)); + MessageObject.GroupedMessages messageGroup = encryptedGroupMessageGroups != null ? encryptedGroupMessageGroups.get(currentEncryptedChat) : null; + ArrayList ids = new ArrayList<>(); + ArrayList random_ids = null; + if (messageGroup != null) { + for (int a = 0; a < messageGroup.messages.size(); a++) { + MessageObject messageObject = messageGroup.messages.get(a); + ids.add(messageObject.getId()); + if (messageObject.messageOwner.random_id != 0 && messageObject.type != 10) { + if (random_ids == null) { + random_ids = new ArrayList<>(); + } + random_ids.add(messageObject.messageOwner.random_id); + } + } + } else { + messages.stream() + .map(MessageObject::getId) + .forEach(ids::add); + random_ids = messages.stream() + .filter(m -> m.messageOwner.random_id != 0 && m.type != 10) + .map(m -> m.messageOwner.random_id) + .collect(toCollection(ArrayList::new)); + } MessagesController.getInstance(currentAccount).deleteMessages(ids, random_ids, currentEncryptedChat, DialogObject.makeEncryptedDialogId(currentEncryptedChat.id), topicId, deleteForAll[0], mode); } + if (onDelete != null) { onDelete.run(); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/SharedMediaLayout.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/SharedMediaLayout.java index 40440fb704e..4abeb07f31a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/SharedMediaLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SharedMediaLayout.java @@ -4617,7 +4617,7 @@ public void onActionBarItemClick(View v, int id) { showActionMode(false); actionBar.closeSearchField(); cantDeleteMessagesCount = 0; - }, null, resourcesProvider, null); + }, null, resourcesProvider, null, null); } else if (id == forward) { if (info != null) { TLRPC.Chat chat = profileActivity.getMessagesController().getChat(info.id); From bb7e6afb4a3c51743e14d1b27251db492021e768 Mon Sep 17 00:00:00 2001 From: vivabelarus <74508922+vivabelarus@users.noreply.github.com> Date: Fri, 6 Jun 2025 09:08:17 +0300 Subject: [PATCH 06/27] fix deleting recently sent messages --- TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index 61c62f9cc68..926769b651c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -25623,7 +25623,7 @@ private void processNewMessages(ArrayList arr, final boolean anim obj.stableId = lastStableId++; getMessagesController().getTranslateController().checkTranslation(obj, false); if (!addMessage(placeToPaste, obj)) { - return; + continue; } if (placeToPaste == 0 && !obj.isSponsored()) { needMoveScrollToLastMessage = true; From 1e6b94a33f0cf5d9a38e1a8442f019b6b803c423 Mon Sep 17 00:00:00 2001 From: vivabelarus <74508922+vivabelarus@users.noreply.github.com> Date: Fri, 6 Jun 2025 09:28:19 +0300 Subject: [PATCH 07/27] fix toggling sound in secret groups if inner chats have different values --- TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index 926769b651c..7176419c053 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -4292,9 +4292,13 @@ public void dismiss() { @Override public void toggleSound() { + boolean wasEnabled = !getMessagesController().isDialogMuted(dialog_id, getTopicId()); forEachDialogId(dialog_id -> { SharedPreferences preferences = MessagesController.getNotificationsSettings(currentAccount); boolean enabled = !preferences.getBoolean("sound_enabled_" + NotificationsController.getSharedPrefKey(dialog_id, getTopicId()), true); + if (isEncryptedGroup()) { + enabled = !wasEnabled; + } preferences.edit().putBoolean("sound_enabled_" + NotificationsController.getSharedPrefKey(dialog_id, getTopicId()), enabled).apply(); if (BulletinFactory.canShowBulletin(ChatActivity.this)) { BulletinFactory.createSoundEnabledBulletin(ChatActivity.this, enabled ? NotificationsController.SETTING_SOUND_ON : NotificationsController.SETTING_SOUND_OFF, getResourceProvider()).show(); From 0cfab40b3b3b6ddca600c4409dd9ddf3f23dc465 Mon Sep 17 00:00:00 2001 From: vivabelarus <74508922+vivabelarus@users.noreply.github.com> Date: Fri, 6 Jun 2025 12:15:30 +0300 Subject: [PATCH 08/27] fix secret groups unread counter in folders when fake passcode activated --- .../main/java/org/telegram/messenger/MessagesStorage.java | 8 +++++--- .../main/java/org/telegram/messenger/SharedConfig.java | 1 + .../org/telegram/messenger/fakepasscode/FakePasscode.java | 2 +- .../messenger/fakepasscode/RemoveChatsAction.java | 5 +---- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java index 42072939d49..2bd099300f8 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesStorage.java @@ -1291,7 +1291,7 @@ public void updateMutedDialogsFiltersCounters() { storageQueue.postRunnable(() -> resetAllUnreadCounters(true)); } - public void removeChatsActionExecuted() { + public void unreadCounterChangedByFakePasscode() { for (int a = 0, N = dialogFilters.size(); a < N; a++) { MessagesController.DialogFilter filter = dialogFilters.get(a); filter.pendingUnreadCount = -1; @@ -2855,7 +2855,8 @@ private void calcUnreadCounters(boolean apply) { if (!encryptedGroupsToLoad.isEmpty()) { List encryptedGroups = getEncryptedGroupsInternal(encryptedGroupsToLoad); for (EncryptedGroup encryptedGroup : encryptedGroups) { - if (FakePasscodeUtils.isHideChat(DialogObject.makeEncryptedDialogId(encryptedGroup.getInternalId()), currentAccount)) { + if (FakePasscodeUtils.isHideChat(DialogObject.makeEncryptedDialogId(encryptedGroup.getInternalId()), currentAccount) + || FakePasscodeUtils.isFakePasscodeActivated()) { continue; } long did = DialogObject.makeEncryptedDialogId(encryptedGroup.getInternalId()); @@ -5947,7 +5948,8 @@ private void updateFiltersReadCounter(LongSparseIntArray dialogsToUpdate, LongSp if (!encryptedGroupsToLoad.isEmpty()) { List encryptedGroups = getEncryptedGroupsInternal(encryptedGroupsToLoad); for (EncryptedGroup encryptedGroup : encryptedGroups) { - if (FakePasscodeUtils.isHideChat(DialogObject.makeEncryptedDialogId(encryptedGroup.getInternalId()), currentAccount)) { + if (FakePasscodeUtils.isHideChat(DialogObject.makeEncryptedDialogId(encryptedGroup.getInternalId()), currentAccount) + || FakePasscodeUtils.isFakePasscodeActivated()) { continue; } long did = DialogObject.makeEncryptedDialogId(encryptedGroup.getInternalId()); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/SharedConfig.java b/TMessagesProj/src/main/java/org/telegram/messenger/SharedConfig.java index 03875dbb364..2e3dff285bd 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/SharedConfig.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/SharedConfig.java @@ -1219,6 +1219,7 @@ public static void fakePasscodeActivated(int fakePasscodeIndex) { if (!overriddenDialogIds.isEmpty()) { MessagesStorage.getInstance(i).updateOverriddenWidgets(overriddenDialogIds); } + MessagesStorage.getInstance(i).unreadCounterChangedByFakePasscode(); } } FakePasscode passcode = FakePasscodeUtils.getActivatedFakePasscode(); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/fakepasscode/FakePasscode.java b/TMessagesProj/src/main/java/org/telegram/messenger/fakepasscode/FakePasscode.java index a7fa4840cff..8c951b41b65 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/fakepasscode/FakePasscode.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/fakepasscode/FakePasscode.java @@ -191,7 +191,7 @@ public void deactivate() { } NotificationCenter notificationCenter = NotificationCenter.getInstance(account); if (!removeResult.hiddenChatEntries.isEmpty()) { - MessagesStorage.getInstance(account).removeChatsActionExecuted(); + MessagesStorage.getInstance(account).unreadCounterChangedByFakePasscode(); notificationCenter.postNotificationName(NotificationCenter.dialogsHidingChanged); } if (!removeResult.hiddenFolders.isEmpty()) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/fakepasscode/RemoveChatsAction.java b/TMessagesProj/src/main/java/org/telegram/messenger/fakepasscode/RemoveChatsAction.java index 891cda8936a..3ffd80af106 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/fakepasscode/RemoveChatsAction.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/fakepasscode/RemoveChatsAction.java @@ -3,18 +3,15 @@ import static org.telegram.messenger.MessagesController.DIALOG_FILTER_FLAG_ALL_CHATS; import static org.telegram.messenger.MessagesController.DIALOG_FILTER_FLAG_EXCLUDE_MUTED; import static org.telegram.messenger.MessagesController.DIALOG_FILTER_FLAG_EXCLUDE_READ; -import static org.telegram.messenger.MessagesController.showCantOpenAlert; import com.fasterxml.jackson.annotation.JsonIgnore; import com.google.android.exoplayer2.util.Log; -import org.telegram.messenger.AccountInstance; import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.BuildConfig; import org.telegram.messenger.ChatObject; import org.telegram.messenger.DialogObject; import org.telegram.messenger.MessagesController; -import org.telegram.messenger.MessagesStorage; import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.SharedConfig; import org.telegram.messenger.Utilities; @@ -214,7 +211,7 @@ public synchronized void execute(FakePasscode fakePasscode) { } unpinHiddenDialogs(); SharedConfig.saveConfig(); - getMessagesStorage().removeChatsActionExecuted(); + getMessagesStorage().unreadCounterChangedByFakePasscode(); postNotifications(foldersCleared); LongSparseIntArray dialogsToUpdate = new LongSparseIntArray(hiddenChatEntries.size()); hiddenChatEntries.stream().forEach(entry -> dialogsToUpdate.put(entry.chatId, 0)); From e785e30bc06ac1eff27da701d10f20ed0159bf9a Mon Sep 17 00:00:00 2001 From: vivabelarus <74508922+vivabelarus@users.noreply.github.com> Date: Fri, 6 Jun 2025 14:27:40 +0300 Subject: [PATCH 09/27] fix crash --- .../main/java/org/telegram/ui/Components/AvatarDrawable.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarDrawable.java index 01d5484daf4..0b279f90d92 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarDrawable.java @@ -150,7 +150,7 @@ public AvatarDrawable(TLRPC.User user, boolean profile) { } public AvatarDrawable(TLRPC.User user, boolean profile, int accountNum) { - this(user, profile, UserConfig.getChatTitleOverride(accountNum, user.id)); + this(user, profile, user != null ? UserConfig.getChatTitleOverride(accountNum, user.id) : null); } public AvatarDrawable(TLRPC.User user, boolean profile, String titleOverride) { From 7241c3301771b4c64bcf5beecdd35713be788bcc Mon Sep 17 00:00:00 2001 From: vivabelarus <74508922+vivabelarus@users.noreply.github.com> Date: Fri, 6 Jun 2025 14:39:08 +0300 Subject: [PATCH 10/27] fix toggling sound in secret groups if inner chats have different values --- TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index 7176419c053..d3305888289 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -4292,7 +4292,7 @@ public void dismiss() { @Override public void toggleSound() { - boolean wasEnabled = !getMessagesController().isDialogMuted(dialog_id, getTopicId()); + boolean wasEnabled = !getMessagesController().isDialogNotificationsSoundEnabled(dialog_id, getTopicId()); forEachDialogId(dialog_id -> { SharedPreferences preferences = MessagesController.getNotificationsSettings(currentAccount); boolean enabled = !preferences.getBoolean("sound_enabled_" + NotificationsController.getSharedPrefKey(dialog_id, getTopicId()), true); From c9f57b17935e1a6d3880ed707bf1456e9646583e Mon Sep 17 00:00:00 2001 From: vivabelarus <74508922+vivabelarus@users.noreply.github.com> Date: Fri, 6 Jun 2025 15:43:24 +0300 Subject: [PATCH 11/27] synchronize notification settings for new secret group members --- .../EncryptedGroupServiceMessagesHandler.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/EncryptedGroupServiceMessagesHandler.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/EncryptedGroupServiceMessagesHandler.java index 1f06fcabb1b..87e1162066b 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/EncryptedGroupServiceMessagesHandler.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/EncryptedGroupServiceMessagesHandler.java @@ -7,6 +7,7 @@ import static org.telegram.messenger.partisan.secretgroups.EncryptedGroupState.WAITING_CONFIRMATION_FROM_OWNER; import static org.telegram.messenger.partisan.secretgroups.EncryptedGroupState.WAITING_SECONDARY_CHAT_CREATION; +import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.BitmapFactory; @@ -14,6 +15,7 @@ import org.telegram.messenger.DialogObject; import org.telegram.messenger.MessagesController; import org.telegram.messenger.NotificationCenter; +import org.telegram.messenger.NotificationsController; import org.telegram.messenger.Utilities; import org.telegram.messenger.fakepasscode.FakePasscodeUtils; import org.telegram.messenger.partisan.AccountControllersProvider; @@ -40,8 +42,10 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.prefs.Preferences; import java.util.stream.Collectors; public class EncryptedGroupServiceMessagesHandler implements AccountControllersProvider { @@ -326,6 +330,7 @@ private TLRPC.Message handleConfirmNewMemberJoinAction(ConfirmJoinAction action) getEncryptedGroupProtocol().sendNewAvatar(encryptedGroup, encryptedChat); } syncNewInnerChatTtl(); + syncNewInnerChatNotificationSettings(); AndroidUtilities.runOnUIThread(() -> { getNotificationCenter().postNotificationName(NotificationCenter.dialogsNeedReload); getNotificationCenter().postNotificationName(NotificationCenter.encryptedGroupUpdated, encryptedGroup); @@ -348,6 +353,42 @@ private void syncNewInnerChatTtl() { ); } + private void syncNewInnerChatNotificationSettings() { + Long otherDialogId = encryptedGroup.getInnerEncryptedChatIds(false).stream() + .filter(id -> id != encryptedChat.id) + .map(DialogObject::makeEncryptedDialogId) + .findFirst() + .orElse(null); + if (otherDialogId == null) { + return; + } + syncNotificationSetting("notify2_", otherDialogId); + syncNotificationSetting("notifyuntil_", otherDialogId); + syncNotificationSetting("sound_enabled_", otherDialogId); + } + + private void syncNotificationSetting(String settingsTypeKey, long sourceDialogId) { + String sourceKey = makeNotificationSettingsKey(settingsTypeKey, sourceDialogId); + String destinationKey = makeNotificationSettingsKey(settingsTypeKey, DialogObject.makeEncryptedDialogId(encryptedChat.id)); + SharedPreferences preferences = MessagesController.getNotificationsSettings(accountNum); + if (!preferences.contains(sourceKey)) { + return; + } + Map allValues = preferences.getAll(); + Object value = allValues.get(sourceKey); + SharedPreferences.Editor editor = preferences.edit(); + if (value instanceof Integer) { + editor.putInt(destinationKey, (int)value); + } else if (value instanceof Boolean) { + editor.putBoolean(destinationKey, (boolean)value); + } + editor.apply(); + } + + private static String makeNotificationSettingsKey(String settingsTypeKey, long dialogId) { + return settingsTypeKey + NotificationsController.getSharedPrefKey(dialogId, 0); + } + @Handler(conditions = {HandlerCondition.GROUP_EXISTS, HandlerCondition.ACTION_FROM_OWNER}, groupStates = WAITING_CONFIRMATION_FROM_OWNER) private TLRPC.Message handleConfirmGroupInitialization(ConfirmGroupInitializationAction action) { encryptedGroup.setState(WAITING_SECONDARY_CHAT_CREATION); @@ -378,6 +419,7 @@ private TLRPC.Message handleStartSecondaryChat(StartSecondaryInnerChatAction act getNotificationCenter().postNotificationName(NotificationCenter.encryptedGroupUpdated, encryptedGroup); }); syncNewInnerChatTtl(); + syncNewInnerChatNotificationSettings(); return null; } From f92dfdbe4ca4a64ea4f0d9ad0323249590ea5e67 Mon Sep 17 00:00:00 2001 From: vivabelarus <74508922+vivabelarus@users.noreply.github.com> Date: Fri, 6 Jun 2025 16:01:17 +0300 Subject: [PATCH 12/27] fix retry sending message to secret group --- .../src/main/java/org/telegram/ui/ChatActivity.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index d3305888289..e27841ef7ce 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -33594,10 +33594,12 @@ private void processSelectedOption(int option) { moveScrollToLastMessage(false); } } else { - if (getSendMessagesHelper().retrySendMessage(object, false, payStars)) { - updateVisibleRows(); - if (chatMode == 0) { - moveScrollToLastMessage(false); + for (MessageObject objectCopy : getMessageCopies(object)) { + if (getSendMessagesHelper().retrySendMessage(objectCopy, false, payStars)) { + updateVisibleRows(); + if (chatMode == 0) { + moveScrollToLastMessage(false); + } } } } From 1ebe51b0679202177180eee93467c1a6900e26b8 Mon Sep 17 00:00:00 2001 From: vivabelarus <74508922+vivabelarus@users.noreply.github.com> Date: Fri, 6 Jun 2025 16:11:57 +0300 Subject: [PATCH 13/27] Update to 1620 --- .github/workflows/alpha.yml | 2 +- .../java/org/telegram/messenger/partisan/PartisanVersion.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/alpha.yml b/.github/workflows/alpha.yml index e7150675246..b8785493ffc 100644 --- a/.github/workflows/alpha.yml +++ b/.github/workflows/alpha.yml @@ -18,7 +18,7 @@ jobs: - name: Save artifact uses: actions/upload-artifact@master with: - name: PTelegramAlpha-1619.apk + name: PTelegramAlpha-1620.apk path: TMessagesProj/build/outputs/apk/afat/alpha/app.apk - name: Create cleanup request run: touch delete_request diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/PartisanVersion.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/PartisanVersion.java index 08da85fdf3a..4a2280756ea 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/PartisanVersion.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/PartisanVersion.java @@ -2,5 +2,5 @@ public class PartisanVersion { public static final String PARTISAN_VERSION_STRING = "4.2.0"; - public static int PARTISAN_BUILD_VERSION = 1619; + public static int PARTISAN_BUILD_VERSION = 1620; } From 2ada8f73abddea0cc7c66bdded9c7d7c46e47798 Mon Sep 17 00:00:00 2001 From: vivabelarus <74508922+vivabelarus@users.noreply.github.com> Date: Fri, 6 Jun 2025 19:02:41 +0300 Subject: [PATCH 14/27] fix crash --- .../main/java/org/telegram/ui/Components/AvatarDrawable.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarDrawable.java index 0b279f90d92..b09f210b99c 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarDrawable.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarDrawable.java @@ -177,7 +177,7 @@ public void setDrawAvatarBackground(boolean drawAvatarBackground) { } public AvatarDrawable(TLRPC.Chat chat, boolean profile, int accountNum) { - this(chat, profile, UserConfig.getChatTitleOverride(accountNum, chat)); + this(chat, profile, chat != null ? UserConfig.getChatTitleOverride(accountNum, chat) : null); } public AvatarDrawable(TLRPC.Chat chat, boolean profile, String titleOverride) { From 64873fb9bb95cd15a7e6ad7593f66eb7207cdb78 Mon Sep 17 00:00:00 2001 From: vivabelarus <74508922+vivabelarus@users.noreply.github.com> Date: Fri, 6 Jun 2025 23:00:40 +0300 Subject: [PATCH 15/27] use incognito keyboard in secret groups --- .../java/org/telegram/ui/Components/ChatActivityEnterView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 794d7e37ea0..cad043a1963 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterView.java @@ -5156,7 +5156,7 @@ protected void onAttachedToWindow() { TLRPC.EncryptedChat encryptedChat = parentFragment != null ? parentFragment.getCurrentEncryptedChatSingle() : null; messageEditText.setAllowTextEntitiesIntersection(supportsSendingNewEntities()); int flags = EditorInfo.IME_FLAG_NO_EXTRACT_UI; - if (isKeyboardSupportIncognitoMode() && encryptedChat != null) { + if (isKeyboardSupportIncognitoMode() && (encryptedChat != null || getParentFragment() != null && getParentFragment().isEncryptedGroup())) { flags |= EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING; } messageEditText.setIncludeFontPadding(false); From aa275899de9d308fa46e29cecd6c29ce15b39e12 Mon Sep 17 00:00:00 2001 From: vivabelarus <74508922+vivabelarus@users.noreply.github.com> Date: Fri, 6 Jun 2025 23:09:26 +0300 Subject: [PATCH 16/27] fix toggling sound in secret groups --- .../src/main/java/org/telegram/ui/ChatActivity.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index e27841ef7ce..bfb59f636d6 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -4292,7 +4292,10 @@ public void dismiss() { @Override public void toggleSound() { - boolean wasEnabled = !getMessagesController().isDialogNotificationsSoundEnabled(dialog_id, getTopicId()); + boolean wasEnabled = isEncryptedGroup() + ? currentEncryptedGroup.getInnerEncryptedChatDialogIds().stream() + .anyMatch(innerDialogId -> getMessagesController().isDialogNotificationsSoundEnabled(innerDialogId, getTopicId())) + : false; forEachDialogId(dialog_id -> { SharedPreferences preferences = MessagesController.getNotificationsSettings(currentAccount); boolean enabled = !preferences.getBoolean("sound_enabled_" + NotificationsController.getSharedPrefKey(dialog_id, getTopicId()), true); From 060e6fc27e1442cc6ae135fcbc5cabf1f71e25dc Mon Sep 17 00:00:00 2001 From: vivabelarus <74508922+vivabelarus@users.noreply.github.com> Date: Sat, 7 Jun 2025 12:26:42 +0300 Subject: [PATCH 17/27] refactoring --- .../messenger/MessagesController.java | 5 +- .../messenger/NotificationsController.java | 2 +- .../telegram/messenger/SecretChatHelper.java | 2 +- .../messenger/fakepasscode/FakePasscode.java | 35 ++++++-------- .../EncryptedGroupChatUpdateHandler.java | 3 +- .../EncryptedGroupInnerChatStarter.java | 34 +++++++------- .../secretgroups/EncryptedGroupProtocol.java | 46 +++++++++++-------- .../EncryptedGroupServiceMessagesHandler.java | 26 ++++------- .../secretgroups/EncryptedGroupUtils.java | 39 ++++++++-------- .../action/AbstractCreateGroupAction.java | 8 +++- .../action/ExternalGroupIdProvider.java | 5 +- .../action/StartSecondaryInnerChatAction.java | 8 +++- .../java/org/telegram/ui/ChatActivity.java | 12 ++--- .../ui/Components/SharedMediaLayout.java | 3 +- .../java/org/telegram/ui/DialogsActivity.java | 3 +- .../java/org/telegram/ui/LaunchActivity.java | 4 +- 16 files changed, 117 insertions(+), 118 deletions(-) diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java index 6d226c0bda3..97ce3b2e90e 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java @@ -60,7 +60,6 @@ import org.telegram.messenger.browser.Browser; import org.telegram.messenger.partisan.messageinterception.PartisanMessagesInterceptionController; import org.telegram.messenger.partisan.secretgroups.EncryptedGroup; -import org.telegram.messenger.partisan.secretgroups.InnerEncryptedChat; import org.telegram.messenger.support.LongSparseIntArray; import org.telegram.messenger.support.LongSparseLongArray; import org.telegram.messenger.voip.VoIPPreNotificationService; @@ -14130,7 +14129,7 @@ public void markMessageAsRead(long dialogId, long randomId, int ttl) { if (!DialogObject.isEncryptedDialog(dialogId)) { return; } - if (getEncryptedGroupUtils().doForEachInnerDialogIdIfNeeded(dialogId, innerDialogId -> markMessageAsRead(innerDialogId, randomId, ttl))) { + if (getEncryptedGroupUtils().forEachInnerDialogIdIfEncryptedGroup(dialogId, innerDialogId -> markMessageAsRead(innerDialogId, randomId, ttl))) { return; } TLRPC.EncryptedChat chat = getEncryptedChat(DialogObject.getEncryptedChatId(dialogId)); @@ -14263,7 +14262,7 @@ public void markMentionsAsRead(long dialogId, long topicId) { } public void markDialogAsRead(long dialogId, int maxPositiveId, int maxNegativeId, int maxDate, boolean popup, long threadId, int countDiff, boolean readNow, int scheduledCount) { - getEncryptedGroupUtils().doForEachInnerDialogIdIfNeeded(dialogId, innerDialogId -> + getEncryptedGroupUtils().forEachInnerDialogIdIfEncryptedGroup(dialogId, innerDialogId -> markDialogAsRead(innerDialogId, maxPositiveId, maxNegativeId, maxDate, popup, threadId, countDiff, readNow, scheduledCount) ); boolean createReadTask; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java index 3002d42032f..eb3cfbf8420 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/NotificationsController.java @@ -6325,7 +6325,7 @@ private int getNotHiddenAccountNum() { } private boolean doForEachInnerDialogIdIfNeeded(long encryptedGroupDialogId, Consumer action) { - return getEncryptedGroupUtils().doForEachInnerDialogIdIfNeeded(encryptedGroupDialogId, action); + return getEncryptedGroupUtils().forEachInnerDialogIdIfEncryptedGroup(encryptedGroupDialogId, action); } private String getTitle(TLRPC.Chat chat) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/SecretChatHelper.java b/TMessagesProj/src/main/java/org/telegram/messenger/SecretChatHelper.java index 704329ad039..b0474583137 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/SecretChatHelper.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/SecretChatHelper.java @@ -1124,7 +1124,7 @@ public TLRPC.Message processDecryptedObject(TLRPC.EncryptedChat chat, TLRPC.Encr chat.ttl = serviceMessage.action.ttl_seconds; newMessage.action.encryptedAction = serviceMessage.action; getMessagesStorage().updateEncryptedChatTTL(chat); - getEncryptedGroupUtils().syncTtlIfNeeded(chat); + getEncryptedGroupUtils().syncTtlWithOtherMembersIfNeeded(chat); } else { newMessage.action = new TLRPC.TL_messageEncryptedAction(); newMessage.action.encryptedAction = serviceMessage.action; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/fakepasscode/FakePasscode.java b/TMessagesProj/src/main/java/org/telegram/messenger/fakepasscode/FakePasscode.java index 8c951b41b65..367822a37a4 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/fakepasscode/FakePasscode.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/fakepasscode/FakePasscode.java @@ -3,12 +3,10 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import com.google.android.exoplayer2.util.Log; import com.google.common.collect.Lists; import org.telegram.messenger.AccountInstance; import org.telegram.messenger.AndroidUtilities; -import org.telegram.messenger.BuildConfig; import org.telegram.messenger.FileLog; import org.telegram.messenger.LocaleController; import org.telegram.messenger.MediaDataController; @@ -20,6 +18,7 @@ import org.telegram.messenger.Utilities; import org.telegram.messenger.fakepasscode.results.ActionsResult; import org.telegram.messenger.fakepasscode.results.RemoveChatsResult; +import org.telegram.messenger.partisan.PartisanLog; import org.telegram.messenger.partisan.Utils; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLRPC; @@ -94,8 +93,7 @@ private static String generatePasscodeName() { return base + " " + (SharedConfig.fakePasscodeIndex); } - List actions() - { + private List getAllActions() { List result = new ArrayList<>(Arrays.asList(clearCacheAction, clearDownloadsAction, smsAction)); result.addAll(accountActions); result.add(clearProxiesAction); @@ -106,7 +104,7 @@ List actions() public AccountActions getAccountActions(int accountNum) { for (AccountActions actions : accountActions) { Integer actionsAccountNum = actions.getAccountNum(); - if (actionsAccountNum != null && actionsAccountNum == accountNum) { + if (Objects.equals(actionsAccountNum, accountNum)) { return actions; } } @@ -114,15 +112,12 @@ public AccountActions getAccountActions(int accountNum) { } public AccountActions getOrCreateAccountActions(int accountNum) { - for (AccountActions actions : accountActions) { - Integer actionsAccountNum = actions.getAccountNum(); - if (actionsAccountNum != null && actionsAccountNum == accountNum) { - return actions; - } + AccountActions actions = getAccountActions(accountNum); + if (actions == null) { + actions = new AccountActions(); + actions.setAccountNum(accountNum); + accountActions.add(actions); } - AccountActions actions = new AccountActions(); - actions.setAccountNum(accountNum); - accountActions.add(actions); return actions; } @@ -151,18 +146,16 @@ public void executeActions() { actionsResult.setActivated(); SharedConfig.fakePasscodeActionsResult = actionsResult; SharedConfig.saveConfig(); - for (Action action : actions()) { + for (Action action : getAllActions()) { action.setExecutionScheduled(); } Utils.runOnUIThreadAsSoonAsPossible(() -> { activated = true; - for (Action action : actions()) { + for (Action action : getAllActions()) { try { action.execute(this); } catch (Exception e) { - if (BuildConfig.DEBUG) { - Log.e("FakePasscode", "Error", e); - } + PartisanLog.e("FakePasscode error", e); } } checkClearAfterActivation(); @@ -249,7 +242,7 @@ public void migrate() { deletePasscodesAfterActivation.setSelected(Collections.emptyList()); } deleteOtherPasscodesAfterActivation = null; - actions().stream().forEach(Action::migrate); + getAllActions().stream().forEach(Action::migrate); if (actionsResult != null) { actionsResult.migrate(); } @@ -285,12 +278,12 @@ public int getHideAccountCount() { } private int getMaxAccountCount() { - return hasNotHiddenPremium() + return hasAnyPremiumAccountThatWillNotBeHidden() ? UserConfig.FAKE_PASSCODE_MAX_PREMIUM_ACCOUNT_COUNT : UserConfig.FAKE_PASSCODE_MAX_ACCOUNT_COUNT; } - private boolean hasNotHiddenPremium() { + private boolean hasAnyPremiumAccountThatWillNotBeHidden() { for (int a = 0; a < UserConfig.MAX_ACCOUNT_COUNT; a++) { UserConfig userConfig = UserConfig.getInstance(a); if (userConfig.isPremium() && (getAccountActions(a) == null || !getAccountActions(a).isLogOutOrHideAccount())) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/EncryptedGroupChatUpdateHandler.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/EncryptedGroupChatUpdateHandler.java index d8ec9cd8bcf..e4a2d9839ab 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/EncryptedGroupChatUpdateHandler.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/EncryptedGroupChatUpdateHandler.java @@ -3,7 +3,6 @@ import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.NotificationCenter; import org.telegram.messenger.SendMessagesHelper; -import org.telegram.messenger.SharedConfig; import org.telegram.messenger.partisan.AccountControllersProvider; import org.telegram.tgnet.TLRPC; @@ -83,7 +82,7 @@ private void onSecondaryChatCreated(EncryptedGroup encryptedGroup, InnerEncrypte getEncryptedGroupProtocol().sendSecondaryInnerChatInvitation(encryptedChat, encryptedGroup.getExternalId()); innerChat.setState(InnerEncryptedChatState.INITIALIZED); getMessagesStorage().updateEncryptedGroupInnerChat(encryptedGroup.getInternalId(), innerChat); - getEncryptedGroupUtils().checkAllEncryptedChatsCreated(encryptedGroup); + getEncryptedGroupUtils().finalizeEncryptedGroupIfAllChatsCreated(encryptedGroup); } private void handleEncryptedChatDiscarded(EncryptedGroup encryptedGroup, TLRPC.EncryptedChat encryptedChat) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/EncryptedGroupInnerChatStarter.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/EncryptedGroupInnerChatStarter.java index b2cb6111267..c6880721070 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/EncryptedGroupInnerChatStarter.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/EncryptedGroupInnerChatStarter.java @@ -53,7 +53,7 @@ private synchronized void startNextInnerChatIfNeeded() { if (floodWaitUntil > 0 && floodWaitUntil > SystemClock.elapsedRealtime()) { return; } - Pair pair = getNextUninitializedInnerChat(); + Pair pair = findNextInnerChatToInitialize(); if (pair != null) { InnerEncryptedChat uninitializedInnerChat = pair.first; EncryptedGroup encryptedGroup = pair.second; @@ -69,7 +69,7 @@ private synchronized void startNextInnerChatIfNeeded() { } } - private Pair getNextUninitializedInnerChat() { + private Pair findNextInnerChatToInitialize() { Pair uninitializedInnerChat = getNextSecondaryChat(); if (uninitializedInnerChat == null) { uninitializedInnerChat = getNextPrimaryChat(); @@ -129,21 +129,23 @@ public SecretChatStartDelegate(EncryptedGroup encryptedGroup) { @Override public void onComplete(TLRPC.EncryptedChat encryptedChat) { - if (encryptedChat != null) { - InnerEncryptedChat innerChat = encryptedGroup.getInnerChatByUserId(encryptedChat.user_id); - innerChat.setEncryptedChatId(encryptedChat.id); - if (encryptedGroup.isInState(CREATING_ENCRYPTED_CHATS)) { - onPrimaryChatStarted(innerChat); - } else if (encryptedGroup.isInState(WAITING_SECONDARY_CHAT_CREATION, NEW_MEMBER_WAITING_SECONDARY_CHAT_CREATION)) { - onSecondaryChatStarted(innerChat); - } else { - onMemberAdded(innerChat); - } + if (encryptedChat == null) { + currentDelegate = null; + return; + } + InnerEncryptedChat innerChat = encryptedGroup.getInnerChatByUserId(encryptedChat.user_id); + innerChat.setEncryptedChatId(encryptedChat.id); + if (encryptedGroup.isInState(CREATING_ENCRYPTED_CHATS)) { + handlePrimaryChatStarted(innerChat); + } else if (encryptedGroup.isInState(WAITING_SECONDARY_CHAT_CREATION, NEW_MEMBER_WAITING_SECONDARY_CHAT_CREATION)) { + handleSecondaryChatStarted(innerChat); + } else { + handleNewMemberChatStarted(innerChat); } currentDelegate = null; } - private void onPrimaryChatStarted(InnerEncryptedChat innerChat) { + private void handlePrimaryChatStarted(InnerEncryptedChat innerChat) { log(encryptedGroup, "A primary inner chat with a user started."); innerChat.setState(InnerEncryptedChatState.NEED_SEND_INVITATION); getMessagesStorage().updateEncryptedGroupInnerChat(encryptedGroup.getInternalId(), innerChat); @@ -157,15 +159,15 @@ private void onPrimaryChatStarted(InnerEncryptedChat innerChat) { } } - private void onSecondaryChatStarted(InnerEncryptedChat innerChat) { + private void handleSecondaryChatStarted(InnerEncryptedChat innerChat) { log(encryptedGroup, "A secondary inner chat with a user started."); innerChat.setState(InnerEncryptedChatState.NEED_SEND_SECONDARY_INVITATION); getMessagesStorage().updateEncryptedGroupInnerChat(encryptedGroup.getInternalId(), innerChat); - getEncryptedGroupUtils().checkAllEncryptedChatsCreated(encryptedGroup); + getEncryptedGroupUtils().finalizeEncryptedGroupIfAllChatsCreated(encryptedGroup); } - private void onMemberAdded(InnerEncryptedChat innerChat) { + private void handleNewMemberChatStarted(InnerEncryptedChat innerChat) { log(encryptedGroup, "A member added."); innerChat.setState(InnerEncryptedChatState.NEW_MEMBER_NEED_SEND_INVITATION); getMessagesStorage().updateEncryptedGroupInnerChat(encryptedGroup.getInternalId(), innerChat); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/EncryptedGroupProtocol.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/EncryptedGroupProtocol.java index bbe2d8c73c5..e97c73b0cf5 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/EncryptedGroupProtocol.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/EncryptedGroupProtocol.java @@ -95,27 +95,35 @@ public void kickMember(EncryptedGroup encryptedGroup, long userId) { action.userId = userId; sendActionToAllMembers(encryptedGroup, action, true); - if (innerChat.isNotInState(InnerEncryptedChatState.CANCELLED)) { - NotificationCenter.NotificationCenterDelegate observer = new NotificationCenter.NotificationCenterDelegate() { - @Override - public void didReceivedNotification(int id, int account, Object... args) { - long dialogId = (long)args[3]; - InnerEncryptedChat innerChat = encryptedGroup.getInnerChatByUserId(userId); - if (dialogId == innerChat.getDialogId().orElse(0L)) { - getNotificationCenter().removeObserver(this, NotificationCenter.messageReceivedByServer); - removeMember(encryptedGroup, userId); - if (encryptedGroup.allInnerChatsMatchState(InnerEncryptedChatState.WAITING_SECONDARY_CHATS_CREATION)) { - requestMembersToCreateSecondaryChats(encryptedGroup); - } - } - } - }; - getNotificationCenter().addObserver(observer, NotificationCenter.messageReceivedByServer); + boolean needWaitForMessageReceiving = innerChat.isNotInState(InnerEncryptedChatState.CANCELLED) + && innerChat.getDialogId().isPresent(); + if (needWaitForMessageReceiving) { + waitForMessageReceivingByServer(innerChat.getDialogId().orElse(0L), () -> + finishKickingMember(encryptedGroup, userId) + ); } else { - removeMember(encryptedGroup, userId); - if (encryptedGroup.allInnerChatsMatchState(InnerEncryptedChatState.WAITING_SECONDARY_CHATS_CREATION)) { - requestMembersToCreateSecondaryChats(encryptedGroup); + finishKickingMember(encryptedGroup, userId); + } + } + + private void waitForMessageReceivingByServer(long targetDialogId, Runnable action) { + NotificationCenter.NotificationCenterDelegate observer = new NotificationCenter.NotificationCenterDelegate() { + @Override + public void didReceivedNotification(int id, int account, Object... args) { + long currentDialogId = (long)args[3]; + if (currentDialogId == targetDialogId) { + getNotificationCenter().removeObserver(this, NotificationCenter.messageReceivedByServer); + action.run(); + } } + }; + getNotificationCenter().addObserver(observer, NotificationCenter.messageReceivedByServer); + } + + private void finishKickingMember(EncryptedGroup encryptedGroup, long userId) { + removeMember(encryptedGroup, userId); + if (encryptedGroup.allInnerChatsMatchState(InnerEncryptedChatState.WAITING_SECONDARY_CHATS_CREATION)) { + requestMembersToCreateSecondaryChats(encryptedGroup); } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/EncryptedGroupServiceMessagesHandler.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/EncryptedGroupServiceMessagesHandler.java index 87e1162066b..75fe9e182eb 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/EncryptedGroupServiceMessagesHandler.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/EncryptedGroupServiceMessagesHandler.java @@ -38,14 +38,12 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; -import java.util.prefs.Preferences; import java.util.stream.Collectors; public class EncryptedGroupServiceMessagesHandler implements AccountControllersProvider { @@ -131,19 +129,11 @@ private EncryptedGroup getEncryptedGroup() { } private Long extractExternalGroupIdFromAction() { - Field[] fields = serviceMessage.encryptedGroupAction.getClass().getDeclaredFields(); - for (Field field : fields) { - ExternalGroupIdProvider annotation = field.getAnnotation(ExternalGroupIdProvider.class); - if (annotation != null) { - try { - return (Long)field.get(serviceMessage.encryptedGroupAction); - } catch (IllegalAccessException e) { - PartisanLog.e(e); - throw new RuntimeException(e); - } - } + if (serviceMessage.encryptedGroupAction instanceof ExternalGroupIdProvider) { + return ((ExternalGroupIdProvider)serviceMessage.encryptedGroupAction).getExternalGroupId(); + } else { + return null; } - return null; } private boolean validateHandlerConditions(HandlerCondition[] conditions) { @@ -393,7 +383,7 @@ private static String makeNotificationSettingsKey(String settingsTypeKey, long d private TLRPC.Message handleConfirmGroupInitialization(ConfirmGroupInitializationAction action) { encryptedGroup.setState(WAITING_SECONDARY_CHAT_CREATION); getMessagesStorage().updateEncryptedGroup(encryptedGroup); - getEncryptedGroupUtils().checkAllEncryptedChatsCreated(encryptedGroup); + getEncryptedGroupUtils().finalizeEncryptedGroupIfAllChatsCreated(encryptedGroup); AndroidUtilities.runOnUIThread(() -> { getNotificationCenter().postNotificationName(NotificationCenter.dialogsNeedReload); getNotificationCenter().postNotificationName(NotificationCenter.encryptedGroupUpdated, encryptedGroup); @@ -412,7 +402,7 @@ private TLRPC.Message handleStartSecondaryChat(StartSecondaryInnerChatAction act getMessagesStorage().updateEncryptedGroupInnerChat(encryptedGroup.getInternalId(), innerChat); if (encryptedGroup.isNotInState(INITIALIZED)) { - getEncryptedGroupUtils().checkAllEncryptedChatsCreated(encryptedGroup); + getEncryptedGroupUtils().finalizeEncryptedGroupIfAllChatsCreated(encryptedGroup); } AndroidUtilities.runOnUIThread(() -> { getNotificationCenter().postNotificationName(NotificationCenter.dialogsNeedReload); @@ -439,7 +429,7 @@ private static boolean areSecondaryChatStatesValid(EncryptedGroupState groupStat private TLRPC.Message handleAllSecondaryChatsInitialized(AllSecondaryChatsInitializedAction action) { innerChat.setState(InnerEncryptedChatState.INITIALIZED); getMessagesStorage().updateEncryptedGroupInnerChat(encryptedGroup.getInternalId(), innerChat); - getEncryptedGroupUtils().checkAllEncryptedChatsCreated(encryptedGroup); + getEncryptedGroupUtils().finalizeEncryptedGroupIfAllChatsCreated(encryptedGroup); AndroidUtilities.runOnUIThread(() -> { getNotificationCenter().postNotificationName(NotificationCenter.dialogsNeedReload); getNotificationCenter().postNotificationName(NotificationCenter.encryptedGroupUpdated, encryptedGroup); @@ -495,7 +485,7 @@ private TLRPC.Message handleDeleteMemberAction(DeleteMemberAction action) { } else { getEncryptedGroupProtocol().removeMember(encryptedGroup, action.userId); if (encryptedGroup.isInState(WAITING_SECONDARY_CHAT_CREATION)) { - getEncryptedGroupUtils().checkAllEncryptedChatsCreated(encryptedGroup); + getEncryptedGroupUtils().finalizeEncryptedGroupIfAllChatsCreated(encryptedGroup); } } return createMessageForStoring(); diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/EncryptedGroupUtils.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/EncryptedGroupUtils.java index 3853bc1e2f0..e77991aaa03 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/EncryptedGroupUtils.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/EncryptedGroupUtils.java @@ -29,6 +29,7 @@ import org.telegram.ui.Components.BackupImageView; import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -46,10 +47,9 @@ public EncryptedGroupUtils(int accountNum) { this.accountNum = accountNum; } - public void checkAllEncryptedChatsCreated(EncryptedGroup encryptedGroup) { - EncryptedGroupState groupState = encryptedGroup.getState(); - if (groupState != EncryptedGroupState.WAITING_SECONDARY_CHAT_CREATION && groupState != EncryptedGroupState.NEW_MEMBER_WAITING_SECONDARY_CHAT_CREATION) { - throw new RuntimeException("Invalid encrypted group state: " + groupState); + public void finalizeEncryptedGroupIfAllChatsCreated(EncryptedGroup encryptedGroup) { + if (encryptedGroup.isNotInState(EncryptedGroupState.WAITING_SECONDARY_CHAT_CREATION, EncryptedGroupState.NEW_MEMBER_WAITING_SECONDARY_CHAT_CREATION)) { + throw new RuntimeException("Invalid encrypted group state: " + encryptedGroup.getState()); } if (encryptedGroup.allInnerChatsMatchState(InnerEncryptedChatState.INITIALIZED)) { log(encryptedGroup, "All encrypted chats initialized."); @@ -61,11 +61,10 @@ public void checkAllEncryptedChatsCreated(EncryptedGroup encryptedGroup) { getEncryptedGroupProtocol().sendAllSecondaryChatsInitialized(ownerEncryptedChat); } } else if (PartisanLog.logsAllowed()) { - String notInitializedInnerChats = encryptedGroup.getInnerChats().stream() + long notInitializedInnerChatCount = encryptedGroup.getInnerChats().stream() .filter(innerChat -> innerChat.getState() != InnerEncryptedChatState.INITIALIZED) - .map(innerChat -> Long.toString(innerChat.getUserId())) - .collect(Collectors.joining(", ")); - log(encryptedGroup, "NOT all encrypted chats initialized: " + notInitializedInnerChats.length() + "."); + .count(); + log(encryptedGroup, "NOT all encrypted chats initialized: " + notInitializedInnerChatCount + "."); } } @@ -100,7 +99,7 @@ public void getEncryptedGroupIdByInnerEncryptedDialogIdAndExecute(long dialogId, } } - public boolean doForEachInnerDialogIdIfNeeded(long encryptedGroupDialogId, Consumer action) { + public boolean forEachInnerDialogIdIfEncryptedGroup(long encryptedGroupDialogId, Consumer action) { if (!DialogObject.isEncryptedDialog(encryptedGroupDialogId)) { return false; } @@ -225,9 +224,9 @@ private boolean canJoinToGroup(EncryptedGroup encryptedGroup) { } private void confirmJoining(EncryptedGroup encryptedGroup) { - forceHidePreview(encryptedGroup); + deleteInvitationMessageForNonPtgUsers(encryptedGroup); for (int i = 1; i <= 20; i++) { - AndroidUtilities.runOnUIThread(() -> forceHidePreview(encryptedGroup), 100 * i); + AndroidUtilities.runOnUIThread(() -> deleteInvitationMessageForNonPtgUsers(encryptedGroup), 100 * i); } if (encryptedGroup.isInState(EncryptedGroupState.JOINING_NOT_CONFIRMED)) { @@ -242,7 +241,7 @@ private void confirmJoining(EncryptedGroup encryptedGroup) { getEncryptedGroupProtocol().sendJoinConfirmation(encryptedChat); } - public void forceHidePreview(EncryptedGroup encryptedGroup) { + public void deleteInvitationMessageForNonPtgUsers(EncryptedGroup encryptedGroup) { if (encryptedGroup.isNotInState(EncryptedGroupState.INITIALIZED)) { Integer ownerEncryptedChatId = encryptedGroup.getInnerChatByUserId(encryptedGroup.getOwnerUserId()).getEncryptedChatId().orElse(null); long chatDialogId = DialogObject.makeEncryptedDialogId(ownerEncryptedChatId); @@ -336,7 +335,7 @@ public EncryptedGroup getOrLoadEncryptedGroupByExternalId(long externalId) { public EncryptedGroup getOrLoadEncryptedGroupByDialogId(long dialogId) { EncryptedGroup encryptedGroup = null; if (DialogObject.isEncryptedDialog(dialogId)) { - encryptedGroup = getEncryptedGroupUtils().getOrLoadEncryptedGroup(DialogObject.getEncryptedChatId(dialogId)); + encryptedGroup = getOrLoadEncryptedGroup(DialogObject.getEncryptedChatId(dialogId)); } return encryptedGroup; } @@ -359,7 +358,7 @@ public boolean isInnerEncryptedGroupChat(int encryptedChatId) { return getMessagesStorage().getEncryptedGroupIdByInnerEncryptedChatId(encryptedChatId) != null; } - public boolean putEncIdOrEncGroupIdInBundle(Bundle bundle, long dialogId) { + public boolean putEncIdOrEncGroupIdInBundleIfPossible(Bundle bundle, long dialogId) { EncryptedGroup encryptedGroup = getMessagesController().getEncryptedGroup(DialogObject.getEncryptedChatId(dialogId)); if (encryptedGroup != null) { if (encryptedGroup.isInState(EncryptedGroupState.JOINING_NOT_CONFIRMED, EncryptedGroupState.NEW_MEMBER_JOINING_NOT_CONFIRMED)) { @@ -423,9 +422,13 @@ public static NativeByteBuffer serializeAvatarToByteBuffer(EncryptedGroup encryp } public static byte[] serializeAvatar(EncryptedGroup encryptedGroup) { - ByteArrayOutputStream stream = new ByteArrayOutputStream(); - encryptedGroup.getAvatar().compress(android.graphics.Bitmap.CompressFormat.JPEG, 80, stream); - return stream.toByteArray(); + try (ByteArrayOutputStream stream = new ByteArrayOutputStream()) { + encryptedGroup.getAvatar().compress(android.graphics.Bitmap.CompressFormat.JPEG, 80, stream); + return stream.toByteArray(); + } catch (IOException e) { + PartisanLog.e("Error serializing encrypted group avatar", e); + return new byte[0]; + } } public static Bitmap deserializeAvatarFromByteBuffer(NativeByteBuffer buffer) { @@ -437,7 +440,7 @@ public static Bitmap deserializeAvatarFromByteBuffer(NativeByteBuffer buffer) { } } - public void syncTtlIfNeeded(TLRPC.EncryptedChat encryptedChat) { + public void syncTtlWithOtherMembersIfNeeded(TLRPC.EncryptedChat encryptedChat) { EncryptedGroup encryptedGroup = getOrLoadEncryptedGroupByEncryptedChat(encryptedChat); if (encryptedGroup == null) { return; diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/action/AbstractCreateGroupAction.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/action/AbstractCreateGroupAction.java index 13f27a72a71..a265c4d3887 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/action/AbstractCreateGroupAction.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/action/AbstractCreateGroupAction.java @@ -6,8 +6,7 @@ import java.util.List; import java.util.Objects; -public abstract class AbstractCreateGroupAction extends EncryptedGroupAction { - @ExternalGroupIdProvider() +public abstract class AbstractCreateGroupAction extends EncryptedGroupAction implements ExternalGroupIdProvider { public long externalGroupId; public String name; public List memberIds = new ArrayList<>(); @@ -26,4 +25,9 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(externalGroupId, name, memberIds, ownerUserId); } + + @Override + public long getExternalGroupId() { + return externalGroupId; + } } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/action/ExternalGroupIdProvider.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/action/ExternalGroupIdProvider.java index 82cf05cabf1..06cfc4859f7 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/action/ExternalGroupIdProvider.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/action/ExternalGroupIdProvider.java @@ -5,7 +5,6 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.FIELD) -public @interface ExternalGroupIdProvider { +public interface ExternalGroupIdProvider { + long getExternalGroupId(); } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/action/StartSecondaryInnerChatAction.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/action/StartSecondaryInnerChatAction.java index 1893b983e57..5686c769ee9 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/action/StartSecondaryInnerChatAction.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/action/StartSecondaryInnerChatAction.java @@ -3,10 +3,9 @@ import org.telegram.tgnet.InputSerializedData; import org.telegram.tgnet.OutputSerializedData; -public class StartSecondaryInnerChatAction extends EncryptedGroupAction { +public class StartSecondaryInnerChatAction extends EncryptedGroupAction implements ExternalGroupIdProvider { public static final int constructor = 0x19fbd964; - @ExternalGroupIdProvider() public long externalGroupId; @Override @@ -20,4 +19,9 @@ public void serializeToStream(OutputSerializedData stream) { stream.writeInt64(externalGroupId); } + + @Override + public long getExternalGroupId() { + return externalGroupId; + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index bfb59f636d6..0b83f271d2d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -24375,7 +24375,7 @@ private boolean addMessage(int pos, MessageObject obj) { if (needAddMessage) { messages.add(pos, obj); messages.sort(Collections.reverseOrder(Comparator.comparingInt(m -> m.messageOwner.date))); - boolean added = !removeServiceMessagesDuplications(); + boolean added = !removeServiceMessageDuplicationsIfAny(); if (obj.isOut()) { hiddenEncryptedGroupOutMessages.put(obj.messageOwner.random_id, new ArrayList<>()); } @@ -24387,8 +24387,8 @@ private boolean addMessage(int pos, MessageObject obj) { } } - private boolean removeServiceMessagesDuplications() { - boolean modified = false; + private boolean removeServiceMessageDuplicationsIfAny() { + boolean duplicationsFound = false; for (int i = messages.size() - 1; i >= 0; i--) { if (i > 0) { TLRPC.DecryptedMessageAction currentAction = getMessageAction(messages.get(i)); @@ -24396,11 +24396,11 @@ private boolean removeServiceMessagesDuplications() { if (actionsEquals(currentAction, previousAction)) { messages.remove(i); - modified = true; + duplicationsFound = true; } } } - return modified; + return duplicationsFound; } private static TLRPC.DecryptedMessageAction getMessageAction(MessageObject message) { @@ -34495,7 +34495,7 @@ public boolean didSelectDialogs(DialogsActivity fragment, ArrayList { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java index 514dd65a92d..3f6471326e7 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java @@ -3234,7 +3234,7 @@ private boolean handleIntent(Intent intent, boolean isNew, boolean restore, bool } } else if (push_enc_id != 0) { Bundle args = new Bundle(); - if (!new EncryptedGroupUtils(currentAccount).putEncIdOrEncGroupIdInBundle(args, DialogObject.makeEncryptedDialogId(push_enc_id))) { + if (!new EncryptedGroupUtils(currentAccount).putEncIdOrEncGroupIdInBundleIfPossible(args, DialogObject.makeEncryptedDialogId(push_enc_id))) { return true; } if (new EncryptedGroupUtils(currentAccount).isNotInitializedEncryptedGroup(DialogObject.makeEncryptedDialogId(push_enc_id))) { @@ -6163,7 +6163,7 @@ public boolean didSelectDialogs(DialogsActivity dialogsFragment, ArrayList Date: Sat, 7 Jun 2025 15:01:13 +0300 Subject: [PATCH 18/27] add slow secret group creation warning --- TMessagesProj/src/main/assets/strings/strings_be.xml | 1 + TMessagesProj/src/main/assets/strings/strings_ru.xml | 1 + TMessagesProj/src/main/assets/strings/strings_uk.xml | 1 + .../partisan/secretgroups/EncryptedGroupConstants.java | 1 + .../secretgroups/ui/EncryptedGroupCreateActivity.java | 10 +++++++--- TMessagesProj/src/main/res/values/strings.xml | 1 + 6 files changed, 12 insertions(+), 3 deletions(-) diff --git a/TMessagesProj/src/main/assets/strings/strings_be.xml b/TMessagesProj/src/main/assets/strings/strings_be.xml index f5d9ad1f8be..05c13cbe510 100644 --- a/TMessagesProj/src/main/assets/strings/strings_be.xml +++ b/TMessagesProj/src/main/assets/strings/strings_be.xml @@ -305,4 +305,5 @@ Вы ўпэўненыя, што жадаеце выдаліць гэтага ўдзельніка з сакрэтнай групы? Усе яго паведамленні будуць выдалены. Нельга змяніць аватар да ініцыялізацыі групы. Неабходна дачакацца пацверджання ад папярэдніх чальцоў перад даданнем новага. + Сакрэтная група на 7 і больш удзельнікаў будзе стварацца даўжэй, чым звычайна. \ No newline at end of file diff --git a/TMessagesProj/src/main/assets/strings/strings_ru.xml b/TMessagesProj/src/main/assets/strings/strings_ru.xml index f50e61e3279..ffb01e46574 100644 --- a/TMessagesProj/src/main/assets/strings/strings_ru.xml +++ b/TMessagesProj/src/main/assets/strings/strings_ru.xml @@ -304,4 +304,5 @@ Вы уверены, что хотите удалить этого участника из секретной группы? Все его сообщения будут удалены. Нельзя изменить аватар до инициализации группы. Необходимо дождаться подтверждения от предыдущих членов перед добавлением нового. + A secret group of 7 or more members will be created longer than usual. \ No newline at end of file diff --git a/TMessagesProj/src/main/assets/strings/strings_uk.xml b/TMessagesProj/src/main/assets/strings/strings_uk.xml index a80872675ae..a0e5f711935 100644 --- a/TMessagesProj/src/main/assets/strings/strings_uk.xml +++ b/TMessagesProj/src/main/assets/strings/strings_uk.xml @@ -305,4 +305,5 @@ Ви впевнені, що хочете видалити цього учасника із секретної групи? Усі його повідомлення будуть видалені. Не можна змінити аватар до ініціалізації групи. Перед додаванням нового необхідно дочекатися підтвердження від попередніх членів. + Секретна група на 7 і більше учасників буде створюватися довше, ніж зазвичай. diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/EncryptedGroupConstants.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/EncryptedGroupConstants.java index 0c2af23b6a2..3f7675c21c4 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/EncryptedGroupConstants.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/EncryptedGroupConstants.java @@ -2,4 +2,5 @@ public class EncryptedGroupConstants { public static final int MAX_MEMBER_COUNT = 10; + public static final int FAST_GROUP_CREATION_MEMBER_COUNT = 6; } diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/ui/EncryptedGroupCreateActivity.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/ui/EncryptedGroupCreateActivity.java index c081cd9a22f..140b2ffe1b2 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/ui/EncryptedGroupCreateActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/ui/EncryptedGroupCreateActivity.java @@ -742,10 +742,14 @@ public void afterTextChanged(Editable editable) { onDonePressed(); }); return; + } else { + GroupCreateSpan span = new GroupCreateSpan(editText.getContext(), object, currentAccount); + spansContainer.addSpan(span); + span.setOnClickListener(EncryptedGroupCreateActivity.this); + if (getFullMembersCount() == EncryptedGroupConstants.FAST_GROUP_CREATION_MEMBER_COUNT) { + AlertsCreator.showSimpleAlert(this, LocaleController.getString(R.string.Warning), LocaleController.getString(R.string.SlowSecretGroupCreationWarning)); + } } - GroupCreateSpan span = new GroupCreateSpan(editText.getContext(), object, currentAccount); - spansContainer.addSpan(span); - span.setOnClickListener(EncryptedGroupCreateActivity.this); } selectedCountUpdated(); if (searching || searchWas) { diff --git a/TMessagesProj/src/main/res/values/strings.xml b/TMessagesProj/src/main/res/values/strings.xml index a59c4ba93c9..4e4e0d2bfe4 100644 --- a/TMessagesProj/src/main/res/values/strings.xml +++ b/TMessagesProj/src/main/res/values/strings.xml @@ -9576,4 +9576,5 @@ Are you sure you want to remove this member from the secret group. All his messages will be deleted. You can\'t change avatar until the group is initialized. You must wait for confirmation from previous members before adding a new one. + A secret group of 7 or more participants will be created longer than usual. \ No newline at end of file From c2893780022530ea846aa60527109a904def3163 Mon Sep 17 00:00:00 2001 From: vivabelarus <74508922+vivabelarus@users.noreply.github.com> Date: Sat, 7 Jun 2025 15:12:51 +0300 Subject: [PATCH 19/27] EncryptedGroupCreateActivity refactoring --- .../ui/EncryptedGroupCreateActivity.java | 79 +++++++++---------- 1 file changed, 38 insertions(+), 41 deletions(-) diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/ui/EncryptedGroupCreateActivity.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/ui/EncryptedGroupCreateActivity.java index 140b2ffe1b2..f2536ba4dce 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/ui/EncryptedGroupCreateActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/ui/EncryptedGroupCreateActivity.java @@ -1,5 +1,7 @@ package org.telegram.messenger.partisan.secretgroups.ui; +import static org.telegram.messenger.LocaleController.getString; + import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; @@ -446,9 +448,9 @@ public View createView(Context context) { actionBar.setBackButtonImage(R.drawable.ic_ab_back); actionBar.setAllowOverlayTitle(true); if (isAddToGroup()) { - actionBar.setTitle(LocaleController.getString(R.string.GroupAddMembers)); + actionBar.setTitle(getString(R.string.GroupAddMembers)); } else { - actionBar.setTitle(LocaleController.getString(R.string.NewEncryptedGroup)); + actionBar.setTitle(getString(R.string.NewEncryptedGroup)); } actionBar.setActionBarMenuOnItemClick(new ActionBar.ActionBarMenuOnItemClick() { @@ -680,7 +682,7 @@ public void afterTextChanged(Editable editable) { emptyView = new StickerEmptyView(context, flickerLoadingView, StickerEmptyView.STICKER_TYPE_SEARCH); emptyView.addView(flickerLoadingView); emptyView.showProgress(true, false); - emptyView.title.setText(LocaleController.getString(R.string.NoResult)); + emptyView.title.setText(getString(R.string.NoResult)); frameLayout.addView(emptyView); @@ -699,46 +701,29 @@ public void afterTextChanged(Editable editable) { if (view instanceof GroupCreateUserCell) { GroupCreateUserCell cell = (GroupCreateUserCell) view; Object object = cell.getObject(); - long id; - if (object instanceof TLRPC.User) { - id = ((TLRPC.User) object).id; - } else if (object instanceof TLRPC.Chat) { - id = -((TLRPC.Chat) object).id; - } else { + if (!(object instanceof TLRPC.User)) { return; } - if (encryptedGroup != null && encryptedGroup.getInnerChatByUserId(id) != null) { + TLRPC.User user = (TLRPC.User) object; + long did = user.id; + if (encryptedGroup != null && encryptedGroup.getInnerChatByUserId(did) != null) { return; } - if (selectedContacts.indexOfKey(id) >= 0) { - GroupCreateSpan span = selectedContacts.get(id); + if (selectedContacts.indexOfKey(did) >= 0) { + GroupCreateSpan span = selectedContacts.get(did); spansContainer.removeSpan(span); } else { if (maxCount != 0 && getFullMembersCount() == maxCount || isAddToGroup() && !selectedContacts.isEmpty()) { // allow adding only 1 new member return; } if (selectedContacts.size() == getMessagesController().maxGroupCount) { - AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); - builder.setTitle(LocaleController.getString(R.string.AppName)); - builder.setMessage(LocaleController.getString(R.string.SoftUserLimitAlert)); - builder.setPositiveButton(LocaleController.getString(R.string.OK), null); - showDialog(builder.create()); + showLimitReachedDialog(); return; } - long did = 0; - if (object instanceof TLRPC.User) { - TLRPC.User user = (TLRPC.User) object; - getMessagesController().putUser(user, !searching); - did = user.id; - } else if (object instanceof TLRPC.Chat) { - TLRPC.Chat chat = (TLRPC.Chat) object; - getMessagesController().putChat(chat, !searching); - did = chat.id; - } + getMessagesController().putUser(user, !searching); if (isAddToGroup()) { - long finalDid = did; - AlertsCreator.showConfirmationDialog(this, context, LocaleController.getString(R.string.VoipGroupAddMemberTitle), () -> { - selectedContacts.put(finalDid, null); + AlertsCreator.showConfirmationDialog(this, context, getString(R.string.VoipGroupAddMemberTitle), () -> { + selectedContacts.put(did, null); onDonePressed(); }); return; @@ -747,7 +732,7 @@ public void afterTextChanged(Editable editable) { spansContainer.addSpan(span); span.setOnClickListener(EncryptedGroupCreateActivity.this); if (getFullMembersCount() == EncryptedGroupConstants.FAST_GROUP_CREATION_MEMBER_COUNT) { - AlertsCreator.showSimpleAlert(this, LocaleController.getString(R.string.Warning), LocaleController.getString(R.string.SlowSecretGroupCreationWarning)); + showSlowGroupCreationWarning(); } } } @@ -814,20 +799,32 @@ public void getOutline(View view, Outline outline) { floatingButton.setScaleY(0.0f); floatingButton.setAlpha(0.0f); } - floatingButton.setContentDescription(LocaleController.getString(R.string.Next)); + floatingButton.setContentDescription(getString(R.string.Next)); selectedCountUpdated(); return fragmentView; } + private void showSlowGroupCreationWarning() { + AlertsCreator.showSimpleAlert(this, getString(R.string.Warning), getString(R.string.SlowSecretGroupCreationWarning)); + } + + private void showLimitReachedDialog() { + AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); + builder.setTitle(getString(R.string.AppName)); + builder.setMessage(getString(R.string.LimitReached)); + builder.setPositiveButton(getString(R.string.OK), null); + showDialog(builder.create()); + } + private void updateEditTextHint() { if (editText == null) { return; } if (isAddToGroup() || (adapter != null && adapter.noContactsStubRow == 0)) { - editText.setHintText(LocaleController.getString(R.string.SearchForPeople)); + editText.setHintText(getString(R.string.SearchForPeople)); } else { - editText.setHintText(LocaleController.getString(R.string.SendMessageTo)); + editText.setHintText(getString(R.string.SendMessageTo)); } } @@ -934,7 +931,7 @@ private void checkVisibleRows() { int position = listView.getChildAdapterPosition(child); if (position == adapter.firstSectionRow) { GraySectionCell cell = (GraySectionCell) child; - cell.setRightText(!selectedContacts.isEmpty() ? LocaleController.getString(R.string.DeselectAll) : "", true, v -> { + cell.setRightText(!selectedContacts.isEmpty() ? getString(R.string.DeselectAll) : "", true, v -> { selectedContacts.clear(); spansContainer.removeAllSpans(true); checkVisibleRows(); @@ -959,8 +956,8 @@ private boolean onDonePressed() { if (encryptedGroup == null) { DialogTemplate template = new DialogTemplate(); template.type = DialogType.CREATE; - template.title = LocaleController.getString(R.string.GroupName); - template.addEditTemplate("", LocaleController.getString(R.string.EnterGroupNamePlaceholder), true); + template.title = getString(R.string.GroupName); + template.addEditTemplate("", getString(R.string.EnterGroupNamePlaceholder), true); template.positiveListener = views -> { String chatName = ((EditTextCaption)views.get(0)).getText().toString(); @@ -1202,7 +1199,7 @@ protected void onAttachedToWindow() { }; stickerEmptyView.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); stickerEmptyView.subtitle.setVisibility(View.GONE); - stickerEmptyView.title.setText(LocaleController.getString(R.string.NoContacts)); + stickerEmptyView.title.setText(getString(R.string.NoContacts)); stickerEmptyView.setAnimateLayoutChange(true); view = stickerEmptyView; break; @@ -1216,12 +1213,12 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { case 0: { GraySectionCell cell = (GraySectionCell) holder.itemView; if (searching) { - cell.setText(LocaleController.getString(R.string.GlobalSearch)); + cell.setText(getString(R.string.GlobalSearch)); } else if (position == userTypesHeaderRow) { - cell.setText(LocaleController.getString(R.string.PrivacyUserTypes)); + cell.setText(getString(R.string.PrivacyUserTypes)); } if (position == firstSectionRow) { - cell.setRightText(!selectedContacts.isEmpty() ? LocaleController.getString(R.string.DeselectAll) : "", true, v -> { + cell.setRightText(!selectedContacts.isEmpty() ? getString(R.string.DeselectAll) : "", true, v -> { selectedContacts.clear(); spansContainer.removeAllSpans(true); checkVisibleRows(); From f40530dacbf5c202e987eefd4a1a8bd11558fe51 Mon Sep 17 00:00:00 2001 From: vivabelarus <74508922+vivabelarus@users.noreply.github.com> Date: Sat, 7 Jun 2025 16:19:50 +0300 Subject: [PATCH 20/27] fix removeAfterReadingMessages in General topic --- .../java/org/telegram/messenger/SendMessagesHelper.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/SendMessagesHelper.java b/TMessagesProj/src/main/java/org/telegram/messenger/SendMessagesHelper.java index 33bef18ae10..6af8cf3c576 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/SendMessagesHelper.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/SendMessagesHelper.java @@ -5608,7 +5608,11 @@ public void sendMessage(SendMessageParams sendMessageParams) { } if (sendMessageParams.autoDeleteDelay != null) { - RemoveAsReadMessage messageToRemove = new RemoveAsReadMessage(newMsg.id, MessageObject.getTopicId(currentAccount, newMsg, false), newMsg.random_id, newMsg.date, sendMessageParams.autoDeleteDelay); + long topicId = MessageObject.getTopicId(currentAccount, newMsg, false); + if (topicId == 0 && replyToMsg != null && replyToMsg.isTopicMainMessage) { + topicId = replyToMsg.getTopicId(); + } + RemoveAsReadMessage messageToRemove = new RemoveAsReadMessage(newMsg.id, topicId, newMsg.random_id, newMsg.date, sendMessageParams.autoDeleteDelay); RemoveAfterReadingMessages.addMessageToRemove(currentAccount, newMsg.dialog_id, messageToRemove); } } From 221d1e57c5c442e0713e6a774c8c6ea007631ccd Mon Sep 17 00:00:00 2001 From: vivabelarus <74508922+vivabelarus@users.noreply.github.com> Date: Sat, 7 Jun 2025 16:33:26 +0300 Subject: [PATCH 21/27] fix removeAfterReadingMessages for media --- TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index 0b83f271d2d..e8856787898 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -12892,7 +12892,7 @@ public void didPressedButton(int button, boolean arg, boolean notify, int schedu } final boolean updateStickersOrderFinal = updateStickersOrder; if (autoDeleteDelay != null) { - SendMessagesHelper.prepareSendingMedia(getAccountInstance(), photos, dialog_id, replyingMessageObject, getThreadMessage(), null, replyingQuote, button == 4 || forceDocument, arg, editingMessageObject, notify, scheduleDate, chatMode, updateStickersOrderFinal, null, quickReplyShortcut, getQuickReplyId(), effectId, invertMedia, payStars, autoDeleteDelay); + SendMessagesHelper.prepareSendingMedia(getAccountInstance(), photos, dialog_id, replyingMessageObject, getThreadMessage(), null, replyingQuote, button == 4 || forceDocument, arg, editingMessageObject, notify, scheduleDate, chatMode, updateStickersOrderFinal, null, quickReplyShortcut, getQuickReplyId(), effectId, invertMedia, payStars, getSendMonoForumPeerId(), autoDeleteDelay); } else { SendMessagesHelper.prepareSendingMedia(getAccountInstance(), photos, dialog_id, replyingMessageObject, getThreadMessage(), null, replyingQuote, button == 4 || forceDocument, arg, editingMessageObject, notify, scheduleDate, chatMode, updateStickersOrderFinal, null, quickReplyShortcut, getQuickReplyId(), effectId, invertMedia, payStars, getSendMonoForumPeerId()); } From 6086e87f4c1f9d96fe549f2b62bd657c3d7144f0 Mon Sep 17 00:00:00 2001 From: vivabelarus <74508922+vivabelarus@users.noreply.github.com> Date: Sat, 7 Jun 2025 21:25:18 +0300 Subject: [PATCH 22/27] fix retry sending message to secret group for grouped messages --- .../src/main/java/org/telegram/ui/ChatActivity.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index e8856787898..1fcf79bd272 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -33589,16 +33589,18 @@ private void processSelectedOption(int option) { if (group != null) { boolean success = true; for (int a = 0; a < group.messages.size(); a++) { - if (!getSendMessagesHelper().retrySendMessage(group.messages.get(a), false, payStars)) { - success = false; + for (MessageObject messageCopy : getMessageCopies(group.messages.get(a))) { + if (!getSendMessagesHelper().retrySendMessage(messageCopy, false, payStars)) { + success = false; + } } } if (success && chatMode == 0) { moveScrollToLastMessage(false); } } else { - for (MessageObject objectCopy : getMessageCopies(object)) { - if (getSendMessagesHelper().retrySendMessage(objectCopy, false, payStars)) { + for (MessageObject messageCopy : getMessageCopies(object)) { + if (getSendMessagesHelper().retrySendMessage(messageCopy, false, payStars)) { updateVisibleRows(); if (chatMode == 0) { moveScrollToLastMessage(false); From 4bdda3ababe0b293958caad88c645d8297358515 Mon Sep 17 00:00:00 2001 From: vivabelarus <74508922+vivabelarus@users.noreply.github.com> Date: Sat, 7 Jun 2025 23:16:20 +0300 Subject: [PATCH 23/27] Update to 1621 --- .github/workflows/alpha.yml | 2 +- .../java/org/telegram/messenger/partisan/PartisanVersion.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/alpha.yml b/.github/workflows/alpha.yml index b8785493ffc..5d1854bc43c 100644 --- a/.github/workflows/alpha.yml +++ b/.github/workflows/alpha.yml @@ -18,7 +18,7 @@ jobs: - name: Save artifact uses: actions/upload-artifact@master with: - name: PTelegramAlpha-1620.apk + name: PTelegramAlpha-1621.apk path: TMessagesProj/build/outputs/apk/afat/alpha/app.apk - name: Create cleanup request run: touch delete_request diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/PartisanVersion.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/PartisanVersion.java index 4a2280756ea..982262b8b18 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/PartisanVersion.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/PartisanVersion.java @@ -2,5 +2,5 @@ public class PartisanVersion { public static final String PARTISAN_VERSION_STRING = "4.2.0"; - public static int PARTISAN_BUILD_VERSION = 1620; + public static int PARTISAN_BUILD_VERSION = 1621; } From 7aa02da5394f5c2107ef91e67a7df866e8e7c004 Mon Sep 17 00:00:00 2001 From: vivabelarus <74508922+vivabelarus@users.noreply.github.com> Date: Sun, 8 Jun 2025 10:40:20 +0300 Subject: [PATCH 24/27] fix crash --- .../src/main/java/org/telegram/ui/GroupCallActivity.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/TMessagesProj/src/main/java/org/telegram/ui/GroupCallActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/GroupCallActivity.java index 9528ac8785f..91471f898c3 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/GroupCallActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/GroupCallActivity.java @@ -6399,17 +6399,16 @@ private void updateTitle(boolean animated) { titleTextView.setText(call.call.title, animated); } } else { - String title = UserConfig.getChatTitleOverride(getCurrentAccount(), currentChat); - if (currentChat != null && !title.equals(actionBar.getTitle())) { + if (currentChat != null && !UserConfig.getChatTitleOverride(getCurrentAccount(), currentChat).equals(actionBar.getTitle())) { if (animated) { - actionBar.setTitleAnimated(title, true, 180); + actionBar.setTitleAnimated(UserConfig.getChatTitleOverride(getCurrentAccount(), currentChat), true, 180); actionBar.getTitleTextView().setOnClickListener(v -> { if (call != null && call.recording) { showRecordHint(actionBar.getTitleTextView()); } }); } else { - actionBar.setTitle(title); + actionBar.setTitle(UserConfig.getChatTitleOverride(getCurrentAccount(), currentChat)); } if (ChatObject.isChannelOrGiga(currentChat)) { if (isRtmpStream()) { From f9bee3bb379055ddbafb816df3118dff9fc9a046 Mon Sep 17 00:00:00 2001 From: vivabelarus <74508922+vivabelarus@users.noreply.github.com> Date: Sun, 8 Jun 2025 10:50:52 +0300 Subject: [PATCH 25/27] fix translation --- TMessagesProj/src/main/assets/strings/strings_ru.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TMessagesProj/src/main/assets/strings/strings_ru.xml b/TMessagesProj/src/main/assets/strings/strings_ru.xml index ffb01e46574..fd647755349 100644 --- a/TMessagesProj/src/main/assets/strings/strings_ru.xml +++ b/TMessagesProj/src/main/assets/strings/strings_ru.xml @@ -304,5 +304,5 @@ Вы уверены, что хотите удалить этого участника из секретной группы? Все его сообщения будут удалены. Нельзя изменить аватар до инициализации группы. Необходимо дождаться подтверждения от предыдущих членов перед добавлением нового. - A secret group of 7 or more members will be created longer than usual. + Секретная группа на 7 и более участников будет создаваться дольше обычного. \ No newline at end of file From 7591c8cfa0eec0c88f4f41cf40ca31b02f483530 Mon Sep 17 00:00:00 2001 From: vivabelarus <74508922+vivabelarus@users.noreply.github.com> Date: Sun, 8 Jun 2025 11:25:22 +0300 Subject: [PATCH 26/27] show "limit reached" warning during encrypted group creation --- .../secretgroups/ui/EncryptedGroupCreateActivity.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/ui/EncryptedGroupCreateActivity.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/ui/EncryptedGroupCreateActivity.java index f2536ba4dce..9430aac7a86 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/ui/EncryptedGroupCreateActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/ui/EncryptedGroupCreateActivity.java @@ -713,10 +713,7 @@ public void afterTextChanged(Editable editable) { GroupCreateSpan span = selectedContacts.get(did); spansContainer.removeSpan(span); } else { - if (maxCount != 0 && getFullMembersCount() == maxCount || isAddToGroup() && !selectedContacts.isEmpty()) { // allow adding only 1 new member - return; - } - if (selectedContacts.size() == getMessagesController().maxGroupCount) { + if (getFullMembersCount() == maxCount) { showLimitReachedDialog(); return; } From 9f9aafa32bf75a45180efdb9407319f29111537a Mon Sep 17 00:00:00 2001 From: vivabelarus <74508922+vivabelarus@users.noreply.github.com> Date: Sun, 8 Jun 2025 11:26:01 +0300 Subject: [PATCH 27/27] Update to 1622 --- .github/workflows/alpha.yml | 2 +- .../java/org/telegram/messenger/partisan/PartisanVersion.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/alpha.yml b/.github/workflows/alpha.yml index 5d1854bc43c..831448fa487 100644 --- a/.github/workflows/alpha.yml +++ b/.github/workflows/alpha.yml @@ -18,7 +18,7 @@ jobs: - name: Save artifact uses: actions/upload-artifact@master with: - name: PTelegramAlpha-1621.apk + name: PTelegramAlpha-1622.apk path: TMessagesProj/build/outputs/apk/afat/alpha/app.apk - name: Create cleanup request run: touch delete_request diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/PartisanVersion.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/PartisanVersion.java index 982262b8b18..23250d43003 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/partisan/PartisanVersion.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/PartisanVersion.java @@ -2,5 +2,5 @@ public class PartisanVersion { public static final String PARTISAN_VERSION_STRING = "4.2.0"; - public static int PARTISAN_BUILD_VERSION = 1621; + public static int PARTISAN_BUILD_VERSION = 1622; }