From f3b8dd5d3706b7ef12f84c5895a9d06f66aa820d Mon Sep 17 00:00:00 2001 From: SessionHero01 <180888785+SessionHero01@users.noreply.github.com> Date: Mon, 17 Feb 2025 14:31:56 +1100 Subject: [PATCH] Do not send control message for re-invite/re-promote (#951) --- .../securesms/groups/EditGroupViewModel.kt | 32 ++++++++++++++++--- .../securesms/groups/GroupManagerV2Impl.kt | 22 +++++++++---- .../messaging/groups/GroupManagerV2.kt | 6 ++-- 3 files changed, 46 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/EditGroupViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/groups/EditGroupViewModel.kt index 9cce7af915..9adf50c361 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/EditGroupViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/EditGroupViewModel.kt @@ -17,6 +17,7 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import network.loki.messenger.R +import network.loki.messenger.libsession_util.getOrNull import org.session.libsession.database.StorageProtocol import org.session.libsession.messaging.groups.GroupInviteException import org.session.libsession.messaging.groups.GroupManagerV2 @@ -92,18 +93,39 @@ class EditGroupViewModel @AssistedInject constructor( groupManager.inviteMembers( groupId, contacts.toList(), - shareHistory = false + shareHistory = false, + isReinvite = false, ) } } fun onResendInviteClicked(contactSessionId: AccountId) { - onContactSelected(setOf(contactSessionId)) + performGroupOperation( + showLoading = false, + errorMessage = { err -> + if (err is GroupInviteException) { + err.format(context, storage).toString() + } else { + null + } + } + ) { + val historyShared = configFactory.withGroupConfigs(groupId) { + it.groupMembers.getOrNull(contactSessionId.hexString) + }?.supplement == true + + groupManager.inviteMembers( + groupId, + listOf(contactSessionId), + shareHistory = historyShared, + isReinvite = true, + ) + } } fun onPromoteContact(memberSessionId: AccountId) { performGroupOperation(showLoading = false) { - groupManager.promoteMember(groupId, listOf(memberSessionId)) + groupManager.promoteMember(groupId, listOf(memberSessionId), isRepromote = false) } } @@ -118,7 +140,9 @@ class EditGroupViewModel @AssistedInject constructor( } fun onResendPromotionClicked(memberSessionId: AccountId) { - onPromoteContact(memberSessionId) + performGroupOperation(showLoading = false) { + groupManager.promoteMember(groupId, listOf(memberSessionId), isRepromote = true) + } } fun onEditNameClicked() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2Impl.kt b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2Impl.kt index 558d8e8327..0d53ac26c7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2Impl.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2Impl.kt @@ -206,7 +206,8 @@ class GroupManagerV2Impl @Inject constructor( override suspend fun inviteMembers( group: AccountId, newMembers: List, - shareHistory: Boolean + shareHistory: Boolean, + isReinvite: Boolean ): Unit = scope.launchAndWait(group, "Invite members") { val adminKey = requireAdminAccess(group) val groupAuth = OwnedSwarmAuth.ofClosedGroup(group, adminKey) @@ -265,7 +266,9 @@ class GroupManagerV2Impl @Inject constructor( ) // Send a group update message to the group telling members someone has been invited - sendGroupUpdateForAddingMembers(group, adminKey, newMembers) + if (!isReinvite) { + sendGroupUpdateForAddingMembers(group, adminKey, newMembers) + } // Call the API try { @@ -496,7 +499,8 @@ class GroupManagerV2Impl @Inject constructor( override suspend fun promoteMember( group: AccountId, - members: List + members: List, + isRepromote: Boolean ): Unit = scope.launchAndWait(group, "Promote member") { withContext(SupervisorJob()) { val adminKey = requireAdminAccess(group) @@ -530,9 +534,11 @@ class GroupManagerV2Impl @Inject constructor( sentTimestamp = timestamp } - // Insert the message locally immediately so we can see the incoming change - // The same message will be sent later to the group - storage.insertGroupInfoChange(message, group) + if (!isRepromote) { + // Insert the message locally immediately so we can see the incoming change + // The same message will be sent later to the group + storage.insertGroupInfoChange(message, group) + } // Send out the promote message to the members concurrently val promoteMessage = GroupUpdated( @@ -578,7 +584,9 @@ class GroupManagerV2Impl @Inject constructor( } - MessageSender.sendAndAwait(message, Address.fromSerialized(group.hexString)) + if (!isRepromote) { + MessageSender.sendAndAwait(message, Address.fromSerialized(group.hexString)) + } } } /** diff --git a/libsession/src/main/java/org/session/libsession/messaging/groups/GroupManagerV2.kt b/libsession/src/main/java/org/session/libsession/messaging/groups/GroupManagerV2.kt index c53e172f66..02bfd32f2c 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/groups/GroupManagerV2.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/groups/GroupManagerV2.kt @@ -4,7 +4,6 @@ import network.loki.messenger.libsession_util.util.ExpiryMode import org.session.libsession.messaging.messages.control.GroupUpdated import org.session.libsession.utilities.recipients.Recipient import org.session.libsignal.protos.SignalServiceProtos.DataMessage.GroupUpdateDeleteMemberContentMessage -import org.session.libsignal.protos.SignalServiceProtos.DataMessage.GroupUpdateMessage import org.session.libsignal.utilities.AccountId /** @@ -21,7 +20,8 @@ interface GroupManagerV2 { suspend fun inviteMembers( group: AccountId, newMembers: List, - shareHistory: Boolean + shareHistory: Boolean, + isReinvite: Boolean, // Whether this comes from a re-invite ) suspend fun removeMembers( @@ -46,7 +46,7 @@ interface GroupManagerV2 { suspend fun handleMemberLeftMessage(memberId: AccountId, group: AccountId) suspend fun leaveGroup(groupId: AccountId) - suspend fun promoteMember(group: AccountId, members: List) + suspend fun promoteMember(group: AccountId, members: List, isRepromote: Boolean) suspend fun handleInvitation( groupId: AccountId,