Dagger: continue adding it to SDK [WIP]

This commit is contained in:
ganfra 2019-06-16 17:00:47 +02:00
parent 3d465f6fdf
commit 4be0ab87fc
42 changed files with 713 additions and 220 deletions

View File

@ -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 {

/**

View File

@ -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<String, SessionComponent>()
private val sessions = HashMap<String, Session>()

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) {
}


}

View File

@ -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


}

View File

@ -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)!!
}

}

View File

@ -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<SessionParams> {

View File

@ -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)

View File

@ -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

View File

@ -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

}

View File

@ -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

View File

@ -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
}

}

View File

@ -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")
)
}

}

View File

@ -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<LiveEntityObserver>,

View File

@ -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
}


}

View File

@ -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<LiveEntityObserver>,
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
)
}

}

View File

@ -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<LiveEntityObserver>(groupSummaryUpdater, userEntityUpdater, aggregationUpdater, eventsPruner)
}


}

View File

@ -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


}

View File

@ -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<Unit>) {
clearCacheTask

View File

@ -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
}

View File

@ -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)



View File

@ -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

}


View File

@ -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


}

View File

@ -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? {

View File

@ -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

}

View File

@ -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
}

View File

@ -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,

View File

@ -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<List<RoomSummary>> {

View File

@ -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)

View File

@ -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


}

View File

@ -33,7 +33,7 @@ internal interface CreateRoomTask : Task<CreateRoomParams, String>

@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<String> {

View File

@ -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
}

View File

@ -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<CryptoService>()
private val localEchoUpdater by inject<LocalEchoUpdater>()

override fun doWork(): Result {

val params = WorkerParamsFactory.fromData<Params>(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

}

View File

@ -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()


View File

@ -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<RoomAPI>()

override fun doWork(): Result {
val params = WorkerParamsFactory.fromData<Params>(inputData)
?: return Result.failure()
@ -66,4 +68,7 @@ internal class RedactEventWorker(context: Context, params: WorkerParameters)
})
}

@AssistedInject.Factory
interface Factory : DelegateWorkerFactory

}

View File

@ -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

}

View File

@ -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)
}
}
}

View File

@ -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<GetEventTask.Params, Event> {


View File

@ -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

}

View File

@ -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

}

View File

@ -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

}

View File

@ -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<out ListenableWorker>)

@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
}

View File

@ -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

}

View File

@ -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<Class<out ListenableWorker>, @JvmSuppressWildcards Provider<DelegateWorkerFactory>>
) : 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)
}
}