diff --git a/.github/workflows/alpha.yml b/.github/workflows/alpha.yml
index e71506752..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-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 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..fd6477553 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 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/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/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/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/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);
}
}
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..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();
@@ -191,7 +184,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()) {
@@ -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/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));
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..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 = 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 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/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/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 1f06fcabb..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
@@ -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;
@@ -36,10 +38,10 @@ 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.stream.Collectors;
@@ -127,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) {
@@ -326,6 +320,7 @@ public class EncryptedGroupServiceMessagesHandler implements AccountControllersP
getEncryptedGroupProtocol().sendNewAvatar(encryptedGroup, encryptedChat);
}
syncNewInnerChatTtl();
+ syncNewInnerChatNotificationSettings();
AndroidUtilities.runOnUIThread(() -> {
getNotificationCenter().postNotificationName(NotificationCenter.dialogsNeedReload);
getNotificationCenter().postNotificationName(NotificationCenter.encryptedGroupUpdated, encryptedGroup);
@@ -348,11 +343,47 @@ 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);
getMessagesStorage().updateEncryptedGroup(encryptedGroup);
- getEncryptedGroupUtils().checkAllEncryptedChatsCreated(encryptedGroup);
+ getEncryptedGroupUtils().finalizeEncryptedGroupIfAllChatsCreated(encryptedGroup);
AndroidUtilities.runOnUIThread(() -> {
getNotificationCenter().postNotificationName(NotificationCenter.dialogsNeedReload);
getNotificationCenter().postNotificationName(NotificationCenter.encryptedGroupUpdated, encryptedGroup);
@@ -371,13 +402,14 @@ 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);
getNotificationCenter().postNotificationName(NotificationCenter.encryptedGroupUpdated, encryptedGroup);
});
syncNewInnerChatTtl();
+ syncNewInnerChatNotificationSettings();
return null;
}
@@ -397,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);
@@ -453,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/messenger/partisan/secretgroups/ui/EncryptedGroupCreateActivity.java b/TMessagesProj/src/main/java/org/telegram/messenger/partisan/secretgroups/ui/EncryptedGroupCreateActivity.java
index c081cd9a2..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
@@ -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,53 +701,37 @@ 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
+ if (getFullMembersCount() == maxCount) {
+ showLimitReachedDialog();
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());
- 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 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));
}
}
@@ -930,7 +928,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();
@@ -955,8 +953,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();
@@ -1198,7 +1196,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;
@@ -1212,12 +1210,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();
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();
diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java
index 5aced7913..1fcf79bd2 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 class ChatActivity extends BaseFragment implements NotificationCenter.Not
@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 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());
}
@@ -14068,10 +14075,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;
+ });
}
}
});
@@ -21113,9 +21122,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 {
@@ -24364,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<>());
}
@@ -24376,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));
@@ -24385,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) {
@@ -25619,7 +25630,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;
@@ -30568,40 +30579,22 @@ 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) {
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);
}
@@ -30609,6 +30602,54 @@ 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 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)) {
@@ -33548,18 +33589,22 @@ 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 {
- 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 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 {
@@ -43793,6 +43838,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];
}
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/AvatarDrawable.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/AvatarDrawable.java
index 01d5484da..b09f210b9 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) {
@@ -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) {
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);
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..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;
@@ -4617,7 +4616,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);
@@ -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/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()) {
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)) {
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);
}
}
}
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