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

Commit 6c9fc4c4 authored by William Xiao's avatar William Xiao
Browse files

Fix glanceable hub not showing when waking from doze

Some timings seem to have changed and the device is now consistenly
awake before the doze dream has finished, so we now use "false" for the
isScreenOn parameter when quering canStartDreaming.

We debounce the occluded signal instead of reading it immediately when
waking since it can lag behind the dream stopping when power cycling
rapidly.

Also fixes the notifications showing when transitioning from doze to
hub.

Bug: 363239820
Test: atest FromDozingTransitionInteractorTest SharedNotificationContainerViewModelTest
Flag: com.android.systemui.communal_hub
Change-Id: Ib5a356ad59f0002b40dc112ab77b607c37fffe1f
parent 9637b6d9
Loading
Loading
Loading
Loading
+26 −0
Original line number Diff line number Diff line
@@ -26,8 +26,10 @@ import com.android.compose.animation.scene.ObservableTransitionState
import com.android.systemui.Flags.FLAG_COMMUNAL_HUB
import com.android.systemui.Flags.FLAG_COMMUNAL_SCENE_KTF_REFACTOR
import com.android.systemui.Flags.FLAG_KEYGUARD_WM_STATE_REFACTOR
import com.android.systemui.Flags.FLAG_SCENE_CONTAINER
import com.android.systemui.SysuiTestCase
import com.android.systemui.communal.data.repository.FakeCommunalSceneRepository
import com.android.systemui.communal.data.repository.communalSceneRepository
import com.android.systemui.communal.data.repository.fakeCommunalSceneRepository
import com.android.systemui.communal.domain.interactor.setCommunalAvailable
import com.android.systemui.communal.shared.model.CommunalScenes
@@ -50,10 +52,12 @@ import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.se
import com.android.systemui.power.domain.interactor.powerInteractor
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.testKosmos
import com.google.common.truth.Truth
import junit.framework.Assert.assertEquals
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.test.advanceTimeBy
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Before
@@ -218,6 +222,28 @@ class FromDozingTransitionInteractorTest(flags: FlagsParameterization?) : SysuiT
                .startedTransition(from = KeyguardState.DOZING, to = KeyguardState.GLANCEABLE_HUB)
        }

    @Test
    @DisableFlags(FLAG_KEYGUARD_WM_STATE_REFACTOR, FLAG_SCENE_CONTAINER)
    @EnableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR)
    fun testTransitionToGlanceableHub_onWakeup_ifAvailable() =
        testScope.runTest {
            // Hub is available.
            whenever(kosmos.dreamManager.canStartDreaming(anyBoolean())).thenReturn(true)
            kosmos.setCommunalAvailable(true)
            runCurrent()

            // Device turns on.
            powerInteractor.setAwakeForTest()
            advanceTimeBy(50L)
            runCurrent()

            // We transition to the hub when waking up.
            Truth.assertThat(kosmos.communalSceneRepository.currentScene.value)
                .isEqualTo(CommunalScenes.Communal)
            // No transitions are directly started by this interactor.
            assertThat(transitionRepository).noTransitionsStarted()
        }

    @Test
    @EnableFlags(FLAG_KEYGUARD_WM_STATE_REFACTOR)
    fun testTransitionToOccluded_onWakeup_whenOccludingActivityOnTop() =
