Realm kotlin: continue migrating queries (some are blocked by lack of backlink)
This commit is contained in:
		
							parent
							
								
									aeaf4389a8
								
							
						
					
					
						commit
						a4a4bac75b
					
				@ -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(
 | 
				
			||||||
 | 
				
			|||||||
@ -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)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -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? {
 | 
				
			||||||
 | 
				
			|||||||
@ -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)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -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()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -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? {
 | 
				
			||||||
 | 
				
			|||||||
@ -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)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -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())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -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)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -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)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
				
			|||||||
@ -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)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -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"
 | 
				
			||||||
 | 
				
			|||||||
@ -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)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -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
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -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
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
				
			|||||||
@ -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)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -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()
 | 
				
			||||||
 | 
				
			|||||||
@ -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)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -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)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -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())
 | 
				
			||||||
 | 
				
			|||||||
@ -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)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -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)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -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)
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
				
			|||||||
@ -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)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -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()
 | 
				
			||||||
 | 
				
			|||||||
@ -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
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 | 
				
			|||||||
@ -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,
 | 
				
			||||||
 | 
				
			|||||||
@ -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)
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user