diff --git a/changelog.d/2896.bugfix b/changelog.d/2896.bugfix new file mode 100644 index 0000000000..ac1c95b47b --- /dev/null +++ b/changelog.d/2896.bugfix @@ -0,0 +1 @@ +Set auto captilization, multiline and autocompletion flags for the markdown EditText. diff --git a/changelog.d/2898.bugfix b/changelog.d/2898.bugfix new file mode 100644 index 0000000000..74dbdb7b85 --- /dev/null +++ b/changelog.d/2898.bugfix @@ -0,0 +1 @@ +Restoree Markdown text input contents when returning to the room screen. 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 2c4e180bd7..929dfe024a 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 @@ -62,11 +62,11 @@ import io.element.android.libraries.permissions.api.PermissionsEvents import io.element.android.libraries.permissions.api.PermissionsPresenter import io.element.android.libraries.textcomposer.mentions.ResolvedMentionSuggestion import io.element.android.libraries.textcomposer.mentions.rememberMentionSpanProvider -import io.element.android.libraries.textcomposer.model.MarkdownTextEditorState import io.element.android.libraries.textcomposer.model.Message import io.element.android.libraries.textcomposer.model.MessageComposerMode import io.element.android.libraries.textcomposer.model.Suggestion import io.element.android.libraries.textcomposer.model.TextEditorState +import io.element.android.libraries.textcomposer.model.rememberMarkdownTextEditorState import io.element.android.services.analytics.api.AnalyticsService import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toPersistentList @@ -132,7 +132,7 @@ class MessageComposerPresenter @Inject constructor( if (isTesting) { richTextEditorState.isReadyToProcessActions = true } - val markdownTextEditorState = remember { MarkdownTextEditorState(initialText = null, initialFocus = false) } + val markdownTextEditorState = rememberMarkdownTextEditorState(initialText = null, initialFocus = false) var isMentionsEnabled by remember { mutableStateOf(false) } LaunchedEffect(Unit) { 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 451eaca53f..b3d582a466 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 @@ -18,6 +18,7 @@ package io.element.android.libraries.textcomposer.components.markdown import android.graphics.Color import android.text.Editable +import android.text.InputType import android.text.Selection import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding @@ -59,6 +60,10 @@ fun MarkdownTextInput( setPadding(0) setBackgroundColor(Color.TRANSPARENT) setText(state.text.value()) + inputType = InputType.TYPE_CLASS_TEXT or + InputType.TYPE_TEXT_FLAG_CAP_SENTENCES or + InputType.TYPE_TEXT_FLAG_MULTI_LINE or + InputType.TYPE_TEXT_FLAG_AUTO_CORRECT if (canUpdateState) { setSelection(state.selection.first, state.selection.last) setOnFocusChangeListener { _, hasFocus -> diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/MarkdownTextEditorState.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/MarkdownTextEditorState.kt index 7cda8f421c..273aefa57b 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/MarkdownTextEditorState.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/MarkdownTextEditorState.kt @@ -16,14 +16,19 @@ package io.element.android.libraries.textcomposer.model +import android.os.Parcelable import android.text.Spannable import android.text.SpannableString import android.text.SpannableStringBuilder import android.text.Spanned +import androidx.compose.runtime.Composable import androidx.compose.runtime.Stable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.Saver +import androidx.compose.runtime.saveable.SaverScope +import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.core.text.getSpans import io.element.android.libraries.matrix.api.core.UserId @@ -33,6 +38,7 @@ import io.element.android.libraries.textcomposer.components.markdown.StableCharS import io.element.android.libraries.textcomposer.mentions.MentionSpan import io.element.android.libraries.textcomposer.mentions.MentionSpanProvider import io.element.android.libraries.textcomposer.mentions.ResolvedMentionSuggestion +import kotlinx.parcelize.Parcelize @Stable class MarkdownTextEditorState( @@ -119,4 +125,39 @@ class MarkdownTextEditorState( } } } + + @Parcelize + data class SavedState( + val text: CharSequence, + val selectionStart: Int, + val selectionEnd: Int, + ) : Parcelable +} + +object MarkdownTextEditorStateSaver : Saver { + override fun restore(value: MarkdownTextEditorState.SavedState): MarkdownTextEditorState { + return MarkdownTextEditorState( + initialText = "", + initialFocus = false, + ).apply { + text.update(value.text, true) + selection = value.selectionStart..value.selectionEnd + } + } + + override fun SaverScope.save(value: MarkdownTextEditorState): MarkdownTextEditorState.SavedState { + return MarkdownTextEditorState.SavedState( + text = value.text.value(), + selectionStart = value.selection.first, + selectionEnd = value.selection.last, + ) + } +} + +@Composable +fun rememberMarkdownTextEditorState( + initialText: String? = null, + initialFocus: Boolean = false, +): MarkdownTextEditorState { + return rememberSaveable(saver = MarkdownTextEditorStateSaver) { MarkdownTextEditorState(initialText, initialFocus) } }