diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/di/SessionAssistedInjectModule.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/di/SessionAssistedInjectModule.kt new file mode 100644 index 00000000..1e8686da --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/di/SessionAssistedInjectModule.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2019 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.matrix.android.internal.di + +import com.squareup.inject.assisted.dagger2.AssistedModule +import dagger.Module + +@AssistedModule +@Module(includes = [AssistedInject_SessionAssistedInjectModule::class]) +interface SessionAssistedInjectModule \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionComponent.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionComponent.kt index 26f43be0..c8745fc3 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionComponent.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionComponent.kt @@ -22,6 +22,7 @@ import im.vector.matrix.android.api.auth.data.SessionParams import im.vector.matrix.android.api.session.Session import im.vector.matrix.android.internal.crypto.CryptoModule import im.vector.matrix.android.internal.di.MatrixComponent +import im.vector.matrix.android.internal.di.SessionAssistedInjectModule import im.vector.matrix.android.internal.network.NetworkConnectivityChecker import im.vector.matrix.android.internal.session.cache.CacheModule import im.vector.matrix.android.internal.session.content.ContentModule @@ -59,7 +60,8 @@ import im.vector.matrix.android.internal.task.TaskExecutor CacheModule::class, CryptoModule::class, PushersModule::class, - AccountDataModule::class + AccountDataModule::class, + SessionAssistedInjectModule::class ] ) @SessionScope 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 38637fb7..ab44a4aa 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 @@ -36,7 +36,9 @@ import im.vector.matrix.android.internal.di.Unauthenticated import im.vector.matrix.android.internal.network.AccessTokenInterceptor import im.vector.matrix.android.internal.network.RetrofitFactory import im.vector.matrix.android.internal.session.group.GroupSummaryUpdater +import im.vector.matrix.android.internal.session.room.DefaultRoomFactory import im.vector.matrix.android.internal.session.room.EventRelationsAggregationUpdater +import im.vector.matrix.android.internal.session.room.RoomFactory import im.vector.matrix.android.internal.session.room.create.RoomCreateEventLiveObserver import im.vector.matrix.android.internal.session.room.prune.EventsPruner import im.vector.matrix.android.internal.session.room.tombstone.RoomTombstoneEventLiveObserver @@ -114,7 +116,6 @@ internal abstract class SessionModule { } } - @Binds abstract fun bindSession(session: DefaultSession): Session diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/RoomFactory.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/RoomFactory.kt index 1c64c91b..53da2d77 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/RoomFactory.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/RoomFactory.kt @@ -16,70 +16,46 @@ package im.vector.matrix.android.internal.session.room -import android.content.Context import com.zhuinden.monarchy.Monarchy -import im.vector.matrix.android.api.auth.data.Credentials import im.vector.matrix.android.api.session.crypto.CryptoService import im.vector.matrix.android.api.session.room.Room import im.vector.matrix.android.internal.database.mapper.RoomSummaryMapper import im.vector.matrix.android.internal.session.room.membership.DefaultMembershipService -import im.vector.matrix.android.internal.session.room.membership.LoadRoomMembersTask -import im.vector.matrix.android.internal.session.room.membership.joining.InviteTask -import im.vector.matrix.android.internal.session.room.membership.joining.JoinRoomTask -import im.vector.matrix.android.internal.session.room.membership.leaving.LeaveRoomTask import im.vector.matrix.android.internal.session.room.read.DefaultReadService -import im.vector.matrix.android.internal.session.room.read.SetReadMarkersTask import im.vector.matrix.android.internal.session.room.relation.DefaultRelationService -import im.vector.matrix.android.internal.session.room.relation.FetchEditHistoryTask -import im.vector.matrix.android.internal.session.room.relation.FindReactionEventForUndoTask import im.vector.matrix.android.internal.session.room.send.DefaultSendService -import im.vector.matrix.android.internal.session.room.send.LocalEchoEventFactory import im.vector.matrix.android.internal.session.room.state.DefaultStateService -import im.vector.matrix.android.internal.session.room.state.SendStateTask import im.vector.matrix.android.internal.session.room.timeline.DefaultTimelineService -import im.vector.matrix.android.internal.session.room.timeline.GetContextOfEventTask -import im.vector.matrix.android.internal.session.room.timeline.PaginationTask -import im.vector.matrix.android.internal.task.TaskExecutor import javax.inject.Inject -internal class RoomFactory @Inject constructor(private val context: Context, - private val credentials: Credentials, - private val monarchy: Monarchy, - private val eventFactory: LocalEchoEventFactory, - private val roomSummaryMapper: RoomSummaryMapper, - private val taskExecutor: TaskExecutor, - private val loadRoomMembersTask: LoadRoomMembersTask, - private val inviteTask: InviteTask, - private val sendStateTask: SendStateTask, - private val paginationTask: PaginationTask, - private val contextOfEventTask: GetContextOfEventTask, - private val setReadMarkersTask: SetReadMarkersTask, - private val cryptoService: CryptoService, - private val findReactionEventForUndoTask: FindReactionEventForUndoTask, - private val fetchEditHistoryTask: FetchEditHistoryTask, - private val joinRoomTask: JoinRoomTask, - private val leaveRoomTask: LeaveRoomTask) { - fun create(roomId: String): Room { - val timelineService = DefaultTimelineService(roomId, monarchy, taskExecutor, contextOfEventTask, cryptoService, paginationTask) - val sendService = DefaultSendService(context, credentials, roomId, eventFactory, cryptoService, monarchy) - val stateService = DefaultStateService(roomId, monarchy.realmConfiguration, taskExecutor, sendStateTask) - val roomMembersService = DefaultMembershipService(roomId, monarchy, taskExecutor, loadRoomMembersTask, inviteTask, joinRoomTask, leaveRoomTask) - val readService = DefaultReadService(roomId, monarchy, taskExecutor, setReadMarkersTask, credentials) - val relationService = DefaultRelationService(context, - credentials, roomId, eventFactory, cryptoService, findReactionEventForUndoTask, fetchEditHistoryTask, monarchy, taskExecutor) +internal interface RoomFactory { + fun create(roomId: String): Room +} +internal class DefaultRoomFactory @Inject constructor(private val monarchy: Monarchy, + private val roomSummaryMapper: RoomSummaryMapper, + private val cryptoService: CryptoService, + private val timelineServiceFactory: DefaultTimelineService.Factory, + private val sendServiceFactory: DefaultSendService.Factory, + private val stateServiceFactory: DefaultStateService.Factory, + private val readServiceFactory: DefaultReadService.Factory, + private val relationServiceFactory: DefaultRelationService.Factory, + private val membershipServiceFactory: DefaultMembershipService.Factory) : + RoomFactory { + + override fun create(roomId: String): Room { return DefaultRoom( roomId, monarchy, roomSummaryMapper, - timelineService, - sendService, - stateService, - readService, + timelineServiceFactory.create(roomId), + sendServiceFactory.create(roomId), + stateServiceFactory.create(roomId), + readServiceFactory.create(roomId), cryptoService, - relationService, - roomMembersService + relationServiceFactory.create(roomId), + membershipServiceFactory.create(roomId) ) } 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 942239ea..572e03d0 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 @@ -22,12 +22,6 @@ import dagger.Provides import im.vector.matrix.android.api.session.file.FileService import im.vector.matrix.android.api.session.room.RoomDirectoryService import im.vector.matrix.android.api.session.room.RoomService -import im.vector.matrix.android.api.session.room.members.MembershipService -import im.vector.matrix.android.api.session.room.model.relation.RelationService -import im.vector.matrix.android.api.session.room.read.ReadService -import im.vector.matrix.android.api.session.room.send.SendService -import im.vector.matrix.android.api.session.room.state.StateService -import im.vector.matrix.android.api.session.room.timeline.TimelineService import im.vector.matrix.android.internal.session.DefaultFileService import im.vector.matrix.android.internal.session.SessionScope import im.vector.matrix.android.internal.session.room.create.CreateRoomTask @@ -37,7 +31,6 @@ import im.vector.matrix.android.internal.session.room.directory.DefaultGetThirdP import im.vector.matrix.android.internal.session.room.directory.GetPublicRoomTask import im.vector.matrix.android.internal.session.room.directory.GetThirdPartyProtocolsTask import im.vector.matrix.android.internal.session.room.membership.DefaultLoadRoomMembersTask -import im.vector.matrix.android.internal.session.room.membership.DefaultMembershipService import im.vector.matrix.android.internal.session.room.membership.LoadRoomMembersTask import im.vector.matrix.android.internal.session.room.membership.joining.DefaultInviteTask import im.vector.matrix.android.internal.session.room.membership.joining.DefaultJoinRoomTask @@ -47,15 +40,20 @@ import im.vector.matrix.android.internal.session.room.membership.leaving.Default import im.vector.matrix.android.internal.session.room.membership.leaving.LeaveRoomTask import im.vector.matrix.android.internal.session.room.prune.DefaultPruneEventTask import im.vector.matrix.android.internal.session.room.prune.PruneEventTask -import im.vector.matrix.android.internal.session.room.read.DefaultReadService import im.vector.matrix.android.internal.session.room.read.DefaultSetReadMarkersTask import im.vector.matrix.android.internal.session.room.read.SetReadMarkersTask -import im.vector.matrix.android.internal.session.room.relation.* -import im.vector.matrix.android.internal.session.room.send.DefaultSendService +import im.vector.matrix.android.internal.session.room.relation.DefaultFetchEditHistoryTask +import im.vector.matrix.android.internal.session.room.relation.DefaultFindReactionEventForUndoTask +import im.vector.matrix.android.internal.session.room.relation.DefaultUpdateQuickReactionTask +import im.vector.matrix.android.internal.session.room.relation.FetchEditHistoryTask +import im.vector.matrix.android.internal.session.room.relation.FindReactionEventForUndoTask +import im.vector.matrix.android.internal.session.room.relation.UpdateQuickReactionTask import im.vector.matrix.android.internal.session.room.state.DefaultSendStateTask -import im.vector.matrix.android.internal.session.room.state.DefaultStateService import im.vector.matrix.android.internal.session.room.state.SendStateTask -import im.vector.matrix.android.internal.session.room.timeline.* +import im.vector.matrix.android.internal.session.room.timeline.DefaultGetContextOfEventTask +import im.vector.matrix.android.internal.session.room.timeline.DefaultPaginationTask +import im.vector.matrix.android.internal.session.room.timeline.GetContextOfEventTask +import im.vector.matrix.android.internal.session.room.timeline.PaginationTask import retrofit2.Retrofit @Module @@ -71,6 +69,9 @@ internal abstract class RoomModule { } } + @Binds + abstract fun bindRoomFactory(roomFactory: DefaultRoomFactory): RoomFactory + @Binds abstract fun bindRoomService(roomService: DefaultRoomService): RoomService @@ -98,24 +99,15 @@ internal abstract class RoomModule { @Binds abstract fun bindLeaveRoomTask(leaveRoomTask: DefaultLeaveRoomTask): LeaveRoomTask - @Binds - abstract fun bindMembershipService(membershipService: DefaultMembershipService): MembershipService - @Binds abstract fun bindLoadRoomMembersTask(loadRoomMembersTask: DefaultLoadRoomMembersTask): LoadRoomMembersTask @Binds abstract fun bindPruneEventTask(pruneEventTask: DefaultPruneEventTask): PruneEventTask - @Binds - abstract fun bindReadService(readService: DefaultReadService): ReadService - @Binds abstract fun bindSetReadMarkersTask(setReadMarkersTask: DefaultSetReadMarkersTask): SetReadMarkersTask - @Binds - abstract fun bindRelationService(relationService: DefaultRelationService): RelationService - @Binds abstract fun bindFindReactionEventForUndoTask(findReactionEventForUndoTask: DefaultFindReactionEventForUndoTask): FindReactionEventForUndoTask @@ -125,21 +117,12 @@ internal abstract class RoomModule { @Binds abstract fun bindSendStateTask(sendStateTask: DefaultSendStateTask): SendStateTask - @Binds - abstract fun bindSendService(sendService: DefaultSendService): SendService - - @Binds - abstract fun bindStateService(stateService: DefaultStateService): StateService - @Binds abstract fun bindGetContextOfEventTask(getContextOfEventTask: DefaultGetContextOfEventTask): GetContextOfEventTask @Binds abstract fun bindPaginationTask(paginationTask: DefaultPaginationTask): PaginationTask - @Binds - abstract fun bindTimelineService(timelineService: DefaultTimelineService): TimelineService - @Binds abstract fun bindFileService(fileService: DefaultFileService): FileService diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/membership/DefaultMembershipService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/membership/DefaultMembershipService.kt index 7fca1e42..a1aac0ae 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/membership/DefaultMembershipService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/membership/DefaultMembershipService.kt @@ -17,6 +17,8 @@ package im.vector.matrix.android.internal.session.room.membership import androidx.lifecycle.LiveData +import com.squareup.inject.assisted.Assisted +import com.squareup.inject.assisted.AssistedInject import com.zhuinden.monarchy.Monarchy import im.vector.matrix.android.api.MatrixCallback import im.vector.matrix.android.api.session.events.model.toModel @@ -31,17 +33,21 @@ import im.vector.matrix.android.internal.session.room.membership.leaving.LeaveRo import im.vector.matrix.android.internal.task.TaskExecutor import im.vector.matrix.android.internal.task.configureWith import im.vector.matrix.android.internal.util.fetchCopied -import javax.inject.Inject -internal class DefaultMembershipService @Inject constructor(private val roomId: String, - private val monarchy: Monarchy, - private val taskExecutor: TaskExecutor, - private val loadRoomMembersTask: LoadRoomMembersTask, - private val inviteTask: InviteTask, - private val joinTask: JoinRoomTask, - private val leaveRoomTask: LeaveRoomTask +internal class DefaultMembershipService @AssistedInject constructor(@Assisted private val roomId: String, + private val monarchy: Monarchy, + private val taskExecutor: TaskExecutor, + private val loadRoomMembersTask: LoadRoomMembersTask, + private val inviteTask: InviteTask, + private val joinTask: JoinRoomTask, + private val leaveRoomTask: LeaveRoomTask ) : MembershipService { + @AssistedInject.Factory + interface Factory { + fun create(roomId: String): MembershipService + } + override fun loadRoomMembersIfNeeded(matrixCallback: MatrixCallback): Cancelable { val params = LoadRoomMembersTask.Params(roomId, Membership.LEAVE) return loadRoomMembersTask diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/read/DefaultReadService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/read/DefaultReadService.kt index 2e30c12e..eb31f5a9 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/read/DefaultReadService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/read/DefaultReadService.kt @@ -16,6 +16,8 @@ package im.vector.matrix.android.internal.session.room.read +import com.squareup.inject.assisted.Assisted +import com.squareup.inject.assisted.AssistedInject import com.zhuinden.monarchy.Monarchy import im.vector.matrix.android.api.MatrixCallback import im.vector.matrix.android.api.auth.data.Credentials @@ -27,13 +29,18 @@ import im.vector.matrix.android.internal.database.query.findLastLiveChunkFromRoo import im.vector.matrix.android.internal.database.query.where import im.vector.matrix.android.internal.task.TaskExecutor import im.vector.matrix.android.internal.task.configureWith -import javax.inject.Inject -internal class DefaultReadService @Inject constructor(private val roomId: String, - private val monarchy: Monarchy, - private val taskExecutor: TaskExecutor, - private val setReadMarkersTask: SetReadMarkersTask, - private val credentials: Credentials) : ReadService { +internal class DefaultReadService @AssistedInject constructor(@Assisted private val roomId: String, + private val monarchy: Monarchy, + private val taskExecutor: TaskExecutor, + private val setReadMarkersTask: SetReadMarkersTask, + private val credentials: Credentials +) : ReadService { + + @AssistedInject.Factory + interface Factory { + fun create(roomId: String): ReadService + } override fun markAllAsRead(callback: MatrixCallback) { val params = SetReadMarkersTask.Params(roomId, markAllAsRead = true) @@ -67,13 +74,13 @@ internal class DefaultReadService @Inject constructor(private val roomId: String var isEventRead = false monarchy.doWithRealm { val readReceipt = ReadReceiptEntity.where(it, roomId, credentials.userId).findFirst() - ?: return@doWithRealm + ?: return@doWithRealm val liveChunk = ChunkEntity.findLastLiveChunkFromRoom(it, roomId) - ?: return@doWithRealm + ?: return@doWithRealm val readReceiptIndex = liveChunk.timelineEvents.find(readReceipt.eventId)?.root?.displayIndex - ?: Int.MIN_VALUE + ?: Int.MIN_VALUE val eventToCheckIndex = liveChunk.timelineEvents.find(eventId)?.root?.displayIndex - ?: Int.MAX_VALUE + ?: Int.MAX_VALUE isEventRead = eventToCheckIndex <= readReceiptIndex } return isEventRead diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/relation/DefaultRelationService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/relation/DefaultRelationService.kt index cd31c978..addad44b 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/relation/DefaultRelationService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/relation/DefaultRelationService.kt @@ -19,6 +19,8 @@ import android.content.Context import androidx.lifecycle.LiveData import androidx.lifecycle.Transformations import androidx.work.OneTimeWorkRequest +import com.squareup.inject.assisted.Assisted +import com.squareup.inject.assisted.AssistedInject import com.zhuinden.monarchy.Monarchy import im.vector.matrix.android.api.MatrixCallback import im.vector.matrix.android.api.auth.data.Credentials @@ -45,19 +47,23 @@ import im.vector.matrix.android.internal.task.configureWith import im.vector.matrix.android.internal.util.CancelableWork import im.vector.matrix.android.internal.worker.WorkerParamsFactory import timber.log.Timber -import javax.inject.Inject -internal class DefaultRelationService @Inject constructor(private val context: Context, - private val credentials: Credentials, - private val roomId: String, - private val eventFactory: LocalEchoEventFactory, - private val cryptoService: CryptoService, - private val findReactionEventForUndoTask: FindReactionEventForUndoTask, - private val fetchEditHistoryTask: FetchEditHistoryTask, - private val monarchy: Monarchy, - private val taskExecutor: TaskExecutor) +internal class DefaultRelationService @AssistedInject constructor(@Assisted private val roomId: String, + private val context: Context, + private val credentials: Credentials, + private val eventFactory: LocalEchoEventFactory, + private val cryptoService: CryptoService, + private val findReactionEventForUndoTask: FindReactionEventForUndoTask, + private val fetchEditHistoryTask: FetchEditHistoryTask, + private val monarchy: Monarchy, + private val taskExecutor: TaskExecutor) : RelationService { + @AssistedInject.Factory + interface Factory { + fun create(roomId: String): RelationService + } + override fun sendReaction(reaction: String, targetEventId: String): Cancelable { val event = eventFactory.createReactionEvent(roomId, targetEventId, reaction) .also { @@ -148,9 +154,9 @@ internal class DefaultRelationService @Inject constructor(private val context: C compatibilityBodyText: String): Cancelable { val event = eventFactory .createReplaceTextOfReply(roomId, - replyToEdit, - originalEvent, - newBodyText, true, MessageType.MSGTYPE_TEXT, compatibilityBodyText) + replyToEdit, + originalEvent, + newBodyText, true, MessageType.MSGTYPE_TEXT, compatibilityBodyText) .also { saveLocalEcho(it) } @@ -214,7 +220,7 @@ internal class DefaultRelationService @Inject constructor(private val context: C } return Transformations.map(liveEntity) { realmResults -> realmResults.firstOrNull()?.asDomain() - ?: EventAnnotationsSummary(eventId, emptyList(), null) + ?: EventAnnotationsSummary(eventId, emptyList(), null) } } @@ -227,7 +233,7 @@ internal class DefaultRelationService @Inject constructor(private val context: C private fun saveLocalEcho(event: Event) { monarchy.writeAsync { realm -> val roomEntity = RoomEntity.where(realm, roomId = roomId).findFirst() - ?: return@writeAsync + ?: return@writeAsync roomEntity.addSendingEvent(event) } } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/DefaultSendService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/DefaultSendService.kt index d822e949..2c20839b 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/DefaultSendService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/DefaultSendService.kt @@ -17,12 +17,22 @@ package im.vector.matrix.android.internal.session.room.send import android.content.Context -import androidx.work.* +import androidx.work.BackoffPolicy +import androidx.work.ExistingWorkPolicy +import androidx.work.OneTimeWorkRequest +import androidx.work.Operation +import androidx.work.WorkManager +import com.squareup.inject.assisted.Assisted +import com.squareup.inject.assisted.AssistedInject import com.zhuinden.monarchy.Monarchy import im.vector.matrix.android.api.auth.data.Credentials import im.vector.matrix.android.api.session.content.ContentAttachmentData import im.vector.matrix.android.api.session.crypto.CryptoService -import im.vector.matrix.android.api.session.events.model.* +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.api.session.events.model.isImageMessage +import im.vector.matrix.android.api.session.events.model.isTextMessage +import im.vector.matrix.android.api.session.events.model.toModel import im.vector.matrix.android.api.session.room.model.message.MessageContent import im.vector.matrix.android.api.session.room.model.message.MessageType import im.vector.matrix.android.api.session.room.send.SendService @@ -47,18 +57,22 @@ import im.vector.matrix.android.internal.worker.startChain import timber.log.Timber import java.util.concurrent.Executors import java.util.concurrent.TimeUnit -import javax.inject.Inject private const val UPLOAD_WORK = "UPLOAD_WORK" private const val BACKOFF_DELAY = 10_000L -internal class DefaultSendService @Inject constructor(private val context: Context, - private val credentials: Credentials, - private val roomId: String, - private val localEchoEventFactory: LocalEchoEventFactory, - private val cryptoService: CryptoService, - private val monarchy: Monarchy) - : SendService { +internal class DefaultSendService @AssistedInject constructor(@Assisted private val roomId: String, + private val context: Context, + private val credentials: Credentials, + private val localEchoEventFactory: LocalEchoEventFactory, + private val cryptoService: CryptoService, + private val monarchy: Monarchy +) : SendService { + + @AssistedInject.Factory + interface Factory { + fun create(roomId: String): SendService + } private val workerFutureListenerExecutor = Executors.newSingleThreadExecutor() override fun sendTextMessage(text: String, msgType: String, autoMarkdown: Boolean): Cancelable { @@ -152,11 +166,11 @@ internal class DefaultSendService @Inject constructor(private val context: Conte override fun deleteFailedEcho(localEcho: TimelineEvent) { monarchy.writeAsync { realm -> TimelineEventEntity.where(realm, eventId = localEcho.root.eventId - ?: "").findFirst()?.let { + ?: "").findFirst()?.let { it.deleteFromRealm() } EventEntity.where(realm, eventId = localEcho.root.eventId - ?: "").findFirst()?.let { + ?: "").findFirst()?.let { it.deleteFromRealm() } } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/state/DefaultStateService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/state/DefaultStateService.kt index 60999b61..f51b0e04 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/state/DefaultStateService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/state/DefaultStateService.kt @@ -16,6 +16,8 @@ package im.vector.matrix.android.internal.session.room.state +import com.squareup.inject.assisted.Assisted +import com.squareup.inject.assisted.AssistedInject import im.vector.matrix.android.api.MatrixCallback import im.vector.matrix.android.api.session.events.model.Event import im.vector.matrix.android.api.session.events.model.EventType @@ -29,13 +31,18 @@ import im.vector.matrix.android.internal.task.TaskExecutor import im.vector.matrix.android.internal.task.configureWith import io.realm.Realm import io.realm.RealmConfiguration -import javax.inject.Inject -internal class DefaultStateService @Inject constructor(private val roomId: String, - @SessionDatabase - private val realmConfiguration: RealmConfiguration, - private val taskExecutor: TaskExecutor, - private val sendStateTask: SendStateTask) : StateService { +internal class DefaultStateService @AssistedInject constructor(@Assisted private val roomId: String, + @SessionDatabase + private val realmConfiguration: RealmConfiguration, + private val taskExecutor: TaskExecutor, + private val sendStateTask: SendStateTask +) : StateService { + + @AssistedInject.Factory + interface Factory { + fun create(roomId: String): StateService + } override fun getStateEvent(eventType: String): Event? { return Realm.getInstance(realmConfiguration).use { realm -> @@ -45,10 +52,10 @@ internal class DefaultStateService @Inject constructor(private val roomId: Strin override fun updateTopic(topic: String, callback: MatrixCallback) { val params = SendStateTask.Params(roomId, - EventType.STATE_ROOM_TOPIC, - mapOf( - "topic" to topic - )) + EventType.STATE_ROOM_TOPIC, + mapOf( + "topic" to topic + )) sendStateTask diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/DefaultTimelineService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/DefaultTimelineService.kt index d70f1b92..d41b74ca 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/DefaultTimelineService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/DefaultTimelineService.kt @@ -18,6 +18,8 @@ package im.vector.matrix.android.internal.session.room.timeline import androidx.lifecycle.LiveData import androidx.lifecycle.Transformations +import com.squareup.inject.assisted.Assisted +import com.squareup.inject.assisted.AssistedInject import com.zhuinden.monarchy.Monarchy import im.vector.matrix.android.api.session.crypto.CryptoService import im.vector.matrix.android.api.session.room.timeline.Timeline @@ -29,16 +31,20 @@ import im.vector.matrix.android.internal.database.model.TimelineEventEntity import im.vector.matrix.android.internal.database.query.where import im.vector.matrix.android.internal.task.TaskExecutor import im.vector.matrix.android.internal.util.fetchCopyMap -import javax.inject.Inject -internal class DefaultTimelineService @Inject constructor(private val roomId: String, - private val monarchy: Monarchy, - private val taskExecutor: TaskExecutor, - private val contextOfEventTask: GetContextOfEventTask, - private val cryptoService: CryptoService, - private val paginationTask: PaginationTask +internal class DefaultTimelineService @AssistedInject constructor(@Assisted private val roomId: String, + private val monarchy: Monarchy, + private val taskExecutor: TaskExecutor, + private val contextOfEventTask: GetContextOfEventTask, + private val cryptoService: CryptoService, + private val paginationTask: PaginationTask ) : TimelineService { + @AssistedInject.Factory + interface Factory { + fun create(roomId: String): TimelineService + } + override fun createTimeline(eventId: String?, allowedTypes: List?): Timeline { return DefaultTimeline(roomId, eventId, diff --git a/vector/src/main/java/im/vector/riotx/core/di/AssistedInjectModule.kt b/vector/src/main/java/im/vector/riotx/core/di/AssistedInjectModule.kt new file mode 100644 index 00000000..915780db --- /dev/null +++ b/vector/src/main/java/im/vector/riotx/core/di/AssistedInjectModule.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2019 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.riotx.core.di + +import com.squareup.inject.assisted.dagger2.AssistedModule +import dagger.Module + +@AssistedModule +@Module(includes = [AssistedInject_AssistedInjectModule::class]) +interface AssistedInjectModule \ No newline at end of file diff --git a/vector/src/main/java/im/vector/riotx/core/di/ScreenComponent.kt b/vector/src/main/java/im/vector/riotx/core/di/ScreenComponent.kt index fb1c18f9..c6f71189 100644 --- a/vector/src/main/java/im/vector/riotx/core/di/ScreenComponent.kt +++ b/vector/src/main/java/im/vector/riotx/core/di/ScreenComponent.kt @@ -41,7 +41,11 @@ import im.vector.riotx.features.home.createdirect.CreateDirectRoomDirectoryUsers import im.vector.riotx.features.home.createdirect.CreateDirectRoomKnownUsersFragment import im.vector.riotx.features.home.group.GroupListFragment import im.vector.riotx.features.home.room.detail.RoomDetailFragment -import im.vector.riotx.features.home.room.detail.timeline.action.* +import im.vector.riotx.features.home.room.detail.timeline.action.MessageActionsBottomSheet +import im.vector.riotx.features.home.room.detail.timeline.action.MessageMenuFragment +import im.vector.riotx.features.home.room.detail.timeline.action.QuickReactionFragment +import im.vector.riotx.features.home.room.detail.timeline.action.ViewEditHistoryBottomSheet +import im.vector.riotx.features.home.room.detail.timeline.action.ViewReactionBottomSheet import im.vector.riotx.features.home.room.filtered.FilteredRoomsActivity import im.vector.riotx.features.home.room.list.RoomListFragment import im.vector.riotx.features.invite.VectorInviteView @@ -59,10 +63,16 @@ import im.vector.riotx.features.roomdirectory.createroom.CreateRoomActivity import im.vector.riotx.features.roomdirectory.createroom.CreateRoomFragment import im.vector.riotx.features.roomdirectory.picker.RoomDirectoryPickerFragment import im.vector.riotx.features.roomdirectory.roompreview.RoomPreviewNoPreviewFragment -import im.vector.riotx.features.settings.* +import im.vector.riotx.features.settings.VectorSettingsActivity +import im.vector.riotx.features.settings.VectorSettingsAdvancedNotificationPreferenceFragment +import im.vector.riotx.features.settings.VectorSettingsHelpAboutFragment +import im.vector.riotx.features.settings.VectorSettingsNotificationPreferenceFragment +import im.vector.riotx.features.settings.VectorSettingsNotificationsTroubleshootFragment +import im.vector.riotx.features.settings.VectorSettingsPreferencesFragment +import im.vector.riotx.features.settings.VectorSettingsSecurityPrivacyFragment import im.vector.riotx.features.settings.push.PushGatewaysFragment -@Component(dependencies = [VectorComponent::class], modules = [ViewModelModule::class, HomeModule::class]) +@Component(dependencies = [VectorComponent::class], modules = [AssistedInjectModule::class, ViewModelModule::class, HomeModule::class]) @ScreenScope interface ScreenComponent { diff --git a/vector/src/main/java/im/vector/riotx/core/di/ViewModelModule.kt b/vector/src/main/java/im/vector/riotx/core/di/ViewModelModule.kt index 80410f87..954b067d 100644 --- a/vector/src/main/java/im/vector/riotx/core/di/ViewModelModule.kt +++ b/vector/src/main/java/im/vector/riotx/core/di/ViewModelModule.kt @@ -25,41 +25,17 @@ import im.vector.riotx.core.platform.ConfigurationViewModel import im.vector.riotx.features.crypto.keysbackup.restore.KeysBackupRestoreFromKeyViewModel import im.vector.riotx.features.crypto.keysbackup.restore.KeysBackupRestoreFromPassphraseViewModel import im.vector.riotx.features.crypto.keysbackup.restore.KeysBackupRestoreSharedViewModel -import im.vector.riotx.features.crypto.keysbackup.settings.KeysBackupSettingsViewModel -import im.vector.riotx.features.crypto.keysbackup.settings.KeysBackupSettingsViewModel_AssistedFactory import im.vector.riotx.features.crypto.keysbackup.setup.KeysBackupSetupSharedViewModel import im.vector.riotx.features.crypto.verification.SasVerificationViewModel -import im.vector.riotx.features.home.* +import im.vector.riotx.features.home.HomeNavigationViewModel import im.vector.riotx.features.home.createdirect.CreateDirectRoomNavigationViewModel -import im.vector.riotx.features.home.createdirect.CreateDirectRoomViewModel -import im.vector.riotx.features.home.createdirect.CreateDirectRoomViewModel_AssistedFactory -import im.vector.riotx.features.home.group.GroupListViewModel -import im.vector.riotx.features.home.group.GroupListViewModel_AssistedFactory -import im.vector.riotx.features.home.room.detail.RoomDetailViewModel -import im.vector.riotx.features.home.room.detail.RoomDetailViewModel_AssistedFactory -import im.vector.riotx.features.home.room.detail.composer.TextComposerViewModel -import im.vector.riotx.features.home.room.detail.composer.TextComposerViewModel_AssistedFactory -import im.vector.riotx.features.home.room.detail.timeline.action.* -import im.vector.riotx.features.home.room.list.RoomListViewModel -import im.vector.riotx.features.home.room.list.RoomListViewModel_AssistedFactory import im.vector.riotx.features.reactions.EmojiChooserViewModel import im.vector.riotx.features.roomdirectory.RoomDirectoryNavigationViewModel -import im.vector.riotx.features.roomdirectory.RoomDirectoryViewModel -import im.vector.riotx.features.roomdirectory.RoomDirectoryViewModel_AssistedFactory -import im.vector.riotx.features.roomdirectory.createroom.CreateRoomViewModel -import im.vector.riotx.features.roomdirectory.createroom.CreateRoomViewModel_AssistedFactory -import im.vector.riotx.features.roomdirectory.picker.RoomDirectoryPickerViewModel -import im.vector.riotx.features.roomdirectory.picker.RoomDirectoryPickerViewModel_AssistedFactory -import im.vector.riotx.features.roomdirectory.roompreview.RoomPreviewViewModel -import im.vector.riotx.features.roomdirectory.roompreview.RoomPreviewViewModel_AssistedFactory -import im.vector.riotx.features.settings.push.PushGatewaysViewModel -import im.vector.riotx.features.settings.push.PushGatewaysViewModel_AssistedFactory import im.vector.riotx.features.workers.signout.SignOutViewModel @Module interface ViewModelModule { - /** * ViewModels with @IntoMap will be injected by this factory */ @@ -69,6 +45,7 @@ interface ViewModelModule { /** * Below are bindings for the androidx view models (which extend ViewModel). Will be converted to MvRx ViewModel in the future. */ + @Binds @IntoMap @ViewModelKey(SignOutViewModel::class) @@ -124,62 +101,4 @@ interface ViewModelModule { @ViewModelKey(CreateDirectRoomNavigationViewModel::class) fun bindCreateDirectRoomNavigationViewModel(viewModel: CreateDirectRoomNavigationViewModel): ViewModel - /** - * Below are bindings for the MvRx view models (which extend VectorViewModel). Will be the only usage in the future. - */ - - @Binds - fun bindHomeActivityViewModelFactory(factory: HomeActivityViewModel_AssistedFactory): HomeActivityViewModel.Factory - - @Binds - fun bindTextComposerViewModelFactory(factory: TextComposerViewModel_AssistedFactory): TextComposerViewModel.Factory - - @Binds - fun bindRoomDetailViewModelFactory(factory: RoomDetailViewModel_AssistedFactory): RoomDetailViewModel.Factory - - @Binds - fun bindQuickReactionViewModelFactory(factory: QuickReactionViewModel_AssistedFactory): QuickReactionViewModel.Factory - - @Binds - fun bindMessageActionsViewModelFactory(factory: MessageActionsViewModel_AssistedFactory): MessageActionsViewModel.Factory - - @Binds - fun bindMessageMenuViewModelFactory(factory: MessageMenuViewModel_AssistedFactory): MessageMenuViewModel.Factory - - @Binds - fun bindRoomListViewModelFactory(factory: RoomListViewModel_AssistedFactory): RoomListViewModel.Factory - - @Binds - fun bindGroupListViewModelFactory(factory: GroupListViewModel_AssistedFactory): GroupListViewModel.Factory - - @Binds - fun bindHomeDetailViewModelFactory(factory: HomeDetailViewModel_AssistedFactory): HomeDetailViewModel.Factory - - @Binds - fun bindKeysBackupSettingsViewModelFactory(factory: KeysBackupSettingsViewModel_AssistedFactory): KeysBackupSettingsViewModel.Factory - - @Binds - fun bindRoomDirectoryPickerViewModelFactory(factory: RoomDirectoryPickerViewModel_AssistedFactory): RoomDirectoryPickerViewModel.Factory - - @Binds - fun bindRoomDirectoryViewModelFactory(factory: RoomDirectoryViewModel_AssistedFactory): RoomDirectoryViewModel.Factory - - @Binds - fun bindRoomPreviewViewModelFactory(factory: RoomPreviewViewModel_AssistedFactory): RoomPreviewViewModel.Factory - - @Binds - fun bindViewReactionViewModelFactory(factory: ViewReactionViewModel_AssistedFactory): ViewReactionViewModel.Factory - - @Binds - fun bindViewEditHistoryViewModelFactory(factory: ViewEditHistoryViewModel_AssistedFactory): ViewEditHistoryViewModel.Factory - - @Binds - fun bindCreateRoomViewModelFactory(factory: CreateRoomViewModel_AssistedFactory): CreateRoomViewModel.Factory - - @Binds - fun bindCreateDirectRoomViewModelFactory(factory: CreateDirectRoomViewModel_AssistedFactory): CreateDirectRoomViewModel.Factory - - @Binds - fun bindPushGatewaysViewModelFactory(factory: PushGatewaysViewModel_AssistedFactory): PushGatewaysViewModel.Factory - } \ No newline at end of file