2018-10-08 15:52:45 +00:00
|
|
|
package im.vector.matrix.android.internal.session
|
|
|
|
|
2018-10-16 13:52:30 +00:00
|
|
|
import android.os.Looper
|
|
|
|
import android.support.annotation.MainThread
|
2018-10-09 10:30:01 +00:00
|
|
|
import im.vector.matrix.android.api.session.Session
|
2018-10-10 17:46:43 +00:00
|
|
|
import im.vector.matrix.android.internal.auth.data.SessionParams
|
2018-10-16 13:52:30 +00:00
|
|
|
import im.vector.matrix.android.internal.database.SessionRealmHolder
|
2018-10-08 15:52:45 +00:00
|
|
|
import im.vector.matrix.android.internal.di.SessionModule
|
|
|
|
import im.vector.matrix.android.internal.events.sync.SyncModule
|
|
|
|
import im.vector.matrix.android.internal.events.sync.Synchronizer
|
|
|
|
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
|
|
|
|
|
2018-10-16 13:52:30 +00:00
|
|
|
class DefaultSession(private val sessionParams: SessionParams) : Session, KoinComponent {
|
2018-10-08 15:52:45 +00:00
|
|
|
|
2018-10-16 13:52:30 +00:00
|
|
|
companion object {
|
|
|
|
const val SCOPE: String = "session"
|
|
|
|
}
|
|
|
|
|
|
|
|
private lateinit var scope: Scope
|
|
|
|
|
|
|
|
private val realmInstanceHolder by inject<SessionRealmHolder>()
|
2018-10-08 15:52:45 +00:00
|
|
|
private val synchronizer by inject<Synchronizer>()
|
2018-10-16 13:52:30 +00:00
|
|
|
private val roomSummaryObserver by inject<RoomSummaryObserver>()
|
|
|
|
|
|
|
|
private var isOpen = false
|
2018-10-08 15:52:45 +00:00
|
|
|
|
2018-10-16 13:52:30 +00:00
|
|
|
@MainThread
|
|
|
|
override fun open() {
|
|
|
|
checkIsMainThread()
|
|
|
|
assert(!isOpen)
|
|
|
|
isOpen = true
|
2018-10-10 17:46:43 +00:00
|
|
|
val sessionModule = SessionModule(sessionParams)
|
2018-10-08 15:52:45 +00:00
|
|
|
val syncModule = SyncModule()
|
|
|
|
StandAloneContext.loadKoinModules(listOf(sessionModule, syncModule))
|
2018-10-11 07:58:28 +00:00
|
|
|
scope = getKoin().getOrCreateScope(SCOPE)
|
2018-10-16 13:52:30 +00:00
|
|
|
realmInstanceHolder.open()
|
|
|
|
roomSummaryObserver.start()
|
2018-10-08 15:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
override fun synchronizer(): Synchronizer {
|
2018-10-16 13:52:30 +00:00
|
|
|
assert(isOpen)
|
2018-10-08 15:52:45 +00:00
|
|
|
return synchronizer
|
|
|
|
}
|
|
|
|
|
2018-10-16 13:52:30 +00:00
|
|
|
override fun realmHolder(): SessionRealmHolder {
|
|
|
|
assert(isOpen)
|
2018-10-15 17:42:13 +00:00
|
|
|
return realmInstanceHolder
|
|
|
|
}
|
|
|
|
|
2018-10-16 13:52:30 +00:00
|
|
|
@MainThread
|
2018-10-08 15:52:45 +00:00
|
|
|
override fun close() {
|
2018-10-16 13:52:30 +00:00
|
|
|
checkIsMainThread()
|
|
|
|
assert(isOpen)
|
|
|
|
roomSummaryObserver.dispose()
|
|
|
|
realmInstanceHolder.close()
|
2018-10-08 15:52:45 +00:00
|
|
|
scope.close()
|
2018-10-16 13:52:30 +00:00
|
|
|
isOpen = false
|
2018-10-08 15:52:45 +00:00
|
|
|
}
|
|
|
|
|
2018-10-16 13:52:30 +00:00
|
|
|
private fun checkIsMainThread() {
|
|
|
|
if (Looper.myLooper() != Looper.getMainLooper()) {
|
|
|
|
throw IllegalStateException("Should be called on main thread")
|
|
|
|
}
|
2018-10-08 15:52:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|