Refactor Matrix instance creation (using ContentProvider) + isolate Koin in matrix

This commit is contained in:
ganfra 2018-12-20 15:44:01 +01:00
parent 43dee60b92
commit 3713e71c8e
19 changed files with 130 additions and 71 deletions

View File

@ -16,7 +16,7 @@ class Riot : Application() {
Timber.plant(Timber.DebugTree()) Timber.plant(Timber.DebugTree())
} }
AndroidThreeTen.init(this) AndroidThreeTen.init(this)
startKoin(listOf(AppModule(this)), logger = EmptyLogger()) startKoin(listOf(AppModule(this).definition), logger = EmptyLogger())
} }
} }

View File

@ -1,25 +1,16 @@
package im.vector.riotredesign.core.di package im.vector.riotredesign.core.di
import android.content.Context import android.content.Context
import im.vector.matrix.android.api.Matrix
import im.vector.matrix.android.api.MatrixOptions
import im.vector.riotredesign.core.resources.LocaleProvider import im.vector.riotredesign.core.resources.LocaleProvider
import org.koin.dsl.context.ModuleDefinition
import org.koin.dsl.module.Module
import org.koin.dsl.module.module import org.koin.dsl.module.module
class AppModule(private val context: Context) : Module { class AppModule(private val context: Context) {
override fun invoke(): ModuleDefinition = module { val definition = module {
single(createOnStart = true) {
val matrixOptions = MatrixOptions(context)
Matrix(matrixOptions)
}
single { single {
LocaleProvider(context.resources) LocaleProvider(context.resources)
} }
}.invoke() }
} }

View File

