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 344dd75f4..e82e7ba72 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 @@ public class ChatRemoveCell extends FrameLayout implements AccountControllersPro } 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 8d6ba4449..8cce17120 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.Utilities; 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 5c7f025f6..fc49b4ee9 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 @@ package org.telegram.ui.RemoveChatsAction.items; 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 class EncryptedGroupItem extends Item { } @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 c1f25f8cb..b144c32a2 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.AccountControllersProvider; 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 @@ public abstract class Item implements AccountControllersProvider { || 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 81b6656fe..81b75f527 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 class SearchItem extends Item { } @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 ff5552af0..a6c1b5355 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.messenger.UserObject; 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 @@ class UserItem extends AbstractUserItem { } @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 b8bd70b2e..62e8ee939 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 @@ public class EncryptedGroupProfileActivity extends BaseFragment implements Notif 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 5aced7913..f8361a483 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 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not 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 class ChatActivity extends BaseFragment implements NotificationCenter.Not 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 | 61 +++++++++++-------- 1 file changed, 35 insertions(+), 26 deletions(-) diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index f8361a483..91a0feed1 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -30577,33 +30577,10 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not if (!isEncryptedGroup()) { return null; } - List srcMessages; - if (finalSelectedObject != null) { - srcMessages = Collections.singletonList(finalSelectedObject); - } else { - srcMessages = new ArrayList<>(); - for (int a = 1; a >= 0; a--) { - for (int b = 0; b < selectedMessagesIds[a].size(); b++) { - srcMessages.add(selectedMessagesIds[a].valueAt(b)); - } - } - } 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); + 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); } @@ -30611,6 +30588,38 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not return encryptedGroupMessages; } + private List getSrcMessages(MessageObject finalSelectedObject) { + if (finalSelectedObject != null) { + return Collections.singletonList(finalSelectedObject); + } else { + 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; + } + } + + 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); + } + } + + 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) { if (isEncryptedGroup() && message.isOut()) { if (hiddenEncryptedGroupOutMessages.containsKey(message.messageOwner.random_id)) { 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 91a0feed1..61c62f9cc 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 class ChatActivity extends BaseFragment implements NotificationCenter.Not 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 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not 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 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not 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 af043a330..644e0bc45 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 class AlertsCreator { 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 class AlertsCreator { } 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 class AlertsCreator { }; 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 40440fb70..4abeb07f3 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 class SharedMediaLayout extends FrameLayout implements NotificationCenter 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 61c62f9cc..926769b65 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 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not 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 926769b65..7176419c0 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 class ChatActivity extends BaseFragment implements NotificationCenter.Not @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 42072939d..2bd099300 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 class MessagesStorage extends BaseController { 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 @@ public class MessagesStorage extends BaseController { 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 @@ public class MessagesStorage extends BaseController { 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 03875dbb3..2e3dff285 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 class SharedConfig { 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 a7fa4840c..8c951b41b 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 class FakePasscode { } 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 891cda893..3ffd80af1 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 @@ package org.telegram.messenger.fakepasscode; 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 class RemoveChatsAction extends AccountAction implements NotificationCent } 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 01d5484da..0b279f90d 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 class AvatarDrawable extends Drawable { } 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 7176419c0..d33058882 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 class ChatActivity extends BaseFragment implements NotificationCenter.Not @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 1f06fcabb..87e116206 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.W 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.AndroidUtilities; 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.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 { @@ -326,6 +330,7 @@ public class EncryptedGroupServiceMessagesHandler implements AccountControllersP getEncryptedGroupProtocol().sendNewAvatar(encryptedGroup, encryptedChat); } syncNewInnerChatTtl(); + syncNewInnerChatNotificationSettings(); AndroidUtilities.runOnUIThread(() -> { getNotificationCenter().postNotificationName(NotificationCenter.dialogsNeedReload); getNotificationCenter().postNotificationName(NotificationCenter.encryptedGroupUpdated, encryptedGroup); @@ -348,6 +353,42 @@ public class EncryptedGroupServiceMessagesHandler implements AccountControllersP ); } + 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 @@ public class EncryptedGroupServiceMessagesHandler implements AccountControllersP 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 d33058882..e27841ef7 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 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not 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 e71506752..b8785493f 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 08da85fdf..4a2280756 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 @@ package org.telegram.messenger.partisan; 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 0b279f90d..b09f210b9 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 class AvatarDrawable extends Drawable { } 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 794d7e37e..cad043a19 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 @@ public class ChatActivityEnterView extends BlurredFrameLayout implements Notific 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 e27841ef7..bfb59f636 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 class ChatActivity extends BaseFragment implements NotificationCenter.Not @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 6d226c0bd..97ce3b2e9 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.SQLite.SQLitePreparedStatement; 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 class MessagesController extends BaseController implements NotificationCe 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 class MessagesController extends BaseController implements NotificationCe } 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 3002d4203..eb3cfbf84 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 @@ public class NotificationsController extends BaseController { } 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 704329ad0..b04745831 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 class SecretChatHelper extends BaseController { 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 8c951b41b..367822a37 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 @@ package org.telegram.messenger.fakepasscode; 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.UserConfig; 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 @@ public class FakePasscode { 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 @@ public class FakePasscode { 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 class FakePasscode { } 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 class FakePasscode { 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 class FakePasscode { 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 class FakePasscode { } 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 d8ec9cd8b..e4a2d9839 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 @@ package org.telegram.messenger.partisan.secretgroups; 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 @@ public class EncryptedGroupChatUpdateHandler implements AccountControllersProvid 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 b2cb61112..c68807210 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 @@ public class EncryptedGroupInnerChatStarter implements AccountControllersProvide 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 @@ public class EncryptedGroupInnerChatStarter implements AccountControllersProvide } } - private Pair getNextUninitializedInnerChat() { + private Pair findNextInnerChatToInitialize() { Pair uninitializedInnerChat = getNextSecondaryChat(); if (uninitializedInnerChat == null) { uninitializedInnerChat = getNextPrimaryChat(); @@ -129,21 +129,23 @@ public class EncryptedGroupInnerChatStarter implements AccountControllersProvide @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 @@ public class EncryptedGroupInnerChatStarter implements AccountControllersProvide } } - 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 bbe2d8c73..e97c73b0c 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 class EncryptedGroupProtocol implements AccountControllersProvider { 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 87e116206..75fe9e182 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.ElementType; 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 @@ public class EncryptedGroupServiceMessagesHandler implements AccountControllersP } 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 @@ public class EncryptedGroupServiceMessagesHandler implements AccountControllersP 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 @@ public class EncryptedGroupServiceMessagesHandler implements AccountControllersP 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 @@ public class EncryptedGroupServiceMessagesHandler implements AccountControllersP 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 @@ public class EncryptedGroupServiceMessagesHandler implements AccountControllersP } 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 3853bc1e2..e77991aaa 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.AvatarDrawable; 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 class EncryptedGroupUtils implements AccountControllersProvider { 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 class EncryptedGroupUtils implements AccountControllersProvider { 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 class EncryptedGroupUtils implements AccountControllersProvider { } } - public boolean doForEachInnerDialogIdIfNeeded(long encryptedGroupDialogId, Consumer action) { + public boolean forEachInnerDialogIdIfEncryptedGroup(long encryptedGroupDialogId, Consumer action) { if (!DialogObject.isEncryptedDialog(encryptedGroupDialogId)) { return false; } @@ -225,9 +224,9 @@ public class EncryptedGroupUtils implements AccountControllersProvider { } 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 @@ public class EncryptedGroupUtils implements AccountControllersProvider { 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 class EncryptedGroupUtils implements AccountControllersProvider { 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 class EncryptedGroupUtils implements AccountControllersProvider { 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 class EncryptedGroupUtils implements AccountControllersProvider { } 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 class EncryptedGroupUtils implements AccountControllersProvider { } } - 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 13f27a72a..a265c4d38 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.ArrayList; 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 abstract class AbstractCreateGroupAction extends EncryptedGroupAction { 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 82cf05cab..06cfc4859 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.Retention; 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 1893b983e..5686c769e 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 @@ package org.telegram.messenger.partisan.secretgroups.action; 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 class StartSecondaryInnerChatAction extends EncryptedGroupAction { 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 bfb59f636..0b83f271d 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 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not 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 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not } } - 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 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not 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 class ChatActivity extends BaseFragment implements NotificationCenter.Not Bundle args = new Bundle(); args.putBoolean("scrollToTopOnResume", scrollToTopOnResume); if (DialogObject.isEncryptedDialog(did)) { - if (!getEncryptedGroupUtils().putEncIdOrEncGroupIdInBundle(args, did)) { + if (!getEncryptedGroupUtils().putEncIdOrEncGroupIdInBundleIfPossible(args, did)) { return true; } } else { 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 4abeb07f3..31dbd97be 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/SharedMediaLayout.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/SharedMediaLayout.java @@ -92,7 +92,6 @@ import org.telegram.messenger.Utilities; import org.telegram.messenger.browser.Browser; import org.telegram.messenger.fakepasscode.FakePasscodeUtils; import org.telegram.messenger.partisan.Utils; -import org.telegram.messenger.partisan.secretgroups.EncryptedGroupUtils; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.TLObject; import org.telegram.tgnet.TLRPC; @@ -4690,7 +4689,7 @@ public class SharedMediaLayout extends FrameLayout implements NotificationCenter Bundle args1 = new Bundle(); args1.putBoolean("scrollToTopOnResume", true); if (DialogObject.isEncryptedDialog(did)) { - if (!profileActivity.getEncryptedGroupUtils().putEncIdOrEncGroupIdInBundle(args1, did)) { + if (!profileActivity.getEncryptedGroupUtils().putEncIdOrEncGroupIdInBundleIfPossible(args1, did)) { return true; } } else { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java index 6e350c810..abc9ff6ba 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/DialogsActivity.java @@ -140,7 +140,6 @@ import org.telegram.messenger.partisan.appmigration.MigrationZipBuilder; import org.telegram.messenger.partisan.fileprotection.FileProtectionTemporaryDisabledDialog; import org.telegram.messenger.partisan.secretgroups.EncryptedGroup; import org.telegram.messenger.partisan.verification.VerificationUpdatesChecker; -import org.telegram.messenger.voip.ConferenceCall; import org.telegram.tgnet.ConnectionsManager; import org.telegram.tgnet.SerializedData; import org.telegram.tgnet.TLObject; @@ -8334,7 +8333,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter. } else { Bundle args = new Bundle(); if (DialogObject.isEncryptedDialog(dialogId)) { - if (!getEncryptedGroupUtils().putEncIdOrEncGroupIdInBundle(args, dialogId)) { + if (!getEncryptedGroupUtils().putEncIdOrEncGroupIdInBundleIfPossible(args, dialogId)) { EncryptedGroup encryptedGroup = getMessagesController() .getEncryptedGroup(DialogObject.getEncryptedChatId(dialogId)); getEncryptedGroupUtils().showSecretGroupJoinDialog(encryptedGroup, this, () -> { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java index 514dd65a9..3f6471326 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 @@ public class LaunchActivity extends BasePermissionsActivity implements INavigati } } 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 class LaunchActivity extends BasePermissionsActivity implements INavigati NotificationCenter.getInstance(account).postNotificationName(NotificationCenter.closeChats); } if (DialogObject.isEncryptedDialog(did)) { - if (!new EncryptedGroupUtils(account).putEncIdOrEncGroupIdInBundle(args, did)) { + if (!new EncryptedGroupUtils(account).putEncIdOrEncGroupIdInBundleIfPossible(args, did)) { return false; } } else if (DialogObject.isUserDialog(did)) { From f72ab007f318a294f25897b9ecd81661592da5aa Mon Sep 17 00:00:00 2001 From: vivabelarus <74508922+vivabelarus@users.noreply.github.com> 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 f5d9ad1f8..05c13cbe5 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 f50e61e32..ffb01e465 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 a80872675..a0e5f7119 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 0c2af23b6..3f7675c21 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 @@ package org.telegram.messenger.partisan.secretgroups; 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 c081cd9a2..140b2ffe1 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 class EncryptedGroupCreateActivity extends BaseFragment implements Notifi 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 a59c4ba93..4e4e0d2bf 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 140b2ffe1..f2536ba4d 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 class EncryptedGroupCreateActivity extends BaseFragment implements Notifi 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 class EncryptedGroupCreateActivity extends BaseFragment implements Notifi 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 class EncryptedGroupCreateActivity extends BaseFragment implements Notifi 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 class EncryptedGroupCreateActivity extends BaseFragment implements Notifi 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 class EncryptedGroupCreateActivity extends BaseFragment implements Notifi 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 @@ public class EncryptedGroupCreateActivity extends BaseFragment implements Notifi 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 @@ public class EncryptedGroupCreateActivity extends BaseFragment implements Notifi 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 @@ public class EncryptedGroupCreateActivity extends BaseFragment implements Notifi }; 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 class EncryptedGroupCreateActivity extends BaseFragment implements Notifi 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 33bef18ae..6af8cf3c5 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 class SendMessagesHelper extends BaseController implements NotificationCe } 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 0b83f271d..e88567878 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 class ChatActivity extends BaseFragment implements NotificationCenter.Not } 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 e88567878..1fcf79bd2 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 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not 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 b8785493f..5d1854bc4 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 4a2280756..982262b8b 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 @@ package org.telegram.messenger.partisan; 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 9528ac878..91471f898 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 @@ public class GroupCallActivity extends BottomSheet implements NotificationCenter 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 ffb01e465..fd6477553 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 f2536ba4d..9430aac7a 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 class EncryptedGroupCreateActivity extends BaseFragment implements Notifi 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 5d1854bc4..831448fa4 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 982262b8b..23250d430 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 @@ package org.telegram.messenger.partisan; 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; }