diff --git a/changelog.d/2917.bugfix b/changelog.d/2917.bugfix new file mode 100644 index 0000000000..cc810393fc --- /dev/null +++ b/changelog.d/2917.bugfix @@ -0,0 +1 @@ +Fixed sending rich content from android keyboards on the markdown text input 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 3ff2520c35..7216f7b9cd 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 @@ -190,6 +190,7 @@ fun TextComposer( onTyping = onTyping, onSuggestionReceived = onSuggestionReceived, richTextEditorStyle = style, + onRichContentSelected = onRichContentSelected, ) } } diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/markdown/MarkdownTextInput.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/markdown/MarkdownTextInput.kt index b3d582a466..00b00ef62b 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/markdown/MarkdownTextInput.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/markdown/MarkdownTextInput.kt @@ -16,10 +16,13 @@ package io.element.android.libraries.textcomposer.components.markdown +import android.content.ClipData import android.graphics.Color +import android.net.Uri import android.text.Editable import android.text.InputType import android.text.Selection +import android.view.View import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable @@ -27,6 +30,9 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView import androidx.core.text.getSpans +import androidx.core.view.ContentInfoCompat +import androidx.core.view.OnReceiveContentListener +import androidx.core.view.ViewCompat import androidx.core.view.setPadding import androidx.core.widget.addTextChangedListener import io.element.android.libraries.designsystem.preview.ElementPreview @@ -48,8 +54,33 @@ fun MarkdownTextInput( onTyping: (Boolean) -> Unit, onSuggestionReceived: (Suggestion?) -> Unit, richTextEditorStyle: RichTextEditorStyle, + onRichContentSelected: ((Uri) -> Unit)?, ) { val canUpdateState = !subcomposing + + // Copied from io.element.android.wysiwyg.internal.utils.UriContentListener + class ReceiveUriContentListener( + private val onContent: (uri: Uri) -> Unit, + ) : OnReceiveContentListener { + override fun onReceiveContent(view: View, payload: ContentInfoCompat): ContentInfoCompat? { + val split = payload.partition { item -> item.uri != null } + val uriContent = split.first + val remaining = split.second + + if (uriContent != null) { + val clip: ClipData = uriContent.clip + for (i in 0 until clip.itemCount) { + val uri = clip.getItemAt(i).uri + // ... app-specific logic to handle the URI ... + onContent(uri) + } + } + // Return anything that we didn't handle ourselves. This preserves the default platform + // behavior for text and anything else for which we are not implementing custom handling. + return remaining + } + } + AndroidView( modifier = Modifier .padding(top = 6.dp, bottom = 6.dp) @@ -82,6 +113,13 @@ fun MarkdownTextInput( state.currentMentionSuggestion = editableText.checkSuggestionNeeded() onSuggestionReceived(state.currentMentionSuggestion) } + if (onRichContentSelected != null) { + ViewCompat.setOnReceiveContentListener( + this, + arrayOf("image/*"), + ReceiveUriContentListener { onRichContentSelected(it) } + ) + } state.requestFocusAction = { this.requestFocus() } } } @@ -152,6 +190,7 @@ internal fun MarkdownTextInputPreview() { onTyping = {}, onSuggestionReceived = {}, richTextEditorStyle = style, + onRichContentSelected = {}, ) } } diff --git a/libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/components/markdown/MarkdownTextInputTest.kt b/libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/components/markdown/MarkdownTextInputTest.kt index 8967d4cf6a..3ced6bf400 100644 --- a/libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/components/markdown/MarkdownTextInputTest.kt +++ b/libraries/textcomposer/impl/src/test/kotlin/io/element/android/libraries/textcomposer/impl/components/markdown/MarkdownTextInputTest.kt @@ -191,6 +191,7 @@ class MarkdownTextInputTest { onTyping = onTyping, onSuggestionReceived = onSuggestionReceived, richTextEditorStyle = style, + onRichContentSelected = null, ) } }