From c2d3536dd8de2a945664b532e6c0de2fabbee54c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Zag=C3=B3rski?= Date: Tue, 22 Oct 2024 10:27:07 +0200 Subject: [PATCH 1/2] fix: Failed image message are not visible on chat #WPB-11035 (#3516) --- .../com/wire/android/mapper/RegularMessageContentMapper.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/wire/android/mapper/RegularMessageContentMapper.kt b/app/src/main/kotlin/com/wire/android/mapper/RegularMessageContentMapper.kt index 5c1a62d1e98..6336f558bb4 100644 --- a/app/src/main/kotlin/com/wire/android/mapper/RegularMessageContentMapper.kt +++ b/app/src/main/kotlin/com/wire/android/mapper/RegularMessageContentMapper.kt @@ -38,10 +38,10 @@ import com.wire.kalium.logic.data.message.DeliveryStatus import com.wire.kalium.logic.data.message.Message import com.wire.kalium.logic.data.message.MessageContent import com.wire.kalium.logic.data.message.MessageContent.Asset +import com.wire.kalium.logic.data.message.hasValidData import com.wire.kalium.logic.data.user.AssetId import com.wire.kalium.logic.data.user.SelfUser import com.wire.kalium.logic.data.user.User -import com.wire.kalium.logic.sync.receiver.conversation.message.hasValidRemoteData import com.wire.kalium.logic.util.isGreaterThan import kotlinx.collections.immutable.toPersistentList import kotlinx.collections.immutable.toPersistentMap @@ -239,7 +239,8 @@ class RegularMessageMapper @Inject constructor( with(assetMessageContentMetadata.assetMessageContent) { when { // If some of image data are still missing, we mark it as incomplete which won't be shown until we get missing data - assetMessageContentMetadata.isIncompleteImage() -> { + // But we also check if isnt our own message, if its our own, most likely the there was an error sending the image. + assetMessageContentMetadata.isIncompleteImage() && sender !is SelfUser -> { UIMessageContent.IncompleteAssetMessage } @@ -306,7 +307,7 @@ class AssetMessageContentMetadata(val assetMessageContent: AssetContent) { // Sometimes client receives two events for the same asset, first one with only part of the data ("preview" type from web), // so such asset shouldn't be shown until all the required data is received. - fun isIncompleteImage(): Boolean = isDisplayableImage() && !assetMessageContent.hasValidRemoteData() + fun isIncompleteImage(): Boolean = isDisplayableImage() && !assetMessageContent.remoteData.hasValidData() } private fun String?.orUnknownName(): UIText = when { From 07b9e6b2b5f39ae3239fd19b88404ed97f34803c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Zag=C3=B3rski?= Date: Tue, 22 Oct 2024 12:14:56 +0200 Subject: [PATCH 2/2] fix: Draft message issue #WPB-11565 (#3515) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jakub Żerko Co-authored-by: Mohamad Jaara --- .../android/ui/home/conversations/ConversationScreen.kt | 2 ++ .../conversations/messages/draft/MessageDraftViewModel.kt | 8 ++++++++ .../android/ui/home/messagecomposer/MessageComposer.kt | 2 ++ .../messagecomposer/state/MessageComposerStateHolder.kt | 2 ++ .../messagecomposer/state/MessageCompositionHolder.kt | 1 + .../messagecomposer/MessageComposerStateHolderTest.kt | 1 + .../messagecomposer/state/MessageCompositionHolderTest.kt | 1 + 7 files changed, 17 insertions(+) diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/ConversationScreen.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/ConversationScreen.kt index 14e4bf68ec0..4677a8fae12 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/ConversationScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/ConversationScreen.kt @@ -235,6 +235,7 @@ fun ConversationScreen( val messageComposerStateHolder = rememberMessageComposerStateHolder( messageComposerViewState = messageComposerViewState, draftMessageComposition = messageDraftViewModel.state.value, + onClearDraft = messageDraftViewModel::clearDraft, onSaveDraft = messageComposerViewModel::saveDraft, onSearchMentionQueryChanged = messageComposerViewModel::searchMembersToMention, onTypingEvent = messageComposerViewModel::sendTypingEvent, @@ -1373,6 +1374,7 @@ fun PreviewConversationScreen() = WireTheme { val messageComposerStateHolder = rememberMessageComposerStateHolder( messageComposerViewState = messageComposerViewState, draftMessageComposition = messageCompositionState.value, + onClearDraft = {}, onSaveDraft = {}, onTypingEvent = {}, onSearchMentionQueryChanged = {}, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/messages/draft/MessageDraftViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/messages/draft/MessageDraftViewModel.kt index f581469fbd2..89252f91861 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/messages/draft/MessageDraftViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/messages/draft/MessageDraftViewModel.kt @@ -52,6 +52,14 @@ class MessageDraftViewModel @Inject constructor( loadMessageDraft() } + fun clearDraft() { + viewModelScope.launch { + state.update { + MessageComposition(conversationId, String.EMPTY) + } + } + } + private fun loadMessageDraft() { viewModelScope.launch { val draftResult = getMessageDraft(conversationId) diff --git a/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/MessageComposer.kt b/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/MessageComposer.kt index aeb50697acb..92abe5a72e5 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/MessageComposer.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/MessageComposer.kt @@ -137,6 +137,7 @@ fun MessageComposer( onSendMessageBundle(messageCompositionHolder.toMessageBundle(conversationId)) onClearMentionSearchResult() clearMessage() + messageCompositionHolder.onClearDraft() }, onPingOptionClicked = onPingOptionClicked, onImagesPicked = onImagesPicked, @@ -265,6 +266,7 @@ private fun BaseComposerPreview( messageCompositionHolder = MessageCompositionHolder( messageComposition = messageComposition, messageTextState = messageTextState, + onClearDraft = {}, onSaveDraft = {}, onSearchMentionQueryChanged = {}, onClearMentionSearchResult = {}, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/state/MessageComposerStateHolder.kt b/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/state/MessageComposerStateHolder.kt index a17805f2ccb..771e8e77138 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/state/MessageComposerStateHolder.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/state/MessageComposerStateHolder.kt @@ -41,6 +41,7 @@ import com.wire.kalium.logic.data.message.mention.MessageMention fun rememberMessageComposerStateHolder( messageComposerViewState: State, draftMessageComposition: MessageComposition, + onClearDraft: () -> Unit, onSaveDraft: (MessageDraft) -> Unit, onSearchMentionQueryChanged: (String) -> Unit, onClearMentionSearchResult: () -> Unit, @@ -62,6 +63,7 @@ fun rememberMessageComposerStateHolder( MessageCompositionHolder( messageComposition = messageComposition, messageTextState = messageTextState, + onClearDraft = onClearDraft, onSaveDraft = onSaveDraft, onSearchMentionQueryChanged = onSearchMentionQueryChanged, onClearMentionSearchResult = onClearMentionSearchResult, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/state/MessageCompositionHolder.kt b/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/state/MessageCompositionHolder.kt index 5232823efeb..3d70862f77f 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/state/MessageCompositionHolder.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/messagecomposer/state/MessageCompositionHolder.kt @@ -54,6 +54,7 @@ import kotlinx.coroutines.flow.distinctUntilChanged class MessageCompositionHolder( val messageComposition: MutableState, val messageTextState: TextFieldState, + val onClearDraft: () -> Unit, private val onSaveDraft: (MessageDraft) -> Unit, private val onSearchMentionQueryChanged: (String) -> Unit, private val onClearMentionSearchResult: () -> Unit, diff --git a/app/src/test/kotlin/com/wire/android/ui/home/messagecomposer/MessageComposerStateHolderTest.kt b/app/src/test/kotlin/com/wire/android/ui/home/messagecomposer/MessageComposerStateHolderTest.kt index 5d22f50fb8b..03fe454d77a 100644 --- a/app/src/test/kotlin/com/wire/android/ui/home/messagecomposer/MessageComposerStateHolderTest.kt +++ b/app/src/test/kotlin/com/wire/android/ui/home/messagecomposer/MessageComposerStateHolderTest.kt @@ -82,6 +82,7 @@ class MessageComposerStateHolderTest { messageCompositionHolder = MessageCompositionHolder( messageComposition = messageComposition, messageTextState = messageTextState, + onClearDraft = {}, onSaveDraft = {}, onSearchMentionQueryChanged = {}, onClearMentionSearchResult = {}, diff --git a/app/src/test/kotlin/com/wire/android/ui/home/messagecomposer/state/MessageCompositionHolderTest.kt b/app/src/test/kotlin/com/wire/android/ui/home/messagecomposer/state/MessageCompositionHolderTest.kt index cf197ab3223..91fee977b50 100644 --- a/app/src/test/kotlin/com/wire/android/ui/home/messagecomposer/state/MessageCompositionHolderTest.kt +++ b/app/src/test/kotlin/com/wire/android/ui/home/messagecomposer/state/MessageCompositionHolderTest.kt @@ -60,6 +60,7 @@ class MessageCompositionHolderTest { state = MessageCompositionHolder( messageComposition = messageComposition, messageTextState = messageTextState, + onClearDraft = {}, onSaveDraft = {}, onSearchMentionQueryChanged = {}, onClearMentionSearchResult = {},