From 4be0ab87fc91d2f7c18b7eaea45482552f1cfa0c Mon Sep 17 00:00:00 2001 From: ganfra Date: Sun, 16 Jun 2019 17:00:47 +0200 Subject: [PATCH] Dagger: continue adding it to SDK [WIP] --- .../interceptors/CurlLoggingInterceptor.kt | 2 +- .../matrix/android/internal/SessionManager.kt | 43 ++++++ .../android/internal/auth/AuthModule.kt | 40 ++++-- .../internal/auth/DefaultAuthenticator.kt | 10 +- .../auth/db/RealmSessionParamsStore.kt | 2 + .../internal/auth/db/SessionParamsMapper.kt | 7 +- .../android/internal/crypto/CryptoModule.kt | 9 +- .../android/internal/di/ChildWorkerFactory.kt | 27 ---- .../internal/di/MatrixAssistedInjectModule.kt | 26 ++++ .../android/internal/di/MatrixComponent.kt | 26 +++- .../android/internal/di/MatrixModule.kt | 23 ++- .../internal/session/DefaultSession.kt | 2 +- .../internal/session/SessionComponent.kt | 40 +++++- .../internal/session/SessionFactory.kt | 75 ---------- .../android/internal/session/SessionModule.kt | 20 ++- .../internal/session/cache/CacheModule.kt | 38 +++++ ...CacheService.kt => DefaultCacheService.kt} | 4 +- .../internal/session/content/ContentModule.kt | 12 +- .../internal/session/content/FileUploader.kt | 6 +- .../session/content/UploadContentWorker.kt | 4 +- .../internal/session/filter/FilterModule.kt | 54 +++++++ .../session/group/DefaultGroupService.kt | 2 + .../session/group/GetGroupDataWorker.kt | 4 +- .../internal/session/group/GroupModule.kt | 24 +++- .../internal/session/room/DefaultRoom.kt | 5 +- .../session/room/DefaultRoomService.kt | 2 +- .../internal/session/room/RoomFactory.kt | 2 +- .../internal/session/room/RoomModule.kt | 135 +++++++++++++++--- .../session/room/create/CreateRoomTask.kt | 2 +- .../room/relation/SendRelationWorker.kt | 4 +- .../session/room/send/EncryptEventWorker.kt | 20 ++- .../session/room/send/EventFactory.kt | 5 +- .../session/room/send/RedactEventWorker.kt | 17 ++- .../session/room/send/SendEventWorker.kt | 4 +- .../session/room/timeline/DefaultTimeline.kt | 6 +- .../session/room/timeline/GetEventTask.kt | 3 + .../internal/session/signout/SignOutModule.kt | 26 +++- .../internal/session/sync/SyncModule.kt | 20 ++- .../internal/session/user/UserModule.kt | 37 +++++ .../matrix/android/internal/worker/DI.kt | 71 +++++++++ .../internal/worker/DelegateWorkerFactory.kt | 29 ++++ .../internal/worker/MatrixWorkerFactory.kt | 45 ++++++ 42 files changed, 713 insertions(+), 220 deletions(-) create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/SessionManager.kt delete mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/di/ChildWorkerFactory.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/di/MatrixAssistedInjectModule.kt delete mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionFactory.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/cache/CacheModule.kt rename matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/cache/{RealmCacheService.kt => DefaultCacheService.kt} (85%) create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/filter/FilterModule.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/user/UserModule.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/worker/DI.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/worker/DelegateWorkerFactory.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/worker/MatrixWorkerFactory.kt diff --git a/matrix-sdk-android/src/debug/java/im/vector/matrix/android/internal/network/interceptors/CurlLoggingInterceptor.kt b/matrix-sdk-android/src/debug/java/im/vector/matrix/android/internal/network/interceptors/CurlLoggingInterceptor.kt index 33f460bd..3d499be3 100644 --- a/matrix-sdk-android/src/debug/java/im/vector/matrix/android/internal/network/interceptors/CurlLoggingInterceptor.kt +++ b/matrix-sdk-android/src/debug/java/im/vector/matrix/android/internal/network/interceptors/CurlLoggingInterceptor.kt @@ -36,7 +36,7 @@ import javax.inject.Inject * non-production environment. */ @MatrixScope -internal class CurlLoggingInterceptor @Inject constructor(private val logger: HttpLoggingInterceptor.Logger = HttpLoggingInterceptor.Logger.DEFAULT) +internal class CurlLoggingInterceptor @Inject constructor(private val logger: HttpLoggingInterceptor.Logger) : Interceptor { /** diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/SessionManager.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/SessionManager.kt new file mode 100644 index 00000000..b46e4b78 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/SessionManager.kt @@ -0,0 +1,43 @@ +/* + * + * * 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 + +import im.vector.matrix.android.api.session.Session +import im.vector.matrix.android.internal.di.MatrixScope +import im.vector.matrix.android.internal.session.SessionComponent +import javax.inject.Inject + +@MatrixScope +internal class SessionManager @Inject constructor() { + + private val sessionComponents = HashMap() + private val sessions = HashMap() + + fun createSession(userId: String): Session? { + if (sessionComponents.containsKey(userId)) { + throw RuntimeException("You already have a session for the user $userId") + } + return null + } + + fun releaseSession(userId: String) { + } + + +} \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/AuthModule.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/AuthModule.kt index 3653f7df..1e11a3c3 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/AuthModule.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/AuthModule.kt @@ -17,27 +17,43 @@ package im.vector.matrix.android.internal.auth import android.content.Context +import dagger.Binds import dagger.Module import dagger.Provides import im.vector.matrix.android.internal.auth.db.AuthRealmModule +import im.vector.matrix.android.internal.auth.db.RealmSessionParamsStore import im.vector.matrix.android.internal.di.MatrixScope +import im.vector.matrix.android.internal.session.SessionScope +import im.vector.matrix.android.internal.session.cache.ClearCacheTask +import im.vector.matrix.android.internal.session.cache.RealmClearCacheTask import io.realm.RealmConfiguration import java.io.File +import javax.inject.Named @Module -internal class AuthModule { +internal abstract class AuthModule { - @Provides - @MatrixScope - fun providesRealmConfiguration(context: Context): RealmConfiguration { - val old = File(context.filesDir, "matrix-sdk-auth") - if (old.exists()) { - old.renameTo(File(context.filesDir, "matrix-sdk-auth.realm")) + @Module + companion object { + @Provides + @MatrixScope + @Named("AuthRealmConfiguration") + fun providesRealmConfiguration(context: Context): RealmConfiguration { + val old = File(context.filesDir, "matrix-sdk-auth") + if (old.exists()) { + old.renameTo(File(context.filesDir, "matrix-sdk-auth.realm")) + } + return RealmConfiguration.Builder() + .name("matrix-sdk-auth.realm") + .modules(AuthRealmModule()) + .deleteRealmIfMigrationNeeded() + .build() } - return RealmConfiguration.Builder() - .name("matrix-sdk-auth.realm") - .modules(AuthRealmModule()) - .deleteRealmIfMigrationNeeded() - .build() } + + @Binds + @MatrixScope + abstract fun bindSessionParamsStore(sessionParamsStore: RealmSessionParamsStore): SessionParamsStore + + } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/DefaultAuthenticator.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/DefaultAuthenticator.kt index 8d6f8d29..4acd9800 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/DefaultAuthenticator.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/DefaultAuthenticator.kt @@ -24,12 +24,11 @@ import im.vector.matrix.android.api.auth.data.HomeServerConnectionConfig import im.vector.matrix.android.api.auth.data.SessionParams import im.vector.matrix.android.api.session.Session import im.vector.matrix.android.api.util.Cancelable +import im.vector.matrix.android.internal.SessionManager import im.vector.matrix.android.internal.auth.data.PasswordLoginParams import im.vector.matrix.android.internal.auth.data.ThreePidMedium import im.vector.matrix.android.internal.di.MatrixScope import im.vector.matrix.android.internal.network.executeRequest -import im.vector.matrix.android.internal.session.DefaultSession -import im.vector.matrix.android.internal.session.SessionFactory import im.vector.matrix.android.internal.util.CancelableCoroutine import im.vector.matrix.android.internal.util.MatrixCoroutineDispatchers import kotlinx.coroutines.GlobalScope @@ -37,13 +36,12 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import retrofit2.Retrofit import javax.inject.Inject -import kotlin.random.Random @MatrixScope internal class DefaultAuthenticator @Inject constructor(private val retrofitBuilder: Retrofit.Builder, private val coroutineDispatchers: MatrixCoroutineDispatchers, private val sessionParamsStore: SessionParamsStore, - private val sessionFactory: DefaultSession.Factory + private val sessionManager: SessionManager ) : Authenticator { override fun hasActiveSessions(): Boolean { @@ -53,7 +51,7 @@ internal class DefaultAuthenticator @Inject constructor(private val retrofitBuil override fun getLastActiveSession(): Session? { val sessionParams = sessionParamsStore.get() return sessionParams?.let { - sessionFactory.create(it) + sessionManager.createSession(it.credentials.userId) } } @@ -87,7 +85,7 @@ internal class DefaultAuthenticator @Inject constructor(private val retrofitBuil sessionParamsStore.save(sessionParams) sessionParams }.map { - sessionFactory.create(it) + sessionManager.createSession(it.credentials.userId)!! } } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/db/RealmSessionParamsStore.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/db/RealmSessionParamsStore.kt index ecb442ca..94b86a18 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/db/RealmSessionParamsStore.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/db/RealmSessionParamsStore.kt @@ -23,9 +23,11 @@ import im.vector.matrix.android.internal.di.MatrixScope import io.realm.Realm import io.realm.RealmConfiguration import javax.inject.Inject +import javax.inject.Named @MatrixScope internal class RealmSessionParamsStore @Inject constructor(private val mapper: SessionParamsMapper, + @Named("AuthRealmConfiguration") private val realmConfiguration: RealmConfiguration) : SessionParamsStore { override fun save(sessionParams: SessionParams): Try { diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/db/SessionParamsMapper.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/db/SessionParamsMapper.kt index 7fc0a334..53e3a98a 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/db/SessionParamsMapper.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/db/SessionParamsMapper.kt @@ -17,11 +17,14 @@ package im.vector.matrix.android.internal.auth.db import com.squareup.moshi.Moshi -import im.vector.matrix.android.api.auth.data.HomeServerConnectionConfig import im.vector.matrix.android.api.auth.data.Credentials +import im.vector.matrix.android.api.auth.data.HomeServerConnectionConfig import im.vector.matrix.android.api.auth.data.SessionParams +import im.vector.matrix.android.internal.di.MatrixScope +import javax.inject.Inject -internal class SessionParamsMapper(moshi: Moshi) { +@MatrixScope +internal class SessionParamsMapper @Inject constructor(moshi: Moshi) { private val credentialsAdapter = moshi.adapter(Credentials::class.java) private val homeServerConnectionConfigAdapter = moshi.adapter(HomeServerConnectionConfig::class.java) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/CryptoModule.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/CryptoModule.kt index 775eaad4..acb8045d 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/CryptoModule.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/CryptoModule.kt @@ -31,6 +31,7 @@ import im.vector.matrix.android.internal.session.SessionScope import io.realm.RealmConfiguration import retrofit2.Retrofit import java.io.File +import javax.inject.Named @Module internal class CryptoModule { @@ -38,6 +39,7 @@ internal class CryptoModule { // Realm configuration, named to avoid clash with main cache realm configuration @Provides @SessionScope + @Named("CryptonRealmConfiguration") fun providesRealmConfiguration(context: Context, credentials: Credentials): RealmConfiguration { return RealmConfiguration.Builder() .directory(File(context.filesDir, credentials.userId.hash())) @@ -50,10 +52,11 @@ internal class CryptoModule { @Provides @SessionScope - fun providesCryptoStore(realmConfiguration: RealmConfiguration, credentials: Credentials): IMXCryptoStore { + fun providesCryptoStore(@Named("CryptonRealmConfiguration") + realmConfiguration: RealmConfiguration, credentials: Credentials): IMXCryptoStore { return RealmCryptoStore(false /* TODO*/, - realmConfiguration, - credentials) + realmConfiguration, + credentials) } @Provides diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/di/ChildWorkerFactory.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/di/ChildWorkerFactory.kt deleted file mode 100644 index 169bcb6f..00000000 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/di/ChildWorkerFactory.kt +++ /dev/null @@ -1,27 +0,0 @@ -/* - * 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 android.content.Context -import androidx.work.ListenableWorker -import androidx.work.WorkerParameters - -interface ChildWorkerFactory { - - fun create(appContext: Context, params: WorkerParameters): ListenableWorker - -} \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/di/MatrixAssistedInjectModule.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/di/MatrixAssistedInjectModule.kt new file mode 100644 index 00000000..8f5723d0 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/di/MatrixAssistedInjectModule.kt @@ -0,0 +1,26 @@ +/* + * + * * 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 + +@Module(includes = [AssistedInject_MatrixAssistedInjectModule::class]) +@AssistedModule +internal interface MatrixAssistedInjectModule \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/di/MatrixComponent.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/di/MatrixComponent.kt index 444475d5..aa91eadc 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/di/MatrixComponent.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/di/MatrixComponent.kt @@ -16,10 +16,32 @@ package im.vector.matrix.android.internal.di +import android.content.Context +import com.squareup.moshi.Moshi +import dagger.BindsInstance import dagger.Component +import im.vector.matrix.android.internal.auth.AuthModule +import im.vector.matrix.android.internal.util.MatrixCoroutineDispatchers +import im.vector.matrix.android.internal.worker.WorkerBindingModule +import retrofit2.Retrofit +import java.net.Authenticator -@Component + +@Component(modules = [MatrixModule::class, NetworkModule::class, AuthModule::class]) @MatrixScope -interface MatrixComponent { +internal interface MatrixComponent { + + fun matrixCoroutineDispatchers(): MatrixCoroutineDispatchers + + fun moshi(): Moshi + + fun retrofitBuilder(): Retrofit.Builder + + fun authenticator(): Authenticator + + @Component.Factory + interface Factory { + fun create(@BindsInstance context: Context): MatrixComponent + } } \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/di/MatrixModule.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/di/MatrixModule.kt index 795ec83c..b2bbefd5 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/di/MatrixModule.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/di/MatrixModule.kt @@ -16,7 +16,6 @@ package im.vector.matrix.android.internal.di -import android.content.Context import dagger.Module import dagger.Provides import im.vector.matrix.android.internal.crypto.CryptoAsyncHelper @@ -25,23 +24,17 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.android.asCoroutineDispatcher @Module -internal class MatrixModule(private val context: Context) { - - @Provides - @MatrixScope - fun providesContext(): Context { - return context - } +internal class MatrixModule { @Provides @MatrixScope fun providesMatrixCoroutineDispatchers(): MatrixCoroutineDispatchers { - val cryptoHandler = CryptoAsyncHelper.getDecryptBackgroundHandler() - return MatrixCoroutineDispatchers(io = Dispatchers.IO, - computation = Dispatchers.IO, - main = Dispatchers.Main, - crypto = cryptoHandler.asCoroutineDispatcher("crypto") - ) - } + val cryptoHandler = CryptoAsyncHelper.getDecryptBackgroundHandler() + return MatrixCoroutineDispatchers(io = Dispatchers.IO, + computation = Dispatchers.IO, + main = Dispatchers.Main, + crypto = cryptoHandler.asCoroutineDispatcher("crypto") + ) + } } \ 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 80f60b8c..ec272083 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 @@ -42,7 +42,7 @@ import im.vector.matrix.android.internal.database.LiveEntityObserver import im.vector.matrix.android.internal.session.sync.job.SyncThread import timber.log.Timber - +@SessionScope internal class DefaultSession @AssistedInject constructor(@Assisted override val sessionParams: SessionParams, private val monarchy: Monarchy, private val liveEntityUpdaters: List, 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 74eb73b4..1283f3b0 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 @@ -16,16 +16,46 @@ package im.vector.matrix.android.internal.session +import dagger.BindsInstance import dagger.Component +import im.vector.matrix.android.api.auth.data.SessionParams +import im.vector.matrix.android.internal.crypto.CryptoModule +import im.vector.matrix.android.internal.di.MatrixAssistedInjectModule import im.vector.matrix.android.internal.di.MatrixComponent +import im.vector.matrix.android.internal.session.content.ContentModule +import im.vector.matrix.android.internal.session.cache.CacheModule +import im.vector.matrix.android.internal.session.filter.FilterModule +import im.vector.matrix.android.internal.session.group.GroupModule +import im.vector.matrix.android.internal.session.room.RoomModule +import im.vector.matrix.android.internal.session.signout.SignOutModule +import im.vector.matrix.android.internal.session.sync.SyncModule +import im.vector.matrix.android.internal.worker.WorkerBindingModule -@Component(dependencies = [MatrixComponent::class]) +@Component(dependencies = [MatrixComponent::class], + modules = [ + SessionModule::class, + RoomModule::class, + SyncModule::class, + SignOutModule::class, + GroupModule::class, + FilterModule::class, + GroupModule::class, + ContentModule::class, + CacheModule::class, + CryptoModule::class, + MatrixAssistedInjectModule::class, + WorkerBindingModule::class + ] +) @SessionScope -interface SessionComponent { +internal interface SessionComponent { - @Component.Builder - interface Builder { - fun matrixComponent(matrixComponent: MatrixComponent): Builder + @Component.Factory + interface Factory { + fun create( + matrixComponent: MatrixComponent, + @BindsInstance sessionParams: SessionParams): SessionComponent } + } \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionFactory.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionFactory.kt deleted file mode 100644 index ef5a0e4c..00000000 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionFactory.kt +++ /dev/null @@ -1,75 +0,0 @@ -/* - * 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.session - -import com.zhuinden.monarchy.Monarchy -import im.vector.matrix.android.api.auth.data.SessionParams -import im.vector.matrix.android.api.session.Session -import im.vector.matrix.android.api.session.cache.CacheService -import im.vector.matrix.android.api.session.content.ContentUploadStateTracker -import im.vector.matrix.android.api.session.content.ContentUrlResolver -import im.vector.matrix.android.api.session.group.GroupService -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.signout.SignOutService -import im.vector.matrix.android.api.session.sync.FilterService -import im.vector.matrix.android.api.session.user.UserService -import im.vector.matrix.android.internal.crypto.CryptoManager -import im.vector.matrix.android.internal.database.LiveEntityObserver -import im.vector.matrix.android.internal.di.MatrixScope -import im.vector.matrix.android.internal.session.sync.job.SyncThread -import javax.inject.Inject - -@MatrixScope -internal class SessionFactory @Inject constructor( - private val monarchy: Monarchy, - private val liveEntityUpdaters: List, - private val sessionListeners: SessionListeners, - private val roomService: RoomService, - private val roomDirectoryService: RoomDirectoryService, - private val groupService: GroupService, - private val userService: UserService, - private val filterService: FilterService, - private val cacheService: CacheService, - private val signOutService: SignOutService, - private val cryptoService: CryptoManager, - private val syncThread: SyncThread, - private val contentUrlResolver: ContentUrlResolver, - private val contentUploadProgressTracker: ContentUploadStateTracker) { - - - fun create(sessionParams: SessionParams): Session { - return DefaultSession( - sessionParams, - monarchy, - liveEntityUpdaters, - sessionListeners, - roomService, - roomDirectoryService, - groupService, - userService, - filterService, - cacheService, - signOutService, - cryptoService, - syncThread, - contentUrlResolver, - contentUploadProgressTracker - ) - } - -} \ No newline at end of file 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 aea08a69..e68cd809 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 @@ -33,17 +33,21 @@ import im.vector.matrix.android.internal.util.md5 import io.realm.RealmConfiguration import retrofit2.Retrofit import java.io.File +import javax.inject.Named @Module -internal class SessionModule(private val sessionParams: SessionParams) { +internal object SessionModule { @Provides - fun providesCredentials(): Credentials { + @SessionScope + fun providesCredentials(sessionParams: SessionParams): Credentials { return sessionParams.credentials } @Provides - fun providesRealmConfiguration(context: Context): RealmConfiguration { + @SessionScope + @Named("SessionRealmConfiguration") + fun providesRealmConfiguration(sessionParams: SessionParams, context: Context): RealmConfiguration { val childPath = sessionParams.credentials.userId.md5() val directory = File(context.filesDir, childPath) @@ -56,25 +60,30 @@ internal class SessionModule(private val sessionParams: SessionParams) { } @Provides - fun providesMonarchy(realmConfiguration: RealmConfiguration): Monarchy { + @SessionScope + fun providesMonarchy(@Named("SessionRealmConfiguration") + realmConfiguration: RealmConfiguration): Monarchy { return Monarchy.Builder() .setRealmConfiguration(realmConfiguration) .build() } @Provides - fun providesRetrofit(retrofitBuilder: Retrofit.Builder): Retrofit { + @SessionScope + fun providesRetrofit(sessionParams: SessionParams, retrofitBuilder: Retrofit.Builder): Retrofit { return retrofitBuilder .baseUrl(sessionParams.homeServerConnectionConfig.homeServerUri.toString()) .build() } @Provides + @SessionScope fun providesFilterAPI(retrofit: Retrofit): FilterApi { return retrofit.create(FilterApi::class.java) } @Provides + @SessionScope fun providesLiveEntityObservers(groupSummaryUpdater: GroupSummaryUpdater, userEntityUpdater: UserEntityUpdater, aggregationUpdater: EventRelationsAggregationUpdater, @@ -82,5 +91,4 @@ internal class SessionModule(private val sessionParams: SessionParams) { return listOf(groupSummaryUpdater, userEntityUpdater, aggregationUpdater, eventsPruner) } - } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/cache/CacheModule.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/cache/CacheModule.kt new file mode 100644 index 00000000..349dc246 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/cache/CacheModule.kt @@ -0,0 +1,38 @@ +/* + * + * * 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.session.cache + +import dagger.Binds +import dagger.Module +import im.vector.matrix.android.api.session.cache.CacheService +import im.vector.matrix.android.internal.session.SessionScope + +@Module +internal abstract class CacheModule { + + @Binds + @SessionScope + abstract fun bindCacheService(cacheService: DefaultCacheService): CacheService + + @Binds + @SessionScope + abstract fun bindClearCacheTask(clearCacheTask: RealmClearCacheTask): ClearCacheTask + + +} \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/cache/RealmCacheService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/cache/DefaultCacheService.kt similarity index 85% rename from matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/cache/RealmCacheService.kt rename to matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/cache/DefaultCacheService.kt index 588ec63a..7dcb24e9 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/cache/RealmCacheService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/cache/DefaultCacheService.kt @@ -24,8 +24,8 @@ import im.vector.matrix.android.internal.task.configureWith import javax.inject.Inject @SessionScope -internal class RealmCacheService @Inject constructor(private val clearCacheTask: ClearCacheTask, - private val taskExecutor: TaskExecutor) : CacheService { +internal class DefaultCacheService @Inject constructor(private val clearCacheTask: ClearCacheTask, + private val taskExecutor: TaskExecutor) : CacheService { override fun clearCache(callback: MatrixCallback) { clearCacheTask diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/content/ContentModule.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/content/ContentModule.kt index 9f431862..66b75a54 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/content/ContentModule.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/content/ContentModule.kt @@ -16,10 +16,20 @@ package im.vector.matrix.android.internal.session.content +import dagger.Binds import dagger.Module +import im.vector.matrix.android.api.session.content.ContentUploadStateTracker +import im.vector.matrix.android.api.session.content.ContentUrlResolver +import im.vector.matrix.android.internal.session.SessionScope @Module -internal class ContentModule { +internal abstract class ContentModule { + @Binds + @SessionScope + abstract fun bindContentUploadStateTracker(contentUploadStateTracker: DefaultContentUploadStateTracker): ContentUploadStateTracker + @Binds + @SessionScope + abstract fun bindContentUrlResolver(contentUrlResolver: DefaultContentUrlResolver): ContentUrlResolver } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/content/FileUploader.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/content/FileUploader.kt index 67d79305..71906b11 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/content/FileUploader.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/content/FileUploader.kt @@ -18,6 +18,7 @@ package im.vector.matrix.android.internal.session.content import arrow.core.Try import arrow.core.Try.Companion.raise +import com.squareup.moshi.Moshi import im.vector.matrix.android.api.auth.data.SessionParams import im.vector.matrix.android.internal.di.MoshiProvider import im.vector.matrix.android.internal.network.ProgressRequestBody @@ -30,11 +31,10 @@ import javax.inject.Inject @SessionScope internal class FileUploader @Inject constructor(private val okHttpClient: OkHttpClient, - sessionParams: SessionParams) { + private val sessionParams: SessionParams, + private val moshi: Moshi) { private val uploadUrl = DefaultContentUrlResolver.getUploadUrl(sessionParams.homeServerConnectionConfig) - - private val moshi = MoshiProvider.providesMoshi() private val responseAdapter = moshi.adapter(ContentUploadResponse::class.java) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/content/UploadContentWorker.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/content/UploadContentWorker.kt index 58516088..ce5c8e58 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/content/UploadContentWorker.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/content/UploadContentWorker.kt @@ -31,7 +31,7 @@ import im.vector.matrix.android.api.session.room.model.message.MessageContent import im.vector.matrix.android.api.session.room.model.message.MessageFileContent import im.vector.matrix.android.api.session.room.model.message.MessageImageContent import im.vector.matrix.android.api.session.room.model.message.MessageVideoContent -import im.vector.matrix.android.internal.di.ChildWorkerFactory +import im.vector.matrix.android.internal.worker.DelegateWorkerFactory import im.vector.matrix.android.internal.network.ProgressRequestBody import im.vector.matrix.android.internal.session.room.send.SendEventWorker import im.vector.matrix.android.internal.util.WorkerParamsFactory @@ -138,7 +138,7 @@ internal class UploadContentWorker @AssistedInject constructor( } @AssistedInject.Factory - interface Factory : ChildWorkerFactory + interface Factory : DelegateWorkerFactory } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/filter/FilterModule.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/filter/FilterModule.kt new file mode 100644 index 00000000..fed83d87 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/filter/FilterModule.kt @@ -0,0 +1,54 @@ +/* + * + * * 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.session.filter + +import dagger.Binds +import dagger.Module +import dagger.Provides +import im.vector.matrix.android.api.session.sync.FilterService +import im.vector.matrix.android.internal.session.SessionScope +import retrofit2.Retrofit + +@Module +internal abstract class FilterModule { + + @Module + companion object { + @SessionScope + @Provides + @JvmStatic + fun providesFilterApi(retrofit: Retrofit): FilterApi { + return retrofit.create(FilterApi::class.java) + } + } + + @Binds + @SessionScope + abstract fun bindFilterRepository(filterRepository: DefaultFilterRepository): FilterRepository + + @Binds + @SessionScope + abstract fun bindFilterService(filterService: DefaultFilterService): FilterService + + @Binds + @SessionScope + abstract fun bindSaveFilterTask(saveFilterTask_Factory: DefaultSaveFilterTask): SaveFilterTask + + +} \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/group/DefaultGroupService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/group/DefaultGroupService.kt index a574df7c..90ee7d58 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/group/DefaultGroupService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/group/DefaultGroupService.kt @@ -25,8 +25,10 @@ import im.vector.matrix.android.internal.database.mapper.asDomain import im.vector.matrix.android.internal.database.model.GroupSummaryEntity import im.vector.matrix.android.internal.database.model.GroupSummaryEntityFields import im.vector.matrix.android.internal.database.query.where +import im.vector.matrix.android.internal.session.SessionScope import javax.inject.Inject +@SessionScope internal class DefaultGroupService @Inject constructor(private val monarchy: Monarchy) : GroupService { override fun getGroup(groupId: String): Group? { diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/group/GetGroupDataWorker.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/group/GetGroupDataWorker.kt index 7e979c72..4d35d0c7 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/group/GetGroupDataWorker.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/group/GetGroupDataWorker.kt @@ -23,7 +23,7 @@ import arrow.core.Try import com.squareup.inject.assisted.Assisted import com.squareup.inject.assisted.AssistedInject import com.squareup.moshi.JsonClass -import im.vector.matrix.android.internal.di.ChildWorkerFactory +import im.vector.matrix.android.internal.worker.DelegateWorkerFactory import im.vector.matrix.android.internal.util.WorkerParamsFactory internal class GetGroupDataWorker @AssistedInject constructor( @@ -53,6 +53,6 @@ internal class GetGroupDataWorker @AssistedInject constructor( } @AssistedInject.Factory - interface Factory : ChildWorkerFactory + interface Factory : DelegateWorkerFactory } \ No newline at end of file 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 5d7ac1f2..518585d3 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 @@ -16,15 +16,31 @@ package im.vector.matrix.android.internal.session.group +import dagger.Binds import dagger.Module +import dagger.Provides +import im.vector.matrix.android.api.session.group.GroupService import im.vector.matrix.android.internal.session.SessionScope import retrofit2.Retrofit @Module -internal class GroupModule { +internal abstract class GroupModule { - @SessionScope - fun providesGroupAPI(retrofit: Retrofit): GroupAPI { - return retrofit.create(GroupAPI::class.java) + @Module + companion object { + @SessionScope + @Provides + @JvmStatic + fun providesGroupAPI(retrofit: Retrofit): GroupAPI { + return retrofit.create(GroupAPI::class.java) + } } + + @Binds + @SessionScope + abstract fun bindGetGroupDataTask(getGroupDataTask: DefaultGetGroupDataTask): GetGroupDataTask + + @Binds + @SessionScope + abstract fun bindGroupService(groupService: DefaultGroupService): GroupService } \ No newline at end of file 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 5c37fa7d..51f93873 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 @@ -33,8 +33,11 @@ import im.vector.matrix.android.internal.database.mapper.asDomain import im.vector.matrix.android.internal.database.model.RoomSummaryEntity import im.vector.matrix.android.internal.database.model.RoomSummaryEntityFields import im.vector.matrix.android.internal.database.query.where +import im.vector.matrix.android.internal.session.SessionScope +import javax.inject.Inject -internal class DefaultRoom( +@SessionScope +internal class DefaultRoom @Inject constructor( override val roomId: String, private val monarchy: Monarchy, private val timelineService: TimelineService, 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 448d316c..571a50d2 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 @@ -50,7 +50,7 @@ internal class DefaultRoomService @Inject constructor(private val monarchy: Mona override fun getRoom(roomId: String): Room? { monarchy.fetchManaged { RoomEntity.where(it, roomId).findFirst() } ?: return null - return roomFactory.instantiate(roomId) + return roomFactory.create(roomId) } override fun liveRoomSummaries(): LiveData> { 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 c3c58e5a..75d35e81 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 @@ -58,7 +58,7 @@ internal class RoomFactory @Inject constructor(private val monarchy: Monarchy, private val joinRoomTask: JoinRoomTask, private val leaveRoomTask: LeaveRoomTask) { - fun instantiate(roomId: String): Room { + fun create(roomId: String): Room { val roomMemberExtractor = SenderRoomMemberExtractor(roomId) val relationExtractor = EventRelationExtractor() val timelineEventFactory = TimelineEventFactory(roomMemberExtractor, relationExtractor, cryptoService) 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 64ac991c..cc5e7aa8 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 @@ -16,12 +16,26 @@ package im.vector.matrix.android.internal.session.room +import dagger.Binds import dagger.Module import dagger.Provides +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.SessionScope import im.vector.matrix.android.internal.session.room.create.CreateRoomTask import im.vector.matrix.android.internal.session.room.create.DefaultCreateRoomTask +import im.vector.matrix.android.internal.session.room.directory.DefaultGetPublicRoomTask +import im.vector.matrix.android.internal.session.room.directory.DefaultGetThirdPartyProtocolsTask +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 @@ -31,30 +45,115 @@ 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.DefaultFindReactionEventForUndoTask -import im.vector.matrix.android.internal.session.room.relation.DefaultUpdateQuickReactionTask -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.send.LocalEchoEventFactory -import im.vector.matrix.android.internal.session.room.send.LocalEchoUpdater -import im.vector.matrix.android.internal.session.room.state.DefaultSendStateTask -import im.vector.matrix.android.internal.session.room.state.SendStateTask -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 im.vector.matrix.android.internal.session.room.timeline.TokenChunkEventPersistor +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.state.DefaultStateService +import im.vector.matrix.android.internal.session.room.timeline.* import retrofit2.Retrofit @Module -internal class RoomModule { +internal abstract class RoomModule { - @SessionScope - @Provides - fun providesRoomAPI(retrofit: Retrofit): RoomAPI { - return retrofit.create(RoomAPI::class.java) + @Module + companion object { + @SessionScope + @Provides + @JvmStatic + fun providesRoomAPI(retrofit: Retrofit): RoomAPI { + return retrofit.create(RoomAPI::class.java) + } } + @Binds + @SessionScope + abstract fun bindRoomService(roomService: DefaultRoomService): RoomService + + @Binds + @SessionScope + abstract fun bindRoomDirectoryService(roomDirectoryService: DefaultRoomDirectoryService): RoomDirectoryService + + @Binds + @SessionScope + abstract fun bindEventRelationsAggregationTask(eventRelationsAggregationTask: DefaultEventRelationsAggregationTask): EventRelationsAggregationTask + + @Binds + @SessionScope + abstract fun bindCreateRoomTask(createRoomTask: DefaultCreateRoomTask): CreateRoomTask + + @Binds + @SessionScope + abstract fun bindGetPublicRoomTask(getPublicRoomTask: DefaultGetPublicRoomTask): GetPublicRoomTask + + @Binds + @SessionScope + abstract fun bindGetThirdPartyProtocolsTask(getThirdPartyProtocolsTask: DefaultGetThirdPartyProtocolsTask): GetThirdPartyProtocolsTask + + @Binds + @SessionScope + abstract fun bindInviteTask(inviteTask: DefaultInviteTask): InviteTask + + @Binds + @SessionScope + abstract fun bindJoinRoomTask(joinRoomTask: DefaultJoinRoomTask): JoinRoomTask + + @Binds + @SessionScope + abstract fun bindLeaveRoomTask(leaveRoomTask: DefaultLeaveRoomTask): LeaveRoomTask + + @Binds + @SessionScope + abstract fun bindMembershipService(membershipService: DefaultMembershipService): MembershipService + + @Binds + @SessionScope + abstract fun bindLoadRoomMembersTask(loadRoomMembersTask: DefaultLoadRoomMembersTask): LoadRoomMembersTask + + @Binds + @SessionScope + abstract fun bindPruneEventTask(pruneEventTask: DefaultPruneEventTask): PruneEventTask + + @Binds + @SessionScope + abstract fun bindReadService(readService: DefaultReadService): ReadService + + @Binds + @SessionScope + abstract fun bindSetReadMarkersTask(setReadMarkersTask: DefaultSetReadMarkersTask): SetReadMarkersTask + + @Binds + @SessionScope + abstract fun bindRelationService(relationService: DefaultRelationService): RelationService + + @Binds + @SessionScope + abstract fun bindFindReactionEventForUndoTask(findReactionEventForUndoTask: DefaultFindReactionEventForUndoTask): FindReactionEventForUndoTask + + @Binds + @SessionScope + abstract fun bindUpdateQuickReactionTask(updateQuickReactionTask: DefaultUpdateQuickReactionTask): UpdateQuickReactionTask + + @Binds + @SessionScope + abstract fun bindSendService(sendService: DefaultSendService): SendService + + @Binds + @SessionScope + abstract fun bindStateService(stateService: DefaultStateService): StateService + + @Binds + @SessionScope + abstract fun bindGetContextOfEventTask(getContextOfEventTask: DefaultGetContextOfEventTask): GetContextOfEventTask + + @Binds + @SessionScope + abstract fun bindPaginationTask(paginationTask: DefaultPaginationTask): PaginationTask + + @Binds + @SessionScope + abstract fun bindTimelineService(timelineService: DefaultTimelineService): TimelineService + + } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/create/CreateRoomTask.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/create/CreateRoomTask.kt index 37088f74..a1f10c62 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/create/CreateRoomTask.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/create/CreateRoomTask.kt @@ -33,7 +33,7 @@ internal interface CreateRoomTask : Task @SessionScope internal class DefaultCreateRoomTask @Inject constructor(private val roomAPI: RoomAPI, - private val realmConfiguration: RealmConfiguration) : CreateRoomTask { + private val realmConfiguration: RealmConfiguration) : CreateRoomTask { override suspend fun execute(params: CreateRoomParams): Try { diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/relation/SendRelationWorker.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/relation/SendRelationWorker.kt index c41ac5df..de32c6f8 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/relation/SendRelationWorker.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/relation/SendRelationWorker.kt @@ -26,7 +26,7 @@ import im.vector.matrix.android.api.session.events.model.Event import im.vector.matrix.android.api.session.events.model.toModel import im.vector.matrix.android.api.session.room.model.relation.ReactionContent import im.vector.matrix.android.api.session.room.model.relation.ReactionInfo -import im.vector.matrix.android.internal.di.ChildWorkerFactory +import im.vector.matrix.android.internal.worker.DelegateWorkerFactory import im.vector.matrix.android.internal.network.executeRequest import im.vector.matrix.android.internal.session.room.RoomAPI import im.vector.matrix.android.internal.session.room.send.SendResponse @@ -82,5 +82,5 @@ internal class SendRelationWorker @AssistedInject constructor( } @AssistedInject.Factory - interface Factory : ChildWorkerFactory + interface Factory : DelegateWorkerFactory } \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/EncryptEventWorker.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/EncryptEventWorker.kt index 8dcae0cc..70a9ddf0 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/EncryptEventWorker.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/EncryptEventWorker.kt @@ -19,6 +19,8 @@ package im.vector.matrix.android.internal.session.room.send import android.content.Context import androidx.work.Worker import androidx.work.WorkerParameters +import com.squareup.inject.assisted.Assisted +import com.squareup.inject.assisted.AssistedInject import com.squareup.moshi.JsonClass import im.vector.matrix.android.api.MatrixCallback import im.vector.matrix.android.api.failure.Failure @@ -26,13 +28,16 @@ import im.vector.matrix.android.api.session.crypto.CryptoService import im.vector.matrix.android.api.session.events.model.Event import im.vector.matrix.android.api.session.room.send.SendState import im.vector.matrix.android.internal.crypto.model.MXEncryptEventContentResult -import im.vector.matrix.android.internal.di.MatrixKoinComponent import im.vector.matrix.android.internal.util.WorkerParamsFactory -import org.koin.standalone.inject +import im.vector.matrix.android.internal.worker.DelegateWorkerFactory import java.util.concurrent.CountDownLatch -internal class EncryptEventWorker(context: Context, params: WorkerParameters) - : Worker(context, params), MatrixKoinComponent { +internal class EncryptEventWorker @AssistedInject constructor( + @Assisted context: Context, + @Assisted params: WorkerParameters, + private val crypto: CryptoService, + private val localEchoUpdater: LocalEchoUpdater) + : Worker(context, params) { @JsonClass(generateAdapter = true) @@ -41,9 +46,6 @@ internal class EncryptEventWorker(context: Context, params: WorkerParameters) val event: Event ) - private val crypto by inject() - private val localEchoUpdater by inject() - override fun doWork(): Result { val params = WorkerParamsFactory.fromData(inputData) @@ -97,4 +99,8 @@ internal class EncryptEventWorker(context: Context, params: WorkerParameters) //always return success, or the chain will be stuck for ever! return Result.success() } + + @AssistedInject.Factory + interface Factory : DelegateWorkerFactory + } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/EventFactory.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/EventFactory.kt index d42c7222..7ebab9d6 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/EventFactory.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/EventFactory.kt @@ -22,8 +22,11 @@ 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.room.model.message.MessageTextContent import im.vector.matrix.android.internal.di.MoshiProvider +import im.vector.matrix.android.internal.session.SessionScope +import javax.inject.Inject -internal class EventFactory(private val credentials: Credentials) { +@SessionScope +internal class EventFactory @Inject constructor(private val credentials: Credentials) { private val moshi = MoshiProvider.providesMoshi() diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/RedactEventWorker.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/RedactEventWorker.kt index 5056a93b..0054329f 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/RedactEventWorker.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/send/RedactEventWorker.kt @@ -18,16 +18,20 @@ package im.vector.matrix.android.internal.session.room.send import android.content.Context import androidx.work.Worker import androidx.work.WorkerParameters +import com.squareup.inject.assisted.Assisted +import com.squareup.inject.assisted.AssistedInject import com.squareup.moshi.JsonClass import im.vector.matrix.android.api.failure.Failure -import im.vector.matrix.android.internal.di.MatrixKoinComponent import im.vector.matrix.android.internal.network.executeRequest import im.vector.matrix.android.internal.session.room.RoomAPI import im.vector.matrix.android.internal.util.WorkerParamsFactory -import org.koin.standalone.inject +import im.vector.matrix.android.internal.worker.DelegateWorkerFactory -internal class RedactEventWorker(context: Context, params: WorkerParameters) - : Worker(context, params), MatrixKoinComponent { +internal class RedactEventWorker @AssistedInject constructor( + @Assisted context: Context, + @Assisted params: WorkerParameters, + private val roomAPI: RoomAPI) + : Worker(context, params) { @JsonClass(generateAdapter = true) internal data class Params( @@ -37,8 +41,6 @@ internal class RedactEventWorker(context: Context, params: WorkerParameters) val reason: String? ) - private val roomAPI by inject() - override fun doWork(): Result { val params = WorkerParamsFactory.fromData(inputData) ?: return Result.failure() @@ -66,4 +68,7 @@ internal class RedactEventWorker(context: Context, params: WorkerParameters) }) } + @AssistedInject.Factory + interface Factory : DelegateWorkerFactory + } \ No newline at end of file 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 598352c5..790db2ce 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 @@ -25,7 +25,7 @@ import com.squareup.moshi.JsonClass import im.vector.matrix.android.api.failure.Failure import im.vector.matrix.android.api.session.events.model.Event import im.vector.matrix.android.api.session.room.send.SendState -import im.vector.matrix.android.internal.di.ChildWorkerFactory +import im.vector.matrix.android.internal.worker.DelegateWorkerFactory import im.vector.matrix.android.internal.network.executeRequest import im.vector.matrix.android.internal.session.room.RoomAPI import im.vector.matrix.android.internal.util.WorkerParamsFactory @@ -76,6 +76,6 @@ internal class SendEventWorker @AssistedInject constructor( } @AssistedInject.Factory - interface Factory : ChildWorkerFactory + interface Factory : DelegateWorkerFactory } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/DefaultTimeline.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/DefaultTimeline.kt index c276c26f..6743d1cb 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/DefaultTimeline.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/DefaultTimeline.kt @@ -274,7 +274,7 @@ internal class DefaultTimeline( val newRequestedCount = count - builtCount updatePaginationState(direction) { it.copy(requestedCount = newRequestedCount) } val fetchingCount = Math.max(MIN_FETCHING_COUNT, newRequestedCount) - executePaginationTask @Inject constructor(direction, fetchingCount) + executePaginationTask(direction, fetchingCount) } else { updatePaginationState(direction) { it.copy(isPaginating = false, requestedCount = 0) } } @@ -350,7 +350,7 @@ internal class DefaultTimeline( /** * This has to be called on TimelineThread as it access realm live results */ - private fun executePaginationTask @Inject constructor(direction: Timeline.Direction, limit: Int) { + private fun executePaginationTask(direction: Timeline.Direction, limit: Int) { val token = getTokenLive(direction) ?: return val params = PaginationTask.Params(roomId = roomId, from = token, @@ -367,7 +367,7 @@ internal class DefaultTimeline( } else { // Database won't be updated, so we force pagination request backgroundHandler.get()?.post { - executePaginationTask @Inject constructor(direction, limit) + executePaginationTask(direction, limit) } } } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/GetEventTask.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/GetEventTask.kt index 9ac5fce3..e791ba76 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/GetEventTask.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/timeline/GetEventTask.kt @@ -20,8 +20,11 @@ import arrow.core.Try import im.vector.matrix.android.api.session.events.model.Event import im.vector.matrix.android.internal.task.Task import im.vector.matrix.android.internal.network.executeRequest +import im.vector.matrix.android.internal.session.SessionScope import im.vector.matrix.android.internal.session.room.RoomAPI +import javax.inject.Inject +@SessionScope internal class GetEventTask @Inject constructor(private val roomAPI: RoomAPI ) : Task { diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/signout/SignOutModule.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/signout/SignOutModule.kt index 7e2fbc85..63df5a03 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/signout/SignOutModule.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/signout/SignOutModule.kt @@ -16,16 +16,34 @@ package im.vector.matrix.android.internal.session.signout +import dagger.Binds import dagger.Module +import dagger.Provides +import im.vector.matrix.android.api.session.signout.SignOutService import im.vector.matrix.android.internal.session.SessionScope +import im.vector.matrix.android.internal.session.user.DefaultUpdateUserTask +import im.vector.matrix.android.internal.session.user.UpdateUserTask import retrofit2.Retrofit @Module -internal class SignOutModule { +internal abstract class SignOutModule { - @SessionScope - fun providesSignOutAPI(retrofit: Retrofit): SignOutAPI { - return retrofit.create(SignOutAPI::class.java) + @Module + companion object { + @SessionScope + @Provides + @JvmStatic + fun providesSignOutAPI(retrofit: Retrofit): SignOutAPI { + return retrofit.create(SignOutAPI::class.java) + } } + @Binds + @SessionScope + abstract fun bindSignOutTask(signOutTask: DefaultSignOutTask): SignOutTask + + @Binds + @SessionScope + abstract fun bindSignOutService(signOutService: DefaultSignOutService): SignOutService + } \ No newline at end of file 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 4e12ccd8..cd8b7605 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 @@ -16,16 +16,28 @@ package im.vector.matrix.android.internal.session.sync +import dagger.Binds import dagger.Module +import dagger.Provides import im.vector.matrix.android.internal.session.SessionScope +import im.vector.matrix.android.internal.session.user.DefaultUpdateUserTask +import im.vector.matrix.android.internal.session.user.UpdateUserTask import retrofit2.Retrofit @Module -internal class SyncModule { +internal abstract class SyncModule { - @SessionScope - fun providesSyncAPI(retrofit: Retrofit): SyncAPI { - return retrofit.create(SyncAPI::class.java) + @Module + companion object { + @SessionScope + @Provides + @JvmStatic + fun providesSyncAPI(retrofit: Retrofit): SyncAPI { + return retrofit.create(SyncAPI::class.java) + } } + @Binds + abstract fun bindSyncTask(syncTask: DefaultSyncTask): SyncTask + } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/user/UserModule.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/user/UserModule.kt new file mode 100644 index 00000000..00714c77 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/user/UserModule.kt @@ -0,0 +1,37 @@ +/* + * + * * 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.session.user + +import dagger.Binds +import dagger.Module +import im.vector.matrix.android.api.session.user.UserService +import im.vector.matrix.android.internal.session.SessionScope + +@Module +internal abstract class UserModule { + + @Binds + @SessionScope + abstract fun bindUserService(userService: DefaultUserService): UserService + + @Binds + @SessionScope + abstract fun bindUpdateUserTask(updateUserTask: DefaultUpdateUserTask): UpdateUserTask + +} \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/worker/DI.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/worker/DI.kt new file mode 100644 index 00000000..ec0d0866 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/worker/DI.kt @@ -0,0 +1,71 @@ +/* + * + * * 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.worker + +import androidx.work.ListenableWorker +import dagger.Binds +import dagger.MapKey +import dagger.Module +import dagger.multibindings.IntoMap +import im.vector.matrix.android.internal.session.content.UploadContentWorker +import im.vector.matrix.android.internal.session.group.GetGroupDataWorker +import im.vector.matrix.android.internal.session.room.relation.SendRelationWorker +import im.vector.matrix.android.internal.session.room.send.EncryptEventWorker +import im.vector.matrix.android.internal.session.room.send.RedactEventWorker +import im.vector.matrix.android.internal.session.room.send.SendEventWorker +import kotlin.reflect.KClass + +@MapKey +@Target(AnnotationTarget.FUNCTION) +@Retention(AnnotationRetention.RUNTIME) +internal annotation class WorkerKey(val value: KClass) + +@Module +internal interface WorkerBindingModule { + + @Binds + @IntoMap + @WorkerKey(SendEventWorker::class) + fun bindSendEventWorker(factory: SendEventWorker.Factory): DelegateWorkerFactory + + @Binds + @IntoMap + @WorkerKey(SendRelationWorker::class) + fun bindSendRelationWorker(factory: SendRelationWorker.Factory): DelegateWorkerFactory + + @Binds + @IntoMap + @WorkerKey(EncryptEventWorker::class) + fun bindEncryptEventWorker(factory: EncryptEventWorker.Factory): DelegateWorkerFactory + + @Binds + @IntoMap + @WorkerKey(RedactEventWorker::class) + fun bindRedactEventWorker(factory: RedactEventWorker.Factory): DelegateWorkerFactory + + @Binds + @IntoMap + @WorkerKey(GetGroupDataWorker::class) + fun bindGetGroupDataWorker(factory: GetGroupDataWorker.Factory): DelegateWorkerFactory + + @Binds + @IntoMap + @WorkerKey(UploadContentWorker::class) + fun bindUploadContentWorker(factory: UploadContentWorker.Factory): DelegateWorkerFactory +} \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/worker/DelegateWorkerFactory.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/worker/DelegateWorkerFactory.kt new file mode 100644 index 00000000..cb0c7580 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/worker/DelegateWorkerFactory.kt @@ -0,0 +1,29 @@ +/* + * + * * 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.worker + +import android.content.Context +import androidx.work.ListenableWorker +import androidx.work.WorkerParameters + +interface DelegateWorkerFactory { + + fun create(appContext: Context, workerParameters: WorkerParameters): ListenableWorker + +} \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/worker/MatrixWorkerFactory.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/worker/MatrixWorkerFactory.kt new file mode 100644 index 00000000..63d5836b --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/worker/MatrixWorkerFactory.kt @@ -0,0 +1,45 @@ +/* + * + * * 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.worker + +import android.content.Context +import androidx.work.ListenableWorker +import androidx.work.WorkerFactory +import androidx.work.WorkerParameters +import im.vector.matrix.android.internal.di.MatrixScope +import javax.inject.Inject +import javax.inject.Provider + +@MatrixScope +class MatrixWorkerFactory @Inject constructor( + private val workerFactories: Map, @JvmSuppressWildcards Provider> +) : WorkerFactory() { + + override fun createWorker( + appContext: Context, + workerClassName: String, + workerParameters: WorkerParameters + ): ListenableWorker? { + val foundEntry = + workerFactories.entries.find { Class.forName(workerClassName).isAssignableFrom(it.key) } + val factoryProvider = foundEntry?.value + ?: throw IllegalArgumentException("unknown worker class name: $workerClassName") + return factoryProvider.get().create(appContext, workerParameters) + } +}