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. * non-production environment.
*/ */
@MatrixScope @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 { : 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 package im.vector.matrix.android.internal.auth


import android.content.Context import android.content.Context
import dagger.Binds
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import im.vector.matrix.android.internal.auth.db.AuthRealmModule 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.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 io.realm.RealmConfiguration
import java.io.File import java.io.File
import javax.inject.Named


@Module @Module
internal class AuthModule { internal abstract class AuthModule {


@Provides @Module
@MatrixScope companion object {
fun providesRealmConfiguration(context: Context): RealmConfiguration { @Provides
val old = File(context.filesDir, "matrix-sdk-auth") @MatrixScope
if (old.exists()) { @Named("AuthRealmConfiguration")
old.renameTo(File(context.filesDir, "matrix-sdk-auth.realm")) 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.auth.data.SessionParams
import im.vector.matrix.android.api.session.Session import im.vector.matrix.android.api.session.Session
import im.vector.matrix.android.api.util.Cancelable 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.PasswordLoginParams
import im.vector.matrix.android.internal.auth.data.ThreePidMedium import im.vector.matrix.android.internal.auth.data.ThreePidMedium
import im.vector.matrix.android.internal.di.MatrixScope import im.vector.matrix.android.internal.di.MatrixScope
import im.vector.matrix.android.internal.network.executeRequest 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.CancelableCoroutine
import im.vector.matrix.android.internal.util.MatrixCoroutineDispatchers import im.vector.matrix.android.internal.util.MatrixCoroutineDispatchers
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
@ -37,13 +36,12 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import retrofit2.Retrofit import retrofit2.Retrofit
import javax.inject.Inject import javax.inject.Inject
import kotlin.random.Random


@MatrixScope @MatrixScope
internal class DefaultAuthenticator @Inject constructor(private val retrofitBuilder: Retrofit.Builder, internal class DefaultAuthenticator @Inject constructor(private val retrofitBuilder: Retrofit.Builder,
private val coroutineDispatchers: MatrixCoroutineDispatchers, private val coroutineDispatchers: MatrixCoroutineDispatchers,
private val sessionParamsStore: SessionParamsStore, private val sessionParamsStore: SessionParamsStore,
private val sessionFactory: DefaultSession.Factory private val sessionManager: SessionManager
) : Authenticator { ) : Authenticator {


override fun hasActiveSessions(): Boolean { override fun hasActiveSessions(): Boolean {
@ -53,7 +51,7 @@ internal class DefaultAuthenticator @Inject constructor(private val retrofitBuil
override fun getLastActiveSession(): Session? { override fun getLastActiveSession(): Session? {
val sessionParams = sessionParamsStore.get() val sessionParams = sessionParamsStore.get()
return sessionParams?.let { 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) sessionParamsStore.save(sessionParams)
sessionParams sessionParams
}.map { }.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.Realm
import io.realm.RealmConfiguration import io.realm.RealmConfiguration
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Named


@MatrixScope @MatrixScope
internal class RealmSessionParamsStore @Inject constructor(private val mapper: SessionParamsMapper, internal class RealmSessionParamsStore @Inject constructor(private val mapper: SessionParamsMapper,
@Named("AuthRealmConfiguration")
private val realmConfiguration: RealmConfiguration) : SessionParamsStore { private val realmConfiguration: RealmConfiguration) : SessionParamsStore {


override fun save(sessionParams: SessionParams): Try<SessionParams> { override fun save(sessionParams: SessionParams): Try<SessionParams> {

View File

@ -17,11 +17,14 @@
package im.vector.matrix.android.internal.auth.db package im.vector.matrix.android.internal.auth.db


import com.squareup.moshi.Moshi 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.Credentials
import im.vector.matrix.android.api.auth.data.HomeServerConnectionConfig
import im.vector.matrix.android.api.auth.data.SessionParams 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 credentialsAdapter = moshi.adapter(Credentials::class.java)
private val homeServerConnectionConfigAdapter = moshi.adapter(HomeServerConnectionConfig::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 io.realm.RealmConfiguration
import retrofit2.Retrofit import retrofit2.Retrofit
import java.io.File import java.io.File
import javax.inject.Named


@Module @Module
internal class CryptoModule { internal class CryptoModule {
@ -38,6 +39,7 @@ internal class CryptoModule {
// Realm configuration, named to avoid clash with main cache realm configuration // Realm configuration, named to avoid clash with main cache realm configuration
@Provides @Provides
@SessionScope @SessionScope
@Named("CryptonRealmConfiguration")
fun providesRealmConfiguration(context: Context, credentials: Credentials): RealmConfiguration { fun providesRealmConfiguration(context: Context, credentials: Credentials): RealmConfiguration {
return RealmConfiguration.Builder() return RealmConfiguration.Builder()
.directory(File(context.filesDir, credentials.userId.hash())) .directory(File(context.filesDir, credentials.userId.hash()))
@ -50,10 +52,11 @@ internal class CryptoModule {


@Provides @Provides
@SessionScope @SessionScope
fun providesCryptoStore(realmConfiguration: RealmConfiguration, credentials: Credentials): IMXCryptoStore { fun providesCryptoStore(@Named("CryptonRealmConfiguration")
realmConfiguration: RealmConfiguration, credentials: Credentials): IMXCryptoStore {
return RealmCryptoStore(false /* TODO*/, return RealmCryptoStore(false /* TODO*/,
realmConfiguration, realmConfiguration,
credentials) credentials)
} }


@Provides @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 package im.vector.matrix.android.internal.di


import android.content.Context
import com.squareup.moshi.Moshi
import dagger.BindsInstance
import dagger.Component 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 @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 package im.vector.matrix.android.internal.di


import android.content.Context
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import im.vector.matrix.android.internal.crypto.CryptoAsyncHelper import im.vector.matrix.android.internal.crypto.CryptoAsyncHelper
@ -25,23 +24,17 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.android.asCoroutineDispatcher import kotlinx.coroutines.android.asCoroutineDispatcher


@Module @Module
internal class MatrixModule(private val context: Context) { internal class MatrixModule {

@Provides
@MatrixScope
fun providesContext(): Context {
return context
}


@Provides @Provides
@MatrixScope @MatrixScope
fun providesMatrixCoroutineDispatchers(): MatrixCoroutineDispatchers { fun providesMatrixCoroutineDispatchers(): MatrixCoroutineDispatchers {
val cryptoHandler = CryptoAsyncHelper.getDecryptBackgroundHandler() val cryptoHandler = CryptoAsyncHelper.getDecryptBackgroundHandler()
return MatrixCoroutineDispatchers(io = Dispatchers.IO, return MatrixCoroutineDispatchers(io = Dispatchers.IO,
computation = Dispatchers.IO, computation = Dispatchers.IO,
main = Dispatchers.Main, main = Dispatchers.Main,
crypto = cryptoHandler.asCoroutineDispatcher("crypto") 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 im.vector.matrix.android.internal.session.sync.job.SyncThread
import timber.log.Timber import timber.log.Timber



@SessionScope
internal class DefaultSession @AssistedInject constructor(@Assisted override val sessionParams: SessionParams, internal class DefaultSession @AssistedInject constructor(@Assisted override val sessionParams: SessionParams,
private val monarchy: Monarchy, private val monarchy: Monarchy,
private val liveEntityUpdaters: List<LiveEntityObserver>, private val liveEntityUpdaters: List<LiveEntityObserver>,

View File

@ -16,16 +16,46 @@


package im.vector.matrix.android.internal.session package im.vector.matrix.android.internal.session


import dagger.BindsInstance
import dagger.Component 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.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 @SessionScope
interface SessionComponent { internal interface SessionComponent {


@Component.Builder @Component.Factory
interface Builder { interface Factory {
fun matrixComponent(matrixComponent: MatrixComponent): Builder 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 io.realm.RealmConfiguration
import retrofit2.Retrofit import retrofit2.Retrofit
import java.io.File import java.io.File
import javax.inject.Named


@Module @Module
internal class SessionModule(private val sessionParams: SessionParams) { internal object SessionModule {


@Provides @Provides
fun providesCredentials(): Credentials { @SessionScope
fun providesCredentials(sessionParams: SessionParams): Credentials {
return sessionParams.credentials return sessionParams.credentials
} }


@Provides @Provides
fun providesRealmConfiguration(context: Context): RealmConfiguration { @SessionScope
@Named("SessionRealmConfiguration")
fun providesRealmConfiguration(sessionParams: SessionParams, context: Context): RealmConfiguration {
val childPath = sessionParams.credentials.userId.md5() val childPath = sessionParams.credentials.userId.md5()
val directory = File(context.filesDir, childPath) val directory = File(context.filesDir, childPath)


@ -56,25 +60,30 @@ internal class SessionModule(private val sessionParams: SessionParams) {
} }


@Provides @Provides
fun providesMonarchy(realmConfiguration: RealmConfiguration): Monarchy { @SessionScope
fun providesMonarchy(@Named("SessionRealmConfiguration")
realmConfiguration: RealmConfiguration): Monarchy {
return Monarchy.Builder() return Monarchy.Builder()
.setRealmConfiguration(realmConfiguration) .setRealmConfiguration(realmConfiguration)
.build() .build()
} }


@Provides @Provides
fun providesRetrofit(retrofitBuilder: Retrofit.Builder): Retrofit { @SessionScope
fun providesRetrofit(sessionParams: SessionParams, retrofitBuilder: Retrofit.Builder): Retrofit {
return retrofitBuilder return retrofitBuilder
.baseUrl(sessionParams.homeServerConnectionConfig.homeServerUri.toString()) .baseUrl(sessionParams.homeServerConnectionConfig.homeServerUri.toString())
.build() .build()
} }


@Provides @Provides
@SessionScope
fun providesFilterAPI(retrofit: Retrofit): FilterApi { fun providesFilterAPI(retrofit: Retrofit): FilterApi {
return retrofit.create(FilterApi::class.java) return retrofit.create(FilterApi::class.java)
} }


@Provides @Provides
@SessionScope
fun providesLiveEntityObservers(groupSummaryUpdater: GroupSummaryUpdater, fun providesLiveEntityObservers(groupSummaryUpdater: GroupSummaryUpdater,
userEntityUpdater: UserEntityUpdater, userEntityUpdater: UserEntityUpdater,
aggregationUpdater: EventRelationsAggregationUpdater, aggregationUpdater: EventRelationsAggregationUpdater,
@ -82,5 +91,4 @@ internal class SessionModule(private val sessionParams: SessionParams) {
return listOf<LiveEntityObserver>(groupSummaryUpdater, userEntityUpdater, aggregationUpdater, eventsPruner) 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 import javax.inject.Inject


@SessionScope @SessionScope
internal class RealmCacheService @Inject constructor(private val clearCacheTask: ClearCacheTask, internal class DefaultCacheService @Inject constructor(private val clearCacheTask: ClearCacheTask,
private val taskExecutor: TaskExecutor) : CacheService { private val taskExecutor: TaskExecutor) : CacheService {


override fun clearCache(callback: MatrixCallback<Unit>) { override fun clearCache(callback: MatrixCallback<Unit>) {
clearCacheTask clearCacheTask

View File

@ -16,10 +16,20 @@


package im.vector.matrix.android.internal.session.content package im.vector.matrix.android.internal.session.content


import dagger.Binds
import dagger.Module 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 @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
import arrow.core.Try.Companion.raise 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.api.auth.data.SessionParams
import im.vector.matrix.android.internal.di.MoshiProvider import im.vector.matrix.android.internal.di.MoshiProvider
import im.vector.matrix.android.internal.network.ProgressRequestBody import im.vector.matrix.android.internal.network.ProgressRequestBody
@ -30,11 +31,10 @@ import javax.inject.Inject


@SessionScope @SessionScope
internal class FileUploader @Inject constructor(private val okHttpClient: OkHttpClient, 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 uploadUrl = DefaultContentUrlResolver.getUploadUrl(sessionParams.homeServerConnectionConfig)

private val moshi = MoshiProvider.providesMoshi()
private val responseAdapter = moshi.adapter(ContentUploadResponse::class.java) 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.MessageFileContent
import im.vector.matrix.android.api.session.room.model.message.MessageImageContent 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.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.network.ProgressRequestBody
import im.vector.matrix.android.internal.session.room.send.SendEventWorker import im.vector.matrix.android.internal.session.room.send.SendEventWorker
import im.vector.matrix.android.internal.util.WorkerParamsFactory import im.vector.matrix.android.internal.util.WorkerParamsFactory
@ -138,7 +138,7 @@ internal class UploadContentWorker @AssistedInject constructor(
} }


@AssistedInject.Factory @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.GroupSummaryEntity
import im.vector.matrix.android.internal.database.model.GroupSummaryEntityFields import im.vector.matrix.android.internal.database.model.GroupSummaryEntityFields
import im.vector.matrix.android.internal.database.query.where import im.vector.matrix.android.internal.database.query.where
import im.vector.matrix.android.internal.session.SessionScope
import javax.inject.Inject import javax.inject.Inject


@SessionScope
internal class DefaultGroupService @Inject constructor(private val monarchy: Monarchy) : GroupService { internal class DefaultGroupService @Inject constructor(private val monarchy: Monarchy) : GroupService {


override fun getGroup(groupId: String): Group? { 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.Assisted
import com.squareup.inject.assisted.AssistedInject import com.squareup.inject.assisted.AssistedInject
import com.squareup.moshi.JsonClass 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 import im.vector.matrix.android.internal.util.WorkerParamsFactory


internal class GetGroupDataWorker @AssistedInject constructor( internal class GetGroupDataWorker @AssistedInject constructor(
@ -53,6 +53,6 @@ internal class GetGroupDataWorker @AssistedInject constructor(
} }


@AssistedInject.Factory @AssistedInject.Factory
interface Factory : ChildWorkerFactory interface Factory : DelegateWorkerFactory


} }

View File

@ -16,15 +16,31 @@


package im.vector.matrix.android.internal.session.group package im.vector.matrix.android.internal.session.group


import dagger.Binds
import dagger.Module import dagger.Module
import dagger.Provides
import im.vector.matrix.android.api.session.group.GroupService
import im.vector.matrix.android.internal.session.SessionScope import im.vector.matrix.android.internal.session.SessionScope
import retrofit2.Retrofit import retrofit2.Retrofit


@Module @Module
internal class GroupModule { internal abstract class GroupModule {


@SessionScope @Module
fun providesGroupAPI(retrofit: Retrofit): GroupAPI { companion object {
return retrofit.create(GroupAPI::class.java) @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.RoomSummaryEntity
import im.vector.matrix.android.internal.database.model.RoomSummaryEntityFields import im.vector.matrix.android.internal.database.model.RoomSummaryEntityFields
import im.vector.matrix.android.internal.database.query.where 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, override val roomId: String,
private val monarchy: Monarchy, private val monarchy: Monarchy,
private val timelineService: TimelineService, 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? { override fun getRoom(roomId: String): Room? {
monarchy.fetchManaged { RoomEntity.where(it, roomId).findFirst() } ?: return null monarchy.fetchManaged { RoomEntity.where(it, roomId).findFirst() } ?: return null
return roomFactory.instantiate(roomId) return roomFactory.create(roomId)
} }


override fun liveRoomSummaries(): LiveData<List<RoomSummary>> { 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 joinRoomTask: JoinRoomTask,
private val leaveRoomTask: LeaveRoomTask) { private val leaveRoomTask: LeaveRoomTask) {


fun instantiate(roomId: String): Room { fun create(roomId: String): Room {
val roomMemberExtractor = SenderRoomMemberExtractor(roomId) val roomMemberExtractor = SenderRoomMemberExtractor(roomId)
val relationExtractor = EventRelationExtractor() val relationExtractor = EventRelationExtractor()
val timelineEventFactory = TimelineEventFactory(roomMemberExtractor, relationExtractor, cryptoService) val timelineEventFactory = TimelineEventFactory(roomMemberExtractor, relationExtractor, cryptoService)

View File

@ -16,12 +16,26 @@


package im.vector.matrix.android.internal.session.room package im.vector.matrix.android.internal.session.room


import dagger.Binds
import dagger.Module import dagger.Module
import dagger.Provides 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.SessionScope
import im.vector.matrix.android.internal.session.room.create.CreateRoomTask 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.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.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.LoadRoomMembersTask
import im.vector.matrix.android.internal.session.room.membership.joining.DefaultInviteTask import im.vector.matrix.android.internal.session.room.membership.joining.DefaultInviteTask
import im.vector.matrix.android.internal.session.room.membership.joining.DefaultJoinRoomTask 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.membership.leaving.LeaveRoomTask
import im.vector.matrix.android.internal.session.room.prune.DefaultPruneEventTask 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.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.DefaultSetReadMarkersTask
import im.vector.matrix.android.internal.session.room.read.SetReadMarkersTask 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.*
import im.vector.matrix.android.internal.session.room.relation.DefaultUpdateQuickReactionTask import im.vector.matrix.android.internal.session.room.send.DefaultSendService
import im.vector.matrix.android.internal.session.room.relation.FindReactionEventForUndoTask import im.vector.matrix.android.internal.session.room.state.DefaultStateService
import im.vector.matrix.android.internal.session.room.relation.UpdateQuickReactionTask import im.vector.matrix.android.internal.session.room.timeline.*
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 retrofit2.Retrofit import retrofit2.Retrofit


@Module @Module
internal class RoomModule { internal abstract class RoomModule {


@SessionScope @Module
@Provides companion object {
fun providesRoomAPI(retrofit: Retrofit): RoomAPI { @SessionScope
return retrofit.create(RoomAPI::class.java) @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 @SessionScope
internal class DefaultCreateRoomTask @Inject constructor(private val roomAPI: RoomAPI, 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> { 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.events.model.toModel
import im.vector.matrix.android.api.session.room.model.relation.ReactionContent 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.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.network.executeRequest
import im.vector.matrix.android.internal.session.room.RoomAPI import im.vector.matrix.android.internal.session.room.RoomAPI
import im.vector.matrix.android.internal.session.room.send.SendResponse import im.vector.matrix.android.internal.session.room.send.SendResponse
@ -82,5 +82,5 @@ internal class SendRelationWorker @AssistedInject constructor(
} }


@AssistedInject.Factory @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 android.content.Context
import androidx.work.Worker import androidx.work.Worker
import androidx.work.WorkerParameters import androidx.work.WorkerParameters
import com.squareup.inject.assisted.Assisted
import com.squareup.inject.assisted.AssistedInject
import com.squareup.moshi.JsonClass import com.squareup.moshi.JsonClass
import im.vector.matrix.android.api.MatrixCallback import im.vector.matrix.android.api.MatrixCallback
import im.vector.matrix.android.api.failure.Failure 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.events.model.Event
import im.vector.matrix.android.api.session.room.send.SendState 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.crypto.model.MXEncryptEventContentResult
import im.vector.matrix.android.internal.di.MatrixKoinComponent
import im.vector.matrix.android.internal.util.WorkerParamsFactory 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 import java.util.concurrent.CountDownLatch


internal class EncryptEventWorker(context: Context, params: WorkerParameters) internal class EncryptEventWorker @AssistedInject constructor(
: Worker(context, params), MatrixKoinComponent { @Assisted context: Context,
@Assisted params: WorkerParameters,
private val crypto: CryptoService,
private val localEchoUpdater: LocalEchoUpdater)
: Worker(context, params) {




@JsonClass(generateAdapter = true) @JsonClass(generateAdapter = true)
@ -41,9 +46,6 @@ internal class EncryptEventWorker(context: Context, params: WorkerParameters)
val event: Event val event: Event
) )


private val crypto by inject<CryptoService>()
private val localEchoUpdater by inject<LocalEchoUpdater>()

override fun doWork(): Result { override fun doWork(): Result {


val params = WorkerParamsFactory.fromData<Params>(inputData) 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! //always return success, or the chain will be stuck for ever!
return Result.success() 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.events.model.EventType
import im.vector.matrix.android.api.session.room.model.message.MessageTextContent 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.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() 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 android.content.Context
import androidx.work.Worker import androidx.work.Worker
import androidx.work.WorkerParameters import androidx.work.WorkerParameters
import com.squareup.inject.assisted.Assisted
import com.squareup.inject.assisted.AssistedInject
import com.squareup.moshi.JsonClass import com.squareup.moshi.JsonClass
import im.vector.matrix.android.api.failure.Failure 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.network.executeRequest
import im.vector.matrix.android.internal.session.room.RoomAPI import im.vector.matrix.android.internal.session.room.RoomAPI
import im.vector.matrix.android.internal.util.WorkerParamsFactory 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) internal class RedactEventWorker @AssistedInject constructor(
: Worker(context, params), MatrixKoinComponent { @Assisted context: Context,
@Assisted params: WorkerParameters,
private val roomAPI: RoomAPI)
: Worker(context, params) {


@JsonClass(generateAdapter = true) @JsonClass(generateAdapter = true)
internal data class Params( internal data class Params(
@ -37,8 +41,6 @@ internal class RedactEventWorker(context: Context, params: WorkerParameters)
val reason: String? val reason: String?
) )


private val roomAPI by inject<RoomAPI>()

override fun doWork(): Result { override fun doWork(): Result {
val params = WorkerParamsFactory.fromData<Params>(inputData) val params = WorkerParamsFactory.fromData<Params>(inputData)
?: return Result.failure() ?: 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.failure.Failure
import im.vector.matrix.android.api.session.events.model.Event 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.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.network.executeRequest
import im.vector.matrix.android.internal.session.room.RoomAPI import im.vector.matrix.android.internal.session.room.RoomAPI
import im.vector.matrix.android.internal.util.WorkerParamsFactory import im.vector.matrix.android.internal.util.WorkerParamsFactory
@ -76,6 +76,6 @@ internal class SendEventWorker @AssistedInject constructor(
} }


@AssistedInject.Factory @AssistedInject.Factory
interface Factory : ChildWorkerFactory interface Factory : DelegateWorkerFactory


} }

View File

@ -274,7 +274,7 @@ internal class DefaultTimeline(
val newRequestedCount = count - builtCount val newRequestedCount = count - builtCount
updatePaginationState(direction) { it.copy(requestedCount = newRequestedCount) } updatePaginationState(direction) { it.copy(requestedCount = newRequestedCount) }
val fetchingCount = Math.max(MIN_FETCHING_COUNT, newRequestedCount) val fetchingCount = Math.max(MIN_FETCHING_COUNT, newRequestedCount)
executePaginationTask @Inject constructor(direction, fetchingCount) executePaginationTask(direction, fetchingCount)
} else { } else {
updatePaginationState(direction) { it.copy(isPaginating = false, requestedCount = 0) } 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 * 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 token = getTokenLive(direction) ?: return
val params = PaginationTask.Params(roomId = roomId, val params = PaginationTask.Params(roomId = roomId,
from = token, from = token,
@ -367,7 +367,7 @@ internal class DefaultTimeline(
} else { } else {
// Database won't be updated, so we force pagination request // Database won't be updated, so we force pagination request
backgroundHandler.get()?.post { 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.api.session.events.model.Event
import im.vector.matrix.android.internal.task.Task import im.vector.matrix.android.internal.task.Task
import im.vector.matrix.android.internal.network.executeRequest 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 im.vector.matrix.android.internal.session.room.RoomAPI
import javax.inject.Inject


@SessionScope
internal class GetEventTask @Inject constructor(private val roomAPI: RoomAPI internal class GetEventTask @Inject constructor(private val roomAPI: RoomAPI
) : Task<GetEventTask.Params, Event> { ) : Task<GetEventTask.Params, Event> {



View File

@ -16,16 +16,34 @@


package im.vector.matrix.android.internal.session.signout package im.vector.matrix.android.internal.session.signout


import dagger.Binds
import dagger.Module 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.SessionScope
import im.vector.matrix.android.internal.session.user.DefaultUpdateUserTask
import im.vector.matrix.android.internal.session.user.UpdateUserTask
import retrofit2.Retrofit import retrofit2.Retrofit


@Module @Module
internal class SignOutModule { internal abstract class SignOutModule {


@SessionScope @Module
fun providesSignOutAPI(retrofit: Retrofit): SignOutAPI { companion object {
return retrofit.create(SignOutAPI::class.java) @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 package im.vector.matrix.android.internal.session.sync


import dagger.Binds
import dagger.Module import dagger.Module
import dagger.Provides
import im.vector.matrix.android.internal.session.SessionScope 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 import retrofit2.Retrofit


@Module @Module
internal class SyncModule { internal abstract class SyncModule {


@SessionScope @Module
fun providesSyncAPI(retrofit: Retrofit): SyncAPI { companion object {
return retrofit.create(SyncAPI::class.java) @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)
}
}