From d9a54fb716b6edd73e8d03e2130838e1f3570f33 Mon Sep 17 00:00:00 2001 From: Gianluca Iavicoli Date: Wed, 25 Mar 2026 00:58:57 +0100 Subject: [PATCH] fix: persist reply banner during voice recording and dismiss keyboard --- .../libraries/textcomposer/TextComposer.kt | 19 +++++++++++++++++++ 1 file changed, 19 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 bdaed4e402..360e81e426 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 @@ -41,6 +41,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.platform.LocalHapticFeedback +import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.platform.LocalView import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.clearAndSetSemantics @@ -400,6 +401,7 @@ fun TextComposer( onAddAttachment = onAddAttachment, onDeleteVoiceMessage = onDeleteVoiceMessage, onVoiceRecorderEvent = onVoiceRecorderEvent, + onResetComposerMode = onResetComposerMode, ) } @@ -409,6 +411,14 @@ fun TextComposer( SoftKeyboardEffect(showTextFormatting, onRequestFocus) { it } + // Dismiss keyboard when voice recording starts + val keyboardController = LocalSoftwareKeyboardController.current + LaunchedEffect(voiceMessageState) { + if (voiceMessageState !is VoiceMessageState.Idle) { + keyboardController?.hide() + } + } + val latestOnReceiveSuggestion by rememberUpdatedState(onReceiveSuggestion) if (state is TextEditorState.Rich) { val menuAction = state.richTextEditorState.menuAction @@ -440,6 +450,7 @@ private fun StandardLayout( onAddAttachment: () -> Unit, onDeleteVoiceMessage: () -> Unit, onVoiceRecorderEvent: (VoiceMessageRecorderEvent) -> Unit, + onResetComposerMode: () -> Unit, modifier: Modifier = Modifier, ) { Column(modifier = modifier) { @@ -506,6 +517,14 @@ private fun StandardLayout( ) { if (voiceMessageState is VoiceMessageState.Idle) { textInput() + } else if (composerMode is MessageComposerMode.Special) { + TextInputBox( + composerMode = composerMode, + onResetComposerMode = onResetComposerMode, + isTextEmpty = true, + ) { + voiceRecording() + } } else { voiceRecording() }