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 8b1df21845..16434aa3c8 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 @@ -41,6 +41,7 @@ import io.element.android.libraries.matrix.impl.media.map import io.element.android.libraries.matrix.impl.room.location.toInner import io.element.android.libraries.matrix.impl.timeline.RustMatrixTimeline import io.element.android.libraries.matrix.impl.timeline.backPaginationStatusFlow +import io.element.android.libraries.matrix.impl.timeline.eventOrigin import io.element.android.libraries.matrix.impl.timeline.timelineDiffFlow import io.element.android.libraries.sessionstorage.api.SessionData import io.element.android.services.toolbox.api.systemclock.SystemClock @@ -54,6 +55,7 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import org.matrix.rustcomponents.sdk.EventItemOrigin import org.matrix.rustcomponents.sdk.RequiredState import org.matrix.rustcomponents.sdk.Room import org.matrix.rustcomponents.sdk.RoomListItem @@ -119,9 +121,11 @@ class RustMatrixRoom( roomCoroutineScope.launch(roomDispatcher) { innerRoom.timelineDiffFlow { initialList -> _timeline.postItems(initialList) - }.onEach { - _syncUpdateFlow.value = systemClock.epochMillis() - _timeline.postDiff(it) + }.onEach { diff -> + if (diff.eventOrigin() == EventItemOrigin.SYNC) { + _syncUpdateFlow.value = systemClock.epochMillis() + } + _timeline.postDiff(diff) }.launchIn(this) innerRoom.backPaginationStatusFlow() diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/TimelineDiffExt.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/TimelineDiffExt.kt new file mode 100644 index 0000000000..9b47d8040b --- /dev/null +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/TimelineDiffExt.kt @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.libraries.matrix.impl.timeline + +import org.matrix.rustcomponents.sdk.EventItemOrigin +import org.matrix.rustcomponents.sdk.TimelineChange +import org.matrix.rustcomponents.sdk.TimelineDiff +import org.matrix.rustcomponents.sdk.TimelineItem + +/** + * Tries to get an event origin from the TimelineDiff. + * If there is multiple events in the diff, uses the first one as it should be a good indicator. + */ +internal fun TimelineDiff.eventOrigin(): EventItemOrigin? { + return when (change()) { + TimelineChange.APPEND -> { + append()?.first()?.eventOrigin() + } + TimelineChange.PUSH_BACK -> { + pushBack()?.eventOrigin() + } + TimelineChange.PUSH_FRONT -> { + pushFront()?.eventOrigin() + } + TimelineChange.SET -> { + set()?.item?.eventOrigin() + } + TimelineChange.INSERT -> { + insert()?.item?.eventOrigin() + } + TimelineChange.RESET -> { + reset()?.first()?.eventOrigin() + } + else -> null + } +} + +private fun TimelineItem.eventOrigin(): EventItemOrigin? { + return asEvent()?.origin() +}