+64 −0
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
import com.android.systemui.keyguard.shared.model.BurnInModel
import com.android.systemui.keyguard.shared.model.KeyguardState.ALTERNATE_BOUNCER
import com.android.systemui.keyguard.shared.model.KeyguardState.AOD
import com.android.systemui.keyguard.shared.model.KeyguardState.DOZING
import com.android.systemui.keyguard.shared.model.KeyguardState.DREAMING
import com.android.systemui.keyguard.shared.model.KeyguardState.GLANCEABLE_HUB
import com.android.systemui.keyguard.shared.model.KeyguardState.GONE
@@ -356,6 +357,69 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S

    @Test
    fun glanceableHubAlpha_dreamToHub() =
        testScope.runTest {
            val alpha by collectLastValue(underTest.glanceableHubAlpha)

            // Start on lockscreen, notifications should be unhidden.
            showLockscreen()
            assertThat(alpha).isEqualTo(1f)

            // Go to dozing
            keyguardTransitionRepository.sendTransitionSteps(
                from = LOCKSCREEN,
                to = DOZING,
                testScope,
            )
            assertThat(alpha).isEqualTo(1f)

            // Start transitioning to glanceable hub
            val progress = 0.6f
            kosmos.setTransition(
                sceneTransition = Transition(from = Scenes.Lockscreen, to = Scenes.Communal),
                stateTransition =
                    TransitionStep(
                        transitionState = TransitionState.STARTED,
                        from = DOZING,
                        to = GLANCEABLE_HUB,
                        value = 0f,
                    ),
            )
            runCurrent()
            kosmos.setTransition(
                sceneTransition =
                    Transition(
                        from = Scenes.Lockscreen,
                        to = Scenes.Communal,
                        progress = flowOf(progress),
                    ),
                stateTransition =
                    TransitionStep(
                        transitionState = TransitionState.RUNNING,
                        from = DOZING,
                        to = GLANCEABLE_HUB,
                        value = progress,
                    ),
            )
            runCurrent()
            // Keep notifications hidden during the transition from dream to hub
            assertThat(alpha).isEqualTo(0)

            // Finish transition to glanceable hub
            kosmos.setTransition(
                sceneTransition = Idle(Scenes.Communal),
                stateTransition =
                    TransitionStep(
                        transitionState = TransitionState.FINISHED,
                        from = DOZING,
                        to = GLANCEABLE_HUB,
                        value = 1f,
                    ),
            )
            assertThat(alpha).isEqualTo(0f)
        }

    @Test
    fun glanceableHubAlpha_dozingToHub() =
        testScope.runTest {
            val alpha by collectLastValue(underTest.glanceableHubAlpha)

+3 −1
Original line number Diff line number Diff line
@@ -150,7 +150,9 @@ constructor(
                        if (!SceneContainerFlag.isEnabled) {
                            startTransitionTo(KeyguardState.GLANCEABLE_HUB)
                        }
                    } else if (isCommunalAvailable && dreamManager.canStartDreaming(true)) {
                    } else if (isCommunalAvailable && dreamManager.canStartDreaming(false)) {
                        // Using false for isScreenOn as canStartDreaming returns false if any
                        // dream, including doze, is active.
                        // This case handles tapping the power button to transition through
                        // dream -> off -> hub.
                        if (!SceneContainerFlag.isEnabled) {
+8 −1
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import com.android.systemui.keyguard.ui.transitions.DeviceEntryIconTransition
import com.android.systemui.scene.shared.model.Scenes
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flowOf

@SysUISingleton
class DozingToGlanceableHubTransitionViewModel
@@ -35,10 +36,16 @@ constructor(animationFlow: KeyguardTransitionAnimationFlow) : DeviceEntryIconTra
        animationFlow
            .setup(
                duration = TO_GLANCEABLE_HUB_DURATION,
                edge = Edge.create(DOZING, Scenes.Communal)
                edge = Edge.create(DOZING, Scenes.Communal),
            )
            .setupWithoutSceneContainer(edge = Edge.create(DOZING, GLANCEABLE_HUB))

    override val deviceEntryParentViewAlpha: Flow<Float> =
        transitionAnimation.immediatelyTransitionTo(1f)

    /**
     * Hide notifications when transitioning directly from dozing to hub, such as when pressing
     * power button when dozing and docked.
     */
    val notificationAlpha: Flow<Float> = flowOf(0f)
}
+3 −0
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ import com.android.systemui.keyguard.ui.viewmodel.AodToGoneTransitionViewModel
import com.android.systemui.keyguard.ui.viewmodel.AodToLockscreenTransitionViewModel
import com.android.systemui.keyguard.ui.viewmodel.AodToOccludedTransitionViewModel
import com.android.systemui.keyguard.ui.viewmodel.BurnInParameters
import com.android.systemui.keyguard.ui.viewmodel.DozingToGlanceableHubTransitionViewModel
import com.android.systemui.keyguard.ui.viewmodel.DozingToLockscreenTransitionViewModel
import com.android.systemui.keyguard.ui.viewmodel.DozingToOccludedTransitionViewModel
import com.android.systemui.keyguard.ui.viewmodel.DreamingToLockscreenTransitionViewModel
@@ -112,6 +113,7 @@ constructor(
    private val aodToGoneTransitionViewModel: AodToGoneTransitionViewModel,
    private val aodToLockscreenTransitionViewModel: AodToLockscreenTransitionViewModel,
    private val aodToOccludedTransitionViewModel: AodToOccludedTransitionViewModel,
    dozingToGlanceableHubTransitionViewModel: DozingToGlanceableHubTransitionViewModel,
    private val dozingToLockscreenTransitionViewModel: DozingToLockscreenTransitionViewModel,
    private val dozingToOccludedTransitionViewModel: DozingToOccludedTransitionViewModel,
    private val dreamingToLockscreenTransitionViewModel: DreamingToLockscreenTransitionViewModel,
@@ -506,6 +508,7 @@ constructor(
                merge(
                        lockscreenToGlanceableHubTransitionViewModel.notificationAlpha,
                        glanceableHubToLockscreenTransitionViewModel.notificationAlpha,
                        dozingToGlanceableHubTransitionViewModel.notificationAlpha,
                    )
                    // Manually emit on start because [notificationAlpha] only starts emitting
                    // when transitions start.
Loading