Close the client before deleting data, and ensure the app is restarted, using a cache Index.

This commit is contained in:
Benoit Marty 2023-06-21 09:34:30 +02:00 committed by Benoit Marty
parent 200fe59fbb
commit 979ebe4adb
6 changed files with 43 additions and 10 deletions

View file

@ -51,6 +51,10 @@ interface MatrixClient : Closeable {
fun pushersService(): PushersService
fun notificationService(): NotificationService
suspend fun getCacheSize(): Long
/**
* Will close the client and delete the cache data.
*/
suspend fun clearCache()
suspend fun logout()
suspend fun loadUserDisplayName(): Result<String>

View file

@ -29,6 +29,13 @@ interface MatrixAuthenticationService {
suspend fun setHomeserver(homeserver: String): Result<Unit>
suspend fun login(username: String, password: String): Result<SessionId>
/*
* Cache index
*/
fun cacheIdx(): Flow<Int>
fun incrementCacheIdx()
/*
* OIDC part.
*/

View file

@ -339,11 +339,13 @@ class RustMatrixClient constructor(
}
override suspend fun getCacheSize(): Long {
return baseDirectory.getCacheSize(userID = client.userId())
// Do not use client.userId since it can throw if client has been closed (during clear cache)
return baseDirectory.getCacheSize(userID = sessionId.value)
}
override suspend fun clearCache() {
baseDirectory.deleteSessionDirectory(userID = client.userId())
close()
baseDirectory.deleteSessionDirectory(userID = sessionId.value, deleteCryptoDb = false)
}
override suspend fun logout() = withContext(dispatchers.io) {

View file

@ -58,6 +58,8 @@ class RustMatrixAuthenticationService @Inject constructor(
private val clock: SystemClock,
) : MatrixAuthenticationService {
private val cacheIdxState = MutableStateFlow(0)
private val authService: RustAuthenticationService = RustAuthenticationService(
basePath = baseDirectory.absolutePath,
passphrase = null,
@ -71,6 +73,14 @@ class RustMatrixAuthenticationService @Inject constructor(
return sessionStore.isLoggedIn()
}
override fun incrementCacheIdx() {
cacheIdxState.value++
}
override fun cacheIdx(): Flow<Int> {
return cacheIdxState
}
override suspend fun getLatestSessionId(): SessionId? = withContext(coroutineDispatchers.io) {
sessionStore.getLatestSession()?.userId?.let { SessionId(it) }
}