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
4df6d0c038
commit
cdf6c56f7f
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.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) {
|
||||||
|
|
|
||||||
|
|
@ -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 ->
|
||||||
|
|
|
||||||
|
|
@ -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…
Add table
Add a link
Reference in a new issue