Secure Storage: improve API for waitForBackupUploadSteadyState()

This commit is contained in:
Benoit Marty 2023-10-30 15:22:44 +01:00 committed by Benoit Marty
parent 0db487fa42
commit 90b377b3a5
5 changed files with 37 additions and 18 deletions

View file

@ -16,12 +16,12 @@
package io.element.android.libraries.matrix.api.encryption
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.StateFlow
interface EncryptionService {
val backupStateStateFlow: StateFlow<BackupState>
val recoveryStateStateFlow: StateFlow<RecoveryState>
val backupUploadStateStateFlow: StateFlow<BackupUploadState>
val enableRecoveryProgressStateFlow: StateFlow<EnableRecoveryProgress>
suspend fun enableBackups(): Result<Unit>
@ -46,7 +46,7 @@ interface EncryptionService {
suspend fun fixRecoveryIssues(recoveryKey: String): Result<Unit>
/**
* Observe [backupUploadStateStateFlow] to get progress.
* Wait for backup upload steady state.
*/
suspend fun waitForBackupUploadSteadyState(): Result<Unit>
fun waitForBackupUploadSteadyState(): Flow<BackupUploadState>
}

View file

@ -22,7 +22,10 @@ import io.element.android.libraries.matrix.api.encryption.BackupUploadState
import io.element.android.libraries.matrix.api.encryption.EnableRecoveryProgress
import io.element.android.libraries.matrix.api.encryption.EncryptionService
import io.element.android.libraries.matrix.api.encryption.RecoveryState
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.callbackFlow
import kotlinx.coroutines.withContext
import org.matrix.rustcomponents.sdk.BackupStateListener
import org.matrix.rustcomponents.sdk.BackupSteadyStateListener
@ -50,7 +53,6 @@ internal class RustEncryptionService(
override val backupStateStateFlow: MutableStateFlow<BackupState> = MutableStateFlow(service.backupState().let(backupStateMapper::map))
override val recoveryStateStateFlow: MutableStateFlow<RecoveryState> = MutableStateFlow(service.recoveryState().let(recoveryStateMapper::map))
override val enableRecoveryProgressStateFlow: MutableStateFlow<EnableRecoveryProgress> = MutableStateFlow(EnableRecoveryProgress.Unknown)
override val backupUploadStateStateFlow: MutableStateFlow<BackupUploadState> = MutableStateFlow(BackupUploadState.Unknown)
fun start() {
service.backupStateListener(object : BackupStateListener {
@ -94,16 +96,19 @@ internal class RustEncryptionService(
}
}
override suspend fun waitForBackupUploadSteadyState(
): Result<Unit> = withContext(dispatchers.io) {
runCatching {
override fun waitForBackupUploadSteadyState(): Flow<BackupUploadState> {
return callbackFlow {
service.waitForBackupUploadSteadyState(
progressListener = object : BackupSteadyStateListener {
override fun onUpdate(status: RustBackupUploadState) {
backupUploadStateStateFlow.value = backupUploadStateMapper.map(status)
trySend(backupUploadStateMapper.map(status))
if (status == RustBackupUploadState.Done) {
close()
}
}
}
)
awaitClose {}
}
}

View file

@ -22,14 +22,16 @@ import io.element.android.libraries.matrix.api.encryption.EnableRecoveryProgress
import io.element.android.libraries.matrix.api.encryption.EncryptionService
import io.element.android.libraries.matrix.api.encryption.RecoveryState
import io.element.android.tests.testutils.simulateLongTask
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.flowOf
class FakeEncryptionService : EncryptionService {
private var disableRecoveryFailure: Exception? = null
override val backupStateStateFlow: MutableStateFlow<BackupState> = MutableStateFlow(BackupState.UNKNOWN)
override val recoveryStateStateFlow: MutableStateFlow<RecoveryState> = MutableStateFlow(RecoveryState.UNKNOWN)
override val enableRecoveryProgressStateFlow: MutableStateFlow<EnableRecoveryProgress> = MutableStateFlow(EnableRecoveryProgress.Unknown)
override val backupUploadStateStateFlow: MutableStateFlow<BackupUploadState> = MutableStateFlow(BackupUploadState.Unknown)
private var waitForBackupUploadSteadyStateFlow: Flow<BackupUploadState> = flowOf()
private var fixRecoveryIssuesFailure: Exception? = null
@ -73,12 +75,12 @@ class FakeEncryptionService : EncryptionService {
return Result.success(Unit)
}
override suspend fun waitForBackupUploadSteadyState(): Result<Unit> {
return Result.success(Unit)
fun givenWaitForBackupUploadSteadyStateFlow(flow: Flow<BackupUploadState>) {
waitForBackupUploadSteadyStateFlow = flow
}
suspend fun emitBackupUploadState(state: BackupUploadState) {
backupUploadStateStateFlow.emit(state)
override fun waitForBackupUploadSteadyState(): Flow<BackupUploadState> {
return waitForBackupUploadSteadyStateFlow
}
suspend fun emitBackupState(state: BackupState) {