diff options
2 files changed, 133 insertions, 3 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt index 2dc8fee25379..1fafd7f0a700 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt @@ -45,6 +45,7 @@ constructor(      override fun start() {          listenForOccludedToLockscreen() +        listenForOccludedToGone()          listenForOccludedToDreaming()          listenForOccludedToAodOrDozing()      } @@ -72,11 +73,22 @@ constructor(      private fun listenForOccludedToLockscreen() {          scope.launch {              keyguardInteractor.isKeyguardOccluded -                .sample(keyguardTransitionInteractor.startedKeyguardTransitionStep, ::Pair) -                .collect { (isOccluded, lastStartedKeyguardState) -> +                .sample( +                    combine( +                        keyguardInteractor.isKeyguardShowing, +                        keyguardTransitionInteractor.startedKeyguardTransitionStep, +                        ::Pair +                    ), +                    ::toTriple +                ) +                .collect { (isOccluded, isShowing, lastStartedKeyguardState) ->                      // Occlusion signals come from the framework, and should interrupt any                      // existing transition -                    if (!isOccluded && lastStartedKeyguardState.to == KeyguardState.OCCLUDED) { +                    if ( +                        !isOccluded && +                            isShowing && +                            lastStartedKeyguardState.to == KeyguardState.OCCLUDED +                    ) {                          keyguardTransitionRepository.startTransition(                              TransitionInfo(                                  name, @@ -90,6 +102,38 @@ constructor(          }      } +    private fun listenForOccludedToGone() { +        scope.launch { +            keyguardInteractor.isKeyguardOccluded +                .sample( +                    combine( +                        keyguardInteractor.isKeyguardShowing, +                        keyguardTransitionInteractor.startedKeyguardTransitionStep, +                        ::Pair +                    ), +                    ::toTriple +                ) +                .collect { (isOccluded, isShowing, lastStartedKeyguardState) -> +                    // Occlusion signals come from the framework, and should interrupt any +                    // existing transition +                    if ( +                        !isOccluded && +                            !isShowing && +                            lastStartedKeyguardState.to == KeyguardState.OCCLUDED +                    ) { +                        keyguardTransitionRepository.startTransition( +                            TransitionInfo( +                                name, +                                KeyguardState.OCCLUDED, +                                KeyguardState.GONE, +                                getAnimator(), +                            ) +                        ) +                    } +                } +        } +    } +      private fun listenForOccludedToAodOrDozing() {          scope.launch {              keyguardInteractor.wakefulnessModel diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt index fe9098fa5c25..2209852df0c0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt @@ -358,6 +358,92 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() {          }      @Test +    fun `OCCLUDED to GONE`() = +        testScope.runTest { +            // GIVEN a device on lockscreen +            keyguardRepository.setKeyguardShowing(true) +            runCurrent() + +            // GIVEN a prior transition has run to OCCLUDED +            runner.startTransition( +                testScope, +                TransitionInfo( +                    ownerName = "", +                    from = KeyguardState.LOCKSCREEN, +                    to = KeyguardState.OCCLUDED, +                    animator = +                        ValueAnimator().apply { +                            duration = 10 +                            interpolator = Interpolators.LINEAR +                        }, +                ) +            ) +            keyguardRepository.setKeyguardOccluded(true) +            runCurrent() +            reset(mockTransitionRepository) + +            // WHEN keyguard goes away +            keyguardRepository.setKeyguardShowing(false) +            // AND occlusion ends +            keyguardRepository.setKeyguardOccluded(false) +            runCurrent() + +            val info = +                withArgCaptor<TransitionInfo> { +                    verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) +                } +            // THEN a transition to GONE should occur +            assertThat(info.ownerName).isEqualTo("FromOccludedTransitionInteractor") +            assertThat(info.from).isEqualTo(KeyguardState.OCCLUDED) +            assertThat(info.to).isEqualTo(KeyguardState.GONE) +            assertThat(info.animator).isNotNull() + +            coroutineContext.cancelChildren() +        } + +    @Test +    fun `OCCLUDED to LOCKSCREEN`() = +        testScope.runTest { +            // GIVEN a device on lockscreen +            keyguardRepository.setKeyguardShowing(true) +            runCurrent() + +            // GIVEN a prior transition has run to OCCLUDED +            runner.startTransition( +                testScope, +                TransitionInfo( +                    ownerName = "", +                    from = KeyguardState.LOCKSCREEN, +                    to = KeyguardState.OCCLUDED, +                    animator = +                        ValueAnimator().apply { +                            duration = 10 +                            interpolator = Interpolators.LINEAR +                        }, +                ) +            ) +            keyguardRepository.setKeyguardOccluded(true) +            runCurrent() +            reset(mockTransitionRepository) + +            // WHEN occlusion ends +            keyguardRepository.setKeyguardOccluded(false) +            runCurrent() + +            val info = +                withArgCaptor<TransitionInfo> { +                    verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) +                } +            // THEN a transition to LOCKSCREEN should occur +            assertThat(info.ownerName).isEqualTo("FromOccludedTransitionInteractor") +            assertThat(info.from).isEqualTo(KeyguardState.OCCLUDED) +            assertThat(info.to).isEqualTo(KeyguardState.LOCKSCREEN) +            assertThat(info.animator).isNotNull() + +            coroutineContext.cancelChildren() +        } + +    @Test      fun `LOCKSCREEN to DOZING`() =          testScope.runTest {              // GIVEN a device with AOD not available  |