BayernMessenger/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/DefaultSession.kt

372 lines
14 KiB
Kotlin
Raw Normal View History

2019-01-18 10:12:08 +00:00
/*
* Copyright 2019 New Vector Ltd
2019-01-18 10:12:08 +00:00
*
* 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
2019-01-18 10:12:08 +00:00
*
* 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.
2019-01-18 10:12:08 +00:00
*/
package im.vector.matrix.android.internal.session
2019-05-16 08:23:57 +00:00
import android.content.Context
import android.os.Looper
import androidx.annotation.MainThread
import androidx.lifecycle.LiveData
import com.zhuinden.monarchy.Monarchy
2019-04-03 14:36:45 +00:00
import im.vector.matrix.android.api.MatrixCallback
import im.vector.matrix.android.api.auth.data.SessionParams
2019-05-16 08:23:57 +00:00
import im.vector.matrix.android.api.listeners.ProgressListener
import im.vector.matrix.android.api.session.Session
2019-04-17 13:48:59 +00:00
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
2019-05-16 08:23:57 +00:00
import im.vector.matrix.android.api.session.crypto.keysbackup.KeysBackupService
import im.vector.matrix.android.api.session.crypto.keyshare.RoomKeysRequestListener
import im.vector.matrix.android.api.session.crypto.sas.SasVerificationService
2019-05-21 13:42:09 +00:00
import im.vector.matrix.android.api.session.events.model.Content
2019-05-16 08:23:57 +00:00
import im.vector.matrix.android.api.session.events.model.Event
2018-11-05 16:39:07 +00:00
import im.vector.matrix.android.api.session.group.Group
import im.vector.matrix.android.api.session.group.GroupService
import im.vector.matrix.android.api.session.group.model.GroupSummary
2018-10-17 16:21:09 +00:00
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.model.RoomSummary
2019-04-05 15:04:25 +00:00
import im.vector.matrix.android.api.session.room.model.create.CreateRoomParams
2019-04-03 14:36:45 +00:00
import im.vector.matrix.android.api.session.signout.SignOutService
2019-04-12 13:51:20 +00:00
import im.vector.matrix.android.api.session.sync.FilterService
import im.vector.matrix.android.api.session.user.UserService
import im.vector.matrix.android.api.session.user.model.User
2019-04-17 13:48:59 +00:00
import im.vector.matrix.android.api.util.MatrixCallbackDelegate
2019-05-21 13:42:09 +00:00
import im.vector.matrix.android.internal.crypto.CryptoManager
2019-05-16 08:23:57 +00:00
import im.vector.matrix.android.internal.crypto.CryptoModule
import im.vector.matrix.android.internal.crypto.MXEventDecryptionResult
import im.vector.matrix.android.internal.crypto.model.ImportRoomKeysResult
import im.vector.matrix.android.internal.crypto.model.MXDeviceInfo
2019-05-21 13:42:09 +00:00
import im.vector.matrix.android.internal.crypto.model.MXEncryptEventContentResult
2019-05-16 08:23:57 +00:00
import im.vector.matrix.android.internal.crypto.model.rest.DevicesListResponse
2019-05-21 13:42:09 +00:00
import im.vector.matrix.android.internal.crypto.model.rest.RoomKeyRequestBody
2018-11-07 19:36:19 +00:00
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.content.ContentModule
2018-11-05 16:39:07 +00:00
import im.vector.matrix.android.internal.session.group.GroupModule
import im.vector.matrix.android.internal.session.room.RoomModule
2019-04-03 14:36:45 +00:00
import im.vector.matrix.android.internal.session.signout.SignOutModule
2018-10-17 16:21:09 +00:00
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.user.UserModule
import org.koin.core.scope.Scope
import org.koin.standalone.inject
2018-10-17 11:59:21 +00:00
internal class DefaultSession(override val sessionParams: SessionParams) : Session, MatrixKoinComponent {
companion object {
const val SCOPE: String = "session"
}
private lateinit var scope: Scope
private val monarchy by inject<Monarchy>()
2018-11-07 19:36:19 +00:00
private val liveEntityUpdaters by inject<List<LiveEntityObserver>>()
private val sessionListeners by inject<SessionListeners>()
2018-10-17 16:21:09 +00:00
private val roomService by inject<RoomService>()
2018-11-05 16:39:07 +00:00
private val groupService by inject<GroupService>()
private val userService by inject<UserService>()
2019-04-12 13:51:20 +00:00
private val filterService by inject<FilterService>()
2019-04-17 13:48:59 +00:00
private val cacheService by inject<CacheService>()
2019-04-03 14:36:45 +00:00
private val signOutService by inject<SignOutService>()
2019-05-16 08:23:57 +00:00
private val cryptoService by inject<CryptoManager>()
2018-10-17 11:59:21 +00:00
private val syncThread by inject<SyncThread>()
private val contentUrlResolver by inject<ContentUrlResolver>()
private val contentUploadProgressTracker by inject<ContentUploadStateTracker>()
private var isOpen = false
@MainThread
override fun open() {
assertMainThread()
assert(!isOpen)
isOpen = true
val sessionModule = SessionModule(sessionParams).definition
val syncModule = SyncModule().definition
val roomModule = RoomModule().definition
val groupModule = GroupModule().definition
2019-04-03 14:36:45 +00:00
val signOutModule = SignOutModule().definition
val userModule = UserModule().definition
val contentModule = ContentModule().definition
2019-05-16 08:23:57 +00:00
val cryptoModule = CryptoModule().definition
MatrixKoinHolder.instance.loadModules(listOf(sessionModule,
2019-05-23 17:12:06 +00:00
syncModule,
roomModule,
groupModule,
userModule,
signOutModule,
contentModule,
cryptoModule))
scope = getKoin().getOrCreateScope(SCOPE)
if (!monarchy.isMonarchyThreadOpen) {
monarchy.openManually()
}
2018-11-07 19:36:19 +00:00
liveEntityUpdaters.forEach { it.start() }
2019-04-12 13:51:20 +00:00
}
@MainThread
2019-04-16 13:36:29 +00:00
override fun startSync() {
2019-04-12 13:51:20 +00:00
assert(isOpen)
2018-10-17 11:59:21 +00:00
syncThread.start()
}
2019-04-12 13:51:20 +00:00
@MainThread
2019-04-16 13:36:29 +00:00
override fun stopSync() {
2019-04-12 13:51:20 +00:00
assert(isOpen)
syncThread.kill()
}
2018-10-15 17:42:13 +00:00
@MainThread
override fun close() {
assertMainThread()
assert(isOpen)
2018-11-07 19:36:19 +00:00
liveEntityUpdaters.forEach { it.dispose() }
2019-05-16 08:23:57 +00:00
cryptoService.close()
if (monarchy.isMonarchyThreadOpen) {
monarchy.closeManually()
}
scope.close()
isOpen = false
}
2019-04-03 14:36:45 +00:00
@MainThread
override fun signOut(callback: MatrixCallback<Unit>) {
assert(isOpen)
2019-04-17 13:48:59 +00:00
syncThread.kill()
2019-04-03 14:36:45 +00:00
return signOutService.signOut(object : MatrixCallback<Unit> {
override fun onSuccess(data: Unit) {
2019-04-17 13:48:59 +00:00
// Clear the cache
cacheService.clearCache(object : MatrixCallbackDelegate<Unit>(callback) {})
2019-04-03 14:36:45 +00:00
}
override fun onFailure(failure: Throwable) {
2019-04-17 13:48:59 +00:00
// Ignore failure
onSuccess(Unit)
// callback.onFailure(failure)
2019-04-03 14:36:45 +00:00
}
})
}
override fun contentUrlResolver(): ContentUrlResolver {
return contentUrlResolver
}
override fun contentUploadProgressTracker(): ContentUploadStateTracker {
return contentUploadProgressTracker
}
override fun addListener(listener: Session.Listener) {
sessionListeners.addListener(listener)
}
override fun removeListener(listener: Session.Listener) {
sessionListeners.removeListener(listener)
}
2018-10-17 16:21:09 +00:00
// ROOM SERVICE
2019-04-05 15:04:25 +00:00
override fun createRoom(createRoomParams: CreateRoomParams, callback: MatrixCallback<String>) {
assert(isOpen)
return roomService.createRoom(createRoomParams, callback)
}
2018-10-17 16:21:09 +00:00
override fun getRoom(roomId: String): Room? {
assert(isOpen)
2018-10-17 16:21:09 +00:00
return roomService.getRoom(roomId)
}
override fun liveRoomSummaries(): LiveData<List<RoomSummary>> {
assert(isOpen)
return roomService.liveRoomSummaries()
}
2018-11-05 16:39:07 +00:00
// GROUP SERVICE
override fun getGroup(groupId: String): Group? {
assert(isOpen)
return groupService.getGroup(groupId)
}
override fun liveGroupSummaries(): LiveData<List<GroupSummary>> {
assert(isOpen)
return groupService.liveGroupSummaries()
}
2019-04-12 13:51:20 +00:00
override fun setFilter(filterPreset: FilterService.FilterPreset) {
assert(isOpen)
return filterService.setFilter(filterPreset)
}
2019-04-17 13:48:59 +00:00
override fun clearCache(callback: MatrixCallback<Unit>) {
assert(isOpen)
syncThread.pause()
cacheService.clearCache(object : MatrixCallbackDelegate<Unit>(callback) {
override fun onSuccess(data: Unit) {
// Restart the sync
syncThread.restart()
super.onSuccess(data)
}
})
}
// USER SERVICE
override fun getUser(userId: String): User? {
assert(isOpen)
return userService.getUser(userId)
}
2019-05-16 08:23:57 +00:00
// CRYPTO SERVICE
override fun setDeviceName(deviceId: String, deviceName: String, callback: MatrixCallback<Unit>) {
cryptoService.setDeviceName(deviceId, deviceName, callback)
}
override fun deleteDevice(deviceId: String, accountPassword: String, callback: MatrixCallback<Unit>) {
cryptoService.deleteDevice(deviceId, accountPassword, callback)
}
override fun getCryptoVersion(context: Context, longFormat: Boolean): String {
return cryptoService.getCryptoVersion(context, longFormat)
}
override fun isCryptoEnabled(): Boolean {
return cryptoService.isCryptoEnabled()
}
override fun getSasVerificationService(): SasVerificationService {
return cryptoService.getSasVerificationService()
}
override fun getKeysBackupService(): KeysBackupService {
return cryptoService.getKeysBackupService()
}
2019-05-17 13:05:07 +00:00
override fun isRoomBlacklistUnverifiedDevices(roomId: String?): Boolean {
return cryptoService.isRoomBlacklistUnverifiedDevices(roomId)
2019-05-16 08:23:57 +00:00
}
override fun setWarnOnUnknownDevices(warn: Boolean) {
cryptoService.setWarnOnUnknownDevices(warn)
}
2019-05-17 13:05:07 +00:00
override fun setDeviceVerification(verificationStatus: Int, deviceId: String, userId: String) {
cryptoService.setDeviceVerification(verificationStatus, deviceId, userId)
2019-05-16 08:23:57 +00:00
}
override fun getUserDevices(userId: String): MutableList<MXDeviceInfo> {
return cryptoService.getUserDevices(userId)
}
override fun setDevicesKnown(devices: List<MXDeviceInfo>, callback: MatrixCallback<Unit>?) {
cryptoService.setDevicesKnown(devices, callback)
}
override fun deviceWithIdentityKey(senderKey: String, algorithm: String): MXDeviceInfo? {
return cryptoService.deviceWithIdentityKey(senderKey, algorithm)
}
override fun getMyDevice(): MXDeviceInfo {
return cryptoService.getMyDevice()
}
override fun getDevicesList(callback: MatrixCallback<DevicesListResponse>) {
cryptoService.getDevicesList(callback)
}
override fun inboundGroupSessionsCount(onlyBackedUp: Boolean): Int {
return cryptoService.inboundGroupSessionsCount(onlyBackedUp)
}
2019-05-17 13:05:07 +00:00
override fun getGlobalBlacklistUnverifiedDevices(): Boolean {
return cryptoService.getGlobalBlacklistUnverifiedDevices()
2019-05-16 08:23:57 +00:00
}
2019-05-17 13:05:07 +00:00
override fun setGlobalBlacklistUnverifiedDevices(block: Boolean) {
cryptoService.setGlobalBlacklistUnverifiedDevices(block)
2019-05-16 08:23:57 +00:00
}
2019-05-17 13:05:07 +00:00
override fun setRoomUnBlacklistUnverifiedDevices(roomId: String) {
cryptoService.setRoomUnBlacklistUnverifiedDevices(roomId)
2019-05-16 08:23:57 +00:00
}
override fun getDeviceTrackingStatus(userId: String): Int {
return cryptoService.getDeviceTrackingStatus(userId)
}
override fun importRoomKeys(roomKeysAsArray: ByteArray, password: String, progressListener: ProgressListener?, callback: MatrixCallback<ImportRoomKeysResult>) {
cryptoService.importRoomKeys(roomKeysAsArray, password, progressListener, callback)
}
override fun exportRoomKeys(password: String, callback: MatrixCallback<ByteArray>) {
cryptoService.exportRoomKeys(password, callback)
}
2019-05-17 13:05:07 +00:00
override fun setRoomBlacklistUnverifiedDevices(roomId: String) {
cryptoService.setRoomBlacklistUnverifiedDevices(roomId)
2019-05-16 08:23:57 +00:00
}
2019-05-21 13:42:09 +00:00
override fun isRoomEncrypted(roomId: String): Boolean {
return cryptoService.isRoomEncrypted(roomId)
}
override fun encryptEventContent(eventContent: Content,
eventType: String,
room: Room,
callback: MatrixCallback<MXEncryptEventContentResult>) {
cryptoService.encryptEventContent(eventContent, eventType, room, callback)
}
2019-05-17 13:05:07 +00:00
override fun getDeviceInfo(userId: String, deviceId: String?): MXDeviceInfo? {
return cryptoService.getDeviceInfo(userId, deviceId)
2019-05-16 08:23:57 +00:00
}
override fun reRequestRoomKeyForEvent(event: Event) {
cryptoService.reRequestRoomKeyForEvent(event)
}
override fun cancelRoomKeyRequest(requestBody: RoomKeyRequestBody) {
cryptoService.cancelRoomKeyRequest(requestBody)
}
override fun addRoomKeysRequestListener(listener: RoomKeysRequestListener) {
cryptoService.addRoomKeysRequestListener(listener)
}
override fun decryptEvent(event: Event, timeline: String): MXEventDecryptionResult? {
return cryptoService.decryptEvent(event, timeline)
}
2019-05-21 13:42:09 +00:00
override fun getEncryptionAlgorithm(roomId: String): String? {
return cryptoService.getEncryptionAlgorithm(roomId)
}
override fun shouldEncryptForInvitedMembers(roomId: String): Boolean {
return cryptoService.shouldEncryptForInvitedMembers(roomId)
}
2018-10-17 11:59:21 +00:00
// Private methods *****************************************************************************
private fun assertMainThread() {
if (Looper.getMainLooper().thread !== Thread.currentThread()) {
throw IllegalStateException("This method can only be called on the main thread!")
}
}
}