diff options
20 files changed, 305 insertions, 176 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 52f2759fe63d..d7a2aa041ffc 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 @@ -18,7 +18,8 @@ package com.android.systemui.keyguard.domain.interactor import android.animation.ValueAnimator import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.power.domain.interactor.PowerInteractor @@ -28,6 +29,7 @@ import com.android.systemui.util.kotlin.sample import com.android.wm.shell.animation.Interpolators import javax.inject.Inject import kotlin.time.Duration.Companion.milliseconds +import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.flow.combine @@ -39,13 +41,18 @@ class FromAlternateBouncerTransitionInteractor @Inject constructor( override val transitionRepository: KeyguardTransitionRepository, - override val transitionInteractor: KeyguardTransitionInteractor, - @Application private val scope: CoroutineScope, + transitionInteractor: KeyguardTransitionInteractor, + @Background private val scope: CoroutineScope, + @Background bgDispatcher: CoroutineDispatcher, + @Main mainDispatcher: CoroutineDispatcher, private val keyguardInteractor: KeyguardInteractor, private val powerInteractor: PowerInteractor, ) : TransitionInteractor( fromState = KeyguardState.ALTERNATE_BOUNCER, + transitionInteractor = transitionInteractor, + mainDispatcher = mainDispatcher, + bgDispatcher = bgDispatcher, ) { override fun start() { @@ -65,7 +72,7 @@ constructor( .sample( combine( keyguardInteractor.primaryBouncerShowing, - transitionInteractor.startedKeyguardTransitionStep, + startedKeyguardTransitionStep, powerInteractor.isAwake, keyguardInteractor.isAodAvailable, ::toQuad @@ -102,20 +109,19 @@ constructor( private fun listenForAlternateBouncerToGone() { scope.launch { - keyguardInteractor.isKeyguardGoingAway - .sample(transitionInteractor.finishedKeyguardState, ::Pair) - .collect { (isKeyguardGoingAway, keyguardState) -> - if (isKeyguardGoingAway && keyguardState == KeyguardState.ALTERNATE_BOUNCER) { - startTransitionTo(KeyguardState.GONE) - } + keyguardInteractor.isKeyguardGoingAway.sample(finishedKeyguardState, ::Pair).collect { + (isKeyguardGoingAway, keyguardState) -> + if (isKeyguardGoingAway && keyguardState == KeyguardState.ALTERNATE_BOUNCER) { + startTransitionTo(KeyguardState.GONE) } + } } } private fun listenForAlternateBouncerToPrimaryBouncer() { scope.launch { keyguardInteractor.primaryBouncerShowing - .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(startedKeyguardTransitionStep, ::Pair) .collect { (isPrimaryBouncerShowing, startedKeyguardState) -> if ( isPrimaryBouncerShowing && @@ -139,6 +145,7 @@ constructor( } companion object { + const val TAG = "FromAlternateBouncerTransitionInteractor" val TRANSITION_DURATION_MS = 300.milliseconds val TO_GONE_DURATION = 500.milliseconds val TO_AOD_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 858440185568..fedd63be1454 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 @@ -19,7 +19,8 @@ package com.android.systemui.keyguard.domain.interactor import android.animation.ValueAnimator import com.android.app.animation.Interpolators import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.dagger.qualifiers.Main 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.DozeStateModel @@ -29,6 +30,7 @@ import com.android.systemui.util.kotlin.Utils.Companion.toTriple import com.android.systemui.util.kotlin.sample import javax.inject.Inject import kotlin.time.Duration.Companion.milliseconds +import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.combine import kotlinx.coroutines.launch @@ -38,12 +40,17 @@ class FromAodTransitionInteractor @Inject constructor( override val transitionRepository: KeyguardTransitionRepository, - override val transitionInteractor: KeyguardTransitionInteractor, - @Application private val scope: CoroutineScope, + transitionInteractor: KeyguardTransitionInteractor, + @Background private val scope: CoroutineScope, + @Background bgDispatcher: CoroutineDispatcher, + @Main mainDispatcher: CoroutineDispatcher, private val keyguardInteractor: KeyguardInteractor, ) : TransitionInteractor( fromState = KeyguardState.AOD, + transitionInteractor = transitionInteractor, + mainDispatcher = mainDispatcher, + bgDispatcher = bgDispatcher, ) { override fun start() { @@ -58,7 +65,7 @@ constructor( .dozeTransitionTo(DozeStateModel.FINISH) .sample( combine( - transitionInteractor.startedKeyguardTransitionStep, + startedKeyguardTransitionStep, keyguardInteractor.isKeyguardOccluded, ::Pair ), @@ -77,7 +84,6 @@ constructor( } else { TransitionModeOnCanceled.LAST_VALUE } - startTransitionTo( toState = toState, modeOnCanceled = modeOnCanceled, @@ -89,16 +95,13 @@ constructor( private fun listenForAodToGone() { scope.launch { - keyguardInteractor.biometricUnlockState - .sample(transitionInteractor.finishedKeyguardState, ::Pair) - .collect { pair -> - val (biometricUnlockState, keyguardState) = pair - if ( - keyguardState == KeyguardState.AOD && isWakeAndUnlock(biometricUnlockState) - ) { - startTransitionTo(KeyguardState.GONE) - } + keyguardInteractor.biometricUnlockState.sample(finishedKeyguardState, ::Pair).collect { + pair -> + val (biometricUnlockState, keyguardState) = pair + if (keyguardState == KeyguardState.AOD && isWakeAndUnlock(biometricUnlockState)) { + startTransitionTo(KeyguardState.GONE) } + } } } override fun getDefaultAnimatorForTransitionsToState(toState: KeyguardState): ValueAnimator { @@ -113,6 +116,7 @@ constructor( } companion object { + const val TAG = "FromAodTransitionInteractor" private val DEFAULT_DURATION = 500.milliseconds val TO_LOCKSCREEN_DURATION = 500.milliseconds val TO_GONE_DURATION = DEFAULT_DURATION 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 eca7088c079a..fcb7698c9bf5 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 @@ -19,7 +19,8 @@ package com.android.systemui.keyguard.domain.interactor import android.animation.ValueAnimator import com.android.app.animation.Interpolators import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.dagger.qualifiers.Main 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 @@ -28,6 +29,7 @@ import com.android.systemui.util.kotlin.Utils.Companion.toTriple import com.android.systemui.util.kotlin.sample import javax.inject.Inject import kotlin.time.Duration.Companion.milliseconds +import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.combine import kotlinx.coroutines.launch @@ -37,13 +39,18 @@ class FromDozingTransitionInteractor @Inject constructor( override val transitionRepository: KeyguardTransitionRepository, - override val transitionInteractor: KeyguardTransitionInteractor, - @Application private val scope: CoroutineScope, + transitionInteractor: KeyguardTransitionInteractor, + @Background private val scope: CoroutineScope, + @Background bgDispatcher: CoroutineDispatcher, + @Main mainDispatcher: CoroutineDispatcher, private val keyguardInteractor: KeyguardInteractor, private val powerInteractor: PowerInteractor, ) : TransitionInteractor( fromState = KeyguardState.DOZING, + transitionInteractor = transitionInteractor, + mainDispatcher = mainDispatcher, + bgDispatcher = bgDispatcher, ) { override fun start() { @@ -57,7 +64,7 @@ constructor( powerInteractor.isAwake .sample( combine( - transitionInteractor.startedKeyguardTransitionStep, + startedKeyguardTransitionStep, keyguardInteractor.isKeyguardOccluded, ::Pair ), @@ -76,7 +83,7 @@ constructor( private fun listenForDozingToGone() { scope.launch { keyguardInteractor.biometricUnlockState - .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(startedKeyguardTransitionStep, ::Pair) .collect { (biometricUnlockState, lastStartedTransition) -> if ( lastStartedTransition.to == KeyguardState.DOZING && @@ -96,6 +103,7 @@ constructor( } companion object { + const val TAG = "FromDozingTransitionInteractor" private val DEFAULT_DURATION = 500.milliseconds val TO_LOCKSCREEN_DURATION = DEFAULT_DURATION } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingLockscreenHostedTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingLockscreenHostedTransitionInteractor.kt index dac6ef5e6082..a6cdaa8c6761 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingLockscreenHostedTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDreamingLockscreenHostedTransitionInteractor.kt @@ -19,7 +19,8 @@ package com.android.systemui.keyguard.domain.interactor import android.animation.ValueAnimator import com.android.app.animation.Interpolators import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.BiometricUnlockModel import com.android.systemui.keyguard.shared.model.DozeStateModel @@ -28,6 +29,7 @@ import com.android.systemui.util.kotlin.Utils.Companion.toTriple import com.android.systemui.util.kotlin.sample import javax.inject.Inject import kotlin.time.Duration.Companion.milliseconds +import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.flow.combine @@ -39,12 +41,17 @@ class FromDreamingLockscreenHostedTransitionInteractor @Inject constructor( override val transitionRepository: KeyguardTransitionRepository, - override val transitionInteractor: KeyguardTransitionInteractor, - @Application private val scope: CoroutineScope, + transitionInteractor: KeyguardTransitionInteractor, + @Background private val scope: CoroutineScope, + @Background bgDispatcher: CoroutineDispatcher, + @Main mainDispatcher: CoroutineDispatcher, private val keyguardInteractor: KeyguardInteractor, ) : TransitionInteractor( fromState = KeyguardState.DREAMING_LOCKSCREEN_HOSTED, + transitionInteractor = transitionInteractor, + mainDispatcher = mainDispatcher, + bgDispatcher = bgDispatcher, ) { override fun start() { @@ -64,7 +71,7 @@ constructor( .sample( combine( keyguardInteractor.dozeTransitionModel, - transitionInteractor.startedKeyguardTransitionStep, + startedKeyguardTransitionStep, ::Pair ), ::toTriple @@ -88,7 +95,7 @@ constructor( .sample( combine( keyguardInteractor.isKeyguardOccluded, - transitionInteractor.startedKeyguardTransitionStep, + startedKeyguardTransitionStep, ::Pair, ), ::toTriple @@ -108,7 +115,7 @@ constructor( private fun listenForDreamingLockscreenHostedToPrimaryBouncer() { scope.launch { keyguardInteractor.primaryBouncerShowing - .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(startedKeyguardTransitionStep, ::Pair) .collect { (isBouncerShowing, lastStartedTransitionStep) -> if ( isBouncerShowing && @@ -123,7 +130,7 @@ constructor( private fun listenForDreamingLockscreenHostedToGone() { scope.launch { keyguardInteractor.biometricUnlockState - .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(startedKeyguardTransitionStep, ::Pair) .collect { (biometricUnlockState, lastStartedTransitionStep) -> if ( lastStartedTransitionStep.to == KeyguardState.DREAMING_LOCKSCREEN_HOSTED && @@ -137,11 +144,7 @@ constructor( private fun listenForDreamingLockscreenHostedToDozing() { scope.launch { - combine( - keyguardInteractor.dozeTransitionModel, - transitionInteractor.startedKeyguardTransitionStep, - ::Pair - ) + combine(keyguardInteractor.dozeTransitionModel, startedKeyguardTransitionStep, ::Pair) .collect { (dozeTransitionModel, lastStartedTransitionStep) -> if ( dozeTransitionModel.to == DozeStateModel.DOZE && 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 7fdcf2f09bc1..13ffd6396cda 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 @@ -19,7 +19,8 @@ package com.android.systemui.keyguard.domain.interactor import android.animation.ValueAnimator import com.android.app.animation.Interpolators import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.BiometricUnlockModel import com.android.systemui.keyguard.shared.model.DozeStateModel @@ -28,6 +29,7 @@ import com.android.systemui.util.kotlin.Utils.Companion.toTriple import com.android.systemui.util.kotlin.sample import javax.inject.Inject import kotlin.time.Duration.Companion.milliseconds +import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.combine import kotlinx.coroutines.launch @@ -37,12 +39,17 @@ class FromDreamingTransitionInteractor @Inject constructor( override val transitionRepository: KeyguardTransitionRepository, - override val transitionInteractor: KeyguardTransitionInteractor, - @Application private val scope: CoroutineScope, + transitionInteractor: KeyguardTransitionInteractor, + @Background private val scope: CoroutineScope, + @Background bgDispatcher: CoroutineDispatcher, + @Main mainDispatcher: CoroutineDispatcher, private val keyguardInteractor: KeyguardInteractor, ) : TransitionInteractor( fromState = KeyguardState.DREAMING, + transitionInteractor = transitionInteractor, + mainDispatcher = mainDispatcher, + bgDispatcher = bgDispatcher, ) { override fun start() { @@ -66,7 +73,7 @@ constructor( private fun listenForDreamingToOccluded() { scope.launch { combine(keyguardInteractor.isKeyguardOccluded, keyguardInteractor.isDreaming, ::Pair) - .sample(transitionInteractor.startedKeyguardTransitionStep, ::toTriple) + .sample(startedKeyguardTransitionStep, ::toTriple) .collect { (isOccluded, isDreaming, lastStartedTransition) -> if ( isOccluded && @@ -82,7 +89,7 @@ constructor( private fun listenForDreamingToGone() { scope.launch { keyguardInteractor.biometricUnlockState - .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(startedKeyguardTransitionStep, ::Pair) .collect { (biometricUnlockState, lastStartedTransitionStep) -> if ( lastStartedTransitionStep.to == KeyguardState.DREAMING && @@ -96,11 +103,7 @@ constructor( private fun listenForDreamingToAodOrDozing() { scope.launch { - combine( - keyguardInteractor.dozeTransitionModel, - transitionInteractor.finishedKeyguardState, - ::Pair - ) + combine(keyguardInteractor.dozeTransitionModel, finishedKeyguardState, ::Pair) .collect { (dozeTransitionModel, keyguardState) -> if (keyguardState == KeyguardState.DREAMING) { if (dozeTransitionModel.to == DozeStateModel.DOZE) { @@ -123,6 +126,7 @@ constructor( } companion object { + const val TAG = "FromDreamingTransitionInteractor" private val DEFAULT_DURATION = 500.milliseconds val TO_LOCKSCREEN_DURATION = 1167.milliseconds } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractor.kt index 70c2e6d56ca3..19fd7f9168e7 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromGlanceableHubTransitionInteractor.kt @@ -20,18 +20,29 @@ import android.animation.ValueAnimator import com.android.app.animation.Interpolators import com.android.systemui.Flags import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.KeyguardState import javax.inject.Inject import kotlin.time.Duration.Companion.milliseconds +import kotlinx.coroutines.CoroutineDispatcher @SysUISingleton class FromGlanceableHubTransitionInteractor @Inject constructor( override val transitionRepository: KeyguardTransitionRepository, - override val transitionInteractor: KeyguardTransitionInteractor, -) : TransitionInteractor(fromState = KeyguardState.GLANCEABLE_HUB) { + transitionInteractor: KeyguardTransitionInteractor, + @Main mainDispatcher: CoroutineDispatcher, + @Background bgDispatcher: CoroutineDispatcher, +) : + TransitionInteractor( + fromState = KeyguardState.GLANCEABLE_HUB, + transitionInteractor = transitionInteractor, + mainDispatcher = mainDispatcher, + bgDispatcher = bgDispatcher, + ) { override fun start() { if (!Flags.communalHub()) { return 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 62a0b0ebc08c..742790eeaedb 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 @@ -19,7 +19,8 @@ package com.android.systemui.keyguard.domain.interactor import android.animation.ValueAnimator import com.android.app.animation.Interpolators import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.TransitionModeOnCanceled @@ -28,6 +29,7 @@ import com.android.systemui.util.kotlin.Utils.Companion.toTriple import com.android.systemui.util.kotlin.sample import javax.inject.Inject import kotlin.time.Duration.Companion.milliseconds +import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.combine import kotlinx.coroutines.launch @@ -37,13 +39,18 @@ class FromGoneTransitionInteractor @Inject constructor( override val transitionRepository: KeyguardTransitionRepository, - override val transitionInteractor: KeyguardTransitionInteractor, - @Application private val scope: CoroutineScope, + transitionInteractor: KeyguardTransitionInteractor, + @Background private val scope: CoroutineScope, + @Background bgDispatcher: CoroutineDispatcher, + @Main mainDispatcher: CoroutineDispatcher, private val keyguardInteractor: KeyguardInteractor, private val powerInteractor: PowerInteractor, ) : TransitionInteractor( fromState = KeyguardState.GONE, + transitionInteractor = transitionInteractor, + mainDispatcher = mainDispatcher, + bgDispatcher = bgDispatcher, ) { override fun start() { @@ -57,7 +64,7 @@ constructor( private fun listenForGoneToLockscreen() { scope.launch { keyguardInteractor.isKeyguardShowing - .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(startedKeyguardTransitionStep, ::Pair) .collect { (isKeyguardShowing, lastStartedStep) -> if (isKeyguardShowing && lastStartedStep.to == KeyguardState.GONE) { startTransitionTo(KeyguardState.LOCKSCREEN) @@ -69,7 +76,7 @@ constructor( private fun listenForGoneToDreamingLockscreenHosted() { scope.launch { keyguardInteractor.isActiveDreamLockscreenHosted - .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(startedKeyguardTransitionStep, ::Pair) .collect { (isActiveDreamLockscreenHosted, lastStartedStep) -> if (isActiveDreamLockscreenHosted && lastStartedStep.to == KeyguardState.GONE) { startTransitionTo(KeyguardState.DREAMING_LOCKSCREEN_HOSTED) @@ -83,7 +90,7 @@ constructor( keyguardInteractor.isAbleToDream .sample( combine( - transitionInteractor.startedKeyguardTransitionStep, + startedKeyguardTransitionStep, keyguardInteractor.isActiveDreamLockscreenHosted, ::Pair ), @@ -106,7 +113,7 @@ constructor( powerInteractor.isAsleep .sample( combine( - transitionInteractor.startedKeyguardTransitionStep, + startedKeyguardTransitionStep, keyguardInteractor.isAodAvailable, ::Pair ), 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 cecc6537e16e..2d0baa8be1b4 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 @@ -18,9 +18,9 @@ package com.android.systemui.keyguard.domain.interactor import android.animation.ValueAnimator import com.android.app.animation.Interpolators -import com.android.app.tracing.coroutines.launch import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository @@ -39,20 +39,25 @@ import dagger.Lazy import java.util.UUID import javax.inject.Inject import kotlin.time.Duration.Companion.milliseconds +import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onStart +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext @SysUISingleton class FromLockscreenTransitionInteractor @Inject constructor( override val transitionRepository: KeyguardTransitionRepository, - override val transitionInteractor: KeyguardTransitionInteractor, - @Application private val scope: CoroutineScope, + transitionInteractor: KeyguardTransitionInteractor, + @Background private val scope: CoroutineScope, + @Background bgDispatcher: CoroutineDispatcher, + @Main mainDispatcher: CoroutineDispatcher, private val keyguardInteractor: KeyguardInteractor, private val flags: FeatureFlags, private val shadeRepository: ShadeRepository, @@ -61,6 +66,9 @@ constructor( ) : TransitionInteractor( fromState = KeyguardState.LOCKSCREEN, + transitionInteractor = transitionInteractor, + mainDispatcher = mainDispatcher, + bgDispatcher = bgDispatcher, ) { override fun start() { @@ -147,12 +155,12 @@ constructor( private fun listenForLockscreenToDreaming() { val invalidFromStates = setOf(KeyguardState.AOD, KeyguardState.DOZING) - scope.launch("$TAG#listenForLockscreenToDreaming") { + scope.launch { keyguardInteractor.isAbleToDream .sample( combine( - transitionInteractor.startedKeyguardTransitionStep, - transitionInteractor.finishedKeyguardState, + startedKeyguardTransitionStep, + finishedKeyguardState, keyguardInteractor.isActiveDreamLockscreenHosted, ::Triple ), @@ -180,9 +188,9 @@ constructor( } private fun listenForLockscreenToPrimaryBouncer() { - scope.launch("$TAG#listenForLockscreenToPrimaryBouncer") { + scope.launch { keyguardInteractor.primaryBouncerShowing - .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(startedKeyguardTransitionStep, ::Pair) .collect { pair -> val (isBouncerShowing, lastStartedTransitionStep) = pair if ( @@ -195,9 +203,9 @@ constructor( } private fun listenForLockscreenToAlternateBouncer() { - scope.launch("$TAG#listenForLockscreenToAlternateBouncer") { + scope.launch { keyguardInteractor.alternateBouncerShowing - .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(startedKeyguardTransitionStep, ::Pair) .collect { pair -> val (isAlternateBouncerShowing, lastStartedTransitionStep) = pair if ( @@ -213,11 +221,11 @@ constructor( /* Starts transitions when manually dragging up the bouncer from the lockscreen. */ private fun listenForLockscreenToPrimaryBouncerDragging() { var transitionId: UUID? = null - scope.launch("$TAG#listenForLockscreenToPrimaryBouncerDragging") { + scope.launch { shadeRepository.legacyShadeExpansion .sample( combine( - transitionInteractor.startedKeyguardTransitionStep, + startedKeyguardTransitionStep, keyguardInteractor.statusBarState, keyguardInteractor.isKeyguardUnlocked, ::Triple @@ -225,72 +233,74 @@ constructor( ::toQuad ) .collect { (shadeExpansion, keyguardState, statusBarState, isKeyguardUnlocked) -> - val id = transitionId - if (id != null) { - if (keyguardState.to == KeyguardState.PRIMARY_BOUNCER) { - // An existing `id` means a transition is started, and calls to - // `updateTransition` will control it until FINISHED or CANCELED - var nextState = - if (shadeExpansion == 0f) { - TransitionState.FINISHED - } else if (shadeExpansion == 1f) { - TransitionState.CANCELED - } else { - TransitionState.RUNNING + withContext(mainDispatcher) { + val id = transitionId + if (id != null) { + if (keyguardState.to == KeyguardState.PRIMARY_BOUNCER) { + // An existing `id` means a transition is started, and calls to + // `updateTransition` will control it until FINISHED or CANCELED + var nextState = + if (shadeExpansion == 0f) { + TransitionState.FINISHED + } else if (shadeExpansion == 1f) { + TransitionState.CANCELED + } else { + TransitionState.RUNNING + } + transitionRepository.updateTransition( + id, + 1f - shadeExpansion, + nextState, + ) + + if ( + nextState == TransitionState.CANCELED || + nextState == TransitionState.FINISHED + ) { + transitionId = null } - transitionRepository.updateTransition( - id, - 1f - shadeExpansion, - nextState, - ) + // If canceled, just put the state back + // TODO(b/278086361): This logic should happen in + // FromPrimaryBouncerInteractor. + if (nextState == TransitionState.CANCELED) { + transitionRepository.startTransition( + TransitionInfo( + ownerName = name, + from = KeyguardState.PRIMARY_BOUNCER, + to = KeyguardState.LOCKSCREEN, + animator = + getDefaultAnimatorForTransitionsToState( + KeyguardState.LOCKSCREEN + ) + .apply { duration = 0 } + ) + ) + } + } + } else { + // TODO (b/251849525): Remove statusbarstate check when that state is + // integrated into KeyguardTransitionRepository if ( - nextState == TransitionState.CANCELED || - nextState == TransitionState.FINISHED + keyguardState.to == KeyguardState.LOCKSCREEN && + shadeRepository.legacyShadeTracking.value && + !isKeyguardUnlocked && + statusBarState == KEYGUARD ) { - transitionId = null - } - - // If canceled, just put the state back - // TODO(b/278086361): This logic should happen in - // FromPrimaryBouncerInteractor. - if (nextState == TransitionState.CANCELED) { - transitionRepository.startTransition( - TransitionInfo( - ownerName = name, - from = KeyguardState.PRIMARY_BOUNCER, - to = KeyguardState.LOCKSCREEN, - animator = - getDefaultAnimatorForTransitionsToState( - KeyguardState.LOCKSCREEN - ) - .apply { duration = 0 } + transitionId = + startTransitionTo( + toState = KeyguardState.PRIMARY_BOUNCER, + animator = null, // transition will be manually controlled ) - ) } } - } else { - // TODO (b/251849525): Remove statusbarstate check when that state is - // integrated into KeyguardTransitionRepository - if ( - keyguardState.to == KeyguardState.LOCKSCREEN && - shadeRepository.legacyShadeTracking.value && - !isKeyguardUnlocked && - statusBarState == KEYGUARD - ) { - transitionId = - startTransitionTo( - toState = KeyguardState.PRIMARY_BOUNCER, - animator = null, // transition will be manually controlled - ) - } } } } } fun dismissKeyguard() { - startTransitionTo(KeyguardState.GONE) + scope.launch { startTransitionTo(KeyguardState.GONE) } } private fun listenForLockscreenToGone() { @@ -298,9 +308,9 @@ constructor( return } - scope.launch("$TAG#listenForLockscreenToGone") { + scope.launch { keyguardInteractor.isKeyguardGoingAway - .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(startedKeyguardTransitionStep, ::Pair) .collect { pair -> val (isKeyguardGoingAway, lastStartedStep) = pair if (isKeyguardGoingAway && lastStartedStep.to == KeyguardState.LOCKSCREEN) { @@ -315,9 +325,9 @@ constructor( return } - scope.launch("$TAG#listenForLockscreenToGoneDragging") { + scope.launch { keyguardInteractor.isKeyguardGoingAway - .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(startedKeyguardTransitionStep, ::Pair) .collect { pair -> val (isKeyguardGoingAway, lastStartedStep) = pair if (isKeyguardGoingAway && lastStartedStep.to == KeyguardState.LOCKSCREEN) { @@ -328,23 +338,22 @@ constructor( } private fun listenForLockscreenToOccluded() { - scope.launch("$TAG#listenForLockscreenToOccluded") { - keyguardInteractor.isKeyguardOccluded - .sample(transitionInteractor.startedKeyguardState, ::Pair) - .collect { (isOccluded, keyguardState) -> - if (isOccluded && keyguardState == KeyguardState.LOCKSCREEN) { - startTransitionTo(KeyguardState.OCCLUDED) - } + scope.launch { + keyguardInteractor.isKeyguardOccluded.sample(startedKeyguardState, ::Pair).collect { + (isOccluded, keyguardState) -> + if (isOccluded && keyguardState == KeyguardState.LOCKSCREEN) { + startTransitionTo(KeyguardState.OCCLUDED) } + } } } private fun listenForLockscreenToAodOrDozing() { - scope.launch("$TAG#listenForLockscreenToAodOrDozing") { + scope.launch { powerInteractor.isAsleep .sample( combine( - transitionInteractor.startedKeyguardTransitionStep, + startedKeyguardTransitionStep, keyguardInteractor.isAodAvailable, ::Pair ), 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 6a8555cb7f6b..40061f410456 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 @@ -19,7 +19,8 @@ package com.android.systemui.keyguard.domain.interactor import android.animation.ValueAnimator import com.android.app.animation.Interpolators import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.power.domain.interactor.PowerInteractor @@ -27,6 +28,7 @@ import com.android.systemui.util.kotlin.Utils.Companion.toTriple import com.android.systemui.util.kotlin.sample import javax.inject.Inject import kotlin.time.Duration.Companion.milliseconds +import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.combine import kotlinx.coroutines.launch @@ -36,13 +38,18 @@ class FromOccludedTransitionInteractor @Inject constructor( override val transitionRepository: KeyguardTransitionRepository, - override val transitionInteractor: KeyguardTransitionInteractor, - @Application private val scope: CoroutineScope, + transitionInteractor: KeyguardTransitionInteractor, + @Background private val scope: CoroutineScope, + @Background bgDispatcher: CoroutineDispatcher, + @Main mainDispatcher: CoroutineDispatcher, private val keyguardInteractor: KeyguardInteractor, private val powerInteractor: PowerInteractor, ) : TransitionInteractor( fromState = KeyguardState.OCCLUDED, + transitionInteractor = transitionInteractor, + mainDispatcher = mainDispatcher, + bgDispatcher = bgDispatcher, ) { override fun start() { @@ -57,7 +64,7 @@ constructor( private fun listenForOccludedToPrimaryBouncer() { scope.launch { keyguardInteractor.primaryBouncerShowing - .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(startedKeyguardTransitionStep, ::Pair) .collect { (isBouncerShowing, lastStartedTransitionStep) -> if ( isBouncerShowing && lastStartedTransitionStep.to == KeyguardState.OCCLUDED @@ -70,13 +77,12 @@ constructor( private fun listenForOccludedToDreaming() { scope.launch { - keyguardInteractor.isAbleToDream - .sample(transitionInteractor.finishedKeyguardState, ::Pair) - .collect { (isAbleToDream, keyguardState) -> - if (isAbleToDream && keyguardState == KeyguardState.OCCLUDED) { - startTransitionTo(KeyguardState.DREAMING) - } + keyguardInteractor.isAbleToDream.sample(finishedKeyguardState, ::Pair).collect { + (isAbleToDream, keyguardState) -> + if (isAbleToDream && keyguardState == KeyguardState.OCCLUDED) { + startTransitionTo(KeyguardState.DREAMING) } + } } } @@ -86,7 +92,7 @@ constructor( .sample( combine( keyguardInteractor.isKeyguardShowing, - transitionInteractor.startedKeyguardTransitionStep, + startedKeyguardTransitionStep, ::Pair ), ::toTriple @@ -111,7 +117,7 @@ constructor( .sample( combine( keyguardInteractor.isKeyguardShowing, - transitionInteractor.startedKeyguardTransitionStep, + startedKeyguardTransitionStep, ::Pair ), ::toTriple @@ -135,7 +141,7 @@ constructor( powerInteractor.isAsleep .sample( combine( - transitionInteractor.startedKeyguardTransitionStep, + startedKeyguardTransitionStep, keyguardInteractor.isAodAvailable, ::Pair ), @@ -154,7 +160,7 @@ constructor( private fun listenForOccludedToAlternateBouncer() { scope.launch { keyguardInteractor.alternateBouncerShowing - .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(startedKeyguardTransitionStep, ::Pair) .collect { (isAlternateBouncerShowing, lastStartedTransitionStep) -> if ( isAlternateBouncerShowing && @@ -183,6 +189,7 @@ constructor( } companion object { + const val TAG = "FromOccludedTransitionInteractor" private val DEFAULT_DURATION = 500.milliseconds val TO_LOCKSCREEN_DURATION = 933.milliseconds val TO_AOD_DURATION = DEFAULT_DURATION 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 5f246e181c26..c62055f83517 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 @@ -19,7 +19,8 @@ package com.android.systemui.keyguard.domain.interactor import android.animation.ValueAnimator import com.android.keyguard.KeyguardSecurityModel import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository @@ -35,6 +36,7 @@ import com.android.systemui.util.kotlin.sample import com.android.wm.shell.animation.Interpolators import javax.inject.Inject import kotlin.time.Duration.Companion.milliseconds +import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine @@ -47,8 +49,10 @@ class FromPrimaryBouncerTransitionInteractor @Inject constructor( override val transitionRepository: KeyguardTransitionRepository, - override val transitionInteractor: KeyguardTransitionInteractor, - @Application private val scope: CoroutineScope, + transitionInteractor: KeyguardTransitionInteractor, + @Background private val scope: CoroutineScope, + @Background bgDispatcher: CoroutineDispatcher, + @Main mainDispatcher: CoroutineDispatcher, private val keyguardInteractor: KeyguardInteractor, private val flags: FeatureFlags, private val keyguardSecurityModel: KeyguardSecurityModel, @@ -57,6 +61,9 @@ constructor( ) : TransitionInteractor( fromState = KeyguardState.PRIMARY_BOUNCER, + transitionInteractor = transitionInteractor, + mainDispatcher = mainDispatcher, + bgDispatcher = bgDispatcher, ) { override fun start() { @@ -115,7 +122,7 @@ constructor( .distinctUntilChanged() fun dismissPrimaryBouncer() { - startTransitionTo(KeyguardState.GONE) + scope.launch { startTransitionTo(KeyguardState.GONE) } } private fun listenForPrimaryBouncerToLockscreenOrOccluded() { @@ -124,7 +131,7 @@ constructor( .sample( combine( powerInteractor.isAwake, - transitionInteractor.startedKeyguardTransitionStep, + startedKeyguardTransitionStep, keyguardInteractor.isKeyguardOccluded, keyguardInteractor.isActiveDreamLockscreenHosted, ::toQuad @@ -158,7 +165,7 @@ constructor( .sample( combine( powerInteractor.isAsleep, - transitionInteractor.startedKeyguardTransitionStep, + startedKeyguardTransitionStep, keyguardInteractor.isAodAvailable, ::Triple ), @@ -185,7 +192,7 @@ constructor( .sample( combine( keyguardInteractor.isActiveDreamLockscreenHosted, - transitionInteractor.startedKeyguardTransitionStep, + startedKeyguardTransitionStep, ::Pair ), ::toTriple @@ -213,7 +220,7 @@ constructor( scope.launch { keyguardInteractor.isKeyguardGoingAway - .sample(transitionInteractor.startedKeyguardTransitionStep, ::Pair) + .sample(startedKeyguardTransitionStep, ::Pair) .collect { (isKeyguardGoingAway, lastStartedTransitionStep) -> if ( isKeyguardGoingAway && 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 d5ac2838a2f1..5c2df4581ff0 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 @@ -24,8 +24,11 @@ import com.android.systemui.keyguard.shared.model.TransitionInfo import com.android.systemui.keyguard.shared.model.TransitionModeOnCanceled import com.android.systemui.util.kotlin.sample import java.util.UUID +import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext /** * Each TransitionInteractor is responsible for determining under which conditions to notify @@ -40,14 +43,25 @@ import kotlinx.coroutines.launch */ sealed class TransitionInteractor( val fromState: KeyguardState, + val transitionInteractor: KeyguardTransitionInteractor, + val mainDispatcher: CoroutineDispatcher, + val bgDispatcher: CoroutineDispatcher, ) { val name = this::class.simpleName ?: "UnknownTransitionInteractor" - abstract val transitionRepository: KeyguardTransitionRepository - abstract val transitionInteractor: KeyguardTransitionInteractor abstract fun start() - fun startTransitionTo( + /* Use background dispatcher for all [KeyguardTransitionInteractor] flows. Necessary because + * the [sample] utility internally runs a collect on the Unconfined dispatcher, resulting + * in continuations on the main thread. We don't want that for classes that inherit from this. + */ + val startedKeyguardTransitionStep = + transitionInteractor.startedKeyguardTransitionStep.flowOn(bgDispatcher) + // The following are MutableSharedFlows, and do not require flowOn + val startedKeyguardState = transitionInteractor.startedKeyguardState + val finishedKeyguardState = transitionInteractor.finishedKeyguardState + + suspend fun startTransitionTo( toState: KeyguardState, animator: ValueAnimator? = getDefaultAnimatorForTransitionsToState(toState), modeOnCanceled: TransitionModeOnCanceled = TransitionModeOnCanceled.LAST_VALUE @@ -67,16 +81,17 @@ sealed class TransitionInteractor( ) return null } - - return transitionRepository.startTransition( - TransitionInfo( - name, - fromState, - toState, - animator, - modeOnCanceled, + return withContext(mainDispatcher) { + transitionRepository.startTransition( + TransitionInfo( + name, + fromState, + toState, + animator, + modeOnCanceled, + ) ) - ) + } } /** This signal may come in before the occlusion signal, and can provide a custom transition */ diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorTest.kt index 8e81185d6dcf..809947d2fec7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorTest.kt @@ -63,6 +63,8 @@ class FromPrimaryBouncerTransitionInteractorTest : KeyguardTransitionInteractorT transitionRepository = super.transitionRepository, transitionInteractor = super.transitionInteractor, scope = super.testScope.backgroundScope, + bgDispatcher = super.testDispatcher, + mainDispatcher = super.testDispatcher, keyguardInteractor = super.keyguardInteractor, flags = FakeFeatureFlags(), keyguardSecurityModel = mock(), 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 b8a8bdf06954..e531d44d5fdd 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 @@ -20,7 +20,6 @@ import android.app.StatusBarManager import androidx.test.filters.SmallTest import com.android.keyguard.KeyguardSecurityModel import com.android.keyguard.KeyguardSecurityModel.SecurityMode.PIN -import com.android.keyguard.TestScopeProvider import com.android.systemui.SysuiTestCase import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepository import com.android.systemui.flags.FakeFeatureFlags @@ -51,6 +50,7 @@ import com.android.systemui.util.mockito.withArgCaptor import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.cancelChildren +import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runCurrent @@ -109,7 +109,8 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { @Before fun setUp() { MockitoAnnotations.initMocks(this) - testScope = TestScopeProvider.getTestScope() + val testDispatcher = StandardTestDispatcher() + testScope = TestScope(testDispatcher) keyguardRepository = FakeKeyguardRepository() bouncerRepository = FakeKeyguardBouncerRepository() @@ -139,6 +140,8 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { fromLockscreenTransitionInteractor = FromLockscreenTransitionInteractor( scope = testScope, + bgDispatcher = testDispatcher, + mainDispatcher = testDispatcher, keyguardInteractor = keyguardInteractor, transitionRepository = transitionRepository, transitionInteractor = transitionInteractor, @@ -160,6 +163,8 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { fromPrimaryBouncerTransitionInteractor = FromPrimaryBouncerTransitionInteractor( scope = testScope, + bgDispatcher = testDispatcher, + mainDispatcher = testDispatcher, keyguardInteractor = keyguardInteractor, transitionRepository = transitionRepository, transitionInteractor = transitionInteractor, @@ -173,6 +178,8 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { fromDreamingTransitionInteractor = FromDreamingTransitionInteractor( scope = testScope, + bgDispatcher = testDispatcher, + mainDispatcher = testDispatcher, keyguardInteractor = keyguardInteractor, transitionRepository = transitionRepository, transitionInteractor = transitionInteractor, @@ -182,6 +189,8 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { fromDreamingLockscreenHostedTransitionInteractor = FromDreamingLockscreenHostedTransitionInteractor( scope = testScope, + bgDispatcher = testDispatcher, + mainDispatcher = testDispatcher, keyguardInteractor = keyguardInteractor, transitionRepository = transitionRepository, transitionInteractor = transitionInteractor, @@ -191,6 +200,8 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { fromAodTransitionInteractor = FromAodTransitionInteractor( scope = testScope, + bgDispatcher = testDispatcher, + mainDispatcher = testDispatcher, keyguardInteractor = keyguardInteractor, transitionRepository = transitionRepository, transitionInteractor = transitionInteractor, @@ -200,6 +211,8 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { fromGoneTransitionInteractor = FromGoneTransitionInteractor( scope = testScope, + bgDispatcher = testDispatcher, + mainDispatcher = testDispatcher, keyguardInteractor = keyguardInteractor, transitionRepository = transitionRepository, transitionInteractor = transitionInteractor, @@ -210,6 +223,8 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { fromDozingTransitionInteractor = FromDozingTransitionInteractor( scope = testScope, + bgDispatcher = testDispatcher, + mainDispatcher = testDispatcher, keyguardInteractor = keyguardInteractor, transitionRepository = transitionRepository, transitionInteractor = transitionInteractor, @@ -220,6 +235,8 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { fromOccludedTransitionInteractor = FromOccludedTransitionInteractor( scope = testScope, + bgDispatcher = testDispatcher, + mainDispatcher = testDispatcher, keyguardInteractor = keyguardInteractor, transitionRepository = transitionRepository, transitionInteractor = transitionInteractor, @@ -230,6 +247,8 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { fromAlternateBouncerTransitionInteractor = FromAlternateBouncerTransitionInteractor( scope = testScope, + bgDispatcher = testDispatcher, + mainDispatcher = testDispatcher, keyguardInteractor = keyguardInteractor, transitionRepository = transitionRepository, transitionInteractor = transitionInteractor, diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java index 437d00ac8723..5d663d2d9dc6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java @@ -216,6 +216,8 @@ public class NotificationShadeWindowControllerImplTest extends SysuiTestCase { keyguardTransitionRepository, keyguardTransitionInteractor, mTestScope.getBackgroundScope(), + mUtils.getTestDispatcher(), + mUtils.getTestDispatcher(), keyguardInteractor, featureFlags, shadeRepository, @@ -234,6 +236,8 @@ public class NotificationShadeWindowControllerImplTest extends SysuiTestCase { keyguardTransitionRepository, keyguardTransitionInteractor, mTestScope.getBackgroundScope(), + mUtils.getTestDispatcher(), + mUtils.getTestDispatcher(), keyguardInteractor, featureFlags, mKeyguardSecurityModel, diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerBaseTest.java index 39051eba3ad9..982787b7e9a9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/QuickSettingsControllerBaseTest.java @@ -251,6 +251,8 @@ public class QuickSettingsControllerBaseTest extends SysuiTestCase { keyguardTransitionRepository, keyguardTransitionInteractor, mTestScope.getBackgroundScope(), + mUtils.getTestDispatcher(), + mUtils.getTestDispatcher(), keyguardInteractor, featureFlags, mShadeRepository, @@ -269,6 +271,8 @@ public class QuickSettingsControllerBaseTest extends SysuiTestCase { keyguardTransitionRepository, keyguardTransitionInteractor, mTestScope.getBackgroundScope(), + mUtils.getTestDispatcher(), + mUtils.getTestDispatcher(), keyguardInteractor, featureFlags, mock(KeyguardSecurityModel.class), diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt index aed616349eb3..83590ee83bda 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/StatusBarStateControllerImplTest.kt @@ -79,6 +79,7 @@ class StatusBarStateControllerImplTest : SysuiTestCase() { private val utils = SceneTestUtils(this) private val testScope = utils.testScope + private val testDispatcher = utils.testDispatcher private lateinit var shadeInteractor: ShadeInteractor private lateinit var fromLockscreenTransitionInteractor: FromLockscreenTransitionInteractor private lateinit var fromPrimaryBouncerTransitionInteractor: @@ -143,6 +144,8 @@ class StatusBarStateControllerImplTest : SysuiTestCase() { keyguardTransitionRepository, keyguardTransitionInteractor, testScope.backgroundScope, + testDispatcher, + testDispatcher, keyguardInteractor, featureFlags, shadeRepository, @@ -162,6 +165,8 @@ class StatusBarStateControllerImplTest : SysuiTestCase() { keyguardTransitionRepository, keyguardTransitionInteractor, testScope.backgroundScope, + testDispatcher, + testDispatcher, keyguardInteractor, featureFlags, mock(), diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java index b7529a82dd3d..048120ad0b95 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java @@ -444,6 +444,8 @@ public class BubblesTest extends SysuiTestCase { keyguardTransitionRepository, keyguardTransitionInteractor, mTestScope.getBackgroundScope(), + mUtils.getTestDispatcher(), + mUtils.getTestDispatcher(), keyguardInteractor, featureFlags, shadeRepository, @@ -462,6 +464,8 @@ public class BubblesTest extends SysuiTestCase { keyguardTransitionRepository, keyguardTransitionInteractor, mTestScope.getBackgroundScope(), + mUtils.getTestDispatcher(), + mUtils.getTestDispatcher(), keyguardInteractor, featureFlags, mock(KeyguardSecurityModel.class), diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/CoroutineTestScopeModule.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/CoroutineTestScopeModule.kt index e24ba265e260..c2dc67319fff 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/CoroutineTestScopeModule.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/CoroutineTestScopeModule.kt @@ -48,6 +48,9 @@ private constructor( @get:[Provides Application] val appScope: CoroutineScope = scope.backgroundScope + @get:[Provides Background] + val bgScope: CoroutineScope = scope.backgroundScope + @Module interface Bindings { @Binds @Main fun bindMainContext(dispatcher: TestDispatcher): CoroutineContext diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorKosmos.kt index b03d0b822161..b1a0b67d6648 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorKosmos.kt @@ -20,6 +20,7 @@ import com.android.systemui.flags.featureFlagsClassic import com.android.systemui.keyguard.data.repository.keyguardTransitionRepository import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope +import com.android.systemui.kosmos.testDispatcher import com.android.systemui.power.domain.interactor.powerInteractor import com.android.systemui.shade.data.repository.shadeRepository import dagger.Lazy @@ -30,6 +31,8 @@ val Kosmos.fromLockscreenTransitionInteractor by transitionRepository = keyguardTransitionRepository, transitionInteractor = keyguardTransitionInteractor, scope = applicationCoroutineScope, + bgDispatcher = testDispatcher, + mainDispatcher = testDispatcher, keyguardInteractor = keyguardInteractor, flags = featureFlagsClassic, shadeRepository = shadeRepository, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorKosmos.kt index ade3e1a82297..97536e20cb0a 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractorKosmos.kt @@ -21,6 +21,7 @@ import com.android.systemui.flags.featureFlagsClassic import com.android.systemui.keyguard.data.repository.keyguardTransitionRepository import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope +import com.android.systemui.kosmos.testDispatcher import com.android.systemui.power.domain.interactor.powerInteractor import com.android.systemui.user.domain.interactor.selectedUserInteractor @@ -30,6 +31,8 @@ val Kosmos.fromPrimaryBouncerTransitionInteractor by transitionRepository = keyguardTransitionRepository, transitionInteractor = keyguardTransitionInteractor, scope = applicationCoroutineScope, + bgDispatcher = testDispatcher, + mainDispatcher = testDispatcher, keyguardInteractor = keyguardInteractor, flags = featureFlagsClassic, keyguardSecurityModel = keyguardSecurityModel, |