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 fd803109c7..ed22a5e2ee 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 @@ -706,14 +706,14 @@ class MessageComposerPresenter( val draft = createDraftFromState(markdownTextEditorState, richTextEditorState) updateDraft(draft, isVolatile = true).join() } - setText(newComposerMode.content, markdownTextEditorState, richTextEditorState) + setText(newComposerMode.content, markdownTextEditorState, richTextEditorState, requestFocus = true) } is MessageComposerMode.EditCaption -> { if (currentComposerMode.isEditing.not()) { val draft = createDraftFromState(markdownTextEditorState, richTextEditorState) updateDraft(draft, isVolatile = true).join() } - setText(newComposerMode.content, markdownTextEditorState, richTextEditorState) + setText(newComposerMode.content, markdownTextEditorState, richTextEditorState, requestFocus = true) } else -> { // When coming from edit, just clear the composer as it'd be weird to reset a volatile draft in this scenario. diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/SoftKeyboardEffect.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/SoftKeyboardEffect.kt index 55a985efca..32aae90a8a 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/SoftKeyboardEffect.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/SoftKeyboardEffect.kt @@ -15,7 +15,6 @@ import androidx.compose.runtime.rememberUpdatedState import androidx.compose.ui.platform.LocalView import androidx.compose.ui.viewinterop.AndroidView import io.element.android.libraries.androidutils.ui.awaitWindowFocus -import io.element.android.libraries.androidutils.ui.isKeyboardVisible import io.element.android.libraries.androidutils.ui.showKeyboard /** @@ -42,12 +41,15 @@ internal fun SoftKeyboardEffect( // Await window focus in case returning from a dialog view.awaitWindowFocus() - if (!view.isKeyboardVisible()) { - // Show the keyboard, temporarily using the root view for focus - view.showKeyboard(andRequestFocus = true) + // First, focus the correct editor view + latestOnRequestFocus() - // Refocus to the correct view - latestOnRequestFocus() + // Show keyboard on the focused editor view rather than the root view, + // as some devices require showSoftInput on the actual input view. + // Using post to run after the current focus pass completes. + view.post { + val focusedView = view.findFocus() ?: view + focusedView.showKeyboard() } } }