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

Commit 571dedfd authored by Matt Pietal's avatar Matt Pietal
Browse files

Simplify and consolidate dismissAlpha

This fixes alpha whencanceling a swipe to unlock action; the user
drags up to dismiss but then drags back down to go back to the
lockscreen. Move all logic to the KeyguardInteractor, and simplify
SharedNotificationContainerViewModel alpha.

Test: atest KeyguardInteractorTest
Fixes: 345738121
Flag: com.android.systemui.migrate_clocks_to_blueprint
Change-Id: I65ebee06349c302233928fc6564085787378adcc
parent 0c1aab59
Loading
Loading
Loading
Loading
+49 −9
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import com.android.systemui.SysuiTestCase
import com.android.systemui.bouncer.data.repository.keyguardBouncerRepository
import com.android.systemui.common.ui.data.repository.fakeConfigurationRepository
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.coroutines.collectValues
import com.android.systemui.flags.EnableSceneContainer
import com.android.systemui.keyguard.data.repository.fakeCommandQueue
import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
@@ -191,6 +192,7 @@ class KeyguardInteractorTest : SysuiTestCase() {
    fun dismissAlpha() =
        testScope.runTest {
            val dismissAlpha by collectLastValue(underTest.dismissAlpha)
            assertThat(dismissAlpha).isEqualTo(1f)

            keyguardTransitionRepository.sendTransitionSteps(
                from = KeyguardState.AOD,
@@ -202,9 +204,9 @@ class KeyguardInteractorTest : SysuiTestCase() {
            // User begins to swipe up
            shadeRepository.setLegacyShadeExpansion(0.99f)

            // When not dismissable, no alpha value (null) should emit
            // When not dismissable, the last alpha value should still be present
            repository.setKeyguardDismissible(false)
            assertThat(dismissAlpha).isNull()
            assertThat(dismissAlpha).isEqualTo(1f)

            repository.setKeyguardDismissible(true)
            shadeRepository.setLegacyShadeExpansion(0.98f)
@@ -212,9 +214,11 @@ class KeyguardInteractorTest : SysuiTestCase() {
        }

    @Test
    fun dismissAlpha_whenShadeIsExpandedEmitsNull() =
    fun dismissAlpha_whenShadeResetsEmitsOne() =
        testScope.runTest {
            val dismissAlpha by collectLastValue(underTest.dismissAlpha)
            val dismissAlpha by collectValues(underTest.dismissAlpha)
            assertThat(dismissAlpha[0]).isEqualTo(1f)
            assertThat(dismissAlpha.size).isEqualTo(1)

            keyguardTransitionRepository.sendTransitionSteps(
                from = KeyguardState.AOD,
@@ -222,14 +226,50 @@ class KeyguardInteractorTest : SysuiTestCase() {
                testScope,
            )

            repository.setStatusBarState(StatusBarState.SHADE_LOCKED)
            shadeRepository.setQsExpansion(1f)
            // User begins to swipe up
            repository.setStatusBarState(StatusBarState.KEYGUARD)
            repository.setKeyguardDismissible(true)
            shadeRepository.setLegacyShadeExpansion(0.98f)

            repository.setKeyguardDismissible(false)
            assertThat(dismissAlpha).isNull()
            assertThat(dismissAlpha[1]).isGreaterThan(0.5f)
            assertThat(dismissAlpha[1]).isLessThan(1f)
            assertThat(dismissAlpha.size).isEqualTo(2)

            // Now reset the shade
            shadeRepository.setLegacyShadeExpansion(1f)
            assertThat(dismissAlpha[2]).isEqualTo(1f)
            assertThat(dismissAlpha.size).isEqualTo(3)
        }

    @Test
    fun dismissAlpha_doesNotEmitWhileTransitioning() =
        testScope.runTest {
            val dismissAlpha by collectLastValue(underTest.dismissAlpha)
            assertThat(dismissAlpha).isEqualTo(1f)

            keyguardTransitionRepository.sendTransitionSteps(
                listOf(
                    TransitionStep(
                        from = KeyguardState.AOD,
                        to = KeyguardState.GONE,
                        value = 0f,
                        transitionState = TransitionState.STARTED,
                    ),
                    TransitionStep(
                        from = KeyguardState.AOD,
                        to = KeyguardState.GONE,
                        value = 0.1f,
                        transitionState = TransitionState.RUNNING,
                    ),
                ),
                testScope,
            )

            repository.setKeyguardDismissible(true)
            assertThat(dismissAlpha).isNull()
            shadeRepository.setLegacyShadeExpansion(0.98f)

            // Should still be one
            assertThat(dismissAlpha).isEqualTo(1f)
        }

    @Test
+19 −11
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ import com.android.systemui.shade.data.repository.ShadeRepository
import com.android.systemui.statusbar.CommandQueue
import com.android.systemui.statusbar.notification.NotificationUtils.interpolate
import com.android.systemui.statusbar.notification.stack.domain.interactor.SharedNotificationContainerInteractor
import com.android.systemui.util.kotlin.Utils.Companion.sample as sampleCombine
import com.android.systemui.util.kotlin.Utils.Companion.sampleFilter
import com.android.systemui.util.kotlin.pairwise
import com.android.systemui.util.kotlin.sample
@@ -77,7 +78,7 @@ import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.merge
import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.flow.stateIn
import com.android.systemui.util.kotlin.Utils.Companion.sample as sampleCombine
import kotlinx.coroutines.flow.transform

/**
 * Encapsulates business-logic related to the keyguard but not to a more specific part within it.
@@ -327,28 +328,35 @@ constructor(
     * This uses legacyShadeExpansion to process swipe up events. In the future, the touch input
     * signal should be sent directly to transitions.
     */
    val dismissAlpha: Flow<Float?> =
    val dismissAlpha: Flow<Float> =
        shadeRepository.legacyShadeExpansion
            .filter { it < 1f }
            .sampleCombine(
                statusBarState,
                keyguardTransitionInteractor.currentKeyguardState,
                keyguardTransitionInteractor.transitionState,
                isKeyguardDismissible,
            )
            .map {
                (legacyShadeExpansion, statusBarState, currentKeyguardState, isKeyguardDismissible)
                ->
            .filter { (_, _, _, step, _) -> !step.transitionState.isTransitioning() }
            .transform {
                (
                    legacyShadeExpansion,
                    statusBarState,
                    currentKeyguardState,
                    step,
                    isKeyguardDismissible) ->
                if (
                    statusBarState == StatusBarState.KEYGUARD &&
                        isKeyguardDismissible &&
                        currentKeyguardState == LOCKSCREEN
                        currentKeyguardState == LOCKSCREEN &&
                        legacyShadeExpansion != 1f
                ) {
                    MathUtils.constrainedMap(0f, 1f, 0.95f, 1f, legacyShadeExpansion)
                } else {
                    null
                    emit(MathUtils.constrainedMap(0f, 1f, 0.95f, 1f, legacyShadeExpansion))
                } else if (legacyShadeExpansion == 0f || legacyShadeExpansion == 1f) {
                    // Resets alpha state
                    emit(1f)
                }
            }
            .onStart { emit(null) }
            .onStart { emit(1f) }
            .distinctUntilChanged()

    val keyguardTranslationY: Flow<Float> =
+1 −2
Original line number Diff line number Diff line
@@ -66,7 +66,6 @@ import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.combineTransform
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.merge
import kotlinx.coroutines.flow.onStart
@@ -236,7 +235,7 @@ constructor(
                // value emitted by any of them. Do not add flows that cannot make this guarantee.
                merge(
                        alphaOnShadeExpansion,
                        keyguardInteractor.dismissAlpha.filterNotNull(),
                        keyguardInteractor.dismissAlpha,
                        alternateBouncerToGoneTransitionViewModel.lockscreenAlpha(viewState),
                        aodToGoneTransitionViewModel.lockscreenAlpha(viewState),
                        aodToLockscreenTransitionViewModel.lockscreenAlpha(viewState),
+8 −14
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ import com.android.systemui.keyguard.ui.viewmodel.GlanceableHubToLockscreenTrans
import com.android.systemui.keyguard.ui.viewmodel.GoneToAodTransitionViewModel
import com.android.systemui.keyguard.ui.viewmodel.GoneToDozingTransitionViewModel
import com.android.systemui.keyguard.ui.viewmodel.GoneToDreamingTransitionViewModel
import com.android.systemui.keyguard.ui.viewmodel.GoneToLockscreenTransitionViewModel
import com.android.systemui.keyguard.ui.viewmodel.LockscreenToDreamingTransitionViewModel
import com.android.systemui.keyguard.ui.viewmodel.LockscreenToGlanceableHubTransitionViewModel
import com.android.systemui.keyguard.ui.viewmodel.LockscreenToGoneTransitionViewModel
@@ -120,6 +121,7 @@ constructor(
    private val goneToAodTransitionViewModel: GoneToAodTransitionViewModel,
    private val goneToDozingTransitionViewModel: GoneToDozingTransitionViewModel,
    private val goneToDreamingTransitionViewModel: GoneToDreamingTransitionViewModel,
    private val goneToLockscreenTransitionViewModel: GoneToLockscreenTransitionViewModel,
    private val lockscreenToDreamingTransitionViewModel: LockscreenToDreamingTransitionViewModel,
    private val lockscreenToGlanceableHubTransitionViewModel:
        LockscreenToGlanceableHubTransitionViewModel,
@@ -472,6 +474,9 @@ constructor(
        // All transition view models are mututally exclusive, and safe to merge
        val alphaTransitions =
            merge(
                keyguardInteractor.dismissAlpha.dumpWhileCollecting(
                    "keyguardInteractor.dismissAlpha"
                ),
                alternateBouncerToGoneTransitionViewModel.notificationAlpha(viewState),
                aodToGoneTransitionViewModel.notificationAlpha(viewState),
                aodToLockscreenTransitionViewModel.notificationAlpha,
@@ -482,6 +487,7 @@ constructor(
                goneToAodTransitionViewModel.notificationAlpha,
                goneToDreamingTransitionViewModel.lockscreenAlpha,
                goneToDozingTransitionViewModel.lockscreenAlpha,
                goneToLockscreenTransitionViewModel.lockscreenAlpha,
                lockscreenToDreamingTransitionViewModel.lockscreenAlpha,
                lockscreenToGoneTransitionViewModel.notificationAlpha(viewState),
                lockscreenToOccludedTransitionViewModel.lockscreenAlpha,
@@ -498,24 +504,12 @@ constructor(
                // These remaining cases handle alpha changes within an existing state, such as
                // shade expansion or swipe to dismiss
                combineTransform(
                    isOnLockscreenWithoutShade,
                    isTransitioningToHiddenKeyguard,
                    shadeCollapseFadeIn,
                    alphaForShadeAndQsExpansion,
                    keyguardInteractor.dismissAlpha.dumpWhileCollecting(
                        "keyguardInteractor.keyguardAlpha"
                    ),
                ) {
                    isOnLockscreenWithoutShade,
                    isTransitioningToHiddenKeyguard,
                    shadeCollapseFadeIn,
                    alphaForShadeAndQsExpansion,
                    dismissAlpha ->
                    if (isOnLockscreenWithoutShade) {
                        if (!shadeCollapseFadeIn && dismissAlpha != null) {
                            emit(dismissAlpha)
                        }
                    } else if (!isTransitioningToHiddenKeyguard) {
                    alphaForShadeAndQsExpansion ->
                    if (!isTransitioningToHiddenKeyguard) {
                        emit(alphaForShadeAndQsExpansion)
                    }
                },
+4 −0
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import com.android.systemui.flags.FakeFeatureFlags
import com.android.systemui.keyguard.data.repository.FakeCommandQueue
import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.TransitionStep
import com.android.systemui.power.domain.interactor.PowerInteractor
import com.android.systemui.power.domain.interactor.PowerInteractorFactory
import com.android.systemui.scene.domain.interactor.SceneInteractor
@@ -34,6 +35,7 @@ import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.whenever
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.test.TestScope

/**
@@ -60,9 +62,11 @@ object KeyguardInteractorFactory {
    ): WithDependencies {
        // Mock these until they are replaced by kosmos
        val currentKeyguardStateFlow = MutableSharedFlow<KeyguardState>()
        val transitionStateFlow = MutableStateFlow(TransitionStep())
        val keyguardTransitionInteractor =
            mock<KeyguardTransitionInteractor>().also {
                whenever(it.currentKeyguardState).thenReturn(currentKeyguardStateFlow)
                whenever(it.transitionState).thenReturn(transitionStateFlow)
            }
        val configurationDimensionFlow = MutableSharedFlow<ConfigurationBasedDimensions>()
        configurationDimensionFlow.tryEmit(
Loading