Loading packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractor.kt +19 −0 Original line number Original line Diff line number Diff line Loading @@ -28,6 +28,7 @@ import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepositor import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.TransitionModeOnCanceled import com.android.systemui.keyguard.shared.model.TransitionModeOnCanceled import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.util.kotlin.Utils.Companion.sample as sampleMultiple import com.android.systemui.util.kotlin.sample import com.android.systemui.util.kotlin.sample import javax.inject.Inject import javax.inject.Inject import kotlin.time.Duration.Companion.milliseconds import kotlin.time.Duration.Companion.milliseconds Loading Loading @@ -64,6 +65,7 @@ constructor( listenForHubToAlternateBouncer() listenForHubToAlternateBouncer() listenForHubToOccluded() listenForHubToOccluded() listenForHubToGone() listenForHubToGone() listenForHubToDreaming() } } override fun getDefaultAnimatorForTransitionsToState(toState: KeyguardState): ValueAnimator { override fun getDefaultAnimatorForTransitionsToState(toState: KeyguardState): ValueAnimator { Loading Loading @@ -131,6 +133,23 @@ constructor( } } } } private fun listenForHubToDreaming() { val invalidFromStates = setOf(KeyguardState.AOD, KeyguardState.DOZING) scope.launch("$TAG#listenForHubToDreaming") { keyguardInteractor.isAbleToDream .sampleMultiple(startedKeyguardTransitionStep, finishedKeyguardState) .collect { (isAbleToDream, lastStartedTransition, finishedKeyguardState) -> val isOnHub = finishedKeyguardState == KeyguardState.GLANCEABLE_HUB val isTransitionInterruptible = lastStartedTransition.to == KeyguardState.GLANCEABLE_HUB && !invalidFromStates.contains(lastStartedTransition.from) if (isAbleToDream && (isOnHub || isTransitionInterruptible)) { startTransitionTo(KeyguardState.DREAMING) } } } } private fun listenForHubToOccluded() { private fun listenForHubToOccluded() { scope.launch { scope.launch { keyguardInteractor.isKeyguardOccluded.sample(startedKeyguardState, ::Pair).collect { keyguardInteractor.isKeyguardOccluded.sample(startedKeyguardState, ::Pair).collect { Loading packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt +31 −0 Original line number Original line Diff line number Diff line Loading @@ -1895,6 +1895,37 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { coroutineContext.cancelChildren() coroutineContext.cancelChildren() } } @Test fun glanceableHubToDreaming() = testScope.runTest { // GIVEN a device that is not dreaming or dozing keyguardRepository.setDreamingWithOverlay(false) keyguardRepository.setDozeTransitionModel( DozeTransitionModel(from = DozeStateModel.DOZE, to = DozeStateModel.FINISH) ) runCurrent() // GIVEN a prior transition has run to GLANCEABLE_HUB runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.GLANCEABLE_HUB) // WHEN the device begins to dream keyguardRepository.setDreamingWithOverlay(true) advanceUntilIdle() val info = withArgCaptor<TransitionInfo> { verify(transitionRepository).startTransition(capture()) } // THEN a transition to DREAMING should occur assertThat(info.ownerName) .isEqualTo(FromGlanceableHubTransitionInteractor::class.simpleName) assertThat(info.from).isEqualTo(KeyguardState.GLANCEABLE_HUB) assertThat(info.to).isEqualTo(KeyguardState.DREAMING) assertThat(info.animator).isNotNull() coroutineContext.cancelChildren() } private fun createKeyguardInteractor(): KeyguardInteractor { private fun createKeyguardInteractor(): KeyguardInteractor { return KeyguardInteractorFactory.create( return KeyguardInteractorFactory.create( featureFlags = featureFlags, featureFlags = featureFlags, Loading Loading
packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractor.kt +19 −0 Original line number Original line Diff line number Diff line Loading @@ -28,6 +28,7 @@ import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepositor import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.TransitionModeOnCanceled import com.android.systemui.keyguard.shared.model.TransitionModeOnCanceled import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.util.kotlin.Utils.Companion.sample as sampleMultiple import com.android.systemui.util.kotlin.sample import com.android.systemui.util.kotlin.sample import javax.inject.Inject import javax.inject.Inject import kotlin.time.Duration.Companion.milliseconds import kotlin.time.Duration.Companion.milliseconds Loading Loading @@ -64,6 +65,7 @@ constructor( listenForHubToAlternateBouncer() listenForHubToAlternateBouncer() listenForHubToOccluded() listenForHubToOccluded() listenForHubToGone() listenForHubToGone() listenForHubToDreaming() } } override fun getDefaultAnimatorForTransitionsToState(toState: KeyguardState): ValueAnimator { override fun getDefaultAnimatorForTransitionsToState(toState: KeyguardState): ValueAnimator { Loading Loading @@ -131,6 +133,23 @@ constructor( } } } } private fun listenForHubToDreaming() { val invalidFromStates = setOf(KeyguardState.AOD, KeyguardState.DOZING) scope.launch("$TAG#listenForHubToDreaming") { keyguardInteractor.isAbleToDream .sampleMultiple(startedKeyguardTransitionStep, finishedKeyguardState) .collect { (isAbleToDream, lastStartedTransition, finishedKeyguardState) -> val isOnHub = finishedKeyguardState == KeyguardState.GLANCEABLE_HUB val isTransitionInterruptible = lastStartedTransition.to == KeyguardState.GLANCEABLE_HUB && !invalidFromStates.contains(lastStartedTransition.from) if (isAbleToDream && (isOnHub || isTransitionInterruptible)) { startTransitionTo(KeyguardState.DREAMING) } } } } private fun listenForHubToOccluded() { private fun listenForHubToOccluded() { scope.launch { scope.launch { keyguardInteractor.isKeyguardOccluded.sample(startedKeyguardState, ::Pair).collect { keyguardInteractor.isKeyguardOccluded.sample(startedKeyguardState, ::Pair).collect { Loading
packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt +31 −0 Original line number Original line Diff line number Diff line Loading @@ -1895,6 +1895,37 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { coroutineContext.cancelChildren() coroutineContext.cancelChildren() } } @Test fun glanceableHubToDreaming() = testScope.runTest { // GIVEN a device that is not dreaming or dozing keyguardRepository.setDreamingWithOverlay(false) keyguardRepository.setDozeTransitionModel( DozeTransitionModel(from = DozeStateModel.DOZE, to = DozeStateModel.FINISH) ) runCurrent() // GIVEN a prior transition has run to GLANCEABLE_HUB runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.GLANCEABLE_HUB) // WHEN the device begins to dream keyguardRepository.setDreamingWithOverlay(true) advanceUntilIdle() val info = withArgCaptor<TransitionInfo> { verify(transitionRepository).startTransition(capture()) } // THEN a transition to DREAMING should occur assertThat(info.ownerName) .isEqualTo(FromGlanceableHubTransitionInteractor::class.simpleName) assertThat(info.from).isEqualTo(KeyguardState.GLANCEABLE_HUB) assertThat(info.to).isEqualTo(KeyguardState.DREAMING) assertThat(info.animator).isNotNull() coroutineContext.cancelChildren() } private fun createKeyguardInteractor(): KeyguardInteractor { private fun createKeyguardInteractor(): KeyguardInteractor { return KeyguardInteractorFactory.create( return KeyguardInteractorFactory.create( featureFlags = featureFlags, featureFlags = featureFlags, Loading