Browse Source

Restore MarkdownTextInput contents (#2902)

* Restore `MarkdownTextInput` contents: create a `MarkdownTextInputStateSaver` and use it to save and restore the text and selection.

* Add default text flags to the markdown composer
pull/2908/head
Jorge Martin Espinosa 4 months ago committed by GitHub
parent
commit
72ab632233
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 1
      changelog.d/2896.bugfix
  2. 1
      changelog.d/2898.bugfix
  3. 4
      features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt
  4. 5
      libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/markdown/MarkdownTextInput.kt
  5. 41
      libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/MarkdownTextEditorState.kt

1
changelog.d/2896.bugfix

@ -0,0 +1 @@
Set auto captilization, multiline and autocompletion flags for the markdown EditText.

1
changelog.d/2898.bugfix

@ -0,0 +1 @@
Restoree Markdown text input contents when returning to the room screen.

4
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.permissions.api.PermissionsPresenter
import io.element.android.libraries.textcomposer.mentions.ResolvedMentionSuggestion import io.element.android.libraries.textcomposer.mentions.ResolvedMentionSuggestion
import io.element.android.libraries.textcomposer.mentions.rememberMentionSpanProvider 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.Message
import io.element.android.libraries.textcomposer.model.MessageComposerMode import io.element.android.libraries.textcomposer.model.MessageComposerMode
import io.element.android.libraries.textcomposer.model.Suggestion import io.element.android.libraries.textcomposer.model.Suggestion
import io.element.android.libraries.textcomposer.model.TextEditorState 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 io.element.android.services.analytics.api.AnalyticsService
import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toPersistentList import kotlinx.collections.immutable.toPersistentList
@ -132,7 +132,7 @@ class MessageComposerPresenter @Inject constructor(
if (isTesting) { if (isTesting) {
richTextEditorState.isReadyToProcessActions = true richTextEditorState.isReadyToProcessActions = true
} }
val markdownTextEditorState = remember { MarkdownTextEditorState(initialText = null, initialFocus = false) } val markdownTextEditorState = rememberMarkdownTextEditorState(initialText = null, initialFocus = false)
var isMentionsEnabled by remember { mutableStateOf(false) } var isMentionsEnabled by remember { mutableStateOf(false) }
LaunchedEffect(Unit) { LaunchedEffect(Unit) {

5
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.graphics.Color
import android.text.Editable import android.text.Editable
import android.text.InputType
import android.text.Selection import android.text.Selection
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
@ -59,6 +60,10 @@ fun MarkdownTextInput(
setPadding(0) setPadding(0)
setBackgroundColor(Color.TRANSPARENT) setBackgroundColor(Color.TRANSPARENT)
setText(state.text.value()) 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) { if (canUpdateState) {
setSelection(state.selection.first, state.selection.last) setSelection(state.selection.first, state.selection.last)
setOnFocusChangeListener { _, hasFocus -> setOnFocusChangeListener { _, hasFocus ->

41
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 package io.element.android.libraries.textcomposer.model
import android.os.Parcelable
import android.text.Spannable import android.text.Spannable
import android.text.SpannableString import android.text.SpannableString
import android.text.SpannableStringBuilder import android.text.SpannableStringBuilder
import android.text.Spanned import android.text.Spanned
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Stable import androidx.compose.runtime.Stable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf 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.compose.runtime.setValue
import androidx.core.text.getSpans import androidx.core.text.getSpans
import io.element.android.libraries.matrix.api.core.UserId 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.MentionSpan
import io.element.android.libraries.textcomposer.mentions.MentionSpanProvider import io.element.android.libraries.textcomposer.mentions.MentionSpanProvider
import io.element.android.libraries.textcomposer.mentions.ResolvedMentionSuggestion import io.element.android.libraries.textcomposer.mentions.ResolvedMentionSuggestion
import kotlinx.parcelize.Parcelize
@Stable @Stable
class MarkdownTextEditorState( 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<MarkdownTextEditorState, MarkdownTextEditorState.SavedState> {
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) }
} }

Loading…
Cancel
Save