mirror of
https://github.com/SchildiChat/SchildiChat-android.git
synced 2024-11-28 04:55:57 +03:00
Fix some cases of rich reply rendering while/after fetching event
Change-Id: Id940df5c838ac962f28f7b02bb7dfdb2967d8a28
This commit is contained in:
parent
437d2815f4
commit
772ff30045
1 changed files with 12 additions and 4 deletions
|
@ -90,6 +90,8 @@ class ReplyPreviewRetriever(
|
|||
private val lookedUpEvents = mutableMapOf<String, String>()
|
||||
// Timestamps of allowed server requests for individual events, to not spam server with the same request
|
||||
private val serverRequests = mutableMapOf<String, Long>()
|
||||
// eventToRetrieveId-specific locking
|
||||
private val retrieveEventLocks = mutableMapOf<String, Any>()
|
||||
|
||||
fun invalidateEventsFromSnapshot(snapshot: List<TimelineEvent>) {
|
||||
val snapshotEvents = snapshot.associateBy { it.eventId }
|
||||
|
@ -141,6 +143,9 @@ class ReplyPreviewRetriever(
|
|||
}
|
||||
}?.let { eventIdToRetrieve ->
|
||||
coroutineScope.launch(Dispatchers.IO) {
|
||||
val retrieveEventLock = synchronized(retrieveEventLocks) {
|
||||
retrieveEventLocks.getOrPut(eventIdToRetrieve) { eventIdToRetrieve }
|
||||
}
|
||||
runCatching {
|
||||
// Don't spam the server too often if it doesn't know the event
|
||||
val mayAskServerForEvent = synchronized(serverRequests) {
|
||||
|
@ -153,10 +158,13 @@ class ReplyPreviewRetriever(
|
|||
}
|
||||
}
|
||||
if (DEBUG) Timber.i("REPLY HANDLING AFTER ${System.currentTimeMillis() - now} for $eventId / $eventIdToRetrieve, may ask: $mayAskServerForEvent")// TODO remove
|
||||
if (mayAskServerForEvent) {
|
||||
session.getRoom(roomId)?.timelineService()?.getOrFetchAndPersistTimelineEventBlocking(eventIdToRetrieve)
|
||||
} else {
|
||||
session.getRoom(roomId)?.getTimelineEvent(eventIdToRetrieve)
|
||||
// Synchronize, so that we await a pending server fetch if necessary
|
||||
synchronized(retrieveEventLock) {
|
||||
if (mayAskServerForEvent) {
|
||||
session.getRoom(roomId)?.timelineService()?.getOrFetchAndPersistTimelineEventBlocking(eventIdToRetrieve)
|
||||
} else {
|
||||
session.getRoom(roomId)?.getTimelineEvent(eventIdToRetrieve)
|
||||
}
|
||||
}?.apply {
|
||||
// We need to check encryption
|
||||
val repliedToEvent = root // TODO what if rendered event is not root, i.e. root.eventId != getLatestEventId()? (we currently just use the initial event in this case, better than nothing)
|
||||
|
|
Loading…
Reference in a new issue