From 1cb39c9b5f77c31a19cdf9cea845467924c2f144 Mon Sep 17 00:00:00 2001 From: ThomasSession Date: Fri, 14 Feb 2025 00:24:18 +0200 Subject: [PATCH] QA fixes for Groups V2 (#946) * SES-3303 - proper URL for groups banner * SES-3301 - fixing display of legacy group control mesasges * SES-3304 - No admin state dialogs while DEPRECATED Updated debug menu with confirm dialog when changing deprecation state * SES-3307 fixing legacy user view * SES-3308 - not overwritting the last character in group banners --- .../conversation/v2/ConversationActivityV2.kt | 5 +- .../conversation/v2/ConversationViewModel.kt | 1 + .../v2/menus/ConversationMenuHelper.kt | 20 ++++-- .../database/model/MessageRecord.java | 4 +- .../securesms/debugmenu/DebugMenu.kt | 33 ++++++--- .../securesms/debugmenu/DebugMenuViewModel.kt | 45 ++++++++++-- .../securesms/home/HomeActivity.kt | 12 +++- app/src/main/res/layout/view_user.xml | 15 ++-- .../utilities/UpdateMessageBuilder.kt | 71 +++++++++---------- 9 files changed, 142 insertions(+), 64 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt index d1fad5b238..1f00b57b2d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt @@ -855,6 +855,9 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe binding.outdatedGroupBanner.isVisible = true binding.outdatedGroupBanner.text = SpannableStringBuilder(banner) .apply { + // Append a space as a placeholder + append(" ") + // we need to add the inline icon val drawable = ContextCompat.getDrawable(this@ConversationActivityV2, R.drawable.ic_external)!! val imageSize = toPx(10, resources) @@ -874,7 +877,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe } binding.outdatedGroupBanner.setOnClickListener { - showOpenUrlDialog("https://getsession.org/blog/session-groups-v2") + showOpenUrlDialog("https://getsession.org/groups") } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt index fa081dabf6..42fa0c06d7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt @@ -1049,6 +1049,7 @@ class ConversationViewModel( factory = configFactory, storage = storage, groupManager = groupManagerV2, + deprecationManager = legacyGroupDeprecationManager, ) if (inProgress != null) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationMenuHelper.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationMenuHelper.kt index fe870694fe..fa23f72563 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationMenuHelper.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationMenuHelper.kt @@ -192,6 +192,7 @@ object ConversationMenuHelper { factory: ConfigFactory, storage: StorageProtocol, groupManager: GroupManagerV2, + deprecationManager: LegacyGroupDeprecationManager, ): ReceiveChannel? { when (item.itemId) { R.id.menu_view_all_media -> { showAllMedia(context, thread) } @@ -205,7 +206,9 @@ object ConversationMenuHelper { R.id.menu_copy_open_group_url -> { copyOpenGroupUrl(context, thread) } R.id.menu_edit_group -> { editGroup(context, thread) } R.id.menu_group_members -> { showGroupMembers(context, thread) } - R.id.menu_leave_group -> { return leaveGroup(context, thread, threadID, factory, storage, groupManager) } + R.id.menu_leave_group -> { return leaveGroup( + context, thread, threadID, factory, storage, groupManager, deprecationManager + ) } R.id.menu_invite_to_open_group -> { inviteContacts(context, thread) } R.id.menu_unmute_notifications -> { unmute(context, thread) } R.id.menu_mute_notifications -> { mute(context, thread) } @@ -374,20 +377,27 @@ object ConversationMenuHelper { configFactory: ConfigFactory, storage: StorageProtocol, groupManager: GroupManagerV2, + deprecationManager: LegacyGroupDeprecationManager, ): ReceiveChannel? { val channel = Channel() when { thread.isLegacyGroupRecipient -> { val group = DatabaseComponent.get(context).groupDatabase().getGroup(thread.address.toGroupString()).orNull() - val admins = group.admins - val accountID = TextSecurePreferences.getLocalNumber(context) - val isCurrentUserAdmin = admins.any { it.toString() == accountID } + + // we do not want admin related messaging once legacy groups are deprecated + val isGroupAdmin = if(deprecationManager.isDeprecated){ + false + } else { // prior to the deprecated state, calculate admin rights properly + val admins = group.admins + val accountID = TextSecurePreferences.getLocalNumber(context) + admins.any { it.toString() == accountID } + } confirmAndLeaveGroup( context = context, groupName = group.title, - isAdmin = isCurrentUserAdmin, + isAdmin = isGroupAdmin, isKicked = configFactory.wasKickedFromGroupV2(thread), threadID = threadID, storage = storage, diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java index 7e5e9ced9d..041f7c53a8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java @@ -140,13 +140,13 @@ public abstract class MessageRecord extends DisplayRecord { UpdateMessageData updateMessageData = getGroupUpdateMessage(); Recipient groupRecipient = DatabaseComponent.get(context).threadDatabase().getRecipientForThreadId(getThreadId()); - if (updateMessageData == null || groupRecipient == null || !groupRecipient.isGroupV2Recipient()) { + if (updateMessageData == null || groupRecipient == null) { return ""; } SpannableString text = new SpannableString(UpdateMessageBuilder.buildGroupUpdateMessage( context, - new AccountId(groupRecipient.getAddress().serialize()), + groupRecipient.isGroupV2Recipient() ? new AccountId(groupRecipient.getAddress().serialize()) : null, // accountId is only used for GroupsV2 updateMessageData, MessagingModuleConfiguration.getShared().getConfigFactory(), isOutgoing(), diff --git a/app/src/main/java/org/thoughtcrime/securesms/debugmenu/DebugMenu.kt b/app/src/main/java/org/thoughtcrime/securesms/debugmenu/DebugMenu.kt index 1c72819e4e..f45c8ebbad 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/debugmenu/DebugMenu.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/debugmenu/DebugMenu.kt @@ -1,6 +1,5 @@ package org.thoughtcrime.securesms.debugmenu -import android.widget.TimePicker import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement @@ -44,9 +43,7 @@ import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.tooling.preview.Preview import network.loki.messenger.BuildConfig import network.loki.messenger.R -import org.thoughtcrime.securesms.debugmenu.DebugMenuViewModel.Commands.ChangeEnvironment -import org.thoughtcrime.securesms.debugmenu.DebugMenuViewModel.Commands.HideEnvironmentWarningDialog -import org.thoughtcrime.securesms.debugmenu.DebugMenuViewModel.Commands.ShowEnvironmentWarningDialog +import org.thoughtcrime.securesms.debugmenu.DebugMenuViewModel.Commands.* import org.session.libsession.messaging.groups.LegacyGroupDeprecationManager import org.thoughtcrime.securesms.ui.AlertDialog import org.thoughtcrime.securesms.ui.Cell @@ -106,6 +103,25 @@ fun DebugMenu( } // Alert dialogs + if (uiState.showDeprecatedStateWarningDialog) { + AlertDialog( + onDismissRequest = { sendCommand(HideEnvironmentWarningDialog) }, + title = "Are you sure you want to change the deprecation state?", + text = "This will restart the app...", + showCloseButton = false, // don't display the 'x' button + buttons = listOf( + DialogButtonModel( + text = GetString(R.string.cancel), + onClick = { sendCommand(HideDeprecationChangeDialog) } + ), + DialogButtonModel( + text = GetString(R.string.ok), + onClick = { sendCommand(OverrideDeprecationState) } + ) + ) + ) + } + if (uiState.showEnvironmentWarningDialog) { AlertDialog( onDismissRequest = { sendCommand(HideEnvironmentWarningDialog) }, @@ -125,8 +141,8 @@ fun DebugMenu( ) } - if (uiState.showEnvironmentLoadingDialog) { - LoadingDialog(title = "Changing Environment...") + if (uiState.showLoadingDialog) { + LoadingDialog(title = "Applying changes...") } Column( @@ -204,7 +220,7 @@ fun DebugMenu( val override = LegacyGroupDeprecationManager.DeprecationState.entries .firstOrNull { it.displayName == selected } - sendCommand(DebugMenuViewModel.Commands.OverrideDeprecationState(override)) + sendCommand(ShowDeprecationChangeDialog(override)) } DebugRow(title = "Deprecating start date", modifier = Modifier.clickable { @@ -414,7 +430,8 @@ fun PreviewDebugMenu() { environments = listOf("Development", "Production"), snackMessage = null, showEnvironmentWarningDialog = false, - showEnvironmentLoadingDialog = false, + showLoadingDialog = false, + showDeprecatedStateWarningDialog = false, hideMessageRequests = true, hideNoteToSelf = false, forceDeprecationState = null, diff --git a/app/src/main/java/org/thoughtcrime/securesms/debugmenu/DebugMenuViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/debugmenu/DebugMenuViewModel.kt index eb450386b2..68020da575 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/debugmenu/DebugMenuViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/debugmenu/DebugMenuViewModel.kt @@ -34,7 +34,8 @@ class DebugMenuViewModel @Inject constructor( environments = Environment.entries.map { it.label }, snackMessage = null, showEnvironmentWarningDialog = false, - showEnvironmentLoadingDialog = false, + showLoadingDialog = false, + showDeprecatedStateWarningDialog = false, hideMessageRequests = textSecurePreferences.hasHiddenMessageRequests(), hideNoteToSelf = textSecurePreferences.hasHiddenNoteToSelf(), forceDeprecationState = deprecationManager.deprecationStateOverride.value, @@ -48,6 +49,8 @@ class DebugMenuViewModel @Inject constructor( private var temporaryEnv: Environment? = null + private var temporaryDeprecatedState: LegacyGroupDeprecationManager.DeprecationState? = null + fun onCommand(command: Commands) { when (command) { is Commands.ChangeEnvironment -> changeEnvironment() @@ -72,8 +75,19 @@ class DebugMenuViewModel @Inject constructor( } is Commands.OverrideDeprecationState -> { - deprecationManager.overrideDeprecationState(command.state) - _uiState.value = _uiState.value.copy(forceDeprecationState = command.state) + if(temporaryDeprecatedState == null) return + + _uiState.value = _uiState.value.copy(forceDeprecationState = temporaryDeprecatedState, + showLoadingDialog = true) + + deprecationManager.overrideDeprecationState(temporaryDeprecatedState) + + + // restart app + viewModelScope.launch { + delay(500) // giving time to save data + ApplicationContext.getInstance(application).restartApplication() + } } is Commands.OverrideDeprecatedTime -> { @@ -85,6 +99,12 @@ class DebugMenuViewModel @Inject constructor( deprecationManager.overrideDeprecatingStartTime(command.time) _uiState.value = _uiState.value.copy(deprecatingStartTime = command.time) } + + is Commands.HideDeprecationChangeDialog -> + _uiState.value = _uiState.value.copy(showDeprecatedStateWarningDialog = false) + + is Commands.ShowDeprecationChangeDialog -> + showDeprecatedStateWarningDialog(command.state) } } @@ -103,7 +123,7 @@ class DebugMenuViewModel @Inject constructor( // show a loading state _uiState.value = _uiState.value.copy( showEnvironmentWarningDialog = false, - showEnvironmentLoadingDialog = true + showLoadingDialog = true ) // clear remote and local data, then restart the app @@ -117,7 +137,7 @@ class DebugMenuViewModel @Inject constructor( } else { _uiState.value = _uiState.value.copy( showEnvironmentWarningDialog = false, - showEnvironmentLoadingDialog = false + showLoadingDialog = false ) Log.e(TAG, "Failed to force sync when deleting data") _uiState.value = _uiState.value.copy(snackMessage = "Sorry, something went wrong...") @@ -127,12 +147,21 @@ class DebugMenuViewModel @Inject constructor( } } + private fun showDeprecatedStateWarningDialog(state: LegacyGroupDeprecationManager.DeprecationState?) { + if(state == _uiState.value.forceDeprecationState) return + + temporaryDeprecatedState = state + + _uiState.value = _uiState.value.copy(showDeprecatedStateWarningDialog = true) + } + data class UIState( val currentEnvironment: String, val environments: List, val snackMessage: String?, val showEnvironmentWarningDialog: Boolean, - val showEnvironmentLoadingDialog: Boolean, + val showLoadingDialog: Boolean, + val showDeprecatedStateWarningDialog: Boolean, val hideMessageRequests: Boolean, val hideNoteToSelf: Boolean, val forceDeprecationState: LegacyGroupDeprecationManager.DeprecationState?, @@ -147,7 +176,9 @@ class DebugMenuViewModel @Inject constructor( object HideEnvironmentWarningDialog : Commands() data class HideMessageRequest(val hide: Boolean) : Commands() data class HideNoteToSelf(val hide: Boolean) : Commands() - data class OverrideDeprecationState(val state: LegacyGroupDeprecationManager.DeprecationState?) : Commands() + data class ShowDeprecationChangeDialog(val state: LegacyGroupDeprecationManager.DeprecationState?) : Commands() + object HideDeprecationChangeDialog : Commands() + object OverrideDeprecationState : Commands() data class OverrideDeprecatedTime(val time: ZonedDateTime) : Commands() data class OverrideDeprecatingStartTime(val time: ZonedDateTime) : Commands() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/home/HomeActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/home/HomeActivity.kt index e3aaa86e4f..99e7518c1f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/home/HomeActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/home/HomeActivity.kt @@ -35,6 +35,7 @@ import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode import org.session.libsession.messaging.groups.GroupManagerV2 +import org.session.libsession.messaging.groups.LegacyGroupDeprecationManager import org.session.libsession.messaging.jobs.JobQueue import org.session.libsession.messaging.sending_receiving.notifications.MessageNotifier import org.session.libsession.snode.SnodeClock @@ -101,6 +102,7 @@ class HomeActivity : PassphraseRequiredActionBarActivity(), @Inject lateinit var textSecurePreferences: TextSecurePreferences @Inject lateinit var configFactory: ConfigFactory @Inject lateinit var groupManagerV2: GroupManagerV2 + @Inject lateinit var deprecationManager: LegacyGroupDeprecationManager @Inject lateinit var lokiThreadDatabase: LokiThreadDatabase @Inject lateinit var sessionJobDatabase: SessionJobDatabase @Inject lateinit var clock: SnodeClock @@ -589,6 +591,7 @@ class HomeActivity : PassphraseRequiredActionBarActivity(), configFactory = configFactory, storage = storage, groupManager = groupManagerV2, + deprecationManager = deprecationManager ) return @@ -636,7 +639,14 @@ class HomeActivity : PassphraseRequiredActionBarActivity(), positiveButtonId = R.string.leave // If you are an admin of this group you can delete it - if (group != null && group.admins.map { it.toString() }.contains(textSecurePreferences.getLocalNumber())) { + // we do not want admin related messaging once legacy groups are deprecated + val isGroupAdmin = if(deprecationManager.isDeprecated){ + false + } else { // prior to the deprecated state, calculate admin rights properly + group.admins.map { it.toString() }.contains(textSecurePreferences.getLocalNumber()) + } + + if (group != null && isGroupAdmin) { title = getString(R.string.groupLeave) message = Phrase.from(this, R.string.groupLeaveDescriptionAdmin) .put(GROUP_NAME_KEY, group.title) diff --git a/app/src/main/res/layout/view_user.xml b/app/src/main/res/layout/view_user.xml index 5ad9e503d7..c488759450 100644 --- a/app/src/main/res/layout/view_user.xml +++ b/app/src/main/res/layout/view_user.xml @@ -18,22 +18,29 @@ + android:layout_height="wrap_content" + android:paddingVertical="@dimen/medium_spacing" + android:clipToPadding="false" + android:clipChildren="false"> + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + android:clipToPadding="false" + android:clipChildren="false"/> { Phrase.from(context, R.string.legacyGroupMemberNew) - .put(NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(0))) + .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0))) .format() } 2 -> { Phrase.from(context, R.string.legacyGroupMemberTwoNew) - .put(NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(0))) - .put(OTHER_NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(1))) + .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0))) + .put(OTHER_NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(1))) .format() } else -> { val newMemberCountMinusOne = newMemberCount - 1 Phrase.from(context, R.string.legacyGroupMemberNewMultiple) - .put(NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(0))) + .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0))) .put(COUNT_KEY, newMemberCountMinusOne) .format() } @@ -126,14 +126,14 @@ object UpdateMessageBuilder { "" // Return an empty string - we don't want to show the error in the conversation } 1 -> Phrase.from(context, R.string.groupRemoved) - .put(NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(0))) + .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0))) .format() 2 -> Phrase.from(context, R.string.groupRemovedTwo) - .put(NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(0))) - .put(OTHER_NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(1))) + .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0))) + .put(OTHER_NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(1))) .format() else -> Phrase.from(context, R.string.groupRemovedMultiple) - .put(NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(0))) + .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0))) .put(COUNT_KEY, updateData.updatedMembers.size - 1) .format() } @@ -150,14 +150,14 @@ object UpdateMessageBuilder { "" // Return an empty string - we don't want to show the error in the conversation } 1 -> Phrase.from(context, R.string.groupRemoved) - .put(NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(0))) + .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0))) .format() 2 -> Phrase.from(context, R.string.groupRemovedTwo) - .put(NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(0))) - .put(OTHER_NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(1))) + .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0))) + .put(OTHER_NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(1))) .format() else -> Phrase.from(context, R.string.groupRemovedMultiple) - .put(NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(0))) + .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0))) .put(COUNT_KEY, updateData.updatedMembers.size - 1) .format() } @@ -173,14 +173,14 @@ object UpdateMessageBuilder { "" // Return an empty string - we don't want to show the error in the conversation } 1 -> Phrase.from(context, R.string.groupMemberLeft) - .put(NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(0))) + .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0))) .format() 2 -> Phrase.from(context, R.string.groupMemberLeftTwo) - .put(NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(0))) - .put(OTHER_NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(1))) + .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0))) + .put(OTHER_NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(1))) .format() else -> Phrase.from(context, R.string.groupMemberLeftMultiple) - .put(NAME_KEY, getGroupMemberName(groupId, updateData.updatedMembers.elementAt(0))) + .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.updatedMembers.elementAt(0))) .put(COUNT_KEY, updateData.updatedMembers.size - 1) .format() } @@ -208,16 +208,16 @@ object UpdateMessageBuilder { .format() number == 1 -> Phrase.from(context, if (historyShared) R.string.groupMemberNewHistory else R.string.groupMemberNew) - .put(NAME_KEY, getGroupMemberName(groupId, updateData.sessionIds.first())) + .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first())) .format() number == 2 && containsUser -> Phrase.from(context, if (historyShared) R.string.groupMemberNewYouHistoryTwo else R.string.groupInviteYouAndOtherNew) - .put(OTHER_NAME_KEY, getGroupMemberName(groupId, updateData.sessionIds.first { it != userPublicKey })) + .put(OTHER_NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first { it != userPublicKey })) .format() number == 2 -> Phrase.from(context, if (historyShared) R.string.groupMemberNewHistoryTwo else R.string.groupMemberNewTwo) - .put(NAME_KEY, getGroupMemberName(groupId, updateData.sessionIds.first())) - .put(OTHER_NAME_KEY, getGroupMemberName(groupId, updateData.sessionIds.last())) + .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first())) + .put(OTHER_NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.last())) .format() containsUser -> Phrase.from(context, if (historyShared) R.string.groupMemberNewYouHistoryMultiple else R.string.groupInviteYouAndMoreNew) @@ -225,7 +225,7 @@ object UpdateMessageBuilder { .format() number > 0 -> Phrase.from(context, if (historyShared) R.string.groupMemberNewHistoryMultiple else R.string.groupMemberNewMultiple) - .put(NAME_KEY, getGroupMemberName(groupId, updateData.sessionIds.first())) + .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first())) .put(COUNT_KEY, updateData.sessionIds.size - 1) .format() else -> "" @@ -239,16 +239,16 @@ object UpdateMessageBuilder { ) number == 1 -> Phrase.from(context, R.string.adminPromotedToAdmin) - .put(NAME_KEY, getGroupMemberName(groupId, updateData.sessionIds.first())) + .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first())) .format() number == 2 && containsUser -> Phrase.from(context, R.string.groupPromotedYouTwo) - .put(OTHER_NAME_KEY, getGroupMemberName(groupId, updateData.sessionIds.first{ it != userPublicKey })) + .put(OTHER_NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first{ it != userPublicKey })) .format() number == 2 -> Phrase.from(context, R.string.adminTwoPromotedToAdmin) - .put(NAME_KEY, getGroupMemberName(groupId, updateData.sessionIds.first())) - .put(OTHER_NAME_KEY, getGroupMemberName(groupId, updateData.sessionIds.last())) + .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first())) + .put(OTHER_NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.last())) .format() containsUser -> Phrase.from(context, R.string.groupPromotedYouMultiple) @@ -256,7 +256,7 @@ object UpdateMessageBuilder { .format() else -> Phrase.from(context, R.string.adminMorePromotedToAdmin) - .put(NAME_KEY, getGroupMemberName(groupId, updateData.sessionIds.first())) + .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first())) .put(COUNT_KEY, updateData.sessionIds.size - 1) .format() } @@ -268,16 +268,16 @@ object UpdateMessageBuilder { R.string.groupRemovedYouGeneral).format() number == 1 -> Phrase.from(context, R.string.groupRemoved) - .put(NAME_KEY, getGroupMemberName(groupId, updateData.sessionIds.first())) + .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first())) .format() number == 2 && containsUser -> Phrase.from(context, R.string.groupRemovedYouTwo) - .put(OTHER_NAME_KEY, getGroupMemberName(groupId, updateData.sessionIds.first { it != userPublicKey })) + .put(OTHER_NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first { it != userPublicKey })) .format() number == 2 -> Phrase.from(context, R.string.groupRemovedTwo) - .put(NAME_KEY, getGroupMemberName(groupId, updateData.sessionIds.first())) - .put(OTHER_NAME_KEY, getGroupMemberName(groupId, updateData.sessionIds.last())) + .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first())) + .put(OTHER_NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.last())) .format() containsUser -> Phrase.from(context, R.string.groupRemovedYouMultiple) @@ -285,7 +285,7 @@ object UpdateMessageBuilder { .format() else -> Phrase.from(context, R.string.groupRemovedMultiple) - .put(NAME_KEY, getGroupMemberName(groupId, updateData.sessionIds.first())) + .put(NAME_KEY, getGroupMemberName(groupV2Id, updateData.sessionIds.first())) .put(COUNT_KEY, updateData.sessionIds.size - 1) .format() } @@ -295,7 +295,7 @@ object UpdateMessageBuilder { } is UpdateMessageData.Kind.GroupInvitation -> { val approved = configFactory.getGroup(AccountId(updateData.groupAccountId))?.invited == false - val inviterName = updateData.invitingAdminName?.takeIf { it.isNotEmpty() } ?: getGroupMemberName(groupId, updateData.invitingAdminId) + val inviterName = updateData.invitingAdminName?.takeIf { it.isNotEmpty() } ?: getGroupMemberName(groupV2Id, updateData.invitingAdminId) return if (!approved) { Phrase.from(context, R.string.messageRequestGroupInvite) .put(NAME_KEY, inviterName) @@ -321,7 +321,6 @@ object UpdateMessageBuilder { } } - private fun Context.youOrSender(sessionId: String) = if (storage.getUserPublicKey() == sessionId) getString(R.string.you) else getSenderName(sessionId) fun buildExpirationTimerMessage( context: Context,