Merge pull request #2131 from element-hq/feature/bma/sendImageFromKeyboard

Add support for sending images from the keyboard
This commit is contained in:
Benoit Marty 2024-01-08 09:55:38 +01:00 committed by GitHub
commit 2865e7df41
5 changed files with 28 additions and 1 deletions

1
changelog.d/1977.feature Normal file
View file

@ -0,0 +1 @@
Add support for sending images from the keyboard

View file

@ -16,6 +16,7 @@
package io.element.android.features.messages.impl.messagecomposer package io.element.android.features.messages.impl.messagecomposer
import android.net.Uri
import androidx.compose.runtime.Immutable import androidx.compose.runtime.Immutable
import io.element.android.features.messages.impl.mentions.MentionSuggestion import io.element.android.features.messages.impl.mentions.MentionSuggestion
import io.element.android.libraries.textcomposer.model.Message import io.element.android.libraries.textcomposer.model.Message
@ -26,6 +27,7 @@ import io.element.android.libraries.textcomposer.model.Suggestion
sealed interface MessageComposerEvents { sealed interface MessageComposerEvents {
data object ToggleFullScreenState : MessageComposerEvents data object ToggleFullScreenState : MessageComposerEvents
data class SendMessage(val message: Message) : MessageComposerEvents data class SendMessage(val message: Message) : MessageComposerEvents
data class SendUri(val uri: Uri) : MessageComposerEvents
data object CloseSpecialMode : MessageComposerEvents data object CloseSpecialMode : MessageComposerEvents
data class SetMode(val composerMode: MessageComposerMode) : MessageComposerEvents data class SetMode(val composerMode: MessageComposerMode) : MessageComposerEvents
data object AddAttachment : MessageComposerEvents data object AddAttachment : MessageComposerEvents

View file

@ -225,6 +225,18 @@ class MessageComposerPresenter @Inject constructor(
updateComposerMode = { messageComposerContext.composerMode = it }, updateComposerMode = { messageComposerContext.composerMode = it },
richTextEditorState = richTextEditorState, 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 -> { is MessageComposerEvents.SetMode -> {
messageComposerContext.composerMode = event.composerMode messageComposerContext.composerMode = event.composerMode
when (event.composerMode) { when (event.composerMode) {

View file

@ -16,6 +16,7 @@
package io.element.android.features.messages.impl.messagecomposer package io.element.android.features.messages.impl.messagecomposer
import android.net.Uri
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.IntrinsicSize import androidx.compose.foundation.layout.IntrinsicSize
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
@ -52,6 +53,10 @@ internal fun MessageComposerView(
state.eventSink(MessageComposerEvents.SendMessage(message)) state.eventSink(MessageComposerEvents.SendMessage(message))
} }
fun sendUri(uri: Uri) {
state.eventSink(MessageComposerEvents.SendUri(uri))
}
fun onAddAttachment() { fun onAddAttachment() {
state.eventSink(MessageComposerEvents.AddAttachment) state.eventSink(MessageComposerEvents.AddAttachment)
} }
@ -117,6 +122,7 @@ internal fun MessageComposerView(
onSuggestionReceived = ::onSuggestionReceived, onSuggestionReceived = ::onSuggestionReceived,
onError = ::onError, onError = ::onError,
currentUserId = state.currentUserId, currentUserId = state.currentUserId,
onRichContentSelected = ::sendUri,
) )
} }

View file

@ -16,6 +16,7 @@
package io.element.android.libraries.textcomposer package io.element.android.libraries.textcomposer
import android.net.Uri
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.border import androidx.compose.foundation.border
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
@ -111,6 +112,7 @@ fun TextComposer(
onDeleteVoiceMessage: () -> Unit, onDeleteVoiceMessage: () -> Unit,
onError: (Throwable) -> Unit, onError: (Throwable) -> Unit,
onSuggestionReceived: (Suggestion?) -> Unit, onSuggestionReceived: (Suggestion?) -> Unit,
onRichContentSelected: ((Uri) -> Unit)?,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
showTextFormatting: Boolean = false, showTextFormatting: Boolean = false,
subcomposing: Boolean = false, subcomposing: Boolean = false,
@ -162,6 +164,7 @@ fun TextComposer(
resolveMentionDisplay = { text, url -> TextDisplay.Custom(mentionSpanProvider.getMentionSpanFor(text, url)) }, resolveMentionDisplay = { text, url -> TextDisplay.Custom(mentionSpanProvider.getMentionSpanFor(text, url)) },
resolveRoomMentionDisplay = { TextDisplay.Custom(mentionSpanProvider.getMentionSpanFor("@room", "#")) }, resolveRoomMentionDisplay = { TextDisplay.Custom(mentionSpanProvider.getMentionSpanFor("@room", "#")) },
onError = onError, onError = onError,
onRichContentSelected = onRichContentSelected,
) )
} }
} }
@ -397,6 +400,7 @@ private fun TextInput(
resolveMentionDisplay: (text: String, url: String) -> TextDisplay, resolveMentionDisplay: (text: String, url: String) -> TextDisplay,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onError: (Throwable) -> Unit = {}, onError: (Throwable) -> Unit = {},
onRichContentSelected: ((Uri) -> Unit)? = null,
) { ) {
val bgColor = ElementTheme.colors.bgSubtleSecondary val bgColor = ElementTheme.colors.bgSubtleSecondary
val borderColor = ElementTheme.colors.borderDisabled val borderColor = ElementTheme.colors.borderDisabled
@ -443,7 +447,8 @@ private fun TextInput(
style = ElementRichTextEditorStyle.composerStyle(hasFocus = state.hasFocus), style = ElementRichTextEditorStyle.composerStyle(hasFocus = state.hasFocus),
resolveMentionDisplay = resolveMentionDisplay, resolveMentionDisplay = resolveMentionDisplay,
resolveRoomMentionDisplay = resolveRoomMentionDisplay, resolveRoomMentionDisplay = resolveRoomMentionDisplay,
onError = onError onError = onError,
onRichContentSelected = onRichContentSelected,
) )
} }
} }
@ -902,5 +907,6 @@ private fun ATextComposer(
onDeleteVoiceMessage = {}, onDeleteVoiceMessage = {},
onError = {}, onError = {},
onSuggestionReceived = {}, onSuggestionReceived = {},
onRichContentSelected = null,
) )
} }