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

Commit 50a29906 authored by Coco Duan's avatar Coco Duan
Browse files

Fix keyguard status bar showing upon entering dream

When transitioning from launcher or lockscreen to dreaming, keyguard
status bar flickers upon entering dream.
Fix by updating the status bar alpha with the value in the transition
view model.

Bug: b/372563526
Test: atest KeyguardStatusBarViewControllerTest
Test: from lockscreen/launcher, verify status bar is hidden upon entering dream
Flag: EXEMPT bugfix
Change-Id: I982dfaa07a55853ab7ce92c64cd0141db3f4da90
parent b9dd01e2
Loading
Loading
Loading
Loading
+225 −0
Original line number Diff line number Diff line
@@ -39,9 +39,18 @@ import com.android.systemui.battery.BatteryMeterViewController
import com.android.systemui.communal.data.repository.fakeCommunalSceneRepository
import com.android.systemui.communal.domain.interactor.communalSceneInteractor
import com.android.systemui.communal.shared.model.CommunalScenes
import com.android.systemui.dreams.ui.viewmodel.dreamViewModel
import com.android.systemui.flags.DisableSceneContainer
import com.android.systemui.flags.EnableSceneContainer
import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionState.CANCELED
import com.android.systemui.keyguard.shared.model.TransitionState.FINISHED
import com.android.systemui.keyguard.shared.model.TransitionState.RUNNING
import com.android.systemui.keyguard.shared.model.TransitionState.STARTED
import com.android.systemui.keyguard.shared.model.TransitionStep
import com.android.systemui.keyguard.ui.viewmodel.glanceableHubToLockscreenTransitionViewModel
import com.android.systemui.keyguard.ui.viewmodel.lockscreenToGlanceableHubTransitionViewModel
import com.android.systemui.kosmos.Kosmos
@@ -71,6 +80,7 @@ import com.android.systemui.user.data.repository.fakeUserRepository
import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.settings.SecureSettings
import com.android.systemui.util.time.FakeSystemClock
import com.google.common.collect.Range
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.TestScope
@@ -221,6 +231,7 @@ class KeyguardStatusBarViewControllerTest : SysuiTestCase() {
            kosmos.communalSceneInteractor,
            kosmos.glanceableHubToLockscreenTransitionViewModel,
            kosmos.lockscreenToGlanceableHubTransitionViewModel,
            kosmos.dreamViewModel,
            kosmos.keyguardInteractor,
        )
    }
