From 1b7f5a902071e91e417006d5219d19536a682c41 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 4 Oct 2023 01:35:30 +0000 Subject: [PATCH 1/5] Update dependency org.matrix.rustcomponents:sdk-android to v0.1.59 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 41622861a0..19358ca32a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -150,7 +150,7 @@ jsoup = { module = "org.jsoup:jsoup", version.ref = "jsoup" } appyx_core = { module = "com.bumble.appyx:core", version.ref = "appyx" } molecule-runtime = { module = "app.cash.molecule:molecule-runtime", version.ref = "molecule" } timber = "com.jakewharton.timber:timber:5.0.1" -matrix_sdk = "org.matrix.rustcomponents:sdk-android:0.1.58" +matrix_sdk = "org.matrix.rustcomponents:sdk-android:0.1.59" matrix_richtexteditor = { module = "io.element.android:wysiwyg", version.ref = "wysiwyg" } matrix_richtexteditor_compose = { module = "io.element.android:wysiwyg-compose", version.ref = "wysiwyg" } sqldelight-driver-android = { module = "com.squareup.sqldelight:android-driver", version.ref = "sqldelight" } From 3a49ab984c5bd237f60c11018004ad96ebda3b17 Mon Sep 17 00:00:00 2001 From: Marco Romano Date: Wed, 4 Oct 2023 10:33:29 +0200 Subject: [PATCH 2/5] Handle breaking change in `innerRoom.edit()` --- .../android/libraries/matrix/impl/room/RustMatrixRoom.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt index ec4b989b9c..b9006f58e2 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt @@ -238,7 +238,10 @@ class RustMatrixRoom( withContext(roomDispatcher) { if (originalEventId != null) { runCatching { - innerRoom.edit(messageEventContentFromParts(body, htmlBody), originalEventId.value) + innerRoom.edit( + newContent = messageEventContentFromParts(body, htmlBody), + editItem = innerRoom.getEventTimelineItemByEventId(originalEventId.value), + ) } } else { runCatching { From 8f3987b98ce678f75818f1c83254e0042169dfda Mon Sep 17 00:00:00 2001 From: Marco Romano Date: Wed, 4 Oct 2023 15:00:29 +0200 Subject: [PATCH 3/5] Destroy EventTimelineItem pointer after use --- .../libraries/matrix/impl/room/RustMatrixRoom.kt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt index b9006f58e2..58e0498dce 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt @@ -238,10 +238,12 @@ class RustMatrixRoom( withContext(roomDispatcher) { if (originalEventId != null) { runCatching { - innerRoom.edit( - newContent = messageEventContentFromParts(body, htmlBody), - editItem = innerRoom.getEventTimelineItemByEventId(originalEventId.value), - ) + innerRoom.getEventTimelineItemByEventId(originalEventId.value).use { + innerRoom.edit( + newContent = messageEventContentFromParts(body, htmlBody), + editItem = it, + ) + } } } else { runCatching { From bed135f7c3d61e4e66e44afaf9ee1b5006df7812 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 4 Oct 2023 17:25:55 +0200 Subject: [PATCH 4/5] Add comment. --- .../features/messages/impl/timeline/model/TimelineItem.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/TimelineItem.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/TimelineItem.kt index 8f00dfb0dd..bd3090e390 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/TimelineItem.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/TimelineItem.kt @@ -54,6 +54,7 @@ sealed interface TimelineItem { @Immutable data class Event( val id: String, + // Note: eventId can be null when the event is a local echo val eventId: EventId? = null, val transactionId: TransactionId? = null, val senderId: UserId, From 34d05e01eba1ff1f4206f88ad3415510913d9312 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 4 Oct 2023 17:38:17 +0200 Subject: [PATCH 5/5] Fetch edited event in advanced (similar to reply mode). --- .../MessageComposerPresenter.kt | 9 +++++++-- .../libraries/matrix/api/room/MatrixRoom.kt | 2 +- .../matrix/impl/room/RustMatrixRoom.kt | 20 ++++++++++--------- .../matrix/test/room/FakeMatrixRoom.kt | 2 +- 4 files changed, 20 insertions(+), 13 deletions(-) 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 30747786b8..f94b7a9431 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 @@ -167,9 +167,14 @@ class MessageComposerPresenter @Inject constructor( ) is MessageComposerEvents.SetMode -> { messageComposerContext.composerMode = event.composerMode - if (event.composerMode is MessageComposerMode.Reply) { + when (event.composerMode) { + is MessageComposerMode.Reply -> event.composerMode.eventId + is MessageComposerMode.Edit -> event.composerMode.eventId + is MessageComposerMode.Normal -> null + is MessageComposerMode.Quote -> null + }.let { relatedEventId -> appCoroutineScope.launch { - room.enterReplyMode(event.composerMode.eventId) + room.enterSpecialMode(relatedEventId) } } } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt index 75b4a3fce0..e14138f837 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt @@ -89,7 +89,7 @@ interface MatrixRoom : Closeable { suspend fun editMessage(originalEventId: EventId?, transactionId: TransactionId?, body: String, htmlBody: String?): Result - suspend fun enterReplyMode(eventId: EventId): Result + suspend fun enterSpecialMode(eventId: EventId?): Result suspend fun replyMessage(eventId: EventId, body: String, htmlBody: String?): Result diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt index 58e0498dce..2fd9760b21 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt @@ -124,7 +124,7 @@ class RustMatrixRoom( roomCoroutineScope.cancel() innerRoom.destroy() roomListItem.destroy() - inReplyToEventTimelineItem?.destroy() + specialModeEventTimelineItem?.destroy() } override val name: String? @@ -238,12 +238,14 @@ class RustMatrixRoom( withContext(roomDispatcher) { if (originalEventId != null) { runCatching { - innerRoom.getEventTimelineItemByEventId(originalEventId.value).use { + val editedEvent = specialModeEventTimelineItem ?: innerRoom.getEventTimelineItemByEventId(originalEventId.value) + editedEvent.use { innerRoom.edit( newContent = messageEventContentFromParts(body, htmlBody), editItem = it, ) } + specialModeEventTimelineItem = null } } else { runCatching { @@ -253,23 +255,23 @@ class RustMatrixRoom( } } - private var inReplyToEventTimelineItem: EventTimelineItem? = null + private var specialModeEventTimelineItem: EventTimelineItem? = null - override suspend fun enterReplyMode(eventId: EventId): Result = withContext(roomDispatcher) { + override suspend fun enterSpecialMode(eventId: EventId?): Result = withContext(roomDispatcher) { runCatching { - inReplyToEventTimelineItem?.destroy() - inReplyToEventTimelineItem = null - inReplyToEventTimelineItem = innerRoom.getEventTimelineItemByEventId(eventId.value) + specialModeEventTimelineItem?.destroy() + specialModeEventTimelineItem = null + specialModeEventTimelineItem = eventId?.let { innerRoom.getEventTimelineItemByEventId(it.value) } } } override suspend fun replyMessage(eventId: EventId, body: String, htmlBody: String?): Result = withContext(roomDispatcher) { runCatching { - val inReplyTo = inReplyToEventTimelineItem ?: innerRoom.getEventTimelineItemByEventId(eventId.value) + val inReplyTo = specialModeEventTimelineItem ?: innerRoom.getEventTimelineItemByEventId(eventId.value) inReplyTo.use { eventTimelineItem -> innerRoom.sendReply(messageEventContentFromParts(body, htmlBody), eventTimelineItem) } - inReplyToEventTimelineItem = null + specialModeEventTimelineItem = null } } diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt index bfbdb4206c..4934867b55 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt @@ -208,7 +208,7 @@ class FakeMatrixRoom( var replyMessageParameter: Pair? = null private set - override suspend fun enterReplyMode(eventId: EventId): Result { + override suspend fun enterSpecialMode(eventId: EventId?): Result { return Result.success(Unit) }