From 9c9d951846e0ca8c6596d03c1aab87c51a2d49f4 Mon Sep 17 00:00:00 2001 From: Josh Tsuji Date: Wed, 21 Jun 2023 16:19:52 -0400 Subject: [PATCH] Move common From*TransitionInteractor logic into the superclass. This also has the benefit of allowing us to force that From transition interactors can only start transitions when we're in, or were animating to, KeyguardState T. Bug: 278086361 Test: atest KeyguardTransitionScenariosTest Change-Id: I6503c51bfa3e55e0c6395f361fcd54fa0c18e2cf --- ...romAlternateBouncerTransitionInteractor.kt | 45 ++--- .../interactor/FromAodTransitionInteractor.kt | 38 ++-- .../FromDozingTransitionInteractor.kt | 39 ++-- .../FromDreamingTransitionInteractor.kt | 61 ++---- .../FromGoneTransitionInteractor.kt | 59 ++---- .../FromLockscreenTransitionInteractor.kt | 126 ++++-------- .../FromOccludedTransitionInteractor.kt | 80 +++----- .../FromPrimaryBouncerTransitionInteractor.kt | 71 +++---- .../KeyguardTransitionInteractor.kt | 2 + .../domain/interactor/TransitionInteractor.kt | 54 ++++- .../KeyguardTransitionScenariosTest.kt | 185 ++++++++---------- 11 files changed, 301 insertions(+), 459 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt index 38eaccee7284a..8f0b91b6d864b 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt @@ -22,7 +22,6 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.KeyguardState -import com.android.systemui.keyguard.shared.model.TransitionInfo import com.android.systemui.keyguard.shared.model.WakefulnessState import com.android.systemui.util.kotlin.Utils.Companion.toQuad import com.android.systemui.util.kotlin.Utils.Companion.toQuint @@ -38,11 +37,14 @@ import kotlinx.coroutines.launch class FromAlternateBouncerTransitionInteractor @Inject constructor( + override val transitionRepository: KeyguardTransitionRepository, + override val transitionInteractor: KeyguardTransitionInteractor, @Application private val scope: CoroutineScope, private val keyguardInteractor: KeyguardInteractor, - private val keyguardTransitionRepository: KeyguardTransitionRepository, - private val keyguardTransitionInteractor: KeyguardTransitionInteractor, -) : TransitionInteractor(FromAlternateBouncerTransitionInteractor::class.simpleName!!) { +) : + TransitionInteractor( + fromState = KeyguardState.ALTERNATE_BOUNCER, + ) { override fun start() { listenForAlternateBouncerToGone() @@ -60,7 +62,7 @@ constructor( .sample( combine( keyguardInteractor.primaryBouncerShowing, - keyguardTransitionInteractor.startedKeyguardTransitionStep, + transitionInteractor.startedKeyguardTransitionStep, keyguardInteractor.wakefulnessModel, keyguardInteractor.isAodAvailable, ::toQuad @@ -92,14 +94,7 @@ constructor( } else { KeyguardState.LOCKSCREEN } - keyguardTransitionRepository.startTransition( - TransitionInfo( - ownerName = name, - from = KeyguardState.ALTERNATE_BOUNCER, - to = to, - animator = getAnimator(), - ) - ) + startTransitionTo(to) } } } @@ -108,17 +103,10 @@ constructor( private fun listenForAlternateBouncerToGone() { scope.launch { keyguardInteractor.isKeyguardGoingAway - .sample(keyguardTransitionInteractor.finishedKeyguardState, ::Pair) + .sample(transitionInteractor.finishedKeyguardState, ::Pair) .collect { (isKeyguardGoingAway, keyguardState) -> if (isKeyguardGoingAway && keyguardState == KeyguardState.ALTERNATE_BOUNCER) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - ownerName = name, - from = KeyguardState.ALTERNATE_BOUNCER, - to = KeyguardState.GONE, - animator = getAnimator(), - ) - ) + startTransitionTo(KeyguardState.GONE) } } } @@ -127,26 +115,19 @@ constructor( private fun listenForAlternateBouncerToPrimaryBouncer() { scope.launch { keyguardInteractor.primaryBouncerShowing - .sample(keyguardTransitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) .collect { (isPrimaryBouncerShowing, startedKeyguardState) -> if ( isPrimaryBouncerShowing && startedKeyguardState.to == KeyguardState.ALTERNATE_BOUNCER ) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - ownerName = name, - from = KeyguardState.ALTERNATE_BOUNCER, - to = KeyguardState.PRIMARY_BOUNCER, - animator = getAnimator(), - ) - ) + startTransitionTo(KeyguardState.PRIMARY_BOUNCER) } } } } - private fun getAnimator(): ValueAnimator { + override fun getDefaultAnimatorForTransitionsToState(toState: KeyguardState): ValueAnimator { return ValueAnimator().apply { interpolator = Interpolators.LINEAR duration = TRANSITION_DURATION_MS diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt index 7e9cbc1a9772f..2085c877064d4 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt @@ -24,7 +24,6 @@ import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepositor import com.android.systemui.keyguard.shared.model.BiometricUnlockModel.Companion.isWakeAndUnlock import com.android.systemui.keyguard.shared.model.DozeStateModel import com.android.systemui.keyguard.shared.model.KeyguardState -import com.android.systemui.keyguard.shared.model.TransitionInfo import com.android.systemui.util.kotlin.sample import javax.inject.Inject import kotlinx.coroutines.CoroutineScope @@ -34,11 +33,14 @@ import kotlinx.coroutines.launch class FromAodTransitionInteractor @Inject constructor( + override val transitionRepository: KeyguardTransitionRepository, + override val transitionInteractor: KeyguardTransitionInteractor, @Application private val scope: CoroutineScope, private val keyguardInteractor: KeyguardInteractor, - private val keyguardTransitionRepository: KeyguardTransitionRepository, - private val keyguardTransitionInteractor: KeyguardTransitionInteractor, -) : TransitionInteractor(FromAodTransitionInteractor::class.simpleName!!) { +) : + TransitionInteractor( + fromState = KeyguardState.AOD, + ) { override fun start() { listenForAodToLockscreen() @@ -49,18 +51,11 @@ constructor( scope.launch { keyguardInteractor .dozeTransitionTo(DozeStateModel.FINISH) - .sample(keyguardTransitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) .collect { pair -> val (dozeToAod, lastStartedStep) = pair if (lastStartedStep.to == KeyguardState.AOD) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.AOD, - KeyguardState.LOCKSCREEN, - getAnimator(), - ) - ) + startTransitionTo(KeyguardState.LOCKSCREEN) } } } @@ -69,29 +64,22 @@ constructor( private fun listenForAodToGone() { scope.launch { keyguardInteractor.biometricUnlockState - .sample(keyguardTransitionInteractor.finishedKeyguardState, ::Pair) + .sample(transitionInteractor.finishedKeyguardState, ::Pair) .collect { pair -> val (biometricUnlockState, keyguardState) = pair if ( keyguardState == KeyguardState.AOD && isWakeAndUnlock(biometricUnlockState) ) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.AOD, - KeyguardState.GONE, - getAnimator(), - ) - ) + startTransitionTo(KeyguardState.GONE) } } } } - private fun getAnimator(): ValueAnimator { + override fun getDefaultAnimatorForTransitionsToState(toState: KeyguardState): ValueAnimator { return ValueAnimator().apply { - setInterpolator(Interpolators.LINEAR) - setDuration(TRANSITION_DURATION_MS) + interpolator = Interpolators.LINEAR + duration = TRANSITION_DURATION_MS } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt index ee2c2df416246..c867c43b1646e 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt @@ -23,10 +23,8 @@ import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.BiometricUnlockModel.Companion.isWakeAndUnlock import com.android.systemui.keyguard.shared.model.KeyguardState -import com.android.systemui.keyguard.shared.model.TransitionInfo import com.android.systemui.util.kotlin.sample import javax.inject.Inject -import kotlin.time.Duration import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @@ -35,11 +33,14 @@ import kotlinx.coroutines.launch class FromDozingTransitionInteractor @Inject constructor( + override val transitionRepository: KeyguardTransitionRepository, + override val transitionInteractor: KeyguardTransitionInteractor, @Application private val scope: CoroutineScope, private val keyguardInteractor: KeyguardInteractor, - private val keyguardTransitionRepository: KeyguardTransitionRepository, - private val keyguardTransitionInteractor: KeyguardTransitionInteractor, -) : TransitionInteractor(FromDozingTransitionInteractor::class.simpleName!!) { +) : + TransitionInteractor( + fromState = KeyguardState.DOZING, + ) { override fun start() { listenForDozingToLockscreen() @@ -49,20 +50,13 @@ constructor( private fun listenForDozingToLockscreen() { scope.launch { keyguardInteractor.wakefulnessModel - .sample(keyguardTransitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) .collect { (wakefulnessModel, lastStartedTransition) -> if ( wakefulnessModel.isStartingToWakeOrAwake() && lastStartedTransition.to == KeyguardState.DOZING ) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.DOZING, - KeyguardState.LOCKSCREEN, - getAnimator(), - ) - ) + startTransitionTo(KeyguardState.LOCKSCREEN) } } } @@ -71,29 +65,22 @@ constructor( private fun listenForDozingToGone() { scope.launch { keyguardInteractor.biometricUnlockState - .sample(keyguardTransitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) .collect { (biometricUnlockState, lastStartedTransition) -> if ( lastStartedTransition.to == KeyguardState.DOZING && isWakeAndUnlock(biometricUnlockState) ) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.DOZING, - KeyguardState.GONE, - getAnimator(), - ) - ) + startTransitionTo(KeyguardState.GONE) } } } } - private fun getAnimator(duration: Duration = DEFAULT_DURATION): ValueAnimator { + override fun getDefaultAnimatorForTransitionsToState(toState: KeyguardState): ValueAnimator { return ValueAnimator().apply { - setInterpolator(Interpolators.LINEAR) - setDuration(duration.inWholeMilliseconds) + interpolator = Interpolators.LINEAR + duration = DEFAULT_DURATION.inWholeMilliseconds } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt index ccf4bc1588f61..98d7434166b4c 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt @@ -24,11 +24,9 @@ import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepositor import com.android.systemui.keyguard.shared.model.BiometricUnlockModel import com.android.systemui.keyguard.shared.model.DozeStateModel import com.android.systemui.keyguard.shared.model.KeyguardState -import com.android.systemui.keyguard.shared.model.TransitionInfo import com.android.systemui.util.kotlin.Utils.Companion.toTriple import com.android.systemui.util.kotlin.sample import javax.inject.Inject -import kotlin.time.Duration import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.delay @@ -40,11 +38,14 @@ import kotlinx.coroutines.launch class FromDreamingTransitionInteractor @Inject constructor( + override val transitionRepository: KeyguardTransitionRepository, + override val transitionInteractor: KeyguardTransitionInteractor, @Application private val scope: CoroutineScope, private val keyguardInteractor: KeyguardInteractor, - private val keyguardTransitionRepository: KeyguardTransitionRepository, - private val keyguardTransitionInteractor: KeyguardTransitionInteractor, -) : TransitionInteractor(FromDreamingTransitionInteractor::class.simpleName!!) { +) : + TransitionInteractor( + fromState = KeyguardState.DREAMING, + ) { override fun start() { listenForDreamingToOccluded() @@ -54,15 +55,8 @@ constructor( fun startToLockscreenTransition() { scope.launch { - if (keyguardTransitionInteractor.startedKeyguardState.value == KeyguardState.DREAMING) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.DREAMING, - KeyguardState.LOCKSCREEN, - getAnimator(TO_LOCKSCREEN_DURATION), - ) - ) + if (transitionInteractor.startedKeyguardState.value == KeyguardState.DREAMING) { + startTransitionTo(KeyguardState.LOCKSCREEN) } } } @@ -76,7 +70,7 @@ constructor( .sample( combine( keyguardInteractor.isKeyguardOccluded, - keyguardTransitionInteractor.startedKeyguardTransitionStep, + transitionInteractor.startedKeyguardTransitionStep, ::Pair, ), ::toTriple @@ -92,14 +86,7 @@ constructor( // action. There's no great signal to determine when the dream is ending // and a transition to OCCLUDED is beginning directly. For now, the solution // is DREAMING->LOCKSCREEN->OCCLUDED - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - lastStartedTransition.to, - KeyguardState.OCCLUDED, - getAnimator(), - ) - ) + startTransitionTo(KeyguardState.OCCLUDED) } } } @@ -109,14 +96,7 @@ constructor( scope.launch { keyguardInteractor.biometricUnlockState.collect { biometricUnlockState -> if (biometricUnlockState == BiometricUnlockModel.WAKE_AND_UNLOCK_FROM_DREAM) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.DREAMING, - KeyguardState.GONE, - getAnimator(), - ) - ) + startTransitionTo(KeyguardState.GONE) } } } @@ -126,7 +106,7 @@ constructor( scope.launch { combine( keyguardInteractor.dozeTransitionModel, - keyguardTransitionInteractor.finishedKeyguardState, + transitionInteractor.finishedKeyguardState, ::Pair ) .collect { (dozeTransitionModel, keyguardState) -> @@ -134,23 +114,18 @@ constructor( dozeTransitionModel.to == DozeStateModel.DOZE && keyguardState == KeyguardState.DREAMING ) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.DREAMING, - KeyguardState.DOZING, - getAnimator(), - ) - ) + startTransitionTo(KeyguardState.DOZING) } } } } - private fun getAnimator(duration: Duration = DEFAULT_DURATION): ValueAnimator { + override fun getDefaultAnimatorForTransitionsToState(toState: KeyguardState): ValueAnimator { return ValueAnimator().apply { - setInterpolator(Interpolators.LINEAR) - setDuration(duration.inWholeMilliseconds) + interpolator = Interpolators.LINEAR + duration = + if (toState == KeyguardState.LOCKSCREEN) TO_LOCKSCREEN_DURATION.inWholeMilliseconds + else DEFAULT_DURATION.inWholeMilliseconds } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt index cfcb65471d8b2..f82633fbba27f 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt @@ -22,12 +22,10 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.KeyguardState -import com.android.systemui.keyguard.shared.model.TransitionInfo import com.android.systemui.keyguard.shared.model.WakefulnessState import com.android.systemui.util.kotlin.Utils.Companion.toTriple import com.android.systemui.util.kotlin.sample import javax.inject.Inject -import kotlin.time.Duration import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.combine @@ -37,11 +35,14 @@ import kotlinx.coroutines.launch class FromGoneTransitionInteractor @Inject constructor( + override val transitionRepository: KeyguardTransitionRepository, + override val transitionInteractor: KeyguardTransitionInteractor, @Application private val scope: CoroutineScope, private val keyguardInteractor: KeyguardInteractor, - private val keyguardTransitionRepository: KeyguardTransitionRepository, - private val keyguardTransitionInteractor: KeyguardTransitionInteractor, -) : TransitionInteractor(FromGoneTransitionInteractor::class.simpleName!!) { +) : + TransitionInteractor( + fromState = KeyguardState.GONE, + ) { override fun start() { listenForGoneToAodOrDozing() @@ -53,17 +54,10 @@ constructor( private fun listenForGoneToLockscreen() { scope.launch { keyguardInteractor.isKeyguardShowing - .sample(keyguardTransitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) .collect { (isKeyguardShowing, lastStartedStep) -> if (isKeyguardShowing && lastStartedStep.to == KeyguardState.GONE) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.GONE, - KeyguardState.LOCKSCREEN, - getAnimator(), - ) - ) + startTransitionTo(KeyguardState.LOCKSCREEN) } } } @@ -72,17 +66,10 @@ constructor( private fun listenForGoneToDreaming() { scope.launch { keyguardInteractor.isAbleToDream - .sample(keyguardTransitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) .collect { (isAbleToDream, lastStartedStep) -> if (isAbleToDream && lastStartedStep.to == KeyguardState.GONE) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.GONE, - KeyguardState.DREAMING, - getAnimator(TO_DREAMING_DURATION), - ) - ) + startTransitionTo(KeyguardState.DREAMING) } } } @@ -93,7 +80,7 @@ constructor( keyguardInteractor.wakefulnessModel .sample( combine( - keyguardTransitionInteractor.startedKeyguardTransitionStep, + transitionInteractor.startedKeyguardTransitionStep, keyguardInteractor.isAodAvailable, ::Pair ), @@ -104,30 +91,24 @@ constructor( lastStartedStep.to == KeyguardState.GONE && wakefulnessState.state == WakefulnessState.STARTING_TO_SLEEP ) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.GONE, - if (isAodAvailable) { - KeyguardState.AOD - } else { - KeyguardState.DOZING - }, - getAnimator(), - ) + startTransitionTo( + if (isAodAvailable) KeyguardState.AOD else KeyguardState.DOZING ) } } } } - private fun getAnimator(duration: Duration = DEFAULT_DURATION): ValueAnimator { + override fun getDefaultAnimatorForTransitionsToState(toState: KeyguardState): ValueAnimator { return ValueAnimator().apply { - setInterpolator(Interpolators.LINEAR) - setDuration(duration.inWholeMilliseconds) + interpolator = Interpolators.LINEAR + duration = + when (toState) { + KeyguardState.DREAMING -> TO_DREAMING_DURATION + else -> DEFAULT_DURATION + }.inWholeMilliseconds } } - companion object { private val DEFAULT_DURATION = 500.milliseconds val TO_DREAMING_DURATION = 933.milliseconds diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt index b5e289f2ac6ea..b7963340228b5 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt @@ -32,7 +32,6 @@ import com.android.systemui.util.kotlin.Utils.Companion.toTriple import com.android.systemui.util.kotlin.sample import java.util.UUID import javax.inject.Inject -import kotlin.time.Duration import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.combine @@ -42,12 +41,15 @@ import kotlinx.coroutines.launch class FromLockscreenTransitionInteractor @Inject constructor( + override val transitionRepository: KeyguardTransitionRepository, + override val transitionInteractor: KeyguardTransitionInteractor, @Application private val scope: CoroutineScope, private val keyguardInteractor: KeyguardInteractor, private val shadeRepository: ShadeRepository, - private val keyguardTransitionInteractor: KeyguardTransitionInteractor, - private val keyguardTransitionRepository: KeyguardTransitionRepository, -) : TransitionInteractor(FromLockscreenTransitionInteractor::class.simpleName!!) { +) : + TransitionInteractor( + fromState = KeyguardState.LOCKSCREEN, + ) { override fun start() { listenForLockscreenToGone() @@ -66,8 +68,8 @@ constructor( keyguardInteractor.isAbleToDream .sample( combine( - keyguardTransitionInteractor.startedKeyguardTransitionStep, - keyguardTransitionInteractor.finishedKeyguardState, + transitionInteractor.startedKeyguardTransitionStep, + transitionInteractor.finishedKeyguardState, ::Pair ), ::toTriple @@ -78,14 +80,7 @@ constructor( lastStartedTransition.to == KeyguardState.LOCKSCREEN && !invalidFromStates.contains(lastStartedTransition.from) if (isAbleToDream && (isOnLockscreen || isTransitionInterruptible)) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.LOCKSCREEN, - KeyguardState.DREAMING, - getAnimator(TO_DREAMING_DURATION), - ) - ) + startTransitionTo(KeyguardState.DREAMING) } } } @@ -94,20 +89,13 @@ constructor( private fun listenForLockscreenToPrimaryBouncer() { scope.launch { keyguardInteractor.primaryBouncerShowing - .sample(keyguardTransitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) .collect { pair -> val (isBouncerShowing, lastStartedTransitionStep) = pair if ( isBouncerShowing && lastStartedTransitionStep.to == KeyguardState.LOCKSCREEN ) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - ownerName = name, - from = KeyguardState.LOCKSCREEN, - to = KeyguardState.PRIMARY_BOUNCER, - animator = getAnimator(), - ) - ) + startTransitionTo(KeyguardState.PRIMARY_BOUNCER) } } } @@ -116,21 +104,14 @@ constructor( private fun listenForLockscreenToAlternateBouncer() { scope.launch { keyguardInteractor.alternateBouncerShowing - .sample(keyguardTransitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) .collect { pair -> val (isAlternateBouncerShowing, lastStartedTransitionStep) = pair if ( isAlternateBouncerShowing && lastStartedTransitionStep.to == KeyguardState.LOCKSCREEN ) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - ownerName = name, - from = KeyguardState.LOCKSCREEN, - to = KeyguardState.ALTERNATE_BOUNCER, - animator = getAnimator(), - ) - ) + startTransitionTo(KeyguardState.ALTERNATE_BOUNCER) } } } @@ -143,7 +124,7 @@ constructor( shadeRepository.shadeModel .sample( combine( - keyguardTransitionInteractor.startedKeyguardTransitionStep, + transitionInteractor.startedKeyguardTransitionStep, keyguardInteractor.statusBarState, keyguardInteractor.isKeyguardUnlocked, ::Triple @@ -164,7 +145,7 @@ constructor( } else { TransitionState.RUNNING } - keyguardTransitionRepository.updateTransition( + transitionRepository.updateTransition( id, 1f - shadeModel.expansionAmount, nextState, @@ -178,13 +159,17 @@ constructor( } // If canceled, just put the state back + // TODO: This logic should happen in FromPrimaryBouncerInteractor. if (nextState == TransitionState.CANCELED) { - keyguardTransitionRepository.startTransition( + transitionRepository.startTransition( TransitionInfo( ownerName = name, from = KeyguardState.PRIMARY_BOUNCER, to = KeyguardState.LOCKSCREEN, - animator = getAnimator(0.milliseconds) + animator = + getDefaultAnimatorForTransitionsToState(KeyguardState.LOCKSCREEN).apply { + duration = 0 + } ) ) } @@ -198,15 +183,7 @@ constructor( !isKeyguardUnlocked && statusBarState == KEYGUARD ) { - transitionId = - keyguardTransitionRepository.startTransition( - TransitionInfo( - ownerName = name, - from = KeyguardState.LOCKSCREEN, - to = KeyguardState.PRIMARY_BOUNCER, - animator = null, - ) - ) + transitionId = startTransitionTo(KeyguardState.PRIMARY_BOUNCER) } } } @@ -216,18 +193,11 @@ constructor( private fun listenForLockscreenToGone() { scope.launch { keyguardInteractor.isKeyguardGoingAway - .sample(keyguardTransitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) .collect { pair -> val (isKeyguardGoingAway, lastStartedStep) = pair if (isKeyguardGoingAway && lastStartedStep.to == KeyguardState.LOCKSCREEN) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.LOCKSCREEN, - KeyguardState.GONE, - getAnimator(), - ) - ) + startTransitionTo(KeyguardState.GONE) } } } @@ -238,7 +208,7 @@ constructor( keyguardInteractor.isKeyguardOccluded .sample( combine( - keyguardTransitionInteractor.finishedKeyguardState, + transitionInteractor.finishedKeyguardState, keyguardInteractor.isDreaming, ::Pair ), @@ -246,14 +216,7 @@ constructor( ) .collect { (isOccluded, keyguardState, isDreaming) -> if (isOccluded && !isDreaming && keyguardState == KeyguardState.LOCKSCREEN) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - keyguardState, - KeyguardState.OCCLUDED, - getAnimator(TO_OCCLUDED_DURATION), - ) - ) + startTransitionTo(KeyguardState.OCCLUDED) } } } @@ -263,7 +226,7 @@ constructor( private fun listenForLockscreenToCamera() { scope.launch { keyguardInteractor.onCameraLaunchDetected - .sample(keyguardTransitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) .collect { (_, lastStartedStep) -> // DREAMING/AOD/OFF may trigger on the first power button push, so include this // state in order to cancel and correct the transition @@ -274,14 +237,7 @@ constructor( lastStartedStep.to == KeyguardState.AOD || lastStartedStep.to == KeyguardState.OFF ) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.LOCKSCREEN, - KeyguardState.OCCLUDED, - getAnimator(TO_OCCLUDED_DURATION), - ) - ) + startTransitionTo(KeyguardState.OCCLUDED) } } } @@ -292,7 +248,7 @@ constructor( keyguardInteractor.wakefulnessModel .sample( combine( - keyguardTransitionInteractor.startedKeyguardTransitionStep, + transitionInteractor.startedKeyguardTransitionStep, keyguardInteractor.isAodAvailable, ::Pair ), @@ -303,27 +259,23 @@ constructor( lastStartedStep.to == KeyguardState.LOCKSCREEN && wakefulnessState.state == WakefulnessState.STARTING_TO_SLEEP ) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.LOCKSCREEN, - if (isAodAvailable) { - KeyguardState.AOD - } else { - KeyguardState.DOZING - }, - getAnimator(), - ) + startTransitionTo( + if (isAodAvailable) KeyguardState.AOD else KeyguardState.DOZING ) } } } } - private fun getAnimator(duration: Duration = DEFAULT_DURATION): ValueAnimator { + override fun getDefaultAnimatorForTransitionsToState(toState: KeyguardState): ValueAnimator { return ValueAnimator().apply { - setInterpolator(Interpolators.LINEAR) - setDuration(duration.inWholeMilliseconds) + interpolator = Interpolators.LINEAR + duration = + when (toState) { + KeyguardState.DREAMING -> TO_DREAMING_DURATION + KeyguardState.OCCLUDED -> TO_OCCLUDED_DURATION + else -> DEFAULT_DURATION + }.inWholeMilliseconds } } 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 b0dbc591dd153..a8147d0c2cf6c 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 @@ -22,12 +22,10 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.KeyguardState -import com.android.systemui.keyguard.shared.model.TransitionInfo import com.android.systemui.keyguard.shared.model.WakefulnessState import com.android.systemui.util.kotlin.Utils.Companion.toTriple import com.android.systemui.util.kotlin.sample import javax.inject.Inject -import kotlin.time.Duration import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.combine @@ -37,11 +35,14 @@ import kotlinx.coroutines.launch class FromOccludedTransitionInteractor @Inject constructor( + override val transitionRepository: KeyguardTransitionRepository, + override val transitionInteractor: KeyguardTransitionInteractor, @Application private val scope: CoroutineScope, private val keyguardInteractor: KeyguardInteractor, - private val keyguardTransitionRepository: KeyguardTransitionRepository, - private val keyguardTransitionInteractor: KeyguardTransitionInteractor, -) : TransitionInteractor(FromOccludedTransitionInteractor::class.simpleName!!) { +) : + TransitionInteractor( + fromState = KeyguardState.OCCLUDED, + ) { override fun start() { listenForOccludedToLockscreen() @@ -54,18 +55,11 @@ constructor( private fun listenForOccludedToDreaming() { scope.launch { keyguardInteractor.isAbleToDream - .sample(keyguardTransitionInteractor.finishedKeyguardState, ::Pair) + .sample(transitionInteractor.finishedKeyguardState, ::Pair) .collect { pair -> val (isAbleToDream, keyguardState) = pair if (isAbleToDream && keyguardState == KeyguardState.OCCLUDED) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.OCCLUDED, - KeyguardState.DREAMING, - getAnimator(), - ) - ) + startTransitionTo(KeyguardState.DREAMING) } } } @@ -77,7 +71,7 @@ constructor( .sample( combine( keyguardInteractor.isKeyguardShowing, - keyguardTransitionInteractor.startedKeyguardTransitionStep, + transitionInteractor.startedKeyguardTransitionStep, ::Pair ), ::toTriple @@ -90,14 +84,7 @@ constructor( isShowing && lastStartedKeyguardState.to == KeyguardState.OCCLUDED ) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.OCCLUDED, - KeyguardState.LOCKSCREEN, - getAnimator(TO_LOCKSCREEN_DURATION), - ) - ) + startTransitionTo(KeyguardState.LOCKSCREEN) } } } @@ -109,7 +96,7 @@ constructor( .sample( combine( keyguardInteractor.isKeyguardShowing, - keyguardTransitionInteractor.startedKeyguardTransitionStep, + transitionInteractor.startedKeyguardTransitionStep, ::Pair ), ::toTriple @@ -122,14 +109,7 @@ constructor( !isShowing && lastStartedKeyguardState.to == KeyguardState.OCCLUDED ) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.OCCLUDED, - KeyguardState.GONE, - getAnimator(), - ) - ) + startTransitionTo(KeyguardState.GONE) } } } @@ -140,7 +120,7 @@ constructor( keyguardInteractor.wakefulnessModel .sample( combine( - keyguardTransitionInteractor.startedKeyguardTransitionStep, + transitionInteractor.startedKeyguardTransitionStep, keyguardInteractor.isAodAvailable, ::Pair ), @@ -151,17 +131,8 @@ constructor( lastStartedStep.to == KeyguardState.OCCLUDED && wakefulnessState.state == WakefulnessState.STARTING_TO_SLEEP ) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - name, - KeyguardState.OCCLUDED, - if (isAodAvailable) { - KeyguardState.AOD - } else { - KeyguardState.DOZING - }, - getAnimator(), - ) + startTransitionTo( + if (isAodAvailable) KeyguardState.AOD else KeyguardState.DOZING ) } } @@ -171,29 +142,26 @@ constructor( private fun listenForOccludedToAlternateBouncer() { scope.launch { keyguardInteractor.alternateBouncerShowing - .sample(keyguardTransitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) .collect { (isAlternateBouncerShowing, lastStartedTransitionStep) -> if ( isAlternateBouncerShowing && lastStartedTransitionStep.to == KeyguardState.OCCLUDED ) { - keyguardTransitionRepository.startTransition( - TransitionInfo( - ownerName = name, - from = KeyguardState.OCCLUDED, - to = KeyguardState.ALTERNATE_BOUNCER, - animator = getAnimator(), - ) - ) + startTransitionTo(KeyguardState.ALTERNATE_BOUNCER) } } } } - private fun getAnimator(duration: Duration = DEFAULT_DURATION): ValueAnimator { + override fun getDefaultAnimatorForTransitionsToState(toState: KeyguardState): ValueAnimator { return ValueAnimator().apply { - setInterpolator(Interpolators.LINEAR) - setDuration(duration.inWholeMilliseconds) + interpolator = Interpolators.LINEAR + duration = + when (toState) { + KeyguardState.LOCKSCREEN -> TO_LOCKSCREEN_DURATION + else -> DEFAULT_DURATION + }.inWholeMilliseconds } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt index da09e1f0f4d23..e1754f55b1dd8 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt @@ -25,12 +25,10 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.KeyguardState -import com.android.systemui.keyguard.shared.model.TransitionInfo import com.android.systemui.keyguard.shared.model.WakefulnessState import com.android.systemui.util.kotlin.Utils.Companion.toQuad import com.android.systemui.util.kotlin.sample import javax.inject.Inject -import kotlin.time.Duration import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.combine @@ -40,12 +38,15 @@ import kotlinx.coroutines.launch class FromPrimaryBouncerTransitionInteractor @Inject constructor( + override val transitionRepository: KeyguardTransitionRepository, + override val transitionInteractor: KeyguardTransitionInteractor, @Application private val scope: CoroutineScope, private val keyguardInteractor: KeyguardInteractor, - private val keyguardTransitionRepository: KeyguardTransitionRepository, - private val keyguardTransitionInteractor: KeyguardTransitionInteractor, private val keyguardSecurityModel: KeyguardSecurityModel, -) : TransitionInteractor(FromPrimaryBouncerTransitionInteractor::class.simpleName!!) { +) : + TransitionInteractor( + fromState = KeyguardState.PRIMARY_BOUNCER, + ) { override fun start() { listenForPrimaryBouncerToGone() @@ -59,7 +60,7 @@ constructor( .sample( combine( keyguardInteractor.wakefulnessModel, - keyguardTransitionInteractor.startedKeyguardTransitionStep, + transitionInteractor.startedKeyguardTransitionStep, keyguardInteractor.isKeyguardOccluded, ::Triple ), @@ -73,20 +74,8 @@ constructor( (wakefulnessState.state == WakefulnessState.AWAKE || wakefulnessState.state == WakefulnessState.STARTING_TO_WAKE) ) { - val to = - if (occluded) { - KeyguardState.OCCLUDED - } else { - KeyguardState.LOCKSCREEN - } - - keyguardTransitionRepository.startTransition( - TransitionInfo( - ownerName = name, - from = KeyguardState.PRIMARY_BOUNCER, - to = to, - animator = getAnimator(), - ) + startTransitionTo( + if (occluded) KeyguardState.OCCLUDED else KeyguardState.LOCKSCREEN ) } } @@ -99,7 +88,7 @@ constructor( .sample( combine( keyguardInteractor.wakefulnessModel, - keyguardTransitionInteractor.startedKeyguardTransitionStep, + transitionInteractor.startedKeyguardTransitionStep, keyguardInteractor.isAodAvailable, ::Triple ), @@ -114,20 +103,8 @@ constructor( (wakefulnessState.state == WakefulnessState.STARTING_TO_SLEEP || wakefulnessState.state == WakefulnessState.ASLEEP) ) { - val to = - if (isAodAvailable) { - KeyguardState.AOD - } else { - KeyguardState.DOZING - } - - keyguardTransitionRepository.startTransition( - TransitionInfo( - ownerName = name, - from = KeyguardState.PRIMARY_BOUNCER, - to = to, - animator = getAnimator(), - ) + startTransitionTo( + if (isAodAvailable) KeyguardState.AOD else KeyguardState.DOZING ) } } @@ -137,7 +114,7 @@ constructor( private fun listenForPrimaryBouncerToGone() { scope.launch { keyguardInteractor.isKeyguardGoingAway - .sample(keyguardTransitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) .collect { (isKeyguardGoingAway, lastStartedTransitionStep) -> if ( isKeyguardGoingAway && @@ -154,24 +131,24 @@ constructor( } else { TO_GONE_DURATION } - keyguardTransitionRepository.startTransition( - TransitionInfo( - ownerName = name, - from = KeyguardState.PRIMARY_BOUNCER, - to = KeyguardState.GONE, - animator = getAnimator(duration), - ), - resetIfCanceled = true, + + startTransitionTo( + toState = KeyguardState.GONE, + animator = + getDefaultAnimatorForTransitionsToState(KeyguardState.GONE).apply { + this.duration = duration.inWholeMilliseconds + }, + resetIfCancelled = true ) } } } } - private fun getAnimator(duration: Duration = DEFAULT_DURATION): ValueAnimator { + override fun getDefaultAnimatorForTransitionsToState(toState: KeyguardState): ValueAnimator { return ValueAnimator().apply { - setInterpolator(Interpolators.LINEAR) - setDuration(duration.inWholeMilliseconds) + interpolator = Interpolators.LINEAR + duration = DEFAULT_DURATION.inWholeMilliseconds } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt index 42f12f82d9a7d..df7c79ff4264f 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt @@ -47,6 +47,8 @@ constructor( private val repository: KeyguardTransitionRepository, @Application val scope: CoroutineScope, ) { + private val TAG = this::class.simpleName + /** (any)->GONE transition information */ val anyStateToGoneTransition: Flow = repository.transitions.filter { step -> step.to == KeyguardState.GONE } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TransitionInteractor.kt index b7dd1a5f42b5d..ae6fc9e6e6dcb 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TransitionInteractor.kt @@ -15,6 +15,14 @@ */ package com.android.systemui.keyguard.domain.interactor + +import android.animation.ValueAnimator +import android.util.Log +import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository +import com.android.systemui.keyguard.shared.model.KeyguardState +import com.android.systemui.keyguard.shared.model.TransitionInfo +import java.util.UUID + /** * Each TransitionInteractor is responsible for determining under which conditions to notify * [KeyguardTransitionRepository] to signal a transition. When (and if) the transition occurs is @@ -26,6 +34,50 @@ package com.android.systemui.keyguard.domain.interactor * MUST list implementing classes in dagger module [StartKeyguardTransitionModule] and also in the * 'when' clause of [KeyguardTransitionCoreStartable] */ -sealed class TransitionInteractor(val name: String) { +sealed class TransitionInteractor( + val fromState: KeyguardState, +) { + val name = this::class.simpleName ?: "UnknownTransitionInteractor" + + abstract val transitionRepository: KeyguardTransitionRepository + abstract val transitionInteractor: KeyguardTransitionInteractor abstract fun start() + + fun startTransitionTo( + toState: KeyguardState, + animator: ValueAnimator? = getDefaultAnimatorForTransitionsToState(toState), + resetIfCancelled: Boolean = false + ): UUID? { + if ( + fromState != transitionInteractor.startedKeyguardState.value && + fromState != transitionInteractor.finishedKeyguardState.value + ) { + Log.e( + name, + "startTransition: We were asked to transition from " + + "$fromState to $toState, however we last finished a transition to " + + "${transitionInteractor.finishedKeyguardState.value}, " + + "and last started a transition to " + + "${transitionInteractor.startedKeyguardState.value}. " + + "Ignoring startTransition, but this should never happen." + ) + return null + } + + return transitionRepository.startTransition( + TransitionInfo( + name, + fromState, + toState, + animator, + ), + resetIfCancelled + ) + } + + /** + * Returns a ValueAnimator to be used for transitions to [toState], if one is not explicitly + * passed to [startTransitionTo]. + */ + abstract fun getDefaultAnimatorForTransitionsToState(toState: KeyguardState): ValueAnimator? } 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 50075b5ae5d2b..b5590154f7f41 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 @@ -25,7 +25,6 @@ import com.android.systemui.flags.FakeFeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository -import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.BiometricUnlockModel import com.android.systemui.keyguard.shared.model.DozeStateModel import com.android.systemui.keyguard.shared.model.DozeTransitionModel @@ -56,6 +55,7 @@ import org.mockito.ArgumentMatchers.anyInt import org.mockito.Mock import org.mockito.Mockito.never import org.mockito.Mockito.reset +import org.mockito.Mockito.spy import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations @@ -72,10 +72,10 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { private lateinit var bouncerRepository: FakeKeyguardBouncerRepository private lateinit var shadeRepository: ShadeRepository private lateinit var transitionRepository: FakeKeyguardTransitionRepository + private lateinit var transitionInteractor: KeyguardTransitionInteractor private lateinit var featureFlags: FakeFeatureFlags // Used to verify transition requests for test output - @Mock private lateinit var mockTransitionRepository: KeyguardTransitionRepository @Mock private lateinit var keyguardSecurityModel: KeyguardSecurityModel private lateinit var fromLockscreenTransitionInteractor: FromLockscreenTransitionInteractor @@ -97,92 +97,71 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { keyguardRepository = FakeKeyguardRepository() bouncerRepository = FakeKeyguardBouncerRepository() shadeRepository = FakeShadeRepository() - transitionRepository = FakeKeyguardTransitionRepository() + transitionRepository = spy(FakeKeyguardTransitionRepository()) + transitionInteractor = KeyguardTransitionInteractor( + transitionRepository, testScope.backgroundScope) whenever(keyguardSecurityModel.getSecurityMode(anyInt())).thenReturn(PIN) featureFlags = FakeFeatureFlags().apply { set(Flags.FACE_AUTH_REFACTOR, true) } - fromLockscreenTransitionInteractor = - FromLockscreenTransitionInteractor( + + fromLockscreenTransitionInteractor = FromLockscreenTransitionInteractor( scope = testScope, keyguardInteractor = createKeyguardInteractor(), + transitionRepository = transitionRepository, + transitionInteractor = transitionInteractor, shadeRepository = shadeRepository, - keyguardTransitionRepository = mockTransitionRepository, - keyguardTransitionInteractor = - KeyguardTransitionInteractor(transitionRepository, testScope.backgroundScope), - ) - fromLockscreenTransitionInteractor.start() + ).apply { start() } - fromDreamingTransitionInteractor = - FromDreamingTransitionInteractor( + fromPrimaryBouncerTransitionInteractor = FromPrimaryBouncerTransitionInteractor( scope = testScope, keyguardInteractor = createKeyguardInteractor(), - keyguardTransitionRepository = mockTransitionRepository, - keyguardTransitionInteractor = - KeyguardTransitionInteractor(transitionRepository, testScope.backgroundScope), - ) - fromDreamingTransitionInteractor.start() - - fromAodTransitionInteractor = - FromAodTransitionInteractor( - scope = testScope, - keyguardInteractor = createKeyguardInteractor(), - keyguardTransitionRepository = mockTransitionRepository, - keyguardTransitionInteractor = - KeyguardTransitionInteractor(transitionRepository, testScope.backgroundScope), - ) - fromAodTransitionInteractor.start() - - fromGoneTransitionInteractor = - FromGoneTransitionInteractor( - scope = testScope, - keyguardInteractor = createKeyguardInteractor(), - keyguardTransitionRepository = mockTransitionRepository, - keyguardTransitionInteractor = - KeyguardTransitionInteractor(transitionRepository, testScope.backgroundScope), - ) - fromGoneTransitionInteractor.start() - - fromDozingTransitionInteractor = - FromDozingTransitionInteractor( - scope = testScope, - keyguardInteractor = createKeyguardInteractor(), - keyguardTransitionRepository = mockTransitionRepository, - keyguardTransitionInteractor = - KeyguardTransitionInteractor(transitionRepository, testScope.backgroundScope), - ) - fromDozingTransitionInteractor.start() - - fromOccludedTransitionInteractor = - FromOccludedTransitionInteractor( - scope = testScope, - keyguardInteractor = createKeyguardInteractor(), - keyguardTransitionRepository = mockTransitionRepository, - keyguardTransitionInteractor = - KeyguardTransitionInteractor(transitionRepository, testScope.backgroundScope), - ) - fromOccludedTransitionInteractor.start() - - fromAlternateBouncerTransitionInteractor = - FromAlternateBouncerTransitionInteractor( - scope = testScope, - keyguardInteractor = createKeyguardInteractor(), - keyguardTransitionRepository = mockTransitionRepository, - keyguardTransitionInteractor = - KeyguardTransitionInteractor(transitionRepository, testScope.backgroundScope), - ) - fromAlternateBouncerTransitionInteractor.start() - - fromPrimaryBouncerTransitionInteractor = - FromPrimaryBouncerTransitionInteractor( - scope = testScope, - keyguardInteractor = createKeyguardInteractor(), - keyguardTransitionRepository = mockTransitionRepository, - keyguardTransitionInteractor = - KeyguardTransitionInteractor(transitionRepository, testScope.backgroundScope), + transitionRepository = transitionRepository, + transitionInteractor = transitionInteractor, keyguardSecurityModel = keyguardSecurityModel, - ) - fromPrimaryBouncerTransitionInteractor.start() + ).apply { start() } + + fromDreamingTransitionInteractor = FromDreamingTransitionInteractor( + scope = testScope, + keyguardInteractor = createKeyguardInteractor(), + transitionRepository = transitionRepository, + transitionInteractor = transitionInteractor, + ).apply { start() } + + fromAodTransitionInteractor = FromAodTransitionInteractor( + scope = testScope, + keyguardInteractor = createKeyguardInteractor(), + transitionRepository = transitionRepository, + transitionInteractor = transitionInteractor, + ).apply { start() } + + fromGoneTransitionInteractor = FromGoneTransitionInteractor( + scope = testScope, + keyguardInteractor = createKeyguardInteractor(), + transitionRepository = transitionRepository, + transitionInteractor = transitionInteractor, + ).apply { start() } + + fromDozingTransitionInteractor = FromDozingTransitionInteractor( + scope = testScope, + keyguardInteractor = createKeyguardInteractor(), + transitionRepository = transitionRepository, + transitionInteractor = transitionInteractor, + ).apply { start() } + + fromOccludedTransitionInteractor = FromOccludedTransitionInteractor( + scope = testScope, + keyguardInteractor = createKeyguardInteractor(), + transitionRepository = transitionRepository, + transitionInteractor = transitionInteractor, + ).apply { start() } + + fromAlternateBouncerTransitionInteractor = FromAlternateBouncerTransitionInteractor( + scope = testScope, + keyguardInteractor = createKeyguardInteractor(), + transitionRepository = transitionRepository, + transitionInteractor = transitionInteractor, + ).apply { start() } } @Test @@ -201,7 +180,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to PRIMARY_BOUNCER should occur assertThat(info.ownerName).isEqualTo("FromLockscreenTransitionInteractor") @@ -228,7 +207,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to DOZING should occur assertThat(info.ownerName).isEqualTo("FromOccludedTransitionInteractor") @@ -255,7 +234,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to DOZING should occur assertThat(info.ownerName).isEqualTo("FromOccludedTransitionInteractor") @@ -286,7 +265,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to DREAMING should occur assertThat(info.ownerName).isEqualTo("FromLockscreenTransitionInteractor") @@ -313,7 +292,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to DOZING should occur assertThat(info.ownerName).isEqualTo("FromLockscreenTransitionInteractor") @@ -340,7 +319,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to DOZING should occur assertThat(info.ownerName).isEqualTo("FromLockscreenTransitionInteractor") @@ -363,7 +342,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to DOZING should occur assertThat(info.ownerName).isEqualTo("FromDozingTransitionInteractor") @@ -388,14 +367,14 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { ) ) runCurrent() - reset(mockTransitionRepository) + reset(transitionRepository) // WHEN a signal comes that dreaming is enabled keyguardRepository.setDreamingWithOverlay(true) advanceUntilIdle() // THEN the transition is ignored - verify(mockTransitionRepository, never()).startTransition(any(), anyBoolean()) + verify(transitionRepository, never()).startTransition(any(), anyBoolean()) coroutineContext.cancelChildren() } @@ -412,7 +391,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to DOZING should occur assertThat(info.ownerName).isEqualTo("FromDozingTransitionInteractor") @@ -439,7 +418,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to DOZING should occur assertThat(info.ownerName).isEqualTo("FromGoneTransitionInteractor") @@ -466,7 +445,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to AOD should occur assertThat(info.ownerName).isEqualTo("FromGoneTransitionInteractor") @@ -489,7 +468,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to AOD should occur assertThat(info.ownerName).isEqualTo("FromGoneTransitionInteractor") @@ -520,7 +499,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to DREAMING should occur assertThat(info.ownerName).isEqualTo("FromGoneTransitionInteractor") @@ -543,7 +522,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to PRIMARY_BOUNCER should occur assertThat(info.ownerName).isEqualTo("FromAlternateBouncerTransitionInteractor") @@ -572,7 +551,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to AOD should occur assertThat(info.ownerName).isEqualTo("FromAlternateBouncerTransitionInteractor") @@ -602,7 +581,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to DOZING should occur assertThat(info.ownerName).isEqualTo("FromAlternateBouncerTransitionInteractor") @@ -630,7 +609,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to LOCKSCREEN should occur assertThat(info.ownerName).isEqualTo("FromAlternateBouncerTransitionInteractor") @@ -658,7 +637,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to AOD should occur assertThat(info.ownerName).isEqualTo("FromPrimaryBouncerTransitionInteractor") @@ -686,7 +665,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to DOZING should occur assertThat(info.ownerName).isEqualTo("FromPrimaryBouncerTransitionInteractor") @@ -713,7 +692,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to LOCKSCREEN should occur assertThat(info.ownerName).isEqualTo("FromPrimaryBouncerTransitionInteractor") @@ -744,7 +723,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to GONE should occur assertThat(info.ownerName).isEqualTo("FromOccludedTransitionInteractor") @@ -773,7 +752,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to LOCKSCREEN should occur assertThat(info.ownerName).isEqualTo("FromOccludedTransitionInteractor") @@ -799,7 +778,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to AlternateBouncer should occur assertThat(info.ownerName).isEqualTo("FromOccludedTransitionInteractor") @@ -828,7 +807,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { val info = withArgCaptor { - verify(mockTransitionRepository).startTransition(capture(), anyBoolean()) + verify(transitionRepository).startTransition(capture(), anyBoolean()) } // THEN a transition to AlternateBouncer should occur assertThat(info.ownerName).isEqualTo("FromPrimaryBouncerTransitionInteractor") @@ -890,6 +869,6 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { ) ) runCurrent() - reset(mockTransitionRepository) + reset(transitionRepository) } }