From a4a4bac75be713316c1d2f9d7126ca76340bc012 Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 16 Sep 2022 19:24:23 +0200 Subject: [PATCH] Realm kotlin: continue migrating queries (some are blocked by lack of backlink) --- .../android/sdk/internal/database/RealmExt.kt | 19 ++++- .../database/query/BreadcrumbsEntityQuery.kt | 15 ++-- .../database/query/ChunkEntityQueries.kt | 11 +-- .../query/CurrentStateEventEntityQueries.kt | 32 ++++----- .../EventAnnotationsSummaryEntityQuery.kt | 24 ++++--- .../database/query/EventEntityQueries.kt | 72 ++++++++++--------- .../database/query/FilterEntityQueries.kt | 27 +++---- .../query/HomeServerCapabilitiesQueries.kt | 18 +++-- .../query/PreviewUrlCacheEntityQueries.kt | 26 ++++--- .../internal/database/query/PushersQueries.kt | 32 ++++----- .../database/query/ReadMarkerEntityQueries.kt | 26 ++++--- .../query/ReadReceiptEntityQueries.kt | 33 ++++----- .../query/ReadReceiptsSummaryEntityQueries.kt | 20 +++--- .../database/query/RoomEntityQueries.kt | 36 ++++++---- .../database/query/RoomMemberEntityQueries.kt | 33 ++++----- .../database/query/ScalarTokenQuery.kt | 12 ++-- .../query/TimelineEventEntityQueries.kt | 37 +++++----- .../database/query/UserEntityQueries.kt | 12 ++-- .../query/UserPresenceEntityQueries.kt | 12 ++-- .../room/summary/RoomSummaryUpdater.kt | 3 +- .../session/sync/SyncResponseHandler.kt | 17 ++--- .../internal/session/sync/SyncTokenStore.kt | 24 +++---- .../sync/handler/PresenceSyncHandler.kt | 29 ++++---- ...cResponsePostTreatmentAggregatorHandler.kt | 14 ++-- .../handler/UserAccountDataSyncHandler.kt | 69 ++++++++++++------ .../sync/handler/room/ReadReceiptHandler.kt | 33 +++++---- .../sync/handler/room/RoomSyncHandler.kt | 25 ++++--- .../RoomMemberProfileViewModel.kt | 4 ++ 28 files changed, 394 insertions(+), 321 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmExt.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmExt.kt index 57bc1b87b0..3f9a210e21 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmExt.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmExt.kt @@ -55,6 +55,23 @@ internal fun RealmQuery.queryIn( values: List ): RealmQuery { if (values.isEmpty()) return this + val filter = buildQueryInFilter(field, values) + return query(filter) +} + +internal fun RealmQuery.queryNotIn( + field: String, + values: List +): RealmQuery { + if (values.isEmpty()) return this + val filter = buildQueryInFilter(field, values) + return query("NOT $filter") +} + +private fun buildQueryInFilter( + field: String, + values: List +): String { val filter = buildString { val iterator = values.iterator() while (iterator.hasNext()) { @@ -64,7 +81,7 @@ internal fun RealmQuery.queryIn( } } } - return query(filter) + return filter } internal fun RealmQuery.andIf( diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/BreadcrumbsEntityQuery.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/BreadcrumbsEntityQuery.kt index 3b24ff5f9d..57a218de2d 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/BreadcrumbsEntityQuery.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/BreadcrumbsEntityQuery.kt @@ -16,15 +16,16 @@ package org.matrix.android.sdk.internal.database.query -import io.realm.Realm -import io.realm.kotlin.createObject -import io.realm.kotlin.where +import io.realm.kotlin.MutableRealm +import io.realm.kotlin.TypedRealm import org.matrix.android.sdk.internal.database.model.BreadcrumbsEntity -internal fun BreadcrumbsEntity.Companion.get(realm: Realm): BreadcrumbsEntity? { - return realm.where().findFirst() +internal fun BreadcrumbsEntity.Companion.get(realm: TypedRealm): BreadcrumbsEntity? { + return realm.query(BreadcrumbsEntity::class).first().find() } -internal fun BreadcrumbsEntity.Companion.getOrCreate(realm: Realm): BreadcrumbsEntity { - return get(realm) ?: realm.createObject() +internal fun BreadcrumbsEntity.Companion.getOrCreate(realm: MutableRealm): BreadcrumbsEntity { + return get(realm) ?: BreadcrumbsEntity().also { + realm.copyToRealm(it) + } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ChunkEntityQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ChunkEntityQueries.kt index 1e5d96b496..4374c8d131 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ChunkEntityQueries.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ChunkEntityQueries.kt @@ -16,17 +16,12 @@ package org.matrix.android.sdk.internal.database.query -import io.realm.Realm -import io.realm.RealmQuery -import io.realm.RealmResults -import io.realm.kotlin.createObject -import io.realm.kotlin.where import org.matrix.android.sdk.internal.database.model.ChunkEntity import org.matrix.android.sdk.internal.database.model.ChunkEntityFields -internal fun ChunkEntity.Companion.where(realm: Realm, roomId: String): RealmQuery { - return realm.where() - .equalTo(ChunkEntityFields.ROOM.ROOM_ID, roomId) +internal fun ChunkEntity.Companion.where(realm: TypedRealm, roomId: String): RealmQuery { + return realm.query(ChunkEntity::class) + .query(ChunkEntityFields.ROOM.ROOM_ID, roomId) } internal fun ChunkEntity.Companion.find(realm: Realm, roomId: String, prevToken: String? = null, nextToken: String? = null): ChunkEntity? { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/CurrentStateEventEntityQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/CurrentStateEventEntityQueries.kt index e17d07c584..404a63ae2a 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/CurrentStateEventEntityQueries.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/CurrentStateEventEntityQueries.kt @@ -17,50 +17,49 @@ package org.matrix.android.sdk.internal.database.query -import io.realm.Realm -import io.realm.RealmQuery -import io.realm.kotlin.createObject +import io.realm.kotlin.MutableRealm +import io.realm.kotlin.TypedRealm +import io.realm.kotlin.query.RealmQuery import org.matrix.android.sdk.internal.database.model.CurrentStateEventEntity -import org.matrix.android.sdk.internal.database.model.CurrentStateEventEntityFields internal fun CurrentStateEventEntity.Companion.whereRoomId( - realm: Realm, + realm: TypedRealm, roomId: String ): RealmQuery { - return realm.where(CurrentStateEventEntity::class.java) - .equalTo(CurrentStateEventEntityFields.ROOM_ID, roomId) + return realm.query(CurrentStateEventEntity::class) + .query("roomId == $0", roomId) } internal fun CurrentStateEventEntity.Companion.whereType( - realm: Realm, + realm: TypedRealm, roomId: String, type: String ): RealmQuery { return whereRoomId(realm = realm, roomId = roomId) - .equalTo(CurrentStateEventEntityFields.TYPE, type) + .query("type == $0", type) } internal fun CurrentStateEventEntity.Companion.whereStateKey( - realm: Realm, + realm: TypedRealm, roomId: String, type: String, stateKey: String ): RealmQuery { return whereType(realm = realm, roomId = roomId, type = type) - .equalTo(CurrentStateEventEntityFields.STATE_KEY, stateKey) + .query("stateKey == $0", stateKey) } internal fun CurrentStateEventEntity.Companion.getOrNull( - realm: Realm, + realm: TypedRealm, roomId: String, stateKey: String, type: String ): CurrentStateEventEntity? { - return whereStateKey(realm = realm, roomId = roomId, type = type, stateKey = stateKey).findFirst() + return whereStateKey(realm = realm, roomId = roomId, type = type, stateKey = stateKey).first().find() } internal fun CurrentStateEventEntity.Companion.getOrCreate( - realm: Realm, + realm: MutableRealm, roomId: String, stateKey: String, type: String @@ -69,14 +68,15 @@ internal fun CurrentStateEventEntity.Companion.getOrCreate( } private fun create( - realm: Realm, + realm: MutableRealm, roomId: String, stateKey: String, type: String ): CurrentStateEventEntity { - return realm.createObject().apply { + val currentStateEventEntity = CurrentStateEventEntity().apply { this.type = type this.roomId = roomId this.stateKey = stateKey } + return realm.copyToRealm(currentStateEventEntity) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/EventAnnotationsSummaryEntityQuery.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/EventAnnotationsSummaryEntityQuery.kt index 1c19c21de2..ec5565e3e2 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/EventAnnotationsSummaryEntityQuery.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/EventAnnotationsSummaryEntityQuery.kt @@ -16,28 +16,30 @@ package org.matrix.android.sdk.internal.database.query -import io.realm.Realm -import io.realm.RealmQuery -import io.realm.kotlin.where +import io.realm.kotlin.MutableRealm +import io.realm.kotlin.TypedRealm +import io.realm.kotlin.query.RealmQuery import org.matrix.android.sdk.internal.database.model.EventAnnotationsSummaryEntity import org.matrix.android.sdk.internal.database.model.EventAnnotationsSummaryEntityFields import org.matrix.android.sdk.internal.database.model.TimelineEventEntity -internal fun EventAnnotationsSummaryEntity.Companion.where(realm: Realm, eventId: String): RealmQuery { +internal fun EventAnnotationsSummaryEntity.Companion.where(realm: TypedRealm, eventId: String): RealmQuery { return realm.where() .equalTo(EventAnnotationsSummaryEntityFields.EVENT_ID, eventId) } -internal fun EventAnnotationsSummaryEntity.Companion.where(realm: Realm, roomId: String, eventId: String): RealmQuery { +internal fun EventAnnotationsSummaryEntity.Companion.where(realm: TypedRealm, roomId: String, eventId: String): RealmQuery { return realm.where() .equalTo(EventAnnotationsSummaryEntityFields.ROOM_ID, roomId) .equalTo(EventAnnotationsSummaryEntityFields.EVENT_ID, eventId) } -internal fun EventAnnotationsSummaryEntity.Companion.create(realm: Realm, roomId: String, eventId: String): EventAnnotationsSummaryEntity { - val obj = realm.createObject(EventAnnotationsSummaryEntity::class.java, eventId).apply { +internal fun EventAnnotationsSummaryEntity.Companion.create(realm: MutableRealm, roomId: String, eventId: String): EventAnnotationsSummaryEntity { + val obj = EventAnnotationsSummaryEntity().apply { + this.eventId = eventId this.roomId = roomId } + val managedObj = realm.copyToRealm(obj) // Denormalization TimelineEventEntity.where(realm, roomId = roomId, eventId = eventId).findAll()?.forEach { it.annotations = obj @@ -45,11 +47,11 @@ internal fun EventAnnotationsSummaryEntity.Companion.create(realm: Realm, roomId return obj } -internal fun EventAnnotationsSummaryEntity.Companion.getOrCreate(realm: Realm, roomId: String, eventId: String): EventAnnotationsSummaryEntity { - return EventAnnotationsSummaryEntity.where(realm, roomId, eventId).findFirst() +internal fun EventAnnotationsSummaryEntity.Companion.getOrCreate(realm: MutableRealm, roomId: String, eventId: String): EventAnnotationsSummaryEntity { + return EventAnnotationsSummaryEntity.where(realm, roomId, eventId).first().find() ?: EventAnnotationsSummaryEntity.create(realm, roomId, eventId) } -internal fun EventAnnotationsSummaryEntity.Companion.get(realm: Realm, eventId: String): EventAnnotationsSummaryEntity? { - return EventAnnotationsSummaryEntity.where(realm, eventId).findFirst() +internal fun EventAnnotationsSummaryEntity.Companion.get(realm: TypedRealm, eventId: String): EventAnnotationsSummaryEntity? { + return EventAnnotationsSummaryEntity.where(realm, eventId).first().find() } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/EventEntityQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/EventEntityQueries.kt index 0f1c226044..e4fdf20cf2 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/EventEntityQueries.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/EventEntityQueries.kt @@ -16,27 +16,34 @@ package org.matrix.android.sdk.internal.database.query -import io.realm.Realm -import io.realm.RealmList -import io.realm.RealmQuery -import io.realm.kotlin.where +import io.realm.kotlin.MutableRealm +import io.realm.kotlin.TypedRealm +import io.realm.kotlin.query.RealmQuery import org.matrix.android.sdk.api.session.events.model.EventType +import org.matrix.android.sdk.internal.database.andIf import org.matrix.android.sdk.internal.database.model.EventEntity import org.matrix.android.sdk.internal.database.model.EventEntityFields import org.matrix.android.sdk.internal.database.model.EventInsertEntity import org.matrix.android.sdk.internal.database.model.EventInsertType +import org.matrix.android.sdk.internal.database.queryIn -internal fun EventEntity.copyToRealmOrIgnore(realm: Realm, insertType: EventInsertType): EventEntity { - val eventEntity = realm.where() - .equalTo(EventEntityFields.EVENT_ID, eventId) - .equalTo(EventEntityFields.ROOM_ID, roomId) - .findFirst() +internal fun EventEntity.copyToRealmOrIgnore(realm: MutableRealm, insertType: EventInsertType): EventEntity { + val eventId = this.eventId + val type = this.type + val eventEntity = realm.query(EventEntity::class) + .query("eventId == $0", eventId) + .query("roomId == $0", roomId) + .first() + .find() return if (eventEntity == null) { val canBeProcessed = type != EventType.ENCRYPTED || decryptionResultJson != null - val insertEntity = EventInsertEntity(eventId = eventId, eventType = type, canBeProcessed = canBeProcessed).apply { + val insertEntity = EventInsertEntity().apply { + this.eventId = eventId + this.eventType = type + this.canBeProcessed = canBeProcessed this.insertType = insertType } - realm.insert(insertEntity) + realm.copyToRealm(insertEntity) // copy this event entity and return it realm.copyToRealm(this) } else { @@ -44,44 +51,43 @@ internal fun EventEntity.copyToRealmOrIgnore(realm: Realm, insertType: EventInse } } -internal fun EventEntity.Companion.where(realm: Realm, eventId: String): RealmQuery { - return realm.where() - .equalTo(EventEntityFields.EVENT_ID, eventId) +internal fun EventEntity.Companion.where(realm: TypedRealm, eventId: String): RealmQuery { + return realm.query(EventEntity::class) + .query("eventId == $0", eventId) } -internal fun EventEntity.Companion.whereRoomId(realm: Realm, roomId: String): RealmQuery { - return realm.where() - .equalTo(EventEntityFields.ROOM_ID, roomId) +internal fun EventEntity.Companion.whereRoomId(realm: TypedRealm, roomId: String): RealmQuery { + return realm.query(EventEntity::class) + .query("roomId == $0", roomId) } -internal fun EventEntity.Companion.where(realm: Realm, eventIds: List): RealmQuery { - return realm.where() - .`in`(EventEntityFields.EVENT_ID, eventIds.toTypedArray()) +internal fun EventEntity.Companion.where(realm: TypedRealm, eventIds: List): RealmQuery { + return realm.query(EventEntity::class) + .queryIn("eventId", eventIds) } internal fun EventEntity.Companion.whereType( - realm: Realm, + realm: TypedRealm, type: String, roomId: String? = null ): RealmQuery { - val query = realm.where() - if (roomId != null) { - query.equalTo(EventEntityFields.ROOM_ID, roomId) - } - return query.equalTo(EventEntityFields.TYPE, type) + return realm.query(EventEntity::class) + .query("type == $0", type) + .andIf(roomId != null){ + query("roomId == $0", roomId!!) + } } internal fun EventEntity.Companion.whereTypes( - realm: Realm, + realm: TypedRealm, typeList: List = emptyList(), roomId: String? = null ): RealmQuery { - val query = realm.where() - query.`in`(EventEntityFields.TYPE, typeList.toTypedArray()) - if (roomId != null) { - query.equalTo(EventEntityFields.ROOM_ID, roomId) - } - return query + return realm.query(EventEntity::class) + .queryIn("type", typeList) + .andIf(roomId != null){ + query("roomId == $0", roomId!!) + } } internal fun RealmList.find(eventId: String): EventEntity? { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/FilterEntityQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/FilterEntityQueries.kt index 903282bac4..6238148b45 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/FilterEntityQueries.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/FilterEntityQueries.kt @@ -16,27 +16,30 @@ package org.matrix.android.sdk.internal.database.query -import io.realm.Realm -import io.realm.kotlin.createObject -import io.realm.kotlin.where +import io.realm.kotlin.MutableRealm +import io.realm.kotlin.TypedRealm import org.matrix.android.sdk.internal.database.model.FilterEntity import org.matrix.android.sdk.internal.session.filter.FilterFactory /** * Get the current filter. */ -internal fun FilterEntity.Companion.get(realm: Realm): FilterEntity? { - return realm.where().findFirst() +internal fun FilterEntity.Companion.get(realm: TypedRealm): FilterEntity? { + return realm.query(FilterEntity::class).first().find() } /** * Get the current filter, create one if it does not exist. */ -internal fun FilterEntity.Companion.getOrCreate(realm: Realm): FilterEntity { - return get(realm) ?: realm.createObject() - .apply { - filterBodyJson = FilterFactory.createDefaultFilter().toJSONString() - roomEventFilterJson = FilterFactory.createDefaultRoomFilter().toJSONString() - filterId = "" - } +internal fun FilterEntity.Companion.getOrCreate(realm: MutableRealm): FilterEntity { + return get(realm) ?: create(realm) +} + +internal fun FilterEntity.Companion.create(realm: MutableRealm): FilterEntity { + val filterEntity = FilterEntity().apply { + filterBodyJson = FilterFactory.createDefaultFilter().toJSONString() + roomEventFilterJson = FilterFactory.createDefaultRoomFilter().toJSONString() + filterId = "" + } + return realm.copyToRealm(filterEntity) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/HomeServerCapabilitiesQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/HomeServerCapabilitiesQueries.kt index 2cb6faafb7..4540cff922 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/HomeServerCapabilitiesQueries.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/HomeServerCapabilitiesQueries.kt @@ -16,21 +16,25 @@ package org.matrix.android.sdk.internal.database.query -import io.realm.Realm -import io.realm.kotlin.createObject -import io.realm.kotlin.where +import io.realm.kotlin.MutableRealm +import io.realm.kotlin.TypedRealm import org.matrix.android.sdk.internal.database.model.HomeServerCapabilitiesEntity /** * Get the current HomeServerCapabilitiesEntity, return null if it does not exist. */ -internal fun HomeServerCapabilitiesEntity.Companion.get(realm: Realm): HomeServerCapabilitiesEntity? { - return realm.where().findFirst() +internal fun HomeServerCapabilitiesEntity.Companion.get(realm: TypedRealm): HomeServerCapabilitiesEntity? { + return realm.query(HomeServerCapabilitiesEntity::class).first().find() } /** * Get the current HomeServerCapabilitiesEntity, create one if it does not exist. */ -internal fun HomeServerCapabilitiesEntity.Companion.getOrCreate(realm: Realm): HomeServerCapabilitiesEntity { - return get(realm) ?: realm.createObject() +internal fun HomeServerCapabilitiesEntity.Companion.getOrCreate(realm: MutableRealm): HomeServerCapabilitiesEntity { + return get(realm) ?: create(realm) } + +internal fun HomeServerCapabilitiesEntity.Companion.create(realm: MutableRealm): HomeServerCapabilitiesEntity { + return realm.copyToRealm(HomeServerCapabilitiesEntity()) +} + diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/PreviewUrlCacheEntityQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/PreviewUrlCacheEntityQueries.kt index 32ea7a1ba6..7ef40268bc 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/PreviewUrlCacheEntityQueries.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/PreviewUrlCacheEntityQueries.kt @@ -16,24 +16,30 @@ package org.matrix.android.sdk.internal.database.query -import io.realm.Realm -import io.realm.kotlin.createObject -import io.realm.kotlin.where +import io.realm.kotlin.MutableRealm +import io.realm.kotlin.TypedRealm import org.matrix.android.sdk.internal.database.model.PreviewUrlCacheEntity -import org.matrix.android.sdk.internal.database.model.PreviewUrlCacheEntityFields /** * Get the current PreviewUrlCacheEntity, return null if it does not exist. */ -internal fun PreviewUrlCacheEntity.Companion.get(realm: Realm, url: String): PreviewUrlCacheEntity? { - return realm.where() - .equalTo(PreviewUrlCacheEntityFields.URL, url) - .findFirst() +internal fun PreviewUrlCacheEntity.Companion.get(realm: TypedRealm, url: String): PreviewUrlCacheEntity? { + return realm.query(PreviewUrlCacheEntity::class) + .query("url == $0", url) + .first() + .find() } /** * Get the current PreviewUrlCacheEntity, create one if it does not exist. */ -internal fun PreviewUrlCacheEntity.Companion.getOrCreate(realm: Realm, url: String): PreviewUrlCacheEntity { - return get(realm, url) ?: realm.createObject(url) +internal fun PreviewUrlCacheEntity.Companion.getOrCreate(realm: MutableRealm, url: String): PreviewUrlCacheEntity { + return get(realm, url) ?: create(realm, url) +} + +internal fun PreviewUrlCacheEntity.Companion.create(realm: MutableRealm, url: String): PreviewUrlCacheEntity { + val previewUrlCacheEntity = PreviewUrlCacheEntity().apply { + this.url = url + } + return realm.copyToRealm(previewUrlCacheEntity) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/PushersQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/PushersQueries.kt index 67fd8296d5..768e20d211 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/PushersQueries.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/PushersQueries.kt @@ -15,45 +15,45 @@ */ package org.matrix.android.sdk.internal.database.query -import io.realm.Realm -import io.realm.RealmQuery -import io.realm.kotlin.where +import io.realm.kotlin.TypedRealm +import io.realm.kotlin.query.RealmQuery import org.matrix.android.sdk.api.session.pushrules.RuleKind +import org.matrix.android.sdk.internal.database.andIf import org.matrix.android.sdk.internal.database.model.PushRuleEntity import org.matrix.android.sdk.internal.database.model.PushRuleEntityFields import org.matrix.android.sdk.internal.database.model.PushRulesEntity import org.matrix.android.sdk.internal.database.model.PushRulesEntityFields import org.matrix.android.sdk.internal.database.model.PusherEntity -import org.matrix.android.sdk.internal.database.model.PusherEntityFields internal fun PusherEntity.Companion.where( - realm: Realm, + realm: TypedRealm, pushKey: String? = null ): RealmQuery { - return realm.where() - .apply { - if (pushKey != null) { - equalTo(PusherEntityFields.PUSH_KEY, pushKey) - } + return realm.query(PusherEntity::class) + .andIf(pushKey != null) { + query("pushKey == $0", pushKey!!) } } internal fun PushRulesEntity.Companion.where( - realm: Realm, + realm: TypedRealm, scope: String, kind: RuleKind ): RealmQuery { - return realm.where() - .equalTo(PushRulesEntityFields.SCOPE, scope) - .equalTo(PushRulesEntityFields.KIND_STR, kind.name) + return realm.query(PushRulesEntity::class) + .query("scope == $0", scope) + .query("kindStr == $0", kind.name) } +/* internal fun PushRuleEntity.Companion.where( - realm: Realm, + realm: TypedRealm, scope: String, ruleId: String ): RealmQuery { - return realm.where() + return realm.query(PushRuleEntity::class) .equalTo(PushRuleEntityFields.PARENT.SCOPE, scope) .equalTo(PushRuleEntityFields.RULE_ID, ruleId) } + + */ diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ReadMarkerEntityQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ReadMarkerEntityQueries.kt index d80fe86aae..0990a9fbca 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ReadMarkerEntityQueries.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ReadMarkerEntityQueries.kt @@ -16,18 +16,24 @@ package org.matrix.android.sdk.internal.database.query -import io.realm.Realm -import io.realm.RealmQuery -import io.realm.kotlin.createObject -import io.realm.kotlin.where +import io.realm.kotlin.MutableRealm +import io.realm.kotlin.TypedRealm +import io.realm.kotlin.query.RealmQuery import org.matrix.android.sdk.internal.database.model.ReadMarkerEntity -import org.matrix.android.sdk.internal.database.model.ReadMarkerEntityFields -internal fun ReadMarkerEntity.Companion.where(realm: Realm, roomId: String): RealmQuery { - return realm.where() - .equalTo(ReadMarkerEntityFields.ROOM_ID, roomId) +internal fun ReadMarkerEntity.Companion.where(realm: TypedRealm, roomId: String): RealmQuery { + return realm.query(ReadMarkerEntity::class) + .query("roomId == $0", roomId) } -internal fun ReadMarkerEntity.Companion.getOrCreate(realm: Realm, roomId: String): ReadMarkerEntity { - return where(realm, roomId).findFirst() ?: realm.createObject(roomId) +internal fun ReadMarkerEntity.Companion.getOrCreate(realm: MutableRealm, roomId: String): ReadMarkerEntity { + return where(realm, roomId).first().find() ?: create(realm, roomId) } + +internal fun ReadMarkerEntity.Companion.create(realm: MutableRealm, roomId: String): ReadMarkerEntity { + val readMarkerEntity = ReadMarkerEntity().apply { + this.roomId = roomId + } + return realm.copyToRealm(readMarkerEntity) +} + diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ReadReceiptEntityQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ReadReceiptEntityQueries.kt index b180c06e2c..c1e5eccc38 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ReadReceiptEntityQueries.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ReadReceiptEntityQueries.kt @@ -16,21 +16,19 @@ package org.matrix.android.sdk.internal.database.query -import io.realm.Realm -import io.realm.RealmQuery -import io.realm.kotlin.createObject -import io.realm.kotlin.where +import io.realm.kotlin.MutableRealm +import io.realm.kotlin.Realm +import io.realm.kotlin.query.RealmQuery import org.matrix.android.sdk.internal.database.model.ReadReceiptEntity -import org.matrix.android.sdk.internal.database.model.ReadReceiptEntityFields internal fun ReadReceiptEntity.Companion.where(realm: Realm, roomId: String, userId: String): RealmQuery { - return realm.where() - .equalTo(ReadReceiptEntityFields.PRIMARY_KEY, buildPrimaryKey(roomId, userId)) + return realm.query(ReadReceiptEntity::class) + .query("primaryKey == $0", buildPrimaryKey(roomId, userId)) } internal fun ReadReceiptEntity.Companion.whereUserId(realm: Realm, userId: String): RealmQuery { - return realm.where() - .equalTo(ReadReceiptEntityFields.USER_ID, userId) + return realm.query(ReadReceiptEntity::class) + .query("userId == $0", userId) } internal fun ReadReceiptEntity.Companion.createUnmanaged(roomId: String, eventId: String, userId: String, originServerTs: Double): ReadReceiptEntity { @@ -43,13 +41,16 @@ internal fun ReadReceiptEntity.Companion.createUnmanaged(roomId: String, eventId } } -internal fun ReadReceiptEntity.Companion.getOrCreate(realm: Realm, roomId: String, userId: String): ReadReceiptEntity { - return ReadReceiptEntity.where(realm, roomId, userId).findFirst() - ?: realm.createObject(buildPrimaryKey(roomId, userId)) - .apply { - this.roomId = roomId - this.userId = userId - } +internal fun ReadReceiptEntity.Companion.getOrCreate(realm: MutableRealm, roomId: String, userId: String): ReadReceiptEntity { + return ReadReceiptEntity.where(realm, roomId, userId).first() + ?: { + val entity = ReadReceiptEntity().apply { + this.primaryKey = buildPrimaryKey(roomId, userId) + this.roomId = roomId + this.userId = userId + } + realm.copyToRealm(entity) + } } private fun buildPrimaryKey(roomId: String, userId: String) = "${roomId}_$userId" diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ReadReceiptsSummaryEntityQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ReadReceiptsSummaryEntityQueries.kt index a35df57b7b..30e2d2f755 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ReadReceiptsSummaryEntityQueries.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ReadReceiptsSummaryEntityQueries.kt @@ -16,18 +16,18 @@ package org.matrix.android.sdk.internal.database.query -import io.realm.Realm -import io.realm.RealmQuery -import io.realm.kotlin.where +import io.realm.kotlin.TypedRealm +import io.realm.kotlin.query.RealmQuery +import io.realm.kotlin.query.RealmSingleQuery import org.matrix.android.sdk.internal.database.model.ReadReceiptsSummaryEntity -import org.matrix.android.sdk.internal.database.model.ReadReceiptsSummaryEntityFields -internal fun ReadReceiptsSummaryEntity.Companion.where(realm: Realm, eventId: String): RealmQuery { - return realm.where() - .equalTo(ReadReceiptsSummaryEntityFields.EVENT_ID, eventId) +internal fun ReadReceiptsSummaryEntity.Companion.where(realm: TypedRealm, eventId: String): RealmSingleQuery { + return realm.query(ReadReceiptsSummaryEntity::class) + .query("eventId == $0", eventId) + .first() } -internal fun ReadReceiptsSummaryEntity.Companion.whereInRoom(realm: Realm, roomId: String): RealmQuery { - return realm.where() - .equalTo(ReadReceiptsSummaryEntityFields.ROOM_ID, roomId) +internal fun ReadReceiptsSummaryEntity.Companion.whereInRoom(realm: TypedRealm, roomId: String): RealmQuery { + return realm.query(ReadReceiptsSummaryEntity::class) + .query("roomId == $0", roomId) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/RoomEntityQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/RoomEntityQueries.kt index bf42fe1fcf..464e77d7e6 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/RoomEntityQueries.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/RoomEntityQueries.kt @@ -16,32 +16,38 @@ package org.matrix.android.sdk.internal.database.query -import io.realm.Realm -import io.realm.RealmQuery -import io.realm.kotlin.where +import io.realm.kotlin.MutableRealm +import io.realm.kotlin.TypedRealm +import io.realm.kotlin.query.RealmQuery import org.matrix.android.sdk.api.session.room.model.Membership +import org.matrix.android.sdk.internal.database.andIf import org.matrix.android.sdk.internal.database.model.EventEntity import org.matrix.android.sdk.internal.database.model.RoomEntity -import org.matrix.android.sdk.internal.database.model.RoomEntityFields import org.matrix.android.sdk.internal.extensions.realm -internal fun RoomEntity.Companion.where(realm: Realm, roomId: String): RealmQuery { - return realm.where() - .equalTo(RoomEntityFields.ROOM_ID, roomId) +internal fun RoomEntity.Companion.where(realm: TypedRealm, roomId: String): RealmQuery { + return realm.query(RoomEntity::class) + .query("roomId == $0", roomId) } -internal fun RoomEntity.Companion.getOrCreate(realm: Realm, roomId: String): RoomEntity { - return where(realm, roomId).findFirst() ?: realm.createObject(RoomEntity::class.java, roomId) +internal fun RoomEntity.Companion.getOrCreate(realm: MutableRealm, roomId: String): RoomEntity { + return where(realm, roomId).first().find() ?: create(realm, roomId) } -internal fun RoomEntity.Companion.where(realm: Realm, membership: Membership? = null): RealmQuery { - val query = realm.where() - if (membership != null) { - query.equalTo(RoomEntityFields.MEMBERSHIP_STR, membership.name) +internal fun RoomEntity.Companion.create(realm: MutableRealm, roomId: String): RoomEntity { + val entity = RoomEntity().apply { + this.roomId = roomId } - return query + return realm.copyToRealm(entity) } -internal fun RoomEntity.fastContains(eventId: String): Boolean { +internal fun RoomEntity.Companion.where(realm: TypedRealm, membership: Membership? = null): RealmQuery { + return realm.query(RoomEntity::class) + .andIf(membership != null) { + query("membershipStr == $0", membership!!.name) + } +} + +internal fun RoomEntity.fastContains(realm: TypedRealm, eventId: String): Boolean { return EventEntity.where(realm, eventId = eventId).findFirst() != null } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/RoomMemberEntityQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/RoomMemberEntityQueries.kt index 1ea06b9dfb..0e3ef713ea 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/RoomMemberEntityQueries.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/RoomMemberEntityQueries.kt @@ -16,29 +16,26 @@ package org.matrix.android.sdk.internal.database.query -import io.realm.Realm -import io.realm.RealmQuery -import io.realm.kotlin.where +import io.realm.kotlin.MutableRealm +import io.realm.kotlin.TypedRealm +import io.realm.kotlin.query.RealmQuery +import org.matrix.android.sdk.internal.database.andIf import org.matrix.android.sdk.internal.database.model.RoomMemberSummaryEntity -import org.matrix.android.sdk.internal.database.model.RoomMemberSummaryEntityFields import org.matrix.android.sdk.internal.database.model.presence.UserPresenceEntity -internal fun RoomMemberSummaryEntity.Companion.where(realm: Realm, roomId: String, userId: String? = null): RealmQuery { - val query = realm - .where() - .equalTo(RoomMemberSummaryEntityFields.ROOM_ID, roomId) - - if (userId != null) { - query.equalTo(RoomMemberSummaryEntityFields.USER_ID, userId) - } - return query +internal fun RoomMemberSummaryEntity.Companion.where(realm: TypedRealm, roomId: String, userId: String? = null): RealmQuery { + return realm.query(RoomMemberSummaryEntity::class) + .query("roomId == $0", roomId) + .andIf(userId != null) { + query("userId == $0", userId!!) + } } -internal fun RoomMemberSummaryEntity.Companion.updateUserPresence(realm: Realm, userId: String, userPresenceEntity: UserPresenceEntity) { - realm.where() - .equalTo(RoomMemberSummaryEntityFields.USER_ID, userId) - .isNull(RoomMemberSummaryEntityFields.USER_PRESENCE_ENTITY.`$`) - .findAll() +internal fun RoomMemberSummaryEntity.Companion.updateUserPresence(realm: MutableRealm, userId: String, userPresenceEntity: UserPresenceEntity) { + realm.query(RoomMemberSummaryEntity::class) + .query("userId == $0", userId) + .query("userPresenceEntity == nil") + .find() .map { it.userPresenceEntity = userPresenceEntity } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ScalarTokenQuery.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ScalarTokenQuery.kt index a7d85d676c..895c1daf8b 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ScalarTokenQuery.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ScalarTokenQuery.kt @@ -16,14 +16,12 @@ package org.matrix.android.sdk.internal.database.query -import io.realm.Realm -import io.realm.RealmQuery -import io.realm.kotlin.where +import io.realm.kotlin.TypedRealm +import io.realm.kotlin.query.RealmQuery import org.matrix.android.sdk.internal.database.model.ScalarTokenEntity -import org.matrix.android.sdk.internal.database.model.ScalarTokenEntityFields -internal fun ScalarTokenEntity.Companion.where(realm: Realm, serverUrl: String): RealmQuery { +internal fun ScalarTokenEntity.Companion.where(realm: TypedRealm, serverUrl: String): RealmQuery { return realm - .where() - .equalTo(ScalarTokenEntityFields.SERVER_URL, serverUrl) + .query(ScalarTokenEntity::class) + .query("serverUrl == $0", serverUrl) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/TimelineEventEntityQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/TimelineEventEntityQueries.kt index 30010f90fd..fa5f9c204a 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/TimelineEventEntityQueries.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/TimelineEventEntityQueries.kt @@ -16,62 +16,59 @@ package org.matrix.android.sdk.internal.database.query -import io.realm.Realm -import io.realm.RealmList -import io.realm.RealmQuery -import io.realm.RealmResults -import io.realm.Sort -import io.realm.kotlin.where +import io.realm.kotlin.TypedRealm +import io.realm.kotlin.query.RealmQuery import org.matrix.android.sdk.api.session.room.send.SendState import org.matrix.android.sdk.api.session.room.timeline.TimelineEventFilters import org.matrix.android.sdk.internal.database.model.ChunkEntity import org.matrix.android.sdk.internal.database.model.RoomEntity import org.matrix.android.sdk.internal.database.model.TimelineEventEntity import org.matrix.android.sdk.internal.database.model.TimelineEventEntityFields +import org.matrix.android.sdk.internal.database.queryIn -internal fun TimelineEventEntity.Companion.where(realm: Realm): RealmQuery { - return realm.where() +internal fun TimelineEventEntity.Companion.where(realm: TypedRealm): RealmQuery { + return realm.query(TimelineEventEntity::class) } internal fun TimelineEventEntity.Companion.where( - realm: Realm, + realm: TypedRealm, roomId: String, eventId: String ): RealmQuery { return where(realm) - .equalTo(TimelineEventEntityFields.ROOM_ID, roomId) - .equalTo(TimelineEventEntityFields.EVENT_ID, eventId) + .query("roomId == $0", roomId) + .query("evendId == $0", eventId) } internal fun TimelineEventEntity.Companion.where( - realm: Realm, + realm: TypedRealm, roomId: String, eventIds: List ): RealmQuery { return where(realm) - .equalTo(TimelineEventEntityFields.ROOM_ID, roomId) - .`in`(TimelineEventEntityFields.EVENT_ID, eventIds.toTypedArray()) + .query("roomId == $0", roomId) + .queryIn("evendId", eventIds) } internal fun TimelineEventEntity.Companion.whereRoomId( - realm: Realm, + realm: TypedRealm, roomId: String ): RealmQuery { return where(realm) - .equalTo(TimelineEventEntityFields.ROOM_ID, roomId) + .query("roomId == $0", roomId) } internal fun TimelineEventEntity.Companion.findWithSenderMembershipEvent( - realm: Realm, + realm: TypedRealm, senderMembershipEventId: String ): List { return where(realm) - .equalTo(TimelineEventEntityFields.SENDER_MEMBERSHIP_EVENT_ID, senderMembershipEventId) - .findAll() + .query("senderMembershipEventId == $0", senderMembershipEventId) + .find() } internal fun TimelineEventEntity.Companion.latestEvent( - realm: Realm, + realm: TypedRealm, roomId: String, includesSending: Boolean, filters: TimelineEventFilters = TimelineEventFilters() diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/UserEntityQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/UserEntityQueries.kt index 3159f89311..495301e47b 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/UserEntityQueries.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/UserEntityQueries.kt @@ -16,14 +16,12 @@ package org.matrix.android.sdk.internal.database.query -import io.realm.Realm -import io.realm.RealmQuery -import io.realm.kotlin.where +import io.realm.kotlin.TypedRealm +import io.realm.kotlin.query.RealmQuery import org.matrix.android.sdk.internal.database.model.UserEntity -import org.matrix.android.sdk.internal.database.model.UserEntityFields -internal fun UserEntity.Companion.where(realm: Realm, userId: String): RealmQuery { +internal fun UserEntity.Companion.where(realm: TypedRealm, userId: String): RealmQuery { return realm - .where() - .equalTo(UserEntityFields.USER_ID, userId) + .query(UserEntity::class) + .query("userId == $0", userId) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/UserPresenceEntityQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/UserPresenceEntityQueries.kt index 22790b6f4f..15a648ec81 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/UserPresenceEntityQueries.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/UserPresenceEntityQueries.kt @@ -16,14 +16,12 @@ package org.matrix.android.sdk.internal.database.query -import io.realm.Realm -import io.realm.RealmQuery -import io.realm.kotlin.where +import io.realm.kotlin.TypedRealm +import io.realm.kotlin.query.RealmQuery import org.matrix.android.sdk.internal.database.model.presence.UserPresenceEntity -import org.matrix.android.sdk.internal.database.model.presence.UserPresenceEntityFields -internal fun UserPresenceEntity.Companion.where(realm: Realm, userId: String): RealmQuery { +internal fun UserPresenceEntity.Companion.where(realm: TypedRealm, userId: String): RealmQuery { return realm - .where() - .equalTo(UserPresenceEntityFields.USER_ID, userId) + .query(UserPresenceEntity::class) + .query("userId == $0", userId) } 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 86c47838db..4e962170d1 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 @@ -17,6 +17,7 @@ package org.matrix.android.sdk.internal.session.room.summary import io.realm.Realm +import io.realm.kotlin.MutableRealm import io.realm.kotlin.createObject import io.realm.kotlin.deleteFromRealm import kotlinx.coroutines.runBlocking @@ -217,7 +218,7 @@ internal class RoomSummaryUpdater @Inject constructor( /** * Should be called at the end of the room sync, to check and validate all parent/child relations. */ - fun validateSpaceRelationship(realm: Realm) { + fun validateSpaceRelationship(realm: MutableRealm) { measureTimeMillis { val lookupMap = realm.where(RoomSummaryEntity::class.java) .process(RoomSummaryEntityFields.MEMBERSHIP_STR, Membership.activeMemberships()) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt index 392c73bd83..3017ac0fff 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt @@ -24,6 +24,7 @@ import org.matrix.android.sdk.api.session.sync.model.RoomsSyncResponse import org.matrix.android.sdk.api.session.sync.model.SyncResponse import org.matrix.android.sdk.internal.SessionManager import org.matrix.android.sdk.internal.crypto.DefaultCryptoService +import org.matrix.android.sdk.internal.database.RealmInstance import org.matrix.android.sdk.internal.di.SessionDatabase import org.matrix.android.sdk.internal.di.SessionId import org.matrix.android.sdk.internal.session.SessionListeners @@ -40,7 +41,7 @@ import javax.inject.Inject import kotlin.system.measureTimeMillis internal class SyncResponseHandler @Inject constructor( - @SessionDatabase private val monarchy: Monarchy, + @SessionDatabase private val realmInstance: RealmInstance, @SessionId private val sessionId: String, private val sessionManager: SessionManager, private val sessionListeners: SessionListeners, @@ -94,13 +95,13 @@ internal class SyncResponseHandler @Inject constructor( // } // Start one big transaction - monarchy.awaitTransaction { realm -> + realmInstance.write { // IMPORTANT nothing should be suspend here as we are accessing the realm instance (thread local) measureTimeMillis { Timber.v("Handle rooms") reportSubtask(reporter, InitialSyncStep.ImportingAccountRoom, 1, 0.8f) { if (syncResponse.rooms != null) { - roomSyncHandler.handle(realm, syncResponse.rooms, isInitialSync, aggregator, reporter) + roomSyncHandler.handle(this, syncResponse.rooms, isInitialSync, aggregator, reporter) } } }.also { @@ -110,7 +111,7 @@ internal class SyncResponseHandler @Inject constructor( measureTimeMillis { reportSubtask(reporter, InitialSyncStep.ImportingAccountData, 1, 0.1f) { Timber.v("Handle accountData") - userAccountDataSyncHandler.handle(realm, syncResponse.accountData) + userAccountDataSyncHandler.handle(this, syncResponse.accountData) } }.also { Timber.v("Finish handling accountData in $it ms") @@ -118,11 +119,11 @@ internal class SyncResponseHandler @Inject constructor( measureTimeMillis { Timber.v("Handle Presence") - presenceSyncHandler.handle(realm, syncResponse.presence) + presenceSyncHandler.handle(this, syncResponse.presence) }.also { Timber.v("Finish handling Presence in $it ms") } - tokenStore.saveToken(realm, syncResponse.nextBatch) + tokenStore.saveToken(this, syncResponse.nextBatch) } // Everything else we need to do outside the transaction @@ -138,8 +139,8 @@ internal class SyncResponseHandler @Inject constructor( cryptoSyncHandler.onSyncCompleted(syncResponse) // post sync stuffs - monarchy.writeAsync { - roomSyncHandler.postSyncSpaceHierarchyHandle(it) + realmInstance.asyncWrite { + roomSyncHandler.postSyncSpaceHierarchyHandle(this) } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncTokenStore.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncTokenStore.kt index 869a4d425a..1366b76765 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncTokenStore.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncTokenStore.kt @@ -16,25 +16,25 @@ package org.matrix.android.sdk.internal.session.sync -import com.zhuinden.monarchy.Monarchy -import io.realm.Realm +import io.realm.kotlin.MutableRealm +import io.realm.kotlin.UpdatePolicy +import org.matrix.android.sdk.internal.database.RealmInstance import org.matrix.android.sdk.internal.database.model.SyncEntity import org.matrix.android.sdk.internal.di.SessionDatabase import javax.inject.Inject -internal class SyncTokenStore @Inject constructor(@SessionDatabase private val monarchy: Monarchy) { +internal class SyncTokenStore @Inject constructor(@SessionDatabase private val realmInstance: RealmInstance) { fun getLastToken(): String? { - val token = Realm.getInstance(monarchy.realmConfiguration).use { - // Makes sure realm is up-to-date as it's used for querying internally on non looper thread. - it.refresh() - it.where(SyncEntity::class.java).findFirst()?.nextBatch - } - return token + return realmInstance.getBlockingRealm() + .query(SyncEntity::class) + .first() + .find() + ?.nextBatch } - fun saveToken(realm: Realm, token: String?) { - val sync = SyncEntity(token) - realm.insertOrUpdate(sync) + fun saveToken(realm: MutableRealm, token: String?) { + val sync = SyncEntity().apply { nextBatch = token } + realm.copyToRealm(sync, updatePolicy = UpdatePolicy.ALL) } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/PresenceSyncHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/PresenceSyncHandler.kt index 0d4c06339b..c120e56f95 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/PresenceSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/PresenceSyncHandler.kt @@ -16,7 +16,8 @@ package org.matrix.android.sdk.internal.session.sync.handler -import io.realm.Realm +import io.realm.kotlin.MutableRealm +import io.realm.kotlin.UpdatePolicy import org.matrix.android.sdk.api.MatrixConfiguration import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.api.session.events.model.getPresenceContent @@ -30,23 +31,21 @@ import javax.inject.Inject internal class PresenceSyncHandler @Inject constructor(private val matrixConfiguration: MatrixConfiguration) { - fun handle(realm: Realm, presenceSyncResponse: PresenceSyncResponse?) { + fun handle(realm: MutableRealm, presenceSyncResponse: PresenceSyncResponse?) { presenceSyncResponse?.events ?.filter { event -> event.type == EventType.PRESENCE } ?.forEach { event -> val content = event.getPresenceContent() ?: return@forEach - val userId = event.senderId ?: return@forEach - val userPresenceEntity = UserPresenceEntity( - userId = userId, - lastActiveAgo = content.lastActiveAgo, - statusMessage = content.statusMessage, - isCurrentlyActive = content.isCurrentlyActive, - avatarUrl = content.avatarUrl, - displayName = content.displayName - ).also { - it.presence = content.presence + val senderId = event.senderId ?: return@forEach + val userPresenceEntity = UserPresenceEntity().apply { + userId = senderId + lastActiveAgo = content.lastActiveAgo + statusMessage = content.statusMessage + isCurrentlyActive = content.isCurrentlyActive + avatarUrl = content.avatarUrl + displayName = content.displayName + presence = content.presence } - storePresenceToDB(realm, userPresenceEntity) } } @@ -54,8 +53,8 @@ internal class PresenceSyncHandler @Inject constructor(private val matrixConfigu /** * Store user presence to DB and update Direct Rooms and Room Member Summaries accordingly. */ - private fun storePresenceToDB(realm: Realm, userPresenceEntity: UserPresenceEntity) = - realm.copyToRealmOrUpdate(userPresenceEntity)?.apply { + private fun storePresenceToDB(realm: MutableRealm, userPresenceEntity: UserPresenceEntity) = + realm.copyToRealm(userPresenceEntity, updatePolicy = UpdatePolicy.ALL)?.also { RoomSummaryEntity.updateDirectUserPresence(realm, userPresenceEntity.userId, this) RoomMemberSummaryEntity.updateUserPresence(realm, userPresenceEntity.userId, this) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/SyncResponsePostTreatmentAggregatorHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/SyncResponsePostTreatmentAggregatorHandler.kt index c638ed4f80..a556f0fa1f 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/SyncResponsePostTreatmentAggregatorHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/SyncResponsePostTreatmentAggregatorHandler.kt @@ -16,10 +16,11 @@ package org.matrix.android.sdk.internal.session.sync.handler -import com.zhuinden.monarchy.Monarchy +import io.realm.kotlin.UpdatePolicy import org.matrix.android.sdk.api.MatrixPatterns import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.session.user.model.User +import org.matrix.android.sdk.internal.database.RealmInstance import org.matrix.android.sdk.internal.di.SessionDatabase import org.matrix.android.sdk.internal.session.profile.GetProfileInfoTask import org.matrix.android.sdk.internal.session.sync.RoomSyncEphemeralTemporaryStore @@ -28,7 +29,6 @@ import org.matrix.android.sdk.internal.session.sync.model.accountdata.toMutable import org.matrix.android.sdk.internal.session.user.UserEntityFactory import org.matrix.android.sdk.internal.session.user.accountdata.DirectChatsHelper import org.matrix.android.sdk.internal.session.user.accountdata.UpdateUserAccountDataTask -import org.matrix.android.sdk.internal.util.awaitTransaction import javax.inject.Inject internal class SyncResponsePostTreatmentAggregatorHandler @Inject constructor( @@ -36,7 +36,7 @@ internal class SyncResponsePostTreatmentAggregatorHandler @Inject constructor( private val ephemeralTemporaryStore: RoomSyncEphemeralTemporaryStore, private val updateUserAccountDataTask: UpdateUserAccountDataTask, private val getProfileInfoTask: GetProfileInfoTask, - @SessionDatabase private val monarchy: Monarchy, + @SessionDatabase private val realmInstance: RealmInstance, ) { suspend fun handle(aggregator: SyncResponsePostTreatmentAggregator) { cleanupEphemeralFiles(aggregator.ephemeralFilesToDelete) @@ -93,9 +93,11 @@ internal class SyncResponsePostTreatmentAggregatorHandler @Inject constructor( } private suspend fun List.saveLocally() { - val userEntities = map { user -> UserEntityFactory.create(user) } - monarchy.awaitTransaction { - it.insertOrUpdate(userEntities) + realmInstance.write { + forEach { user -> + val userEntity = UserEntityFactory.create(user) + copyToRealm(userEntity, updatePolicy = UpdatePolicy.ALL) + } } } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/UserAccountDataSyncHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/UserAccountDataSyncHandler.kt index 0f296ded5d..bbb493e92a 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/UserAccountDataSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/UserAccountDataSyncHandler.kt @@ -19,6 +19,8 @@ package org.matrix.android.sdk.internal.session.sync.handler import com.zhuinden.monarchy.Monarchy import io.realm.Realm import io.realm.RealmList +import io.realm.kotlin.MutableRealm +import io.realm.kotlin.UpdatePolicy import io.realm.kotlin.where import org.matrix.android.sdk.api.failure.GlobalError import org.matrix.android.sdk.api.failure.InitialSyncRequestReason @@ -79,7 +81,7 @@ internal class UserAccountDataSyncHandler @Inject constructor( private val sessionListeners: SessionListeners ) { - fun handle(realm: Realm, accountData: UserAccountDataSync?) { + fun handle(realm: MutableRealm, accountData: UserAccountDataSync?) { accountData?.list?.forEach { event -> // Generic handling, just save in base handleGenericAccountData(realm, event.type, event.content) @@ -125,49 +127,67 @@ internal class UserAccountDataSyncHandler @Inject constructor( } } - private fun handlePushRules(realm: Realm, event: UserAccountDataEvent) { + private fun handlePushRules(realm: MutableRealm, event: UserAccountDataEvent) { val pushRules = event.content.toModel() ?: return - realm.where(PushRulesEntity::class.java) - .findAll() - .forEach { it.deleteOnCascade() } + realm + .query(PushRulesEntity::class) + .find() + .forEach { + //it.deleteOnCascade() + } // Save only global rules for the moment val globalRules = pushRules.global - val content = PushRulesEntity(RuleScope.GLOBAL).apply { kind = RuleSetKey.CONTENT } + val content = PushRulesEntity().apply { + scope = RuleScope.GLOBAL + kind = RuleSetKey.CONTENT + } globalRules.content?.forEach { rule -> content.pushRules.add(PushRulesMapper.map(rule)) } - realm.insertOrUpdate(content) + realm.copyToRealm(content, updatePolicy = UpdatePolicy.ALL) - val override = PushRulesEntity(RuleScope.GLOBAL).apply { kind = RuleSetKey.OVERRIDE } + val override = PushRulesEntity().apply { + scope = RuleScope.GLOBAL + kind = RuleSetKey.OVERRIDE + } globalRules.override?.forEach { rule -> PushRulesMapper.map(rule).also { override.pushRules.add(it) } } - realm.insertOrUpdate(override) + realm.copyToRealm(override, updatePolicy = UpdatePolicy.ALL) - val rooms = PushRulesEntity(RuleScope.GLOBAL).apply { kind = RuleSetKey.ROOM } + val rooms = PushRulesEntity().apply { + scope = RuleScope.GLOBAL + kind = RuleSetKey.ROOM + } globalRules.room?.forEach { rule -> rooms.pushRules.add(PushRulesMapper.map(rule)) } - realm.insertOrUpdate(rooms) + realm.copyToRealm(rooms, updatePolicy = UpdatePolicy.ALL) - val senders = PushRulesEntity(RuleScope.GLOBAL).apply { kind = RuleSetKey.SENDER } + val senders = PushRulesEntity().apply { + scope = RuleScope.GLOBAL + kind = RuleSetKey.SENDER + } globalRules.sender?.forEach { rule -> senders.pushRules.add(PushRulesMapper.map(rule)) } - realm.insertOrUpdate(senders) + realm.copyToRealm(senders, updatePolicy = UpdatePolicy.ALL) - val underrides = PushRulesEntity(RuleScope.GLOBAL).apply { kind = RuleSetKey.UNDERRIDE } + val underrides = PushRulesEntity().apply { + scope = RuleScope.GLOBAL + kind = RuleSetKey.UNDERRIDE + } globalRules.underride?.forEach { rule -> underrides.pushRules.add(PushRulesMapper.map(rule)) } - realm.insertOrUpdate(underrides) + realm.copyToRealm(underrides, updatePolicy = UpdatePolicy.ALL) } - private fun handleDirectChatRooms(realm: Realm, event: UserAccountDataEvent) { + private fun handleDirectChatRooms(realm: MutableRealm, event: UserAccountDataEvent) { val content = event.content.toModel() ?: return content.forEach { (userId, roomIds) -> roomIds.forEach { roomId -> @@ -193,14 +213,19 @@ internal class UserAccountDataSyncHandler @Inject constructor( } } - private fun handleIgnoredUsers(realm: Realm, event: UserAccountDataEvent) { + private fun handleIgnoredUsers(realm: MutableRealm, event: UserAccountDataEvent) { val userIds = event.content.toModel()?.ignoredUsers?.keys ?: return - val currentIgnoredUsers = realm.where(IgnoredUserEntity::class.java).findAll() + val currentIgnoredUsers = realm.query(IgnoredUserEntity::class).find() val currentIgnoredUserIds = currentIgnoredUsers.map { it.userId } // Delete the previous list - currentIgnoredUsers.deleteAllFromRealm() + realm.delete(currentIgnoredUsers) // And save the new received list - userIds.forEach { realm.createObject(IgnoredUserEntity::class.java).apply { userId = it } } + userIds.forEach { + val ignoredUserEntity = IgnoredUserEntity().apply { + userId = it + } + realm.copyToRealm(ignoredUserEntity) + } // Delete all the TimelineEvents for all the ignored users // See https://spec.matrix.org/latest/client-server-api/#client-behaviour-22 : @@ -227,7 +252,7 @@ internal class UserAccountDataSyncHandler @Inject constructor( } } - private fun handleBreadcrumbs(realm: Realm, event: UserAccountDataEvent) { + private fun handleBreadcrumbs(realm: MutableRealm, event: UserAccountDataEvent) { val recentRoomIds = event.content.toModel()?.recentRoomIds ?: return val entity = BreadcrumbsEntity.getOrCreate(realm) @@ -251,7 +276,7 @@ internal class UserAccountDataSyncHandler @Inject constructor( } } - fun handleGenericAccountData(realm: Realm, type: String, content: Content?) { + fun handleGenericAccountData(realm: MutableRealm, type: String, content: Content?) { val existing = realm.where() .equalTo(UserAccountDataEntityFields.TYPE, type) .findFirst() diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/ReadReceiptHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/ReadReceiptHandler.kt index 7329611a01..fddf1ea154 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/ReadReceiptHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/ReadReceiptHandler.kt @@ -16,12 +16,14 @@ package org.matrix.android.sdk.internal.session.sync.handler.room -import io.realm.Realm +import io.realm.kotlin.MutableRealm +import io.realm.kotlin.UpdatePolicy import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.internal.database.model.ReadReceiptEntity import org.matrix.android.sdk.internal.database.model.ReadReceiptsSummaryEntity import org.matrix.android.sdk.internal.database.query.createUnmanaged import org.matrix.android.sdk.internal.database.query.getOrCreate +import org.matrix.android.sdk.internal.database.query.readReceiptSummaryEntityQueries import org.matrix.android.sdk.internal.database.query.where import org.matrix.android.sdk.internal.session.sync.RoomSyncEphemeralTemporaryStore import org.matrix.android.sdk.internal.session.sync.SyncResponsePostTreatmentAggregator @@ -62,7 +64,7 @@ internal class ReadReceiptHandler @Inject constructor( } fun handle( - realm: Realm, + realm: MutableRealm, roomId: String, content: ReadReceiptContent?, isInitialSync: Boolean, @@ -78,7 +80,7 @@ internal class ReadReceiptHandler @Inject constructor( } private fun handleReadReceiptContent( - realm: Realm, + realm: MutableRealm, roomId: String, content: ReadReceiptContent, isInitialSync: Boolean, @@ -91,24 +93,29 @@ internal class ReadReceiptHandler @Inject constructor( } } - private fun initialSyncStrategy(realm: Realm, roomId: String, content: ReadReceiptContent) { - val readReceiptSummaries = ArrayList() + private fun initialSyncStrategy(realm: MutableRealm, roomId: String, content: ReadReceiptContent) { for ((eventId, receiptDict) in content) { val userIdsDict = receiptDict[READ_KEY] ?: continue - val readReceiptsSummary = ReadReceiptsSummaryEntity(eventId = eventId, roomId = roomId) - + val readReceiptsSummary = ReadReceiptsSummaryEntity().apply { + this.eventId = eventId + this.roomId = roomId + } for ((userId, paramsDict) in userIdsDict) { val ts = paramsDict[TIMESTAMP_KEY] ?: 0.0 - val receiptEntity = ReadReceiptEntity.createUnmanaged(roomId, eventId, userId, ts) + val receiptEntity = ReadReceiptEntity().apply { + this.roomId = roomId + this.eventId = eventId + this.userId = userId + this.originServerTs = ts + } readReceiptsSummary.readReceipts.add(receiptEntity) } - readReceiptSummaries.add(readReceiptsSummary) + realm.copyToRealm(readReceiptsSummary, updatePolicy = UpdatePolicy.ALL) } - realm.insertOrUpdate(readReceiptSummaries) } private fun incrementalSyncStrategy( - realm: Realm, + realm: MutableRealm, roomId: String, content: ReadReceiptContent, aggregator: SyncResponsePostTreatmentAggregator? @@ -123,10 +130,10 @@ internal class ReadReceiptHandler @Inject constructor( doIncrementalSyncStrategy(realm, roomId, content) } - private fun doIncrementalSyncStrategy(realm: Realm, roomId: String, content: ReadReceiptContent) { + private fun doIncrementalSyncStrategy(realm: MutableRealm, roomId: String, content: ReadReceiptContent) { for ((eventId, receiptDict) in content) { val userIdsDict = receiptDict[READ_KEY] ?: continue - val readReceiptsSummary = ReadReceiptsSummaryEntity.where(realm, eventId).findFirst() + val readReceiptsSummary = ReadReceiptsSummaryEntity.where(realm, eventId).find() ?: realm.createObject(ReadReceiptsSummaryEntity::class.java, eventId).apply { this.roomId = roomId } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt index 30e1ec6679..8960657037 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/room/RoomSyncHandler.kt @@ -17,7 +17,7 @@ package org.matrix.android.sdk.internal.session.sync.handler.room import dagger.Lazy -import io.realm.Realm +import io.realm.kotlin.MutableRealm import io.realm.kotlin.createObject import kotlinx.coroutines.runBlocking import org.matrix.android.sdk.api.crypto.MXCRYPTO_ALGORITHM_MEGOLM @@ -108,7 +108,7 @@ internal class RoomSyncHandler @Inject constructor( } fun handle( - realm: Realm, + realm: MutableRealm, roomsSyncResponse: RoomsSyncResponse, isInitialSync: Boolean, aggregator: SyncResponsePostTreatmentAggregator, @@ -122,13 +122,13 @@ internal class RoomSyncHandler @Inject constructor( // roomSummaryUpdater.validateSpaceRelationship(realm) } - fun postSyncSpaceHierarchyHandle(realm: Realm) { + fun postSyncSpaceHierarchyHandle(realm: MutableRealm) { roomSummaryUpdater.validateSpaceRelationship(realm) } // PRIVATE METHODS ***************************************************************************** private fun handleRoomSync( - realm: Realm, + realm: MutableRealm, handlingStrategy: HandlingStrategy, isInitialSync: Boolean, aggregator: SyncResponsePostTreatmentAggregator, @@ -140,7 +140,7 @@ internal class RoomSyncHandler @Inject constructor( EventInsertType.INCREMENTAL_SYNC } val syncLocalTimeStampMillis = clock.epochMillis() - val rooms = when (handlingStrategy) { + when (handlingStrategy) { is HandlingStrategy.JOINED -> { if (isInitialSync && initialSyncStrategy is InitialSyncStrategy.Optimized) { insertJoinRoomsFromInitSync(realm, handlingStrategy, syncLocalTimeStampMillis, aggregator, reporter) @@ -163,11 +163,10 @@ internal class RoomSyncHandler @Inject constructor( } } } - realm.insertOrUpdate(rooms) } private fun insertJoinRoomsFromInitSync( - realm: Realm, + realm: MutableRealm, handlingStrategy: HandlingStrategy.JOINED, syncLocalTimeStampMillis: Long, aggregator: SyncResponsePostTreatmentAggregator, @@ -211,7 +210,7 @@ internal class RoomSyncHandler @Inject constructor( } private fun handleJoinedRoom( - realm: Realm, + realm: MutableRealm, roomId: String, roomSync: RoomSync, insertType: EventInsertType, @@ -291,7 +290,7 @@ internal class RoomSyncHandler @Inject constructor( } private fun handleInvitedRoom( - realm: Realm, + realm: MutableRealm, roomId: String, roomSync: InvitedRoomSync, insertType: EventInsertType, @@ -324,7 +323,7 @@ internal class RoomSyncHandler @Inject constructor( } private fun handleLeftRoom( - realm: Realm, + realm: MutableRealm, roomId: String, roomSync: RoomSync, insertType: EventInsertType, @@ -371,7 +370,7 @@ internal class RoomSyncHandler @Inject constructor( } private fun handleTimelineEvents( - realm: Realm, + realm: MutableRealm, roomId: String, roomEntity: RoomEntity, eventList: List, @@ -519,7 +518,7 @@ internal class RoomSyncHandler @Inject constructor( * the thread timeline and /relations api, we should not added it */ private fun addToThreadChunkIfNeeded( - realm: Realm, + realm: MutableRealm, roomId: String, threadId: String, timelineEventEntity: TimelineEventEntity?, @@ -567,7 +566,7 @@ internal class RoomSyncHandler @Inject constructor( ) private fun handleEphemeral( - realm: Realm, + realm: MutableRealm, roomId: String, ephemeralEvents: List, isInitialSync: Boolean, diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewModel.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewModel.kt index d38b2a0a69..23d1c9e93c 100644 --- a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewModel.kt @@ -151,8 +151,12 @@ class RoomMemberProfileViewModel @AssistedInject constructor( ignored.find { it.userId == initialState.userId } != null + } + .map { + } .execute { + it copy(isIgnored = it) } }