From 09de7a332761b01fbeb383228843fb26339d8fde Mon Sep 17 00:00:00 2001 From: Marco Antonio Alvarez Date: Sat, 25 May 2024 14:39:33 +0200 Subject: [PATCH 1/4] add rich content listener to markdown text input Signed-off-by: Marco Antonio Alvarez --- .../libraries/textcomposer/TextComposer.kt | 1 + .../components/markdown/MarkdownTextInput.kt | 39 +++++++++++++++++++ 2 files changed, 40 insertions(+) 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 3ff2520c35b..7216f7b9cd2 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 b3d582a4667..00b00ef62be 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 = {}, ) } } From 0b77186bfb761dbdea3017a98104abc4d21571ef Mon Sep 17 00:00:00 2001 From: Marco Antonio Alvarez Date: Sat, 25 May 2024 14:46:47 +0200 Subject: [PATCH 2/4] signoff Signed-off-by: Marco Antonio Alvarez From 67960cf1d47ea2168a01293393376bff71df0763 Mon Sep 17 00:00:00 2001 From: Marco Antonio Alvarez Date: Sat, 25 May 2024 14:49:26 +0200 Subject: [PATCH 3/4] add changelog Signed-off-by: Marco Antonio Alvarez --- changelog.d/2917.bugfix | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/2917.bugfix diff --git a/changelog.d/2917.bugfix b/changelog.d/2917.bugfix new file mode 100644 index 00000000000..cc810393fcf --- /dev/null +++ b/changelog.d/2917.bugfix @@ -0,0 +1 @@ +Fixed sending rich content from android keyboards on the markdown text input From 22438322d53e391b1c62bd59a9d74235de15b9e2 Mon Sep 17 00:00:00 2001 From: Marco Antonio Alvarez Date: Sat, 25 May 2024 15:53:33 +0200 Subject: [PATCH 4/4] fix unit test Signed-off-by: Marco Antonio Alvarez --- .../impl/components/markdown/MarkdownTextInputTest.kt | 1 + 1 file changed, 1 insertion(+) 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 8967d4cf6a3..3ced6bf4000 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, ) } }