From 2aa35e02deadaaa01ae899790cac8ccdb9d8fe28 Mon Sep 17 00:00:00 2001 From: Mohamad Jaara Date: Mon, 10 Jul 2023 11:39:33 +0200 Subject: [PATCH 1/8] feat: add message timer to all message types --- .../feature/call/scenario/OnHttpRequest.kt | 3 +- .../kalium/logic/data/call/CallRepository.kt | 3 +- .../NewConversationMembersRepository.kt | 3 +- ...wGroupConversationStartedMessageCreator.kt | 3 +- .../wire/kalium/logic/data/message/Message.kt | 7 +- .../logic/data/message/MessageMapper.kt | 14 +++ .../ClearConversationContentUseCase.kt | 3 +- .../CreateGroupConversationUseCase.kt | 3 +- .../UpdateConversationReadDateUseCase.kt | 3 +- .../UpdateConversationReceiptModeUseCase.kt | 3 +- .../messagetimer/UpdateMessageTimerUseCase.kt | 3 +- .../kalium/logic/feature/debug/DebugScope.kt | 1 + .../feature/debug/SendConfirmationUseCase.kt | 3 +- ...dSystemMessageToAllConversationsUseCase.kt | 1 + .../feature/message/DeleteMessageUseCase.kt | 3 +- .../logic/feature/message/MessageScope.kt | 1 + .../logic/feature/message/MessageSender.kt | 6 +- .../message/RetryFailedMessageUseCase.kt | 3 +- .../message/SendConfirmationUseCase.kt | 3 +- .../message/SendEditTextMessageUseCase.kt | 3 +- .../feature/message/SessionResetSender.kt | 3 +- .../feature/message/ToggleReactionUseCase.kt | 6 +- ...eralMessageForSelfUserAsReceiverUseCase.kt | 6 +- .../EphemeralMessageDeletionHandler.kt | 44 +++---- .../ephemeral/SelfDeletionEventLogger .kt | 30 ++--- .../logic/sync/receiver/TeamEventReceiver.kt | 3 +- .../ConversationMessageTimerEventHandler.kt | 3 +- .../conversation/MemberJoinEventHandler.kt | 3 +- .../conversation/MemberLeaveEventHandler.kt | 3 +- .../NewConversationEventHandler.kt | 3 +- .../ReceiptModeUpdateEventHandler.kt | 3 +- .../RenamedConversationEventHandler.kt | 1 + .../message/ApplicationMessageHandler.kt | 11 +- .../message/GetNotificationsUseCaseTest.kt | 3 +- .../feature/message/MessageSenderTest.kt | 9 +- .../EphemeralMessageDeletionHandlerTest.kt | 115 ++++++++++-------- .../kalium/logic/framework/TestMessage.kt | 4 +- .../message/ReceiptMessageHandlerTest.kt | 3 +- .../persistence/dao/message/MessageEntity.kt | 50 +++----- .../persistence/dao/message/MessageMapper.kt | 4 +- .../backup/UserDatabaseDataGenerator.kt | 4 +- .../persistence/utils/stubs/MessageStubs.kt | 4 +- 42 files changed, 228 insertions(+), 159 deletions(-) diff --git a/logic/src/commonJvmAndroid/kotlin/com/wire/kalium/logic/feature/call/scenario/OnHttpRequest.kt b/logic/src/commonJvmAndroid/kotlin/com/wire/kalium/logic/feature/call/scenario/OnHttpRequest.kt index 90bb15b9d21..1e699e436dc 100644 --- a/logic/src/commonJvmAndroid/kotlin/com/wire/kalium/logic/feature/call/scenario/OnHttpRequest.kt +++ b/logic/src/commonJvmAndroid/kotlin/com/wire/kalium/logic/feature/call/scenario/OnHttpRequest.kt @@ -120,7 +120,8 @@ internal class OnHttpRequest( senderUserId = userId, senderClientId = clientId, status = Message.Status.SENT, - isSelfMessage = true + isSelfMessage = true, + expirationData = null ) return messageSender.sendMessage(message, messageTarget) diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/call/CallRepository.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/call/CallRepository.kt index 2d66d9836fe..3f542f45398 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/call/CallRepository.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/call/CallRepository.kt @@ -347,7 +347,8 @@ internal class CallDataSource( DateTimeUtil.currentIsoDateTimeString(), qualifiedUserId, Message.Status.SENT, - Message.Visibility.VISIBLE + Message.Visibility.VISIBLE, + expirationData = null, ) persistMessage(message) } ?: callingLogger.i("[CallRepository] -> Unable to persist Missed Call due to missing Caller ID") diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/NewConversationMembersRepository.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/NewConversationMembersRepository.kt index a1cef85d9e5..69271d46d31 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/NewConversationMembersRepository.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/NewConversationMembersRepository.kt @@ -70,7 +70,8 @@ internal class NewConversationMembersRepositoryImpl( DateTimeUtil.currentIsoDateTimeString(), selfUserId, Message.Status.SENT, - Message.Visibility.VISIBLE + Message.Visibility.VISIBLE, + expirationData = null ) persistMessage(messageStartedWithMembers) } diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/NewGroupConversationStartedMessageCreator.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/NewGroupConversationStartedMessageCreator.kt index 4964a7810d4..8e72573114d 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/NewGroupConversationStartedMessageCreator.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/NewGroupConversationStartedMessageCreator.kt @@ -53,7 +53,8 @@ internal class NewGroupConversationStartedMessageCreatorImpl( DateTimeUtil.currentIsoDateTimeString(), selfUserId, Message.Status.SENT, - Message.Visibility.VISIBLE + Message.Visibility.VISIBLE, + expirationData = null ) ) } diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/Message.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/Message.kt index 5fc98eee07b..ba420ade21b 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/Message.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/Message.kt @@ -38,6 +38,7 @@ sealed interface Message { val date: String val senderUserId: UserId val status: Status + val expirationData: ExpirationData? /** * Messages that can be sent from one client to another. @@ -78,7 +79,7 @@ sealed interface Message { override val isSelfMessage: Boolean, override val senderClientId: ClientId, val editStatus: EditStatus, - val expirationData: ExpirationData? = null, + override val expirationData: ExpirationData? = null, val reactions: Reactions = Reactions.EMPTY, val expectsReadConfirmation: Boolean = false ) : Sendable, Standalone { @@ -152,6 +153,7 @@ sealed interface Message { override val status: Status, override val senderUserName: String? = null, override val isSelfMessage: Boolean, + override val expirationData: ExpirationData? ) : Sendable { override fun toLogString(): String { val typeKey = "type" @@ -232,9 +234,10 @@ sealed interface Message { override val senderUserId: UserId, override val status: Status, override val visibility: Visibility = Visibility.VISIBLE, + override val expirationData: ExpirationData?, // TODO(refactor): move senderName to inside the specific `content` // instead of having it nullable in all system messages - val senderUserName: String? = null, + val senderUserName: String? = null ) : Message, Standalone { fun toLogString(): String { diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/MessageMapper.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/MessageMapper.kt index fb095a9ecce..9b1d16a070f 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/MessageMapper.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/MessageMapper.kt @@ -101,6 +101,13 @@ class MessageMapperImpl( status = status, visibility = visibility, senderName = message.senderUserName, + expireAfterMs = message.expirationData?.let { it.expireAfter.inWholeMilliseconds }, + selfDeletionStartDate = message.expirationData?.let { + when (val status = it.selfDeletionStatus) { + is Message.ExpirationData.SelfDeletionStatus.Started -> status.selfDeletionStartDate + is Message.ExpirationData.SelfDeletionStatus.NotStarted -> null + } + }, ) } } @@ -150,6 +157,13 @@ class MessageMapperImpl( status = status, visibility = message.visibility.toModel(), senderUserName = message.senderName, + expirationData = message.expireAfterMs?.let { + Message.ExpirationData( + expireAfter = it.toDuration(DurationUnit.MILLISECONDS), + selfDeletionStatus = message.selfDeletionStartDate + ?.let { Message.ExpirationData.SelfDeletionStatus.Started(it) } + ?: Message.ExpirationData.SelfDeletionStatus.NotStarted) + } ) } } diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/conversation/ClearConversationContentUseCase.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/conversation/ClearConversationContentUseCase.kt index 1b548d7cbe3..f6008b48330 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/conversation/ClearConversationContentUseCase.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/conversation/ClearConversationContentUseCase.kt @@ -73,7 +73,8 @@ internal class ClearConversationContentUseCaseImpl( senderUserId = selfUserId, senderClientId = currentClientId, status = Message.Status.PENDING, - isSelfMessage = true + isSelfMessage = true, + expirationData = null ) messageSender.sendMessage(regularMessage) } diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/conversation/CreateGroupConversationUseCase.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/conversation/CreateGroupConversationUseCase.kt index 6cf3e018b27..0960f2fd9f4 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/conversation/CreateGroupConversationUseCase.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/conversation/CreateGroupConversationUseCase.kt @@ -96,7 +96,8 @@ class CreateGroupConversationUseCase internal constructor( DateTimeUtil.currentIsoDateTimeString(), selfUserId, Message.Status.SENT, - Message.Visibility.VISIBLE + Message.Visibility.VISIBLE, + expirationData = null ) persistMessage(message) diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/conversation/UpdateConversationReadDateUseCase.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/conversation/UpdateConversationReadDateUseCase.kt index b7c14c71142..1b451009684 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/conversation/UpdateConversationReadDateUseCase.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/conversation/UpdateConversationReadDateUseCase.kt @@ -91,7 +91,8 @@ class UpdateConversationReadDateUseCase internal constructor( senderUserId = selfUserId, senderClientId = currentClientId, status = Message.Status.PENDING, - isSelfMessage = true + isSelfMessage = true, + expirationData = null ) messageSender.sendMessage(regularMessage) } diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/conversation/UpdateConversationReceiptModeUseCase.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/conversation/UpdateConversationReceiptModeUseCase.kt index 628f70874d4..ddd14787b34 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/conversation/UpdateConversationReceiptModeUseCase.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/conversation/UpdateConversationReceiptModeUseCase.kt @@ -78,7 +78,8 @@ internal class UpdateConversationReceiptModeUseCaseImpl( DateTimeUtil.currentIsoDateTimeString(), selfUserId, Message.Status.SENT, - Message.Visibility.VISIBLE + Message.Visibility.VISIBLE, + expirationData = null ) persistMessage(message) diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/conversation/messagetimer/UpdateMessageTimerUseCase.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/conversation/messagetimer/UpdateMessageTimerUseCase.kt index 40865b9b330..1a2e5be19c2 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/conversation/messagetimer/UpdateMessageTimerUseCase.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/conversation/messagetimer/UpdateMessageTimerUseCase.kt @@ -58,7 +58,8 @@ class UpdateMessageTimerUseCaseImpl internal constructor( DateTimeUtil.currentIsoDateTimeString(), selfUserId, Message.Status.SENT, - Message.Visibility.VISIBLE + Message.Visibility.VISIBLE, + expirationData = null ) persistMessage(message) } diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/debug/DebugScope.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/debug/DebugScope.kt index 0ca4cf2690e..48c25623e41 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/debug/DebugScope.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/debug/DebugScope.kt @@ -161,5 +161,6 @@ class DebugScope internal constructor( messageRepository = messageRepository, deleteEphemeralMessageForSelfUserAsReceiver = deleteEphemeralMessageForSelfUserAsReceiver, deleteEphemeralMessageForSelfUserAsSender = deleteEphemeralMessageForSelfUserAsSender, + selfUserId = userId ) } diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/debug/SendConfirmationUseCase.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/debug/SendConfirmationUseCase.kt index 757f712c27a..88393b5ba16 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/debug/SendConfirmationUseCase.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/debug/SendConfirmationUseCase.kt @@ -70,7 +70,8 @@ class SendConfirmationUseCase internal constructor( senderUserId = selfUser.id, senderClientId = currentClientId, status = Message.Status.PENDING, - isSelfMessage = true + isSelfMessage = true, + expirationData = null ) messageSender.sendMessage(message) }.onFailure { diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/AddSystemMessageToAllConversationsUseCase.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/AddSystemMessageToAllConversationsUseCase.kt index b666b6396d5..5dd2d1d8fad 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/AddSystemMessageToAllConversationsUseCase.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/AddSystemMessageToAllConversationsUseCase.kt @@ -50,6 +50,7 @@ class AddSystemMessageToAllConversationsUseCaseImpl internal constructor( date = DateTimeUtil.currentIsoDateTimeString(), senderUserId = selfUserId, status = Message.Status.SENT, + expirationData = null ) messageRepository.persistSystemMessageToAllConversations(message) } diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/DeleteMessageUseCase.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/DeleteMessageUseCase.kt index 0bc85fa1123..a04d8cbf7ed 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/DeleteMessageUseCase.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/DeleteMessageUseCase.kt @@ -90,7 +90,8 @@ class DeleteMessageUseCase internal constructor( senderUserId = selfUserId, senderClientId = currentClientId, status = Message.Status.PENDING, - isSelfMessage = true + isSelfMessage = true, + expirationData = null ) messageSender.sendMessage(regularMessage) } diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/MessageScope.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/MessageScope.kt index 18e6c4560ad..796e61b181a 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/MessageScope.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/MessageScope.kt @@ -120,6 +120,7 @@ class MessageScope internal constructor( messageRepository = messageRepository, deleteEphemeralMessageForSelfUserAsReceiver = deleteEphemeralMessageForSelfUserAsReceiver, deleteEphemeralMessageForSelfUserAsSender = deleteEphemeralMessageForSelfUserAsSender, + selfUserId = selfUserId ) private val deleteEphemeralMessageForSelfUserAsSender: DeleteEphemeralMessageForSelfUserAsSenderUseCaseImpl diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/MessageSender.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/MessageSender.kt index c41b2944a4b..20a4b62dbe5 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/MessageSender.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/MessageSender.kt @@ -131,7 +131,7 @@ internal class MessageSenderImpl internal constructor( private val mlsMessageCreator: MLSMessageCreator, private val messageSendingInterceptor: MessageSendingInterceptor, private val userRepository: UserRepository, - private val enqueueSelfDeletion: (Message.Regular, Message.ExpirationData) -> Unit, + private val enqueueSelfDeletion: (Message, Message.ExpirationData) -> Unit, private val scope: CoroutineScope ) : MessageSender { @@ -229,8 +229,8 @@ internal class MessageSenderImpl internal constructor( } private fun startSelfDeletionIfNeeded(message: Message.Sendable) { - if (message is Message.Regular && message.expirationData != null) { - enqueueSelfDeletion(message, message.expirationData) + if (message.expirationData != null) { + enqueueSelfDeletion(message, message.expirationData!!) } } diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/RetryFailedMessageUseCase.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/RetryFailedMessageUseCase.kt index 2ccb5c21da6..2c8bd013f2f 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/RetryFailedMessageUseCase.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/RetryFailedMessageUseCase.kt @@ -126,7 +126,8 @@ class RetryFailedMessageUseCase internal constructor( senderUserId = message.senderUserId, senderClientId = message.senderClientId, status = Message.Status.PENDING, - isSelfMessage = true + isSelfMessage = true, + expirationData = null ) retrySendingMessage(editMessage) } diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/SendConfirmationUseCase.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/SendConfirmationUseCase.kt index 9938b9a28d8..8bb81631cda 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/SendConfirmationUseCase.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/SendConfirmationUseCase.kt @@ -88,7 +88,8 @@ internal class SendConfirmationUseCase internal constructor( senderUserId = selfUserId, senderClientId = currentClientId, status = Message.Status.PENDING, - isSelfMessage = true + isSelfMessage = true, + expirationData = null ) messageSender.sendMessage(message) diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/SendEditTextMessageUseCase.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/SendEditTextMessageUseCase.kt index 95877663e91..3cf164a7a17 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/SendEditTextMessageUseCase.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/SendEditTextMessageUseCase.kt @@ -90,7 +90,8 @@ class SendEditTextMessageUseCase internal constructor( senderUserId = selfUserId, senderClientId = clientId, status = Message.Status.PENDING, - isSelfMessage = true + isSelfMessage = true, + expirationData = null ) // until the edit send is completed and accepted by the backend, we don't change the message id to be able to handle any // incoming edits from other clients that happened in the meantime and already changed the message id diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/SessionResetSender.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/SessionResetSender.kt index ecdb6e0f91e..edcfeb08087 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/SessionResetSender.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/SessionResetSender.kt @@ -68,7 +68,8 @@ class SessionResetSenderImpl internal constructor( senderUserId = selfUserId, senderClientId = selfClientId, status = Message.Status.SENT, - isSelfMessage = true + isSelfMessage = true, + expirationData = null ) val recipient = Recipient(userId, listOf(clientId)) messageSender.sendMessage( diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/ToggleReactionUseCase.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/ToggleReactionUseCase.kt index bf885456b0b..f74caeab55b 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/ToggleReactionUseCase.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/ToggleReactionUseCase.kt @@ -114,7 +114,8 @@ class ToggleReactionUseCase internal constructor( senderUserId = userId, senderClientId = clientId, status = Message.Status.PENDING, - isSelfMessage = true + isSelfMessage = true, + expirationData = null ) messageSender.sendMessage(regularMessage) } @@ -141,7 +142,8 @@ class ToggleReactionUseCase internal constructor( senderUserId = userId, senderClientId = clientId, status = Message.Status.PENDING, - isSelfMessage = true + isSelfMessage = true, + expirationData = null ) messageSender.sendMessage(regularMessage) }.flatMapLeft { diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/ephemeral/DeleteEphemeralMessageForSelfUserAsReceiverUseCase.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/ephemeral/DeleteEphemeralMessageForSelfUserAsReceiverUseCase.kt index cc55e230b0a..2d195d683f3 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/ephemeral/DeleteEphemeralMessageForSelfUserAsReceiverUseCase.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/ephemeral/DeleteEphemeralMessageForSelfUserAsReceiverUseCase.kt @@ -101,7 +101,8 @@ internal class DeleteEphemeralMessageForSelfUserAsReceiverUseCaseImpl( senderUserId = selfUserId, senderClientId = currentClientId, status = Message.Status.PENDING, - isSelfMessage = true + isSelfMessage = true, + expirationData = null ).let { deleteSignalingMessage -> messageSender.sendMessage(deleteSignalingMessage, MessageTarget.Conversation) } @@ -121,7 +122,8 @@ internal class DeleteEphemeralMessageForSelfUserAsReceiverUseCaseImpl( senderUserId = selfUserId, senderClientId = currentClientId, status = Message.Status.PENDING, - isSelfMessage = true + isSelfMessage = true, + expirationData = null ).let { deleteSignalingMessage -> messageSender.sendMessage( deleteSignalingMessage, diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/ephemeral/EphemeralMessageDeletionHandler.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/ephemeral/EphemeralMessageDeletionHandler.kt index ba5f4d03ada..13a0bf2d698 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/ephemeral/EphemeralMessageDeletionHandler.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/ephemeral/EphemeralMessageDeletionHandler.kt @@ -3,6 +3,7 @@ package com.wire.kalium.logic.feature.message.ephemeral import com.wire.kalium.logic.data.id.ConversationId import com.wire.kalium.logic.data.message.Message import com.wire.kalium.logic.data.message.MessageRepository +import com.wire.kalium.logic.data.user.UserId import com.wire.kalium.logic.functional.Either import com.wire.kalium.logic.functional.map import com.wire.kalium.logic.functional.onSuccess @@ -20,12 +21,13 @@ import kotlin.coroutines.CoroutineContext internal interface EphemeralMessageDeletionHandler { fun startSelfDeletion(conversationId: ConversationId, messageId: String) - fun enqueueSelfDeletion(message: Message.Regular, expirationData: Message.ExpirationData) - fun enqueuePendingSelfDeletionMessages() + fun enqueueSelfDeletion(message: Message, expirationData: Message.ExpirationData) + suspend fun enqueuePendingSelfDeletionMessages() } internal class EphemeralMessageDeletionHandlerImpl( private val messageRepository: MessageRepository, + private val selfUserId: UserId, private val kaliumDispatcher: KaliumDispatcher = KaliumDispatcherImpl, private val deleteEphemeralMessageForSelfUserAsReceiver: DeleteEphemeralMessageForSelfUserAsReceiverUseCase, private val deleteEphemeralMessageForSelfUserAsSender: DeleteEphemeralMessageForSelfUserAsSenderUseCase, @@ -39,10 +41,10 @@ internal class EphemeralMessageDeletionHandlerImpl( override fun startSelfDeletion(conversationId: ConversationId, messageId: String) { launch { messageRepository.getMessageById(conversationId, messageId).map { message -> - if (message is Message.Regular && message.expirationData != null && message.status != Message.Status.PENDING) { + if (message.expirationData != null && message.status != Message.Status.PENDING) { enqueueSelfDeletion( message = message, - expirationData = message.expirationData + expirationData = message.expirationData!! ) } else { kaliumLogger.i( @@ -53,7 +55,7 @@ internal class EphemeralMessageDeletionHandlerImpl( } } - override fun enqueueSelfDeletion(message: Message.Regular, expirationData: Message.ExpirationData) { + override fun enqueueSelfDeletion(message: Message, expirationData: Message.ExpirationData) { SelfDeletionEventLogger.log( LoggingSelfDeletionEvent.InvalidMessageStatus( message, @@ -89,10 +91,10 @@ internal class EphemeralMessageDeletionHandlerImpl( } } - private suspend fun deleteMessage(message: Message.Regular, expirationData: Message.ExpirationData) { + private suspend fun deleteMessage(message: Message, expirationData: Message.ExpirationData) { removeFromOutgoingDeletion(message) - if (message.isSelfMessage) { + if (message.senderUserId == selfUserId) { SelfDeletionEventLogger.log( LoggingSelfDeletionEvent.AttemptingToDelete( message, @@ -151,13 +153,13 @@ internal class EphemeralMessageDeletionHandlerImpl( } } - private suspend fun removeFromOutgoingDeletion(message: Message.Regular) { + private suspend fun removeFromOutgoingDeletion(message: Message) { ongoingSelfDeletionMessagesMutex.withLock { ongoingSelfDeletionMessages - message.conversationId to message.id } } - private suspend fun markDeletionDateAndWait(message: Message.Regular, expirationData: Message.ExpirationData) { + private suspend fun markDeletionDateAndWait(message: Message, expirationData: Message.ExpirationData) { with(expirationData) { if (selfDeletionStatus is Message.ExpirationData.SelfDeletionStatus.NotStarted) { SelfDeletionEventLogger.log( @@ -198,23 +200,21 @@ internal class EphemeralMessageDeletionHandlerImpl( } } - private fun addToOutgoingDeletion(message: Message.Regular) { + private fun addToOutgoingDeletion(message: Message) { ongoingSelfDeletionMessages[message.conversationId to message.id] = Unit } - override fun enqueuePendingSelfDeletionMessages() { - launch { - messageRepository.getEphemeralMessagesMarkedForDeletion() - .onSuccess { ephemeralMessages -> - ephemeralMessages.forEach { ephemeralMessage -> - if (ephemeralMessage is Message.Regular && ephemeralMessage.expirationData != null) { - enqueueSelfDeletion( - message = ephemeralMessage, - expirationData = ephemeralMessage.expirationData - ) - } + override suspend fun enqueuePendingSelfDeletionMessages() { + messageRepository.getEphemeralMessagesMarkedForDeletion() + .onSuccess { ephemeralMessages -> + ephemeralMessages.forEach { ephemeralMessage -> + if (ephemeralMessage.expirationData != null) { + enqueueSelfDeletion( + message = ephemeralMessage, + expirationData = ephemeralMessage.expirationData!! + ) } } - } + } } } diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/ephemeral/SelfDeletionEventLogger .kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/ephemeral/SelfDeletionEventLogger .kt index 85dce8c3a91..cdd7da52e20 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/ephemeral/SelfDeletionEventLogger .kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/ephemeral/SelfDeletionEventLogger .kt @@ -34,7 +34,7 @@ internal object SelfDeletionEventLogger { } internal sealed class LoggingSelfDeletionEvent( - open val message: Message.Regular, + open val message: Message, open val expirationData: Message.ExpirationData ) { private companion object { @@ -61,7 +61,7 @@ internal sealed class LoggingSelfDeletionEvent( } data class SelfSelfDeletionAlreadyRequested( - override val message: Message.Regular, + override val message: Message, override val expirationData: Message.ExpirationData ) : LoggingSelfDeletionEvent(message, expirationData) { override fun eventJsonMap(): Map { @@ -72,7 +72,7 @@ internal sealed class LoggingSelfDeletionEvent( } data class MarkingSelfSelfDeletionStartDate( - override val message: Message.Regular, + override val message: Message, override val expirationData: Message.ExpirationData, val startDate: Instant ) : LoggingSelfDeletionEvent(message, expirationData) { @@ -85,7 +85,7 @@ internal sealed class LoggingSelfDeletionEvent( } data class WaitingForSelfDeletion( - override val message: Message.Regular, + override val message: Message, override val expirationData: Message.ExpirationData, val delayWaitTime: Duration ) : LoggingSelfDeletionEvent(message, expirationData) { @@ -98,7 +98,7 @@ internal sealed class LoggingSelfDeletionEvent( } data class StartingSelfSelfDeletion( - override val message: Message.Regular, + override val message: Message, override val expirationData: Message.ExpirationData, ) : LoggingSelfDeletionEvent(message, expirationData) { override fun eventJsonMap(): Map { @@ -109,49 +109,49 @@ internal sealed class LoggingSelfDeletionEvent( } data class AttemptingToDelete( - override val message: Message.Regular, + override val message: Message, override val expirationData: Message.ExpirationData ) : LoggingSelfDeletionEvent(message, expirationData) { override fun eventJsonMap(): Map { return mapOf( - "deletion-status" to "attempting-to-delete", - "is-self-user-sender" to message.isSelfMessage.toString() + "deletion-status" to "attempting-to-delete" + //"is-self-user-sender" to message.isSelfMessage.toString() ) } } data class SuccessfullyDeleted( - override val message: Message.Regular, + override val message: Message, override val expirationData: Message.ExpirationData, ) : LoggingSelfDeletionEvent(message, expirationData) { override fun eventJsonMap(): Map { return mapOf( "deletion-status" to "self-deletion-succeed", - "is-self-user-sender" to message.isSelfMessage.toString() + // "is-self-user-sender" to message.isSelfMessage.toString() ) } } data class InvalidMessageStatus( - override val message: Message.Regular, + override val message: Message, override val expirationData: Message.ExpirationData ) : LoggingSelfDeletionEvent(message, expirationData) { override fun eventJsonMap(): Map { return mapOf( - "deletion-status" to "invalid-message-status", - "is-self-user-sender" to message.isSelfMessage.toString(), + "deletion-status" to "invalid-message-status" + //"is-self-user-sender" to , ) } } data class SelfDeletionFailed( - override val message: Message.Regular, + override val message: Message, override val expirationData: Message.ExpirationData, val coreFailure: CoreFailure ) : LoggingSelfDeletionEvent(message, expirationData) { override fun eventJsonMap(): Map { return mapOf( "deletion-status" to "self-deletion-failed", - "is-self-user-sender" to message.isSelfMessage.toString(), + //"is-self-user-sender" to message.isSelfMessage.toString(), "reason" to coreFailure.toString() ) } diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/TeamEventReceiver.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/TeamEventReceiver.kt index 8eb38727e9a..1b7d2518e56 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/TeamEventReceiver.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/TeamEventReceiver.kt @@ -95,7 +95,8 @@ internal class TeamEventReceiverImpl( date = event.timestampIso, senderUserId = userId, status = Message.Status.SENT, - visibility = Message.Visibility.VISIBLE + visibility = Message.Visibility.VISIBLE, + expirationData = null ) persistMessage(message) } diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/ConversationMessageTimerEventHandler.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/ConversationMessageTimerEventHandler.kt index 21fc0a05b19..62dc7b193c8 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/ConversationMessageTimerEventHandler.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/ConversationMessageTimerEventHandler.kt @@ -54,7 +54,8 @@ internal class ConversationMessageTimerEventHandlerImpl( DateTimeUtil.currentIsoDateTimeString(), event.senderUserId, Message.Status.SENT, - Message.Visibility.VISIBLE + Message.Visibility.VISIBLE, + expirationData = null ) persistMessage(message) diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/MemberJoinEventHandler.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/MemberJoinEventHandler.kt index 1dca5233a16..4be64320bc4 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/MemberJoinEventHandler.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/MemberJoinEventHandler.kt @@ -74,7 +74,8 @@ internal class MemberJoinEventHandlerImpl( date = event.timestampIso, senderUserId = event.addedBy, status = Message.Status.SENT, - visibility = Message.Visibility.VISIBLE + visibility = Message.Visibility.VISIBLE, + expirationData = null ) persistMessage(message) kaliumLogger diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/MemberLeaveEventHandler.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/MemberLeaveEventHandler.kt index f9915d7ac2a..ff8bcbfde83 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/MemberLeaveEventHandler.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/MemberLeaveEventHandler.kt @@ -64,7 +64,8 @@ internal class MemberLeaveEventHandlerImpl( date = event.timestampIso, senderUserId = event.removedBy, status = Message.Status.SENT, - visibility = Message.Visibility.VISIBLE + visibility = Message.Visibility.VISIBLE, + expirationData = null ) persistMessage(message) kaliumLogger diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/NewConversationEventHandler.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/NewConversationEventHandler.kt index 4f4fbc23099..0cf6d22aeb0 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/NewConversationEventHandler.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/NewConversationEventHandler.kt @@ -75,7 +75,8 @@ internal class NewConversationEventHandlerImpl( DateTimeUtil.currentIsoDateTimeString(), qualifiedIdMapper.fromStringToQualifiedID(event.conversation.creator), Message.Status.SENT, - Message.Visibility.VISIBLE + Message.Visibility.VISIBLE, + expirationData = null ) persistMessage(message) kaliumLogger diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/ReceiptModeUpdateEventHandler.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/ReceiptModeUpdateEventHandler.kt index b13c0795fbe..dd61a7ad893 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/ReceiptModeUpdateEventHandler.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/ReceiptModeUpdateEventHandler.kt @@ -61,7 +61,8 @@ internal class ReceiptModeUpdateEventHandlerImpl( DateTimeUtil.currentIsoDateTimeString(), event.senderUserId, Message.Status.SENT, - Message.Visibility.VISIBLE + Message.Visibility.VISIBLE, + expirationData = null ) persistMessage(message) diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/RenamedConversationEventHandler.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/RenamedConversationEventHandler.kt index a8687aab40d..87e08fe0b36 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/RenamedConversationEventHandler.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/RenamedConversationEventHandler.kt @@ -53,6 +53,7 @@ internal class RenamedConversationEventHandlerImpl( date = event.timestampIso, senderUserId = event.senderUserId, status = Message.Status.SENT, + expirationData = null ) persistMessage(message) logger diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/message/ApplicationMessageHandler.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/message/ApplicationMessageHandler.kt index f39b174bcab..94889788ade 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/message/ApplicationMessageHandler.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/message/ApplicationMessageHandler.kt @@ -143,7 +143,13 @@ internal class ApplicationMessageHandlerImpl( senderUserId = senderUserId, senderClientId = senderClientId, status = Message.Status.SENT, - isSelfMessage = senderUserId == selfUserId + isSelfMessage = senderUserId == selfUserId, + expirationData = content.expiresAfterMillis?.let { + Message.ExpirationData( + expireAfter = it.toDuration(DurationUnit.MILLISECONDS), + selfDeletionStatus = Message.ExpirationData.SelfDeletionStatus.NotStarted + ) + } ) processSignaling(signalingMessage) } @@ -171,7 +177,8 @@ internal class ApplicationMessageHandlerImpl( date = signaling.date, senderUserId = signaling.senderUserId, status = signaling.status, - senderUserName = signaling.senderUserName + senderUserName = signaling.senderUserName, + expirationData = null ) logger.i(message = "Persisting crypto session reset system message..") diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/message/GetNotificationsUseCaseTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/message/GetNotificationsUseCaseTest.kt index f57659347f2..6b1377b74bb 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/message/GetNotificationsUseCaseTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/message/GetNotificationsUseCaseTest.kt @@ -463,7 +463,8 @@ class GetNotificationsUseCaseTest { conversationId = conversationId, date = "some_time", senderUserId = senderId, - status = Message.Status.SENT + status = Message.Status.SENT, + expirationData = null ) private fun notificationMessageText( diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/message/MessageSenderTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/message/MessageSenderTest.kt index 20340551bcf..b2517bae4be 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/message/MessageSenderTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/message/MessageSenderTest.kt @@ -355,7 +355,8 @@ class MessageSenderTest { senderUserId = UserId("userValue", "userDomain"), senderClientId = ClientId("clientId"), status = Message.Status.SENT, - isSelfMessage = false + isSelfMessage = false, + expirationData = null ) val messageTarget = MessageTarget.Client( @@ -407,7 +408,8 @@ class MessageSenderTest { senderUserId = UserId("userValue", "userDomain"), senderClientId = ClientId("clientId"), status = Message.Status.SENT, - isSelfMessage = false + isSelfMessage = true, + expirationData = null ) val messageTarget = MessageTarget.Conversation @@ -655,7 +657,8 @@ class MessageSenderTest { senderUserId = UserId("userValue", "userDomain"), senderClientId = ClientId("clientId"), status = Message.Status.PENDING, - isSelfMessage = false + isSelfMessage = false, + expirationData = null ) arrangement.testScope.runTest { diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/message/ephemeral/EphemeralMessageDeletionHandlerTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/message/ephemeral/EphemeralMessageDeletionHandlerTest.kt index c13d6c14597..91b50db0041 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/message/ephemeral/EphemeralMessageDeletionHandlerTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/message/ephemeral/EphemeralMessageDeletionHandlerTest.kt @@ -2,6 +2,7 @@ package com.wire.kalium.logic.feature.message.ephemeral import com.wire.kalium.logic.data.message.Message import com.wire.kalium.logic.data.message.MessageRepository +import com.wire.kalium.logic.data.user.UserId import com.wire.kalium.logic.framework.TestMessage import com.wire.kalium.logic.functional.Either import com.wire.kalium.logic.test_util.TestKaliumDispatcher @@ -181,6 +182,7 @@ class EphemeralMessageDeletionHandlerTest { expireAfter = timeUntilExpiration, selfDeletionStatus = Message.ExpirationData.SelfDeletionStatus.NotStarted ), + senderUserId = SELF_USER_ID, isSelfMessage = true, status = Message.Status.SENT ) @@ -337,6 +339,7 @@ class EphemeralMessageDeletionHandlerTest { expireAfter = timeUntilExpiration, selfDeletionStatus = Message.ExpirationData.SelfDeletionStatus.NotStarted ), + senderUserId = SELF_USER_ID, isSelfMessage = true, status = Message.Status.SENT ) @@ -475,6 +478,7 @@ class EphemeralMessageDeletionHandlerTest { expireAfter = 1.seconds, selfDeletionStatus = Message.ExpirationData.SelfDeletionStatus.NotStarted ), + senderUserId = SELF_USER_ID, isSelfMessage = true, status = Message.Status.SENT ) @@ -485,6 +489,7 @@ class EphemeralMessageDeletionHandlerTest { expireAfter = 2.seconds, selfDeletionStatus = Message.ExpirationData.SelfDeletionStatus.NotStarted ), + senderUserId = SELF_USER_ID, isSelfMessage = true, status = Message.Status.SENT ) @@ -495,6 +500,7 @@ class EphemeralMessageDeletionHandlerTest { expireAfter = 3.seconds, selfDeletionStatus = Message.ExpirationData.SelfDeletionStatus.NotStarted ), + senderUserId = SELF_USER_ID, isSelfMessage = true, status = Message.Status.SENT ) @@ -505,6 +511,7 @@ class EphemeralMessageDeletionHandlerTest { expireAfter = 4.seconds, selfDeletionStatus = Message.ExpirationData.SelfDeletionStatus.NotStarted ), + senderUserId = SELF_USER_ID, isSelfMessage = true, status = Message.Status.SENT ) @@ -612,6 +619,7 @@ class EphemeralMessageDeletionHandlerTest { runTest(testDispatcher.default) { // given val oneSecondsEphemeralMessage = TestMessage.TEXT_MESSAGE.copy( + senderUserId = SELF_USER_ID, expirationData = Message.ExpirationData( expireAfter = 1.seconds, selfDeletionStatus = Message.ExpirationData.SelfDeletionStatus.NotStarted @@ -703,66 +711,75 @@ class EphemeralMessageDeletionHandlerTest { private fun TestScope.advanceTimeBy(duration: Duration) = advanceTimeBy(duration.inWholeMilliseconds) -} -private class Arrangement(private val coroutineScope: CoroutineScope, private val dispatcher: TestKaliumDispatcher) { + private companion object { + val SELF_USER_ID = UserId("self-user-id", "self-user-domain") + } - @Mock - val messageRepository = mock(classOf()) + private class Arrangement( + private val coroutineScope: CoroutineScope, + private val dispatcher: TestKaliumDispatcher + ) { - @Mock - val deleteEphemeralMessageForSelfUserAsReceiver = mock( - classOf() - ) + @Mock + val messageRepository = mock(classOf()) - @Mock - val deleteEphemeralMessageForSelfUserAsSender = mock(classOf()) + @Mock + val deleteEphemeralMessageForSelfUserAsReceiver = mock( + classOf() + ) - fun withMessageRepositoryReturningMessage(message: Message): Arrangement { - given(messageRepository) - .suspendFunction(messageRepository::getMessageById) - .whenInvokedWith(any(), any()) - .then { _, _ -> Either.Right(message) } + @Mock + val deleteEphemeralMessageForSelfUserAsSender = mock(classOf()) - return this - } + fun withMessageRepositoryReturningMessage(message: Message): Arrangement { + given(messageRepository) + .suspendFunction(messageRepository::getMessageById) + .whenInvokedWith(any(), any()) + .then { _, _ -> Either.Right(message) } - fun withMessageRepositoryMarkingSelfDeletionStartDate(): Arrangement { - given(messageRepository) - .suspendFunction(messageRepository::markSelfDeletionStartDate) - .whenInvokedWith(any(), any(), any()) - .then { _, _, _ -> Either.Right(Unit) } + return this + } - return this - } + fun withMessageRepositoryMarkingSelfDeletionStartDate(): Arrangement { + given(messageRepository) + .suspendFunction(messageRepository::markSelfDeletionStartDate) + .whenInvokedWith(any(), any(), any()) + .then { _, _, _ -> Either.Right(Unit) } - fun withDeletingMessage(): Arrangement { - given(deleteEphemeralMessageForSelfUserAsReceiver) - .suspendFunction(deleteEphemeralMessageForSelfUserAsReceiver::invoke) - .whenInvokedWith(any(), any()) - .then { _, _ -> Either.Right(Unit) } - given(deleteEphemeralMessageForSelfUserAsSender) - .suspendFunction(deleteEphemeralMessageForSelfUserAsSender::invoke) - .whenInvokedWith(any(), any()) - .then { _, _ -> Either.Right(Unit) } - - return this - } + return this + } + + fun withDeletingMessage(): Arrangement { + given(deleteEphemeralMessageForSelfUserAsReceiver) + .suspendFunction(deleteEphemeralMessageForSelfUserAsReceiver::invoke) + .whenInvokedWith(any(), any()) + .then { _, _ -> Either.Right(Unit) } + given(deleteEphemeralMessageForSelfUserAsSender) + .suspendFunction(deleteEphemeralMessageForSelfUserAsSender::invoke) + .whenInvokedWith(any(), any()) + .then { _, _ -> Either.Right(Unit) } + + return this + } - fun withMessageRepositoryReturningPendingEphemeralMessages(messages: List): Arrangement { - given(messageRepository) - .suspendFunction(messageRepository::getEphemeralMessagesMarkedForDeletion) - .whenInvoked() - .then { Either.Right(messages) } + fun withMessageRepositoryReturningPendingEphemeralMessages(messages: List): Arrangement { + given(messageRepository) + .suspendFunction(messageRepository::getEphemeralMessagesMarkedForDeletion) + .whenInvoked() + .then { Either.Right(messages) } - return this + return this + } + + fun arrange() = this to EphemeralMessageDeletionHandlerImpl( + messageRepository, + SELF_USER_ID, + dispatcher, + deleteEphemeralMessageForSelfUserAsReceiver, + deleteEphemeralMessageForSelfUserAsSender, + coroutineScope + ) } - fun arrange() = this to EphemeralMessageDeletionHandlerImpl( - messageRepository, - dispatcher, - deleteEphemeralMessageForSelfUserAsReceiver, - deleteEphemeralMessageForSelfUserAsSender, - coroutineScope - ) } diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/framework/TestMessage.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/framework/TestMessage.kt index 24c1c2346da..02930f44e7d 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/framework/TestMessage.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/framework/TestMessage.kt @@ -71,6 +71,7 @@ object TestMessage { date = TEST_DATE_STRING, senderUserId = TEST_SENDER_USER_ID, status = Message.Status.PENDING, + expirationData = null ) fun assetMessage(assetId: String = TEST_MESSAGE_ID) = Message.Regular( @@ -118,6 +119,7 @@ object TestMessage { senderUserId = TEST_SENDER_USER_ID, senderClientId = TEST_SENDER_CLIENT_ID, status = Message.Status.SENT, - isSelfMessage = false + isSelfMessage = false, + expirationData = null ) } diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/sync/receiver/conversation/message/ReceiptMessageHandlerTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/sync/receiver/conversation/message/ReceiptMessageHandlerTest.kt index 92e499ac028..89865e9319e 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/sync/receiver/conversation/message/ReceiptMessageHandlerTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/sync/receiver/conversation/message/ReceiptMessageHandlerTest.kt @@ -142,7 +142,8 @@ class ReceiptMessageHandlerTest { senderUserId = senderUserId, senderClientId = ClientId("SomeClientId"), status = Message.Status.SENT, - isSelfMessage = false + isSelfMessage = false, + expirationData = null ), messageContent = content ) diff --git a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/message/MessageEntity.kt b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/message/MessageEntity.kt index bf7512a59d7..ee8527e0c51 100644 --- a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/message/MessageEntity.kt +++ b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/message/MessageEntity.kt @@ -28,16 +28,18 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Suppress("LongParameterList") -sealed class MessageEntity( - open val id: String, - open val content: MessageEntityContent, - open val conversationId: QualifiedIDEntity, - open val date: Instant, - open val senderUserId: QualifiedIDEntity, - open val status: Status, - open val visibility: Visibility, - open val isSelfMessage: Boolean, -) { +sealed interface MessageEntity { + val id: String + val content: MessageEntityContent + val conversationId: QualifiedIDEntity + val date: Instant + val senderUserId: QualifiedIDEntity + val status: Status + val visibility: Visibility + val isSelfMessage: Boolean + val expireAfterMs: Long? + val selfDeletionStartDate: Instant? + data class Regular( override val id: String, override val conversationId: QualifiedIDEntity, @@ -47,23 +49,14 @@ sealed class MessageEntity( override val visibility: Visibility = Visibility.VISIBLE, override val content: MessageEntityContent.Regular, override val isSelfMessage: Boolean = false, + override val expireAfterMs: Long? = null, + override val selfDeletionStartDate: Instant? = null, val senderName: String?, val senderClientId: String, val editStatus: EditStatus, - val expireAfterMs: Long? = null, - val selfDeletionStartDate: Instant? = null, val reactions: ReactionsEntity = ReactionsEntity.EMPTY, val expectsReadConfirmation: Boolean = false - ) : MessageEntity( - id = id, - content = content, - conversationId = conversationId, - date = date, - senderUserId = senderUserId, - status = status, - visibility = visibility, - isSelfMessage = isSelfMessage - ) + ) : MessageEntity data class System( override val id: String, @@ -72,19 +65,12 @@ sealed class MessageEntity( override val date: Instant, override val senderUserId: QualifiedIDEntity, override val status: Status, + override val expireAfterMs: Long?, + override val selfDeletionStartDate: Instant?, override val visibility: Visibility = Visibility.VISIBLE, override val isSelfMessage: Boolean = false, val senderName: String?, - ) : MessageEntity( - id = id, - content = content, - conversationId = conversationId, - date = date, - senderUserId = senderUserId, - status = status, - visibility = visibility, - isSelfMessage = isSelfMessage - ) + ) : MessageEntity enum class Status { /** diff --git a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/message/MessageMapper.kt b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/message/MessageMapper.kt index 75b3e258d25..0f241119114 100644 --- a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/message/MessageMapper.kt +++ b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/dao/message/MessageMapper.kt @@ -325,7 +325,9 @@ object MessageMapper { status = status, visibility = visibility, senderName = senderName, - isSelfMessage = isSelfMessage + isSelfMessage = isSelfMessage, + expireAfterMs = expireAfterMillis, + selfDeletionStartDate = selfDeletionStartDate ) } diff --git a/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/backup/UserDatabaseDataGenerator.kt b/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/backup/UserDatabaseDataGenerator.kt index ff062e15a3b..8ec07d52085 100644 --- a/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/backup/UserDatabaseDataGenerator.kt +++ b/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/backup/UserDatabaseDataGenerator.kt @@ -220,7 +220,9 @@ class UserDatabaseDataGenerator( senderUserId = senderUser.id, status = MessageEntity.Status.values()[index % MessageEntity.Status.values().size], visibility = sanitizedVisibility, - senderName = "$messagePrefix SenderName" + senderName = "$messagePrefix SenderName", + expireAfterMs = null, + selfDeletionStartDate = null ) ) diff --git a/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/utils/stubs/MessageStubs.kt b/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/utils/stubs/MessageStubs.kt index 245956c498b..e7df3e5d97e 100644 --- a/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/utils/stubs/MessageStubs.kt +++ b/persistence/src/commonTest/kotlin/com/wire/kalium/persistence/utils/stubs/MessageStubs.kt @@ -71,5 +71,7 @@ fun newSystemMessageEntity( senderUserId = senderUserId, status = status, visibility = visibility, - senderName = "senderName" + senderName = "senderName", + expireAfterMs = null, + selfDeletionStartDate = null ) From 65976c3fbf13e706567e5dfa76cbca24d0caabc8 Mon Sep 17 00:00:00 2001 From: Mohamad Jaara Date: Mon, 10 Jul 2023 12:36:20 +0200 Subject: [PATCH 2/8] parse ephemeral pings from/to proto --- .../logic/data/message/ProtoContentMapper.kt | 38 ++++++++++++++++--- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/ProtoContentMapper.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/ProtoContentMapper.kt index 2f39b8180be..78c79a1b985 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/ProtoContentMapper.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/ProtoContentMapper.kt @@ -142,9 +142,27 @@ class ProtoContentMapperImpl( ) } - else -> { - throw IllegalArgumentException("Unexpected message content type for ephemeral message: ${readableContent.getType()}") + is MessageContent.Knock -> { + val knock = GenericMessage.Content.Knock(Knock(hotKnock = readableContent.hotKnock)) + Ephemeral.Content.Knock(knock.value) } + + is MessageContent.FailedDecryption, + is MessageContent.RestrictedAsset, + is MessageContent.Unknown, + is MessageContent.Availability, + is MessageContent.Calling, + is MessageContent.Cleared, + MessageContent.ClientAction, + is MessageContent.DeleteForMe, + is MessageContent.DeleteMessage, + MessageContent.Ignored, + is MessageContent.LastRead, + is MessageContent.Reaction, + is MessageContent.Receipt, + is MessageContent.TextEdited -> throw IllegalArgumentException( + "Unexpected message content type: ${readableContent.getType()}" + ) } return GenericMessage.Content.Ephemeral(Ephemeral(expireAfterMillis = expireAfterMillis, content = ephemeralContent)) } @@ -216,7 +234,9 @@ class ProtoContentMapperImpl( is GenericMessage.Content.LastRead -> unpackLastRead(genericMessage, protoContent) is GenericMessage.Content.Location -> MessageContent.Unknown(typeName, encodedContent.data) is GenericMessage.Content.Reaction -> unpackReaction(protoContent) - else -> { + + is GenericMessage.Content.External, + null -> { kaliumLogger.w("Null content when parsing protobuf. Message UUID = ${genericMessage.messageId.obfuscateId()}") MessageContent.Ignored } @@ -355,7 +375,7 @@ class ProtoContentMapperImpl( } null -> { - kaliumLogger.w("Edit content is unexpected. Message UUID = $genericMessage.") + kaliumLogger.w("Edit content is unexpected. Message UUID = ${genericMessage.messageId.obfuscateId()}") MessageContent.Ignored } } @@ -448,8 +468,16 @@ class ProtoContentMapperImpl( unpackAsset(genericAssetContent) } + is Ephemeral.Content.Knock -> { + MessageContent.Knock( + ephemeralContent.value.hotKnock + ) + } + // Handle self-deleting Location messages when they are implemented - else -> { + is Ephemeral.Content.Image, + is Ephemeral.Content.Location, + null -> { MessageContent.Ignored } } From 0f31b61d9a5e961b8075ac0431f0689d2b0d8135 Mon Sep 17 00:00:00 2001 From: Mohamad Jaara Date: Mon, 10 Jul 2023 14:31:56 +0200 Subject: [PATCH 3/8] feat: accept ephemeral system message --- .../kalium/logic/feature/message/MessageEnvelopeCreator.kt | 2 +- .../message/ephemeral/EphemeralMessageDeletionHandler.kt | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/MessageEnvelopeCreator.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/MessageEnvelopeCreator.kt index 2e00ae914ce..d8d99fc80e8 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/MessageEnvelopeCreator.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/MessageEnvelopeCreator.kt @@ -84,7 +84,7 @@ class MessageEnvelopeCreatorImpl( messageUid = message.id, messageContent = message.content, expectsReadConfirmation = expectsReadConfirmation, - expiresAfterMillis = (message as? Message.Regular)?.expirationData?.expireAfter?.inWholeMilliseconds + expiresAfterMillis = message.expirationData?.expireAfter?.inWholeMilliseconds ) return createEnvelope(actualMessageContent, recipients, senderClientId) diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/ephemeral/EphemeralMessageDeletionHandler.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/ephemeral/EphemeralMessageDeletionHandler.kt index 13a0bf2d698..43160216108 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/ephemeral/EphemeralMessageDeletionHandler.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/ephemeral/EphemeralMessageDeletionHandler.kt @@ -3,6 +3,7 @@ package com.wire.kalium.logic.feature.message.ephemeral import com.wire.kalium.logic.data.id.ConversationId import com.wire.kalium.logic.data.message.Message import com.wire.kalium.logic.data.message.MessageRepository +import com.wire.kalium.logic.data.message.getType import com.wire.kalium.logic.data.user.UserId import com.wire.kalium.logic.functional.Either import com.wire.kalium.logic.functional.map @@ -48,7 +49,7 @@ internal class EphemeralMessageDeletionHandlerImpl( ) } else { kaliumLogger.i( - "Self deletion requested for message without expiration data or a system message: $message" + "Self deletion requested for message without expiration data: ${message.content.getType()}" ) } } From e6bf712754dd36998f5955ea4aa1205618aa5761 Mon Sep 17 00:00:00 2001 From: Mohamad Jaara Date: Mon, 10 Jul 2023 16:10:40 +0200 Subject: [PATCH 4/8] detekt --- .../logic/data/message/MessageMapper.kt | 92 ++++++++++--------- .../ephemeral/SelfDeletionEventLogger .kt | 5 +- 2 files changed, 48 insertions(+), 49 deletions(-) diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/MessageMapper.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/MessageMapper.kt index 9b1d16a070f..9eb0f4f25be 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/MessageMapper.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/MessageMapper.kt @@ -113,7 +113,7 @@ class MessageMapperImpl( } override fun fromEntityToMessage(message: MessageEntity): Message.Standalone { - val status = when (message.status) { + val status: Message.Status = when (message.status) { MessageEntity.Status.PENDING -> Message.Status.PENDING MessageEntity.Status.SENT -> Message.Status.SENT MessageEntity.Status.READ -> Message.Status.READ @@ -121,53 +121,55 @@ class MessageMapperImpl( MessageEntity.Status.FAILED_REMOTELY -> Message.Status.FAILED_REMOTELY } return when (message) { - is MessageEntity.Regular -> - Message.Regular( - id = message.id, - content = message.content.toMessageContent(message.visibility.toModel() == Message.Visibility.HIDDEN), - conversationId = message.conversationId.toModel(), - date = message.date.toIsoDateTimeString(), - senderUserId = message.senderUserId.toModel(), - senderClientId = ClientId(message.senderClientId), - status = status, - editStatus = when (val editStatus = message.editStatus) { - MessageEntity.EditStatus.NotEdited -> Message.EditStatus.NotEdited - is MessageEntity.EditStatus.Edited -> Message.EditStatus.Edited(editStatus.lastDate.toIsoDateTimeString()) - }, - expirationData = message.expireAfterMs?.let { - Message.ExpirationData( - expireAfter = it.toDuration(DurationUnit.MILLISECONDS), - selfDeletionStatus = message.selfDeletionStartDate - ?.let { Message.ExpirationData.SelfDeletionStatus.Started(it) } - ?: Message.ExpirationData.SelfDeletionStatus.NotStarted) - }, - visibility = message.visibility.toModel(), - reactions = Message.Reactions(message.reactions.totalReactions, message.reactions.selfUserReactions), - senderUserName = message.senderName, - isSelfMessage = message.isSelfMessage, - expectsReadConfirmation = message.expectsReadConfirmation - ) - - is MessageEntity.System -> Message.System( - id = message.id, - content = message.content.toMessageContent(), - conversationId = message.conversationId.toModel(), - date = message.date.toIsoDateTimeString(), - senderUserId = message.senderUserId.toModel(), - status = status, - visibility = message.visibility.toModel(), - senderUserName = message.senderName, - expirationData = message.expireAfterMs?.let { - Message.ExpirationData( - expireAfter = it.toDuration(DurationUnit.MILLISECONDS), - selfDeletionStatus = message.selfDeletionStartDate - ?.let { Message.ExpirationData.SelfDeletionStatus.Started(it) } - ?: Message.ExpirationData.SelfDeletionStatus.NotStarted) - } - ) + is MessageEntity.Regular -> mapRegularMessage(message, status) + is MessageEntity.System -> mapSystemMessage(message, status) } } + private fun mapRegularMessage(message: MessageEntity.Regular, status: Message.Status) = Message.Regular( + id = message.id, + content = message.content.toMessageContent(message.visibility.toModel() == Message.Visibility.HIDDEN), + conversationId = message.conversationId.toModel(), + date = message.date.toIsoDateTimeString(), + senderUserId = message.senderUserId.toModel(), + senderClientId = ClientId(message.senderClientId), + status = status, + editStatus = when (val editStatus = message.editStatus) { + MessageEntity.EditStatus.NotEdited -> Message.EditStatus.NotEdited + is MessageEntity.EditStatus.Edited -> Message.EditStatus.Edited(editStatus.lastDate.toIsoDateTimeString()) + }, + expirationData = message.expireAfterMs?.let { + Message.ExpirationData( + expireAfter = it.toDuration(DurationUnit.MILLISECONDS), + selfDeletionStatus = message.selfDeletionStartDate + ?.let { Message.ExpirationData.SelfDeletionStatus.Started(it) } + ?: Message.ExpirationData.SelfDeletionStatus.NotStarted) + }, + visibility = message.visibility.toModel(), + reactions = Message.Reactions(message.reactions.totalReactions, message.reactions.selfUserReactions), + senderUserName = message.senderName, + isSelfMessage = message.isSelfMessage, + expectsReadConfirmation = message.expectsReadConfirmation + ) + + private fun mapSystemMessage(message: MessageEntity.System, status: Message.Status) = Message.System( + id = message.id, + content = message.content.toMessageContent(), + conversationId = message.conversationId.toModel(), + date = message.date.toIsoDateTimeString(), + senderUserId = message.senderUserId.toModel(), + status = status, + visibility = message.visibility.toModel(), + senderUserName = message.senderName, + expirationData = message.expireAfterMs?.let { + Message.ExpirationData( + expireAfter = it.toDuration(DurationUnit.MILLISECONDS), + selfDeletionStatus = message.selfDeletionStartDate + ?.let { Message.ExpirationData.SelfDeletionStatus.Started(it) } + ?: Message.ExpirationData.SelfDeletionStatus.NotStarted) + } + ) + override fun fromEntityToMessagePreview(message: MessagePreviewEntity): MessagePreview { return MessagePreview( id = message.id, diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/ephemeral/SelfDeletionEventLogger .kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/ephemeral/SelfDeletionEventLogger .kt index cdd7da52e20..85c5e2ed499 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/ephemeral/SelfDeletionEventLogger .kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/ephemeral/SelfDeletionEventLogger .kt @@ -115,7 +115,6 @@ internal sealed class LoggingSelfDeletionEvent( override fun eventJsonMap(): Map { return mapOf( "deletion-status" to "attempting-to-delete" - //"is-self-user-sender" to message.isSelfMessage.toString() ) } } @@ -127,7 +126,6 @@ internal sealed class LoggingSelfDeletionEvent( override fun eventJsonMap(): Map { return mapOf( "deletion-status" to "self-deletion-succeed", - // "is-self-user-sender" to message.isSelfMessage.toString() ) } } @@ -139,10 +137,10 @@ internal sealed class LoggingSelfDeletionEvent( override fun eventJsonMap(): Map { return mapOf( "deletion-status" to "invalid-message-status" - //"is-self-user-sender" to , ) } } + data class SelfDeletionFailed( override val message: Message, override val expirationData: Message.ExpirationData, @@ -151,7 +149,6 @@ internal sealed class LoggingSelfDeletionEvent( override fun eventJsonMap(): Map { return mapOf( "deletion-status" to "self-deletion-failed", - //"is-self-user-sender" to message.isSelfMessage.toString(), "reason" to coreFailure.toString() ) } From b2048c6b51cf5d2608b4c9fc0d8056419867ae59 Mon Sep 17 00:00:00 2001 From: Mohamad Jaara Date: Mon, 10 Jul 2023 16:20:05 +0200 Subject: [PATCH 5/8] detekt --- .../logic/data/message/MessageMapper.kt | 96 +++++++++++-------- 1 file changed, 54 insertions(+), 42 deletions(-) diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/MessageMapper.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/MessageMapper.kt index 9eb0f4f25be..89caf32412c 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/MessageMapper.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/MessageMapper.kt @@ -67,51 +67,63 @@ class MessageMapperImpl( } val visibility = message.visibility.toEntityVisibility() return when (message) { - is Message.Regular -> MessageEntity.Regular( - id = message.id, - content = toMessageEntityContent(message.content), - conversationId = message.conversationId.toDao(), - date = message.date.toInstant(), - senderUserId = message.senderUserId.toDao(), - senderClientId = message.senderClientId.value, - status = status, - editStatus = when (message.editStatus) { - is Message.EditStatus.NotEdited -> MessageEntity.EditStatus.NotEdited - is Message.EditStatus.Edited -> MessageEntity.EditStatus.Edited(message.editStatus.lastTimeStamp.toInstant()) - }, - expireAfterMs = message.expirationData?.let { it.expireAfter.inWholeMilliseconds }, - selfDeletionStartDate = message.expirationData?.let { - when (val status = it.selfDeletionStatus) { - is Message.ExpirationData.SelfDeletionStatus.Started -> status.selfDeletionStartDate - is Message.ExpirationData.SelfDeletionStatus.NotStarted -> null - } - }, - visibility = visibility, - senderName = message.senderUserName, - isSelfMessage = message.isSelfMessage, - expectsReadConfirmation = message.expectsReadConfirmation - ) - - is Message.System -> MessageEntity.System( - id = message.id, - content = message.content.toMessageEntityContent(), - conversationId = message.conversationId.toDao(), - date = message.date.toInstant(), - senderUserId = message.senderUserId.toDao(), - status = status, - visibility = visibility, - senderName = message.senderUserName, - expireAfterMs = message.expirationData?.let { it.expireAfter.inWholeMilliseconds }, - selfDeletionStartDate = message.expirationData?.let { - when (val status = it.selfDeletionStatus) { - is Message.ExpirationData.SelfDeletionStatus.Started -> status.selfDeletionStartDate - is Message.ExpirationData.SelfDeletionStatus.NotStarted -> null - } - }, - ) + is Message.Regular -> mapFromRegularMessage(message, status, visibility) + is Message.System -> mapFromSystemMessage(message, status, visibility) } } + private fun mapFromRegularMessage( + message: Message.Regular, + status: MessageEntity.Status, + visibility: MessageEntity.Visibility + ) = + MessageEntity.Regular( + id = message.id, + content = toMessageEntityContent(message.content), + conversationId = message.conversationId.toDao(), + date = message.date.toInstant(), + senderUserId = message.senderUserId.toDao(), + senderClientId = message.senderClientId.value, + status = status, + editStatus = when (message.editStatus) { + is Message.EditStatus.NotEdited -> MessageEntity.EditStatus.NotEdited + is Message.EditStatus.Edited -> MessageEntity.EditStatus.Edited(message.editStatus.lastTimeStamp.toInstant()) + }, + expireAfterMs = message.expirationData?.let { it.expireAfter.inWholeMilliseconds }, + selfDeletionStartDate = message.expirationData?.let { + when (val status = it.selfDeletionStatus) { + is Message.ExpirationData.SelfDeletionStatus.Started -> status.selfDeletionStartDate + is Message.ExpirationData.SelfDeletionStatus.NotStarted -> null + } + }, + visibility = visibility, + senderName = message.senderUserName, + isSelfMessage = message.isSelfMessage, + expectsReadConfirmation = message.expectsReadConfirmation + ) + + private fun mapFromSystemMessage( + message: Message.System, + status: MessageEntity.Status, + visibility: MessageEntity.Visibility + ) = MessageEntity.System( + id = message.id, + content = message.content.toMessageEntityContent(), + conversationId = message.conversationId.toDao(), + date = message.date.toInstant(), + senderUserId = message.senderUserId.toDao(), + status = status, + visibility = visibility, + senderName = message.senderUserName, + expireAfterMs = message.expirationData?.let { it.expireAfter.inWholeMilliseconds }, + selfDeletionStartDate = message.expirationData?.let { + when (it.selfDeletionStatus) { + is Message.ExpirationData.SelfDeletionStatus.Started -> it.selfDeletionStatus.selfDeletionStartDate + is Message.ExpirationData.SelfDeletionStatus.NotStarted -> null + } + }, + ) + override fun fromEntityToMessage(message: MessageEntity): Message.Standalone { val status: Message.Status = when (message.status) { MessageEntity.Status.PENDING -> Message.Status.PENDING From f8a835e8468faaf9cd49602b5c9bce39903e739b Mon Sep 17 00:00:00 2001 From: Mohamad Jaara Date: Mon, 10 Jul 2023 16:47:13 +0200 Subject: [PATCH 6/8] fix test --- .../com/wire/kalium/logic/feature/call/CallManagerTest.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/logic/src/androidAndroidTest/kotlin/com/wire/kalium/logic/feature/call/CallManagerTest.kt b/logic/src/androidAndroidTest/kotlin/com/wire/kalium/logic/feature/call/CallManagerTest.kt index 5c93b519a36..e5991c312bb 100644 --- a/logic/src/androidAndroidTest/kotlin/com/wire/kalium/logic/feature/call/CallManagerTest.kt +++ b/logic/src/androidAndroidTest/kotlin/com/wire/kalium/logic/feature/call/CallManagerTest.kt @@ -148,7 +148,8 @@ class CallManagerTest { senderUserId = UserId(value = "value", domain = "domain"), senderClientId = ClientId(value = "value"), status = Message.Status.SENT, - isSelfMessage = false + isSelfMessage = false, + expirationData = null ) } } From bf829c5b8fb872a3c2975f21ef7b8c4dbf870ba2 Mon Sep 17 00:00:00 2001 From: Mohamad Jaara Date: Tue, 11 Jul 2023 11:07:33 +0200 Subject: [PATCH 7/8] address PR comments --- .../com/wire/kalium/logic/feature/message/MessageSender.kt | 4 ++-- .../message/ephemeral/EphemeralMessageDeletionHandler.kt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/MessageSender.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/MessageSender.kt index 20a4b62dbe5..8bf54824767 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/MessageSender.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/MessageSender.kt @@ -229,8 +229,8 @@ internal class MessageSenderImpl internal constructor( } private fun startSelfDeletionIfNeeded(message: Message.Sendable) { - if (message.expirationData != null) { - enqueueSelfDeletion(message, message.expirationData!!) + message.expirationData?.let { expirationData -> + enqueueSelfDeletion(message, expirationData) } } diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/ephemeral/EphemeralMessageDeletionHandler.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/ephemeral/EphemeralMessageDeletionHandler.kt index 43160216108..4978236dda2 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/ephemeral/EphemeralMessageDeletionHandler.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/ephemeral/EphemeralMessageDeletionHandler.kt @@ -209,10 +209,10 @@ internal class EphemeralMessageDeletionHandlerImpl( messageRepository.getEphemeralMessagesMarkedForDeletion() .onSuccess { ephemeralMessages -> ephemeralMessages.forEach { ephemeralMessage -> - if (ephemeralMessage.expirationData != null) { + ephemeralMessage.expirationData?.let { expirationData -> enqueueSelfDeletion( message = ephemeralMessage, - expirationData = ephemeralMessage.expirationData!! + expirationData = expirationData ) } } From 9ed21dc83ea62485d1552176f6cef297ec9cb823 Mon Sep 17 00:00:00 2001 From: Mohamad Jaara Date: Tue, 11 Jul 2023 12:10:05 +0200 Subject: [PATCH 8/8] address PR comments --- .../com/wire/kalium/logic/data/message/ProtoContentMapper.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/ProtoContentMapper.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/ProtoContentMapper.kt index 78c79a1b985..87cb8acdf59 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/ProtoContentMapper.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/message/ProtoContentMapper.kt @@ -235,7 +235,10 @@ class ProtoContentMapperImpl( is GenericMessage.Content.Location -> MessageContent.Unknown(typeName, encodedContent.data) is GenericMessage.Content.Reaction -> unpackReaction(protoContent) - is GenericMessage.Content.External, + is GenericMessage.Content.External -> { + kaliumLogger.w("External content when parsing protobuf. Message UUID = ${genericMessage.messageId.obfuscateId()}") + MessageContent.Ignored + } null -> { kaliumLogger.w("Null content when parsing protobuf. Message UUID = ${genericMessage.messageId.obfuscateId()}") MessageContent.Ignored