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 2c01f7365..9b25db1d5 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 @@ -195,7 +195,8 @@ class ConversationViewModel( } fun declineMessageRequest() { - repository.declineMessageRequest(threadId) + val recipient = recipient ?: return + repository.declineMessageRequest(threadId, recipient) } private fun showMessage(message: String) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt index 42494bca0..140367e24 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt @@ -611,9 +611,9 @@ open class Storage( val toAddCommunities = communities.filter { it.community.fullUrl() !in existingCommunities.map { it.value.joinURL } } val existingJoinUrls = existingCommunities.values.map { it.joinURL } - val existingClosedGroups = getAllGroups(includeInactive = true).filter { it.isLegacyClosedGroup } + val existingLegacyClosedGroups = getAllGroups(includeInactive = true).filter { it.isLegacyClosedGroup } val lgcIds = lgc.map { it.sessionId.hexString() } - val toDeleteClosedGroups = existingClosedGroups.filter { group -> + val toDeleteClosedGroups = existingLegacyClosedGroups.filter { group -> GroupUtil.doubleDecodeGroupId(group.encodedId) !in lgcIds } @@ -656,9 +656,10 @@ open class Storage( pollerFactory.pollerFor(closedGroup.groupSessionId)?.start() } } + // TODO: add in removing legacy closed groups via config update for (group in lgc) { - val existingGroup = existingClosedGroups.firstOrNull { GroupUtil.doubleDecodeGroupId(it.encodedId) == group.sessionId.hexString() } + val existingGroup = existingLegacyClosedGroups.firstOrNull { GroupUtil.doubleDecodeGroupId(it.encodedId) == group.sessionId.hexString() } val existingThread = existingGroup?.let { getThreadId(existingGroup.encodedId) } if (existingGroup != null) { if (group.priority == PRIORITY_HIDDEN && existingThread != null) { @@ -1224,19 +1225,25 @@ open class Storage( override fun respondToClosedGroupInvitation(groupRecipient: Recipient, approved: Boolean) { val groups = configFactory.userGroups ?: return val groupSessionId = SessionId.from(groupRecipient.address.serialize()) - val closedGroupInfo = groups.getClosedGroup(groupSessionId.hexString())?.copy( - invited = false - ) ?: return - groups.set(closedGroupInfo) - ConfigurationMessageUtilities.forceSyncConfigurationNowIfNeeded(context) - pollerFactory.pollerFor(groupSessionId)?.start() - val inviteResponse = GroupUpdateInviteResponseMessage.newBuilder() - .setIsApproved(true) - val responseData = GroupUpdateMessage.newBuilder() - .setInviteResponse(inviteResponse) - val responseMessage = GroupUpdated(responseData.build()) - // this will fail the first couple of times :) - MessageSender.send(responseMessage, fromSerialized(groupSessionId.hexString())) + if (!approved) { + groups.eraseClosedGroup(groupSessionId.hexString()) + ConfigurationMessageUtilities.forceSyncConfigurationNowIfNeeded(context) + return + } else { + val closedGroupInfo = groups.getClosedGroup(groupSessionId.hexString())?.copy( + invited = false + ) ?: return + groups.set(closedGroupInfo) + ConfigurationMessageUtilities.forceSyncConfigurationNowIfNeeded(context) + pollerFactory.pollerFor(groupSessionId)?.start() + val inviteResponse = GroupUpdateInviteResponseMessage.newBuilder() + .setIsApproved(true) + val responseData = GroupUpdateMessage.newBuilder() + .setInviteResponse(inviteResponse) + val responseMessage = GroupUpdated(responseData.build()) + // this will fail the first couple of times :) + MessageSender.send(responseMessage, fromSerialized(groupSessionId.hexString())) + } } override fun addClosedGroupInvite( diff --git a/app/src/main/java/org/thoughtcrime/securesms/repository/ConversationRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/repository/ConversationRepository.kt index 6d25f2ad4..940468b5d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/repository/ConversationRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/repository/ConversationRepository.kt @@ -77,7 +77,7 @@ interface ConversationRepository { suspend fun acceptMessageRequest(threadId: Long, recipient: Recipient): ResultOf - fun declineMessageRequest(threadId: Long) + fun declineMessageRequest(threadId: Long, recipient: Recipient) fun hasReceived(threadId: Long): Boolean @@ -286,8 +286,7 @@ class DefaultConversationRepository @Inject constructor( } override suspend fun deleteMessageRequest(thread: ThreadRecord): ResultOf { - sessionJobDb.cancelPendingMessageSendJobs(thread.threadId) - storage.deleteConversation(thread.threadId) + declineMessageRequest(thread.threadId, thread.recipient) return ResultOf.Success(Unit) } @@ -320,9 +319,13 @@ class DefaultConversationRepository @Inject constructor( } } - override fun declineMessageRequest(threadId: Long) { + override fun declineMessageRequest(threadId: Long, recipient: Recipient) { sessionJobDb.cancelPendingMessageSendJobs(threadId) - storage.deleteConversation(threadId) + if (recipient.isClosedGroupRecipient) { + storage.respondToClosedGroupInvitation(recipient, false) + } else { + storage.deleteConversation(threadId) + } } override fun hasReceived(threadId: Long): Boolean { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e1d89b3ba..d4d63a7c6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -941,7 +941,7 @@ Are you sure you want to decline this message request? Are you sure you want to block this message request? Message request deleted - Are you sure you want to clear all message requests? + Are you sure you want to clear all message requests and group invites? Message requests deleted Your message request has been accepted. Your message request is currently pending.