summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Josh Tsuji <tsuji@google.com> 2023-06-21 16:19:52 -0400
committer Josh Tsuji <tsuji@google.com> 2023-06-23 15:51:35 -0400
commit9c9d951846e0ca8c6596d03c1aab87c51a2d49f4 (patch)
treedca7bab9deae325498bebd4d249fb3c1a16f68eb
parentf41f026bb8dbd747c343936bd512f4a9af455386 (diff)
Move common From*TransitionInteractor logic into the superclass.
This also has the benefit of allowing us to force that From<T> transition interactors can only start transitions when we're in, or were animating to, KeyguardState T. Bug: 278086361 Test: atest KeyguardTransitionScenariosTest Change-Id: I6503c51bfa3e55e0c6395f361fcd54fa0c18e2cf
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt45
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAodTransitionInteractor.kt38
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt39
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingTransitionInteractor.kt61
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGoneTransitionInteractor.kt59
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractor.kt126
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt80
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt71
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TransitionInteractor.kt54
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionScenariosTest.kt151
11 files changed, 284 insertions, 442 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 38eaccee7284..8f0b91b6d864 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 7e9cbc1a9772..2085c877064d 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 ee2c2df41624..c867c43b1646 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 ccf4bc1588f6..98d7434166b4 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 cfcb65471d8b..f82633fbba27 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 b5e289f2ac6e..b7963340228b 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 b0dbc591dd15..a8147d0c2cf6 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 da09e1f0f4d2..e1754f55b1dd 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 42f12f82d9a7..df7c79ff4264 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<TransitionStep> =
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 b7dd1a5f42b5..ae6fc9e6e6dc 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 50075b5ae5d2..b5590154f7f4 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()
+ transitionRepository = transitionRepository,
+ transitionInteractor = transitionInteractor,
+ keyguardSecurityModel = keyguardSecurityModel,
+ ).apply { start() }
- fromAodTransitionInteractor =
- FromAodTransitionInteractor(
+ fromDreamingTransitionInteractor = FromDreamingTransitionInteractor(
scope = testScope,
keyguardInteractor = createKeyguardInteractor(),
- keyguardTransitionRepository = mockTransitionRepository,
- keyguardTransitionInteractor =
- KeyguardTransitionInteractor(transitionRepository, testScope.backgroundScope),
- )
- fromAodTransitionInteractor.start()
+ transitionRepository = transitionRepository,
+ transitionInteractor = transitionInteractor,
+ ).apply { start() }
- fromGoneTransitionInteractor =
- FromGoneTransitionInteractor(
+ fromAodTransitionInteractor = FromAodTransitionInteractor(
scope = testScope,
keyguardInteractor = createKeyguardInteractor(),
- keyguardTransitionRepository = mockTransitionRepository,
- keyguardTransitionInteractor =
- KeyguardTransitionInteractor(transitionRepository, testScope.backgroundScope),
- )
- fromGoneTransitionInteractor.start()
+ transitionRepository = transitionRepository,
+ transitionInteractor = transitionInteractor,
+ ).apply { start() }
- fromDozingTransitionInteractor =
- FromDozingTransitionInteractor(
+ fromGoneTransitionInteractor = FromGoneTransitionInteractor(
scope = testScope,
keyguardInteractor = createKeyguardInteractor(),
- keyguardTransitionRepository = mockTransitionRepository,
- keyguardTransitionInteractor =
- KeyguardTransitionInteractor(transitionRepository, testScope.backgroundScope),
- )
- fromDozingTransitionInteractor.start()
+ transitionRepository = transitionRepository,
+ transitionInteractor = transitionInteractor,
+ ).apply { start() }
- fromOccludedTransitionInteractor =
- FromOccludedTransitionInteractor(
+ fromDozingTransitionInteractor = FromDozingTransitionInteractor(
scope = testScope,
keyguardInteractor = createKeyguardInteractor(),
- keyguardTransitionRepository = mockTransitionRepository,
- keyguardTransitionInteractor =
- KeyguardTransitionInteractor(transitionRepository, testScope.backgroundScope),
- )
- fromOccludedTransitionInteractor.start()
+ transitionRepository = transitionRepository,
+ transitionInteractor = transitionInteractor,
+ ).apply { start() }
- fromAlternateBouncerTransitionInteractor =
- FromAlternateBouncerTransitionInteractor(
+ fromOccludedTransitionInteractor = FromOccludedTransitionInteractor(
scope = testScope,
keyguardInteractor = createKeyguardInteractor(),
- keyguardTransitionRepository = mockTransitionRepository,
- keyguardTransitionInteractor =
- KeyguardTransitionInteractor(transitionRepository, testScope.backgroundScope),
- )
- fromAlternateBouncerTransitionInteractor.start()
+ transitionRepository = transitionRepository,
+ transitionInteractor = transitionInteractor,
+ ).apply { start() }
- fromPrimaryBouncerTransitionInteractor =
- FromPrimaryBouncerTransitionInteractor(
+ fromAlternateBouncerTransitionInteractor = FromAlternateBouncerTransitionInteractor(
scope = testScope,
keyguardInteractor = createKeyguardInteractor(),
- keyguardTransitionRepository = mockTransitionRepository,
- keyguardTransitionInteractor =
- KeyguardTransitionInteractor(transitionRepository, testScope.backgroundScope),
- keyguardSecurityModel = keyguardSecurityModel,
- )
- fromPrimaryBouncerTransitionInteractor.start()
+ transitionRepository = transitionRepository,
+ transitionInteractor = transitionInteractor,
+ ).apply { start() }
}
@Test
@@ -201,7 +180,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() {
val info =
withArgCaptor<TransitionInfo> {
- 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<TransitionInfo> {
- 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<TransitionInfo> {
- 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<TransitionInfo> {
- 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<TransitionInfo> {
- 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<TransitionInfo> {
- 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<TransitionInfo> {
- 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<TransitionInfo> {
- 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<TransitionInfo> {
- 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<TransitionInfo> {
- 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<TransitionInfo> {
- 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<TransitionInfo> {
- 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<TransitionInfo> {
- 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<TransitionInfo> {
- 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<TransitionInfo> {
- 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<TransitionInfo> {
- 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<TransitionInfo> {
- 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<TransitionInfo> {
- 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<TransitionInfo> {
- 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<TransitionInfo> {
- 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<TransitionInfo> {
- 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<TransitionInfo> {
- 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<TransitionInfo> {
- 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)
}
}