From 65b36c006ccbc62471f3ea97a93a005195dddc26 Mon Sep 17 00:00:00 2001 From: jubb Date: Mon, 22 Feb 2021 13:48:48 +1100 Subject: [PATCH 1/4] feat: add notifyUser flag to explicitLeave --- .../securesms/loki/activities/HomeActivity.kt | 2 +- .../securesms/loki/protocol/ClosedGroupsProtocolV2.kt | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt index 88c5eea005..2b88ac196a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt @@ -358,7 +358,7 @@ class HomeActivity : PassphraseRequiredActionBarActivity, ConversationClickListe isSSKBasedClosedGroup = false } if (isSSKBasedClosedGroup) { - ClosedGroupsProtocolV2.explicitLeave(context, groupPublicKey!!) + ClosedGroupsProtocolV2.explicitLeave(context, groupPublicKey!!, notifyUser = false) } else if (!ClosedGroupsProtocol.leaveLegacyGroup(context, recipient)) { Toast.makeText(context, R.string.activity_home_leaving_group_failed_message, Toast.LENGTH_LONG).show() return@launch diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/ClosedGroupsProtocolV2.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/ClosedGroupsProtocolV2.kt index 72103a3df6..b76a51a9f3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/ClosedGroupsProtocolV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/ClosedGroupsProtocolV2.kt @@ -94,8 +94,8 @@ object ClosedGroupsProtocolV2 { return deferred.promise } - @JvmStatic - fun explicitLeave(context: Context, groupPublicKey: String): Promise { + @JvmStatic @JvmOverloads + fun explicitLeave(context: Context, groupPublicKey: String, notifyUser: Boolean = true): Promise { val deferred = deferred() ThreadUtils.queue { val userPublicKey = TextSecurePreferences.getLocalNumber(context)!! @@ -119,7 +119,9 @@ object ClosedGroupsProtocolV2 { // Notify the user val infoType = GroupContext.Type.QUIT val threadID = DatabaseFactory.getThreadDatabase(context).getOrCreateThreadIdFor(Recipient.from(context, Address.fromSerialized(groupID), false)) - insertOutgoingInfoMessage(context, groupID, infoType, name, updatedMembers, admins, threadID, sentTime) + if (notifyUser) { + insertOutgoingInfoMessage(context, groupID, infoType, name, updatedMembers, admins, threadID, sentTime) + } // Remove the group private key and unsubscribe from PNs disableLocalGroupAndUnsubscribe(context, apiDB, groupPublicKey, groupDB, groupID, userPublicKey) deferred.resolve(Unit) From 5db46325a5ea2fe78bbbd6d15fa1b06e547da96f Mon Sep 17 00:00:00 2001 From: jubb Date: Mon, 22 Feb 2021 13:51:48 +1100 Subject: [PATCH 2/4] fix: don't delete group as admin if only one user left --- .../securesms/loki/protocol/ClosedGroupsProtocolV2.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/ClosedGroupsProtocolV2.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/ClosedGroupsProtocolV2.kt index b76a51a9f3..6ab46fcd36 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/ClosedGroupsProtocolV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/ClosedGroupsProtocolV2.kt @@ -518,7 +518,7 @@ object ClosedGroupsProtocolV2 { val userLeft = userPublicKey == senderPublicKey // if the admin left, we left, or we are the only remaining member: remove the group - if (didAdminLeave || userLeft || updatedMemberList.size == 1) { + if (didAdminLeave || userLeft) { disableLocalGroupAndUnsubscribe(context, apiDB, groupPublicKey, groupDB, groupID, userPublicKey) } else { val isCurrentUserAdmin = admins.contains(userPublicKey) From e426d30f67906160f8ede0789c301447dda92f3c Mon Sep 17 00:00:00 2001 From: jubb Date: Mon, 22 Feb 2021 15:46:37 +1100 Subject: [PATCH 3/4] fix: fix ec send from pending if map contains absent value --- .../securesms/loki/activities/EditClosedGroupActivity.kt | 2 +- .../securesms/loki/protocol/ClosedGroupsProtocolV2.kt | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/EditClosedGroupActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/EditClosedGroupActivity.kt index aff070fdf6..cc32f1260b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/EditClosedGroupActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/EditClosedGroupActivity.kt @@ -298,7 +298,7 @@ class EditClosedGroupActivity : PassphraseRequiredActionBarActivity() { }.failUi { exception -> val message = if (exception is ClosedGroupsProtocol.Error) exception.description else "An error occurred" Toast.makeText(this@EditClosedGroupActivity, message, Toast.LENGTH_LONG).show() - loader.fadeOut() + loaderContainer.fadeOut() isLoading = false } } else { diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/ClosedGroupsProtocolV2.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/ClosedGroupsProtocolV2.kt index 6ab46fcd36..8f69ce8cb1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/ClosedGroupsProtocolV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/ClosedGroupsProtocolV2.kt @@ -145,9 +145,7 @@ object ClosedGroupsProtocolV2 { val admins = group.admins.map { it.serialize() } val adminsAsData = admins.map { Hex.fromStringCondensed(it) } val sentTime = System.currentTimeMillis() - val encryptionKeyPair = pendingKeyPair.getOrElse(groupPublicKey) { - Optional.fromNullable(apiDB.getLatestClosedGroupEncryptionKeyPair(groupPublicKey)) - }.orNull() + val encryptionKeyPair = pendingKeyPair[groupPublicKey]?.orNull() ?: Optional.fromNullable(apiDB.getLatestClosedGroupEncryptionKeyPair(groupPublicKey)).orNull() if (encryptionKeyPair == null) { Log.d("Loki", "Couldn't get encryption key pair for closed group.") throw Error.NoKeyPair From ace0144ffeeed8270f0b59512c92c5870500d879 Mon Sep 17 00:00:00 2001 From: jubb Date: Mon, 22 Feb 2021 16:11:12 +1100 Subject: [PATCH 4/4] docs: add documentation around the notifyUser param --- .../securesms/loki/protocol/ClosedGroupsProtocolV2.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/ClosedGroupsProtocolV2.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/ClosedGroupsProtocolV2.kt index 8f69ce8cb1..0ccdcb4438 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/ClosedGroupsProtocolV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/protocol/ClosedGroupsProtocolV2.kt @@ -94,6 +94,10 @@ object ClosedGroupsProtocolV2 { return deferred.promise } + /** + * @param notifyUser Inserts an outgoing info message for the user's leave message, useful to set `false` if + * you are exiting asynchronously and deleting the thread from [HomeActivity][org.thoughtcrime.securesms.loki.activities.HomeActivity.deleteConversation] + */ @JvmStatic @JvmOverloads fun explicitLeave(context: Context, groupPublicKey: String, notifyUser: Boolean = true): Promise { val deferred = deferred()