diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt index 779d78f8c1..70fcca0a92 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt @@ -129,8 +129,6 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle } else { handlingStrategy.data.mapWithProgress(reporter, InitSyncStep.ImportingAccountJoinedRooms, 0.6f) { handleJoinedRoom(realm, it.key, it.value, insertType, syncLocalTimeStampMillis, aggregator) - }.also { - fixStuckLocalEcho(it) } } } @@ -428,6 +426,10 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle } } } + + // Handle deletion of [stuck] local echos if needed + deleteLocalEchosIfNeeded(insertType, roomEntity, eventList) + // posting new events to timeline if any is registered timelineInput.onNewTimelineEvents(roomId = roomId, eventIds = eventIds) return chunkEntity @@ -513,17 +515,16 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle * While we cannot know when a specific event arrived from the pagination (no transactionId included), after each room /sync * we clear all SENT events, and we are sure that we will receive it from /sync or pagination */ - private fun fixStuckLocalEcho(rooms: List) { - // when there are not room events, there is no need to delete SENT messages - // this might be useful for events like typing etc - if (rooms.isNullOrEmpty()) return - rooms.forEach { roomEntity -> - roomEntity.sendingTimelineEvents.filter { timelineEvent -> - timelineEvent.root?.sendState == SendState.SENT - }.forEach { - roomEntity.sendingTimelineEvents.remove(it) - it.deleteOnCascade(true) - } + private fun deleteLocalEchosIfNeeded(insertType: EventInsertType, roomEntity: RoomEntity, eventList: List) { + // Skip deletion if we are on initial sync + if(insertType == EventInsertType.INITIAL_SYNC) return + // Skip deletion if there are no timeline events or there is no event received from the current user + if(eventList.firstOrNull { it.senderId == userId } == null) return + roomEntity.sendingTimelineEvents.filter { timelineEvent -> + timelineEvent.root?.sendState == SendState.SENT + }.forEach { + roomEntity.sendingTimelineEvents.remove(it) + it.deleteOnCascade(true) } } }