From 8cc5f35e0c814d105f7098d2527c16e55ef3b106 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 24 Jun 2024 13:58:15 +0200 Subject: [PATCH] Fix image not rendering after clearing cache. --- .../android/appnav/root/RootNavStateFlowFactory.kt | 4 ++++ .../libraries/matrix/ui/media/ImageLoaderHolder.kt | 9 ++++++++- .../push/test/notifications/FakeImageLoaderHolder.kt | 5 +++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/appnav/src/main/kotlin/io/element/android/appnav/root/RootNavStateFlowFactory.kt b/appnav/src/main/kotlin/io/element/android/appnav/root/RootNavStateFlowFactory.kt index 13c0204f79..b801415f88 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/root/RootNavStateFlowFactory.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/root/RootNavStateFlowFactory.kt @@ -22,6 +22,7 @@ import io.element.android.appnav.di.MatrixClientsHolder import io.element.android.features.login.api.LoginUserStory import io.element.android.features.preferences.api.CacheService import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService +import io.element.android.libraries.matrix.ui.media.ImageLoaderHolder import io.element.android.libraries.sessionstorage.api.LoggedInState import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine @@ -39,6 +40,7 @@ class RootNavStateFlowFactory @Inject constructor( private val authenticationService: MatrixAuthenticationService, private val cacheService: CacheService, private val matrixClientsHolder: MatrixClientsHolder, + private val imageLoaderHolder: ImageLoaderHolder, private val loginUserStory: LoginUserStory, ) { private var currentCacheIndex = 0 @@ -69,6 +71,8 @@ class RootNavStateFlowFactory @Inject constructor( return cacheService.clearedCacheEventFlow .onEach { sessionId -> matrixClientsHolder.remove(sessionId) + // Ensure image loader will be recreated with the new MatrixClient + imageLoaderHolder.remove(sessionId) } .toIndexFlow(initialCacheIndex) .onEach { cacheIndex -> diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/ImageLoaderHolder.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/ImageLoaderHolder.kt index fc027d0e5c..ae60a44a2e 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/ImageLoaderHolder.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/ImageLoaderHolder.kt @@ -32,6 +32,7 @@ import javax.inject.Provider interface ImageLoaderHolder { fun get(client: MatrixClient): ImageLoader + fun remove(sessionId: SessionId) } @ContributesBinding(AppScope::class) @@ -52,7 +53,7 @@ class DefaultImageLoaderHolder @Inject constructor( override suspend fun onSessionCreated(userId: String) = Unit override suspend fun onSessionDeleted(userId: String) { - map.remove(SessionId(userId)) + remove(SessionId(userId)) } }) } @@ -68,4 +69,10 @@ class DefaultImageLoaderHolder @Inject constructor( } } } + + override fun remove(sessionId: SessionId) { + synchronized(map) { + map.remove(sessionId) + } + } } diff --git a/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeImageLoaderHolder.kt b/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeImageLoaderHolder.kt index 57b71007e4..8fc14b2143 100644 --- a/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeImageLoaderHolder.kt +++ b/libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeImageLoaderHolder.kt @@ -18,6 +18,7 @@ package io.element.android.libraries.push.test.notifications import coil.ImageLoader import io.element.android.libraries.matrix.api.MatrixClient +import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.ui.media.ImageLoaderHolder class FakeImageLoaderHolder : ImageLoaderHolder { @@ -25,4 +26,8 @@ class FakeImageLoaderHolder : ImageLoaderHolder { override fun get(client: MatrixClient): ImageLoader { return fakeImageLoader.getImageLoader() } + + override fun remove(sessionId: SessionId) { + // No-op + } }