Update room previews once we have decryption keys

Change-Id: I9a874d3c15abb4ab1a6e108c298db6cd4ea95f29
This commit is contained in:
SpiritCroc 2021-10-03 16:17:23 +02:00
parent 02588b447e
commit 0d6eda56f5
2 changed files with 31 additions and 0 deletions

View File

@ -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)
}
}

View File

@ -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()
}