diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/FetchEditHistoryTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/FetchEditHistoryTask.kt index 5f5c000171..93c7f143fd 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/FetchEditHistoryTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/FetchEditHistoryTask.kt @@ -22,6 +22,7 @@ import org.matrix.android.sdk.internal.crypto.CryptoSessionInfoProvider import org.matrix.android.sdk.internal.network.GlobalErrorReceiver import org.matrix.android.sdk.internal.network.executeRequest import org.matrix.android.sdk.internal.session.room.RoomAPI +import org.matrix.android.sdk.internal.session.room.timeline.TimelineEventDataSource import org.matrix.android.sdk.internal.task.Task import javax.inject.Inject @@ -35,7 +36,8 @@ internal interface FetchEditHistoryTask : Task { @@ -50,10 +52,14 @@ internal class DefaultFetchEditHistoryTask @Inject constructor( } // Filter out edition form other users, and redacted editions - val originalSenderId = response.originalEvent?.senderId + val originalEvent = eventDataSource.getTimelineEvent( + roomId = params.roomId, + eventId = params.eventId, + ) + val originalSenderId = originalEvent?.senderInfo?.userId val events = response.chunks .filter { it.senderId == originalSenderId } .filter { !it.isRedacted() } - return events + listOfNotNull(response.originalEvent) + return events + listOfNotNull(originalEvent?.root) } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/RelationsResponse.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/RelationsResponse.kt index a65165d457..f2b0651e01 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/RelationsResponse.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/RelationsResponse.kt @@ -22,7 +22,6 @@ import org.matrix.android.sdk.api.session.events.model.Event @JsonClass(generateAdapter = true) internal data class RelationsResponse( @Json(name = "chunk") val chunks: List, - @Json(name = "original_event") val originalEvent: Event?, @Json(name = "next_batch") val nextBatch: String?, @Json(name = "prev_batch") val prevBatch: String? ) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/threads/FetchThreadTimelineTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/threads/FetchThreadTimelineTask.kt index edd74c2ce0..4cf6445920 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/threads/FetchThreadTimelineTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/relation/threads/FetchThreadTimelineTask.kt @@ -17,6 +17,7 @@ package org.matrix.android.sdk.internal.session.room.relation.threads import com.zhuinden.monarchy.Monarchy import io.realm.Realm +import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.session.crypto.MXCryptoError import org.matrix.android.sdk.api.session.crypto.model.OlmDecryptionResult import org.matrix.android.sdk.api.session.events.model.Event @@ -24,6 +25,7 @@ import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.api.session.room.model.RoomMemberContent import org.matrix.android.sdk.api.session.room.send.SendState import org.matrix.android.sdk.internal.crypto.DefaultCryptoService +import org.matrix.android.sdk.internal.database.RealmSessionProvider import org.matrix.android.sdk.internal.database.helper.addTimelineEvent import org.matrix.android.sdk.internal.database.mapper.asDomain import org.matrix.android.sdk.internal.database.mapper.toEntity @@ -46,6 +48,7 @@ import org.matrix.android.sdk.internal.network.executeRequest import org.matrix.android.sdk.internal.session.events.getFixedRoomMemberContent import org.matrix.android.sdk.internal.session.room.RoomAPI import org.matrix.android.sdk.internal.session.room.relation.RelationsResponse +import org.matrix.android.sdk.internal.session.room.timeline.GetEventTask import org.matrix.android.sdk.internal.session.room.timeline.PaginationDirection import org.matrix.android.sdk.internal.task.Task import org.matrix.android.sdk.internal.util.awaitTransaction @@ -87,6 +90,8 @@ internal class DefaultFetchThreadTimelineTask @Inject constructor( @SessionDatabase private val monarchy: Monarchy, private val cryptoService: DefaultCryptoService, private val clock: Clock, + private val realmSessionProvider: RealmSessionProvider, + private val getEventTask: GetEventTask, ) : FetchThreadTimelineTask { enum class Result { @@ -114,11 +119,26 @@ internal class DefaultFetchThreadTimelineTask @Inject constructor( params: FetchThreadTimelineTask.Params ): Result { val threadList = response.chunks - val threadRootEvent = response.originalEvent val hasReachEnd = response.nextBatch == null - monarchy.awaitTransaction { realm -> + val isRootThreadTimelineEventEntityKnown: Boolean + var threadRootEvent: Event? = null + if (hasReachEnd) { + isRootThreadTimelineEventEntityKnown = realmSessionProvider.withRealm { realm -> + TimelineEventEntity + .where(realm, roomId = params.roomId, eventId = params.rootThreadEventId) + .findFirst() + } != null + if (!isRootThreadTimelineEventEntityKnown) { + // Fetch the root event from the server + threadRootEvent = tryOrNull { + getEventTask.execute(GetEventTask.Params(roomId = params.roomId, eventId = params.rootThreadEventId)) + } + } + } + + monarchy.awaitTransaction { realm -> val threadChunk = ChunkEntity.findLastForwardChunkOfThread(realm, params.roomId, params.rootThreadEventId) ?: run { return@awaitTransaction @@ -173,7 +193,7 @@ internal class DefaultFetchThreadTimelineTask @Inject constructor( // Case when thread event is not in the device Timber.i("###THREADS FetchThreadTimelineTask root thread event: ${params.rootThreadEventId} NOT FOUND! Lets create a temp one") val eventEntity = createEventEntity(params.roomId, threadRootEvent, realm) - roomMemberContentsByUser.addSenderState(realm, params.roomId, threadRootEvent.senderId) + roomMemberContentsByUser.addSenderState(realm, params.roomId, threadRootEvent.senderId!!) threadChunk.addTimelineEvent( roomId = params.roomId, eventEntity = eventEntity,