From 45a739ce9256ddd07fd3e53654988edce0da0085 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Mon, 10 Jun 2024 14:49:40 -0400 Subject: [PATCH] Show notification for group adds. --- ...est_collapseJoinRequestEventsIfPossible.kt | 11 ++++++++++- .../securesms/database/MessageTable.kt | 2 +- .../v2/processing/GroupsV2StateProcessor.kt | 19 +++++++++++++++---- .../securesms/mms/IncomingMessage.kt | 15 +++++++++------ 4 files changed, 35 insertions(+), 12 deletions(-) diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/SmsDatabaseTest_collapseJoinRequestEventsIfPossible.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/SmsDatabaseTest_collapseJoinRequestEventsIfPossible.kt index b00aba7111..6c1a9e1f39 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/SmsDatabaseTest_collapseJoinRequestEventsIfPossible.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/SmsDatabaseTest_collapseJoinRequestEventsIfPossible.kt @@ -10,7 +10,9 @@ import org.junit.Test import org.junit.runner.RunWith import org.signal.core.util.Hex import org.signal.libsignal.zkgroup.groups.GroupMasterKey +import org.thoughtcrime.securesms.database.model.GroupsV2UpdateMessageConverter import org.thoughtcrime.securesms.database.model.databaseprotos.DecryptedGroupV2Context +import org.thoughtcrime.securesms.database.model.databaseprotos.GV2UpdateDescription import org.thoughtcrime.securesms.database.model.databaseprotos.addMember import org.thoughtcrime.securesms.database.model.databaseprotos.addRequestingMember import org.thoughtcrime.securesms.database.model.databaseprotos.deleteRequestingMember @@ -286,11 +288,18 @@ class SmsDatabaseTest_collapseJoinRequestEventsIfPossible { private fun groupUpdateMessage(sender: RecipientId, groupContext: DecryptedGroupV2Context): IncomingMessage { wallClock++ + + val updateDescription = GV2UpdateDescription( + gv2ChangeDescription = groupContext, + groupChangeUpdate = GroupsV2UpdateMessageConverter.translateDecryptedChangeUpdate(SignalStore.account().getServiceIds(), groupContext) + ) + return IncomingMessage.groupUpdate( from = sender, timestamp = wallClock, groupId = groupId, - groupContext = groupContext, + update = updateDescription, + isGroupAdd = false, serverGuid = null ) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt index b279092ea7..e164e28198 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt @@ -2591,7 +2591,7 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat } } - val silent = MessageTypes.isGroupUpdate(type) || + val silent = (MessageTypes.isGroupUpdate(type) && !retrieved.isGroupAdd) || retrieved.type == MessageType.IDENTITY_DEFAULT || retrieved.type == MessageType.IDENTITY_VERIFIED || retrieved.type == MessageType.IDENTITY_UPDATE diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.kt b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.kt index 3fcbaf77d7..56c4c5b60c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.kt @@ -16,7 +16,7 @@ import org.signal.storageservice.protos.groups.local.DecryptedGroup import org.signal.storageservice.protos.groups.local.DecryptedGroupChange import org.thoughtcrime.securesms.database.SignalDatabase import org.thoughtcrime.securesms.database.model.GroupRecord -import org.thoughtcrime.securesms.database.model.GroupsV2UpdateMessageConverter.translateDecryptedChange +import org.thoughtcrime.securesms.database.model.GroupsV2UpdateMessageConverter import org.thoughtcrime.securesms.database.model.databaseprotos.DecryptedGroupV2Context import org.thoughtcrime.securesms.database.model.databaseprotos.GV2UpdateDescription import org.thoughtcrime.securesms.dependencies.AppDependencies @@ -632,11 +632,12 @@ class GroupsV2StateProcessor private constructor( fun storeMessage(decryptedGroupV2Context: DecryptedGroupV2Context, timestamp: Long, serverGuid: String?) { val editor: Optional = getEditor(decryptedGroupV2Context) + val serviceIds = SignalStore.account().getServiceIds() val outgoing = editor.isEmpty || aci == editor.get() val updateDescription = GV2UpdateDescription( gv2ChangeDescription = decryptedGroupV2Context, - groupChangeUpdate = translateDecryptedChange(SignalStore.account().getServiceIds(), decryptedGroupV2Context) + groupChangeUpdate = GroupsV2UpdateMessageConverter.translateDecryptedChange(serviceIds, decryptedGroupV2Context) ) if (outgoing) { @@ -654,12 +655,22 @@ class GroupsV2StateProcessor private constructor( } } else { try { - val sender = RecipientId.from(editor.get()) - val groupMessage = IncomingMessage.groupUpdate(sender, timestamp, groupId, decryptedGroupV2Context, serverGuid) + val isGroupAdd = updateDescription + .groupChangeUpdate!! + .updates + .asSequence() + .mapNotNull { it.groupMemberAddedUpdate } + .any { serviceIds.matches(it.newMemberAci) } + + val groupMessage = IncomingMessage.groupUpdate(RecipientId.from(editor.get()), timestamp, groupId, updateDescription, isGroupAdd, serverGuid) val insertResult = SignalDatabase.messages.insertMessageInbox(groupMessage) if (insertResult.isPresent) { SignalDatabase.threads.update(insertResult.get().threadId, unarchive = false, allowDeletion = false) + + if (isGroupAdd) { + AppDependencies.messageNotifier.updateNotification(AppDependencies.application) + } } else { Log.w(TAG, "Could not insert update message") } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mms/IncomingMessage.kt b/app/src/main/java/org/thoughtcrime/securesms/mms/IncomingMessage.kt index 4d947da7de..33e19d322f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mms/IncomingMessage.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mms/IncomingMessage.kt @@ -7,7 +7,6 @@ import org.thoughtcrime.securesms.database.model.Mention import org.thoughtcrime.securesms.database.model.ParentStoryId import org.thoughtcrime.securesms.database.model.StoryType import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList -import org.thoughtcrime.securesms.database.model.databaseprotos.DecryptedGroupV2Context import org.thoughtcrime.securesms.database.model.databaseprotos.GV2UpdateDescription import org.thoughtcrime.securesms.database.model.databaseprotos.GiftBadge import org.thoughtcrime.securesms.database.model.databaseprotos.MessageExtras @@ -39,7 +38,8 @@ class IncomingMessage( linkPreviews: List = emptyList(), mentions: List = emptyList(), val giftBadge: GiftBadge? = null, - val messageExtras: MessageExtras? = null + val messageExtras: MessageExtras? = null, + val isGroupAdd: Boolean = false ) { val attachments: List = ArrayList(attachments) @@ -97,18 +97,21 @@ class IncomingMessage( } @JvmStatic - fun groupUpdate(from: RecipientId, timestamp: Long, groupId: GroupId, groupContext: DecryptedGroupV2Context, serverGuid: String?): IncomingMessage { - val messageGroupContext = MessageGroupContext(groupContext) + fun groupUpdate(from: RecipientId, timestamp: Long, groupId: GroupId, update: GV2UpdateDescription, isGroupAdd: Boolean, serverGuid: String?): IncomingMessage { + val messageExtras = MessageExtras(gv2UpdateDescription = update) + val groupContext = MessageGroupContext(update.gv2ChangeDescription!!) return IncomingMessage( from = from, sentTimeMillis = timestamp, receivedTimeMillis = timestamp, serverTimeMillis = timestamp, + serverGuid = serverGuid, groupId = groupId, - groupContext = messageGroupContext, + groupContext = groupContext, type = MessageType.GROUP_UPDATE, - messageExtras = MessageExtras(gv2UpdateDescription = GV2UpdateDescription(gv2ChangeDescription = groupContext, groupChangeUpdate = null)) + messageExtras = messageExtras, + isGroupAdd = isGroupAdd ) } }