@@ -945,6 +956,175 @@ class KeyguardStatusBarViewControllerTest : SysuiTestCase() {
            }
        }

    @Test
    @DisableSceneContainer
    fun lockscreenToDreaming_affectsAlpha() =
        testScope.runTest {
            try {
                controller.init()
                ViewUtils.attachView(keyguardStatusBarView)
                looper.processAllMessages()
                updateStateToKeyguard()

                val transitionSteps =
                    listOf(
                        lockscreenToDreamTransitionStep(0.0f, STARTED),
                        lockscreenToDreamTransitionStep(.1f),
                    )
                kosmos.fakeKeyguardTransitionRepository.sendTransitionSteps(
                    transitionSteps,
                    testScope,
                )

                assertThat(keyguardStatusBarView.alpha).isIn(Range.open(0f, 1f))
                assertThat(keyguardStatusBarView.visibility).isEqualTo(View.VISIBLE)

                kosmos.fakeKeyguardTransitionRepository.sendTransitionSteps(
                    listOf(
                        lockscreenToDreamTransitionStep(1f),
                        lockscreenToDreamTransitionStep(1f, FINISHED),
                    ),
                    testScope,
                )

                assertThat(keyguardStatusBarView.alpha).isEqualTo(0f)
                assertThat(keyguardStatusBarView.visibility).isEqualTo(View.INVISIBLE)
            } finally {
                ViewUtils.detachView(keyguardStatusBarView)
            }
        }

    @Test
    @DisableSceneContainer
    fun dreamingToLockscreen_affectsAlpha() =
        testScope.runTest {
            try {
                controller.init()
                ViewUtils.attachView(keyguardStatusBarView)
                looper.processAllMessages()
                updateStateToKeyguard()

                val transitionSteps =
                    listOf(
                        dreamToLockscreenTransitionStep(0.0f, STARTED),
                        dreamToLockscreenTransitionStep(.3f),
                    )
                kosmos.fakeKeyguardTransitionRepository.sendTransitionSteps(
                    transitionSteps,
                    testScope,
                )

                assertThat(keyguardStatusBarView.alpha).isIn(Range.open(0f, 1f))
                assertThat(keyguardStatusBarView.visibility).isEqualTo(View.VISIBLE)
            } finally {
                ViewUtils.detachView(keyguardStatusBarView)
            }
        }

    @Test
    @DisableSceneContainer
    fun dreamingToLockscreen_resetAlphaOnFinished() =
        testScope.runTest {
            try {
                controller.init()
                ViewUtils.attachView(keyguardStatusBarView)
                looper.processAllMessages()
                updateStateToKeyguard()

                val transitionSteps =
                    listOf(
                        dreamToLockscreenTransitionStep(0.0f, STARTED),
                        dreamToLockscreenTransitionStep(.3f),
                    )
                kosmos.fakeKeyguardTransitionRepository.sendTransitionSteps(
                    transitionSteps,
                    testScope,
                )

                val explicitAlpha = keyguardStatusBarView.alpha
                assertThat(explicitAlpha).isIn(Range.open(0f, 1f))

                kosmos.fakeKeyguardTransitionRepository.sendTransitionSteps(
                    listOf(dreamToLockscreenTransitionStep(1f, FINISHED)),
                    testScope,
                )

                assertThat(keyguardStatusBarView.alpha).isNotEqualTo(explicitAlpha)
                assertThat(keyguardStatusBarView.visibility).isEqualTo(View.VISIBLE)
            } finally {
                ViewUtils.detachView(keyguardStatusBarView)
            }
        }

    @Test
    @DisableSceneContainer
    fun goneToDreaming_affectsAlpha() =
        testScope.runTest {
            try {
                controller.init()
                ViewUtils.attachView(keyguardStatusBarView)
                looper.processAllMessages()
                updateStateToKeyguard()

                val transitionSteps =
                    listOf(goneToDreamTransitionStep(0.0f, STARTED), goneToDreamTransitionStep(.1f))
                kosmos.fakeKeyguardTransitionRepository.sendTransitionSteps(
                    transitionSteps,
                    testScope,
                )

                assertThat(keyguardStatusBarView.alpha).isEqualTo(0f)
                assertThat(keyguardStatusBarView.visibility).isEqualTo(View.INVISIBLE)
            } finally {
                ViewUtils.detachView(keyguardStatusBarView)
            }
        }

    @Test
    @DisableSceneContainer
    fun resetAlpha_onTransitionToDreamingInterrupted() =
        testScope.runTest {
            try {
                controller.init()
                ViewUtils.attachView(keyguardStatusBarView)
                looper.processAllMessages()
                updateStateToKeyguard()

                // Transition to dreaming
                var transitionSteps =
                    listOf(
                        lockscreenToDreamTransitionStep(0.0f, STARTED),
                        lockscreenToDreamTransitionStep(.1f),
                    )
                kosmos.fakeKeyguardTransitionRepository.sendTransitionSteps(
                    transitionSteps,
                    testScope,
                )

                val explicitAlphaByDream = keyguardStatusBarView.alpha
                assertThat(keyguardStatusBarView.visibility).isEqualTo(View.VISIBLE)

                // Transition is interrupted and goes to AOD
                controller.setDozing(true)
                transitionSteps =
                    listOf(
                        lockscreenToDreamTransitionStep(.1f, CANCELED),
                        dreamToAodTransitionStep(0.1f, STARTED),
                        dreamToAodTransitionStep(.5f),
                        dreamToAodTransitionStep(1f, FINISHED),
                    )
                kosmos.fakeKeyguardTransitionRepository.sendTransitionSteps(
                    transitionSteps,
                    testScope,
                )

                assertThat(keyguardStatusBarView.alpha).isNotEqualTo(explicitAlphaByDream)
                assertThat(keyguardStatusBarView.visibility).isEqualTo(View.INVISIBLE)
            } finally {
                ViewUtils.detachView(keyguardStatusBarView)
            }
        }

    /**
     * Calls [com.android.keyguard.KeyguardUpdateMonitorCallback.onFinishedGoingToSleep] to ensure
     * values are updated properly.
@@ -996,4 +1176,49 @@ class KeyguardStatusBarViewControllerTest : SysuiTestCase() {
            this.mShouldHeadsUpBeVisible = shouldHeadsUpBeVisible
        }
    }

    private fun lockscreenToDreamTransitionStep(
        value: Float,
        transitionState: TransitionState = RUNNING,
    ) =
        TransitionStep(
            from = KeyguardState.LOCKSCREEN,
            to = KeyguardState.DREAMING,
            value = value,
            transitionState = transitionState,
            ownerName = "KeyguardStatusBarViewControllerTest",
        )

    private fun dreamToLockscreenTransitionStep(
        value: Float,
        transitionState: TransitionState = RUNNING,
    ) =
        TransitionStep(
            from = KeyguardState.DREAMING,
            to = KeyguardState.LOCKSCREEN,
            value = value,
            transitionState = transitionState,
            ownerName = "KeyguardStatusBarViewControllerTest",
        )

    private fun goneToDreamTransitionStep(
        value: Float,
        transitionState: TransitionState = RUNNING,
    ) =
        TransitionStep(
            from = KeyguardState.GONE,
            to = KeyguardState.DREAMING,
            value = value,
            transitionState = transitionState,
            ownerName = "KeyguardStatusBarViewControllerTest",
        )

    private fun dreamToAodTransitionStep(value: Float, transitionState: TransitionState = RUNNING) =
        TransitionStep(
            from = KeyguardState.DREAMING,
            to = KeyguardState.AOD,
            value = value,
            transitionState = transitionState,
            ownerName = "KeyguardStatusBarViewControllerTest",
        )
}
+15 −0
Original line number Diff line number Diff line
@@ -31,6 +31,8 @@ import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.ui.viewmodel.DreamingToGlanceableHubTransitionViewModel
import com.android.systemui.keyguard.ui.viewmodel.DreamingToLockscreenTransitionViewModel
import com.android.systemui.keyguard.ui.viewmodel.GlanceableHubToDreamingTransitionViewModel
import com.android.systemui.keyguard.ui.viewmodel.GoneToDreamingTransitionViewModel
import com.android.systemui.keyguard.ui.viewmodel.LockscreenToDreamingTransitionViewModel
import com.android.systemui.res.R
import com.android.systemui.settings.UserTracker
import com.android.systemui.util.kotlin.BooleanFlowOperators.anyOf
@@ -51,6 +53,8 @@ constructor(
    keyguardTransitionInteractor: KeyguardTransitionInteractor,
    fromGlanceableHubTransitionViewModel: GlanceableHubToDreamingTransitionViewModel,
    toGlanceableHubTransitionViewModel: DreamingToGlanceableHubTransitionViewModel,
    fromLockscreenTransitionViewModel: LockscreenToDreamingTransitionViewModel,
    fromGoneTransitionViewModel: GoneToDreamingTransitionViewModel,
    private val toLockscreenTransitionViewModel: DreamingToLockscreenTransitionViewModel,
    private val fromDreamingTransitionInteractor: FromDreamingTransitionInteractor,
    private val communalInteractor: CommunalInteractor,
@@ -117,4 +121,15 @@ constructor(
                keyguardTransitionInteractor.isInTransition(Edge.create(from = DREAMING)),
            )
            .distinctUntilChanged()

    val statusBarAlpha: Flow<Float> =
        merge(
                toLockscreenTransitionViewModel.statusBarAlpha,
                fromLockscreenTransitionViewModel.statusBarAlpha,
                fromGoneTransitionViewModel.statusBarAlpha,
                // Reset explicit alpha once dream-exit transition ended
                transitionEnded.map { -1f },
            )
            .distinctUntilChanged()
            .dumpWhileCollecting("statusBarAlphaByDream")
}
+4 −7
Original line number Diff line number Diff line
@@ -35,9 +35,7 @@ import kotlinx.coroutines.flow.Flow
@SysUISingleton
class DreamingToLockscreenTransitionViewModel
@Inject
constructor(
    animationFlow: KeyguardTransitionAnimationFlow,
) : DeviceEntryIconTransition {
constructor(animationFlow: KeyguardTransitionAnimationFlow) : DeviceEntryIconTransition {

    private val transitionAnimation =
        animationFlow.setup(
@@ -56,10 +54,7 @@ constructor(

    /** Dream overlay views alpha - fade out */
    val dreamOverlayAlpha: Flow<Float> =
        transitionAnimation.sharedFlow(
            duration = 250.milliseconds,
            onStep = { 1f - it },
        )
        transitionAnimation.sharedFlow(duration = 250.milliseconds, onStep = { 1f - it })

    /** Lockscreen views y-translation */
    fun lockscreenTranslationY(translatePx: Int): Flow<Float> {
@@ -97,4 +92,6 @@ constructor(
            onCancel = { 1f },
            onStep = { it },
        )

    val statusBarAlpha: Flow<Float> = lockscreenAlpha
}
+2 −0
Original line number Diff line number Diff line
@@ -72,4 +72,6 @@ constructor(
            name = "GONE->DREAMING: lockscreenAlpha",
        )
    }

    val statusBarAlpha: Flow<Float> = transitionAnimation.immediatelyTransitionTo(0f)
}
+2 −0
Original line number Diff line number Diff line
@@ -96,6 +96,8 @@ constructor(animationFlow: KeyguardTransitionAnimationFlow) : DeviceEntryIconTra
            )
            .map { ScrimAlpha(behindAlpha = it) }

    val statusBarAlpha: Flow<Float> = lockscreenAlpha

    companion object {
        @JvmField val DREAMING_ANIMATION_DURATION_MS = TO_DREAMING_DURATION.inWholeMilliseconds
    }
Loading