diff --git a/matrix-sdk-android/src/rustCrypto/java/org/matrix/android/sdk/internal/crypto/RustCryptoService.kt b/matrix-sdk-android/src/rustCrypto/java/org/matrix/android/sdk/internal/crypto/RustCryptoService.kt index 0d71813c7f..c66fb59a0b 100755 --- a/matrix-sdk-android/src/rustCrypto/java/org/matrix/android/sdk/internal/crypto/RustCryptoService.kt +++ b/matrix-sdk-android/src/rustCrypto/java/org/matrix/android/sdk/internal/crypto/RustCryptoService.kt @@ -196,9 +196,7 @@ internal class RustCryptoService @Inject constructor( override suspend fun fetchDevicesList(): List<DeviceInfo> { val devicesList: List<DeviceInfo> withContext(coroutineDispatchers.io) { - devicesList = tryOrNull { - getDevicesTask.execute(Unit).devices - }.orEmpty() + devicesList = getDevicesTask.execute(Unit).devices.orEmpty() cryptoStore.saveMyDevicesInfo(devicesList) } return devicesList @@ -247,7 +245,7 @@ internal class RustCryptoService @Inject constructor( cryptoCoroutineScope.launch(coroutineDispatchers.io) { cryptoStore.open() // Just update - fetchDevicesList() + tryOrNull { fetchDevicesList() } cryptoStore.tidyUpDataBase() } } diff --git a/vector/src/main/java/im/vector/app/features/home/UnknownDeviceDetectorSharedViewModel.kt b/vector/src/main/java/im/vector/app/features/home/UnknownDeviceDetectorSharedViewModel.kt index 76b7d0e61c..28016f109f 100644 --- a/vector/src/main/java/im/vector/app/features/home/UnknownDeviceDetectorSharedViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/UnknownDeviceDetectorSharedViewModel.kt @@ -40,6 +40,7 @@ import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.sample import kotlinx.coroutines.launch import org.matrix.android.sdk.api.extensions.orFalse +import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.crypto.model.DeviceInfo import org.matrix.android.sdk.api.session.getUserOrDefault @@ -101,7 +102,7 @@ class UnknownDeviceDetectorSharedViewModel @AssistedInject constructor( session.flow().liveUserCryptoDevices(session.myUserId), session.flow().liveMyDevicesInfo(), session.flow().liveCrossSigningPrivateKeys(), - ) { cryptoList, infoList, pInfo -> + ) { cryptoList, infoList, pInfo -> Timber.v("## Detector trigger ${cryptoList.map { "${it.deviceId} ${it.trustLevel}" }}") Timber.v("## Detector trigger canCrossSign ${pInfo.get().selfSigned != null}") @@ -146,13 +147,13 @@ class UnknownDeviceDetectorSharedViewModel @AssistedInject constructor( .sample(5_000) .onEach { // If we have a new crypto device change, we might want to trigger refresh of device info - session.cryptoService().fetchDevicesList() + tryOrNull { session.cryptoService().fetchDevicesList() } } .launchIn(viewModelScope) // trigger a refresh of lastSeen / last Ip viewModelScope.launch { - session.cryptoService().fetchDevicesList() + tryOrNull { session.cryptoService().fetchDevicesList() } } } diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt index d9bd315de7..312fc0fa29 100644 --- a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt @@ -76,6 +76,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import me.gujun.android.span.span import org.matrix.android.sdk.api.extensions.getFingerprintHumanReadable +import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.raw.RawService import org.matrix.android.sdk.api.session.crypto.crosssigning.isVerified import org.matrix.android.sdk.api.session.crypto.model.DeviceInfo @@ -646,9 +647,11 @@ class VectorSettingsSecurityPrivacyFragment : } } // TODO Move to a ViewModel... - val devicesList = session.cryptoService().fetchDevicesList() - withContext(Dispatchers.Main) { - refreshCryptographyPreference(devicesList) + val devicesList = tryOrNull { session.cryptoService().fetchDevicesList() } + devicesList?.let { + withContext(Dispatchers.Main) { + refreshCryptographyPreference(it) + } } } } diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/DevicesViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/devices/DevicesViewModel.kt index 25f18e8519..526a6006e1 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/DevicesViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/DevicesViewModel.kt @@ -52,6 +52,7 @@ import org.matrix.android.sdk.api.auth.data.LoginFlowTypes import org.matrix.android.sdk.api.auth.registration.RegistrationFlowResponse import org.matrix.android.sdk.api.auth.registration.nextUncompletedStage import org.matrix.android.sdk.api.extensions.orFalse +import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.failure.Failure import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.crypto.model.CryptoDeviceInfo @@ -190,7 +191,7 @@ class DevicesViewModel @AssistedInject constructor( .sample(5_000) .onEach { // If we have a new crypto device change, we might want to trigger refresh of device info - session.cryptoService().fetchDevicesList() + tryOrNull { session.cryptoService().fetchDevicesList() } } .launchIn(viewModelScope) @@ -203,7 +204,7 @@ class DevicesViewModel @AssistedInject constructor( refreshSource.stream().throttleFirst(4_000) .onEach { - session.cryptoService().fetchDevicesList() + tryOrNull { session.cryptoService().fetchDevicesList() } session.cryptoService().downloadKeysIfNeeded(listOf(session.myUserId), true) } .launchIn(viewModelScope) diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/RefreshDevicesOnCryptoDevicesChangeUseCase.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/RefreshDevicesOnCryptoDevicesChangeUseCase.kt index c837c21b85..6ca7cf9a12 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/RefreshDevicesOnCryptoDevicesChangeUseCase.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/RefreshDevicesOnCryptoDevicesChangeUseCase.kt @@ -22,6 +22,7 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.sample +import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.flow.flow import javax.inject.Inject import kotlin.time.Duration.Companion.seconds @@ -40,7 +41,7 @@ class RefreshDevicesOnCryptoDevicesChangeUseCase @Inject constructor( .sample(samplingPeriodMs) .onEach { // If we have a new crypto device change, we might want to trigger refresh of device info - session.cryptoService().fetchDevicesList() + tryOrNull { session.cryptoService().fetchDevicesList() } } .collect() } diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/RefreshDevicesUseCase.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/RefreshDevicesUseCase.kt index 06f63d172a..aff681bf84 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/RefreshDevicesUseCase.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/RefreshDevicesUseCase.kt @@ -17,6 +17,7 @@ package im.vector.app.features.settings.devices.v2 import im.vector.app.core.di.ActiveSessionHolder +import org.matrix.android.sdk.api.extensions.tryOrNull import javax.inject.Inject class RefreshDevicesUseCase @Inject constructor( @@ -24,7 +25,7 @@ class RefreshDevicesUseCase @Inject constructor( ) { suspend fun execute() { activeSessionHolder.getSafeActiveSession()?.let { session -> - session.cryptoService().fetchDevicesList() + tryOrNull { session.cryptoService().fetchDevicesList() } session.cryptoService().downloadKeysIfNeeded(listOf(session.myUserId), true) } }