diff --git a/vector/src/main/java/im/vector/app/core/utils/SharedEvent.kt b/vector/src/main/java/im/vector/app/core/utils/SharedEvent.kt index 779270c0923..5c9fd30b2d1 100644 --- a/vector/src/main/java/im/vector/app/core/utils/SharedEvent.kt +++ b/vector/src/main/java/im/vector/app/core/utils/SharedEvent.kt @@ -16,6 +16,7 @@ package im.vector.app.core.utils +import android.os.SystemClock import im.vector.app.core.platform.VectorViewEvents import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow @@ -43,15 +44,25 @@ class EventQueue(capacity: Int) : SharedEvents { * * Keeps track of who has already handled its content. */ -private class OneTimeEvent(private val content: T) { - +private class OneTimeEvent( + private val content: T, + private val creationDate: Long = SystemClock.elapsedRealtime() +) { private val handlers = CopyOnWriteArraySet() /** * @param asker Used to identify, whether this "asker" has already handled this Event. - * @return Event content or null if it has been already handled by asker + * @return Event content or null if it has been already handled by asker or if it is too old. */ - fun getIfNotHandled(asker: String): T? = if (handlers.add(asker)) content else null + fun getIfNotHandled(asker: String): T? { + val now = SystemClock.elapsedRealtime() + if (now > creationDate + LIFE_DURATION_MILLIS) return null + return if (handlers.add(asker)) content else null + } + + companion object { + private const val LIFE_DURATION_MILLIS = 150L + } } private fun Flow>.filterNotHandledBy(consumerId: String): Flow = transform { event ->