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

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

Fix lock screen flash when transitioning from hub to edit mode

Keyguard is hidden when the alternate bouncer is showing over the hub,
adjust the start value of the transition accordingly.

Bug: 325108777
Test: atest AlternateBouncerToGoneTransitionViewModelTest (WIP)
Flag: ACONFIG com.android.systemui.communal_hub TEAMFOOD
Change-Id: I60c41b175af5c3c69f620457f6c9d1daa349dd44
parent 253a041a
Loading
Loading
Loading
Loading
+58 −3
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.systemui.keyguard.ui.viewmodel
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.coroutines.collectValues
import com.android.systemui.flags.Flags
import com.android.systemui.flags.fakeFeatureFlagsClassic
@@ -32,6 +33,7 @@ import com.android.systemui.kosmos.testScope
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Test
import org.junit.runner.RunWith
@@ -49,9 +51,7 @@ class AlternateBouncerToGoneTransitionViewModelTest : SysuiTestCase() {
        }
    private val testScope = kosmos.testScope
    private val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
    private val underTest by lazy {
        kosmos.alternateBouncerToGoneTransitionViewModel
    }
    private val underTest by lazy { kosmos.alternateBouncerToGoneTransitionViewModel }

    @Test
    fun deviceEntryParentViewDisappear() =
@@ -73,6 +73,61 @@ class AlternateBouncerToGoneTransitionViewModelTest : SysuiTestCase() {
            values.forEach { assertThat(it).isEqualTo(0f) }
        }

    @Test
    fun lockscreenAlpha() =
        testScope.runTest {
            val startAlpha = 0.6f
            val viewState = ViewStateAccessor(alpha = { startAlpha })
            val alpha by collectLastValue(underTest.lockscreenAlpha(viewState))
            runCurrent()

            keyguardTransitionRepository.sendTransitionSteps(
                listOf(
                    step(0f, TransitionState.STARTED),
                    step(0.25f),
                    step(0.5f),
                    step(0.75f),
                    step(1f),
                ),
                testScope,
            )

            // Alpha starts at the starting value from ViewStateAccessor.
            keyguardTransitionRepository.sendTransitionStep(
                step(0f, state = TransitionState.STARTED)
            )
            runCurrent()
            assertThat(alpha).isEqualTo(startAlpha)

            // Alpha finishes in 200ms out of 500ms, check the alpha at the halfway point.
            val progress = 0.2f
            keyguardTransitionRepository.sendTransitionStep(step(progress))
            runCurrent()
            assertThat(alpha).isEqualTo(0.3f)

            // Alpha ends at 0.
            keyguardTransitionRepository.sendTransitionStep(step(1f))
            runCurrent()
            assertThat(alpha).isEqualTo(0f)
        }

    @Test
    fun lockscreenAlpha_zeroInitialAlpha() =
        testScope.runTest {
            // ViewState starts at 0 alpha.
            val viewState = ViewStateAccessor(alpha = { 0f })
            val alpha by collectValues(underTest.lockscreenAlpha(viewState))

            keyguardTransitionRepository.sendTransitionSteps(
                from = KeyguardState.ALTERNATE_BOUNCER,
                to = GONE,
                testScope
            )

            // Alpha starts and ends at 0.
            alpha.forEach { assertThat(it).isEqualTo(0f) }
        }

    private fun step(value: Float, state: TransitionState = RUNNING): TransitionStep {
        return TransitionStep(
            from = KeyguardState.ALTERNATE_BOUNCER,
+8 −4
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.keyguard.ui.viewmodel

import android.util.MathUtils
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.domain.interactor.FromAlternateBouncerTransitionInteractor.Companion.TO_GONE_DURATION
import com.android.systemui.keyguard.shared.model.KeyguardState
@@ -47,13 +48,16 @@ constructor(
            to = KeyguardState.GONE,
        )

    val lockscreenAlpha: Flow<Float> =
        transitionAnimation.sharedFlow(
    fun lockscreenAlpha(viewState: ViewStateAccessor): Flow<Float> {
        var startAlpha = 1f
        return transitionAnimation.sharedFlow(
            duration = 200.milliseconds,
            onStep = { 1 - it },
            onStart = { startAlpha = viewState.alpha() },
            onStep = { MathUtils.lerp(startAlpha, 0f, it) },
            onFinish = { 0f },
            onCancel = { 1f },
            onCancel = { startAlpha },
        )
    }

    /** Scrim alpha values */
    val scrimAlpha: Flow<ScrimAlpha> =
+2 −6
Original line number Diff line number Diff line
@@ -178,7 +178,7 @@ constructor(
                merge(
                        alphaOnShadeExpansion,
                        keyguardInteractor.dismissAlpha.filterNotNull(),
                        alternateBouncerToGoneTransitionViewModel.lockscreenAlpha,
                        alternateBouncerToGoneTransitionViewModel.lockscreenAlpha(viewState),
                        aodToGoneTransitionViewModel.lockscreenAlpha(viewState),
                        aodToLockscreenTransitionViewModel.lockscreenAlpha(viewState),
                        aodToOccludedTransitionViewModel.lockscreenAlpha(viewState),
@@ -235,11 +235,7 @@ constructor(
        burnInJob?.cancel()

        burnInJob =
            scope.launch {
                aodBurnInViewModel.movement(params).collect {
                    burnInModel.value = it
                }
            }
            scope.launch { aodBurnInViewModel.movement(params).collect { burnInModel.value = it } }
    }

    val scale: Flow<BurnInScaleViewModel> =
+1 −1
Original line number Diff line number Diff line
@@ -377,7 +377,7 @@ constructor(
        // All transition view models are mututally exclusive, and safe to merge
        val alphaTransitions =
            merge(
                alternateBouncerToGoneTransitionViewModel.lockscreenAlpha,
                alternateBouncerToGoneTransitionViewModel.lockscreenAlpha(viewState),
                aodToLockscreenTransitionViewModel.notificationAlpha,
                aodToOccludedTransitionViewModel.lockscreenAlpha(viewState),
                dozingToLockscreenTransitionViewModel.lockscreenAlpha,