ganfra
2 years ago
26 changed files with 119 additions and 105 deletions
@ -1,63 +0,0 @@ |
|||||||
package io.element.android.x.root |
|
||||||
|
|
||||||
import android.os.Bundle |
|
||||||
import io.element.android.libraries.di.AppScope |
|
||||||
import io.element.android.libraries.di.SingleIn |
|
||||||
import io.element.android.libraries.matrix.MatrixClient |
|
||||||
import io.element.android.libraries.matrix.auth.MatrixAuthenticationService |
|
||||||
import io.element.android.libraries.matrix.core.SessionId |
|
||||||
import kotlinx.coroutines.runBlocking |
|
||||||
import timber.log.Timber |
|
||||||
import java.util.concurrent.ConcurrentHashMap |
|
||||||
import javax.inject.Inject |
|
||||||
|
|
||||||
private const val SAVE_INSTANCE_KEY = "io.element.android.x.di.MatrixClientsHolder.SaveInstanceKey" |
|
||||||
|
|
||||||
@SingleIn(AppScope::class) |
|
||||||
class MatrixClientsHolder @Inject constructor(private val authenticationService: MatrixAuthenticationService) { |
|
||||||
|
|
||||||
private val sessionIdsToMatrixClient = ConcurrentHashMap<SessionId, MatrixClient>() |
|
||||||
|
|
||||||
fun add(matrixClient: MatrixClient) { |
|
||||||
sessionIdsToMatrixClient[matrixClient.sessionId] = matrixClient |
|
||||||
} |
|
||||||
|
|
||||||
fun removeAll() { |
|
||||||
sessionIdsToMatrixClient.clear() |
|
||||||
} |
|
||||||
|
|
||||||
fun remove(sessionId: SessionId) { |
|
||||||
sessionIdsToMatrixClient.remove(sessionId) |
|
||||||
} |
|
||||||
|
|
||||||
fun isEmpty(): Boolean = sessionIdsToMatrixClient.isEmpty() |
|
||||||
|
|
||||||
fun knowSession(sessionId: SessionId): Boolean = sessionIdsToMatrixClient.containsKey(sessionId) |
|
||||||
|
|
||||||
fun getOrNull(sessionId: SessionId): MatrixClient? { |
|
||||||
return sessionIdsToMatrixClient[sessionId] |
|
||||||
} |
|
||||||
|
|
||||||
@Suppress("DEPRECATION") |
|
||||||
fun restore(savedInstanceState: Bundle?) { |
|
||||||
if (savedInstanceState == null || sessionIdsToMatrixClient.isNotEmpty()) return |
|
||||||
val sessionIds = savedInstanceState.getSerializable(SAVE_INSTANCE_KEY) as? Array<SessionId> |
|
||||||
if (sessionIds.isNullOrEmpty()) return |
|
||||||
// Not ideal but should only happens in case of process recreation. This ensure we restore all the active sessions before restoring the node graphs. |
|
||||||
runBlocking { |
|
||||||
sessionIds.forEach { sessionId -> |
|
||||||
Timber.v("Restore matrix session: $sessionId") |
|
||||||
val matrixClient = authenticationService.restoreSession(sessionId) |
|
||||||
if (matrixClient != null) { |
|
||||||
add(matrixClient) |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
fun onSaveInstanceState(outState: Bundle) { |
|
||||||
val sessionKeys = sessionIdsToMatrixClient.keys.toTypedArray() |
|
||||||
Timber.v("Save matrix session keys = $sessionKeys") |
|
||||||
outState.putSerializable(SAVE_INSTANCE_KEY, sessionKeys) |
|
||||||
} |
|
||||||
} |
|
@ -0,0 +1,62 @@ |
|||||||
|
/* |
||||||
|
* Copyright (c) 2022 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. |
||||||
|
*/ |
||||||
|
|
||||||
|
@file:Suppress("UnstableApiUsage") |
||||||
|
|
||||||
|
// TODO: Remove once https://youtrack.jetbrains.com/issue/KTIJ-19369 is fixed |
||||||
|
@Suppress("DSL_SCOPE_VIOLATION") |
||||||
|
plugins { |
||||||
|
id("io.element.android-compose-library") |
||||||
|
alias(libs.plugins.anvil) |
||||||
|
alias(libs.plugins.ksp) |
||||||
|
alias(libs.plugins.kapt) |
||||||
|
id("kotlin-parcelize") |
||||||
|
} |
||||||
|
|
||||||
|
android { |
||||||
|
namespace = "io.element.android.appnav" |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
dependencies { |
||||||
|
implementation(projects.anvilannotations) |
||||||
|
anvil(projects.anvilcodegen) |
||||||
|
implementation(libs.dagger) |
||||||
|
kapt(libs.dagger.compiler) |
||||||
|
|
||||||
|
implementation(projects.features.messages.api) |
||||||
|
implementation(projects.features.roomlist) |
||||||
|
implementation(projects.features.rageshake) |
||||||
|
implementation(projects.features.login) |
||||||
|
implementation(projects.features.preferences) |
||||||
|
implementation(projects.features.logout) |
||||||
|
implementation(projects.features.onboarding) |
||||||
|
|
||||||
|
implementation(projects.libraries.core) |
||||||
|
implementation(projects.libraries.architecture) |
||||||
|
implementation(projects.libraries.matrix) |
||||||
|
implementation(projects.libraries.designsystem) |
||||||
|
implementation(projects.libraries.matrixui) |
||||||
|
implementation(projects.tests.uitests) |
||||||
|
implementation(libs.coil) |
||||||
|
|
||||||
|
testImplementation(libs.test.junit) |
||||||
|
testImplementation(libs.coroutines.test) |
||||||
|
testImplementation(libs.molecule.runtime) |
||||||
|
testImplementation(libs.test.truth) |
||||||
|
testImplementation(libs.test.turbine) |
||||||
|
testImplementation(projects.libraries.matrixtest) |
||||||
|
} |
Loading…
Reference in new issue