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
This commit is contained in:
parent
85c8a26f8a
commit
72ab632233
5 changed files with 50 additions and 2 deletions
1
changelog.d/2896.bugfix
Normal file
1
changelog.d/2896.bugfix
Normal file
|
|
@ -0,0 +1 @@
|
|||
Set auto captilization, multiline and autocompletion flags for the markdown EditText.
|
||||
1
changelog.d/2898.bugfix
Normal file
1
changelog.d/2898.bugfix
Normal file
|
|
@ -0,0 +1 @@
|
|||
Restoree Markdown text input contents when returning to the room screen.
|
||||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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 ->
|
||||
|
|
|
|||
|
|
@ -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<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…
Add table
Add a link
Reference in a new issue