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 @@ @@ -0,0 +1 @@
Set auto captilization, multiline and autocompletion flags for the markdown EditText.

1
changelog.d/2898.bugfix

@ -0,0 +1 @@ @@ -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 @@ -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( @@ -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) {

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 @@ -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( @@ -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 ->

41
libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/MarkdownTextEditorState.kt

@ -16,14 +16,19 @@ @@ -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 @@ -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( @@ -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