mirror of
https://github.com/vector-im/element-android.git
synced 2024-11-16 02:05:06 +08:00
Improve logic
This commit is contained in:
parent
01ade64f3b
commit
879c4ffef6
@ -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<RoomEntity>) {
|
||||
// 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<Event>) {
|
||||
// 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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user