diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt index 3d23c64d32..9f92db5a6c 100755 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt @@ -379,7 +379,6 @@ internal class DefaultCryptoService @Inject constructor( private val setDeviceNameTask: SetDeviceNameTask, private val loadRoomMembersTask: LoadRoomMembersTask, private val cryptoSessionInfoProvider: CryptoSessionInfoProvider, - private val createKeysBackupVersionTask: CreateKeysBackupVersionTask, private val coroutineDispatchers: MatrixCoroutineDispatchers, private val taskExecutor: TaskExecutor, private val cryptoCoroutineScope: CoroutineScope, @@ -662,6 +661,8 @@ internal class DefaultCryptoService @Inject constructor( // keys claim request to be sent out. // This could be omitted but then devices might be waiting for the next sendOutgoingRequests() + + keysBackupService?.maybeBackupKeys() } cryptoCoroutineScope.launch(coroutineDispatchers.crypto) { @@ -996,12 +997,14 @@ internal class DefaultCryptoService @Inject constructor( } val keyShareLock = roomKeyShareLocks.getOrPut(roomId, { Mutex() }) + var sharedKey = false keyShareLock.withLock { coroutineScope { this@DefaultCryptoService.olmMachine!!.shareRoomKey(roomId, roomMembers).map { when (it) { is Request.ToDevice -> { + sharedKey = true async { sendToDevice(it) } @@ -1016,6 +1019,12 @@ internal class DefaultCryptoService @Inject constructor( }.joinAll() } } + + // If we sent out a room key over to-device messages it's likely that we created a new one + // Try to back the key up + if (sharedKey) { + keysBackupService?.maybeBackupKeys() + } } private suspend fun encrypt(roomId: String, eventType: String, content: Content): Content { @@ -1120,7 +1129,10 @@ internal class DefaultCryptoService @Inject constructor( override suspend fun importRoomKeys(roomKeysAsArray: ByteArray, password: String, progressListener: ProgressListener?): ImportRoomKeysResult { - return olmMachine!!.importKeys(roomKeysAsArray, password, progressListener) + val result = olmMachine!!.importKeys(roomKeysAsArray, password, progressListener) + keysBackupService?.maybeBackupKeys() + + return result } /** diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/keysbackup/RustKeyBackupService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/keysbackup/RustKeyBackupService.kt index 3fae94c731..cd523cf758 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/keysbackup/RustKeyBackupService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/keysbackup/RustKeyBackupService.kt @@ -779,7 +779,7 @@ internal class RustKeyBackupService @Inject constructor( /** * Do a backup if there are new keys, with a delay */ - private fun maybeBackupKeys() { + fun maybeBackupKeys() { when { isStucked -> { // If not already done, or in error case, check for a valid backup version on the homeserver.