From af79e1d0b5ba73e2b197f45d574ee35c7f379f75 Mon Sep 17 00:00:00 2001 From: ganfra Date: Mon, 26 Nov 2018 17:09:49 +0100 Subject: [PATCH] Rework injection of monarchy instances (introduce disk and memory) --- .../riotredesign/features/home/HomeModule.kt | 3 +- .../home/room/detail/RoomDetailFragment.kt | 4 +- .../internal/database/DatabaseInstances.kt | 8 ++++ .../internal/database/DatabaseModule.kt | 41 +++++++++++++++++++ .../internal/session/DefaultSession.kt | 6 ++- .../android/internal/session/SessionModule.kt | 33 +++++---------- .../session/events/prune/PruneEventWorker.kt | 40 +++++++++--------- .../internal/session/group/GroupModule.kt | 3 +- .../internal/session/room/DefaultRoom.kt | 18 ++++---- .../session/room/RoomAvatarResolver.kt | 2 +- .../internal/session/room/RoomModule.kt | 24 +++++------ .../room/members/RoomDisplayNameResolver.kt | 2 +- .../session/room/send/SendEventWorker.kt | 8 ++-- .../room/timeline/DefaultTimelineHolder.kt | 16 ++++---- .../room/timeline/TimelineBoundaryCallback.kt | 4 +- .../internal/session/sync/SyncModule.kt | 9 ++-- .../internal/session/sync/SyncTokenStore.kt | 16 ++++---- 17 files changed, 136 insertions(+), 101 deletions(-) create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/DatabaseInstances.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/DatabaseModule.kt diff --git a/app/src/main/java/im/vector/riotredesign/features/home/HomeModule.kt b/app/src/main/java/im/vector/riotredesign/features/home/HomeModule.kt index a74a67c6..0a074220 100644 --- a/app/src/main/java/im/vector/riotredesign/features/home/HomeModule.kt +++ b/app/src/main/java/im/vector/riotredesign/features/home/HomeModule.kt @@ -28,8 +28,7 @@ class HomeModule(private val homeActivity: HomeActivity) : Module { TextItemFactory() } - factory { - val roomId = it.get(0) as String + factory { (roomId: String) -> TimelineEventController(roomId, get(), get(), get()) } diff --git a/app/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailFragment.kt b/app/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailFragment.kt index d8d550b4..f19d4f5a 100644 --- a/app/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailFragment.kt +++ b/app/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailFragment.kt @@ -22,7 +22,7 @@ import im.vector.riotredesign.features.home.AvatarRenderer import im.vector.riotredesign.features.home.room.detail.timeline.TimelineEventController import kotlinx.android.synthetic.main.fragment_room_detail.* import org.koin.android.ext.android.inject -import org.koin.core.parameter.ParameterList +import org.koin.core.parameter.parametersOf class RoomDetailFragment : RiotFragment() { @@ -40,7 +40,7 @@ class RoomDetailFragment : RiotFragment() { private val currentSession = matrix.currentSession private var roomId: String by UnsafeFragmentArgumentDelegate() private var eventId: String? by FragmentArgumentDelegate() - private val timelineEventController by inject(parameters = { ParameterList(roomId) }) + private val timelineEventController by inject { parametersOf(roomId) } private lateinit var room: Room private lateinit var scrollOnNewMessageCallback: ScrollOnNewMessageCallback diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/DatabaseInstances.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/DatabaseInstances.kt new file mode 100644 index 00000000..fdecba85 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/DatabaseInstances.kt @@ -0,0 +1,8 @@ +package im.vector.matrix.android.internal.database + +import com.zhuinden.monarchy.Monarchy + +data class DatabaseInstances( + val disk: Monarchy, + val inMemory: Monarchy +) \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/DatabaseModule.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/DatabaseModule.kt new file mode 100644 index 00000000..78aec397 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/DatabaseModule.kt @@ -0,0 +1,41 @@ +package im.vector.matrix.android.internal.database + +import android.content.Context +import com.zhuinden.monarchy.Monarchy +import im.vector.matrix.android.api.auth.data.SessionParams +import im.vector.matrix.android.internal.session.DefaultSession +import io.realm.RealmConfiguration +import org.koin.dsl.context.ModuleDefinition +import org.koin.dsl.module.Module +import org.koin.dsl.module.module +import java.io.File + +class DatabaseModule : Module { + + override fun invoke(): ModuleDefinition = module { + + scope(DefaultSession.SCOPE) { + val context = get() + val sessionParams = get() + val directory = File(context.filesDir, sessionParams.credentials.userId) + + val diskConfiguration = RealmConfiguration.Builder() + .directory(directory) + .name("disk_store.realm") + .deleteRealmIfMigrationNeeded() + .build() + + val inMemoryConfiguration = RealmConfiguration.Builder() + .directory(directory) + .name("in_memory_store.realm") + .inMemory() + .build() + + DatabaseInstances( + disk = Monarchy.Builder().setRealmConfiguration(diskConfiguration).build(), + inMemory = Monarchy.Builder().setRealmConfiguration(inMemoryConfiguration).build() + ) + } + + }.invoke() +} \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/DefaultSession.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/DefaultSession.kt index d474c8d9..c6db21f9 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/DefaultSession.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/DefaultSession.kt @@ -3,6 +3,7 @@ package im.vector.matrix.android.internal.session import android.arch.lifecycle.LiveData import android.os.Looper import android.support.annotation.MainThread +import im.vector.matrix.android.api.auth.data.SessionParams import im.vector.matrix.android.api.session.Session import im.vector.matrix.android.api.session.group.Group import im.vector.matrix.android.api.session.group.GroupService @@ -10,7 +11,7 @@ import im.vector.matrix.android.api.session.group.model.GroupSummary import im.vector.matrix.android.api.session.room.Room import im.vector.matrix.android.api.session.room.RoomService import im.vector.matrix.android.api.session.room.model.RoomSummary -import im.vector.matrix.android.api.auth.data.SessionParams +import im.vector.matrix.android.internal.database.DatabaseModule import im.vector.matrix.android.internal.database.LiveEntityObserver import im.vector.matrix.android.internal.session.group.GroupModule import im.vector.matrix.android.internal.session.room.RoomModule @@ -46,7 +47,8 @@ internal class DefaultSession(override val sessionParams: SessionParams) : Sessi val syncModule = SyncModule() val roomModule = RoomModule() val groupModule = GroupModule() - StandAloneContext.loadKoinModules(listOf(sessionModule, syncModule, roomModule, groupModule)) + val databaseModule = DatabaseModule() + StandAloneContext.loadKoinModules(listOf(sessionModule, syncModule, roomModule, groupModule, databaseModule)) scope = getKoin().getOrCreateScope(SCOPE) liveEntityUpdaters.forEach { it.start() } syncThread.start() 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 e4b2e93c..83771b60 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,9 +1,9 @@ package im.vector.matrix.android.internal.session -import com.zhuinden.monarchy.Monarchy import im.vector.matrix.android.api.auth.data.SessionParams import im.vector.matrix.android.api.session.group.GroupService import im.vector.matrix.android.api.session.room.RoomService +import im.vector.matrix.android.internal.database.DatabaseInstances import im.vector.matrix.android.internal.database.LiveEntityObserver import im.vector.matrix.android.internal.session.events.prune.EventsPruner import im.vector.matrix.android.internal.session.group.DefaultGroupService @@ -13,7 +13,6 @@ import im.vector.matrix.android.internal.session.room.RoomAvatarResolver import im.vector.matrix.android.internal.session.room.RoomSummaryUpdater import im.vector.matrix.android.internal.session.room.members.RoomDisplayNameResolver import im.vector.matrix.android.internal.session.room.members.RoomMemberDisplayNameResolver -import io.realm.RealmConfiguration import org.koin.dsl.context.ModuleDefinition import org.koin.dsl.module.Module import org.koin.dsl.module.module @@ -28,20 +27,7 @@ internal class SessionModule(private val sessionParams: SessionParams) : Module } scope(DefaultSession.SCOPE) { - RealmConfiguration.Builder() - .name(sessionParams.credentials.userId) - .deleteRealmIfMigrationNeeded() - .build() - } - - scope(DefaultSession.SCOPE) { - Monarchy.Builder() - .setRealmConfiguration(get()) - .build() - } - - scope(DefaultSession.SCOPE) { - val retrofitBuilder = get() as Retrofit.Builder + val retrofitBuilder = get() retrofitBuilder .baseUrl(sessionParams.homeServerConnectionConfig.homeServerUri.toString()) .build() @@ -52,26 +38,27 @@ internal class SessionModule(private val sessionParams: SessionParams) : Module } scope(DefaultSession.SCOPE) { - RoomDisplayNameResolver(get(), get(), sessionParams.credentials) + RoomDisplayNameResolver(get().disk, get(), sessionParams.credentials) } scope(DefaultSession.SCOPE) { - RoomAvatarResolver(get(), sessionParams.credentials) + RoomAvatarResolver(get().disk, sessionParams.credentials) } scope(DefaultSession.SCOPE) { - DefaultRoomService(get()) as RoomService + DefaultRoomService(get().disk) as RoomService } scope(DefaultSession.SCOPE) { - DefaultGroupService(get()) as GroupService + DefaultGroupService(get().disk) as GroupService } scope(DefaultSession.SCOPE) { - val roomSummaryUpdater = RoomSummaryUpdater(get(), get(), get(), get(), sessionParams.credentials) - val groupSummaryUpdater = GroupSummaryUpdater(get()) - val eventsPruner = EventsPruner(get()) + val disk = get().disk + val roomSummaryUpdater = RoomSummaryUpdater(disk, get(), get(), get(), sessionParams.credentials) + val groupSummaryUpdater = GroupSummaryUpdater(disk) + val eventsPruner = EventsPruner(disk) listOf(roomSummaryUpdater, groupSummaryUpdater, eventsPruner) } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/events/prune/PruneEventWorker.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/events/prune/PruneEventWorker.kt index cf0f6b61..51f3eb1e 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/events/prune/PruneEventWorker.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/events/prune/PruneEventWorker.kt @@ -5,9 +5,9 @@ import androidx.work.Worker import androidx.work.WorkerParameters import arrow.core.Option import com.squareup.moshi.JsonClass -import com.zhuinden.monarchy.Monarchy import im.vector.matrix.android.api.session.events.model.Event import im.vector.matrix.android.api.session.events.model.EventType +import im.vector.matrix.android.internal.database.DatabaseInstances import im.vector.matrix.android.internal.database.mapper.asDomain import im.vector.matrix.android.internal.database.mapper.asEntity import im.vector.matrix.android.internal.database.model.EventEntity @@ -29,13 +29,13 @@ internal class PruneEventWorker(context: Context, val deletionIndexes: List ) - private val monarchy by inject() + private val dbInstances by inject() override fun doWork(): Result { val params = WorkerParamsFactory.fromData(inputData) - ?: return Result.FAILURE + ?: return Result.FAILURE - val result = monarchy.tryTransactionAsync { realm -> + val result = dbInstances.disk.tryTransactionAsync { realm -> params.updateIndexes.forEach { index -> val data = params.redactionEvents[index] pruneEvent(realm, data) @@ -49,7 +49,7 @@ internal class PruneEventWorker(context: Context, return } val eventToPrune = EventEntity.where(realm, eventId = redactionEvent.redacts).findFirst()?.asDomain() - ?: return + ?: return val allowedKeys = computeAllowedKeys(eventToPrune.type) val prunedContent = allowedKeys.fold( @@ -63,22 +63,22 @@ internal class PruneEventWorker(context: Context, private fun computeAllowedKeys(type: String): Option> { // Add filtered content, allowed keys in content depends on the event type val result = when (type) { - EventType.STATE_ROOM_MEMBER -> listOf("membership") - EventType.STATE_ROOM_CREATE -> listOf("creator") - EventType.STATE_ROOM_JOIN_RULES -> listOf("join_rule") + EventType.STATE_ROOM_MEMBER -> listOf("membership") + EventType.STATE_ROOM_CREATE -> listOf("creator") + EventType.STATE_ROOM_JOIN_RULES -> listOf("join_rule") EventType.STATE_ROOM_POWER_LEVELS -> listOf("users", - "users_default", - "events", - "events_default", - "state_default", - "ban", - "kick", - "redact", - "invite") - EventType.STATE_ROOM_ALIASES -> listOf("aliases") - EventType.STATE_CANONICAL_ALIAS -> listOf("alias") - EventType.FEEDBACK -> listOf("type", "target_event_id") - else -> null + "users_default", + "events", + "events_default", + "state_default", + "ban", + "kick", + "redact", + "invite") + EventType.STATE_ROOM_ALIASES -> listOf("aliases") + EventType.STATE_CANONICAL_ALIAS -> listOf("alias") + EventType.FEEDBACK -> listOf("type", "target_event_id") + else -> null } return Option.fromNullable(result) } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/group/GroupModule.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/group/GroupModule.kt index eaca16b7..53c8c56b 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/group/GroupModule.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/group/GroupModule.kt @@ -1,5 +1,6 @@ package im.vector.matrix.android.internal.session.group +import im.vector.matrix.android.internal.database.DatabaseInstances import im.vector.matrix.android.internal.session.DefaultSession import org.koin.dsl.context.ModuleDefinition import org.koin.dsl.module.Module @@ -16,7 +17,7 @@ class GroupModule : Module { } scope(DefaultSession.SCOPE) { - GetGroupDataRequest(get(), get(), get(), get()) + GetGroupDataRequest(get(), get().disk, get(), get()) } }.invoke() diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/DefaultRoom.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/DefaultRoom.kt index 766fea9d..0acf6c7e 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/DefaultRoom.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/DefaultRoom.kt @@ -3,7 +3,6 @@ package im.vector.matrix.android.internal.session.room import android.arch.lifecycle.LiveData import android.arch.lifecycle.Transformations import android.arch.paging.PagedList -import com.zhuinden.monarchy.Monarchy import im.vector.matrix.android.api.MatrixCallback import im.vector.matrix.android.api.session.events.model.EnrichedEvent import im.vector.matrix.android.api.session.events.model.Event @@ -14,6 +13,7 @@ import im.vector.matrix.android.api.session.room.model.Membership import im.vector.matrix.android.api.session.room.model.MyMembership import im.vector.matrix.android.api.session.room.model.RoomSummary import im.vector.matrix.android.api.util.Cancelable +import im.vector.matrix.android.internal.database.DatabaseInstances import im.vector.matrix.android.internal.database.mapper.asDomain import im.vector.matrix.android.internal.database.model.RoomEntity import im.vector.matrix.android.internal.database.model.RoomSummaryEntity @@ -32,12 +32,12 @@ internal data class DefaultRoom( private val loadRoomMembersRequest by inject() private val syncTokenStore by inject() - private val monarchy by inject() - private val timelineHolder by inject(parameters = { parametersOf(roomId) }) - private val sendService by inject(parameters = { parametersOf(roomId) }) + private val dbInstances by inject() + private val timelineHolder by inject { parametersOf(roomId) } + private val sendService by inject { parametersOf(roomId) } override val roomSummary: LiveData by lazy { - val liveData = monarchy + val liveData = dbInstances.disk .findAllMappedWithChanges( { realm -> RoomSummaryEntity.where(realm, roomId).isNotEmpty(RoomSummaryEntityFields.DISPLAY_NAME) }, { from -> from.asDomain() }) @@ -61,10 +61,10 @@ internal data class DefaultRoom( } private fun areAllMembersLoaded(): Boolean { - return monarchy - .fetchAllCopiedSync { RoomEntity.where(it, roomId) } - .firstOrNull() - ?.areAllMembersLoaded ?: false + return dbInstances.disk + .fetchAllCopiedSync { RoomEntity.where(it, roomId) } + .firstOrNull() + ?.areAllMembersLoaded ?: false } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/RoomAvatarResolver.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/RoomAvatarResolver.kt index facec4c4..2ef0592e 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/RoomAvatarResolver.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/RoomAvatarResolver.kt @@ -1,11 +1,11 @@ package im.vector.matrix.android.internal.session.room import com.zhuinden.monarchy.Monarchy +import im.vector.matrix.android.api.auth.data.Credentials import im.vector.matrix.android.api.session.events.model.EventType import im.vector.matrix.android.api.session.room.Room import im.vector.matrix.android.api.session.room.model.MyMembership import im.vector.matrix.android.api.session.room.model.RoomAvatarContent -import im.vector.matrix.android.api.auth.data.Credentials 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.query.last diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/RoomModule.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/RoomModule.kt index 598bd5f0..d927643b 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/RoomModule.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/RoomModule.kt @@ -4,12 +4,14 @@ import im.vector.matrix.android.api.auth.data.SessionParams import im.vector.matrix.android.api.session.room.SendService import im.vector.matrix.android.api.session.room.TimelineHolder import im.vector.matrix.android.api.session.room.send.EventFactory +import im.vector.matrix.android.internal.database.DatabaseInstances import im.vector.matrix.android.internal.session.DefaultSession import im.vector.matrix.android.internal.session.room.members.LoadRoomMembersRequest import im.vector.matrix.android.internal.session.room.send.DefaultSendService import im.vector.matrix.android.internal.session.room.timeline.DefaultTimelineHolder import im.vector.matrix.android.internal.session.room.timeline.PaginationRequest import im.vector.matrix.android.internal.session.room.timeline.TimelineBoundaryCallback +import im.vector.matrix.android.internal.util.PagingRequestHelper import org.koin.dsl.context.ModuleDefinition import org.koin.dsl.module.Module import org.koin.dsl.module.module @@ -27,18 +29,11 @@ class RoomModule : Module { } scope(DefaultSession.SCOPE) { - LoadRoomMembersRequest(get(), get(), get()) + LoadRoomMembersRequest(get(), get().disk, get()) } scope(DefaultSession.SCOPE) { - PaginationRequest(get(), get(), get()) - } - - - factory { - val roomId: String = it[0] - val timelineBoundaryCallback = TimelineBoundaryCallback(roomId, get(), get(), Executors.newSingleThreadExecutor()) - DefaultTimelineHolder(roomId, get(), timelineBoundaryCallback) as TimelineHolder + PaginationRequest(get(), get().disk, get()) } scope(DefaultSession.SCOPE) { @@ -46,9 +41,14 @@ class RoomModule : Module { EventFactory(sessionParams.credentials) } - factory { - val roomId: String = it[0] - DefaultSendService(roomId, get(), get()) as SendService + factory { (roomId: String) -> + val helper = PagingRequestHelper(Executors.newSingleThreadExecutor()) + val timelineBoundaryCallback = TimelineBoundaryCallback(roomId, get(), get().disk, helper) + DefaultTimelineHolder(roomId, get().disk, timelineBoundaryCallback) as TimelineHolder + } + + factory { (roomId: String) -> + DefaultSendService(roomId, get(), get().disk) as SendService } }.invoke() diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/members/RoomDisplayNameResolver.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/members/RoomDisplayNameResolver.kt index c2e0eeb0..a10fe9f4 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/members/RoomDisplayNameResolver.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/members/RoomDisplayNameResolver.kt @@ -19,13 +19,13 @@ package im.vector.matrix.android.internal.session.room.members import android.content.Context import com.zhuinden.monarchy.Monarchy import im.vector.matrix.android.R +import im.vector.matrix.android.api.auth.data.Credentials import im.vector.matrix.android.api.session.events.model.EventType import im.vector.matrix.android.api.session.room.Room import im.vector.matrix.android.api.session.room.model.MyMembership import im.vector.matrix.android.api.session.room.model.RoomAliasesContent import im.vector.matrix.android.api.session.room.model.RoomCanonicalAliasContent import im.vector.matrix.android.api.session.room.model.RoomNameContent -import im.vector.matrix.android.api.auth.data.Credentials 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.RoomSummaryEntity diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/SendEventWorker.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/SendEventWorker.kt index 946b567c..35c6aad5 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/SendEventWorker.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/SendEventWorker.kt @@ -4,8 +4,8 @@ import android.content.Context import androidx.work.Worker import androidx.work.WorkerParameters import com.squareup.moshi.JsonClass -import com.zhuinden.monarchy.Monarchy import im.vector.matrix.android.api.session.events.model.Event +import im.vector.matrix.android.internal.database.DatabaseInstances import im.vector.matrix.android.internal.database.model.EventEntity import im.vector.matrix.android.internal.database.query.where import im.vector.matrix.android.internal.network.executeRequest @@ -26,12 +26,12 @@ internal class SendEventWorker(context: Context, params: WorkerParameters) ) private val roomAPI by inject() - private val monarchy by inject() + private val dbInstances by inject() override fun doWork(): Result { val params = WorkerParamsFactory.fromData(inputData) - ?: return Result.FAILURE + ?: return Result.FAILURE if (params.event.eventId == null) { return Result.FAILURE @@ -46,7 +46,7 @@ internal class SendEventWorker(context: Context, params: WorkerParameters) ) } result.flatMap { sendResponse -> - monarchy.tryTransactionSync { realm -> + dbInstances.disk.tryTransactionSync { realm -> val dummyEventEntity = EventEntity.where(realm, params.event.eventId).findFirst() dummyEventEntity?.eventId = sendResponse.eventId } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/DefaultTimelineHolder.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/DefaultTimelineHolder.kt index 5f24e155..b4be7741 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/DefaultTimelineHolder.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/DefaultTimelineHolder.kt @@ -31,9 +31,6 @@ internal class DefaultTimelineHolder(private val roomId: String, } override fun timeline(eventId: String?): LiveData> { - if (eventId != null) { - fetchEventIfNeeded() - } val realmDataSourceFactory = monarchy.createDataSourceFactory { buildDataSourceFactoryQuery(it, eventId) } @@ -60,18 +57,21 @@ internal class DefaultTimelineHolder(private val roomId: String, return monarchy.findAllPagedWithChanges(realmDataSourceFactory, livePagedListBuilder) } - private fun fetchEventIfNeeded() { - - } - private fun buildDataSourceFactoryQuery(realm: Realm, eventId: String?): RealmQuery { val query = if (eventId == null) { EventEntity .where(realm, roomId = roomId) .equalTo("${EventEntityFields.CHUNK}.${ChunkEntityFields.IS_LAST}", true) } else { + val event = EventEntity.where(realm, eventId = eventId).findFirst() + val permalinkRealm: Realm + if (event == null) { + permalinkRealm = realm + } else { + permalinkRealm = realm + } EventEntity - .where(realm, roomId = roomId) + .where(permalinkRealm, roomId = roomId) .`in`("${EventEntityFields.CHUNK}.${ChunkEntityFields.EVENTS.EVENT_ID}", arrayOf(eventId)) } return query.sort(EventEntityFields.DISPLAY_INDEX) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/TimelineBoundaryCallback.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/TimelineBoundaryCallback.kt index a899a646..ff06dbb5 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/TimelineBoundaryCallback.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/TimelineBoundaryCallback.kt @@ -13,11 +13,9 @@ import java.util.concurrent.Executor internal class TimelineBoundaryCallback(private val roomId: String, private val paginationRequest: PaginationRequest, private val monarchy: Monarchy, - ioExecutor: Executor + private val helper: PagingRequestHelper ) : PagedList.BoundaryCallback() { - private val helper = PagingRequestHelper(ioExecutor) - var limit = 10 override fun onZeroItemsLoaded() { diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncModule.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncModule.kt index 0ae3e618..5b593387 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncModule.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncModule.kt @@ -1,5 +1,6 @@ package im.vector.matrix.android.internal.session.sync +import im.vector.matrix.android.internal.database.DatabaseInstances import im.vector.matrix.android.internal.session.DefaultSession import im.vector.matrix.android.internal.session.sync.job.SyncThread import org.koin.dsl.context.ModuleDefinition @@ -22,15 +23,15 @@ internal class SyncModule : Module { } scope(DefaultSession.SCOPE) { - RoomSyncHandler(get(), get()) + RoomSyncHandler(get().disk, get()) } scope(DefaultSession.SCOPE) { - GroupSyncHandler(get()) + GroupSyncHandler(get().disk) } scope(DefaultSession.SCOPE) { - UserAccountDataSyncHandler(get()) + UserAccountDataSyncHandler(get().disk) } scope(DefaultSession.SCOPE) { @@ -42,7 +43,7 @@ internal class SyncModule : Module { } scope(DefaultSession.SCOPE) { - SyncTokenStore(get()) + SyncTokenStore(get().disk) } scope(DefaultSession.SCOPE) { diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncTokenStore.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncTokenStore.kt index ff753b07..b17eb721 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncTokenStore.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncTokenStore.kt @@ -1,25 +1,23 @@ package im.vector.matrix.android.internal.session.sync +import com.zhuinden.monarchy.Monarchy import im.vector.matrix.android.internal.database.model.SyncEntity -import io.realm.Realm -import io.realm.RealmConfiguration -internal class SyncTokenStore(private val realmConfiguration: RealmConfiguration) { +internal class SyncTokenStore(private val monarchy: Monarchy) { fun getLastToken(): String? { - val realm = Realm.getInstance(realmConfiguration) - val token = realm.where(SyncEntity::class.java).findFirst()?.nextBatch - realm.close() + var token: String? = null + monarchy.doWithRealm { realm -> + token = realm.where(SyncEntity::class.java).findFirst()?.nextBatch + } return token } fun saveToken(token: String?) { - val realm = Realm.getInstance(realmConfiguration) - realm.executeTransaction { + monarchy.writeAsync { val sync = SyncEntity(token) it.insertOrUpdate(sync) } - realm.close() }