Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/7282.sdk
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Stop using `original_event` field from `/relations` endpoint
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -35,7 +36,8 @@ internal interface FetchEditHistoryTask : Task<FetchEditHistoryTask.Params, List
internal class DefaultFetchEditHistoryTask @Inject constructor(
private val roomAPI: RoomAPI,
private val globalErrorReceiver: GlobalErrorReceiver,
private val cryptoSessionInfoProvider: CryptoSessionInfoProvider
private val cryptoSessionInfoProvider: CryptoSessionInfoProvider,
private val eventDataSource: TimelineEventDataSource,
) : FetchEditHistoryTask {

override suspend fun execute(params: FetchEditHistoryTask.Params): List<Event> {
Expand All @@ -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)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<Event>,
@Json(name = "original_event") val originalEvent: Event?,
@Json(name = "next_batch") val nextBatch: String?,
@Json(name = "prev_batch") val prevBatch: String?
)
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,15 @@ 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
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
Expand All @@ -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
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(we have to do that outside of the Realm transaction below)

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
Expand Down Expand Up @@ -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,
Expand Down