diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/actions/MegolmSessionDataImporter.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/actions/MegolmSessionDataImporter.kt index 0d78f68e5c..8da0c18b9d 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/actions/MegolmSessionDataImporter.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/actions/MegolmSessionDataImporter.kt @@ -17,6 +17,9 @@ package org.matrix.android.sdk.internal.crypto.actions import androidx.annotation.WorkerThread +import com.zhuinden.monarchy.Monarchy +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch import org.matrix.android.sdk.api.listeners.ProgressListener import org.matrix.android.sdk.internal.crypto.MXOlmDevice import org.matrix.android.sdk.internal.crypto.MegolmSessionData @@ -25,11 +28,17 @@ import org.matrix.android.sdk.internal.crypto.RoomDecryptorProvider import org.matrix.android.sdk.internal.crypto.model.ImportRoomKeysResult import org.matrix.android.sdk.internal.crypto.model.rest.RoomKeyRequestBody import org.matrix.android.sdk.internal.crypto.store.IMXCryptoStore +import org.matrix.android.sdk.internal.di.SessionDatabase +import org.matrix.android.sdk.internal.session.room.summary.RoomSummaryUpdater +import org.matrix.android.sdk.internal.util.awaitTransaction import timber.log.Timber import javax.inject.Inject internal class MegolmSessionDataImporter @Inject constructor(private val olmDevice: MXOlmDevice, private val roomDecryptorProvider: RoomDecryptorProvider, + @SessionDatabase private val monarchy: Monarchy, + private val roomSummaryUpdater: RoomSummaryUpdater, + private val cryptoCoroutineScope: CoroutineScope, private val outgoingGossipingRequestManager: OutgoingGossipingRequestManager, private val cryptoStore: IMXCryptoStore) { @@ -102,6 +111,13 @@ internal class MegolmSessionDataImporter @Inject constructor(private val olmDevi Timber.v("## importMegolmSessionsData : sessions import " + (t1 - t0) + " ms (" + megolmSessionsData.size + " sessions)") + // Retry decrypting room previews for the room list + cryptoCoroutineScope.launch { + monarchy.awaitTransaction { realm -> + roomSummaryUpdater.updateRoomPreviews(realm) + } + } + return ImportRoomKeysResult(totalNumbersOfKeys, totalNumbersOfImportedKeys) } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryUpdater.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryUpdater.kt index 253af51960..9404659ee1 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryUpdater.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryUpdater.kt @@ -201,6 +201,21 @@ internal class RoomSummaryUpdater @Inject constructor( } } + fun updateRoomPreviews(realm: Realm) { + RoomSummaryEntity.where(realm).findAll().forEach { entity -> + val previewEvent = entity.latestPreviewableOriginalContentEvent + val root = previewEvent?.root + if (root?.type == EventType.ENCRYPTED && root.decryptionResultJson == null) { + Timber.v("Retry decrypt ${previewEvent.eventId}") + // mmm i want to decrypt now or is it ok to do it async? + tryOrNull { + eventDecryptor.decryptEvent(root.asDomain(), "") + } + ?.let { root.setDecryptionResult(it) } + } + } + } + private fun RoomSummaryEntity.updateHasFailedSending() { hasFailedSending = TimelineEventEntity.findAllInRoomWithSendStates(realm, roomId, SendState.HAS_FAILED_STATES).isNotEmpty() }