From 243ce23055ee06982238dda5fe0b6c8f8cc2cb92 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 29 Jan 2025 10:35:52 +0100 Subject: [PATCH] Protect access to member timeline with a Mutex and clean the code. --- .../impl/datasource/MediaTimeline.kt | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/MediaTimeline.kt b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/MediaTimeline.kt index 5b26b50d62..6dc4136193 100644 --- a/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/MediaTimeline.kt +++ b/libraries/mediaviewer/impl/src/main/kotlin/io/element/android/libraries/mediaviewer/impl/datasource/MediaTimeline.kt @@ -18,6 +18,8 @@ import io.element.android.libraries.mediaviewer.impl.model.GroupedMediaItems import io.element.android.libraries.mediaviewer.impl.model.MediaItem import io.element.android.libraries.mediaviewer.impl.model.hasEvent import kotlinx.collections.immutable.persistentListOf +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock import javax.inject.Inject interface MediaTimeline { @@ -37,19 +39,15 @@ class LiveMediaTimeline @Inject constructor( private val room: MatrixRoom, ) : MediaTimeline { private var timeline: Timeline? = null - override suspend fun getTimeline(): Result { - return if (timeline == null) { - room.mediaTimeline(null).fold( - { - timeline = it - Result.success(it) - }, - { - Result.failure(it) - }, - ) + private val mutex = Mutex() + + override suspend fun getTimeline(): Result = mutex.withLock { + val currentTimeline = timeline + if (currentTimeline == null) { + room.mediaTimeline(null) + .onSuccess { timeline = it } } else { - Result.success(timeline!!) + Result.success(currentTimeline) } }