From aa9d66b99114f5d24e1fcfbc7d585a0111fd8f0a Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 5 Dec 2019 17:14:38 +0100 Subject: [PATCH 1/2] Allow returning a value from an async transaction --- .../matrix/android/internal/database/AsyncTransaction.kt | 6 ++++-- .../internal/session/filter/DefaultFilterRepository.kt | 4 ++-- .../java/im/vector/matrix/android/internal/util/Monarchy.kt | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/AsyncTransaction.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/AsyncTransaction.kt index 0f8445d20f..4075f95ae8 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/AsyncTransaction.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/AsyncTransaction.kt @@ -22,12 +22,13 @@ import kotlinx.coroutines.isActive import kotlinx.coroutines.withContext import timber.log.Timber -suspend fun awaitTransaction(config: RealmConfiguration, transaction: suspend (realm: Realm) -> Unit) = withContext(Dispatchers.Default) { +suspend fun awaitTransaction(config: RealmConfiguration, transaction: suspend (realm: Realm) -> T) = withContext(Dispatchers.Default) { Realm.getInstance(config).use { bgRealm -> bgRealm.beginTransaction() + val result: T try { val start = System.currentTimeMillis() - transaction(bgRealm) + result = transaction(bgRealm) if (isActive) { bgRealm.commitTransaction() val end = System.currentTimeMillis() @@ -39,5 +40,6 @@ suspend fun awaitTransaction(config: RealmConfiguration, transaction: suspend (r bgRealm.cancelTransaction() } } + result } } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/filter/DefaultFilterRepository.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/filter/DefaultFilterRepository.kt index ae8e8ce891..f7df8c512e 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/filter/DefaultFilterRepository.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/filter/DefaultFilterRepository.kt @@ -69,7 +69,7 @@ internal class DefaultFilterRepository @Inject constructor(private val monarchy: } override suspend fun getFilter(): String { - return Realm.getInstance(monarchy.realmConfiguration).use { + return monarchy.awaitTransaction { val filter = FilterEntity.getOrCreate(it) if (filter.filterId.isBlank()) { // Use the Json format @@ -82,7 +82,7 @@ internal class DefaultFilterRepository @Inject constructor(private val monarchy: } override suspend fun getRoomFilter(): String { - return Realm.getInstance(monarchy.realmConfiguration).use { + return monarchy.awaitTransaction { FilterEntity.getOrCreate(it).roomEventFilterJson } } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/util/Monarchy.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/util/Monarchy.kt index fc9999225f..848cc43565 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/util/Monarchy.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/util/Monarchy.kt @@ -22,8 +22,8 @@ import io.realm.Realm import io.realm.RealmModel import java.util.concurrent.atomic.AtomicReference -internal suspend fun Monarchy.awaitTransaction(transaction: suspend (realm: Realm) -> Unit) { - awaitTransaction(realmConfiguration, transaction) +internal suspend fun Monarchy.awaitTransaction(transaction: suspend (realm: Realm) -> T): T { + return awaitTransaction(realmConfiguration, transaction) } fun Monarchy.fetchCopied(query: (Realm) -> T?): T? { From eb9775e307da3c1687a7f5d1a0e679e13bdbfed2 Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 5 Dec 2019 17:14:56 +0100 Subject: [PATCH 2/2] Fix some crypto realm issues --- .../android/internal/crypto/store/db/RealmCryptoStore.kt | 3 ++- .../crypto/store/db/model/OutgoingRoomKeyRequestEntity.kt | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/db/RealmCryptoStore.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/db/RealmCryptoStore.kt index 8a3b66dfe5..c194a400ce 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/db/RealmCryptoStore.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/db/RealmCryptoStore.kt @@ -643,9 +643,10 @@ internal class RealmCryptoStore(private val realmConfiguration: RealmConfigurati } override fun getOutgoingRoomKeyRequestByState(states: Set): OutgoingRoomKeyRequest? { + val statesIndex = states.map { it.ordinal }.toTypedArray() return doRealmQueryAndCopy(realmConfiguration) { it.where() - .`in`(OutgoingRoomKeyRequestEntityFields.STATE, states.map { it.ordinal }.toTypedArray()) + .`in`(OutgoingRoomKeyRequestEntityFields.STATE, statesIndex) .findFirst() } ?.toOutgoingRoomKeyRequest() diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/db/model/OutgoingRoomKeyRequestEntity.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/db/model/OutgoingRoomKeyRequestEntity.kt index b7bcb603f5..3130bd2f89 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/db/model/OutgoingRoomKeyRequestEntity.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/store/db/model/OutgoingRoomKeyRequestEntity.kt @@ -41,6 +41,7 @@ internal open class OutgoingRoomKeyRequestEntity( * Convert to OutgoingRoomKeyRequest */ fun toOutgoingRoomKeyRequest(): OutgoingRoomKeyRequest { + val cancellationTxnId = this.cancellationTxnId return OutgoingRoomKeyRequest( RoomKeyRequestBody().apply { algorithm = requestBodyAlgorithm