Browse Source

Fix image not rendering after clearing cache.

pull/3082/head
Benoit Marty 3 months ago
parent
commit
8cc5f35e0c
  1. 4
      appnav/src/main/kotlin/io/element/android/appnav/root/RootNavStateFlowFactory.kt
  2. 9
      libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/ImageLoaderHolder.kt
  3. 5
      libraries/push/test/src/main/kotlin/io/element/android/libraries/push/test/notifications/FakeImageLoaderHolder.kt

4
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.login.api.LoginUserStory
import io.element.android.features.preferences.api.CacheService import io.element.android.features.preferences.api.CacheService
import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService 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 io.element.android.libraries.sessionstorage.api.LoggedInState
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.combine
@ -39,6 +40,7 @@ class RootNavStateFlowFactory @Inject constructor(
private val authenticationService: MatrixAuthenticationService, private val authenticationService: MatrixAuthenticationService,
private val cacheService: CacheService, private val cacheService: CacheService,
private val matrixClientsHolder: MatrixClientsHolder, private val matrixClientsHolder: MatrixClientsHolder,
private val imageLoaderHolder: ImageLoaderHolder,
private val loginUserStory: LoginUserStory, private val loginUserStory: LoginUserStory,
) { ) {
private var currentCacheIndex = 0 private var currentCacheIndex = 0
@ -69,6 +71,8 @@ class RootNavStateFlowFactory @Inject constructor(
return cacheService.clearedCacheEventFlow return cacheService.clearedCacheEventFlow
.onEach { sessionId -> .onEach { sessionId ->
matrixClientsHolder.remove(sessionId) matrixClientsHolder.remove(sessionId)
// Ensure image loader will be recreated with the new MatrixClient
imageLoaderHolder.remove(sessionId)
} }
.toIndexFlow(initialCacheIndex) .toIndexFlow(initialCacheIndex)
.onEach { cacheIndex -> .onEach { cacheIndex ->

9
libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/ImageLoaderHolder.kt

@ -32,6 +32,7 @@ import javax.inject.Provider
interface ImageLoaderHolder { interface ImageLoaderHolder {
fun get(client: MatrixClient): ImageLoader fun get(client: MatrixClient): ImageLoader
fun remove(sessionId: SessionId)
} }
@ContributesBinding(AppScope::class) @ContributesBinding(AppScope::class)
@ -52,7 +53,7 @@ class DefaultImageLoaderHolder @Inject constructor(
override suspend fun onSessionCreated(userId: String) = Unit override suspend fun onSessionCreated(userId: String) = Unit
override suspend fun onSessionDeleted(userId: String) { 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)
}
}
} }

5
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 coil.ImageLoader
import io.element.android.libraries.matrix.api.MatrixClient 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 import io.element.android.libraries.matrix.ui.media.ImageLoaderHolder
class FakeImageLoaderHolder : ImageLoaderHolder { class FakeImageLoaderHolder : ImageLoaderHolder {
@ -25,4 +26,8 @@ class FakeImageLoaderHolder : ImageLoaderHolder {
override fun get(client: MatrixClient): ImageLoader { override fun get(client: MatrixClient): ImageLoader {
return fakeImageLoader.getImageLoader() return fakeImageLoader.getImageLoader()
} }
override fun remove(sessionId: SessionId) {
// No-op
}
} }

Loading…
Cancel
Save