Plain text editor implementation based on markdown input (#2840)

* Add plain text editor based on markdown input
- Fix autofocus of message composer.
- Remove `Message` data class, fetch the details in `MessagesPresenter` instead.
- Remove `enable rich text` option from advanced settings, set it as a build configuration instead.
* Fix MentionSpanProvider
* Bump RTE library to released `v2.37.3`

---------

Co-authored-by: ElementBot <benoitm+elementbot@element.io>
This commit is contained in:
Jorge Martin Espinosa 2024-05-21 13:58:53 +02:00 committed by GitHub
parent 0e05a0e4ed
commit 902dd24e72
94 changed files with 1554 additions and 524 deletions

View file

@ -19,7 +19,6 @@ package io.element.android.features.preferences.impl.advanced
import io.element.android.compound.theme.Theme
sealed interface AdvancedSettingsEvents {
data class SetRichTextEditorEnabled(val enabled: Boolean) : AdvancedSettingsEvents
data class SetDeveloperModeEnabled(val enabled: Boolean) : AdvancedSettingsEvents
data class SetSharePresenceEnabled(val enabled: Boolean) : AdvancedSettingsEvents
data object ChangeTheme : AdvancedSettingsEvents

View file

@ -38,9 +38,6 @@ class AdvancedSettingsPresenter @Inject constructor(
@Composable
override fun present(): AdvancedSettingsState {
val localCoroutineScope = rememberCoroutineScope()
val isRichTextEditorEnabled by appPreferencesStore
.isRichTextEditorEnabledFlow()
.collectAsState(initial = false)
val isDeveloperModeEnabled by appPreferencesStore
.isDeveloperModeEnabledFlow()
.collectAsState(initial = false)
@ -54,9 +51,6 @@ class AdvancedSettingsPresenter @Inject constructor(
var showChangeThemeDialog by remember { mutableStateOf(false) }
fun handleEvents(event: AdvancedSettingsEvents) {
when (event) {
is AdvancedSettingsEvents.SetRichTextEditorEnabled -> localCoroutineScope.launch {
appPreferencesStore.setRichTextEditorEnabled(event.enabled)
}
is AdvancedSettingsEvents.SetDeveloperModeEnabled -> localCoroutineScope.launch {
appPreferencesStore.setDeveloperModeEnabled(event.enabled)
}
@ -73,7 +67,6 @@ class AdvancedSettingsPresenter @Inject constructor(
}
return AdvancedSettingsState(
isRichTextEditorEnabled = isRichTextEditorEnabled,
isDeveloperModeEnabled = isDeveloperModeEnabled,
isSharePresenceEnabled = isSharePresenceEnabled,
theme = theme,

View file

@ -19,7 +19,6 @@ package io.element.android.features.preferences.impl.advanced
import io.element.android.compound.theme.Theme
data class AdvancedSettingsState(
val isRichTextEditorEnabled: Boolean,
val isDeveloperModeEnabled: Boolean,
val isSharePresenceEnabled: Boolean,
val theme: Theme,

View file

@ -23,7 +23,6 @@ open class AdvancedSettingsStateProvider : PreviewParameterProvider<AdvancedSett
override val values: Sequence<AdvancedSettingsState>
get() = sequenceOf(
aAdvancedSettingsState(),
aAdvancedSettingsState(isRichTextEditorEnabled = true),
aAdvancedSettingsState(isDeveloperModeEnabled = true),
aAdvancedSettingsState(showChangeThemeDialog = true),
aAdvancedSettingsState(isSendPublicReadReceiptsEnabled = true),
@ -31,12 +30,10 @@ open class AdvancedSettingsStateProvider : PreviewParameterProvider<AdvancedSett
}
fun aAdvancedSettingsState(
isRichTextEditorEnabled: Boolean = false,
isDeveloperModeEnabled: Boolean = false,
isSendPublicReadReceiptsEnabled: Boolean = false,
showChangeThemeDialog: Boolean = false,
) = AdvancedSettingsState(
isRichTextEditorEnabled = isRichTextEditorEnabled,
isDeveloperModeEnabled = isDeveloperModeEnabled,
isSharePresenceEnabled = isSendPublicReadReceiptsEnabled,
theme = Theme.System,

View file

@ -57,18 +57,6 @@ fun AdvancedSettingsView(
state.eventSink(AdvancedSettingsEvents.ChangeTheme)
}
)
ListItem(
headlineContent = {
Text(text = stringResource(id = CommonStrings.common_rich_text_editor))
},
supportingContent = {
Text(text = stringResource(id = R.string.screen_advanced_settings_rich_text_editor_description))
},
trailingContent = ListItemContent.Switch(
checked = state.isRichTextEditorEnabled,
),
onClick = { state.eventSink(AdvancedSettingsEvents.SetRichTextEditorEnabled(!state.isRichTextEditorEnabled)) }
)
ListItem(
headlineContent = {
Text(text = stringResource(id = CommonStrings.action_view_source))

View file

@ -41,7 +41,6 @@ class AdvancedSettingsPresenterTest {
}.test {
val initialState = awaitLastSequentialItem()
assertThat(initialState.isDeveloperModeEnabled).isFalse()
assertThat(initialState.isRichTextEditorEnabled).isFalse()
assertThat(initialState.showChangeThemeDialog).isFalse()
assertThat(initialState.isSharePresenceEnabled).isTrue()
assertThat(initialState.theme).isEqualTo(Theme.System)
@ -63,21 +62,6 @@ class AdvancedSettingsPresenterTest {
}
}
@Test
fun `present - rich text editor on off`() = runTest {
val presenter = createAdvancedSettingsPresenter()
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
val initialState = awaitLastSequentialItem()
assertThat(initialState.isRichTextEditorEnabled).isFalse()
initialState.eventSink.invoke(AdvancedSettingsEvents.SetRichTextEditorEnabled(true))
assertThat(awaitItem().isRichTextEditorEnabled).isTrue()
initialState.eventSink.invoke(AdvancedSettingsEvents.SetRichTextEditorEnabled(false))
assertThat(awaitItem().isRichTextEditorEnabled).isFalse()
}
}
@Test
fun `present - share presence off on`() = runTest {
val presenter = createAdvancedSettingsPresenter()