Realm kotlin: continue migrating queries (some are blocked by lack of backlink)

This commit is contained in:
ganfra 2022-09-16 19:24:23 +02:00
parent aeaf4389a8
commit a4a4bac75b
28 changed files with 394 additions and 321 deletions

View File

@ -55,6 +55,23 @@ internal fun <T : RealmObject> RealmQuery<T>.queryIn(
values: List<String> values: List<String>
): RealmQuery<T> { ): RealmQuery<T> {
if (values.isEmpty()) return this if (values.isEmpty()) return this
val filter = buildQueryInFilter(field, values)
return query(filter)
}
internal fun <T : RealmObject> RealmQuery<T>.queryNotIn(
field: String,
values: List<String>
): RealmQuery<T> {
if (values.isEmpty()) return this
val filter = buildQueryInFilter(field, values)
return query("NOT $filter")
}
private fun buildQueryInFilter(
field: String,
values: List<String>
): String {
val filter = buildString { val filter = buildString {
val iterator = values.iterator() val iterator = values.iterator()
while (iterator.hasNext()) { while (iterator.hasNext()) {
@ -64,7 +81,7 @@ internal fun <T : RealmObject> RealmQuery<T>.queryIn(
} }
} }
} }
return query(filter) return filter
} }
internal fun <T : RealmObject> RealmQuery<T>.andIf( internal fun <T : RealmObject> RealmQuery<T>.andIf(

View File

@ -16,15 +16,16 @@
package org.matrix.android.sdk.internal.database.query package org.matrix.android.sdk.internal.database.query
import io.realm.Realm import io.realm.kotlin.MutableRealm
import io.realm.kotlin.createObject import io.realm.kotlin.TypedRealm
import io.realm.kotlin.where
import org.matrix.android.sdk.internal.database.model.BreadcrumbsEntity import org.matrix.android.sdk.internal.database.model.BreadcrumbsEntity
internal fun BreadcrumbsEntity.Companion.get(realm: Realm): BreadcrumbsEntity? { internal fun BreadcrumbsEntity.Companion.get(realm: TypedRealm): BreadcrumbsEntity? {
return realm.where<BreadcrumbsEntity>().findFirst() return realm.query(BreadcrumbsEntity::class).first().find()
} }
internal fun BreadcrumbsEntity.Companion.getOrCreate(realm: Realm): BreadcrumbsEntity { internal fun BreadcrumbsEntity.Companion.getOrCreate(realm: MutableRealm): BreadcrumbsEntity {
return get(realm) ?: realm.createObject() return get(realm) ?: BreadcrumbsEntity().also {
realm.copyToRealm(it)
}
} }

View File

@ -16,17 +16,12 @@
package org.matrix.android.sdk.internal.database.query 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.ChunkEntity
import org.matrix.android.sdk.internal.database.model.ChunkEntityFields import org.matrix.android.sdk.internal.database.model.ChunkEntityFields
internal fun ChunkEntity.Companion.where(realm: Realm, roomId: String): RealmQuery<ChunkEntity> { internal fun ChunkEntity.Companion.where(realm: TypedRealm, roomId: String): RealmQuery<ChunkEntity> {
return realm.where<ChunkEntity>() return realm.query(ChunkEntity::class)
.equalTo(ChunkEntityFields.ROOM.ROOM_ID, roomId) .query(ChunkEntityFields.ROOM.ROOM_ID, roomId)
} }
internal fun ChunkEntity.Companion.find(realm: Realm, roomId: String, prevToken: String? = null, nextToken: String? = null): ChunkEntity? { internal fun ChunkEntity.Companion.find(realm: Realm, roomId: String, prevToken: String? = null, nextToken: String? = null): ChunkEntity? {

View File

@ -17,50 +17,49 @@
package org.matrix.android.sdk.internal.database.query package org.matrix.android.sdk.internal.database.query
import io.realm.Realm import io.realm.kotlin.MutableRealm
import io.realm.RealmQuery import io.realm.kotlin.TypedRealm
import io.realm.kotlin.createObject import io.realm.kotlin.query.RealmQuery
import org.matrix.android.sdk.internal.database.model.CurrentStateEventEntity import org.matrix.android.sdk.internal.database.model.CurrentStateEventEntity
import org.matrix.android.sdk.internal.database.model.CurrentStateEventEntityFields
internal fun CurrentStateEventEntity.Companion.whereRoomId( internal fun CurrentStateEventEntity.Companion.whereRoomId(
realm: Realm, realm: TypedRealm,
roomId: String roomId: String
): RealmQuery<CurrentStateEventEntity> { ): RealmQuery<CurrentStateEventEntity> {
return realm.where(CurrentStateEventEntity::class.java) return realm.query(CurrentStateEventEntity::class)
.equalTo(CurrentStateEventEntityFields.ROOM_ID, roomId) .query("roomId == $0", roomId)
} }
internal fun CurrentStateEventEntity.Companion.whereType( internal fun CurrentStateEventEntity.Companion.whereType(
realm: Realm, realm: TypedRealm,
roomId: String, roomId: String,
type: String type: String
): RealmQuery<CurrentStateEventEntity> { ): RealmQuery<CurrentStateEventEntity> {
return whereRoomId(realm = realm, roomId = roomId) return whereRoomId(realm = realm, roomId = roomId)
.equalTo(CurrentStateEventEntityFields.TYPE, type) .query("type == $0", type)
} }
internal fun CurrentStateEventEntity.Companion.whereStateKey( internal fun CurrentStateEventEntity.Companion.whereStateKey(
realm: Realm, realm: TypedRealm,
roomId: String, roomId: String,
type: String, type: String,
stateKey: String stateKey: String
): RealmQuery<CurrentStateEventEntity> { ): RealmQuery<CurrentStateEventEntity> {
return whereType(realm = realm, roomId = roomId, type = type) return whereType(realm = realm, roomId = roomId, type = type)
.equalTo(CurrentStateEventEntityFields.STATE_KEY, stateKey) .query("stateKey == $0", stateKey)
} }
internal fun CurrentStateEventEntity.Companion.getOrNull( internal fun CurrentStateEventEntity.Companion.getOrNull(
realm: Realm, realm: TypedRealm,
roomId: String, roomId: String,
stateKey: String, stateKey: String,
type: String type: String
): CurrentStateEventEntity? { ): 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( internal fun CurrentStateEventEntity.Companion.getOrCreate(
realm: Realm, realm: MutableRealm,
roomId: String, roomId: String,
stateKey: String, stateKey: String,
type: String type: String
@ -69,14 +68,15 @@ internal fun CurrentStateEventEntity.Companion.getOrCreate(
} }
private fun create( private fun create(
realm: Realm, realm: MutableRealm,
roomId: String, roomId: String,
stateKey: String, stateKey: String,
type: String type: String
): CurrentStateEventEntity { ): CurrentStateEventEntity {
return realm.createObject<CurrentStateEventEntity>().apply { val currentStateEventEntity = CurrentStateEventEntity().apply {
this.type = type this.type = type
this.roomId = roomId this.roomId = roomId
this.stateKey = stateKey this.stateKey = stateKey
} }
return realm.copyToRealm(currentStateEventEntity)
} }

View File

@ -16,28 +16,30 @@
package org.matrix.android.sdk.internal.database.query package org.matrix.android.sdk.internal.database.query
import io.realm.Realm import io.realm.kotlin.MutableRealm
import io.realm.RealmQuery import io.realm.kotlin.TypedRealm
import io.realm.kotlin.where import io.realm.kotlin.query.RealmQuery
import org.matrix.android.sdk.internal.database.model.EventAnnotationsSummaryEntity 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.EventAnnotationsSummaryEntityFields
import org.matrix.android.sdk.internal.database.model.TimelineEventEntity import org.matrix.android.sdk.internal.database.model.TimelineEventEntity
internal fun EventAnnotationsSummaryEntity.Companion.where(realm: Realm, eventId: String): RealmQuery<EventAnnotationsSummaryEntity> { internal fun EventAnnotationsSummaryEntity.Companion.where(realm: TypedRealm, eventId: String): RealmQuery<EventAnnotationsSummaryEntity> {
return realm.where<EventAnnotationsSummaryEntity>() return realm.where<EventAnnotationsSummaryEntity>()
.equalTo(EventAnnotationsSummaryEntityFields.EVENT_ID, eventId) .equalTo(EventAnnotationsSummaryEntityFields.EVENT_ID, eventId)
} }
internal fun EventAnnotationsSummaryEntity.Companion.where(realm: Realm, roomId: String, eventId: String): RealmQuery<EventAnnotationsSummaryEntity> { internal fun EventAnnotationsSummaryEntity.Companion.where(realm: TypedRealm, roomId: String, eventId: String): RealmQuery<EventAnnotationsSummaryEntity> {
return realm.where<EventAnnotationsSummaryEntity>() return realm.where<EventAnnotationsSummaryEntity>()
.equalTo(EventAnnotationsSummaryEntityFields.ROOM_ID, roomId) .equalTo(EventAnnotationsSummaryEntityFields.ROOM_ID, roomId)
.equalTo(EventAnnotationsSummaryEntityFields.EVENT_ID, eventId) .equalTo(EventAnnotationsSummaryEntityFields.EVENT_ID, eventId)
} }
internal fun EventAnnotationsSummaryEntity.Companion.create(realm: Realm, roomId: String, eventId: String): EventAnnotationsSummaryEntity { internal fun EventAnnotationsSummaryEntity.Companion.create(realm: MutableRealm, roomId: String, eventId: String): EventAnnotationsSummaryEntity {
val obj = realm.createObject(EventAnnotationsSummaryEntity::class.java, eventId).apply { val obj = EventAnnotationsSummaryEntity().apply {
this.eventId = eventId
this.roomId = roomId this.roomId = roomId
} }
val managedObj = realm.copyToRealm(obj)
// Denormalization // Denormalization
TimelineEventEntity.where(realm, roomId = roomId, eventId = eventId).findAll()?.forEach { TimelineEventEntity.where(realm, roomId = roomId, eventId = eventId).findAll()?.forEach {
it.annotations = obj it.annotations = obj
@ -45,11 +47,11 @@ internal fun EventAnnotationsSummaryEntity.Companion.create(realm: Realm, roomId
return obj return obj
} }
internal fun EventAnnotationsSummaryEntity.Companion.getOrCreate(realm: Realm, roomId: String, eventId: String): EventAnnotationsSummaryEntity { internal fun EventAnnotationsSummaryEntity.Companion.getOrCreate(realm: MutableRealm, roomId: String, eventId: String): EventAnnotationsSummaryEntity {
return EventAnnotationsSummaryEntity.where(realm, roomId, eventId).findFirst() return EventAnnotationsSummaryEntity.where(realm, roomId, eventId).first().find()
?: EventAnnotationsSummaryEntity.create(realm, roomId, eventId) ?: EventAnnotationsSummaryEntity.create(realm, roomId, eventId)
} }
internal fun EventAnnotationsSummaryEntity.Companion.get(realm: Realm, eventId: String): EventAnnotationsSummaryEntity? { internal fun EventAnnotationsSummaryEntity.Companion.get(realm: TypedRealm, eventId: String): EventAnnotationsSummaryEntity? {
return EventAnnotationsSummaryEntity.where(realm, eventId).findFirst() return EventAnnotationsSummaryEntity.where(realm, eventId).first().find()
} }

View File

@ -16,27 +16,34 @@
package org.matrix.android.sdk.internal.database.query package org.matrix.android.sdk.internal.database.query
import io.realm.Realm import io.realm.kotlin.MutableRealm
import io.realm.RealmList import io.realm.kotlin.TypedRealm
import io.realm.RealmQuery import io.realm.kotlin.query.RealmQuery
import io.realm.kotlin.where
import org.matrix.android.sdk.api.session.events.model.EventType 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.EventEntity
import org.matrix.android.sdk.internal.database.model.EventEntityFields 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.EventInsertEntity
import org.matrix.android.sdk.internal.database.model.EventInsertType 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 { internal fun EventEntity.copyToRealmOrIgnore(realm: MutableRealm, insertType: EventInsertType): EventEntity {
val eventEntity = realm.where<EventEntity>() val eventId = this.eventId
.equalTo(EventEntityFields.EVENT_ID, eventId) val type = this.type
.equalTo(EventEntityFields.ROOM_ID, roomId) val eventEntity = realm.query(EventEntity::class)
.findFirst() .query("eventId == $0", eventId)
.query("roomId == $0", roomId)
.first()
.find()
return if (eventEntity == null) { return if (eventEntity == null) {
val canBeProcessed = type != EventType.ENCRYPTED || decryptionResultJson != 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 this.insertType = insertType
} }
realm.insert(insertEntity) realm.copyToRealm(insertEntity)
// copy this event entity and return it // copy this event entity and return it
realm.copyToRealm(this) realm.copyToRealm(this)
} else { } else {
@ -44,44 +51,43 @@ internal fun EventEntity.copyToRealmOrIgnore(realm: Realm, insertType: EventInse
} }
} }
internal fun EventEntity.Companion.where(realm: Realm, eventId: String): RealmQuery<EventEntity> { internal fun EventEntity.Companion.where(realm: TypedRealm, eventId: String): RealmQuery<EventEntity> {
return realm.where<EventEntity>() return realm.query(EventEntity::class)
.equalTo(EventEntityFields.EVENT_ID, eventId) .query("eventId == $0", eventId)
} }
internal fun EventEntity.Companion.whereRoomId(realm: Realm, roomId: String): RealmQuery<EventEntity> { internal fun EventEntity.Companion.whereRoomId(realm: TypedRealm, roomId: String): RealmQuery<EventEntity> {
return realm.where<EventEntity>() return realm.query(EventEntity::class)
.equalTo(EventEntityFields.ROOM_ID, roomId) .query("roomId == $0", roomId)
} }
internal fun EventEntity.Companion.where(realm: Realm, eventIds: List<String>): RealmQuery<EventEntity> { internal fun EventEntity.Companion.where(realm: TypedRealm, eventIds: List<String>): RealmQuery<EventEntity> {
return realm.where<EventEntity>() return realm.query(EventEntity::class)
.`in`(EventEntityFields.EVENT_ID, eventIds.toTypedArray()) .queryIn("eventId", eventIds)
} }
internal fun EventEntity.Companion.whereType( internal fun EventEntity.Companion.whereType(
realm: Realm, realm: TypedRealm,
type: String, type: String,
roomId: String? = null roomId: String? = null
): RealmQuery<EventEntity> { ): RealmQuery<EventEntity> {
val query = realm.where<EventEntity>() return realm.query(EventEntity::class)
if (roomId != null) { .query("type == $0", type)
query.equalTo(EventEntityFields.ROOM_ID, roomId) .andIf(roomId != null){
query("roomId == $0", roomId!!)
} }
return query.equalTo(EventEntityFields.TYPE, type)
} }
internal fun EventEntity.Companion.whereTypes( internal fun EventEntity.Companion.whereTypes(
realm: Realm, realm: TypedRealm,
typeList: List<String> = emptyList(), typeList: List<String> = emptyList(),
roomId: String? = null roomId: String? = null
): RealmQuery<EventEntity> { ): RealmQuery<EventEntity> {
val query = realm.where<EventEntity>() return realm.query(EventEntity::class)
query.`in`(EventEntityFields.TYPE, typeList.toTypedArray()) .queryIn("type", typeList)
if (roomId != null) { .andIf(roomId != null){
query.equalTo(EventEntityFields.ROOM_ID, roomId) query("roomId == $0", roomId!!)
} }
return query
} }
internal fun RealmList<EventEntity>.find(eventId: String): EventEntity? { internal fun RealmList<EventEntity>.find(eventId: String): EventEntity? {

View File

@ -16,27 +16,30 @@
package org.matrix.android.sdk.internal.database.query package org.matrix.android.sdk.internal.database.query
import io.realm.Realm import io.realm.kotlin.MutableRealm
import io.realm.kotlin.createObject import io.realm.kotlin.TypedRealm
import io.realm.kotlin.where
import org.matrix.android.sdk.internal.database.model.FilterEntity import org.matrix.android.sdk.internal.database.model.FilterEntity
import org.matrix.android.sdk.internal.session.filter.FilterFactory import org.matrix.android.sdk.internal.session.filter.FilterFactory
/** /**
* Get the current filter. * Get the current filter.
*/ */
internal fun FilterEntity.Companion.get(realm: Realm): FilterEntity? { internal fun FilterEntity.Companion.get(realm: TypedRealm): FilterEntity? {
return realm.where<FilterEntity>().findFirst() return realm.query(FilterEntity::class).first().find()
} }
/** /**
* Get the current filter, create one if it does not exist. * Get the current filter, create one if it does not exist.
*/ */
internal fun FilterEntity.Companion.getOrCreate(realm: Realm): FilterEntity { internal fun FilterEntity.Companion.getOrCreate(realm: MutableRealm): FilterEntity {
return get(realm) ?: realm.createObject<FilterEntity>() return get(realm) ?: create(realm)
.apply { }
internal fun FilterEntity.Companion.create(realm: MutableRealm): FilterEntity {
val filterEntity = FilterEntity().apply {
filterBodyJson = FilterFactory.createDefaultFilter().toJSONString() filterBodyJson = FilterFactory.createDefaultFilter().toJSONString()
roomEventFilterJson = FilterFactory.createDefaultRoomFilter().toJSONString() roomEventFilterJson = FilterFactory.createDefaultRoomFilter().toJSONString()
filterId = "" filterId = ""
} }
return realm.copyToRealm(filterEntity)
} }

View File

@ -16,21 +16,25 @@
package org.matrix.android.sdk.internal.database.query package org.matrix.android.sdk.internal.database.query
import io.realm.Realm import io.realm.kotlin.MutableRealm
import io.realm.kotlin.createObject import io.realm.kotlin.TypedRealm
import io.realm.kotlin.where
import org.matrix.android.sdk.internal.database.model.HomeServerCapabilitiesEntity import org.matrix.android.sdk.internal.database.model.HomeServerCapabilitiesEntity
/** /**
* Get the current HomeServerCapabilitiesEntity, return null if it does not exist. * Get the current HomeServerCapabilitiesEntity, return null if it does not exist.
*/ */
internal fun HomeServerCapabilitiesEntity.Companion.get(realm: Realm): HomeServerCapabilitiesEntity? { internal fun HomeServerCapabilitiesEntity.Companion.get(realm: TypedRealm): HomeServerCapabilitiesEntity? {
return realm.where<HomeServerCapabilitiesEntity>().findFirst() return realm.query(HomeServerCapabilitiesEntity::class).first().find()
} }
/** /**
* Get the current HomeServerCapabilitiesEntity, create one if it does not exist. * Get the current HomeServerCapabilitiesEntity, create one if it does not exist.
*/ */
internal fun HomeServerCapabilitiesEntity.Companion.getOrCreate(realm: Realm): HomeServerCapabilitiesEntity { internal fun HomeServerCapabilitiesEntity.Companion.getOrCreate(realm: MutableRealm): HomeServerCapabilitiesEntity {
return get(realm) ?: realm.createObject() return get(realm) ?: create(realm)
} }
internal fun HomeServerCapabilitiesEntity.Companion.create(realm: MutableRealm): HomeServerCapabilitiesEntity {
return realm.copyToRealm(HomeServerCapabilitiesEntity())
}

View File

@ -16,24 +16,30 @@
package org.matrix.android.sdk.internal.database.query package org.matrix.android.sdk.internal.database.query
import io.realm.Realm import io.realm.kotlin.MutableRealm
import io.realm.kotlin.createObject import io.realm.kotlin.TypedRealm
import io.realm.kotlin.where
import org.matrix.android.sdk.internal.database.model.PreviewUrlCacheEntity 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. * Get the current PreviewUrlCacheEntity, return null if it does not exist.
*/ */
internal fun PreviewUrlCacheEntity.Companion.get(realm: Realm, url: String): PreviewUrlCacheEntity? { internal fun PreviewUrlCacheEntity.Companion.get(realm: TypedRealm, url: String): PreviewUrlCacheEntity? {
return realm.where<PreviewUrlCacheEntity>() return realm.query(PreviewUrlCacheEntity::class)
.equalTo(PreviewUrlCacheEntityFields.URL, url) .query("url == $0", url)
.findFirst() .first()
.find()
} }
/** /**
* Get the current PreviewUrlCacheEntity, create one if it does not exist. * Get the current PreviewUrlCacheEntity, create one if it does not exist.
*/ */
internal fun PreviewUrlCacheEntity.Companion.getOrCreate(realm: Realm, url: String): PreviewUrlCacheEntity { internal fun PreviewUrlCacheEntity.Companion.getOrCreate(realm: MutableRealm, url: String): PreviewUrlCacheEntity {
return get(realm, url) ?: realm.createObject(url) 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)
} }

View File

@ -15,45 +15,45 @@
*/ */
package org.matrix.android.sdk.internal.database.query package org.matrix.android.sdk.internal.database.query
import io.realm.Realm import io.realm.kotlin.TypedRealm
import io.realm.RealmQuery import io.realm.kotlin.query.RealmQuery
import io.realm.kotlin.where
import org.matrix.android.sdk.api.session.pushrules.RuleKind 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.PushRuleEntity
import org.matrix.android.sdk.internal.database.model.PushRuleEntityFields 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.PushRulesEntity
import org.matrix.android.sdk.internal.database.model.PushRulesEntityFields 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.PusherEntity
import org.matrix.android.sdk.internal.database.model.PusherEntityFields
internal fun PusherEntity.Companion.where( internal fun PusherEntity.Companion.where(
realm: Realm, realm: TypedRealm,
pushKey: String? = null pushKey: String? = null
): RealmQuery<PusherEntity> { ): RealmQuery<PusherEntity> {
return realm.where<PusherEntity>() return realm.query(PusherEntity::class)
.apply { .andIf(pushKey != null) {
if (pushKey != null) { query("pushKey == $0", pushKey!!)
equalTo(PusherEntityFields.PUSH_KEY, pushKey)
}
} }
} }
internal fun PushRulesEntity.Companion.where( internal fun PushRulesEntity.Companion.where(
realm: Realm, realm: TypedRealm,
scope: String, scope: String,
kind: RuleKind kind: RuleKind
): RealmQuery<PushRulesEntity> { ): RealmQuery<PushRulesEntity> {
return realm.where<PushRulesEntity>() return realm.query(PushRulesEntity::class)
.equalTo(PushRulesEntityFields.SCOPE, scope) .query("scope == $0", scope)
.equalTo(PushRulesEntityFields.KIND_STR, kind.name) .query("kindStr == $0", kind.name)
} }
/*
internal fun PushRuleEntity.Companion.where( internal fun PushRuleEntity.Companion.where(
realm: Realm, realm: TypedRealm,
scope: String, scope: String,
ruleId: String ruleId: String
): RealmQuery<PushRuleEntity> { ): RealmQuery<PushRuleEntity> {
return realm.where<PushRuleEntity>() return realm.query(PushRuleEntity::class)
.equalTo(PushRuleEntityFields.PARENT.SCOPE, scope) .equalTo(PushRuleEntityFields.PARENT.SCOPE, scope)
.equalTo(PushRuleEntityFields.RULE_ID, ruleId) .equalTo(PushRuleEntityFields.RULE_ID, ruleId)
} }
*/

View File

@ -16,18 +16,24 @@
package org.matrix.android.sdk.internal.database.query package org.matrix.android.sdk.internal.database.query
import io.realm.Realm import io.realm.kotlin.MutableRealm
import io.realm.RealmQuery import io.realm.kotlin.TypedRealm
import io.realm.kotlin.createObject import io.realm.kotlin.query.RealmQuery
import io.realm.kotlin.where
import org.matrix.android.sdk.internal.database.model.ReadMarkerEntity 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<ReadMarkerEntity> { internal fun ReadMarkerEntity.Companion.where(realm: TypedRealm, roomId: String): RealmQuery<ReadMarkerEntity> {
return realm.where<ReadMarkerEntity>() return realm.query(ReadMarkerEntity::class)
.equalTo(ReadMarkerEntityFields.ROOM_ID, roomId) .query("roomId == $0", roomId)
} }
internal fun ReadMarkerEntity.Companion.getOrCreate(realm: Realm, roomId: String): ReadMarkerEntity { internal fun ReadMarkerEntity.Companion.getOrCreate(realm: MutableRealm, roomId: String): ReadMarkerEntity {
return where(realm, roomId).findFirst() ?: realm.createObject(roomId) 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)
}

View File

@ -16,21 +16,19 @@
package org.matrix.android.sdk.internal.database.query package org.matrix.android.sdk.internal.database.query
import io.realm.Realm import io.realm.kotlin.MutableRealm
import io.realm.RealmQuery import io.realm.kotlin.Realm
import io.realm.kotlin.createObject import io.realm.kotlin.query.RealmQuery
import io.realm.kotlin.where
import org.matrix.android.sdk.internal.database.model.ReadReceiptEntity 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<ReadReceiptEntity> { internal fun ReadReceiptEntity.Companion.where(realm: Realm, roomId: String, userId: String): RealmQuery<ReadReceiptEntity> {
return realm.where<ReadReceiptEntity>() return realm.query(ReadReceiptEntity::class)
.equalTo(ReadReceiptEntityFields.PRIMARY_KEY, buildPrimaryKey(roomId, userId)) .query("primaryKey == $0", buildPrimaryKey(roomId, userId))
} }
internal fun ReadReceiptEntity.Companion.whereUserId(realm: Realm, userId: String): RealmQuery<ReadReceiptEntity> { internal fun ReadReceiptEntity.Companion.whereUserId(realm: Realm, userId: String): RealmQuery<ReadReceiptEntity> {
return realm.where<ReadReceiptEntity>() return realm.query(ReadReceiptEntity::class)
.equalTo(ReadReceiptEntityFields.USER_ID, userId) .query("userId == $0", userId)
} }
internal fun ReadReceiptEntity.Companion.createUnmanaged(roomId: String, eventId: String, userId: String, originServerTs: Double): ReadReceiptEntity { 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 { internal fun ReadReceiptEntity.Companion.getOrCreate(realm: MutableRealm, roomId: String, userId: String): ReadReceiptEntity {
return ReadReceiptEntity.where(realm, roomId, userId).findFirst() return ReadReceiptEntity.where(realm, roomId, userId).first()
?: realm.createObject<ReadReceiptEntity>(buildPrimaryKey(roomId, userId)) ?: {
.apply { val entity = ReadReceiptEntity().apply {
this.primaryKey = buildPrimaryKey(roomId, userId)
this.roomId = roomId this.roomId = roomId
this.userId = userId this.userId = userId
} }
realm.copyToRealm(entity)
}
} }
private fun buildPrimaryKey(roomId: String, userId: String) = "${roomId}_$userId" private fun buildPrimaryKey(roomId: String, userId: String) = "${roomId}_$userId"

View File

@ -16,18 +16,18 @@
package org.matrix.android.sdk.internal.database.query package org.matrix.android.sdk.internal.database.query
import io.realm.Realm import io.realm.kotlin.TypedRealm
import io.realm.RealmQuery import io.realm.kotlin.query.RealmQuery
import io.realm.kotlin.where import io.realm.kotlin.query.RealmSingleQuery
import org.matrix.android.sdk.internal.database.model.ReadReceiptsSummaryEntity 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<ReadReceiptsSummaryEntity> { internal fun ReadReceiptsSummaryEntity.Companion.where(realm: TypedRealm, eventId: String): RealmSingleQuery<ReadReceiptsSummaryEntity> {
return realm.where<ReadReceiptsSummaryEntity>() return realm.query(ReadReceiptsSummaryEntity::class)
.equalTo(ReadReceiptsSummaryEntityFields.EVENT_ID, eventId) .query("eventId == $0", eventId)
.first()
} }
internal fun ReadReceiptsSummaryEntity.Companion.whereInRoom(realm: Realm, roomId: String): RealmQuery<ReadReceiptsSummaryEntity> { internal fun ReadReceiptsSummaryEntity.Companion.whereInRoom(realm: TypedRealm, roomId: String): RealmQuery<ReadReceiptsSummaryEntity> {
return realm.where<ReadReceiptsSummaryEntity>() return realm.query(ReadReceiptsSummaryEntity::class)
.equalTo(ReadReceiptsSummaryEntityFields.ROOM_ID, roomId) .query("roomId == $0", roomId)
} }

View File

@ -16,32 +16,38 @@
package org.matrix.android.sdk.internal.database.query package org.matrix.android.sdk.internal.database.query
import io.realm.Realm import io.realm.kotlin.MutableRealm
import io.realm.RealmQuery import io.realm.kotlin.TypedRealm
import io.realm.kotlin.where import io.realm.kotlin.query.RealmQuery
import org.matrix.android.sdk.api.session.room.model.Membership 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.EventEntity
import org.matrix.android.sdk.internal.database.model.RoomEntity 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 import org.matrix.android.sdk.internal.extensions.realm
internal fun RoomEntity.Companion.where(realm: Realm, roomId: String): RealmQuery<RoomEntity> { internal fun RoomEntity.Companion.where(realm: TypedRealm, roomId: String): RealmQuery<RoomEntity> {
return realm.where<RoomEntity>() return realm.query(RoomEntity::class)
.equalTo(RoomEntityFields.ROOM_ID, roomId) .query("roomId == $0", roomId)
} }
internal fun RoomEntity.Companion.getOrCreate(realm: Realm, roomId: String): RoomEntity { internal fun RoomEntity.Companion.getOrCreate(realm: MutableRealm, roomId: String): RoomEntity {
return where(realm, roomId).findFirst() ?: realm.createObject(RoomEntity::class.java, roomId) return where(realm, roomId).first().find() ?: create(realm, roomId)
} }
internal fun RoomEntity.Companion.where(realm: Realm, membership: Membership? = null): RealmQuery<RoomEntity> { internal fun RoomEntity.Companion.create(realm: MutableRealm, roomId: String): RoomEntity {
val query = realm.where<RoomEntity>() val entity = RoomEntity().apply {
if (membership != null) { this.roomId = roomId
query.equalTo(RoomEntityFields.MEMBERSHIP_STR, membership.name)
} }
return query return realm.copyToRealm(entity)
} }
internal fun RoomEntity.fastContains(eventId: String): Boolean { internal fun RoomEntity.Companion.where(realm: TypedRealm, membership: Membership? = null): RealmQuery<RoomEntity> {
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 return EventEntity.where(realm, eventId = eventId).findFirst() != null
} }

View File

@ -16,29 +16,26 @@
package org.matrix.android.sdk.internal.database.query package org.matrix.android.sdk.internal.database.query
import io.realm.Realm import io.realm.kotlin.MutableRealm
import io.realm.RealmQuery import io.realm.kotlin.TypedRealm
import io.realm.kotlin.where 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.RoomMemberSummaryEntity
import org.matrix.android.sdk.internal.database.model.RoomMemberSummaryEntityFields
import org.matrix.android.sdk.internal.database.model.presence.UserPresenceEntity import org.matrix.android.sdk.internal.database.model.presence.UserPresenceEntity
internal fun RoomMemberSummaryEntity.Companion.where(realm: Realm, roomId: String, userId: String? = null): RealmQuery<RoomMemberSummaryEntity> { internal fun RoomMemberSummaryEntity.Companion.where(realm: TypedRealm, roomId: String, userId: String? = null): RealmQuery<RoomMemberSummaryEntity> {
val query = realm return realm.query(RoomMemberSummaryEntity::class)
.where<RoomMemberSummaryEntity>() .query("roomId == $0", roomId)
.equalTo(RoomMemberSummaryEntityFields.ROOM_ID, roomId) .andIf(userId != null) {
query("userId == $0", userId!!)
if (userId != null) {
query.equalTo(RoomMemberSummaryEntityFields.USER_ID, userId)
} }
return query
} }
internal fun RoomMemberSummaryEntity.Companion.updateUserPresence(realm: Realm, userId: String, userPresenceEntity: UserPresenceEntity) { internal fun RoomMemberSummaryEntity.Companion.updateUserPresence(realm: MutableRealm, userId: String, userPresenceEntity: UserPresenceEntity) {
realm.where<RoomMemberSummaryEntity>() realm.query(RoomMemberSummaryEntity::class)
.equalTo(RoomMemberSummaryEntityFields.USER_ID, userId) .query("userId == $0", userId)
.isNull(RoomMemberSummaryEntityFields.USER_PRESENCE_ENTITY.`$`) .query("userPresenceEntity == nil")
.findAll() .find()
.map { .map {
it.userPresenceEntity = userPresenceEntity it.userPresenceEntity = userPresenceEntity
} }

View File

@ -16,14 +16,12 @@
package org.matrix.android.sdk.internal.database.query package org.matrix.android.sdk.internal.database.query
import io.realm.Realm import io.realm.kotlin.TypedRealm
import io.realm.RealmQuery import io.realm.kotlin.query.RealmQuery
import io.realm.kotlin.where
import org.matrix.android.sdk.internal.database.model.ScalarTokenEntity 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<ScalarTokenEntity> { internal fun ScalarTokenEntity.Companion.where(realm: TypedRealm, serverUrl: String): RealmQuery<ScalarTokenEntity> {
return realm return realm
.where<ScalarTokenEntity>() .query(ScalarTokenEntity::class)
.equalTo(ScalarTokenEntityFields.SERVER_URL, serverUrl) .query("serverUrl == $0", serverUrl)
} }

View File

@ -16,62 +16,59 @@
package org.matrix.android.sdk.internal.database.query package org.matrix.android.sdk.internal.database.query
import io.realm.Realm import io.realm.kotlin.TypedRealm
import io.realm.RealmList import io.realm.kotlin.query.RealmQuery
import io.realm.RealmQuery
import io.realm.RealmResults
import io.realm.Sort
import io.realm.kotlin.where
import org.matrix.android.sdk.api.session.room.send.SendState 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.api.session.room.timeline.TimelineEventFilters
import org.matrix.android.sdk.internal.database.model.ChunkEntity 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.RoomEntity
import org.matrix.android.sdk.internal.database.model.TimelineEventEntity 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.model.TimelineEventEntityFields
import org.matrix.android.sdk.internal.database.queryIn
internal fun TimelineEventEntity.Companion.where(realm: Realm): RealmQuery<TimelineEventEntity> { internal fun TimelineEventEntity.Companion.where(realm: TypedRealm): RealmQuery<TimelineEventEntity> {
return realm.where() return realm.query(TimelineEventEntity::class)
} }
internal fun TimelineEventEntity.Companion.where( internal fun TimelineEventEntity.Companion.where(
realm: Realm, realm: TypedRealm,
roomId: String, roomId: String,
eventId: String eventId: String
): RealmQuery<TimelineEventEntity> { ): RealmQuery<TimelineEventEntity> {
return where(realm) return where(realm)
.equalTo(TimelineEventEntityFields.ROOM_ID, roomId) .query("roomId == $0", roomId)
.equalTo(TimelineEventEntityFields.EVENT_ID, eventId) .query("evendId == $0", eventId)
} }
internal fun TimelineEventEntity.Companion.where( internal fun TimelineEventEntity.Companion.where(
realm: Realm, realm: TypedRealm,
roomId: String, roomId: String,
eventIds: List<String> eventIds: List<String>
): RealmQuery<TimelineEventEntity> { ): RealmQuery<TimelineEventEntity> {
return where(realm) return where(realm)
.equalTo(TimelineEventEntityFields.ROOM_ID, roomId) .query("roomId == $0", roomId)
.`in`(TimelineEventEntityFields.EVENT_ID, eventIds.toTypedArray()) .queryIn("evendId", eventIds)
} }
internal fun TimelineEventEntity.Companion.whereRoomId( internal fun TimelineEventEntity.Companion.whereRoomId(
realm: Realm, realm: TypedRealm,
roomId: String roomId: String
): RealmQuery<TimelineEventEntity> { ): RealmQuery<TimelineEventEntity> {
return where(realm) return where(realm)
.equalTo(TimelineEventEntityFields.ROOM_ID, roomId) .query("roomId == $0", roomId)
} }
internal fun TimelineEventEntity.Companion.findWithSenderMembershipEvent( internal fun TimelineEventEntity.Companion.findWithSenderMembershipEvent(
realm: Realm, realm: TypedRealm,
senderMembershipEventId: String senderMembershipEventId: String
): List<TimelineEventEntity> { ): List<TimelineEventEntity> {
return where(realm) return where(realm)
.equalTo(TimelineEventEntityFields.SENDER_MEMBERSHIP_EVENT_ID, senderMembershipEventId) .query("senderMembershipEventId == $0", senderMembershipEventId)
.findAll() .find()
} }
internal fun TimelineEventEntity.Companion.latestEvent( internal fun TimelineEventEntity.Companion.latestEvent(
realm: Realm, realm: TypedRealm,
roomId: String, roomId: String,
includesSending: Boolean, includesSending: Boolean,
filters: TimelineEventFilters = TimelineEventFilters() filters: TimelineEventFilters = TimelineEventFilters()

View File

@ -16,14 +16,12 @@
package org.matrix.android.sdk.internal.database.query package org.matrix.android.sdk.internal.database.query
import io.realm.Realm import io.realm.kotlin.TypedRealm
import io.realm.RealmQuery import io.realm.kotlin.query.RealmQuery
import io.realm.kotlin.where
import org.matrix.android.sdk.internal.database.model.UserEntity 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<UserEntity> { internal fun UserEntity.Companion.where(realm: TypedRealm, userId: String): RealmQuery<UserEntity> {
return realm return realm
.where<UserEntity>() .query(UserEntity::class)
.equalTo(UserEntityFields.USER_ID, userId) .query("userId == $0", userId)
} }

View File

@ -16,14 +16,12 @@
package org.matrix.android.sdk.internal.database.query package org.matrix.android.sdk.internal.database.query
import io.realm.Realm import io.realm.kotlin.TypedRealm
import io.realm.RealmQuery import io.realm.kotlin.query.RealmQuery
import io.realm.kotlin.where
import org.matrix.android.sdk.internal.database.model.presence.UserPresenceEntity 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<UserPresenceEntity> { internal fun UserPresenceEntity.Companion.where(realm: TypedRealm, userId: String): RealmQuery<UserPresenceEntity> {
return realm return realm
.where<UserPresenceEntity>() .query(UserPresenceEntity::class)
.equalTo(UserPresenceEntityFields.USER_ID, userId) .query("userId == $0", userId)
} }

View File

@ -17,6 +17,7 @@
package org.matrix.android.sdk.internal.session.room.summary package org.matrix.android.sdk.internal.session.room.summary
import io.realm.Realm import io.realm.Realm
import io.realm.kotlin.MutableRealm
import io.realm.kotlin.createObject import io.realm.kotlin.createObject
import io.realm.kotlin.deleteFromRealm import io.realm.kotlin.deleteFromRealm
import kotlinx.coroutines.runBlocking 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. * 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 { measureTimeMillis {
val lookupMap = realm.where(RoomSummaryEntity::class.java) val lookupMap = realm.where(RoomSummaryEntity::class.java)
.process(RoomSummaryEntityFields.MEMBERSHIP_STR, Membership.activeMemberships()) .process(RoomSummaryEntityFields.MEMBERSHIP_STR, Membership.activeMemberships())

View File

@ -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.api.session.sync.model.SyncResponse
import org.matrix.android.sdk.internal.SessionManager import org.matrix.android.sdk.internal.SessionManager
import org.matrix.android.sdk.internal.crypto.DefaultCryptoService 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.SessionDatabase
import org.matrix.android.sdk.internal.di.SessionId import org.matrix.android.sdk.internal.di.SessionId
import org.matrix.android.sdk.internal.session.SessionListeners import org.matrix.android.sdk.internal.session.SessionListeners
@ -40,7 +41,7 @@ import javax.inject.Inject
import kotlin.system.measureTimeMillis import kotlin.system.measureTimeMillis
internal class SyncResponseHandler @Inject constructor( internal class SyncResponseHandler @Inject constructor(
@SessionDatabase private val monarchy: Monarchy, @SessionDatabase private val realmInstance: RealmInstance,
@SessionId private val sessionId: String, @SessionId private val sessionId: String,
private val sessionManager: SessionManager, private val sessionManager: SessionManager,
private val sessionListeners: SessionListeners, private val sessionListeners: SessionListeners,
@ -94,13 +95,13 @@ internal class SyncResponseHandler @Inject constructor(
// } // }
// Start one big transaction // Start one big transaction
monarchy.awaitTransaction { realm -> realmInstance.write {
// IMPORTANT nothing should be suspend here as we are accessing the realm instance (thread local) // IMPORTANT nothing should be suspend here as we are accessing the realm instance (thread local)
measureTimeMillis { measureTimeMillis {
Timber.v("Handle rooms") Timber.v("Handle rooms")
reportSubtask(reporter, InitialSyncStep.ImportingAccountRoom, 1, 0.8f) { reportSubtask(reporter, InitialSyncStep.ImportingAccountRoom, 1, 0.8f) {
if (syncResponse.rooms != null) { if (syncResponse.rooms != null) {
roomSyncHandler.handle(realm, syncResponse.rooms, isInitialSync, aggregator, reporter) roomSyncHandler.handle(this, syncResponse.rooms, isInitialSync, aggregator, reporter)
} }
} }
}.also { }.also {
@ -110,7 +111,7 @@ internal class SyncResponseHandler @Inject constructor(
measureTimeMillis { measureTimeMillis {
reportSubtask(reporter, InitialSyncStep.ImportingAccountData, 1, 0.1f) { reportSubtask(reporter, InitialSyncStep.ImportingAccountData, 1, 0.1f) {
Timber.v("Handle accountData") Timber.v("Handle accountData")
userAccountDataSyncHandler.handle(realm, syncResponse.accountData) userAccountDataSyncHandler.handle(this, syncResponse.accountData)
} }
}.also { }.also {
Timber.v("Finish handling accountData in $it ms") Timber.v("Finish handling accountData in $it ms")
@ -118,11 +119,11 @@ internal class SyncResponseHandler @Inject constructor(
measureTimeMillis { measureTimeMillis {
Timber.v("Handle Presence") Timber.v("Handle Presence")
presenceSyncHandler.handle(realm, syncResponse.presence) presenceSyncHandler.handle(this, syncResponse.presence)
}.also { }.also {
Timber.v("Finish handling Presence in $it ms") 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 // Everything else we need to do outside the transaction
@ -138,8 +139,8 @@ internal class SyncResponseHandler @Inject constructor(
cryptoSyncHandler.onSyncCompleted(syncResponse) cryptoSyncHandler.onSyncCompleted(syncResponse)
// post sync stuffs // post sync stuffs
monarchy.writeAsync { realmInstance.asyncWrite {
roomSyncHandler.postSyncSpaceHierarchyHandle(it) roomSyncHandler.postSyncSpaceHierarchyHandle(this)
} }
} }

View File

@ -16,25 +16,25 @@
package org.matrix.android.sdk.internal.session.sync package org.matrix.android.sdk.internal.session.sync
import com.zhuinden.monarchy.Monarchy import io.realm.kotlin.MutableRealm
import io.realm.Realm 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.database.model.SyncEntity
import org.matrix.android.sdk.internal.di.SessionDatabase import org.matrix.android.sdk.internal.di.SessionDatabase
import javax.inject.Inject 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? { fun getLastToken(): String? {
val token = Realm.getInstance(monarchy.realmConfiguration).use { return realmInstance.getBlockingRealm()
// Makes sure realm is up-to-date as it's used for querying internally on non looper thread. .query(SyncEntity::class)
it.refresh() .first()
it.where(SyncEntity::class.java).findFirst()?.nextBatch .find()
} ?.nextBatch
return token
} }
fun saveToken(realm: Realm, token: String?) { fun saveToken(realm: MutableRealm, token: String?) {
val sync = SyncEntity(token) val sync = SyncEntity().apply { nextBatch = token }
realm.insertOrUpdate(sync) realm.copyToRealm(sync, updatePolicy = UpdatePolicy.ALL)
} }
} }

View File

@ -16,7 +16,8 @@
package org.matrix.android.sdk.internal.session.sync.handler 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.MatrixConfiguration
import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.api.session.events.model.EventType
import org.matrix.android.sdk.api.session.events.model.getPresenceContent 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) { internal class PresenceSyncHandler @Inject constructor(private val matrixConfiguration: MatrixConfiguration) {
fun handle(realm: Realm, presenceSyncResponse: PresenceSyncResponse?) { fun handle(realm: MutableRealm, presenceSyncResponse: PresenceSyncResponse?) {
presenceSyncResponse?.events presenceSyncResponse?.events
?.filter { event -> event.type == EventType.PRESENCE } ?.filter { event -> event.type == EventType.PRESENCE }
?.forEach { event -> ?.forEach { event ->
val content = event.getPresenceContent() ?: return@forEach val content = event.getPresenceContent() ?: return@forEach
val userId = event.senderId ?: return@forEach val senderId = event.senderId ?: return@forEach
val userPresenceEntity = UserPresenceEntity( val userPresenceEntity = UserPresenceEntity().apply {
userId = userId, userId = senderId
lastActiveAgo = content.lastActiveAgo, lastActiveAgo = content.lastActiveAgo
statusMessage = content.statusMessage, statusMessage = content.statusMessage
isCurrentlyActive = content.isCurrentlyActive, isCurrentlyActive = content.isCurrentlyActive
avatarUrl = content.avatarUrl, avatarUrl = content.avatarUrl
displayName = content.displayName displayName = content.displayName
).also { presence = content.presence
it.presence = content.presence
} }
storePresenceToDB(realm, userPresenceEntity) 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. * Store user presence to DB and update Direct Rooms and Room Member Summaries accordingly.
*/ */
private fun storePresenceToDB(realm: Realm, userPresenceEntity: UserPresenceEntity) = private fun storePresenceToDB(realm: MutableRealm, userPresenceEntity: UserPresenceEntity) =
realm.copyToRealmOrUpdate(userPresenceEntity)?.apply { realm.copyToRealm(userPresenceEntity, updatePolicy = UpdatePolicy.ALL)?.also {
RoomSummaryEntity.updateDirectUserPresence(realm, userPresenceEntity.userId, this) RoomSummaryEntity.updateDirectUserPresence(realm, userPresenceEntity.userId, this)
RoomMemberSummaryEntity.updateUserPresence(realm, userPresenceEntity.userId, this) RoomMemberSummaryEntity.updateUserPresence(realm, userPresenceEntity.userId, this)
} }

View File

@ -16,10 +16,11 @@
package org.matrix.android.sdk.internal.session.sync.handler 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.MatrixPatterns
import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.extensions.tryOrNull
import org.matrix.android.sdk.api.session.user.model.User 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.di.SessionDatabase
import org.matrix.android.sdk.internal.session.profile.GetProfileInfoTask import org.matrix.android.sdk.internal.session.profile.GetProfileInfoTask
import org.matrix.android.sdk.internal.session.sync.RoomSyncEphemeralTemporaryStore 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.UserEntityFactory
import org.matrix.android.sdk.internal.session.user.accountdata.DirectChatsHelper 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.session.user.accountdata.UpdateUserAccountDataTask
import org.matrix.android.sdk.internal.util.awaitTransaction
import javax.inject.Inject import javax.inject.Inject
internal class SyncResponsePostTreatmentAggregatorHandler @Inject constructor( internal class SyncResponsePostTreatmentAggregatorHandler @Inject constructor(
@ -36,7 +36,7 @@ internal class SyncResponsePostTreatmentAggregatorHandler @Inject constructor(
private val ephemeralTemporaryStore: RoomSyncEphemeralTemporaryStore, private val ephemeralTemporaryStore: RoomSyncEphemeralTemporaryStore,
private val updateUserAccountDataTask: UpdateUserAccountDataTask, private val updateUserAccountDataTask: UpdateUserAccountDataTask,
private val getProfileInfoTask: GetProfileInfoTask, private val getProfileInfoTask: GetProfileInfoTask,
@SessionDatabase private val monarchy: Monarchy, @SessionDatabase private val realmInstance: RealmInstance,
) { ) {
suspend fun handle(aggregator: SyncResponsePostTreatmentAggregator) { suspend fun handle(aggregator: SyncResponsePostTreatmentAggregator) {
cleanupEphemeralFiles(aggregator.ephemeralFilesToDelete) cleanupEphemeralFiles(aggregator.ephemeralFilesToDelete)
@ -93,9 +93,11 @@ internal class SyncResponsePostTreatmentAggregatorHandler @Inject constructor(
} }
private suspend fun List<User>.saveLocally() { private suspend fun List<User>.saveLocally() {
val userEntities = map { user -> UserEntityFactory.create(user) } realmInstance.write {
monarchy.awaitTransaction { forEach { user ->
it.insertOrUpdate(userEntities) val userEntity = UserEntityFactory.create(user)
copyToRealm(userEntity, updatePolicy = UpdatePolicy.ALL)
}
} }
} }
} }

View File

@ -19,6 +19,8 @@ package org.matrix.android.sdk.internal.session.sync.handler
import com.zhuinden.monarchy.Monarchy import com.zhuinden.monarchy.Monarchy
import io.realm.Realm import io.realm.Realm
import io.realm.RealmList import io.realm.RealmList
import io.realm.kotlin.MutableRealm
import io.realm.kotlin.UpdatePolicy
import io.realm.kotlin.where import io.realm.kotlin.where
import org.matrix.android.sdk.api.failure.GlobalError import org.matrix.android.sdk.api.failure.GlobalError
import org.matrix.android.sdk.api.failure.InitialSyncRequestReason import org.matrix.android.sdk.api.failure.InitialSyncRequestReason
@ -79,7 +81,7 @@ internal class UserAccountDataSyncHandler @Inject constructor(
private val sessionListeners: SessionListeners private val sessionListeners: SessionListeners
) { ) {
fun handle(realm: Realm, accountData: UserAccountDataSync?) { fun handle(realm: MutableRealm, accountData: UserAccountDataSync?) {
accountData?.list?.forEach { event -> accountData?.list?.forEach { event ->
// Generic handling, just save in base // Generic handling, just save in base
handleGenericAccountData(realm, event.type, event.content) 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<GetPushRulesResponse>() ?: return val pushRules = event.content.toModel<GetPushRulesResponse>() ?: return
realm.where(PushRulesEntity::class.java) realm
.findAll() .query(PushRulesEntity::class)
.forEach { it.deleteOnCascade() } .find()
.forEach {
//it.deleteOnCascade()
}
// Save only global rules for the moment // Save only global rules for the moment
val globalRules = pushRules.global 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 -> globalRules.content?.forEach { rule ->
content.pushRules.add(PushRulesMapper.map(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 -> globalRules.override?.forEach { rule ->
PushRulesMapper.map(rule).also { PushRulesMapper.map(rule).also {
override.pushRules.add(it) 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 -> globalRules.room?.forEach { rule ->
rooms.pushRules.add(PushRulesMapper.map(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 -> globalRules.sender?.forEach { rule ->
senders.pushRules.add(PushRulesMapper.map(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 -> globalRules.underride?.forEach { rule ->
underrides.pushRules.add(PushRulesMapper.map(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<DirectMessagesContent>() ?: return val content = event.content.toModel<DirectMessagesContent>() ?: return
content.forEach { (userId, roomIds) -> content.forEach { (userId, roomIds) ->
roomIds.forEach { roomId -> 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<IgnoredUsersContent>()?.ignoredUsers?.keys ?: return val userIds = event.content.toModel<IgnoredUsersContent>()?.ignoredUsers?.keys ?: return
val currentIgnoredUsers = realm.where(IgnoredUserEntity::class.java).findAll() val currentIgnoredUsers = realm.query(IgnoredUserEntity::class).find()
val currentIgnoredUserIds = currentIgnoredUsers.map { it.userId } val currentIgnoredUserIds = currentIgnoredUsers.map { it.userId }
// Delete the previous list // Delete the previous list
currentIgnoredUsers.deleteAllFromRealm() realm.delete(currentIgnoredUsers)
// And save the new received list // 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 // Delete all the TimelineEvents for all the ignored users
// See https://spec.matrix.org/latest/client-server-api/#client-behaviour-22 : // 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<BreadcrumbsContent>()?.recentRoomIds ?: return val recentRoomIds = event.content.toModel<BreadcrumbsContent>()?.recentRoomIds ?: return
val entity = BreadcrumbsEntity.getOrCreate(realm) 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<UserAccountDataEntity>() val existing = realm.where<UserAccountDataEntity>()
.equalTo(UserAccountDataEntityFields.TYPE, type) .equalTo(UserAccountDataEntityFields.TYPE, type)
.findFirst() .findFirst()

View File

@ -16,12 +16,14 @@
package org.matrix.android.sdk.internal.session.sync.handler.room 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.api.session.events.model.EventType
import org.matrix.android.sdk.internal.database.model.ReadReceiptEntity 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.model.ReadReceiptsSummaryEntity
import org.matrix.android.sdk.internal.database.query.createUnmanaged 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.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.database.query.where
import org.matrix.android.sdk.internal.session.sync.RoomSyncEphemeralTemporaryStore import org.matrix.android.sdk.internal.session.sync.RoomSyncEphemeralTemporaryStore
import org.matrix.android.sdk.internal.session.sync.SyncResponsePostTreatmentAggregator import org.matrix.android.sdk.internal.session.sync.SyncResponsePostTreatmentAggregator
@ -62,7 +64,7 @@ internal class ReadReceiptHandler @Inject constructor(
} }
fun handle( fun handle(
realm: Realm, realm: MutableRealm,
roomId: String, roomId: String,
content: ReadReceiptContent?, content: ReadReceiptContent?,
isInitialSync: Boolean, isInitialSync: Boolean,
@ -78,7 +80,7 @@ internal class ReadReceiptHandler @Inject constructor(
} }
private fun handleReadReceiptContent( private fun handleReadReceiptContent(
realm: Realm, realm: MutableRealm,
roomId: String, roomId: String,
content: ReadReceiptContent, content: ReadReceiptContent,
isInitialSync: Boolean, isInitialSync: Boolean,
@ -91,24 +93,29 @@ internal class ReadReceiptHandler @Inject constructor(
} }
} }
private fun initialSyncStrategy(realm: Realm, roomId: String, content: ReadReceiptContent) { private fun initialSyncStrategy(realm: MutableRealm, roomId: String, content: ReadReceiptContent) {
val readReceiptSummaries = ArrayList<ReadReceiptsSummaryEntity>()
for ((eventId, receiptDict) in content) { for ((eventId, receiptDict) in content) {
val userIdsDict = receiptDict[READ_KEY] ?: continue 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) { for ((userId, paramsDict) in userIdsDict) {
val ts = paramsDict[TIMESTAMP_KEY] ?: 0.0 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) readReceiptsSummary.readReceipts.add(receiptEntity)
} }
readReceiptSummaries.add(readReceiptsSummary) realm.copyToRealm(readReceiptsSummary, updatePolicy = UpdatePolicy.ALL)
} }
realm.insertOrUpdate(readReceiptSummaries)
} }
private fun incrementalSyncStrategy( private fun incrementalSyncStrategy(
realm: Realm, realm: MutableRealm,
roomId: String, roomId: String,
content: ReadReceiptContent, content: ReadReceiptContent,
aggregator: SyncResponsePostTreatmentAggregator? aggregator: SyncResponsePostTreatmentAggregator?
@ -123,10 +130,10 @@ internal class ReadReceiptHandler @Inject constructor(
doIncrementalSyncStrategy(realm, roomId, content) 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) { for ((eventId, receiptDict) in content) {
val userIdsDict = receiptDict[READ_KEY] ?: continue 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 { ?: realm.createObject(ReadReceiptsSummaryEntity::class.java, eventId).apply {
this.roomId = roomId this.roomId = roomId
} }

View File

@ -17,7 +17,7 @@
package org.matrix.android.sdk.internal.session.sync.handler.room package org.matrix.android.sdk.internal.session.sync.handler.room
import dagger.Lazy import dagger.Lazy
import io.realm.Realm import io.realm.kotlin.MutableRealm
import io.realm.kotlin.createObject import io.realm.kotlin.createObject
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import org.matrix.android.sdk.api.crypto.MXCRYPTO_ALGORITHM_MEGOLM import org.matrix.android.sdk.api.crypto.MXCRYPTO_ALGORITHM_MEGOLM
@ -108,7 +108,7 @@ internal class RoomSyncHandler @Inject constructor(
} }
fun handle( fun handle(
realm: Realm, realm: MutableRealm,
roomsSyncResponse: RoomsSyncResponse, roomsSyncResponse: RoomsSyncResponse,
isInitialSync: Boolean, isInitialSync: Boolean,
aggregator: SyncResponsePostTreatmentAggregator, aggregator: SyncResponsePostTreatmentAggregator,
@ -122,13 +122,13 @@ internal class RoomSyncHandler @Inject constructor(
// roomSummaryUpdater.validateSpaceRelationship(realm) // roomSummaryUpdater.validateSpaceRelationship(realm)
} }
fun postSyncSpaceHierarchyHandle(realm: Realm) { fun postSyncSpaceHierarchyHandle(realm: MutableRealm) {
roomSummaryUpdater.validateSpaceRelationship(realm) roomSummaryUpdater.validateSpaceRelationship(realm)
} }
// PRIVATE METHODS ***************************************************************************** // PRIVATE METHODS *****************************************************************************
private fun handleRoomSync( private fun handleRoomSync(
realm: Realm, realm: MutableRealm,
handlingStrategy: HandlingStrategy, handlingStrategy: HandlingStrategy,
isInitialSync: Boolean, isInitialSync: Boolean,
aggregator: SyncResponsePostTreatmentAggregator, aggregator: SyncResponsePostTreatmentAggregator,
@ -140,7 +140,7 @@ internal class RoomSyncHandler @Inject constructor(
EventInsertType.INCREMENTAL_SYNC EventInsertType.INCREMENTAL_SYNC
} }
val syncLocalTimeStampMillis = clock.epochMillis() val syncLocalTimeStampMillis = clock.epochMillis()
val rooms = when (handlingStrategy) { when (handlingStrategy) {
is HandlingStrategy.JOINED -> { is HandlingStrategy.JOINED -> {
if (isInitialSync && initialSyncStrategy is InitialSyncStrategy.Optimized) { if (isInitialSync && initialSyncStrategy is InitialSyncStrategy.Optimized) {
insertJoinRoomsFromInitSync(realm, handlingStrategy, syncLocalTimeStampMillis, aggregator, reporter) insertJoinRoomsFromInitSync(realm, handlingStrategy, syncLocalTimeStampMillis, aggregator, reporter)
@ -163,11 +163,10 @@ internal class RoomSyncHandler @Inject constructor(
} }
} }
} }
realm.insertOrUpdate(rooms)
} }
private fun insertJoinRoomsFromInitSync( private fun insertJoinRoomsFromInitSync(
realm: Realm, realm: MutableRealm,
handlingStrategy: HandlingStrategy.JOINED, handlingStrategy: HandlingStrategy.JOINED,
syncLocalTimeStampMillis: Long, syncLocalTimeStampMillis: Long,
aggregator: SyncResponsePostTreatmentAggregator, aggregator: SyncResponsePostTreatmentAggregator,
@ -211,7 +210,7 @@ internal class RoomSyncHandler @Inject constructor(
} }
private fun handleJoinedRoom( private fun handleJoinedRoom(
realm: Realm, realm: MutableRealm,
roomId: String, roomId: String,
roomSync: RoomSync, roomSync: RoomSync,
insertType: EventInsertType, insertType: EventInsertType,
@ -291,7 +290,7 @@ internal class RoomSyncHandler @Inject constructor(
} }
private fun handleInvitedRoom( private fun handleInvitedRoom(
realm: Realm, realm: MutableRealm,
roomId: String, roomId: String,
roomSync: InvitedRoomSync, roomSync: InvitedRoomSync,
insertType: EventInsertType, insertType: EventInsertType,
@ -324,7 +323,7 @@ internal class RoomSyncHandler @Inject constructor(
} }
private fun handleLeftRoom( private fun handleLeftRoom(
realm: Realm, realm: MutableRealm,
roomId: String, roomId: String,
roomSync: RoomSync, roomSync: RoomSync,
insertType: EventInsertType, insertType: EventInsertType,
@ -371,7 +370,7 @@ internal class RoomSyncHandler @Inject constructor(
} }
private fun handleTimelineEvents( private fun handleTimelineEvents(
realm: Realm, realm: MutableRealm,
roomId: String, roomId: String,
roomEntity: RoomEntity, roomEntity: RoomEntity,
eventList: List<Event>, eventList: List<Event>,
@ -519,7 +518,7 @@ internal class RoomSyncHandler @Inject constructor(
* the thread timeline and /relations api, we should not added it * the thread timeline and /relations api, we should not added it
*/ */
private fun addToThreadChunkIfNeeded( private fun addToThreadChunkIfNeeded(
realm: Realm, realm: MutableRealm,
roomId: String, roomId: String,
threadId: String, threadId: String,
timelineEventEntity: TimelineEventEntity?, timelineEventEntity: TimelineEventEntity?,
@ -567,7 +566,7 @@ internal class RoomSyncHandler @Inject constructor(
) )
private fun handleEphemeral( private fun handleEphemeral(
realm: Realm, realm: MutableRealm,
roomId: String, roomId: String,
ephemeralEvents: List<Event>, ephemeralEvents: List<Event>,
isInitialSync: Boolean, isInitialSync: Boolean,

View File

@ -151,8 +151,12 @@ class RoomMemberProfileViewModel @AssistedInject constructor(
ignored.find { ignored.find {
it.userId == initialState.userId it.userId == initialState.userId
} != null } != null
}
.map {
} }
.execute { .execute {
it
copy(isIgnored = it) copy(isIgnored = it)
} }
} }