1616
1717package io.element.android.appnav.di
1818
19- import android.os.Bundle
20- import io.element.android.libraries.di.AppScope
21- import io.element.android.libraries.di.SingleIn
19+ import com.bumble.appyx.core.state.MutableSavedStateMap
20+ import com.bumble.appyx.core.state.SavedStateMap
2221import io.element.android.libraries.matrix.api.MatrixClient
2322import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService
2423import io.element.android.libraries.matrix.api.core.SessionId
25- import io.element.android.libraries.matrix.api.core.UserId
2624import kotlinx.coroutines.runBlocking
2725import timber.log.Timber
2826import java.util.concurrent.ConcurrentHashMap
2927import javax.inject.Inject
3028
3129private const val SAVE_INSTANCE_KEY = " io.element.android.x.di.MatrixClientsHolder.SaveInstanceKey"
3230
33- @SingleIn(AppScope ::class )
3431class MatrixClientsHolder @Inject constructor(private val authenticationService : MatrixAuthenticationService ) {
3532
3633 private val sessionIdsToMatrixClient = ConcurrentHashMap <SessionId , MatrixClient >()
@@ -55,16 +52,18 @@ class MatrixClientsHolder @Inject constructor(private val authenticationService:
5552 return sessionIdsToMatrixClient[sessionId]
5653 }
5754
58- @Suppress(" DEPRECATION" )
59- fun restore (savedInstanceState : Bundle ? ) {
60- if (savedInstanceState == null || sessionIdsToMatrixClient.isNotEmpty()) return
61- val userIds = savedInstanceState.getSerializable(SAVE_INSTANCE_KEY ) as ? Array <UserId >
62- if (userIds.isNullOrEmpty()) return
55+ @Suppress(" UNCHECKED_CAST" )
56+ fun restore (state : SavedStateMap ? ) {
57+ if (state == null || sessionIdsToMatrixClient.isNotEmpty()) return Unit .also {
58+ Timber .w(" Restore with non-empty map" )
59+ }
60+ val sessionIds = state[SAVE_INSTANCE_KEY ] as ? Array <SessionId >
61+ if (sessionIds.isNullOrEmpty()) return
6362 // Not ideal but should only happens in case of process recreation. This ensure we restore all the active sessions before restoring the node graphs.
6463 runBlocking {
65- userIds .forEach { userId ->
66- Timber .v (" Restore matrix session: $userId " )
67- authenticationService.restoreSession(userId )
64+ sessionIds .forEach { sessionId ->
65+ Timber .d (" Restore matrix session: $sessionId " )
66+ authenticationService.restoreSession(sessionId )
6867 .onSuccess { matrixClient ->
6968 add(matrixClient)
7069 }
@@ -75,9 +74,9 @@ class MatrixClientsHolder @Inject constructor(private val authenticationService:
7574 }
7675 }
7776
78- fun onSaveInstanceState ( outState : Bundle ) {
77+ fun save ( state : MutableSavedStateMap ) {
7978 val sessionKeys = sessionIdsToMatrixClient.keys.toTypedArray()
80- Timber .v (" Save matrix session keys = $sessionKeys " )
81- outState.putSerializable( SAVE_INSTANCE_KEY , sessionKeys)
79+ Timber .d (" Save matrix session keys = $sessionKeys " )
80+ state[ SAVE_INSTANCE_KEY ] = sessionKeys
8281 }
8382}
0 commit comments