Merge pull request #2131 from element-hq/feature/bma/sendImageFromKeyboard
Add support for sending images from the keyboard
This commit is contained in:
commit
2865e7df41
5 changed files with 28 additions and 1 deletions
1
changelog.d/1977.feature
Normal file
1
changelog.d/1977.feature
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
Add support for sending images from the keyboard
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue