App state: fix session

This commit is contained in:
ganfra 2019-10-16 10:04:11 +02:00
parent 6cd04525aa
commit a1a71e2f1d
3 changed files with 26 additions and 7 deletions

View File

@ -0,0 +1,10 @@
package im.vector.riotx
import arrow.core.Option
import im.vector.matrix.android.api.session.Session
import im.vector.riotx.core.utils.RxStore
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class ActiveSessionObservableStore @Inject constructor() : RxStore<Option<Session>>()

View File

@ -23,26 +23,27 @@ import arrow.core.Option
import im.vector.matrix.android.api.session.group.model.GroupSummary
import im.vector.matrix.android.api.session.room.model.RoomSummary
import im.vector.matrix.rx.rx
import im.vector.riotx.core.di.ActiveSessionHolder
import im.vector.riotx.features.home.HomeRoomListObservableStore
import im.vector.riotx.features.home.group.ALL_COMMUNITIES_GROUP_ID
import im.vector.riotx.features.home.group.SelectedGroupStore
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.functions.BiFunction
import io.reactivex.rxkotlin.addTo
import io.reactivex.schedulers.Schedulers
import java.util.concurrent.TimeUnit
import javax.inject.Inject
import javax.inject.Singleton
/**
* This class handles the main room list at the moment. It will dispatch the results to the store.
* It requires to be added with ProcessLifecycleOwner.get().lifecycle.addObserver
* This class handles the global app state. At the moment, it only manages room list.
* It requires to be added to ProcessLifecycleOwner.get().lifecycle
*/
@Singleton
class AppStateHandler @Inject constructor(
private val activeSessionHolder: ActiveSessionHolder,
private val sessionObservableStore: ActiveSessionObservableStore,
private val homeRoomListStore: HomeRoomListObservableStore,
private val selectedGroupStore: SelectedGroupStore) : LifecycleObserver {
@ -61,9 +62,12 @@ class AppStateHandler @Inject constructor(
private fun observeRoomsAndGroup() {
Observable
.combineLatest<List<RoomSummary>, Option<GroupSummary>, List<RoomSummary>>(
activeSessionHolder.getActiveSession()
.rx()
.liveRoomSummaries()
sessionObservableStore.observe()
.observeOn(AndroidSchedulers.mainThread())
.switchMap {
it.orNull()?.rx()?.liveRoomSummaries()
?: Observable.just(emptyList())
}
.throttleLast(300, TimeUnit.MILLISECONDS),
selectedGroupStore.observe(),
BiFunction { rooms, selectedGroupOption ->

View File

@ -16,8 +16,10 @@
package im.vector.riotx.core.di
import arrow.core.Option
import im.vector.matrix.android.api.auth.Authenticator
import im.vector.matrix.android.api.session.Session
import im.vector.riotx.ActiveSessionObservableStore
import im.vector.riotx.features.crypto.keysrequest.KeyRequestHandler
import im.vector.riotx.features.crypto.verification.IncomingVerificationRequestHandler
import java.util.concurrent.atomic.AtomicReference
@ -26,6 +28,7 @@ import javax.inject.Singleton
@Singleton
class ActiveSessionHolder @Inject constructor(private val authenticator: Authenticator,
private val sessionObservableStore: ActiveSessionObservableStore,
private val keyRequestHandler: KeyRequestHandler,
private val incomingVerificationRequestHandler: IncomingVerificationRequestHandler
) {
@ -34,12 +37,14 @@ class ActiveSessionHolder @Inject constructor(private val authenticator: Authent
fun setActiveSession(session: Session) {
activeSession.set(session)
sessionObservableStore.post(Option.fromNullable(session))
keyRequestHandler.start(session)
incomingVerificationRequestHandler.start(session)
}
fun clearActiveSession() {
activeSession.set(null)
sessionObservableStore.post(Option.empty())
keyRequestHandler.stop()
incomingVerificationRequestHandler.stop()
}