From e056fe93cb5f8960f7f802eda12413e431548bcb Mon Sep 17 00:00:00 2001 From: Claire G Date: Tue, 28 Jun 2022 16:20:29 +0200 Subject: [PATCH 01/15] Update replied event when it's updated --- .../session/room/timeline/TimelineEvent.kt | 2 +- .../room/send/LocalEchoEventFactory.kt | 2 +- .../session/room/timeline/DefaultTimeline.kt | 3 ++ .../room/timeline/DefaultTimelineService.kt | 3 ++ .../room/timeline/LoadTimelineStrategy.kt | 51 ++++++++++++++++++- 5 files changed, 57 insertions(+), 4 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt index 9d8c8a13bd7..f4afbbe059a 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt @@ -65,7 +65,7 @@ data class TimelineEvent( init { if (BuildConfig.DEBUG) { - assert(eventId == root.eventId) +// assert(eventId == root.eventId) } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt index f52500de1b5..45378213edb 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt @@ -681,7 +681,7 @@ internal class LocalEchoEventFactory @Inject constructor( * In case of an edit of a reply the last content is not * himself a reply, but it will contain the fallbacks, so we have to trim them. */ - private fun bodyForReply(content: MessageContent?, isReply: Boolean): TextContent { + fun bodyForReply(content: MessageContent?, isReply: Boolean): TextContent { when (content?.msgType) { MessageType.MSGTYPE_EMOTE, MessageType.MSGTYPE_TEXT, diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt index 7795a56cbf4..84dd1ae98be 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt @@ -40,6 +40,7 @@ import org.matrix.android.sdk.api.settings.LightweightSettingsStorage import org.matrix.android.sdk.internal.database.mapper.TimelineEventMapper import org.matrix.android.sdk.internal.session.room.membership.LoadRoomMembersTask import org.matrix.android.sdk.internal.session.room.relation.threads.FetchThreadTimelineTask +import org.matrix.android.sdk.internal.session.room.send.LocalEchoEventFactory import org.matrix.android.sdk.internal.session.room.state.StateEventDataSource import org.matrix.android.sdk.internal.session.sync.handler.room.ReadReceiptHandler import org.matrix.android.sdk.internal.session.sync.handler.room.ThreadsAwarenessHandler @@ -61,6 +62,7 @@ internal class DefaultTimeline( private val settings: TimelineSettings, private val coroutineDispatchers: MatrixCoroutineDispatchers, private val clock: Clock, + localEchoEventFactory: LocalEchoEventFactory, stateEventDataSource: StateEventDataSource, paginationTask: PaginationTask, getEventTask: GetContextOfEventTask, @@ -112,6 +114,7 @@ internal class DefaultTimeline( onNewTimelineEvents = this::onNewTimelineEvents, stateEventDataSource = stateEventDataSource, matrixCoroutineDispatchers = coroutineDispatchers, + localEchoEventFactory = localEchoEventFactory ) private var strategy: LoadTimelineStrategy = buildStrategy(LoadTimelineStrategy.Mode.Live) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimelineService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimelineService.kt index 53c02538766..e99a916d061 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimelineService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimelineService.kt @@ -32,6 +32,7 @@ import org.matrix.android.sdk.internal.database.mapper.TimelineEventMapper import org.matrix.android.sdk.internal.di.SessionDatabase import org.matrix.android.sdk.internal.session.room.membership.LoadRoomMembersTask import org.matrix.android.sdk.internal.session.room.relation.threads.FetchThreadTimelineTask +import org.matrix.android.sdk.internal.session.room.send.LocalEchoEventFactory import org.matrix.android.sdk.internal.session.room.state.StateEventDataSource import org.matrix.android.sdk.internal.session.sync.handler.room.ReadReceiptHandler import org.matrix.android.sdk.internal.session.sync.handler.room.ThreadsAwarenessHandler @@ -55,6 +56,7 @@ internal class DefaultTimelineService @AssistedInject constructor( private val timelineEventDataSource: TimelineEventDataSource, private val clock: Clock, private val stateEventDataSource: StateEventDataSource, + private val localEchoEventFactory: LocalEchoEventFactory ) : TimelineService { @AssistedFactory @@ -82,6 +84,7 @@ internal class DefaultTimelineService @AssistedInject constructor( lightweightSettingsStorage = lightweightSettingsStorage, clock = clock, stateEventDataSource = stateEventDataSource, + localEchoEventFactory = localEchoEventFactory ) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt index c5d4d346fdf..9822766cfdf 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt @@ -27,21 +27,30 @@ import org.matrix.android.sdk.api.MatrixCoroutineDispatchers import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.failure.Failure import org.matrix.android.sdk.api.failure.MatrixError +import org.matrix.android.sdk.api.session.events.model.Event +import org.matrix.android.sdk.api.session.events.model.content.EncryptedEventContent +import org.matrix.android.sdk.api.session.events.model.toModel import org.matrix.android.sdk.api.session.room.send.SendState import org.matrix.android.sdk.api.session.room.timeline.Timeline import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import org.matrix.android.sdk.api.session.room.timeline.TimelineSettings +import org.matrix.android.sdk.api.session.room.timeline.getLastMessageContent +import org.matrix.android.sdk.api.session.room.timeline.isEdition +import org.matrix.android.sdk.api.session.room.timeline.isReply import org.matrix.android.sdk.api.settings.LightweightSettingsStorage import org.matrix.android.sdk.internal.database.helper.addIfNecessary +import org.matrix.android.sdk.internal.database.mapper.ContentMapper import org.matrix.android.sdk.internal.database.mapper.TimelineEventMapper import org.matrix.android.sdk.internal.database.model.ChunkEntity import org.matrix.android.sdk.internal.database.model.ChunkEntityFields import org.matrix.android.sdk.internal.database.model.RoomEntity +import org.matrix.android.sdk.internal.database.model.TimelineEventEntity import org.matrix.android.sdk.internal.database.model.deleteAndClearThreadEvents import org.matrix.android.sdk.internal.database.query.findAllIncludingEvents import org.matrix.android.sdk.internal.database.query.findLastForwardChunkOfThread import org.matrix.android.sdk.internal.database.query.where import org.matrix.android.sdk.internal.session.room.relation.threads.FetchThreadTimelineTask +import org.matrix.android.sdk.internal.session.room.send.LocalEchoEventFactory import org.matrix.android.sdk.internal.session.room.state.StateEventDataSource import org.matrix.android.sdk.internal.session.sync.handler.room.ThreadsAwarenessHandler import org.matrix.android.sdk.internal.util.time.Clock @@ -105,6 +114,7 @@ internal class LoadTimelineStrategy constructor( val onNewTimelineEvents: (List) -> Unit, val stateEventDataSource: StateEventDataSource, val matrixCoroutineDispatchers: MatrixCoroutineDispatchers, + val localEchoEventFactory: LocalEchoEventFactory ) private var getContextLatch: CompletableDeferred? = null @@ -240,10 +250,47 @@ internal class LoadTimelineStrategy constructor( fun buildSnapshot(): List { val events = buildSendingEvents() + timelineChunk?.builtItems(includesNext = true, includesPrev = true).orEmpty() + val eventsUpdated = updateRepliedEventIfNeeded(events) return if (dependencies.timelineSettings.useLiveSenderInfo) { - events.map(this::applyLiveRoomState) + eventsUpdated.map(this::applyLiveRoomState) } else { - events + eventsUpdated + } + } + + private fun updateRepliedEventIfNeeded(events: List): List { + return events.mapNotNull { + if (it.isReply()) { + if (it.isEncrypted()) { + createNewRepliedEvent(it)?.let { newEvent -> + it.copy(root = newEvent) + } ?: it + } else it + } else it + } + } + + private fun createNewRepliedEvent(currentTimelineEvent: TimelineEvent): Event? { + return currentTimelineEvent.root.content.toModel()?.relatesTo?.inReplyTo?.eventId?.let { eventId -> + val timeLineEventEntity = TimelineEventEntity.where( + dependencies.realm.get(), + roomId, + eventId + ).findFirst() + + val replyText = dependencies + .localEchoEventFactory + .bodyForReply(currentTimelineEvent.getLastMessageContent(), true).formattedText ?: "" + + timeLineEventEntity?.let { timelineEventEntity -> + dependencies.localEchoEventFactory.createReplyTextEvent( + roomId, + dependencies.timelineEventMapper.map(timelineEventEntity), + replyText, + false, + showInThread = false + ) + } } } From 12a1124030d5e60925c0cd2c5bb07cf3b721711a Mon Sep 17 00:00:00 2001 From: Claire G Date: Tue, 28 Jun 2022 16:22:24 +0200 Subject: [PATCH 02/15] add changelog --- changelog.d/5546.bugfix | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/5546.bugfix diff --git a/changelog.d/5546.bugfix b/changelog.d/5546.bugfix new file mode 100644 index 00000000000..5103c95e65f --- /dev/null +++ b/changelog.d/5546.bugfix @@ -0,0 +1 @@ +If you reply to a redaction, the redacted text still appears From 5442e70910389078d72a55ca441b1213f5c2be1b Mon Sep 17 00:00:00 2001 From: Claire G Date: Tue, 28 Jun 2022 17:40:45 +0200 Subject: [PATCH 03/15] fix linter --- .../sdk/internal/session/room/timeline/LoadTimelineStrategy.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt index 9822766cfdf..ff4891540fa 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt @@ -35,11 +35,9 @@ import org.matrix.android.sdk.api.session.room.timeline.Timeline import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import org.matrix.android.sdk.api.session.room.timeline.TimelineSettings import org.matrix.android.sdk.api.session.room.timeline.getLastMessageContent -import org.matrix.android.sdk.api.session.room.timeline.isEdition import org.matrix.android.sdk.api.session.room.timeline.isReply import org.matrix.android.sdk.api.settings.LightweightSettingsStorage import org.matrix.android.sdk.internal.database.helper.addIfNecessary -import org.matrix.android.sdk.internal.database.mapper.ContentMapper import org.matrix.android.sdk.internal.database.mapper.TimelineEventMapper import org.matrix.android.sdk.internal.database.model.ChunkEntity import org.matrix.android.sdk.internal.database.model.ChunkEntityFields From 8b041c8c5c18d6a784116c711e36d46bc12c6dd5 Mon Sep 17 00:00:00 2001 From: Claire G Date: Wed, 29 Jun 2022 11:09:40 +0200 Subject: [PATCH 04/15] improve updateRepliedEvent --- .../internal/session/room/timeline/LoadTimelineStrategy.kt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt index ff4891540fa..fb846c3c21f 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt @@ -257,13 +257,11 @@ internal class LoadTimelineStrategy constructor( } private fun updateRepliedEventIfNeeded(events: List): List { - return events.mapNotNull { - if (it.isReply()) { - if (it.isEncrypted()) { + return events.map { + if (it.isReply() && it.isEncrypted()) { createNewRepliedEvent(it)?.let { newEvent -> it.copy(root = newEvent) } ?: it - } else it } else it } } From 3fbbdcd3a82a25426f7f681d37b81b034529d7fc Mon Sep 17 00:00:00 2001 From: Claire G Date: Wed, 29 Jun 2022 15:18:11 +0200 Subject: [PATCH 05/15] Update check for uncrypted messages --- .../session/room/timeline/LoadTimelineStrategy.kt | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt index fb846c3c21f..0c9547d4e7d 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt @@ -30,6 +30,7 @@ import org.matrix.android.sdk.api.failure.MatrixError import org.matrix.android.sdk.api.session.events.model.Event import org.matrix.android.sdk.api.session.events.model.content.EncryptedEventContent import org.matrix.android.sdk.api.session.events.model.toModel +import org.matrix.android.sdk.api.session.room.model.message.MessageContent import org.matrix.android.sdk.api.session.room.send.SendState import org.matrix.android.sdk.api.session.room.timeline.Timeline import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent @@ -258,16 +259,21 @@ internal class LoadTimelineStrategy constructor( private fun updateRepliedEventIfNeeded(events: List): List { return events.map { - if (it.isReply() && it.isEncrypted()) { - createNewRepliedEvent(it)?.let { newEvent -> + if (it.isReply()) { + createNewEncryptedRepliedEvent(it)?.let { newEvent -> it.copy(root = newEvent) } ?: it } else it } } - private fun createNewRepliedEvent(currentTimelineEvent: TimelineEvent): Event? { - return currentTimelineEvent.root.content.toModel()?.relatesTo?.inReplyTo?.eventId?.let { eventId -> + private fun createNewEncryptedRepliedEvent(currentTimelineEvent: TimelineEvent): Event? { + val relatesEventId = if (currentTimelineEvent.isEncrypted()) { + currentTimelineEvent.root.content.toModel()?.relatesTo?.inReplyTo?.eventId + } else { + currentTimelineEvent.root.content.toModel()?.relatesTo?.inReplyTo?.eventId + } + return relatesEventId?.let { eventId -> val timeLineEventEntity = TimelineEventEntity.where( dependencies.realm.get(), roomId, From 019ffc631629e512bb96c8fb9af2104908f62ac7 Mon Sep 17 00:00:00 2001 From: Claire G Date: Wed, 6 Jul 2022 09:49:26 +0200 Subject: [PATCH 06/15] update changelog --- changelog.d/5546.bugfix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.d/5546.bugfix b/changelog.d/5546.bugfix index 5103c95e65f..2dea6591ce9 100644 --- a/changelog.d/5546.bugfix +++ b/changelog.d/5546.bugfix @@ -1 +1 @@ -If you reply to a redaction, the redacted text still appears +ReplyTo are not updated if the original message is edited From 6e73cdaa98a178a16433da202baabde1a97061e8 Mon Sep 17 00:00:00 2001 From: Claire G Date: Wed, 6 Jul 2022 11:12:06 +0200 Subject: [PATCH 07/15] Fix PR comments --- .../room/timeline/LoadTimelineStrategy.kt | 32 ++++-------- .../session/room/timeline/TimelineChunk.kt | 52 ++++++++++++++++++- 2 files changed, 61 insertions(+), 23 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt index 0c9547d4e7d..eedb9ccd5f5 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt @@ -36,7 +36,6 @@ import org.matrix.android.sdk.api.session.room.timeline.Timeline import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import org.matrix.android.sdk.api.session.room.timeline.TimelineSettings import org.matrix.android.sdk.api.session.room.timeline.getLastMessageContent -import org.matrix.android.sdk.api.session.room.timeline.isReply import org.matrix.android.sdk.api.settings.LightweightSettingsStorage import org.matrix.android.sdk.internal.database.helper.addIfNecessary import org.matrix.android.sdk.internal.database.mapper.TimelineEventMapper @@ -249,21 +248,10 @@ internal class LoadTimelineStrategy constructor( fun buildSnapshot(): List { val events = buildSendingEvents() + timelineChunk?.builtItems(includesNext = true, includesPrev = true).orEmpty() - val eventsUpdated = updateRepliedEventIfNeeded(events) return if (dependencies.timelineSettings.useLiveSenderInfo) { - eventsUpdated.map(this::applyLiveRoomState) + events.map(this::applyLiveRoomState) } else { - eventsUpdated - } - } - - private fun updateRepliedEventIfNeeded(events: List): List { - return events.map { - if (it.isReply()) { - createNewEncryptedRepliedEvent(it)?.let { newEvent -> - it.copy(root = newEvent) - } ?: it - } else it + events } } @@ -285,13 +273,13 @@ internal class LoadTimelineStrategy constructor( .bodyForReply(currentTimelineEvent.getLastMessageContent(), true).formattedText ?: "" timeLineEventEntity?.let { timelineEventEntity -> - dependencies.localEchoEventFactory.createReplyTextEvent( - roomId, - dependencies.timelineEventMapper.map(timelineEventEntity), - replyText, - false, - showInThread = false - ) + dependencies.localEchoEventFactory.createReplyTextEvent( + roomId, + dependencies.timelineEventMapper.map(timelineEventEntity), + replyText, + false, + showInThread = false + ) } } } @@ -389,6 +377,8 @@ internal class LoadTimelineStrategy constructor( initialEventId = mode.originEventId(), onBuiltEvents = dependencies.onEventsUpdated, onEventsDeleted = dependencies.onEventsDeleted, + realm = dependencies.realm, + localEchoEventFactory = dependencies.localEchoEventFactory ) } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt index e13f3f454fb..3366d6b8110 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt @@ -18,6 +18,7 @@ package org.matrix.android.sdk.internal.session.room.timeline import io.realm.OrderedCollectionChangeSet import io.realm.OrderedRealmCollectionChangeListener +import io.realm.Realm import io.realm.RealmConfiguration import io.realm.RealmObjectChangeListener import io.realm.RealmQuery @@ -26,10 +27,16 @@ import io.realm.Sort import kotlinx.coroutines.CompletableDeferred import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.extensions.tryOrNull +import org.matrix.android.sdk.api.session.events.model.Event import org.matrix.android.sdk.api.session.events.model.EventType +import org.matrix.android.sdk.api.session.events.model.content.EncryptedEventContent +import org.matrix.android.sdk.api.session.events.model.toModel +import org.matrix.android.sdk.api.session.room.model.message.MessageContent import org.matrix.android.sdk.api.session.room.timeline.Timeline import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import org.matrix.android.sdk.api.session.room.timeline.TimelineSettings +import org.matrix.android.sdk.api.session.room.timeline.getLastMessageContent +import org.matrix.android.sdk.api.session.room.timeline.isReply import org.matrix.android.sdk.api.settings.LightweightSettingsStorage import org.matrix.android.sdk.internal.database.mapper.EventMapper import org.matrix.android.sdk.internal.database.mapper.TimelineEventMapper @@ -37,12 +44,15 @@ import org.matrix.android.sdk.internal.database.model.ChunkEntity import org.matrix.android.sdk.internal.database.model.ChunkEntityFields import org.matrix.android.sdk.internal.database.model.TimelineEventEntity import org.matrix.android.sdk.internal.database.model.TimelineEventEntityFields +import org.matrix.android.sdk.internal.database.query.where import org.matrix.android.sdk.internal.session.room.relation.threads.DefaultFetchThreadTimelineTask import org.matrix.android.sdk.internal.session.room.relation.threads.FetchThreadTimelineTask +import org.matrix.android.sdk.internal.session.room.send.LocalEchoEventFactory import org.matrix.android.sdk.internal.session.sync.handler.room.ThreadsAwarenessHandler import timber.log.Timber import java.util.Collections import java.util.concurrent.atomic.AtomicBoolean +import java.util.concurrent.atomic.AtomicReference /** * This is a wrapper around a ChunkEntity in the database. @@ -66,6 +76,8 @@ internal class TimelineChunk( private val initialEventId: String?, private val onBuiltEvents: (Boolean) -> Unit, private val onEventsDeleted: () -> Unit, + private val realm: AtomicReference, + val localEchoEventFactory: LocalEchoEventFactory, ) { private val isLastForward = AtomicBoolean(chunkEntity.isLastForward) @@ -413,7 +425,41 @@ internal class TimelineChunk( buildReadReceipts = timelineSettings.buildReadReceipts ).let { // eventually enhance with ui echo? - (uiEchoManager?.decorateEventWithReactionUiEcho(it) ?: it) + uiEchoManager?.decorateEventWithReactionUiEcho(it) + + if (it.isReply()) { + createNewEncryptedRepliedEvent(it)?.let { newEvent -> + it.copy(root = newEvent) + } ?: it + } else it + } + + private fun createNewEncryptedRepliedEvent(currentTimelineEvent: TimelineEvent): Event? { + val relatesEventId = if (currentTimelineEvent.isEncrypted()) { + currentTimelineEvent.root.content.toModel()?.relatesTo?.inReplyTo?.eventId + } else { + currentTimelineEvent.root.content.toModel()?.relatesTo?.inReplyTo?.eventId + } + return relatesEventId?.let { eventId -> + val timeLineEventEntity = TimelineEventEntity.where( + realm.get(), + roomId, + eventId + ).findFirst() + + val replyText = localEchoEventFactory + .bodyForReply(currentTimelineEvent.getLastMessageContent(), true).formattedText ?: "" + + timeLineEventEntity?.let { timelineEventEntity -> + localEchoEventFactory.createReplyTextEvent( + roomId, + timelineEventMapper.map(timelineEventEntity), + replyText, + false, + showInThread = false + ) + } + } } /** @@ -595,7 +641,9 @@ internal class TimelineChunk( lightweightSettingsStorage = lightweightSettingsStorage, initialEventId = null, onBuiltEvents = this.onBuiltEvents, - onEventsDeleted = this.onEventsDeleted + onEventsDeleted = this.onEventsDeleted, + realm = realm, + localEchoEventFactory = localEchoEventFactory ) } From 3aa0ce79f383a74852168f4028a5173e97378c55 Mon Sep 17 00:00:00 2001 From: Claire G Date: Wed, 6 Jul 2022 15:38:57 +0200 Subject: [PATCH 08/15] Use same eventId than before --- .../session/room/send/LocalEchoEventFactory.kt | 16 +++++++++------- .../session/room/timeline/TimelineChunk.kt | 6 ++++-- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt index 45378213edb..b8fcb2b5058 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt @@ -507,13 +507,13 @@ internal class LocalEchoEventFactory @Inject constructor( return createMessageEvent(roomId, content) } - private fun createMessageEvent(roomId: String, content: MessageContent? = null): Event { - return createEvent(roomId, EventType.MESSAGE, content.toContent()) + private fun createMessageEvent(roomId: String, content: MessageContent? = null, currentEventId: String? = null): Event { + return createEvent(roomId, EventType.MESSAGE, content.toContent(), currentEventId) } - fun createEvent(roomId: String, type: String, content: Content?): Event { + fun createEvent(roomId: String, type: String, content: Content?, currentEventId: String? = null): Event { val newContent = enhanceStickerIfNeeded(type, content) ?: content - val localId = LocalEcho.createLocalEchoId() + val localId = currentEventId ?: LocalEcho.createLocalEchoId() return Event( roomId = roomId, originServerTs = dummyOriginServerTs(), @@ -582,7 +582,8 @@ internal class LocalEchoEventFactory @Inject constructor( replyText: CharSequence, autoMarkdown: Boolean, rootThreadEventId: String? = null, - showInThread: Boolean + showInThread: Boolean, + currentEventId: String? = null ): Event? { // Fallbacks and event representation // TODO Add error/warning logs when any of this is null @@ -609,7 +610,7 @@ internal class LocalEchoEventFactory @Inject constructor( val replyFallback = buildReplyFallback(body, userId, replyText.toString()) val eventId = eventReplied.root.eventId ?: return null - val content = MessageTextContent( + val event = MessageTextContent( msgType = MessageType.MSGTYPE_TEXT, format = MessageFormat.FORMAT_MATRIX_HTML, body = replyFallback, @@ -620,7 +621,8 @@ internal class LocalEchoEventFactory @Inject constructor( showInThread = showInThread ) ) - return createMessageEvent(roomId, content) + + return createMessageEvent(roomId, event, currentEventId) } /** diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt index 3366d6b8110..63040bac35d 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt @@ -431,7 +431,7 @@ internal class TimelineChunk( createNewEncryptedRepliedEvent(it)?.let { newEvent -> it.copy(root = newEvent) } ?: it - } else it + } else it } private fun createNewEncryptedRepliedEvent(currentTimelineEvent: TimelineEvent): Event? { @@ -456,7 +456,9 @@ internal class TimelineChunk( timelineEventMapper.map(timelineEventEntity), replyText, false, - showInThread = false + showInThread = false, + currentEventId = currentTimelineEvent.eventId + ) } } From 9029dc16a7d1aba8c22ae3c5a7617fcef55ed16b Mon Sep 17 00:00:00 2001 From: Claire G Date: Wed, 6 Jul 2022 15:51:54 +0200 Subject: [PATCH 09/15] clean --- .../room/send/LocalEchoEventFactory.kt | 5 ++-- .../room/timeline/LoadTimelineStrategy.kt | 29 ------------------- 2 files changed, 2 insertions(+), 32 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt index b8fcb2b5058..f3dc8ff7129 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt @@ -610,7 +610,7 @@ internal class LocalEchoEventFactory @Inject constructor( val replyFallback = buildReplyFallback(body, userId, replyText.toString()) val eventId = eventReplied.root.eventId ?: return null - val event = MessageTextContent( + val content = MessageTextContent( msgType = MessageType.MSGTYPE_TEXT, format = MessageFormat.FORMAT_MATRIX_HTML, body = replyFallback, @@ -621,8 +621,7 @@ internal class LocalEchoEventFactory @Inject constructor( showInThread = showInThread ) ) - - return createMessageEvent(roomId, event, currentEventId) + return createMessageEvent(roomId, content, currentEventId) } /** diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt index eedb9ccd5f5..56a674bd703 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt @@ -255,35 +255,6 @@ internal class LoadTimelineStrategy constructor( } } - private fun createNewEncryptedRepliedEvent(currentTimelineEvent: TimelineEvent): Event? { - val relatesEventId = if (currentTimelineEvent.isEncrypted()) { - currentTimelineEvent.root.content.toModel()?.relatesTo?.inReplyTo?.eventId - } else { - currentTimelineEvent.root.content.toModel()?.relatesTo?.inReplyTo?.eventId - } - return relatesEventId?.let { eventId -> - val timeLineEventEntity = TimelineEventEntity.where( - dependencies.realm.get(), - roomId, - eventId - ).findFirst() - - val replyText = dependencies - .localEchoEventFactory - .bodyForReply(currentTimelineEvent.getLastMessageContent(), true).formattedText ?: "" - - timeLineEventEntity?.let { timelineEventEntity -> - dependencies.localEchoEventFactory.createReplyTextEvent( - roomId, - dependencies.timelineEventMapper.map(timelineEventEntity), - replyText, - false, - showInThread = false - ) - } - } - } - private fun applyLiveRoomState(event: TimelineEvent): TimelineEvent { val updatedState = liveRoomStateListener.getLiveState(event.senderInfo.userId) return if (updatedState != null) { From dfc066b459b3216014c83ffc93d87d1bc5bcdb82 Mon Sep 17 00:00:00 2001 From: Claire G Date: Wed, 6 Jul 2022 16:56:00 +0200 Subject: [PATCH 10/15] clean --- .../internal/session/room/timeline/LoadTimelineStrategy.kt | 6 ------ 1 file changed, 6 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt index 56a674bd703..88f01f49c26 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt @@ -27,22 +27,16 @@ import org.matrix.android.sdk.api.MatrixCoroutineDispatchers import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.failure.Failure import org.matrix.android.sdk.api.failure.MatrixError -import org.matrix.android.sdk.api.session.events.model.Event -import org.matrix.android.sdk.api.session.events.model.content.EncryptedEventContent -import org.matrix.android.sdk.api.session.events.model.toModel -import org.matrix.android.sdk.api.session.room.model.message.MessageContent import org.matrix.android.sdk.api.session.room.send.SendState import org.matrix.android.sdk.api.session.room.timeline.Timeline import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import org.matrix.android.sdk.api.session.room.timeline.TimelineSettings -import org.matrix.android.sdk.api.session.room.timeline.getLastMessageContent import org.matrix.android.sdk.api.settings.LightweightSettingsStorage import org.matrix.android.sdk.internal.database.helper.addIfNecessary import org.matrix.android.sdk.internal.database.mapper.TimelineEventMapper import org.matrix.android.sdk.internal.database.model.ChunkEntity import org.matrix.android.sdk.internal.database.model.ChunkEntityFields import org.matrix.android.sdk.internal.database.model.RoomEntity -import org.matrix.android.sdk.internal.database.model.TimelineEventEntity import org.matrix.android.sdk.internal.database.model.deleteAndClearThreadEvents import org.matrix.android.sdk.internal.database.query.findAllIncludingEvents import org.matrix.android.sdk.internal.database.query.findLastForwardChunkOfThread From 5f2c3d7b46d5e560ed8aa1a129a892299b43359f Mon Sep 17 00:00:00 2001 From: Claire G Date: Thu, 7 Jul 2022 14:51:01 +0200 Subject: [PATCH 11/15] Fix PR comments --- .../session/room/timeline/TimelineChunk.kt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt index 63040bac35d..852aeb99931 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt @@ -423,15 +423,15 @@ internal class TimelineChunk( private fun buildTimelineEvent(eventEntity: TimelineEventEntity) = timelineEventMapper.map( timelineEventEntity = eventEntity, buildReadReceipts = timelineSettings.buildReadReceipts - ).let { + ).let { timelineEvent -> // eventually enhance with ui echo? - uiEchoManager?.decorateEventWithReactionUiEcho(it) + uiEchoManager?.decorateEventWithReactionUiEcho(timelineEvent) - if (it.isReply()) { - createNewEncryptedRepliedEvent(it)?.let { newEvent -> - it.copy(root = newEvent) - } ?: it - } else it + if (timelineEvent.isReply()) { + createNewEncryptedRepliedEvent(timelineEvent)?.let { newEvent -> + timelineEvent.copy(root = newEvent) + } ?: timelineEvent + } else timelineEvent } private fun createNewEncryptedRepliedEvent(currentTimelineEvent: TimelineEvent): Event? { From 9042ba323ef0b979e0a2b5ea56cbfeaecea4b0ba Mon Sep 17 00:00:00 2001 From: Claire G Date: Fri, 8 Jul 2022 11:43:41 +0200 Subject: [PATCH 12/15] Fix PR comments --- .../session/room/timeline/TimelineEvent.kt | 2 +- .../room/send/LocalEchoEventFactory.kt | 56 +++++++++++++++++-- .../session/room/timeline/TimelineChunk.kt | 18 ++++-- 3 files changed, 64 insertions(+), 12 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt index f4afbbe059a..9d8c8a13bd7 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt @@ -65,7 +65,7 @@ data class TimelineEvent( init { if (BuildConfig.DEBUG) { -// assert(eventId == root.eventId) + assert(eventId == root.eventId) } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt index f3dc8ff7129..54006ff5aba 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt @@ -507,13 +507,13 @@ internal class LocalEchoEventFactory @Inject constructor( return createMessageEvent(roomId, content) } - private fun createMessageEvent(roomId: String, content: MessageContent? = null, currentEventId: String? = null): Event { - return createEvent(roomId, EventType.MESSAGE, content.toContent(), currentEventId) + private fun createMessageEvent(roomId: String, content: MessageContent? = null): Event { + return createEvent(roomId, EventType.MESSAGE, content.toContent()) } - fun createEvent(roomId: String, type: String, content: Content?, currentEventId: String? = null): Event { + fun createEvent(roomId: String, type: String, content: Content?): Event { val newContent = enhanceStickerIfNeeded(type, content) ?: content - val localId = currentEventId ?: LocalEcho.createLocalEchoId() + val localId = LocalEcho.createLocalEchoId() return Event( roomId = roomId, originServerTs = dummyOriginServerTs(), @@ -573,6 +573,51 @@ internal class LocalEchoEventFactory @Inject constructor( return clock.epochMillis() } + fun createReplyTextContent( + eventReplied: TimelineEvent, + replyText: CharSequence, + autoMarkdown: Boolean, + rootThreadEventId: String? = null, + showInThread: Boolean + ): Content? { + // Fallbacks and event representation + // TODO Add error/warning logs when any of this is null + val permalink = permalinkFactory.createPermalink(eventReplied.root, false) ?: return null + val userId = eventReplied.root.senderId ?: return null + val userLink = permalinkFactory.createPermalink(userId, false) ?: return null + + val body = bodyForReply(eventReplied.getLastMessageContent(), eventReplied.isReply()) + + // As we always supply formatted body for replies we should force the MarkdownParser to produce html. + val replyTextFormatted = markdownParser.parse(replyText, force = true, advanced = autoMarkdown).takeFormatted() + // Body of the original message may not have formatted version, so may also have to convert to html. + val bodyFormatted = body.formattedText ?: markdownParser.parse(body.text, force = true, advanced = autoMarkdown).takeFormatted() + val replyFormatted = buildFormattedReply( + permalink, + userLink, + userId, + bodyFormatted, + replyTextFormatted + ) + // + // > <@alice:example.org> This is the original body + // + val replyFallback = buildReplyFallback(body, userId, replyText.toString()) + + val eventId = eventReplied.root.eventId ?: return null + return MessageTextContent( + msgType = MessageType.MSGTYPE_TEXT, + format = MessageFormat.FORMAT_MATRIX_HTML, + body = replyFallback, + formattedBody = replyFormatted, + relatesTo = generateReplyRelationContent( + eventId = eventId, + rootThreadEventId = rootThreadEventId, + showInThread = showInThread + ) + ).toContent() + } + /** * Creates a reply to a regular timeline Event or a thread Event if needed. */ @@ -583,7 +628,6 @@ internal class LocalEchoEventFactory @Inject constructor( autoMarkdown: Boolean, rootThreadEventId: String? = null, showInThread: Boolean, - currentEventId: String? = null ): Event? { // Fallbacks and event representation // TODO Add error/warning logs when any of this is null @@ -621,7 +665,7 @@ internal class LocalEchoEventFactory @Inject constructor( showInThread = showInThread ) ) - return createMessageEvent(roomId, content, currentEventId) + return createMessageEvent(roomId, content) } /** diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt index 852aeb99931..98c390a6dfc 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt @@ -29,6 +29,7 @@ import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.session.events.model.Event import org.matrix.android.sdk.api.session.events.model.EventType +import org.matrix.android.sdk.api.session.events.model.UnsignedData import org.matrix.android.sdk.api.session.events.model.content.EncryptedEventContent import org.matrix.android.sdk.api.session.events.model.toModel import org.matrix.android.sdk.api.session.room.model.message.MessageContent @@ -451,14 +452,21 @@ internal class TimelineChunk( .bodyForReply(currentTimelineEvent.getLastMessageContent(), true).formattedText ?: "" timeLineEventEntity?.let { timelineEventEntity -> - localEchoEventFactory.createReplyTextEvent( - roomId, + val newContent = localEchoEventFactory.createReplyTextContent( timelineEventMapper.map(timelineEventEntity), replyText, false, - showInThread = false, - currentEventId = currentTimelineEvent.eventId - + showInThread = false + ) + val event = currentTimelineEvent.root + Event( + roomId = event.roomId, + originServerTs = event.originServerTs, + senderId = event.senderId, + eventId = currentTimelineEvent.eventId, + type = EventType.MESSAGE, + content = newContent, + unsignedData = UnsignedData(age = null, transactionId = currentTimelineEvent.eventId) ) } } From 7f4cfb9ec2ac89bfad04d64f24df166d0a0eec3a Mon Sep 17 00:00:00 2001 From: Claire G Date: Mon, 18 Jul 2022 09:55:26 +0200 Subject: [PATCH 13/15] Fix PR comments --- .../room/send/LocalEchoEventFactory.kt | 43 ++----------------- .../session/room/timeline/TimelineChunk.kt | 14 ++++-- 2 files changed, 15 insertions(+), 42 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt index 54006ff5aba..7ead72932a1 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt @@ -579,7 +579,7 @@ internal class LocalEchoEventFactory @Inject constructor( autoMarkdown: Boolean, rootThreadEventId: String? = null, showInThread: Boolean - ): Content? { + ): MessageContent? { // Fallbacks and event representation // TODO Add error/warning logs when any of this is null val permalink = permalinkFactory.createPermalink(eventReplied.root, false) ?: return null @@ -615,7 +615,7 @@ internal class LocalEchoEventFactory @Inject constructor( rootThreadEventId = rootThreadEventId, showInThread = showInThread ) - ).toContent() + ) } /** @@ -628,43 +628,8 @@ internal class LocalEchoEventFactory @Inject constructor( autoMarkdown: Boolean, rootThreadEventId: String? = null, showInThread: Boolean, - ): Event? { - // Fallbacks and event representation - // TODO Add error/warning logs when any of this is null - val permalink = permalinkFactory.createPermalink(eventReplied.root, false) ?: return null - val userId = eventReplied.root.senderId ?: return null - val userLink = permalinkFactory.createPermalink(userId, false) ?: return null - - val body = bodyForReply(eventReplied.getLastMessageContent(), eventReplied.isReply()) - - // As we always supply formatted body for replies we should force the MarkdownParser to produce html. - val replyTextFormatted = markdownParser.parse(replyText, force = true, advanced = autoMarkdown).takeFormatted() - // Body of the original message may not have formatted version, so may also have to convert to html. - val bodyFormatted = body.formattedText ?: markdownParser.parse(body.text, force = true, advanced = autoMarkdown).takeFormatted() - val replyFormatted = buildFormattedReply( - permalink, - userLink, - userId, - bodyFormatted, - replyTextFormatted - ) - // - // > <@alice:example.org> This is the original body - // - val replyFallback = buildReplyFallback(body, userId, replyText.toString()) - - val eventId = eventReplied.root.eventId ?: return null - val content = MessageTextContent( - msgType = MessageType.MSGTYPE_TEXT, - format = MessageFormat.FORMAT_MATRIX_HTML, - body = replyFallback, - formattedBody = replyFormatted, - relatesTo = generateReplyRelationContent( - eventId = eventId, - rootThreadEventId = rootThreadEventId, - showInThread = showInThread - ) - ) + ): Event { + val content = createReplyTextContent(eventReplied, replyText, autoMarkdown, rootThreadEventId, showInThread) return createMessageEvent(roomId, content) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt index 98c390a6dfc..9121614000a 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt @@ -31,6 +31,7 @@ import org.matrix.android.sdk.api.session.events.model.Event import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.api.session.events.model.UnsignedData import org.matrix.android.sdk.api.session.events.model.content.EncryptedEventContent +import org.matrix.android.sdk.api.session.events.model.toContent import org.matrix.android.sdk.api.session.events.model.toModel import org.matrix.android.sdk.api.session.room.model.message.MessageContent import org.matrix.android.sdk.api.session.room.timeline.Timeline @@ -457,7 +458,7 @@ internal class TimelineChunk( replyText, false, showInThread = false - ) + ).toContent() val event = currentTimelineEvent.root Event( roomId = event.roomId, @@ -466,8 +467,15 @@ internal class TimelineChunk( eventId = currentTimelineEvent.eventId, type = EventType.MESSAGE, content = newContent, - unsignedData = UnsignedData(age = null, transactionId = currentTimelineEvent.eventId) - ) + unsignedData = UnsignedData(age = null, transactionId = currentTimelineEvent.eventId), + ).apply { + mxDecryptionResult = event.mxDecryptionResult + mCryptoError = event.mCryptoError + mCryptoErrorReason = event.mCryptoErrorReason + sendState = event.sendState + ageLocalTs = event.ageLocalTs + threadDetails = event.threadDetails + } } } } From 573948f393750d91ec69fec2e9dcb0b3306131d0 Mon Sep 17 00:00:00 2001 From: Claire G Date: Mon, 18 Jul 2022 11:43:02 +0200 Subject: [PATCH 14/15] Fix build --- .../internal/session/room/send/LocalEchoEventFactory.kt | 6 ++++-- .../sdk/internal/session/room/timeline/TimelineChunk.kt | 9 +-------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt index 7ead72932a1..39e66a65954 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/LocalEchoEventFactory.kt @@ -628,9 +628,11 @@ internal class LocalEchoEventFactory @Inject constructor( autoMarkdown: Boolean, rootThreadEventId: String? = null, showInThread: Boolean, - ): Event { + ): Event? { val content = createReplyTextContent(eventReplied, replyText, autoMarkdown, rootThreadEventId, showInThread) - return createMessageEvent(roomId, content) + return content?.let { + createMessageEvent(roomId, it) + } } /** diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt index 9121614000a..55c50c8a365 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt @@ -468,14 +468,7 @@ internal class TimelineChunk( type = EventType.MESSAGE, content = newContent, unsignedData = UnsignedData(age = null, transactionId = currentTimelineEvent.eventId), - ).apply { - mxDecryptionResult = event.mxDecryptionResult - mCryptoError = event.mCryptoError - mCryptoErrorReason = event.mCryptoErrorReason - sendState = event.sendState - ageLocalTs = event.ageLocalTs - threadDetails = event.threadDetails - } + ) } } } From 14b8c37d24075362d8529e251cc23ae8e7e364db Mon Sep 17 00:00:00 2001 From: Claire G Date: Tue, 19 Jul 2022 09:32:48 +0200 Subject: [PATCH 15/15] Fix PR comments --- .../sdk/internal/session/room/timeline/TimelineChunk.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt index 55c50c8a365..f271d4b43ae 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt @@ -468,7 +468,11 @@ internal class TimelineChunk( type = EventType.MESSAGE, content = newContent, unsignedData = UnsignedData(age = null, transactionId = currentTimelineEvent.eventId), - ) + ).apply { + this.sendState = event.sendState + this.ageLocalTs = event.ageLocalTs + this.threadDetails = event.threadDetails + } } } }