From 3f07ed980694f618402945aee1818cfa32d6980b Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 18 Oct 2018 11:16:02 +0200 Subject: [PATCH] Trying monarchy to manage realm --- .idea/caches/build_file_checksums.ser | Bin 651 -> 651 bytes build.gradle | 1 + matrix-sdk-android/build.gradle | 3 ++ .../im/vector/matrix/android/api/Matrix.kt | 4 +- .../internal/session/DefaultSession.kt | 7 +--- .../android/internal/session/SessionModule.kt | 8 ++-- .../session/room/DefaultRoomService.kt | 30 +++++++------- .../session/room/RoomSummaryObserver.kt | 38 +++++++----------- .../internal/session/sync/RoomSyncHandler.kt | 10 ++--- 9 files changed, 44 insertions(+), 57 deletions(-) diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index acb3a3d585df817f46861c946b2e8c6b7da4d1fe..4569da29e26240f763a33ffbb931fd057e320859 100644 GIT binary patch delta 89 zcmV-f0H*(o1&alcm;{DVk#Mn`EdfD+?%2A<*UaKmvuk5_8KJXu01RSvX>4RJXL4a= vY-M$E0Db@l0000GjNGS(Lu;&{mQK!xsmogIbN~=+Z)0I>lR*I$lOF; delta 89 zcmV-f0H*(o1&alcm;{0qHPW%1EdfD|{8=&8+w|~u_d%5KH1zaz01RSvX>4RJXL4a= vY-M$E0Db@l0000Gd~o`dQ?kZ=ZLV}lR*I$lOF() private val roomSummaryObserver by inject() private val roomService by inject() private val syncThread by inject() @@ -42,7 +39,6 @@ class DefaultSession(private val sessionParams: SessionParams val syncModule = SyncModule() StandAloneContext.loadKoinModules(listOf(sessionModule, syncModule)) scope = getKoin().getOrCreateScope(SCOPE) - realmInstanceHolder.open() roomSummaryObserver.start() syncThread.start() } @@ -54,7 +50,6 @@ class DefaultSession(private val sessionParams: SessionParams assert(isOpen) syncThread.kill() roomSummaryObserver.dispose() - realmInstanceHolder.close() scope.close() isOpen = false } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionModule.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionModule.kt index 03af4f0e..4e5b1d92 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionModule.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionModule.kt @@ -1,8 +1,8 @@ package im.vector.matrix.android.internal.session +import com.zhuinden.monarchy.Monarchy import im.vector.matrix.android.api.session.room.RoomService import im.vector.matrix.android.internal.auth.data.SessionParams -import im.vector.matrix.android.internal.database.SessionRealmHolder import im.vector.matrix.android.internal.legacy.MXDataHandler import im.vector.matrix.android.internal.legacy.MXSession import im.vector.matrix.android.internal.legacy.data.store.MXFileStore @@ -23,7 +23,7 @@ class SessionModule(private val sessionParams: SessionParams) : Module { } scope(DefaultSession.SCOPE) { - SessionRealmHolder(get()) + Monarchy.Builder().setRealmConfiguration(get()).build() } scope(DefaultSession.SCOPE) { @@ -34,11 +34,11 @@ class SessionModule(private val sessionParams: SessionParams) : Module { } scope(DefaultSession.SCOPE) { - RoomSummaryObserver(get(), get(), get()) + RoomSummaryObserver(get()) } scope(DefaultSession.SCOPE) { - DefaultRoomService(get(), get()) as RoomService + DefaultRoomService(get()) as RoomService } scope(DefaultSession.SCOPE) { diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/DefaultRoomService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/DefaultRoomService.kt index 3fe38f76..1177a95d 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/DefaultRoomService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/DefaultRoomService.kt @@ -1,38 +1,36 @@ package im.vector.matrix.android.internal.session.room import android.arch.lifecycle.LiveData +import com.zhuinden.monarchy.Monarchy import im.vector.matrix.android.api.session.room.Room import im.vector.matrix.android.api.session.room.RoomService -import im.vector.matrix.android.internal.database.RealmLiveData -import im.vector.matrix.android.internal.database.SessionRealmHolder import im.vector.matrix.android.internal.database.model.RoomEntity import im.vector.matrix.android.internal.database.query.getAll import im.vector.matrix.android.internal.database.query.getForId -import io.realm.Realm -import io.realm.RealmConfiguration -class DefaultRoomService(private val realmConfiguration: RealmConfiguration, - val mainThreadRealm: SessionRealmHolder) - : RoomService { +class DefaultRoomService(private val monarchy: Monarchy) : RoomService { override fun getAllRooms(): List { - val realm = Realm.getInstance(realmConfiguration) - val rooms = RoomEntity.getAll(realm).findAll().map { DefaultRoom(it.roomId) } - realm.close() + var rooms: List = emptyList() + monarchy.doWithRealm { realm -> + rooms = RoomEntity.getAll(realm).findAll().map { DefaultRoom(it.roomId) } + } return rooms } override fun getRoom(roomId: String): Room? { - val realm = Realm.getInstance(realmConfiguration) - val room = RoomEntity.getForId(realm, roomId)?.let { DefaultRoom(it.roomId) } - realm.close() + var room: Room? = null + monarchy.doWithRealm { realm -> + room = RoomEntity.getForId(realm, roomId)?.let { DefaultRoom(it.roomId) } + } return room } override fun rooms(): LiveData> { - val roomResults = RoomEntity.getAll(mainThreadRealm.instance).findAllAsync() - return RealmLiveData(roomResults) { DefaultRoom(it.roomId) } + return monarchy.findAllMappedWithChanges( + { realm -> RoomEntity.getAll(realm) }, + { DefaultRoom(it.roomId) } + ) } - } \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/RoomSummaryObserver.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/RoomSummaryObserver.kt index 3bd9a87b..f35b06fd 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/RoomSummaryObserver.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/RoomSummaryObserver.kt @@ -1,9 +1,9 @@ package im.vector.matrix.android.internal.session.room +import com.zhuinden.monarchy.Monarchy import im.vector.matrix.android.api.session.events.model.EventType import im.vector.matrix.android.api.session.room.model.RoomNameContent import im.vector.matrix.android.api.session.room.model.RoomTopicContent -import im.vector.matrix.android.internal.database.SessionRealmHolder import im.vector.matrix.android.internal.database.mapper.asDomain import im.vector.matrix.android.internal.database.model.EventEntity import im.vector.matrix.android.internal.database.model.RoomEntity @@ -11,28 +11,22 @@ import im.vector.matrix.android.internal.database.model.RoomSummaryEntity import im.vector.matrix.android.internal.database.query.getAll import im.vector.matrix.android.internal.database.query.getAllFromRoom import im.vector.matrix.android.internal.database.query.getLast -import im.vector.matrix.android.internal.util.MatrixCoroutineDispatchers -import io.realm.Realm -import io.realm.RealmConfiguration import io.realm.RealmResults -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch import java.util.concurrent.atomic.AtomicBoolean -internal class RoomSummaryObserver(private val mainThreadRealm: SessionRealmHolder, - private val matrixCoroutineDispatchers: MatrixCoroutineDispatchers, - private val realmConfiguration: RealmConfiguration -) { +internal class RoomSummaryObserver(private val monarchy: Monarchy) { private lateinit var roomResults: RealmResults private var isStarted = AtomicBoolean(false) fun start() { if (isStarted.compareAndSet(false, true)) { - roomResults = RoomEntity.getAll(mainThreadRealm.instance).findAllAsync() - roomResults.addChangeListener { rooms, changeSet -> - manageRoomResults(rooms, changeSet.changes) - manageRoomResults(rooms, changeSet.insertions) + monarchy.doWithRealm { + roomResults = RoomEntity.getAll(it).findAllAsync() + roomResults.addChangeListener { rooms, changeSet -> + manageRoomResults(rooms, changeSet.changes) + manageRoomResults(rooms, changeSet.insertions) + } } } } @@ -54,20 +48,18 @@ internal class RoomSummaryObserver(private val mainThreadRealm: SessionRealmHold } } - private fun manageRoom(roomId: String) = GlobalScope.launch(matrixCoroutineDispatchers.io) { - val realm = Realm.getInstance(realmConfiguration) - val roomEvents = EventEntity.getAllFromRoom(realm, roomId) - val lastNameEvent = roomEvents.getLast(EventType.STATE_ROOM_NAME)?.asDomain() - val lastTopicEvent = roomEvents.getLast(EventType.STATE_ROOM_TOPIC)?.asDomain() - val lastMessageEvent = roomEvents.getLast(EventType.MESSAGE) + private fun manageRoom(roomId: String) { + monarchy.writeAsync { realm -> + val roomEvents = EventEntity.getAllFromRoom(realm, roomId) + val lastNameEvent = roomEvents.getLast(EventType.STATE_ROOM_NAME)?.asDomain() + val lastTopicEvent = roomEvents.getLast(EventType.STATE_ROOM_TOPIC)?.asDomain() + val lastMessageEvent = roomEvents.getLast(EventType.MESSAGE) - realm.executeTransaction { realmInstance -> - val roomSummary = realmInstance.copyToRealmOrUpdate(RoomSummaryEntity(roomId)) + val roomSummary = realm.copyToRealmOrUpdate(RoomSummaryEntity(roomId)) roomSummary.displayName = lastNameEvent?.content()?.name roomSummary.topic = lastTopicEvent?.content()?.topic roomSummary.lastMessage = lastMessageEvent } - realm.close() } } \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/RoomSyncHandler.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/RoomSyncHandler.kt index 6be5dea3..54292b13 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/RoomSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/RoomSyncHandler.kt @@ -1,5 +1,6 @@ package im.vector.matrix.android.internal.session.sync +import com.zhuinden.monarchy.Monarchy import im.vector.matrix.android.api.session.events.model.Event import im.vector.matrix.android.internal.database.mapper.asEntity import im.vector.matrix.android.internal.database.model.ChunkEntity @@ -10,10 +11,9 @@ import im.vector.matrix.android.internal.database.query.getLastChunkFromRoom import im.vector.matrix.android.internal.session.sync.model.InvitedRoomSync import im.vector.matrix.android.internal.session.sync.model.RoomSync import io.realm.Realm -import io.realm.RealmConfiguration -class RoomSyncHandler(private val realmConfiguration: RealmConfiguration) { +class RoomSyncHandler(private val monarchy: Monarchy) { sealed class HandlingStrategy { data class JOINED(val data: Map) : HandlingStrategy() @@ -22,16 +22,14 @@ class RoomSyncHandler(private val realmConfiguration: RealmConfiguration) { } fun handleRoomSync(handlingStrategy: HandlingStrategy) { - val realm = Realm.getInstance(realmConfiguration) - realm.executeTransaction { realmInstance -> + monarchy.writeAsync { realm -> val roomEntities = when (handlingStrategy) { is HandlingStrategy.JOINED -> handlingStrategy.data.map { handleJoinedRoom(realm, it.key, it.value) } is HandlingStrategy.INVITED -> handlingStrategy.data.map { handleInvitedRoom(realm, it.key, it.value) } is HandlingStrategy.LEFT -> handlingStrategy.data.map { handleLeftRoom(it.key, it.value) } } - realmInstance.insertOrUpdate(roomEntities) + realm.insertOrUpdate(roomEntities) } - realm.close() }