From 47f0a2e73ca0204d8fee274e9d6c82a07852193a Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 29 Dec 2023 15:14:40 +0100 Subject: [PATCH] Add support for sending images from the keyboard #1977 --- changelog.d/1977.feature | 1 + .../impl/messagecomposer/MessageComposerEvents.kt | 2 ++ .../impl/messagecomposer/MessageComposerPresenter.kt | 12 ++++++++++++ .../impl/messagecomposer/MessageComposerView.kt | 6 ++++++ .../android/libraries/textcomposer/TextComposer.kt | 8 +++++++- 5 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 changelog.d/1977.feature diff --git a/changelog.d/1977.feature b/changelog.d/1977.feature new file mode 100644 index 0000000000..61ae78b082 --- /dev/null +++ b/changelog.d/1977.feature @@ -0,0 +1 @@ +Add support for sending images from the keyboard diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerEvents.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerEvents.kt index c8ce20b6b9..4f5c2aba10 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerEvents.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerEvents.kt @@ -16,6 +16,7 @@ package io.element.android.features.messages.impl.messagecomposer +import android.net.Uri import androidx.compose.runtime.Immutable import io.element.android.features.messages.impl.mentions.MentionSuggestion import io.element.android.libraries.textcomposer.model.Message @@ -26,6 +27,7 @@ import io.element.android.libraries.textcomposer.model.Suggestion sealed interface MessageComposerEvents { data object ToggleFullScreenState : MessageComposerEvents data class SendMessage(val message: Message) : MessageComposerEvents + data class SendUri(val uri: Uri) : MessageComposerEvents data object CloseSpecialMode : MessageComposerEvents data class SetMode(val composerMode: MessageComposerMode) : MessageComposerEvents data object AddAttachment : MessageComposerEvents diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt index 38ba51fa72..2e9aeaf6e6 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt @@ -225,6 +225,18 @@ class MessageComposerPresenter @Inject constructor( updateComposerMode = { messageComposerContext.composerMode = it }, richTextEditorState = richTextEditorState, ) + is MessageComposerEvents.SendUri -> appCoroutineScope.sendAttachment( + attachment = Attachment.Media( + localMedia = localMediaFactory.createFromUri( + uri = event.uri, + mimeType = null, + name = null, + formattedFileSize = null + ), + compressIfPossible = true + ), + attachmentState = attachmentsState, + ) is MessageComposerEvents.SetMode -> { messageComposerContext.composerMode = event.composerMode when (event.composerMode) { diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerView.kt index 28e40a910f..47b5adea5e 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerView.kt @@ -16,6 +16,7 @@ package io.element.android.features.messages.impl.messagecomposer +import android.net.Uri import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.IntrinsicSize import androidx.compose.foundation.layout.height @@ -52,6 +53,10 @@ internal fun MessageComposerView( state.eventSink(MessageComposerEvents.SendMessage(message)) } + fun sendUri(uri: Uri) { + state.eventSink(MessageComposerEvents.SendUri(uri)) + } + fun onAddAttachment() { state.eventSink(MessageComposerEvents.AddAttachment) } @@ -117,6 +122,7 @@ internal fun MessageComposerView( onSuggestionReceived = ::onSuggestionReceived, onError = ::onError, currentUserId = state.currentUserId, + onRichContentSelected = ::sendUri, ) } diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt index 0d6d01f000..c43d6b14b2 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt @@ -16,6 +16,7 @@ package io.element.android.libraries.textcomposer +import android.net.Uri import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable @@ -111,6 +112,7 @@ fun TextComposer( onDeleteVoiceMessage: () -> Unit, onError: (Throwable) -> Unit, onSuggestionReceived: (Suggestion?) -> Unit, + onRichContentSelected: ((Uri) -> Unit)?, modifier: Modifier = Modifier, showTextFormatting: Boolean = false, subcomposing: Boolean = false, @@ -162,6 +164,7 @@ fun TextComposer( resolveMentionDisplay = { text, url -> TextDisplay.Custom(mentionSpanProvider.getMentionSpanFor(text, url)) }, resolveRoomMentionDisplay = { TextDisplay.Custom(mentionSpanProvider.getMentionSpanFor("@room", "#")) }, onError = onError, + onRichContentSelected = onRichContentSelected, ) } } @@ -397,6 +400,7 @@ private fun TextInput( resolveMentionDisplay: (text: String, url: String) -> TextDisplay, modifier: Modifier = Modifier, onError: (Throwable) -> Unit = {}, + onRichContentSelected: ((Uri) -> Unit)? = null, ) { val bgColor = ElementTheme.colors.bgSubtleSecondary val borderColor = ElementTheme.colors.borderDisabled @@ -443,7 +447,8 @@ private fun TextInput( style = ElementRichTextEditorStyle.composerStyle(hasFocus = state.hasFocus), resolveMentionDisplay = resolveMentionDisplay, resolveRoomMentionDisplay = resolveRoomMentionDisplay, - onError = onError + onError = onError, + onRichContentSelected = onRichContentSelected, ) } } @@ -902,5 +907,6 @@ private fun ATextComposer( onDeleteVoiceMessage = {}, onError = {}, onSuggestionReceived = {}, + onRichContentSelected = null, ) }