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