@ -10,8 +10,8 @@ import org.koin.android.ext.android.inject
class MainActivity : RiotActivity() { class MainActivity : RiotActivity() {
private val matrix by inject<Matrix>() private val authenticator = Matrix.getInstance().authenticator()
private val authenticator = matrix.authenticator()
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)

View File

@ -24,7 +24,7 @@ class HomeActivity : RiotActivity(), HomeNavigator, ToolbarConfigurable {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
loadKoinModules(listOf(HomeModule(this))) loadKoinModules(listOf(HomeModule(this).definition))
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_home) setContentView(R.layout.activity_home)
if (savedInstanceState == null) { if (savedInstanceState == null) {

View File

@ -4,17 +4,11 @@ import im.vector.riotredesign.features.home.room.detail.timeline.MessageItemFact
import im.vector.riotredesign.features.home.room.detail.timeline.TextItemFactory import im.vector.riotredesign.features.home.room.detail.timeline.TextItemFactory
import im.vector.riotredesign.features.home.room.detail.timeline.TimelineDateFormatter import im.vector.riotredesign.features.home.room.detail.timeline.TimelineDateFormatter
import im.vector.riotredesign.features.home.room.detail.timeline.TimelineEventController import im.vector.riotredesign.features.home.room.detail.timeline.TimelineEventController
import org.koin.dsl.context.ModuleDefinition
import org.koin.dsl.module.Module
import org.koin.dsl.module.module import org.koin.dsl.module.module
class HomeModule(private val homeActivity: HomeActivity) : Module { class HomeModule(private val homeActivity: HomeActivity) {
override fun invoke(): ModuleDefinition = module(override = true) { val definition = module(override = true) {
factory {
homeActivity as HomeNavigator
}
single { single {
TimelineDateFormatter(get()) TimelineDateFormatter(get())
@ -28,9 +22,13 @@ class HomeModule(private val homeActivity: HomeActivity) : Module {
TextItemFactory() TextItemFactory()
} }
factory {
homeActivity as HomeNavigator
}
factory { (roomId: String) -> factory { (roomId: String) ->
TimelineEventController(roomId, get(), get(), get()) TimelineEventController(roomId, get(), get(), get())
} }
}.invoke() }
} }

View File

@ -6,7 +6,6 @@ import com.airbnb.mvrx.MvRxViewModelFactory
import im.vector.matrix.android.api.Matrix import im.vector.matrix.android.api.Matrix
import im.vector.matrix.android.api.session.Session import im.vector.matrix.android.api.session.Session
import im.vector.matrix.rx.rx import im.vector.matrix.rx.rx
import org.koin.android.ext.android.get
class HomeViewModel(initialState: HomeViewState, private val session: Session) : BaseMvRxViewModel<HomeViewState>(initialState) { class HomeViewModel(initialState: HomeViewState, private val session: Session) : BaseMvRxViewModel<HomeViewState>(initialState) {
@ -14,8 +13,7 @@ class HomeViewModel(initialState: HomeViewState, private val session: Session) :
@JvmStatic @JvmStatic
override fun create(activity: FragmentActivity, state: HomeViewState): HomeViewModel { override fun create(activity: FragmentActivity, state: HomeViewState): HomeViewModel {
val matrix = activity.get<Matrix>() val currentSession = Matrix.getInstance().currentSession
val currentSession = matrix.currentSession
return HomeViewModel(state, currentSession) return HomeViewModel(state, currentSession)
} }
} }

View File

@ -38,8 +38,7 @@ class RoomDetailFragment : RiotFragment(), TimelineEventController.Callback {
} }
} }
private val matrix by inject<Matrix>() private val currentSession = Matrix.getInstance().currentSession
private val currentSession = matrix.currentSession
private var roomId: String by UnsafeFragmentArgumentDelegate() private var roomId: String by UnsafeFragmentArgumentDelegate()
private var eventId: String? by FragmentArgumentDelegate() private var eventId: String? by FragmentArgumentDelegate()
private val timelineEventController by inject<TimelineEventController> { parametersOf(roomId) } private val timelineEventController by inject<TimelineEventController> { parametersOf(roomId) }

View File

@ -13,12 +13,10 @@ import im.vector.riotredesign.R
import im.vector.riotredesign.core.platform.RiotActivity import im.vector.riotredesign.core.platform.RiotActivity
import im.vector.riotredesign.features.home.HomeActivity import im.vector.riotredesign.features.home.HomeActivity
import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_login.*
import org.koin.android.ext.android.inject
class LoginActivity : RiotActivity() { class LoginActivity : RiotActivity() {
private val matrix by inject<Matrix>() private val authenticator = Matrix.getInstance().authenticator()
private val authenticator = matrix.authenticator()
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -38,8 +36,8 @@ class LoginActivity : RiotActivity() {
authenticator.authenticate(homeServerConnectionConfig, login, password, object : MatrixCallback<Session> { authenticator.authenticate(homeServerConnectionConfig, login, password, object : MatrixCallback<Session> {
override fun onSuccess(data: Session) { override fun onSuccess(data: Session) {
matrix.currentSession = data Matrix.getInstance().currentSession = data
matrix.currentSession.open() Matrix.getInstance().currentSession.open()
goToHome() goToHome()
} }

View File

@ -2,7 +2,7 @@
buildscript { buildscript {
ext.kotlin_version = '1.3.0' ext.kotlin_version = '1.3.0'
ext.koin_version = '1.0.1' ext.koin_version = '1.0.2'
repositories { repositories {
google() google()
jcenter() jcenter()

View File

@ -1,7 +1,17 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="im.vector.matrix.android" > package="im.vector.matrix.android">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application>
<provider
android:name=".internal.MatrixInitProvider"
android:authorities="im.vector.matrix.android.MatrixInitProvider" />
</application>
</manifest> </manifest>

View File

@ -6,29 +6,27 @@ import com.zhuinden.monarchy.Monarchy
import im.vector.matrix.android.api.auth.Authenticator import im.vector.matrix.android.api.auth.Authenticator
import im.vector.matrix.android.api.session.Session import im.vector.matrix.android.api.session.Session
import im.vector.matrix.android.internal.auth.AuthModule import im.vector.matrix.android.internal.auth.AuthModule
import im.vector.matrix.android.internal.di.MatrixKoinComponent
import im.vector.matrix.android.internal.di.MatrixKoinHolder
import im.vector.matrix.android.internal.di.MatrixModule import im.vector.matrix.android.internal.di.MatrixModule
import im.vector.matrix.android.internal.di.NetworkModule import im.vector.matrix.android.internal.di.NetworkModule
import im.vector.matrix.android.internal.util.BackgroundDetectionObserver import im.vector.matrix.android.internal.util.BackgroundDetectionObserver
import org.koin.standalone.KoinComponent
import org.koin.standalone.StandAloneContext.loadKoinModules
import org.koin.standalone.inject import org.koin.standalone.inject
class Matrix(matrixOptions: MatrixOptions) : KoinComponent { class Matrix private constructor(context: Context) : MatrixKoinComponent {
private val authenticator by inject<Authenticator>() private val authenticator by inject<Authenticator>()
private val backgroundDetectionObserver by inject<BackgroundDetectionObserver>() private val backgroundDetectionObserver by inject<BackgroundDetectionObserver>()
lateinit var currentSession: Session lateinit var currentSession: Session
init { init {
Monarchy.init(matrixOptions.context) Monarchy.init(context)
val matrixModule = MatrixModule(matrixOptions).definition val matrixModule = MatrixModule(context).definition
val networkModule = NetworkModule().definition val networkModule = NetworkModule().definition
val authModule = AuthModule().definition val authModule = AuthModule().definition
loadKoinModules(listOf(matrixModule, networkModule, authModule)) MatrixKoinHolder.instance.loadModules(listOf(matrixModule, networkModule, authModule))
ProcessLifecycleOwner.get().lifecycle.addObserver(backgroundDetectionObserver) ProcessLifecycleOwner.get().lifecycle.addObserver(backgroundDetectionObserver)
val lastActiveSession = authenticator.getLastActiveSession() val lastActiveSession = authenticator.getLastActiveSession()
if (lastActiveSession != null) { if (lastActiveSession != null) {
currentSession = lastActiveSession currentSession = lastActiveSession
@ -40,6 +38,17 @@ class Matrix(matrixOptions: MatrixOptions) : KoinComponent {
return authenticator return authenticator
} }
} companion object {
private lateinit var instance: Matrix
data class MatrixOptions(val context: Context) internal fun initialize(context: Context) {
instance = Matrix(context.applicationContext)
}
fun getInstance(): Matrix {
return instance
}
}
}

View File

@ -0,0 +1,36 @@
package im.vector.matrix.android.internal
import android.content.ContentProvider
import android.content.ContentValues
import android.database.Cursor
import android.net.Uri
import im.vector.matrix.android.api.Matrix
class MatrixInitProvider : ContentProvider() {
override fun onCreate(): Boolean {
Matrix.initialize(context!!)
return true
}
override fun insert(uri: Uri, values: ContentValues?): Uri? {
return null
}
override fun query(uri: Uri, projection: Array<String>?, selection: String?, selectionArgs: Array<String>?, sortOrder: String?): Cursor? {
return null
}
override fun update(uri: Uri, values: ContentValues?, selection: String?, selectionArgs: Array<String>?): Int {
return 0
}
override fun delete(uri: Uri, selection: String?, selectionArgs: Array<String>?): Int {
return 0
}
override fun getType(uri: Uri): String? {
return null
}
}

View File

@ -0,0 +1,21 @@
package im.vector.matrix.android.internal.di
import org.koin.core.Koin
import org.koin.core.KoinContext
import org.koin.standalone.KoinComponent
internal object MatrixKoinHolder {
val instance: Koin by lazy {
Koin.create()
}
}
internal interface MatrixKoinComponent : KoinComponent {
override fun getKoin(): KoinContext {
return MatrixKoinHolder.instance.koinContext
}
}

View File

@ -1,6 +1,6 @@
package im.vector.matrix.android.internal.di package im.vector.matrix.android.internal.di
import im.vector.matrix.android.api.MatrixOptions import android.content.Context
import im.vector.matrix.android.internal.task.TaskExecutor import im.vector.matrix.android.internal.task.TaskExecutor
import im.vector.matrix.android.internal.util.BackgroundDetectionObserver import im.vector.matrix.android.internal.util.BackgroundDetectionObserver
import im.vector.matrix.android.internal.util.MatrixCoroutineDispatchers import im.vector.matrix.android.internal.util.MatrixCoroutineDispatchers
@ -8,12 +8,12 @@ import kotlinx.coroutines.Dispatchers
import org.koin.dsl.module.module import org.koin.dsl.module.module
class MatrixModule(private val options: MatrixOptions) { class MatrixModule(private val context: Context) {
val definition = module { val definition = module {
single { single {
options.context context
} }
single { single {

View File

@ -12,18 +12,17 @@ import im.vector.matrix.android.api.session.room.Room
import im.vector.matrix.android.api.session.room.RoomService import im.vector.matrix.android.api.session.room.RoomService
import im.vector.matrix.android.api.session.room.model.RoomSummary import im.vector.matrix.android.api.session.room.model.RoomSummary
import im.vector.matrix.android.internal.database.LiveEntityObserver import im.vector.matrix.android.internal.database.LiveEntityObserver
import im.vector.matrix.android.internal.di.MatrixKoinComponent
import im.vector.matrix.android.internal.di.MatrixKoinHolder
import im.vector.matrix.android.internal.session.group.GroupModule 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.room.RoomModule
import im.vector.matrix.android.internal.session.sync.SyncModule import im.vector.matrix.android.internal.session.sync.SyncModule
import im.vector.matrix.android.internal.session.sync.job.SyncThread import im.vector.matrix.android.internal.session.sync.job.SyncThread
import org.koin.core.scope.Scope import org.koin.core.scope.Scope
import org.koin.standalone.KoinComponent
import org.koin.standalone.StandAloneContext
import org.koin.standalone.getKoin
import org.koin.standalone.inject import org.koin.standalone.inject
internal class DefaultSession(override val sessionParams: SessionParams) : Session, KoinComponent, RoomService { internal class DefaultSession(override val sessionParams: SessionParams) : Session, MatrixKoinComponent, RoomService {
companion object { companion object {
const val SCOPE: String = "session" const val SCOPE: String = "session"
@ -46,7 +45,7 @@ internal class DefaultSession(override val sessionParams: SessionParams) : Sessi
val syncModule = SyncModule().definition val syncModule = SyncModule().definition
val roomModule = RoomModule().definition val roomModule = RoomModule().definition
val groupModule = GroupModule().definition val groupModule = GroupModule().definition
StandAloneContext.loadKoinModules(listOf(sessionModule, syncModule, roomModule, groupModule)) MatrixKoinHolder.instance.loadModules(listOf(sessionModule, syncModule, roomModule, groupModule))
scope = getKoin().getOrCreateScope(SCOPE) scope = getKoin().getOrCreateScope(SCOPE)
liveEntityUpdaters.forEach { it.start() } liveEntityUpdaters.forEach { it.start() }
syncThread.start() syncThread.start()

View File

@ -10,15 +10,15 @@ import im.vector.matrix.android.api.session.events.model.EventType
import im.vector.matrix.android.internal.database.mapper.ContentMapper import im.vector.matrix.android.internal.database.mapper.ContentMapper
import im.vector.matrix.android.internal.database.model.EventEntity import im.vector.matrix.android.internal.database.model.EventEntity
import im.vector.matrix.android.internal.database.query.where import im.vector.matrix.android.internal.database.query.where
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 im.vector.matrix.android.internal.util.tryTransactionAsync import im.vector.matrix.android.internal.util.tryTransactionAsync
import io.realm.Realm import io.realm.Realm
import org.koin.standalone.KoinComponent
import org.koin.standalone.inject import org.koin.standalone.inject
internal class PruneEventWorker(context: Context, internal class PruneEventWorker(context: Context,
workerParameters: WorkerParameters workerParameters: WorkerParameters
) : Worker(context, workerParameters), KoinComponent { ) : Worker(context, workerParameters), MatrixKoinComponent {
@JsonClass(generateAdapter = true) @JsonClass(generateAdapter = true)
internal data class Params( internal data class Params(

View File

@ -5,13 +5,13 @@ import androidx.work.Worker
import androidx.work.WorkerParameters import androidx.work.WorkerParameters
import arrow.core.Try import arrow.core.Try
import com.squareup.moshi.JsonClass import com.squareup.moshi.JsonClass
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.KoinComponent
import org.koin.standalone.inject import org.koin.standalone.inject
internal class GetGroupDataWorker(context: Context, internal class GetGroupDataWorker(context: Context,
workerParameters: WorkerParameters workerParameters: WorkerParameters
) : Worker(context, workerParameters), KoinComponent { ) : Worker(context, workerParameters), MatrixKoinComponent {
@JsonClass(generateAdapter = true) @JsonClass(generateAdapter = true)
internal data class Params( internal data class Params(

View File

@ -14,23 +14,23 @@ import im.vector.matrix.android.api.session.room.model.Membership
import im.vector.matrix.android.api.session.room.model.MyMembership import im.vector.matrix.android.api.session.room.model.MyMembership
import im.vector.matrix.android.api.session.room.model.RoomSummary import im.vector.matrix.android.api.session.room.model.RoomSummary
import im.vector.matrix.android.api.util.Cancelable import im.vector.matrix.android.api.util.Cancelable
import im.vector.matrix.android.internal.task.TaskExecutor
import im.vector.matrix.android.internal.task.configureWith
import im.vector.matrix.android.internal.database.mapper.asDomain import im.vector.matrix.android.internal.database.mapper.asDomain
import im.vector.matrix.android.internal.database.model.RoomEntity import im.vector.matrix.android.internal.database.model.RoomEntity
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.di.MatrixKoinComponent
import im.vector.matrix.android.internal.session.room.members.LoadRoomMembersTask import im.vector.matrix.android.internal.session.room.members.LoadRoomMembersTask
import im.vector.matrix.android.internal.session.sync.SyncTokenStore import im.vector.matrix.android.internal.session.sync.SyncTokenStore
import im.vector.matrix.android.internal.task.TaskExecutor
import im.vector.matrix.android.internal.task.configureWith
import org.koin.core.parameter.parametersOf import org.koin.core.parameter.parametersOf
import org.koin.standalone.KoinComponent
import org.koin.standalone.inject import org.koin.standalone.inject
internal data class DefaultRoom( internal data class DefaultRoom(
override val roomId: String, override val roomId: String,
override val myMembership: MyMembership override val myMembership: MyMembership
) : Room, KoinComponent { ) : Room, MatrixKoinComponent {
private val loadRoomMembersTask by inject<LoadRoomMembersTask>() private val loadRoomMembersTask by inject<LoadRoomMembersTask>()
private val syncTokenStore by inject<SyncTokenStore>() private val syncTokenStore by inject<SyncTokenStore>()

View File

@ -8,15 +8,15 @@ import com.zhuinden.monarchy.Monarchy
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.database.model.EventEntity import im.vector.matrix.android.internal.database.model.EventEntity
import im.vector.matrix.android.internal.database.query.where import im.vector.matrix.android.internal.database.query.where
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 im.vector.matrix.android.internal.util.tryTransactionSync import im.vector.matrix.android.internal.util.tryTransactionSync
import org.koin.standalone.KoinComponent
import org.koin.standalone.inject import org.koin.standalone.inject
internal class SendEventWorker(context: Context, params: WorkerParameters) internal class SendEventWorker(context: Context, params: WorkerParameters)
: Worker(context, params), KoinComponent { : Worker(context, params), MatrixKoinComponent {
@JsonClass(generateAdapter = true) @JsonClass(generateAdapter = true)