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

Commit 95d0bed6 authored by Coco Duan's avatar Coco Duan Committed by Android (Google) Code Review
Browse files

Merge "Fix keyguard status bar showing upon entering dream" into main

parents 666554d8 50a29906
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