Fix image not rendering after clearing cache.

This commit is contained in:
Benoit Marty
2024-06-24 13:58:15 +02:00
parent 0cf5a41c61
commit 775cb89993
3 changed files with 17 additions and 1 deletions

View File

@@ -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 ->

View File

@@ -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)
}
}
}

View File

@@ -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
}
}