diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/filter/DefaultFilterRepository.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/filter/DefaultFilterRepository.kt index 1d1bb0e715..28646fe3d2 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/filter/DefaultFilterRepository.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/filter/DefaultFilterRepository.kt @@ -16,75 +16,69 @@ package org.matrix.android.sdk.internal.session.filter -import com.zhuinden.monarchy.Monarchy -import io.realm.Realm -import io.realm.kotlin.where +import org.matrix.android.sdk.internal.database.RealmInstance import org.matrix.android.sdk.internal.database.model.FilterEntity -import org.matrix.android.sdk.internal.database.model.FilterEntityFields import org.matrix.android.sdk.internal.database.query.get import org.matrix.android.sdk.internal.database.query.getOrCreate import org.matrix.android.sdk.internal.di.SessionDatabase -import org.matrix.android.sdk.internal.util.awaitTransaction import javax.inject.Inject -internal class DefaultFilterRepository @Inject constructor(@SessionDatabase private val monarchy: Monarchy) : FilterRepository { +internal class DefaultFilterRepository @Inject constructor(@SessionDatabase private val realmInstance: RealmInstance) : FilterRepository { override suspend fun storeFilter(filter: Filter, roomEventFilter: RoomEventFilter): Boolean { - return Realm.getInstance(monarchy.realmConfiguration).use { realm -> - val filterEntity = FilterEntity.get(realm) - // Filter has changed, or no filter Id yet - filterEntity == null || - filterEntity.filterBodyJson != filter.toJSONString() || - filterEntity.filterId.isBlank() - }.also { hasChanged -> - if (hasChanged) { - // Filter is new or has changed, store it and reset the filter Id. - // This has to be done outside of the Realm.use(), because awaitTransaction change the current thread - monarchy.awaitTransaction { realm -> - // We manage only one filter for now - val filterJson = filter.toJSONString() - val roomEventFilterJson = roomEventFilter.toJSONString() - - val filterEntity = FilterEntity.getOrCreate(realm) - - filterEntity.filterBodyJson = filterJson - filterEntity.roomEventFilterJson = roomEventFilterJson + val realm = realmInstance.getRealm() + val filterEntity = FilterEntity.get(realm) + // Filter has changed, or no filter Id yet + val hasChanged = filterEntity == null || + filterEntity.filterBodyJson != filter.toJSONString() || + filterEntity.filterId.isBlank() + if (hasChanged) { + // Filter is new or has changed, store it and reset the filter Id. + realmInstance.write { + // We manage only one filter for now + val filterJson = filter.toJSONString() + val roomEventFilterJson = roomEventFilter.toJSONString() + FilterEntity.getOrCreate(this).apply { + this.filterBodyJson = filterJson + this.roomEventFilterJson = roomEventFilterJson // Reset filterId - filterEntity.filterId = "" + this.filterId = "" } } } + return hasChanged } - override suspend fun storeFilterId(filter: Filter, filterId: String) { - monarchy.awaitTransaction { - // We manage only one filter for now - val filterJson = filter.toJSONString() + override suspend fun storeFilterId(filter: Filter, filterId: String) { + realmInstance.write { + // We manage only one filter for now + val filterJson = filter.toJSONString() - // Update the filter id, only if the filter body matches - it.where() - .equalTo(FilterEntityFields.FILTER_BODY_JSON, filterJson) - ?.findFirst() - ?.filterId = filterId + // Update the filter id, only if the filter body matches + query(FilterEntity::class) + .query("filterBodyJson == $0", filterJson) + .first() + .find() + ?.filterId = filterId + } } - } - override suspend fun getFilter(): String { - return monarchy.awaitTransaction { - val filter = FilterEntity.getOrCreate(it) - if (filter.filterId.isBlank()) { - // Use the Json format - filter.filterBodyJson - } else { - // Use FilterId - filter.filterId + override suspend fun getFilter(): String { + return realmInstance.write { + val filter = FilterEntity.getOrCreate(this) + if (filter.filterId.isBlank()) { + // Use the Json format + filter.filterBodyJson + } else { + // Use FilterId + filter.filterId + } + } + } + + override suspend fun getRoomFilter(): String { + return realmInstance.write { + FilterEntity.getOrCreate(this).roomEventFilterJson } } } - - override suspend fun getRoomFilter(): String { - return monarchy.awaitTransaction { - FilterEntity.getOrCreate(it).roomEventFilterJson - } - } -}