Realm kotlin: migrate FilterRepository

This commit is contained in:
ganfra 2022-09-29 18:39:54 +02:00
parent 6b3ce7872e
commit baa854e5f2

View File

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