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

Commit 9f2660f8 authored by Josh Tsuji's avatar Josh Tsuji
Browse files

Keep scene container visible while the surface is animating.

This otherwise causes flows that control the remote animation to stop emitting values. (similar to ag/34058954).

Fixes: 434210339
Test: swipe to unlock
Flag: com.android.systemui.scene_container
Change-Id: Ie43619adce5f440eb5db8d869226b11fefeadb9a
parent 7f37e37d
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
@@ -83,6 +83,7 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.keyguard.domain.interactor.dozeInteractor
import com.android.systemui.keyguard.domain.interactor.keyguardEnabledInteractor
import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
import com.android.systemui.keyguard.domain.interactor.keyguardSurfaceBehindInteractor
import com.android.systemui.keyguard.domain.interactor.scenetransition.lockscreenSceneTransitionInteractor
import com.android.systemui.keyguard.shared.model.FailFingerprintAuthenticationStatus
import com.android.systemui.keyguard.shared.model.KeyguardState
@@ -421,6 +422,37 @@ class SceneContainerStartableTest : SysuiTestCase() {
            assertThat(isVisible).isTrue()
        }

    @Test
    fun hydrateVisibility_surfaceBehindAnimating() =
        kosmos.runTest {
            val isVisible by collectLastValue(sceneInteractor.isVisible)

            val transitionState = prepareState(
                isDeviceUnlocked = true,
                initialSceneKey = Scenes.Lockscreen,
            )
            underTest.start()
            assertThat(isVisible).isTrue()

            // Unlock, leaving the surface behind animation running even after the transition ends.
            sceneInteractor.changeScene(
                Scenes.Gone, "unlocking for test", forceSettleToTargetScene = true)
            transitionState.value = ObservableTransitionState.Idle(Scenes.Gone)
            keyguardSurfaceBehindInteractor.setAnimatingSurface(true)
            runCurrent()

            // Scene container should remain visible so the flows controlling the surface behind
            // animation continue emitting.
            assertThat(isVisible).isTrue()

            // Once the animation settles...
            keyguardSurfaceBehindInteractor.setAnimatingSurface(false)
            runCurrent()

            // ...we no longer need to be visible.
            assertThat(isVisible).isFalse()
        }

    @Test
    fun startsInLockscreenScene() =
        kosmos.runTest {
+6 −1
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ import com.android.systemui.deviceentry.shared.model.DeviceUnlockSource
import com.android.systemui.keyguard.DismissCallbackRegistry
import com.android.systemui.keyguard.domain.interactor.KeyguardEnabledInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardSurfaceBehindInteractor
import com.android.systemui.keyguard.domain.interactor.TrustInteractor
import com.android.systemui.keyguard.domain.interactor.WindowManagerLockscreenVisibilityInteractor.Companion.keyguardScenes
import com.android.systemui.log.table.TableLogBuffer
@@ -156,6 +157,7 @@ constructor(
    private val trustInteractor: TrustInteractor,
    private val sysuiStateInteractor: SysUIStateDisplaysInteractor,
    private val shadeDisplaysInteractor: Lazy<ShadeDisplaysInteractor>,
    private val surfaceBehindInteractor: KeyguardSurfaceBehindInteractor,
) : CoreStartable {
    private val centralSurfaces: CentralSurfaces?
        get() = centralSurfacesOptLazy.get().getOrNull()
@@ -288,11 +290,13 @@ constructor(
                                headsUpInteractor.isHeadsUpOrAnimatingAway,
                                occlusionInteractor.invisibleDueToOcclusion,
                                alternateBouncerInteractor.isVisible,
                                surfaceBehindInteractor.isAnimatingSurface,
                            ) {
                                transitionState,
                                isHeadsUpOrAnimatingAway,
                                invisibleDueToOcclusion,
                                isAlternateBouncerVisible ->
                                isAlternateBouncerVisible,
                                isAnimatingSurface ->
                                val isCommunalShowing =
                                    transitionState.isTransitioningFromOrTo(Scenes.Communal) ||
                                        transitionState.isIdle(Scenes.Communal)
@@ -324,6 +328,7 @@ constructor(
                                when {
                                    isCommunalShowing ->
                                        true to "on or transitioning to/from communal"
                                    isAnimatingSurface -> true to "animating surface behind"
                                    isHeadsUpOrAnimatingAway -> true to "showing a HUN"
                                    isAlternateBouncerVisible -> true to "showing alternate bouncer"
                                    // We need to be visible during transitions, even if occlusion
+2 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import com.android.systemui.haptics.vibratorHelper
import com.android.systemui.keyguard.dismissCallbackRegistry
import com.android.systemui.keyguard.domain.interactor.keyguardEnabledInteractor
import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
import com.android.systemui.keyguard.domain.interactor.keyguardSurfaceBehindInteractor
import com.android.systemui.keyguard.domain.interactor.trustInteractor
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
@@ -93,5 +94,6 @@ val Kosmos.sceneContainerStartable by Fixture {
        trustInteractor = trustInteractor,
        sysuiStateInteractor = sysuiStateInteractor,
        shadeDisplaysInteractor = { shadeDisplaysInteractor },
        surfaceBehindInteractor = keyguardSurfaceBehindInteractor,
    )
}