From f292c433ec66ad1d9fce87188913a91545ba1b75 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 17 Jul 2023 16:18:54 +0200 Subject: [PATCH 1/2] Remove StableCharSequence, it was useful when we were using the Epoxy library. --- .../messages/impl/MessagesStateProvider.kt | 3 +- .../messagecomposer/MessageComposerEvents.kt | 2 +- .../MessageComposerPresenter.kt | 16 +++---- .../messagecomposer/MessageComposerState.kt | 5 +-- .../MessageComposerStateProvider.kt | 3 +- .../messagecomposer/MessageComposerView.kt | 4 +- .../MessageComposerPresenterTest.kt | 43 +++++++++---------- .../libraries/core/data/StableCharSequence.kt | 31 ------------- .../textcomposer/MessageComposerMode.kt | 8 ++-- .../libraries/textcomposer/TextComposer.kt | 2 +- 10 files changed, 40 insertions(+), 77 deletions(-) delete mode 100644 libraries/core/src/main/kotlin/io/element/android/libraries/core/data/StableCharSequence.kt diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt index 69cb0fa493..d0ddcf68f4 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt @@ -25,7 +25,6 @@ import io.element.android.features.messages.impl.timeline.components.customreact import io.element.android.features.messages.impl.timeline.components.retrysendmenu.RetrySendMenuState import io.element.android.features.messages.impl.timeline.model.event.aTimelineItemTextContent import io.element.android.libraries.architecture.Async -import io.element.android.libraries.core.data.StableCharSequence import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.matrix.api.core.RoomId @@ -48,7 +47,7 @@ fun aMessagesState() = MessagesState( roomAvatar = AvatarData("!id:domain", "Room name", size = AvatarSize.TimelineRoom), userHasPermissionToSendMessage = true, composerState = aMessageComposerState().copy( - text = StableCharSequence("Hello"), + text = "Hello", isFullScreen = false, mode = MessageComposerMode.Normal("Hello"), ), diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerEvents.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerEvents.kt index 82fb0982f4..46e57e92de 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerEvents.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerEvents.kt @@ -26,7 +26,7 @@ sealed interface MessageComposerEvents { data class SendMessage(val message: String) : MessageComposerEvents object CloseSpecialMode : MessageComposerEvents data class SetMode(val composerMode: MessageComposerMode) : MessageComposerEvents - data class UpdateText(val text: CharSequence) : MessageComposerEvents + data class UpdateText(val text: String) : MessageComposerEvents object AddAttachment : MessageComposerEvents object DismissAttachmentMenu : MessageComposerEvents sealed interface PickAttachmentSource : MessageComposerEvents { diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt index f7c80b4320..4d749b465e 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt @@ -34,8 +34,6 @@ import io.element.android.features.messages.impl.attachments.Attachment import io.element.android.features.messages.impl.attachments.preview.error.sendAttachmentError import io.element.android.features.messages.impl.media.local.LocalMediaFactory import io.element.android.libraries.architecture.Presenter -import io.element.android.libraries.core.data.StableCharSequence -import io.element.android.libraries.core.data.toStableCharSequence import io.element.android.libraries.designsystem.utils.SnackbarDispatcher import io.element.android.libraries.designsystem.utils.SnackbarMessage import io.element.android.libraries.di.RoomScope @@ -94,15 +92,15 @@ class MessageComposerPresenter @Inject constructor( val hasFocus = remember { mutableStateOf(false) } - val text: MutableState = remember { - mutableStateOf(StableCharSequence("")) + val text: MutableState = remember { + mutableStateOf("") } var showAttachmentSourcePicker: Boolean by remember { mutableStateOf(false) } LaunchedEffect(messageComposerContext.composerMode) { when (val modeValue = messageComposerContext.composerMode) { - is MessageComposerMode.Edit -> text.value = modeValue.defaultContent.toStableCharSequence() + is MessageComposerMode.Edit -> text.value = modeValue.defaultContent else -> Unit } } @@ -120,9 +118,9 @@ class MessageComposerPresenter @Inject constructor( is MessageComposerEvents.FocusChanged -> hasFocus.value = event.hasFocus - is MessageComposerEvents.UpdateText -> text.value = event.text.toStableCharSequence() + is MessageComposerEvents.UpdateText -> text.value = event.text MessageComposerEvents.CloseSpecialMode -> { - text.value = "".toStableCharSequence() + text.value = "" messageComposerContext.composerMode = MessageComposerMode.Normal("") } @@ -189,11 +187,11 @@ class MessageComposerPresenter @Inject constructor( private fun CoroutineScope.sendMessage( text: String, updateComposerMode: (newComposerMode: MessageComposerMode) -> Unit, - textState: MutableState + textState: MutableState ) = launch { val capturedMode = messageComposerContext.composerMode // Reset composer right away - textState.value = "".toStableCharSequence() + textState.value = "" updateComposerMode(MessageComposerMode.Normal("")) when (capturedMode) { is MessageComposerMode.Normal -> room.sendMessage(text) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerState.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerState.kt index 2dc6042fb5..28ec14ffeb 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerState.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerState.kt @@ -18,13 +18,12 @@ package io.element.android.features.messages.impl.messagecomposer import androidx.compose.runtime.Immutable import io.element.android.features.messages.impl.attachments.Attachment -import io.element.android.libraries.core.data.StableCharSequence import io.element.android.libraries.textcomposer.MessageComposerMode import kotlinx.collections.immutable.ImmutableList @Immutable data class MessageComposerState( - val text: StableCharSequence?, + val text: String?, val isFullScreen: Boolean, val hasFocus: Boolean, val mode: MessageComposerMode, @@ -32,7 +31,7 @@ data class MessageComposerState( val attachmentsState: AttachmentsState, val eventSink: (MessageComposerEvents) -> Unit ) { - val isSendButtonVisible: Boolean = text?.charSequence.isNullOrEmpty().not() + val isSendButtonVisible: Boolean = text.isNullOrEmpty().not() } @Immutable diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerStateProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerStateProvider.kt index 0504d3625a..1934154824 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerStateProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerStateProvider.kt @@ -17,7 +17,6 @@ package io.element.android.features.messages.impl.messagecomposer import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import io.element.android.libraries.core.data.StableCharSequence import io.element.android.libraries.textcomposer.MessageComposerMode open class MessageComposerStateProvider : PreviewParameterProvider { @@ -28,7 +27,7 @@ open class MessageComposerStateProvider : PreviewParameterProvider Unit = {}, onResetComposerMode: () -> Unit = {}, - onComposerTextChange: (CharSequence) -> Unit = {}, + onComposerTextChange: (String) -> Unit = {}, onAddAttachment: () -> Unit = {}, onFocusChanged: (Boolean) -> Unit = {}, ) { From 778155bb9e80d0d0baee8b0b41f5892634e49cf1 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 17 Jul 2023 17:14:41 +0200 Subject: [PATCH 2/2] Save text in composer when navigating to a sub node (opening an image from the timeline for instance). Fixes #870. --- .../messages/impl/messagecomposer/MessageComposerPresenter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt index 4d749b465e..020236e890 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt @@ -92,7 +92,7 @@ class MessageComposerPresenter @Inject constructor( val hasFocus = remember { mutableStateOf(false) } - val text: MutableState = remember { + val text: MutableState = rememberSaveable { mutableStateOf("") }