Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a57330ce authored by Lucas Silva's avatar Lucas Silva
Browse files

Fix race condition in transition from dream -> hub

We should only transition to the hub from the dream if we did not
already start another transition to somewhere else. This fixes the case
where we may transition to the hub after a transition to the bouncer has
already occurred.

Bug: 358695869
Test: atest FromDreamingTransitionInteractorTest
Flag: com.android.systemui.communal_hub
Change-Id: Iecc5d5119e166561a67bb46e7424a13d32873125
parent 595846cc
Loading
Loading
Loading
Loading
+5 −6
Original line number Diff line number Diff line
@@ -20,9 +20,9 @@ import com.android.keyguard.KeyguardUpdateMonitor
import com.android.systemui.Flags.glanceableHubAllowKeyguardWhenDreaming
import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
import com.android.systemui.communal.domain.interactor.CommunalInteractor
import com.android.systemui.communal.shared.model.CommunalScenes
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dump.DumpManager
import com.android.systemui.keyguard.domain.interactor.FromDreamingTransitionInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
import com.android.systemui.keyguard.shared.model.Edge
import com.android.systemui.keyguard.shared.model.KeyguardState.DREAMING
@@ -51,6 +51,7 @@ constructor(
    fromGlanceableHubTransitionInteractor: GlanceableHubToDreamingTransitionViewModel,
    toGlanceableHubTransitionViewModel: DreamingToGlanceableHubTransitionViewModel,
    private val toLockscreenTransitionViewModel: DreamingToLockscreenTransitionViewModel,
    private val fromDreamingTransitionInteractor: FromDreamingTransitionInteractor,
    private val communalInteractor: CommunalInteractor,
    private val keyguardUpdateMonitor: KeyguardUpdateMonitor,
    private val userTracker: UserTracker,
@@ -61,11 +62,9 @@ constructor(
        val showGlanceableHub =
            communalInteractor.isCommunalEnabled.value &&
                !keyguardUpdateMonitor.isEncryptedOrLockdown(userTracker.userId)
        if (showGlanceableHub && !glanceableHubAllowKeyguardWhenDreaming()) {
            communalInteractor.changeScene(CommunalScenes.Communal, "transition away from dream")
        } else {
            toLockscreenTransitionViewModel.startTransition()
        }
        fromDreamingTransitionInteractor.startToLockscreenOrGlanceableHubTransition(
            showGlanceableHub && !glanceableHubAllowKeyguardWhenDreaming()
        )
    }

    val dreamOverlayTranslationX: Flow<Float> =
+15 −5
Original line number Diff line number Diff line
@@ -20,7 +20,9 @@ import android.animation.ValueAnimator
import com.android.app.animation.Interpolators
import com.android.app.tracing.coroutines.launch
import com.android.systemui.Flags.communalSceneKtfRefactor
import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor
import com.android.systemui.communal.domain.interactor.CommunalSettingsInteractor
import com.android.systemui.communal.shared.model.CommunalScenes
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
@@ -59,6 +61,7 @@ constructor(
    @Main mainDispatcher: CoroutineDispatcher,
    keyguardInteractor: KeyguardInteractor,
    private val glanceableHubTransitions: GlanceableHubTransitions,
    private val communalSceneInteractor: CommunalSceneInteractor,
    private val communalSettingsInteractor: CommunalSettingsInteractor,
    powerInteractor: PowerInteractor,
    keyguardOcclusionInteractor: KeyguardOcclusionInteractor,
@@ -127,13 +130,19 @@ constructor(
        }
    }

    fun startToLockscreenTransition() {
    fun startToLockscreenOrGlanceableHubTransition(openHub: Boolean) {
        scope.launch {
            if (
                transitionInteractor.startedKeyguardState.replayCache.last() ==
                    KeyguardState.DREAMING
            ) {
                if (powerInteractor.detailedWakefulness.value.isAwake()) {
                    if (openHub) {
                        communalSceneInteractor.changeScene(
                            newScene = CommunalScenes.Communal,
                            loggingReason = "FromDreamingTransitionInteractor",
                        )
                    } else {
                        startTransitionTo(
                            KeyguardState.LOCKSCREEN,
                            ownerReason = "Dream has ended and device is awake"
@@ -142,6 +151,7 @@ constructor(
                }
            }
        }
    }

    @OptIn(FlowPreview::class)
    private fun listenForDreamingToOccluded() {
+0 −3
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@ package com.android.systemui.keyguard.ui.viewmodel

import com.android.app.animation.Interpolators.EMPHASIZED
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.domain.interactor.FromDreamingTransitionInteractor
import com.android.systemui.keyguard.domain.interactor.FromDreamingTransitionInteractor.Companion.TO_LOCKSCREEN_DURATION
import com.android.systemui.keyguard.shared.model.Edge
import com.android.systemui.keyguard.shared.model.KeyguardState.DREAMING
@@ -39,10 +38,8 @@ import kotlinx.coroutines.flow.Flow
class DreamingToLockscreenTransitionViewModel
@Inject
constructor(
    private val fromDreamingTransitionInteractor: FromDreamingTransitionInteractor,
    animationFlow: KeyguardTransitionAnimationFlow,
) : DeviceEntryIconTransition {
    fun startTransition() = fromDreamingTransitionInteractor.startToLockscreenTransition()

    private val transitionAnimation =
        animationFlow.setup(
+2 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.keyguard.domain.interactor

import com.android.systemui.communal.domain.interactor.communalSceneInteractor
import com.android.systemui.communal.domain.interactor.communalSettingsInteractor
import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor
import com.android.systemui.keyguard.data.repository.keyguardTransitionRepository
@@ -38,6 +39,7 @@ var Kosmos.fromDreamingTransitionInteractor by
            mainDispatcher = testDispatcher,
            keyguardInteractor = keyguardInteractor,
            glanceableHubTransitions = glanceableHubTransitions,
            communalSceneInteractor = communalSceneInteractor,
            communalSettingsInteractor = communalSettingsInteractor,
            powerInteractor = powerInteractor,
            keyguardOcclusionInteractor = keyguardOcclusionInteractor,
+0 −2
Original line number Diff line number Diff line
@@ -19,13 +19,11 @@ package com.android.systemui.keyguard.ui.viewmodel
import com.android.systemui.keyguard.ui.keyguardTransitionAnimationFlow
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
import com.android.systemui.util.mockito.mock
import kotlinx.coroutines.ExperimentalCoroutinesApi

@ExperimentalCoroutinesApi
val Kosmos.dreamingToLockscreenTransitionViewModel by Fixture {
    DreamingToLockscreenTransitionViewModel(
        fromDreamingTransitionInteractor = mock(),
        animationFlow = keyguardTransitionAnimationFlow,
    )
}