Realm kotlin: migrate FilterRepository
This commit is contained in:
parent
6b3ce7872e
commit
baa854e5f2
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user