diff options
80 files changed, 1209 insertions, 1087 deletions
diff --git a/packages/SystemUI/src/com/android/keyguard/FaceWakeUpTriggersConfig.kt b/packages/SystemUI/src/com/android/keyguard/FaceWakeUpTriggersConfig.kt index 6a170a506fc4..84a6b098f239 100644 --- a/packages/SystemUI/src/com/android/keyguard/FaceWakeUpTriggersConfig.kt +++ b/packages/SystemUI/src/com/android/keyguard/FaceWakeUpTriggersConfig.kt @@ -24,7 +24,7 @@ import com.android.systemui.res.R import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dump.DumpManager -import com.android.systemui.keyguard.shared.model.WakeSleepReason +import com.android.systemui.power.shared.model.WakeSleepReason import com.android.systemui.util.settings.GlobalSettings import java.io.PrintWriter import java.util.stream.Collectors diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java index 931ba6d97c58..4b23795ae90c 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java @@ -55,9 +55,9 @@ import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor; -import com.android.systemui.keyguard.shared.model.ScreenModel; -import com.android.systemui.keyguard.shared.model.ScreenState; +import com.android.systemui.power.shared.model.ScreenPowerState; import com.android.systemui.plugins.ClockController; +import com.android.systemui.power.domain.interactor.PowerInteractor; import com.android.systemui.statusbar.notification.AnimatableProperty; import com.android.systemui.statusbar.notification.PropertyAnimator; import com.android.systemui.statusbar.notification.stack.AnimationProperties; @@ -68,13 +68,13 @@ import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.util.ViewController; -import kotlin.coroutines.CoroutineContext; -import kotlin.coroutines.EmptyCoroutineContext; - import java.io.PrintWriter; import javax.inject.Inject; +import kotlin.coroutines.CoroutineContext; +import kotlin.coroutines.EmptyCoroutineContext; + /** * Injectable controller for {@link KeyguardStatusView}. */ @@ -101,6 +101,7 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV private final InteractionJankMonitor mInteractionJankMonitor; private final Rect mClipBounds = new Rect(); private final KeyguardInteractor mKeyguardInteractor; + private final PowerInteractor mPowerInteractor; private Boolean mSplitShadeEnabled = false; private Boolean mStatusViewCentered = true; @@ -134,7 +135,8 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV FeatureFlags featureFlags, InteractionJankMonitor interactionJankMonitor, KeyguardInteractor keyguardInteractor, - DumpManager dumpManager) { + DumpManager dumpManager, + PowerInteractor powerInteractor) { super(keyguardStatusView); mKeyguardSliceViewController = keyguardSliceViewController; mKeyguardClockSwitchController = keyguardClockSwitchController; @@ -147,6 +149,7 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV mFeatureFlags = featureFlags; mDumpManager = dumpManager; mKeyguardInteractor = keyguardInteractor; + mPowerInteractor = powerInteractor; } @Override @@ -207,9 +210,9 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV dozeTimeTick(); }, context); - collectFlow(mView, mKeyguardInteractor.getScreenModel(), - (ScreenModel model) -> { - if (model.getState() == ScreenState.SCREEN_TURNING_ON) { + collectFlow(mView, mPowerInteractor.getScreenPowerState(), + (ScreenPowerState powerState) -> { + if (powerState == ScreenPowerState.SCREEN_TURNING_ON) { dozeTimeTick(); } }, context); diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java index f6add9c66f7c..a1f0e7723597 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java @@ -76,11 +76,13 @@ import com.android.systemui.SystemUIApplication; import com.android.systemui.dagger.qualifiers.Application; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; +import com.android.systemui.power.shared.model.ScreenPowerState; import com.android.systemui.keyguard.ui.binder.KeyguardSurfaceBehindParamsApplier; import com.android.systemui.keyguard.ui.binder.KeyguardSurfaceBehindViewBinder; import com.android.systemui.keyguard.ui.binder.WindowManagerLockscreenVisibilityViewBinder; import com.android.systemui.keyguard.ui.viewmodel.KeyguardSurfaceBehindViewModel; import com.android.systemui.keyguard.ui.viewmodel.WindowManagerLockscreenVisibilityViewModel; +import com.android.systemui.power.domain.interactor.PowerInteractor; import com.android.systemui.settings.DisplayTracker; import com.android.wm.shell.transition.ShellTransitions; import com.android.wm.shell.transition.Transitions; @@ -105,6 +107,7 @@ public class KeyguardService extends Service { private final ScreenOnCoordinator mScreenOnCoordinator; private final ShellTransitions mShellTransitions; private final DisplayTracker mDisplayTracker; + private PowerInteractor mPowerInteractor; private static int newModeToLegacyMode(int newMode) { switch (newMode) { @@ -309,7 +312,8 @@ public class KeyguardService extends Service { KeyguardSurfaceBehindViewModel keyguardSurfaceBehindViewModel, KeyguardSurfaceBehindParamsApplier keyguardSurfaceBehindAnimator, @Application CoroutineScope scope, - FeatureFlags featureFlags) { + FeatureFlags featureFlags, + PowerInteractor powerInteractor) { super(); mKeyguardViewMediator = keyguardViewMediator; mKeyguardLifecyclesDispatcher = keyguardLifecyclesDispatcher; @@ -317,6 +321,7 @@ public class KeyguardService extends Service { mShellTransitions = shellTransitions; mDisplayTracker = displayTracker; mFlags = featureFlags; + mPowerInteractor = powerInteractor; if (mFlags.isEnabled(Flags.KEYGUARD_WM_STATE_REFACTOR)) { WindowManagerLockscreenVisibilityViewBinder.bind( @@ -451,6 +456,7 @@ public class KeyguardService extends Service { checkPermission(); mKeyguardViewMediator.onStartedGoingToSleep( WindowManagerPolicyConstants.translateSleepReasonToOffReason(pmSleepReason)); + mPowerInteractor.onStartedGoingToSleep(pmSleepReason); mKeyguardLifecyclesDispatcher.dispatch( KeyguardLifecyclesDispatcher.STARTED_GOING_TO_SLEEP, pmSleepReason); } @@ -464,6 +470,7 @@ public class KeyguardService extends Service { mKeyguardViewMediator.onFinishedGoingToSleep( WindowManagerPolicyConstants.translateSleepReasonToOffReason(pmSleepReason), cameraGestureTriggered); + mPowerInteractor.onFinishedGoingToSleep(cameraGestureTriggered); mKeyguardLifecyclesDispatcher.dispatch( KeyguardLifecyclesDispatcher.FINISHED_GOING_TO_SLEEP); } @@ -476,6 +483,7 @@ public class KeyguardService extends Service { Trace.beginSection("KeyguardService.mBinder#onStartedWakingUp"); checkPermission(); mKeyguardViewMediator.onStartedWakingUp(pmWakeReason, cameraGestureTriggered); + mPowerInteractor.onStartedWakingUp(pmWakeReason, cameraGestureTriggered); mKeyguardLifecyclesDispatcher.dispatch( KeyguardLifecyclesDispatcher.STARTED_WAKING_UP, pmWakeReason); Trace.endSection(); @@ -486,6 +494,7 @@ public class KeyguardService extends Service { trace("onFinishedWakingUp"); Trace.beginSection("KeyguardService.mBinder#onFinishedWakingUp"); checkPermission(); + mPowerInteractor.onFinishedWakingUp(); mKeyguardLifecyclesDispatcher.dispatch(KeyguardLifecyclesDispatcher.FINISHED_WAKING_UP); Trace.endSection(); } @@ -495,6 +504,7 @@ public class KeyguardService extends Service { trace("onScreenTurningOn"); Trace.beginSection("KeyguardService.mBinder#onScreenTurningOn"); checkPermission(); + mPowerInteractor.onScreenPowerStateUpdated(ScreenPowerState.SCREEN_TURNING_ON); mKeyguardLifecyclesDispatcher.dispatch(KeyguardLifecyclesDispatcher.SCREEN_TURNING_ON, callback); @@ -530,6 +540,7 @@ public class KeyguardService extends Service { trace("onScreenTurnedOn"); Trace.beginSection("KeyguardService.mBinder#onScreenTurnedOn"); checkPermission(); + mPowerInteractor.onScreenPowerStateUpdated(ScreenPowerState.SCREEN_ON); mKeyguardLifecyclesDispatcher.dispatch(KeyguardLifecyclesDispatcher.SCREEN_TURNED_ON); mScreenOnCoordinator.onScreenTurnedOn(); Trace.endSection(); @@ -539,6 +550,7 @@ public class KeyguardService extends Service { public void onScreenTurningOff() { trace("onScreenTurningOff"); checkPermission(); + mPowerInteractor.onScreenPowerStateUpdated(ScreenPowerState.SCREEN_TURNING_OFF); mKeyguardLifecyclesDispatcher.dispatch(KeyguardLifecyclesDispatcher.SCREEN_TURNING_OFF); } @@ -546,6 +558,7 @@ public class KeyguardService extends Service { public void onScreenTurnedOff() { trace("onScreenTurnedOff"); checkPermission(); + mPowerInteractor.onScreenPowerStateUpdated(ScreenPowerState.SCREEN_OFF); mKeyguardViewMediator.onScreenTurnedOff(); mKeyguardLifecyclesDispatcher.dispatch(KeyguardLifecyclesDispatcher.SCREEN_TURNED_OFF); mScreenOnCoordinator.onScreenTurnedOff(); diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ResourceTrimmer.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ResourceTrimmer.kt index 039460d8fdae..c52ca68ee37f 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ResourceTrimmer.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ResourceTrimmer.kt @@ -30,15 +30,15 @@ import com.android.systemui.flags.Flags import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.shared.model.TransitionState -import com.android.systemui.keyguard.shared.model.WakefulnessState +import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.utils.GlobalWindowManager -import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch +import javax.inject.Inject /** * Releases cached resources on allocated by keyguard. @@ -52,6 +52,7 @@ class ResourceTrimmer @Inject constructor( private val keyguardInteractor: KeyguardInteractor, + private val powerInteractor: PowerInteractor, private val keyguardTransitionInteractor: KeyguardTransitionInteractor, private val globalWindowManager: GlobalWindowManager, @Application private val applicationScope: CoroutineScope, @@ -70,7 +71,7 @@ constructor( val isDozingFully = keyguardInteractor.dozeAmount.map { it == 1f }.distinctUntilChanged() combine( - keyguardInteractor.wakefulnessModel.map { it.state }, + powerInteractor.isAsleep, keyguardInteractor.isDreaming, isDozingFully, ::Triple @@ -106,9 +107,9 @@ constructor( @WorkerThread private fun onWakefulnessUpdated( - wakefulness: WakefulnessState, - isDreaming: Boolean, - isDozingFully: Boolean + isAsleep: Boolean, + isDreaming: Boolean, + isDozingFully: Boolean ) { if (!featureFlags.isEnabled(Flags.TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK)) { return @@ -117,7 +118,7 @@ constructor( if (DEBUG) { Log.d( LOG_TAG, - "Wakefulness: $wakefulness Dreaming: $isDreaming DozeAmount: $isDozingFully" + "isAsleep: $isAsleep Dreaming: $isDreaming DozeAmount: $isDozingFully" ) } // There are three scenarios: @@ -127,9 +128,9 @@ constructor( // to 1f // * AoD - where we go to ASLEEP with iDreaming = true and dozeAmount slowly increases // to 1f - val dozeDisabledAndScreenOff = wakefulness == WakefulnessState.ASLEEP && !isDreaming + val dozeDisabledAndScreenOff = isAsleep && !isDreaming val dozeEnabledAndDozeAnimationCompleted = - wakefulness == WakefulnessState.ASLEEP && isDreaming && isDozingFully + isAsleep && isDreaming && isDozingFully if (dozeDisabledAndScreenOff || dozeEnabledAndDozeAnimationCompleted) { Trace.beginSection("ResourceTrimmer#trimMemory") Log.d(LOG_TAG, "SysUI asleep, trimming memory.") diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ScreenLifecycle.java b/packages/SystemUI/src/com/android/systemui/keyguard/ScreenLifecycle.java index 8535eda93f96..633628f1167e 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ScreenLifecycle.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ScreenLifecycle.java @@ -20,6 +20,7 @@ import android.os.Trace; import com.android.systemui.Dumpable; import com.android.systemui.dump.DumpManager; +import com.android.systemui.power.domain.interactor.PowerInteractor; import java.io.PrintWriter; @@ -28,8 +29,11 @@ import javax.inject.Singleton; /** * Tracks the screen lifecycle. + * + * @deprecated Collect flows from {@link PowerInteractor} instead. */ @Singleton +@Deprecated public class ScreenLifecycle extends Lifecycle<ScreenLifecycle.Observer> implements Dumpable { public static final int SCREEN_OFF = 0; diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/WakefulnessLifecycle.java b/packages/SystemUI/src/com/android/systemui/keyguard/WakefulnessLifecycle.java index d5316cd40801..4f02f75df25f 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/WakefulnessLifecycle.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/WakefulnessLifecycle.java @@ -33,6 +33,7 @@ import com.android.systemui.Dumpable; import com.android.systemui.res.R; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dump.DumpManager; +import com.android.systemui.power.domain.interactor.PowerInteractor; import com.android.systemui.util.time.SystemClock; import java.io.PrintWriter; @@ -43,8 +44,11 @@ import javax.inject.Inject; /** * Tracks the wakefulness lifecycle, including why we're waking or sleeping. + * + * @deprecated Collect flows from {@link PowerInteractor} instead. */ @SysUISingleton +@Deprecated public class WakefulnessLifecycle extends Lifecycle<WakefulnessLifecycle.Observer> implements Dumpable { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt index fd048ff11f14..3cdff76881ee 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt @@ -24,7 +24,6 @@ import com.android.internal.logging.InstanceId import com.android.internal.logging.UiEventLogger import com.android.keyguard.FaceAuthUiEvent import com.android.systemui.Dumpable -import com.android.systemui.res.R import com.android.systemui.biometrics.domain.interactor.DisplayStateInteractor import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLogging @@ -51,14 +50,12 @@ import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.log.FaceAuthenticationLogger import com.android.systemui.log.SessionTracker import com.android.systemui.log.table.TableLogBuffer +import com.android.systemui.power.domain.interactor.PowerInteractor +import com.android.systemui.res.R import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.user.data.model.SelectionStatus import com.android.systemui.user.data.repository.UserRepository import com.google.errorprone.annotations.CompileTimeConstant -import java.io.PrintWriter -import java.util.Arrays -import java.util.stream.Collectors -import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job @@ -81,6 +78,10 @@ import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import java.io.PrintWriter +import java.util.Arrays +import java.util.stream.Collectors +import javax.inject.Inject /** * API to run face authentication and detection for device entry / on keyguard (as opposed to the @@ -151,6 +152,7 @@ constructor( private val deviceEntryFingerprintAuthRepository: DeviceEntryFingerprintAuthRepository, trustRepository: TrustRepository, private val keyguardRepository: KeyguardRepository, + private val powerInteractor: PowerInteractor, private val keyguardInteractor: KeyguardInteractor, private val alternateBouncerInteractor: AlternateBouncerInteractor, @FaceDetectTableLog private val faceDetectLog: TableLogBuffer, @@ -316,7 +318,7 @@ constructor( // Clear auth status when keyguard is going away or when the user is switching or device // starts going to sleep. merge( - keyguardRepository.wakefulness.map { it.isStartingToSleepOrAsleep() }, + powerInteractor.isAsleep, if (featureFlags.isEnabled(Flags.KEYGUARD_WM_STATE_REFACTOR)) { keyguardTransitionInteractor.isInTransitionToState(KeyguardState.GONE) } else { @@ -366,13 +368,13 @@ constructor( return arrayOf( Pair( and( - displayStateInteractor.isDefaultDisplayOff, - keyguardRepository.wakefulness.map { it.isAwake() }, - ) - .isFalse(), + displayStateInteractor.isDefaultDisplayOff, + keyguardTransitionInteractor.isFinishedInStateWhere( + KeyguardState::deviceIsAwakeInState), + ).isFalse(), // this can happen if an app is requesting for screen off, the display can // turn off without wakefulness.isStartingToSleepOrAsleep calls - "displayIsNotOffWhileAwake", + "displayIsNotOffWhileFullyTransitionedToAwake", ), Pair( biometricSettingsRepository.isFaceAuthEnrolledAndEnabled, @@ -380,8 +382,8 @@ constructor( ), Pair(keyguardRepository.isKeyguardGoingAway.isFalse(), "keyguardNotGoingAway"), Pair( - keyguardRepository.wakefulness.map { it.isStartingToSleep() }.isFalse(), - "deviceNotStartingToSleep" + powerInteractor.isAsleep.isFalse(), + "deviceNotAsleep" ), Pair( keyguardInteractor.isSecureCameraActive diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt index 36b93cdf6217..a4a312656039 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt @@ -32,7 +32,6 @@ import com.android.systemui.doze.DozeTransitionCallback import com.android.systemui.doze.DozeTransitionListener import com.android.systemui.dreams.DreamOverlayCallbackController import com.android.systemui.keyguard.ScreenLifecycle -import com.android.systemui.keyguard.WakefulnessLifecycle import com.android.systemui.keyguard.shared.model.BiometricUnlockModel import com.android.systemui.keyguard.shared.model.BiometricUnlockSource import com.android.systemui.keyguard.shared.model.DismissAction @@ -40,9 +39,7 @@ import com.android.systemui.keyguard.shared.model.DozeStateModel import com.android.systemui.keyguard.shared.model.DozeTransitionModel import com.android.systemui.keyguard.shared.model.KeyguardDone import com.android.systemui.keyguard.shared.model.KeyguardRootViewVisibilityState -import com.android.systemui.keyguard.shared.model.ScreenModel import com.android.systemui.keyguard.shared.model.StatusBarState -import com.android.systemui.keyguard.shared.model.WakefulnessModel import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.statusbar.phone.BiometricUnlockController import com.android.systemui.statusbar.phone.BiometricUnlockController.WakeAndUnlockMode @@ -160,12 +157,6 @@ interface KeyguardRepository { /** Observable for the [StatusBarState] */ val statusBarState: StateFlow<StatusBarState> - /** Observable for device wake/sleep state */ - val wakefulness: StateFlow<WakefulnessModel> - - /** Observable for device screen state */ - val screenModel: StateFlow<ScreenModel> - /** Observable for biometric unlock modes */ val biometricUnlockState: Flow<BiometricUnlockModel> @@ -249,7 +240,6 @@ class KeyguardRepositoryImpl @Inject constructor( statusBarStateController: StatusBarStateController, - wakefulnessLifecycle: WakefulnessLifecycle, screenLifecycle: ScreenLifecycle, biometricUnlockController: BiometricUnlockController, private val keyguardStateController: KeyguardStateController, @@ -542,85 +532,6 @@ constructor( awaitClose { biometricUnlockController.removeListener(callback) } } - override val wakefulness: StateFlow<WakefulnessModel> = - conflatedCallbackFlow { - val observer = - object : WakefulnessLifecycle.Observer { - override fun onStartedWakingUp() { - dispatchNewState() - } - - override fun onFinishedWakingUp() { - dispatchNewState() - } - - override fun onPostFinishedWakingUp() { - dispatchNewState() - } - - override fun onStartedGoingToSleep() { - dispatchNewState() - } - - override fun onFinishedGoingToSleep() { - dispatchNewState() - } - - private fun dispatchNewState() { - trySendWithFailureLogging( - WakefulnessModel.fromWakefulnessLifecycle(wakefulnessLifecycle), - TAG, - "updated wakefulness state", - ) - } - } - - wakefulnessLifecycle.addObserver(observer) - awaitClose { wakefulnessLifecycle.removeObserver(observer) } - } - .stateIn( - scope, - // Use Eagerly so that we're always listening and never miss an event. - SharingStarted.Eagerly, - initialValue = WakefulnessModel.fromWakefulnessLifecycle(wakefulnessLifecycle), - ) - - override val screenModel: StateFlow<ScreenModel> = - conflatedCallbackFlow { - val observer = - object : ScreenLifecycle.Observer { - override fun onScreenTurningOn() { - dispatchNewState() - } - override fun onScreenTurnedOn() { - dispatchNewState() - } - override fun onScreenTurningOff() { - dispatchNewState() - } - override fun onScreenTurnedOff() { - dispatchNewState() - } - - private fun dispatchNewState() { - trySendWithFailureLogging( - ScreenModel.fromScreenLifecycle(screenLifecycle), - TAG, - "updated screen state", - ) - } - } - - screenLifecycle.addObserver(observer) - awaitClose { screenLifecycle.removeObserver(observer) } - } - .stateIn( - scope, - // Use Eagerly so that we're always listening and never miss an event. - SharingStarted.Eagerly, - initialValue = ScreenModel.fromScreenLifecycle(screenLifecycle), - ) - override val fingerprintSensorLocation: Flow<Point?> = conflatedCallbackFlow { fun sendFpLocation() { trySendWithFailureLogging( diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/LightRevealScrimRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/LightRevealScrimRepository.kt index af01626c5c1d..54031dcc9525 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/LightRevealScrimRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/LightRevealScrimRepository.kt @@ -22,27 +22,28 @@ import android.content.Context import android.graphics.Point import androidx.core.animation.Animator import androidx.core.animation.ValueAnimator -import com.android.systemui.res.R import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.shared.model.BiometricUnlockModel import com.android.systemui.keyguard.shared.model.BiometricUnlockSource -import com.android.systemui.keyguard.shared.model.WakeSleepReason.TAP +import com.android.systemui.power.domain.interactor.PowerInteractor +import com.android.systemui.power.shared.model.WakeSleepReason +import com.android.systemui.power.shared.model.WakeSleepReason.TAP +import com.android.systemui.res.R import com.android.systemui.statusbar.CircleReveal import com.android.systemui.statusbar.LiftReveal import com.android.systemui.statusbar.LightRevealEffect import com.android.systemui.statusbar.PowerButtonReveal -import javax.inject.Inject -import kotlin.math.max import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged -import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map +import javax.inject.Inject +import kotlin.math.max val DEFAULT_REVEAL_EFFECT = LiftReveal @@ -70,6 +71,7 @@ class LightRevealScrimRepositoryImpl constructor( keyguardRepository: KeyguardRepository, val context: Context, + powerInteractor: PowerInteractor, ) : LightRevealScrimRepository { /** The reveal effect used if the device was locked/unlocked via the power button. */ @@ -118,15 +120,18 @@ constructor( /** The reveal effect we'll use for the next non-biometric unlock (tap, power button, etc). */ private val nonBiometricRevealEffect: Flow<LightRevealEffect?> = - keyguardRepository.wakefulness - .filter { it.isStartingToWake() || it.isStartingToSleep() } - .flatMapLatest { wakefulnessModel -> - when { - wakefulnessModel.isTransitioningFromPowerButton() -> powerButtonRevealEffect - wakefulnessModel.isWakingFrom(TAP) -> tapRevealEffect - else -> flowOf(LiftReveal) + powerInteractor + .detailedWakefulness + .flatMapLatest { wakefulnessModel -> + when { + wakefulnessModel.isAwakeOrAsleepFrom(WakeSleepReason.POWER_BUTTON) -> + powerButtonRevealEffect + wakefulnessModel.isAwakeFrom(TAP) -> + tapRevealEffect + else -> + flowOf(LiftReveal) + } } - } private val revealAmountAnimator = ValueAnimator.ofFloat(0f, 1f).apply { duration = 500 } 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 b05089028037..3ccf446fef59 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 @@ -21,17 +21,17 @@ 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.WakefulnessState +import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.util.kotlin.Utils.Companion.toQuad import com.android.systemui.util.kotlin.Utils.Companion.toQuint import com.android.systemui.util.kotlin.sample import com.android.wm.shell.animation.Interpolators -import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch +import javax.inject.Inject @SysUISingleton class FromAlternateBouncerTransitionInteractor @@ -41,6 +41,7 @@ constructor( override val transitionInteractor: KeyguardTransitionInteractor, @Application private val scope: CoroutineScope, private val keyguardInteractor: KeyguardInteractor, + private val powerInteractor: PowerInteractor, ) : TransitionInteractor( fromState = KeyguardState.ALTERNATE_BOUNCER, @@ -64,7 +65,7 @@ constructor( combine( keyguardInteractor.primaryBouncerShowing, transitionInteractor.startedKeyguardTransitionStep, - keyguardInteractor.wakefulnessModel, + powerInteractor.isAwake, keyguardInteractor.isAodAvailable, ::toQuad ), @@ -75,7 +76,7 @@ constructor( isAlternateBouncerShowing, isPrimaryBouncerShowing, lastStartedTransitionStep, - wakefulnessState, + isAwake, isAodAvailable) -> if ( !isAlternateBouncerShowing && @@ -83,10 +84,7 @@ constructor( lastStartedTransitionStep.to == KeyguardState.ALTERNATE_BOUNCER ) { val to = - if ( - wakefulnessState.state == WakefulnessState.STARTING_TO_SLEEP || - wakefulnessState.state == WakefulnessState.ASLEEP - ) { + if (!isAwake) { if (isAodAvailable) { KeyguardState.AOD } else { 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 518ae2f4fe7c..38eb730d1498 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 @@ -26,10 +26,10 @@ import com.android.systemui.keyguard.shared.model.DozeStateModel import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.util.kotlin.Utils.Companion.toTriple import com.android.systemui.util.kotlin.sample -import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.combine import kotlinx.coroutines.launch +import javax.inject.Inject @SysUISingleton class FromAodTransitionInteractor 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 712215f06472..e9719e7d584e 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,13 +23,14 @@ 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.power.domain.interactor.PowerInteractor 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.CoroutineScope import kotlinx.coroutines.flow.combine import kotlinx.coroutines.launch +import javax.inject.Inject +import kotlin.time.Duration.Companion.milliseconds @SysUISingleton class FromDozingTransitionInteractor @@ -39,6 +40,7 @@ constructor( override val transitionInteractor: KeyguardTransitionInteractor, @Application private val scope: CoroutineScope, private val keyguardInteractor: KeyguardInteractor, + private val powerInteractor: PowerInteractor, ) : TransitionInteractor( fromState = KeyguardState.DOZING, @@ -52,7 +54,7 @@ constructor( private fun listenForDozingToLockscreenOrOccluded() { scope.launch { - keyguardInteractor.wakefulnessModel + powerInteractor.isAwake .sample( combine( transitionInteractor.startedKeyguardTransitionStep, @@ -61,11 +63,8 @@ constructor( ), ::toTriple ) - .collect { (wakefulnessModel, lastStartedTransition, occluded) -> - if ( - wakefulnessModel.isStartingToWakeOrAwake() && - lastStartedTransition.to == KeyguardState.DOZING - ) { + .collect { (isAwake, lastStartedTransition, occluded) -> + if (isAwake && lastStartedTransition.to == KeyguardState.DOZING) { startTransitionTo( if (occluded) KeyguardState.OCCLUDED else KeyguardState.LOCKSCREEN ) 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 2b08b3d04e19..ad51e74090d9 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,7 +22,7 @@ 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.WakefulnessState +import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.util.kotlin.Utils.Companion.toTriple import com.android.systemui.util.kotlin.sample import javax.inject.Inject @@ -39,6 +39,7 @@ constructor( override val transitionInteractor: KeyguardTransitionInteractor, @Application private val scope: CoroutineScope, private val keyguardInteractor: KeyguardInteractor, + private val powerInteractor: PowerInteractor, ) : TransitionInteractor( fromState = KeyguardState.GONE, @@ -101,7 +102,7 @@ constructor( private fun listenForGoneToAodOrDozing() { scope.launch { - keyguardInteractor.wakefulnessModel + powerInteractor.isAsleep .sample( combine( transitionInteractor.startedKeyguardTransitionStep, @@ -110,11 +111,8 @@ constructor( ), ::toTriple ) - .collect { (wakefulnessState, lastStartedStep, isAodAvailable) -> - if ( - lastStartedStep.to == KeyguardState.GONE && - wakefulnessState.state == WakefulnessState.STARTING_TO_SLEEP - ) { + .collect { (isAsleep, lastStartedStep, isAodAvailable) -> + if (lastStartedStep.to == KeyguardState.GONE && isAsleep) { startTransitionTo( if (isAodAvailable) KeyguardState.AOD else KeyguardState.DOZING ) 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 8f3943133eb1..ffa1a4959878 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 @@ -28,14 +28,11 @@ import com.android.systemui.keyguard.shared.model.KeyguardSurfaceBehindModel import com.android.systemui.keyguard.shared.model.StatusBarState.KEYGUARD import com.android.systemui.keyguard.shared.model.TransitionInfo import com.android.systemui.keyguard.shared.model.TransitionState -import com.android.systemui.keyguard.shared.model.WakefulnessState +import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.shade.data.repository.ShadeRepository import com.android.systemui.util.kotlin.Utils.Companion.toQuad 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.Companion.milliseconds import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine @@ -43,6 +40,9 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.launch +import java.util.UUID +import javax.inject.Inject +import kotlin.time.Duration.Companion.milliseconds @SysUISingleton class FromLockscreenTransitionInteractor @@ -54,6 +54,7 @@ constructor( private val keyguardInteractor: KeyguardInteractor, private val flags: FeatureFlags, private val shadeRepository: ShadeRepository, + private val powerInteractor: PowerInteractor, ) : TransitionInteractor( fromState = KeyguardState.LOCKSCREEN, @@ -335,7 +336,7 @@ constructor( private fun listenForLockscreenToAodOrDozing() { scope.launch { - keyguardInteractor.wakefulnessModel + powerInteractor.isAsleep .sample( combine( transitionInteractor.startedKeyguardTransitionStep, @@ -344,11 +345,8 @@ constructor( ), ::toTriple ) - .collect { (wakefulnessState, lastStartedStep, isAodAvailable) -> - if ( - lastStartedStep.to == KeyguardState.LOCKSCREEN && - wakefulnessState.state == WakefulnessState.STARTING_TO_SLEEP - ) { + .collect { (isAsleep, lastStartedStep, isAodAvailable) -> + if (lastStartedStep.to == KeyguardState.LOCKSCREEN && isAsleep) { startTransitionTo( if (isAodAvailable) KeyguardState.AOD else KeyguardState.DOZING ) 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 714add461c16..dec38b504ee1 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,7 +22,7 @@ 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.WakefulnessState +import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.util.kotlin.Utils.Companion.toTriple import com.android.systemui.util.kotlin.sample import javax.inject.Inject @@ -39,6 +39,7 @@ constructor( override val transitionInteractor: KeyguardTransitionInteractor, @Application private val scope: CoroutineScope, private val keyguardInteractor: KeyguardInteractor, + private val powerInteractor: PowerInteractor, ) : TransitionInteractor( fromState = KeyguardState.OCCLUDED, @@ -131,7 +132,7 @@ constructor( private fun listenForOccludedToAodOrDozing() { scope.launch { - keyguardInteractor.wakefulnessModel + powerInteractor.isAsleep .sample( combine( transitionInteractor.startedKeyguardTransitionStep, @@ -140,10 +141,9 @@ constructor( ), ::toTriple ) - .collect { (wakefulnessState, lastStartedStep, isAodAvailable) -> + .collect { (isAsleep, lastStartedStep, isAodAvailable) -> if ( - lastStartedStep.to == KeyguardState.OCCLUDED && - wakefulnessState.state == WakefulnessState.STARTING_TO_SLEEP + lastStartedStep.to == KeyguardState.OCCLUDED && isAsleep ) { startTransitionTo( if (isAodAvailable) KeyguardState.AOD else KeyguardState.DOZING 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 143be1dfa760..ad2ec69b77ce 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 @@ -26,20 +26,20 @@ import com.android.systemui.flags.Flags import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.KeyguardSurfaceBehindModel -import com.android.systemui.keyguard.shared.model.WakefulnessState +import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.util.kotlin.Utils.Companion.toQuad import com.android.systemui.util.kotlin.Utils.Companion.toQuint import com.android.systemui.util.kotlin.Utils.Companion.toTriple 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.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.launch +import javax.inject.Inject +import kotlin.time.Duration.Companion.milliseconds @SysUISingleton class FromPrimaryBouncerTransitionInteractor @@ -51,6 +51,7 @@ constructor( private val keyguardInteractor: KeyguardInteractor, private val flags: FeatureFlags, private val keyguardSecurityModel: KeyguardSecurityModel, + private val powerInteractor: PowerInteractor, ) : TransitionInteractor( fromState = KeyguardState.PRIMARY_BOUNCER, @@ -120,7 +121,7 @@ constructor( keyguardInteractor.primaryBouncerShowing .sample( combine( - keyguardInteractor.wakefulnessModel, + powerInteractor.isAwake, transitionInteractor.startedKeyguardTransitionStep, keyguardInteractor.isKeyguardOccluded, keyguardInteractor.isActiveDreamLockscreenHosted, @@ -131,15 +132,14 @@ constructor( .collect { ( isBouncerShowing, - wakefulnessState, + isAwake, lastStartedTransitionStep, occluded, isActiveDreamLockscreenHosted) -> if ( !isBouncerShowing && lastStartedTransitionStep.to == KeyguardState.PRIMARY_BOUNCER && - (wakefulnessState.state == WakefulnessState.AWAKE || - wakefulnessState.state == WakefulnessState.STARTING_TO_WAKE) && + isAwake && !isActiveDreamLockscreenHosted ) { startTransitionTo( @@ -155,7 +155,7 @@ constructor( keyguardInteractor.primaryBouncerShowing .sample( combine( - keyguardInteractor.wakefulnessModel, + powerInteractor.isAsleep, transitionInteractor.startedKeyguardTransitionStep, keyguardInteractor.isAodAvailable, ::Triple @@ -163,13 +163,12 @@ constructor( ::toQuad ) .collect { - (isBouncerShowing, wakefulnessState, lastStartedTransitionStep, isAodAvailable) + (isBouncerShowing, isAsleep, lastStartedTransitionStep, isAodAvailable) -> if ( !isBouncerShowing && lastStartedTransitionStep.to == KeyguardState.PRIMARY_BOUNCER && - (wakefulnessState.state == WakefulnessState.STARTING_TO_SLEEP || - wakefulnessState.state == WakefulnessState.ASLEEP) + isAsleep ) { startTransitionTo( if (isAodAvailable) KeyguardState.AOD else KeyguardState.DOZING @@ -190,7 +189,9 @@ constructor( ), ::toTriple ) - .collect { (isBouncerShowing, isActiveDreamLockscreenHosted, lastStartedTransitionStep) -> + .collect { (isBouncerShowing, + isActiveDreamLockscreenHosted, + lastStartedTransitionStep) -> if ( !isBouncerShowing && isActiveDreamLockscreenHosted && diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt index 80634682c8cf..6e19fdbefab5 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt @@ -40,9 +40,8 @@ import com.android.systemui.keyguard.shared.model.DozeStateModel import com.android.systemui.keyguard.shared.model.DozeStateModel.Companion.isDozeOff import com.android.systemui.keyguard.shared.model.DozeTransitionModel import com.android.systemui.keyguard.shared.model.KeyguardRootViewVisibilityState -import com.android.systemui.keyguard.shared.model.ScreenModel import com.android.systemui.keyguard.shared.model.StatusBarState -import com.android.systemui.keyguard.shared.model.WakefulnessModel +import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.res.R import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.shared.flag.SceneContainerFlags @@ -50,8 +49,6 @@ import com.android.systemui.scene.shared.model.SceneKey import com.android.systemui.shade.data.repository.ShadeRepository import com.android.systemui.statusbar.CommandQueue import com.android.systemui.util.kotlin.sample -import javax.inject.Inject -import javax.inject.Provider import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.delay @@ -67,6 +64,8 @@ import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onStart +import javax.inject.Inject +import javax.inject.Provider /** * Encapsulates business-logic related to the keyguard but not to a more specific part within it. @@ -77,6 +76,7 @@ class KeyguardInteractor constructor( private val repository: KeyguardRepository, private val commandQueue: CommandQueue, + private val powerInteractor: PowerInteractor, featureFlags: FeatureFlags, sceneContainerFlags: SceneContainerFlags, deviceEntryRepository: DeviceEntryRepository, @@ -137,12 +137,6 @@ constructor( awaitClose { commandQueue.removeCallback(callback) } } - /** The device wake/sleep state */ - val wakefulnessModel: StateFlow<WakefulnessModel> = repository.wakefulness - - /** The device screen state */ - val screenModel: StateFlow<ScreenModel> = repository.screenModel - /** * Dozing and dreaming have overlapping events. If the doze state remains in FINISH, it means * that doze mode is not running and DREAMING is ok to commence. @@ -154,8 +148,8 @@ constructor( .combine(dozeTransitionModel) { isDreaming, dozeTransitionModel -> isDreaming && isDozeOff(dozeTransitionModel.to) } - .sample(wakefulnessModel) { isAbleToDream, wakefulnessModel -> - isAbleToDream && wakefulnessModel.isStartingToWakeOrAwake() + .sample(powerInteractor.isAwake) { isAbleToDream, isAwake -> + isAbleToDream && isAwake } .flatMapLatest { isAbleToDream -> flow { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardKeyEventInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardKeyEventInteractor.kt index 635961b0ea01..d69876292024 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardKeyEventInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardKeyEventInteractor.kt @@ -24,6 +24,7 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyevent.domain.interactor.KeyEventInteractor.Companion.handleAction import com.android.systemui.media.controls.util.MediaSessionLegacyHelperWrapper import com.android.systemui.plugins.statusbar.StatusBarStateController +import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.shade.ShadeController import com.android.systemui.statusbar.StatusBarState import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager @@ -41,6 +42,7 @@ constructor( private val shadeController: ShadeController, private val mediaSessionLegacyHelperWrapper: MediaSessionLegacyHelperWrapper, private val backActionInteractor: BackActionInteractor, + private val powerInteractor: PowerInteractor, ) { fun dispatchKeyEvent(event: KeyEvent): Boolean { @@ -86,7 +88,7 @@ constructor( private fun dispatchMenuKeyEvent(): Boolean { val shouldUnlockOnMenuPressed = - isDeviceInteractive() && + isDeviceAwake() && (statusBarStateController.state != StatusBarState.SHADE) && statusBarKeyguardViewManager.shouldDismissOnMenuPressed() if (shouldUnlockOnMenuPressed) { @@ -97,7 +99,7 @@ constructor( } private fun dispatchSpaceEvent(): Boolean { - if (isDeviceInteractive() && statusBarStateController.state != StatusBarState.SHADE) { + if (isDeviceAwake() && statusBarStateController.state != StatusBarState.SHADE) { shadeController.animateCollapseShadeForced() return true } @@ -111,7 +113,7 @@ constructor( return true } - private fun isDeviceInteractive(): Boolean { - return keyguardInteractor.wakefulnessModel.value.isDeviceInteractive() + private fun isDeviceAwake(): Boolean { + return powerInteractor.detailedWakefulness.value.isAwake() } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionAuditLogger.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionAuditLogger.kt index 0dc16e9e296c..419524fe7730 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionAuditLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionAuditLogger.kt @@ -20,6 +20,7 @@ import com.android.keyguard.logging.KeyguardLogger import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.log.core.LogLevel.VERBOSE +import com.android.systemui.power.domain.interactor.PowerInteractor import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @@ -35,11 +36,12 @@ constructor( private val interactor: KeyguardTransitionInteractor, private val keyguardInteractor: KeyguardInteractor, private val logger: KeyguardLogger, + private val powerInteractor: PowerInteractor, ) { fun start() { scope.launch { - keyguardInteractor.wakefulnessModel.collect { + powerInteractor.detailedWakefulness.collect { logger.log(TAG, VERBOSE, "WakefulnessModel", it) } } 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 93826183a183..1c43609aa551 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 @@ -34,7 +34,6 @@ import com.android.systemui.keyguard.shared.model.KeyguardState.OFF import com.android.systemui.keyguard.shared.model.KeyguardState.PRIMARY_BOUNCER import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.keyguard.shared.model.TransitionStep -import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted @@ -44,6 +43,7 @@ import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.stateIn +import javax.inject.Inject /** Encapsulates business-logic related to the keyguard transitions. */ @SysUISingleton @@ -176,6 +176,7 @@ constructor( .map { step -> step.to } .stateIn(scope, SharingStarted.Eagerly, LOCKSCREEN) + /** * Whether we're currently in a transition to a new [KeyguardState] and haven't yet completed * it. @@ -244,4 +245,80 @@ constructor( startedStep.to == state && finishedState != state } } -} + + /** + * Whether we're in a transition to a [KeyguardState] that matches the given predicate, but + * haven't yet completed it. + */ + fun isInTransitionToStateWhere( + stateMatcher: (KeyguardState) -> Boolean, + ): Flow<Boolean> { + return combine( + startedKeyguardTransitionStep, + finishedKeyguardState, + ) { startedStep, finishedState -> + stateMatcher(startedStep.to) && finishedState != startedStep.from + } + } + + /** + * Whether we're in a transition out of the given [KeyguardState], but haven't yet completed it. + */ + fun isInTransitionFromState( + state: KeyguardState, + ): Flow<Boolean> { + return combine( + startedKeyguardTransitionStep, + finishedKeyguardState, + ) { startedStep, finishedState -> + startedStep.from == state && finishedState != state + } + } + + /** + * Whether we're in a transition out of a [KeyguardState] that matches the given predicate, but + * haven't yet completed it. + */ + fun isInTransitionFromStateWhere( + stateMatcher: (KeyguardState) -> Boolean, + ): Flow<Boolean> { + return combine( + startedKeyguardTransitionStep, + finishedKeyguardState, + ) { startedStep, finishedState -> + stateMatcher(startedStep.from) && finishedState != startedStep.from + } + } + + /** + * Whether we're in a transition between two [KeyguardState]s that match the given predicates, + * but haven't yet completed it. + */ + fun isInTransitionWhere( + fromStatePredicate: (KeyguardState) -> Boolean, + toStatePredicate: (KeyguardState) -> Boolean, + ): Flow<Boolean> { + return combine( + startedKeyguardTransitionStep, + finishedKeyguardState, + ) { startedStep, finishedState -> + fromStatePredicate(startedStep.from) + && toStatePredicate(startedStep.to) + && finishedState != startedStep.from + } + } + + /** + * Whether we've FINISHED a transition to a state that matches the given predicate. + */ + fun isFinishedInStateWhere(stateMatcher: (KeyguardState) -> Boolean): Flow<Boolean> { + return finishedKeyguardState.map { stateMatcher(it) } + } + + /** + * Whether we've FINISHED a transition to a state that matches the given predicate. + */ + fun isFinishedInState(state: KeyguardState) : Flow<Boolean> { + return finishedKeyguardState.map { it == state } + } +}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/SystemUIKeyguardFaceAuthInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/SystemUIKeyguardFaceAuthInteractor.kt index 20e55e527fc2..ef1d5ac2a6d4 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/SystemUIKeyguardFaceAuthInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/SystemUIKeyguardFaceAuthInteractor.kt @@ -22,7 +22,6 @@ import com.android.keyguard.FaceAuthUiEvent import com.android.keyguard.FaceWakeUpTriggersConfig import com.android.keyguard.KeyguardUpdateMonitor import com.android.systemui.CoreStartable -import com.android.systemui.res.R import com.android.systemui.biometrics.data.repository.FacePropertyRepository import com.android.systemui.biometrics.shared.model.LockoutMode import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor @@ -32,7 +31,6 @@ import com.android.systemui.dagger.qualifiers.Application 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.BiometricSettingsRepository import com.android.systemui.keyguard.data.repository.DeviceEntryFaceAuthRepository import com.android.systemui.keyguard.data.repository.DeviceEntryFingerprintAuthRepository import com.android.systemui.keyguard.data.repository.KeyguardRepository @@ -40,11 +38,12 @@ import com.android.systemui.keyguard.shared.model.ErrorFaceAuthenticationStatus import com.android.systemui.keyguard.shared.model.FaceAuthenticationStatus import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.log.FaceAuthenticationLogger +import com.android.systemui.power.domain.interactor.PowerInteractor +import com.android.systemui.res.R import com.android.systemui.user.data.model.SelectionStatus import com.android.systemui.user.data.repository.UserRepository import com.android.systemui.util.kotlin.pairwise import com.android.systemui.util.kotlin.sample -import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow @@ -57,6 +56,7 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.yield +import javax.inject.Inject /** * Encapsulates business logic related face authentication being triggered for device entry from @@ -81,6 +81,7 @@ constructor( private val facePropertyRepository: FacePropertyRepository, private val keyguardRepository: KeyguardRepository, private val faceWakeUpTriggersConfig: FaceWakeUpTriggersConfig, + private val powerInteractor: PowerInteractor, ) : CoreStartable, KeyguardFaceAuthInteractor { private val listeners: MutableList<FaceAuthenticationListener> = mutableListOf() @@ -123,7 +124,7 @@ constructor( keyguardTransitionInteractor.dozingToLockscreenTransition ) .filter { it.transitionState == TransitionState.STARTED } - .sample(keyguardRepository.wakefulness) + .sample(powerInteractor.detailedWakefulness) .filter { wakefulnessModel -> val validWakeupReason = faceWakeUpTriggersConfig.shouldTriggerFaceAuthOnWakeUpFrom( diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/WindowManagerLockscreenVisibilityInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/WindowManagerLockscreenVisibilityInteractor.kt index 96bfdc600a71..49af66406296 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/WindowManagerLockscreenVisibilityInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/WindowManagerLockscreenVisibilityInteractor.kt @@ -128,7 +128,7 @@ constructor( // even though the lastFinishedState is still GONE (lockscreenVisibility=false). if (finishedState == startedStep.to) finishedState else startedStep.from } - .map(::isLockscreenVisible) + .map(KeyguardState::lockscreenVisibleInState) .distinctUntilChanged() /** @@ -152,11 +152,7 @@ constructor( companion object { fun isSurfaceVisible(state: KeyguardState): Boolean { - return !isLockscreenVisible(state) - } - - fun isLockscreenVisible(state: KeyguardState): Boolean { - return state != KeyguardState.GONE + return !KeyguardState.lockscreenVisibleInState(state) } } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/KeyguardState.kt b/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/KeyguardState.kt index 1e20cdbed9eb..cae6147b03ee 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/KeyguardState.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/KeyguardState.kt @@ -71,5 +71,40 @@ enum class KeyguardState { /* * An activity is displaying over the keyguard. */ - OCCLUDED, -} + OCCLUDED; + + companion object { + + /** Whether the lockscreen is visible when we're FINISHED in the given state. */ + fun lockscreenVisibleInState(state: KeyguardState): Boolean { + return state != GONE + } + + /** + * Whether the device is awake ([PowerInteractor.isAwake]) when we're FINISHED in the given + * keyguard state. + */ + fun deviceIsAwakeInState(state: KeyguardState): Boolean { + return when (state) { + OFF -> false + DOZING -> false + DREAMING -> false + DREAMING_LOCKSCREEN_HOSTED -> false + AOD -> false + ALTERNATE_BOUNCER -> true + PRIMARY_BOUNCER -> true + LOCKSCREEN -> true + GONE -> true + OCCLUDED -> true + } + } + + /** + * Whether the device is awake ([PowerInteractor.isAsleep]) when we're FINISHED in the given + * keyguard state. + */ + fun deviceIsAsleepInState(state: KeyguardState): Boolean { + return !deviceIsAwakeInState(state) + } + } +}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/ScreenModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/ScreenModel.kt deleted file mode 100644 index 80a1b75c4350..000000000000 --- a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/ScreenModel.kt +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License - */ -package com.android.systemui.keyguard.shared.model - -import com.android.systemui.keyguard.ScreenLifecycle - -/** Model device screen lifecycle states. */ -data class ScreenModel( - val state: ScreenState, -) { - companion object { - fun fromScreenLifecycle(screenLifecycle: ScreenLifecycle): ScreenModel { - return ScreenModel(ScreenState.fromScreenLifecycleInt(screenLifecycle.getScreenState())) - } - } -} diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/WakefulnessModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/WakefulnessModel.kt deleted file mode 100644 index 2a5beaffcfa0..000000000000 --- a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/WakefulnessModel.kt +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License - */ -package com.android.systemui.keyguard.shared.model - -import com.android.systemui.keyguard.WakefulnessLifecycle -import com.android.systemui.keyguard.shared.model.WakeSleepReason.GESTURE -import com.android.systemui.keyguard.shared.model.WakeSleepReason.POWER_BUTTON -import com.android.systemui.keyguard.shared.model.WakeSleepReason.TAP -import com.android.systemui.keyguard.shared.model.WakefulnessState.ASLEEP -import com.android.systemui.keyguard.shared.model.WakefulnessState.AWAKE -import com.android.systemui.keyguard.shared.model.WakefulnessState.STARTING_TO_SLEEP -import com.android.systemui.keyguard.shared.model.WakefulnessState.STARTING_TO_WAKE - -/** Model device wakefulness states. */ -data class WakefulnessModel( - val state: WakefulnessState, - val lastWakeReason: WakeSleepReason, - val lastSleepReason: WakeSleepReason, -) { - fun isStartingToWake() = state == STARTING_TO_WAKE - - fun isStartingToSleep() = state == STARTING_TO_SLEEP - - private fun isAsleep() = state == ASLEEP - - fun isAwake() = state == AWAKE - - fun isStartingToWakeOrAwake() = isStartingToWake() || isAwake() - - fun isStartingToSleepOrAsleep() = isStartingToSleep() || isAsleep() - - fun isDeviceInteractive() = !isAsleep() - - fun isWakingFrom(wakeSleepReason: WakeSleepReason) = - isStartingToWake() && lastWakeReason == wakeSleepReason - - fun isStartingToSleepFrom(wakeSleepReason: WakeSleepReason) = - isStartingToSleep() && lastSleepReason == wakeSleepReason - - fun isTransitioningFromPowerButton() = - isStartingToSleepFrom(POWER_BUTTON) || isWakingFrom(POWER_BUTTON) - - fun isDeviceInteractiveFromTapOrGesture(): Boolean { - return isDeviceInteractive() && (lastWakeReason == TAP || lastWakeReason == GESTURE) - } - - companion object { - fun fromWakefulnessLifecycle(wakefulnessLifecycle: WakefulnessLifecycle): WakefulnessModel { - return WakefulnessModel( - WakefulnessState.fromWakefulnessLifecycleInt(wakefulnessLifecycle.wakefulness), - WakeSleepReason.fromPowerManagerWakeReason(wakefulnessLifecycle.lastWakeReason), - WakeSleepReason.fromPowerManagerSleepReason(wakefulnessLifecycle.lastSleepReason), - ) - } - } -} diff --git a/packages/SystemUI/src/com/android/systemui/log/FaceAuthenticationLogger.kt b/packages/SystemUI/src/com/android/systemui/log/FaceAuthenticationLogger.kt index 66af36a71d38..8c5690b312ec 100644 --- a/packages/SystemUI/src/com/android/systemui/log/FaceAuthenticationLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/log/FaceAuthenticationLogger.kt @@ -5,10 +5,10 @@ import android.hardware.face.FaceSensorPropertiesInternal import com.android.keyguard.FaceAuthUiEvent import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.shared.model.ErrorFaceAuthenticationStatus -import com.android.systemui.keyguard.shared.model.WakeSleepReason -import com.android.systemui.keyguard.shared.model.WakefulnessModel import com.android.systemui.log.core.LogLevel.DEBUG import com.android.systemui.log.dagger.FaceAuthLog +import com.android.systemui.power.shared.model.WakeSleepReason +import com.android.systemui.power.shared.model.WakefulnessModel import com.google.errorprone.annotations.CompileTimeConstant import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/power/data/repository/PowerRepository.kt b/packages/SystemUI/src/com/android/systemui/power/data/repository/PowerRepository.kt index b2a87197371d..934f31040ce1 100644 --- a/packages/SystemUI/src/com/android/systemui/power/data/repository/PowerRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/power/data/repository/PowerRepository.kt @@ -27,21 +27,60 @@ import com.android.systemui.common.coroutine.ChannelExt.trySendWithFailureLoggin import com.android.systemui.common.coroutine.ConflatedCallbackFlow.conflatedCallbackFlow import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.power.shared.model.ScreenPowerState +import com.android.systemui.power.shared.model.WakeSleepReason +import com.android.systemui.power.shared.model.WakefulnessModel +import com.android.systemui.power.shared.model.WakefulnessState import com.android.systemui.util.time.SystemClock -import javax.inject.Inject import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import javax.inject.Inject /** Defines interface for classes that act as source of truth for power-related data. */ interface PowerRepository { /** Whether the device is interactive. Starts with the current state. */ val isInteractive: Flow<Boolean> + /** + * Whether the device is awake or asleep. [WakefulnessState.AWAKE] means the screen is fully + * powered on, and the user can interact with the device. [WakefulnessState.ASLEEP] means the + * screen is either off, or in low-power always-on-display mode - in either case, the user + * cannot interact with the device and will need to wake it up somehow if they wish to do so. + */ + val wakefulness: StateFlow<WakefulnessModel> + + /** + * The physical on/off state of the display. [ScreenPowerState.SCREEN_OFF] means the display is + * unpowered and nothing is visible. [ScreenPowerState.SCREEN_ON] means the display is either + * fully powered on, or it's in low-power always-on-display (AOD) mode showing the time and + * other info. + * + * YOU PROBABLY DO NOT WANT TO USE THIS STATE. Almost all System UI use cases for screen state + * expect that the screen would be considered "off" if we're on AOD, which is not the case for + * [screenPowerState]. Consider [wakefulness] instead. + */ + val screenPowerState: StateFlow<ScreenPowerState> + /** Wakes up the device. */ fun wakeUp(why: String, @PowerManager.WakeReason wakeReason: Int) /** Notifies the power repository that a user touch happened. */ fun userTouch() + + /** Updates the wakefulness state, keeping previous values by default. */ + fun updateWakefulness( + rawState: WakefulnessState = wakefulness.value.internalWakefulnessState, + lastWakeReason: WakeSleepReason = wakefulness.value.lastWakeReason, + lastSleepReason: WakeSleepReason = wakefulness.value.lastSleepReason, + powerButtonLaunchGestureTriggered: Boolean = + wakefulness.value.powerButtonLaunchGestureTriggered, + ) + + /** Updates the screen power state. */ + fun setScreenPowerState(state: ScreenPowerState) } @SysUISingleton @@ -78,6 +117,31 @@ constructor( awaitClose { dispatcher.unregisterReceiver(receiver) } } + private val _wakefulness = MutableStateFlow(WakefulnessModel()) + override val wakefulness = _wakefulness.asStateFlow() + + override fun updateWakefulness( + rawState: WakefulnessState, + lastWakeReason: WakeSleepReason, + lastSleepReason: WakeSleepReason, + powerButtonLaunchGestureTriggered: Boolean, + ) { + _wakefulness.value = + WakefulnessModel( + rawState, + lastWakeReason, + lastSleepReason, + powerButtonLaunchGestureTriggered, + ) + } + + private val _screenPowerState = MutableStateFlow(ScreenPowerState.SCREEN_OFF) + override val screenPowerState = _screenPowerState.asStateFlow() + + override fun setScreenPowerState(state: ScreenPowerState) { + _screenPowerState.value = state + } + override fun wakeUp(why: String, wakeReason: Int) { manager.wakeUp( systemClock.uptimeMillis(), diff --git a/packages/SystemUI/src/com/android/systemui/power/domain/interactor/PowerInteractor.kt b/packages/SystemUI/src/com/android/systemui/power/domain/interactor/PowerInteractor.kt index 16885ed4b1d5..dbd62fe16309 100644 --- a/packages/SystemUI/src/com/android/systemui/power/domain/interactor/PowerInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/power/domain/interactor/PowerInteractor.kt @@ -21,12 +21,16 @@ import android.os.PowerManager import com.android.systemui.classifier.FalsingCollector import com.android.systemui.classifier.FalsingCollectorActual import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.keyguard.data.repository.KeyguardRepository import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.power.data.repository.PowerRepository +import com.android.systemui.power.shared.model.ScreenPowerState +import com.android.systemui.power.shared.model.WakeSleepReason +import com.android.systemui.power.shared.model.WakefulnessState import com.android.systemui.statusbar.phone.ScreenOffAnimationController -import javax.inject.Inject import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.map +import javax.inject.Inject /** Hosts business logic for interacting with the power system. */ @SysUISingleton @@ -34,7 +38,6 @@ class PowerInteractor @Inject constructor( private val repository: PowerRepository, - private val keyguardRepository: KeyguardRepository, @FalsingCollectorActual private val falsingCollector: FalsingCollector, private val screenOffAnimationController: ScreenOffAnimationController, private val statusBarStateController: StatusBarStateController, @@ -43,6 +46,31 @@ constructor( val isInteractive: Flow<Boolean> = repository.isInteractive /** + * Whether we're awake or asleep, along with additional information about why we're awake/asleep + * and whether the power button gesture has been triggered (a special case that affects + * wakefulness). + * + * Unless you need to respond differently to different [WakeSleepReason]s, you should use + * [isAwake]. + */ + val detailedWakefulness = repository.wakefulness + + /** + * Whether we're awake (screen is on and responding to user touch) or asleep (screen is off, or + * on AOD). + */ + val isAwake = repository.wakefulness + .map { it.isAwake() } + .distinctUntilChanged(checkEquivalentUnlessEmitDuplicatesUnderTest) + + /** + * Helper flow in case "isAsleep" reads better than "!isAwake". + */ + val isAsleep = isAwake.map { !it } + + val screenPowerState = repository.screenPowerState + + /** * Wakes up the device if the device was dozing. * * @param why a string explaining why we're waking the device for debugging purposes. Should be @@ -63,11 +91,10 @@ constructor( * full-screen intent. */ fun wakeUpForFullScreenIntent() { - if ( - keyguardRepository.wakefulness.value.isStartingToSleep() || - statusBarStateController.isDozing - ) { - repository.wakeUp(why = FSI_WAKE_WHY, wakeReason = PowerManager.WAKE_REASON_APPLICATION) + if (repository.wakefulness.value.isAsleep() || statusBarStateController.isDozing) { + repository.wakeUp( + why = FSI_WAKE_WHY, + wakeReason = PowerManager.WAKE_REASON_APPLICATION) } } @@ -84,7 +111,163 @@ constructor( } } + /** + * Called from [KeyguardService] to inform us that the device has started waking up. This is the + * canonical source of wakefulness information for System UI. This method should not be called + * from anywhere else. + * + * In tests, you should be able to use [setAwakeForTest] rather than calling this method + * directly. + */ + fun onStartedWakingUp( + @PowerManager.WakeReason reason: Int, + powerButtonLaunchGestureTriggeredOnWakeUp: Boolean, + ) { + // If the launch gesture was previously detected, either via onCameraLaunchGestureDetected + // or onFinishedGoingToSleep(), carry that state forward. It will be reset by the next + // onStartedGoingToSleep. + val powerButtonLaunchGestureTriggered = + powerButtonLaunchGestureTriggeredOnWakeUp || + repository.wakefulness.value.powerButtonLaunchGestureTriggered + + repository.updateWakefulness( + rawState = WakefulnessState.STARTING_TO_WAKE, + lastWakeReason = WakeSleepReason.fromPowerManagerWakeReason(reason), + powerButtonLaunchGestureTriggered = powerButtonLaunchGestureTriggered, + ) + } + + /** + * Called from [KeyguardService] to inform us that the device has finished waking up. This is + * the canonical source of wakefulness information for System UI. This method should not be + * called from anywhere else. + * + * In tests, you should be able to use [setAwakeForTest] rather than calling this method + * directly. + */ + fun onFinishedWakingUp() { + repository.updateWakefulness(rawState = WakefulnessState.AWAKE) + } + + /** + * Called from [KeyguardService] to inform us that the device is going to sleep. This is the + * canonical source of wakefulness information for System UI. This method should not be called + * from anywhere else. + * + * In tests, you should be able to use [setAsleepForTest] rather than calling this method + * directly. + */ + fun onStartedGoingToSleep(@PowerManager.GoToSleepReason reason: Int) { + repository.updateWakefulness( + rawState = WakefulnessState.STARTING_TO_SLEEP, + lastSleepReason = WakeSleepReason.fromPowerManagerSleepReason(reason), + powerButtonLaunchGestureTriggered = false, + ) + } + + /** + * Called from [KeyguardService] to inform us that the device has gone to sleep. This is the + * canonical source of wakefulness information for System UI. This method should not be called + * from anywhere else. + * + * In tests, you should be able to use [setAsleepForTest] rather than calling this method + * directly. + */ + fun onFinishedGoingToSleep( + powerButtonLaunchGestureTriggeredDuringSleep: Boolean, + ) { + // If the launch gesture was previously detected via onCameraLaunchGestureDetected, carry + // that state forward. It will be reset by the next onStartedGoingToSleep. + val powerButtonLaunchGestureTriggered = + powerButtonLaunchGestureTriggeredDuringSleep || + repository.wakefulness.value.powerButtonLaunchGestureTriggered + + repository.updateWakefulness( + rawState = WakefulnessState.ASLEEP, + powerButtonLaunchGestureTriggered = powerButtonLaunchGestureTriggered, + ) + } + + fun onScreenPowerStateUpdated(state: ScreenPowerState) { + repository.setScreenPowerState(state) + } + + fun onCameraLaunchGestureDetected() { + repository.updateWakefulness(powerButtonLaunchGestureTriggered = true) + } + companion object { private const val FSI_WAKE_WHY = "full_screen_intent" + + /** + * If true, [isAwake] and [isAsleep] will emit the next value even if it's not distinct. + * This is useful for setting up tests. + */ + private var emitDuplicateWakefulnessValue = false + + /** + * Returns whether old == new unless we want to emit duplicate values, in which case we + * reset that flag and then return false. + */ + private val checkEquivalentUnlessEmitDuplicatesUnderTest: (Boolean, Boolean) -> Boolean = + { old, new -> + if (emitDuplicateWakefulnessValue) { + emitDuplicateWakefulnessValue = false + false + } else { + old == new + } + } + + /** + * Helper method for tests to simulate the device waking up. + * + * If [forceEmit] is true, forces [isAwake] to emit true, even if the PowerInteractor in the + * test was already awake. This is useful for the first setAwakeForTest call in a test, + * since otherwise, tests would need to set the PowerInteractor asleep first to ensure + * [isAwake] emits, which can cause superfluous interactions with mocks. + * + * This is also preferred to calling [onStartedWakingUp]/[onFinishedWakingUp] directly, as + * we want to keep the started/finished concepts internal to keyguard as much as possible. + */ + @JvmOverloads + fun PowerInteractor.setAwakeForTest( + @PowerManager.WakeReason reason: Int = PowerManager.WAKE_REASON_UNKNOWN, + forceEmit: Boolean = false + ) { + emitDuplicateWakefulnessValue = forceEmit + + this.onStartedWakingUp( + reason = reason, + powerButtonLaunchGestureTriggeredOnWakeUp = false, + ) + this.onFinishedWakingUp() + } + + /** + * Helper method for tests to simulate the device sleeping. + * + * If [forceEmit] is true, forces [isAsleep] to emit true, even if the PowerInteractor in + * the test was already asleep. This is useful for the first setAsleepForTest call in a + * test, since otherwise, tests would need to set the PowerInteractor awake first to ensure + * [isAsleep] emits, but that can cause superfluous interactions with mocks. + * + * This is also preferred to calling [onStartedGoingToSleep]/[onFinishedGoingToSleep] + * directly, as we want to keep the started/finished concepts internal to keyguard as much + * as possible. + */ + @JvmOverloads + fun PowerInteractor.setAsleepForTest( + @PowerManager.GoToSleepReason sleepReason: Int = + PowerManager.GO_TO_SLEEP_REASON_MIN, + forceEmit: Boolean = false, + ) { + emitDuplicateWakefulnessValue = forceEmit + + this.onStartedGoingToSleep(reason = sleepReason) + this.onFinishedGoingToSleep( + powerButtonLaunchGestureTriggeredDuringSleep = false, + ) + } } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/ScreenState.kt b/packages/SystemUI/src/com/android/systemui/power/shared/model/ScreenPowerState.kt index fe5d9355a6fa..53bbbddfad80 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/ScreenState.kt +++ b/packages/SystemUI/src/com/android/systemui/power/shared/model/ScreenPowerState.kt @@ -14,11 +14,13 @@ * limitations under the License. */ -package com.android.systemui.keyguard.shared.model +package com.android.systemui.power.shared.model -import com.android.systemui.keyguard.ScreenLifecycle - -enum class ScreenState { +/** + * The power state of the display. If the screen is [SCREEN_OFF], it is unpowered, and nothing is + * visible including AOD. + */ +enum class ScreenPowerState { /** Screen is fully off. */ SCREEN_OFF, /** Signal that the screen is turning on. */ @@ -26,17 +28,5 @@ enum class ScreenState { /** Screen is fully on. */ SCREEN_ON, /** Signal that the screen is turning off. */ - SCREEN_TURNING_OFF; - - companion object { - fun fromScreenLifecycleInt(value: Int): ScreenState { - return when (value) { - ScreenLifecycle.SCREEN_OFF -> SCREEN_OFF - ScreenLifecycle.SCREEN_TURNING_ON -> SCREEN_TURNING_ON - ScreenLifecycle.SCREEN_ON -> SCREEN_ON - ScreenLifecycle.SCREEN_TURNING_OFF -> SCREEN_TURNING_OFF - else -> throw IllegalArgumentException("Invalid screen value: $value") - } - } - } + SCREEN_TURNING_OFF } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/WakeSleepReason.kt b/packages/SystemUI/src/com/android/systemui/power/shared/model/WakeSleepReason.kt index 3602be8e62a4..faf9fbe3239d 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/WakeSleepReason.kt +++ b/packages/SystemUI/src/com/android/systemui/power/shared/model/WakeSleepReason.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.systemui.keyguard.shared.model +package com.android.systemui.power.shared.model import android.os.PowerManager diff --git a/packages/SystemUI/src/com/android/systemui/power/shared/model/WakefulnessModel.kt b/packages/SystemUI/src/com/android/systemui/power/shared/model/WakefulnessModel.kt new file mode 100644 index 000000000000..e1d1ec207938 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/power/shared/model/WakefulnessModel.kt @@ -0,0 +1,58 @@ +package com.android.systemui.power.shared.model + +import com.android.systemui.keyguard.KeyguardService + +/** + * Models whether the device is awake or asleep, along with information about why we're in that + * state. + */ +data class WakefulnessModel( + /** + * Internal-only wakefulness state, which we receive via [KeyguardService]. This is a more + * granular state that tells us whether we've started or finished waking up or going to sleep. + * + * This distinction has historically been confusing - the display is on once we've "finished" + * waking up, but we're still playing screen-on animations. Similarly, the screen off animation + * is still playing even once we've "finished" going to sleep. + * + * Avoid using this whenever possible - [isAwake] and [isAsleep] should be sufficient for nearly + * all use cases. If you need more granular information about a waking/sleeping transition, use + * the [KeyguardTransitionInteractor]. + */ + internal val internalWakefulnessState: WakefulnessState = WakefulnessState.AWAKE, + + val lastWakeReason: WakeSleepReason = WakeSleepReason.OTHER, + val lastSleepReason: WakeSleepReason = WakeSleepReason.OTHER, + + /** + * Whether the power button double tap gesture was triggered since the last time went to sleep. + * If this value is true while [isAsleep]=true, it means we'll be waking back up shortly. If it + * is true while [isAwake]=true, it means we're awake because of the button gesture. + * + * This value remains true until the next time [isAsleep]=true. + */ + val powerButtonLaunchGestureTriggered: Boolean = false, +) { + fun isAwake() = internalWakefulnessState == WakefulnessState.AWAKE || + internalWakefulnessState == WakefulnessState.STARTING_TO_WAKE + + fun isAsleep() = !isAwake() + + fun isAwakeFrom(wakeSleepReason: WakeSleepReason) = + isAwake() && lastWakeReason == wakeSleepReason + + fun isAwakeFromTouch(): Boolean { + return isAwake() && lastWakeReason.isTouch + } + + fun isAsleepFrom(wakeSleepReason: WakeSleepReason) = + isAsleep() && lastSleepReason == wakeSleepReason + + fun isAwakeOrAsleepFrom(reason: WakeSleepReason) = + isAsleepFrom(reason) || isAwakeFrom(reason) + + fun isAwakeFromTapOrGesture(): Boolean { + return isAwake() && (lastWakeReason == WakeSleepReason.TAP || + lastWakeReason == WakeSleepReason.GESTURE) + } +}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/WakefulnessState.kt b/packages/SystemUI/src/com/android/systemui/power/shared/model/WakefulnessState.kt index 6791d88f16d1..b9fc3328ebbe 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/WakefulnessState.kt +++ b/packages/SystemUI/src/com/android/systemui/power/shared/model/WakefulnessState.kt @@ -14,10 +14,14 @@ * limitations under the License. */ -package com.android.systemui.keyguard.shared.model +package com.android.systemui.power.shared.model -import com.android.systemui.keyguard.WakefulnessLifecycle +import com.android.systemui.keyguard.KeyguardService +/** + * Raw wakefulness state provided via [KeyguardService]. The "started" vs. "finished" distinction + * should not generally be needed except for special cases (keyguard internals). + */ enum class WakefulnessState { /** The device is asleep and not interactive. */ ASLEEP, @@ -26,19 +30,5 @@ enum class WakefulnessState { /** Device is now fully awake and interactive. */ AWAKE, /** Signal that the device is now going to sleep. */ - STARTING_TO_SLEEP; - - companion object { - fun fromWakefulnessLifecycleInt( - @WakefulnessLifecycle.Wakefulness value: Int - ): WakefulnessState { - return when (value) { - WakefulnessLifecycle.WAKEFULNESS_ASLEEP -> ASLEEP - WakefulnessLifecycle.WAKEFULNESS_WAKING -> STARTING_TO_WAKE - WakefulnessLifecycle.WAKEFULNESS_AWAKE -> AWAKE - WakefulnessLifecycle.WAKEFULNESS_GOING_TO_SLEEP -> STARTING_TO_SLEEP - else -> throw IllegalArgumentException("Invalid Wakefulness value: $value") - } - } - } + STARTING_TO_SLEEP } diff --git a/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/WindowRootViewVisibilityInteractor.kt b/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/WindowRootViewVisibilityInteractor.kt index 16ffcc27a70f..a6cccf1cb41b 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/WindowRootViewVisibilityInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/WindowRootViewVisibilityInteractor.kt @@ -21,6 +21,7 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.keyguard.data.repository.KeyguardRepository import com.android.systemui.keyguard.shared.model.StatusBarState +import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.scene.data.repository.WindowRootViewVisibilityRepository import com.android.systemui.statusbar.NotificationPresenter import com.android.systemui.statusbar.notification.init.NotificationsController @@ -42,6 +43,7 @@ constructor( private val windowRootViewVisibilityRepository: WindowRootViewVisibilityRepository, private val keyguardRepository: KeyguardRepository, private val headsUpManager: HeadsUpManager, + private val powerInteractor: PowerInteractor, ) : CoreStartable { private var notificationPresenter: NotificationPresenter? = null @@ -67,9 +69,9 @@ constructor( val isLockscreenOrShadeVisibleAndInteractive: StateFlow<Boolean> = combine( isLockscreenOrShadeVisible, - keyguardRepository.wakefulness, - ) { isKeyguardAodOrShadeVisible, wakefulness -> - isKeyguardAodOrShadeVisible && wakefulness.isDeviceInteractive() + powerInteractor.isAwake, + ) { isKeyguardAodOrShadeVisible, isAwake -> + isKeyguardAodOrShadeVisible && isAwake } .stateIn(scope, SharingStarted.Eagerly, initialValue = false) diff --git a/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt b/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt index a3499bd5c264..584456d79890 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt @@ -28,9 +28,9 @@ import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.DisplayId import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor -import com.android.systemui.keyguard.shared.model.WakefulnessState import com.android.systemui.model.SysUiState import com.android.systemui.model.updateFlags +import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.shared.flag.SceneContainerFlags import com.android.systemui.scene.shared.logger.SceneLogger @@ -42,17 +42,16 @@ import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICA import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_QUICK_SETTINGS_EXPANDED import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING -import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.distinctUntilChangedBy import kotlinx.coroutines.flow.emptyFlow -import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.launch +import javax.inject.Inject /** * Hooks up business logic that manipulates the state of the [SceneInteractor] for the system UI @@ -72,6 +71,7 @@ constructor( @DisplayId private val displayId: Int, private val sceneLogger: SceneLogger, @FalsingCollectorActual private val falsingCollector: FalsingCollector, + private val powerInteractor: PowerInteractor, ) : CoreStartable { override fun start() { @@ -179,40 +179,34 @@ constructor( } applicationScope.launch { - keyguardInteractor.wakefulnessModel - .map { wakefulnessModel -> wakefulnessModel.state } - .distinctUntilChanged() - .collect { wakefulnessState -> - when (wakefulnessState) { - WakefulnessState.STARTING_TO_SLEEP -> { - switchToScene( + powerInteractor.isAsleep + .collect { isAsleep -> + if (isAsleep) { + switchToScene( targetSceneKey = SceneKey.Lockscreen, loggingReason = "device is starting to sleep", - ) - } - WakefulnessState.STARTING_TO_WAKE -> { - val authMethod = authenticationInteractor.getAuthenticationMethod() - val isUnlocked = deviceEntryInteractor.isUnlocked.value - when { - authMethod == AuthenticationMethodModel.None -> { - switchToScene( + ) + } else { + val authMethod = authenticationInteractor.getAuthenticationMethod() + val isUnlocked = deviceEntryInteractor.isUnlocked.value + when { + authMethod == AuthenticationMethodModel.None -> { + switchToScene( targetSceneKey = SceneKey.Gone, loggingReason = - "device is starting to wake up while auth method is" + + "device is starting to wake up while auth method is" + " none", - ) - } - authMethod.isSecure && isUnlocked -> { - switchToScene( + ) + } + authMethod.isSecure && isUnlocked -> { + switchToScene( targetSceneKey = SceneKey.Gone, loggingReason = - "device is starting to wake up while unlocked with a" + + "device is starting to wake up while unlocked with a" + " secure auth method", - ) - } + ) } } - else -> Unit } } } @@ -259,28 +253,17 @@ constructor( keyguardInteractor.isAodAvailable .flatMapLatest { isAodAvailable -> if (!isAodAvailable) { - keyguardInteractor.wakefulnessModel + powerInteractor.detailedWakefulness } else { emptyFlow() } } - .map { wakefulnessModel -> - val wakeChange: Boolean? = - when (wakefulnessModel.state) { - WakefulnessState.STARTING_TO_WAKE -> true - WakefulnessState.ASLEEP -> false - else -> null - } - (wakeChange to wakefulnessModel.lastWakeReason).takeIf { wakeChange != null } - } - .filterNotNull() - .distinctUntilChangedBy { it.first } - .collect { (wakeChange, wakeReason) -> + .distinctUntilChangedBy { it.isAwake() } + .collect { wakefulness -> when { - wakeChange == true && wakeReason.isTouch -> - falsingCollector.onScreenOnFromTouch() - wakeChange == true -> falsingCollector.onScreenTurningOn() - wakeChange == false -> falsingCollector.onScreenOff() + wakefulness.isAwakeFromTouch() -> falsingCollector.onScreenOnFromTouch() + wakefulness.isAwake() -> falsingCollector.onScreenTurningOn() + wakefulness.isAsleep() -> falsingCollector.onScreenOff() } } } diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java index 1038c6756432..a821729e486d 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java @@ -138,7 +138,7 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor; import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor; import com.android.systemui.keyguard.shared.model.TransitionState; import com.android.systemui.keyguard.shared.model.TransitionStep; -import com.android.systemui.keyguard.shared.model.WakefulnessModel; +import com.android.systemui.power.shared.model.WakefulnessModel; import com.android.systemui.keyguard.ui.binder.KeyguardLongPressViewBinder; import com.android.systemui.keyguard.ui.viewmodel.DreamingToLockscreenTransitionViewModel; import com.android.systemui.keyguard.ui.viewmodel.GoneToDreamingLockscreenHostedTransitionViewModel; @@ -164,6 +164,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener; import com.android.systemui.res.R; import com.android.systemui.shade.data.repository.ShadeRepository; +import com.android.systemui.power.domain.interactor.PowerInteractor; import com.android.systemui.shade.transition.ShadeTransitionController; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.statusbar.CommandQueue; @@ -605,6 +606,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump private final SharedNotificationContainerInteractor mSharedNotificationContainerInteractor; private final KeyguardTransitionInteractor mKeyguardTransitionInteractor; private final KeyguardInteractor mKeyguardInteractor; + private final PowerInteractor mPowerInteractor; private final KeyguardViewConfigurator mKeyguardViewConfigurator; private final CoroutineDispatcher mMainDispatcher; private boolean mIsAnyMultiShadeExpanded; @@ -774,7 +776,8 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump SharedNotificationContainerInteractor sharedNotificationContainerInteractor, KeyguardViewConfigurator keyguardViewConfigurator, KeyguardFaceAuthInteractor keyguardFaceAuthInteractor, - SplitShadeStateController splitShadeStateController) { + SplitShadeStateController splitShadeStateController, + PowerInteractor powerInteractor) { keyguardStateController.addCallback(new KeyguardStateController.Callback() { @Override public void onKeyguardFadingAwayChanged() { @@ -800,6 +803,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump mKeyguardTransitionInteractor = keyguardTransitionInteractor; mSharedNotificationContainerInteractor = sharedNotificationContainerInteractor; mKeyguardInteractor = keyguardInteractor; + mPowerInteractor = powerInteractor; mKeyguardViewConfigurator = keyguardViewConfigurator; mView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { @Override @@ -2337,7 +2341,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump } private WakefulnessModel getWakefulness() { - return mKeyguardInteractor.getWakefulnessModel().getValue(); + return mPowerInteractor.getDetailedWakefulness().getValue(); } @VisibleForTesting @@ -3776,7 +3780,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump mDozeLog.traceFling( expand, mTouchAboveFalsingThreshold, - /* screenOnFromTouch=*/ getWakefulness().isDeviceInteractiveFromTapOrGesture()); + /* screenOnFromTouch=*/ getWakefulness().isAwakeFromTapOrGesture()); // Log collapse gesture if on lock screen. if (!expand && onKeyguard) { float displayDensity = mCentralSurfaces.getDisplayDensity(); diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeViewController.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeViewController.kt index fdc049cc133d..637cf968e336 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeViewController.kt @@ -18,7 +18,7 @@ package com.android.systemui.shade import android.view.MotionEvent import android.view.ViewGroup import android.view.ViewTreeObserver -import com.android.systemui.keyguard.shared.model.WakefulnessModel +import com.android.systemui.power.shared.model.WakefulnessModel import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.phone.HeadsUpAppearanceController import com.android.systemui.statusbar.phone.KeyguardStatusBarView @@ -293,7 +293,7 @@ interface ShadeViewController { */ @JvmStatic fun getFalsingThresholdFactor(wakefulness: WakefulnessModel): Float { - return if (wakefulness.isDeviceInteractiveFromTapOrGesture()) 1.5f else 1.0f + return if (wakefulness.isAwakeFromTapOrGesture()) 1.5f else 1.0f } const val WAKEUP_ANIMATION_DELAY_MS = 250 diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index 664103fa05d7..c2863fb2c330 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -69,6 +69,7 @@ import com.android.internal.statusbar.StatusBarIcon; import com.android.internal.util.GcUtils; import com.android.internal.view.AppearanceRegion; import com.android.systemui.dump.DumpHandler; +import com.android.systemui.power.domain.interactor.PowerInteractor; import com.android.systemui.settings.DisplayTracker; import com.android.systemui.statusbar.CommandQueue.Callbacks; import com.android.systemui.statusbar.commandline.CommandRegistry; @@ -80,6 +81,8 @@ import java.io.OutputStream; import java.io.PrintWriter; import java.util.ArrayList; +import dagger.Lazy; + /** * This class takes the functions from IStatusBar that come in on * binder pool threads and posts messages to get them onto the main @@ -195,6 +198,7 @@ public class CommandQueue extends IStatusBar.Stub implements private final DisplayTracker mDisplayTracker; private final @Nullable CommandRegistry mRegistry; private final @Nullable DumpHandler mDumpHandler; + private final @Nullable Lazy<PowerInteractor> mPowerInteractor; /** * These methods are called back on the main thread. @@ -512,14 +516,15 @@ public class CommandQueue extends IStatusBar.Stub implements @VisibleForTesting public CommandQueue(Context context, DisplayTracker displayTracker) { - this(context, displayTracker, null, null); + this(context, displayTracker, null, null, null); } public CommandQueue( Context context, DisplayTracker displayTracker, CommandRegistry registry, - DumpHandler dumpHandler + DumpHandler dumpHandler, + Lazy<PowerInteractor> powerInteractor ) { mDisplayTracker = displayTracker; mRegistry = registry; @@ -539,6 +544,7 @@ public class CommandQueue extends IStatusBar.Stub implements }, new HandlerExecutor(mHandler)); // We always have default display. setDisabled(mDisplayTracker.getDefaultDisplayId(), DISABLE_NONE, DISABLE2_NONE); + mPowerInteractor = powerInteractor; } // TODO(b/118592525): add multi-display support if needed. @@ -879,6 +885,10 @@ public class CommandQueue extends IStatusBar.Stub implements @Override public void onCameraLaunchGestureDetected(int source) { synchronized (mLock) { + if (mPowerInteractor != null) { + mPowerInteractor.get().onCameraLaunchGestureDetected(); + } + mHandler.removeMessages(MSG_CAMERA_LAUNCH_GESTURE); mHandler.obtainMessage(MSG_CAMERA_LAUNCH_GESTURE, source, 0).sendToTarget(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java index d058d04728ae..7f5829d81c6f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/dagger/CentralSurfacesDependenciesModule.java @@ -184,9 +184,10 @@ public interface CentralSurfacesDependenciesModule { Context context, DisplayTracker displayTracker, CommandRegistry registry, - DumpHandler dumpHandler + DumpHandler dumpHandler, + Lazy<PowerInteractor> powerInteractor ) { - return new CommandQueue(context, displayTracker, registry, dumpHandler); + return new CommandQueue(context, displayTracker, registry, dumpHandler, powerInteractor); } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java index b051809f2c5c..66b2555a4446 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java @@ -66,7 +66,6 @@ import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; import com.android.systemui.flags.ViewRefactorFlag; import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository; -import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor; import com.android.systemui.keyguard.shared.model.KeyguardState; import com.android.systemui.keyguard.shared.model.TransitionStep; import com.android.systemui.media.controls.ui.KeyguardMediaController; @@ -76,6 +75,7 @@ import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.OnMenuEventListener; import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper; import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.power.domain.interactor.PowerInteractor; import com.android.systemui.shade.ShadeController; import com.android.systemui.shade.ShadeViewController; import com.android.systemui.statusbar.LockscreenShadeTransitionController; @@ -181,7 +181,7 @@ public class NotificationStackScrollLayoutController { private final KeyguardMediaController mKeyguardMediaController; private final SysuiStatusBarStateController mStatusBarStateController; private final KeyguardBypassController mKeyguardBypassController; - private final KeyguardInteractor mKeyguardInteractor; + private final PowerInteractor mPowerInteractor; private final PrimaryBouncerInteractor mPrimaryBouncerInteractor; private final NotificationLockscreenUserManager mLockscreenUserManager; private final SectionHeaderController mSilentHeaderController; @@ -575,7 +575,7 @@ public class NotificationStackScrollLayoutController { @Override public float getFalsingThresholdFactor() { return ShadeViewController.getFalsingThresholdFactor( - mKeyguardInteractor.getWakefulnessModel().getValue()); + mPowerInteractor.getDetailedWakefulness().getValue()); } @Override @@ -640,7 +640,7 @@ public class NotificationStackScrollLayoutController { SysuiStatusBarStateController statusBarStateController, KeyguardMediaController keyguardMediaController, KeyguardBypassController keyguardBypassController, - KeyguardInteractor keyguardInteractor, + PowerInteractor powerInteractor, PrimaryBouncerInteractor primaryBouncerInteractor, KeyguardTransitionRepository keyguardTransitionRepo, ZenModeController zenModeController, @@ -692,7 +692,7 @@ public class NotificationStackScrollLayoutController { mStatusBarStateController = statusBarStateController; mKeyguardMediaController = keyguardMediaController; mKeyguardBypassController = keyguardBypassController; - mKeyguardInteractor = keyguardInteractor; + mPowerInteractor = powerInteractor; mPrimaryBouncerInteractor = primaryBouncerInteractor; mZenModeController = zenModeController; mLockscreenUserManager = lockscreenUserManager; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java index 023efdd9a2e2..2809cad34143 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java @@ -54,7 +54,6 @@ import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.keyguard.KeyguardViewMediator; -import com.android.systemui.keyguard.ScreenLifecycle; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.log.SessionTracker; import com.android.systemui.plugins.statusbar.StatusBarStateController; @@ -278,7 +277,6 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp BiometricUnlockLogger biometricUnlockLogger, NotificationMediaManager notificationMediaManager, WakefulnessLifecycle wakefulnessLifecycle, - ScreenLifecycle screenLifecycle, AuthController authController, StatusBarStateController statusBarStateController, SessionTracker sessionTracker, @@ -295,7 +293,6 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp mLatencyTracker = latencyTracker; mWakefulnessLifecycle = wakefulnessLifecycle; mWakefulnessLifecycle.addObserver(mWakefulnessObserver); - screenLifecycle.addObserver(mScreenObserver); mNotificationShadeWindowController = notificationShadeWindowController; mDozeScrimController = dozeScrimController; @@ -851,18 +848,6 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp } }; - private final ScreenLifecycle.Observer mScreenObserver = - new ScreenLifecycle.Observer() { - @Override - public void onScreenTurnedOn() { - mHasScreenTurnedOnSinceAuthenticating = true; - } - }; - - public boolean hasScreenTurnedOnSinceAuthenticating() { - return mHasScreenTurnedOnSinceAuthenticating; - } - @Override public void onKeyguardBouncerStateChanged(boolean bouncerIsOrWillBeShowing) { // When the bouncer is dismissed, treat this as a reset of the unlock mode. The user diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerBaseTest.java index 484b1194eb8b..989164ebf174 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerBaseTest.java @@ -32,6 +32,8 @@ import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository; import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory; +import com.android.systemui.power.data.repository.FakePowerRepository; +import com.android.systemui.power.domain.interactor.PowerInteractorFactory; import com.android.systemui.statusbar.notification.AnimatableProperty; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.ScreenOffAnimationController; @@ -61,6 +63,7 @@ public class KeyguardStatusViewControllerBaseTest extends SysuiTestCase { @Mock protected ViewTreeObserver mViewTreeObserver; @Mock protected DumpManager mDumpManager; protected FakeKeyguardRepository mFakeKeyguardRepository; + protected FakePowerRepository mFakePowerRepository; protected KeyguardStatusViewController mController; @@ -74,6 +77,7 @@ public class KeyguardStatusViewControllerBaseTest extends SysuiTestCase { KeyguardInteractorFactory.WithDependencies deps = KeyguardInteractorFactory.create(); mFakeKeyguardRepository = deps.getRepository(); + mFakePowerRepository = new FakePowerRepository(); mController = new KeyguardStatusViewController( mKeyguardStatusView, @@ -88,7 +92,10 @@ public class KeyguardStatusViewControllerBaseTest extends SysuiTestCase { mFeatureFlags, mInteractionJankMonitor, deps.getKeyguardInteractor(), - mDumpManager) { + mDumpManager, + PowerInteractorFactory.create( + mFakePowerRepository + ).getPowerInteractor()) { @Override void setProperty( AnimatableProperty property, diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerWithCoroutinesTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerWithCoroutinesTest.kt index 2b9797ee56d4..17f77aac8959 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerWithCoroutinesTest.kt +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerWithCoroutinesTest.kt @@ -19,8 +19,7 @@ package com.android.keyguard import android.test.suitebuilder.annotation.SmallTest import android.testing.AndroidTestingRunner import android.testing.TestableLooper -import com.android.systemui.keyguard.shared.model.ScreenModel -import com.android.systemui.keyguard.shared.model.ScreenState +import com.android.systemui.power.shared.model.ScreenPowerState import kotlinx.coroutines.cancelChildren import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest @@ -28,7 +27,6 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mockito.clearInvocations import org.mockito.Mockito.never -import org.mockito.Mockito.times import org.mockito.Mockito.verify @RunWith(AndroidTestingRunner::class) @@ -57,12 +55,12 @@ class KeyguardStatusViewControllerWithCoroutinesTest : KeyguardStatusViewControl runCurrent() clearInvocations(mKeyguardSliceViewController) - mFakeKeyguardRepository.setScreenModel(ScreenModel(ScreenState.SCREEN_ON)) + mFakePowerRepository.setScreenPowerState(ScreenPowerState.SCREEN_ON) runCurrent() verify(mKeyguardSliceViewController, never()).refresh() // Should only be called during a 'turning on' event - mFakeKeyguardRepository.setScreenModel(ScreenModel(ScreenState.SCREEN_TURNING_ON)) + mFakePowerRepository.setScreenPowerState(ScreenPowerState.SCREEN_TURNING_ON) runCurrent() verify(mKeyguardSliceViewController).refresh() diff --git a/packages/SystemUI/tests/src/com/android/systemui/back/domain/interactor/BackActionInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/back/domain/interactor/BackActionInteractorTest.kt index ddb482f0623c..8693d5c87dce 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/back/domain/interactor/BackActionInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/back/domain/interactor/BackActionInteractorTest.kt @@ -30,10 +30,10 @@ import com.android.systemui.SysuiTestCase 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.shared.model.WakeSleepReason -import com.android.systemui.keyguard.shared.model.WakefulnessModel -import com.android.systemui.keyguard.shared.model.WakefulnessState import com.android.systemui.plugins.statusbar.StatusBarStateController +import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAsleepForTest +import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest +import com.android.systemui.power.domain.interactor.PowerInteractorFactory import com.android.systemui.scene.data.repository.WindowRootViewVisibilityRepository import com.android.systemui.scene.domain.interactor.WindowRootViewVisibilityInteractor import com.android.systemui.scene.ui.view.WindowRootView @@ -96,6 +96,7 @@ class BackActionInteractorTest : SysuiTestCase() { WindowRootViewVisibilityRepository(iStatusBarService, executor), keyguardRepository, headsUpManager, + powerInteractor, ) } @@ -112,6 +113,8 @@ class BackActionInteractorTest : SysuiTestCase() { .apply { this.setup(qsController, shadeViewController) } } + private val powerInteractor = PowerInteractorFactory.create().powerInteractor + @Before fun setUp() { featureFlags.set(Flags.WM_SHADE_ANIMATE_BACK_GESTURE, false) @@ -179,7 +182,7 @@ class BackActionInteractorTest : SysuiTestCase() { fun shadeVisibleAndDeviceAwake_callbackRegistered() { backActionInteractor.start() windowRootViewVisibilityInteractor.setIsLockscreenOrShadeVisible(true) - setWakefulness(WakefulnessState.AWAKE) + powerInteractor.setAwakeForTest() testScope.runCurrent() @@ -193,7 +196,7 @@ class BackActionInteractorTest : SysuiTestCase() { backActionInteractor.start() windowRootViewVisibilityInteractor.setIsLockscreenOrShadeVisible(true) - setWakefulness(WakefulnessState.AWAKE) + powerInteractor.setAwakeForTest() testScope.runCurrent() // No assert necessary, just testing no crash @@ -203,7 +206,7 @@ class BackActionInteractorTest : SysuiTestCase() { fun shadeNotVisible_callbackUnregistered() { backActionInteractor.start() windowRootViewVisibilityInteractor.setIsLockscreenOrShadeVisible(true) - setWakefulness(WakefulnessState.AWAKE) + powerInteractor.setAwakeForTest() val callback = getBackInvokedCallback() windowRootViewVisibilityInteractor.setIsLockscreenOrShadeVisible(false) @@ -216,10 +219,10 @@ class BackActionInteractorTest : SysuiTestCase() { fun deviceAsleep_callbackUnregistered() { backActionInteractor.start() windowRootViewVisibilityInteractor.setIsLockscreenOrShadeVisible(true) - setWakefulness(WakefulnessState.AWAKE) + powerInteractor.setAwakeForTest() val callback = getBackInvokedCallback() - setWakefulness(WakefulnessState.ASLEEP) + powerInteractor.setAsleepForTest() testScope.runCurrent() verify(onBackInvokedDispatcher).unregisterOnBackInvokedCallback(callback) @@ -230,7 +233,7 @@ class BackActionInteractorTest : SysuiTestCase() { backActionInteractor.start() featureFlags.set(Flags.WM_SHADE_ANIMATE_BACK_GESTURE, false) windowRootViewVisibilityInteractor.setIsLockscreenOrShadeVisible(true) - setWakefulness(WakefulnessState.AWAKE) + powerInteractor.setAwakeForTest() val callback = getBackInvokedCallback() whenever(statusBarKeyguardViewManager.canHandleBackPressed()).thenReturn(true) @@ -244,7 +247,7 @@ class BackActionInteractorTest : SysuiTestCase() { featureFlags.set(Flags.WM_SHADE_ANIMATE_BACK_GESTURE, true) backActionInteractor.start() windowRootViewVisibilityInteractor.setIsLockscreenOrShadeVisible(true) - setWakefulness(WakefulnessState.AWAKE) + powerInteractor.setAwakeForTest() val callback = getBackInvokedCallback() whenever(statusBarKeyguardViewManager.canHandleBackPressed()).thenReturn(true) @@ -258,7 +261,7 @@ class BackActionInteractorTest : SysuiTestCase() { featureFlags.set(Flags.WM_SHADE_ANIMATE_BACK_GESTURE, true) backActionInteractor.start() windowRootViewVisibilityInteractor.setIsLockscreenOrShadeVisible(true) - setWakefulness(WakefulnessState.AWAKE) + powerInteractor.setAwakeForTest() val callback = getBackInvokedCallback() @@ -270,7 +273,7 @@ class BackActionInteractorTest : SysuiTestCase() { featureFlags.set(Flags.WM_SHADE_ANIMATE_BACK_GESTURE, true) backActionInteractor.start() windowRootViewVisibilityInteractor.setIsLockscreenOrShadeVisible(true) - setWakefulness(WakefulnessState.AWAKE) + powerInteractor.setAwakeForTest() val callback = getBackInvokedCallback() as OnBackAnimationCallback whenever(shadeViewController.canBeCollapsed()).thenReturn(false) @@ -285,7 +288,7 @@ class BackActionInteractorTest : SysuiTestCase() { featureFlags.set(Flags.WM_SHADE_ANIMATE_BACK_GESTURE, true) backActionInteractor.start() windowRootViewVisibilityInteractor.setIsLockscreenOrShadeVisible(true) - setWakefulness(WakefulnessState.AWAKE) + powerInteractor.setAwakeForTest() val callback = getBackInvokedCallback() as OnBackAnimationCallback whenever(shadeViewController.canBeCollapsed()).thenReturn(true) @@ -304,9 +307,4 @@ class BackActionInteractorTest : SysuiTestCase() { private fun createBackEvent(progress: Float): BackEvent = BackEvent(/* touchX= */ 0f, /* touchY= */ 0f, progress, /* swipeEdge= */ EDGE_LEFT) - - private fun setWakefulness(state: WakefulnessState) { - val model = WakefulnessModel(state, WakeSleepReason.OTHER, WakeSleepReason.OTHER) - keyguardRepository.setWakefulnessModel(model) - } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ResourceTrimmerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ResourceTrimmerTest.kt index 05d6b99fe227..00951c30fbe5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ResourceTrimmerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/ResourceTrimmerTest.kt @@ -13,9 +13,9 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractorFactory import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.TransitionStep -import com.android.systemui.keyguard.shared.model.WakeSleepReason -import com.android.systemui.keyguard.shared.model.WakefulnessModel -import com.android.systemui.keyguard.shared.model.WakefulnessState +import com.android.systemui.power.domain.interactor.PowerInteractor +import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAsleepForTest +import com.android.systemui.power.domain.interactor.PowerInteractorFactory import com.android.systemui.util.mockito.any import com.android.systemui.utils.GlobalWindowManager import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -43,6 +43,8 @@ class ResourceTrimmerTest : SysuiTestCase() { private val keyguardRepository = FakeKeyguardRepository() private val featureFlags = FakeFeatureFlags() private val keyguardTransitionRepository = FakeKeyguardTransitionRepository() + private lateinit var powerInteractor: PowerInteractor + @Mock private lateinit var globalWindowManager: GlobalWindowManager private lateinit var resourceTrimmer: ResourceTrimmer @@ -53,9 +55,7 @@ class ResourceTrimmerTest : SysuiTestCase() { featureFlags.set(Flags.TRIM_RESOURCES_WITH_BACKGROUND_TRIM_AT_LOCK, true) featureFlags.set(Flags.TRIM_FONT_CACHES_AT_UNLOCK, true) featureFlags.set(Flags.FACE_AUTH_REFACTOR, false) - keyguardRepository.setWakefulnessModel( - WakefulnessModel(WakefulnessState.AWAKE, WakeSleepReason.OTHER, WakeSleepReason.OTHER) - ) + powerInteractor = PowerInteractorFactory.create().powerInteractor keyguardRepository.setDozeAmount(0f) keyguardRepository.setKeyguardGoingAway(false) @@ -68,6 +68,7 @@ class ResourceTrimmerTest : SysuiTestCase() { resourceTrimmer = ResourceTrimmer( keyguardInteractor, + powerInteractor, KeyguardTransitionInteractorFactory.create( scope = TestScope().backgroundScope, repository = keyguardTransitionRepository, @@ -91,13 +92,7 @@ class ResourceTrimmerTest : SysuiTestCase() { @Test fun dozeAodDisabled_sleep_trimsMemory() = testScope.runTest { - keyguardRepository.setWakefulnessModel( - WakefulnessModel( - WakefulnessState.ASLEEP, - WakeSleepReason.OTHER, - WakeSleepReason.OTHER - ) - ) + powerInteractor.setAsleepForTest() testScope.runCurrent() verify(globalWindowManager, times(1)) .trimMemory(ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) @@ -109,13 +104,7 @@ class ResourceTrimmerTest : SysuiTestCase() { testScope.runTest { keyguardRepository.setDreaming(true) keyguardRepository.setDozeAmount(1f) - keyguardRepository.setWakefulnessModel( - WakefulnessModel( - WakefulnessState.ASLEEP, - WakeSleepReason.OTHER, - WakeSleepReason.OTHER - ) - ) + powerInteractor.setAsleepForTest() testScope.runCurrent() verify(globalWindowManager, times(1)) .trimMemory(ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) @@ -127,13 +116,7 @@ class ResourceTrimmerTest : SysuiTestCase() { testScope.runTest { keyguardRepository.setDreaming(true) keyguardRepository.setDozeAmount(0f) - keyguardRepository.setWakefulnessModel( - WakefulnessModel( - WakefulnessState.ASLEEP, - WakeSleepReason.OTHER, - WakeSleepReason.OTHER - ) - ) + powerInteractor.setAsleepForTest() testScope.runCurrent() verifyZeroInteractions(globalWindowManager) } @@ -143,13 +126,7 @@ class ResourceTrimmerTest : SysuiTestCase() { testScope.runTest { keyguardRepository.setDreaming(true) keyguardRepository.setDozeAmount(0f) - keyguardRepository.setWakefulnessModel( - WakefulnessModel( - WakefulnessState.ASLEEP, - WakeSleepReason.OTHER, - WakeSleepReason.OTHER - ) - ) + powerInteractor.setAsleepForTest() testScope.runCurrent() verifyZeroInteractions(globalWindowManager) @@ -175,13 +152,7 @@ class ResourceTrimmerTest : SysuiTestCase() { testScope.runTest { keyguardRepository.setDreaming(true) keyguardRepository.setDozeAmount(0f) - keyguardRepository.setWakefulnessModel( - WakefulnessModel( - WakefulnessState.ASLEEP, - WakeSleepReason.OTHER, - WakeSleepReason.OTHER - ) - ) + powerInteractor.setAsleepForTest() testScope.runCurrent() verifyZeroInteractions(globalWindowManager) diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepositoryTest.kt index 5a95ebec1fb3..307204da1761 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepositoryTest.kt @@ -32,6 +32,7 @@ import android.hardware.face.FaceManager import android.hardware.face.FaceSensorProperties import android.hardware.face.FaceSensorPropertiesInternal import android.os.CancellationSignal +import android.util.Log import android.view.Display import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest @@ -63,6 +64,7 @@ import com.android.systemui.flags.Flags.FACE_AUTH_REFACTOR import com.android.systemui.flags.Flags.KEYGUARD_WM_STATE_REFACTOR import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory +import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractorFactory import com.android.systemui.keyguard.shared.model.ErrorFaceAuthenticationStatus import com.android.systemui.keyguard.shared.model.FaceAuthenticationStatus @@ -72,13 +74,15 @@ import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.SuccessFaceAuthenticationStatus import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.keyguard.shared.model.TransitionStep -import com.android.systemui.keyguard.shared.model.WakeSleepReason -import com.android.systemui.keyguard.shared.model.WakefulnessModel -import com.android.systemui.keyguard.shared.model.WakefulnessState import com.android.systemui.log.FaceAuthenticationLogger import com.android.systemui.log.SessionTracker import com.android.systemui.log.table.TableLogBuffer import com.android.systemui.plugins.statusbar.StatusBarStateController +import com.android.systemui.power.data.repository.FakePowerRepository +import com.android.systemui.power.domain.interactor.PowerInteractor +import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAsleepForTest +import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest +import com.android.systemui.power.domain.interactor.PowerInteractorFactory import com.android.systemui.statusbar.phone.FakeKeyguardStateController import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.user.data.model.SelectionStatus @@ -91,8 +95,6 @@ import com.android.systemui.util.mockito.whenever import com.android.systemui.util.time.FakeSystemClock import com.android.systemui.util.time.SystemClock import com.google.common.truth.Truth.assertThat -import java.io.PrintWriter -import java.io.StringWriter import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.TestDispatcher @@ -115,6 +117,8 @@ import org.mockito.Mockito.never import org.mockito.Mockito.verify import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.MockitoAnnotations +import java.io.PrintWriter +import java.io.StringWriter @OptIn(ExperimentalCoroutinesApi::class) @SmallTest @@ -160,6 +164,8 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() { FakeDeviceEntryFingerprintAuthRepository private lateinit var trustRepository: FakeTrustRepository private lateinit var keyguardRepository: FakeKeyguardRepository + private lateinit var powerRepository: FakePowerRepository + private lateinit var powerInteractor: PowerInteractor private lateinit var keyguardInteractor: KeyguardInteractor private lateinit var alternateBouncerInteractor: AlternateBouncerInteractor private lateinit var displayStateInteractor: DisplayStateInteractor @@ -172,6 +178,8 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() { private var wasAuthCancelled = false private var wasDetectCancelled = false + private lateinit var keyguardTransitionInteractor: KeyguardTransitionInteractor + @Before fun setup() { MockitoAnnotations.initMocks(this) @@ -187,13 +195,30 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() { set(FACE_AUTH_REFACTOR, true) set(KEYGUARD_WM_STATE_REFACTOR, false) } + + powerRepository = FakePowerRepository() + powerInteractor = PowerInteractorFactory.create( + repository = powerRepository, + ).powerInteractor + val withDeps = KeyguardInteractorFactory.create( featureFlags = featureFlags, + powerInteractor = powerInteractor, ) keyguardInteractor = withDeps.keyguardInteractor keyguardRepository = withDeps.repository bouncerRepository = withDeps.bouncerRepository + + keyguardTransitionRepository = FakeKeyguardTransitionRepository() + keyguardTransitionInteractor = + KeyguardTransitionInteractorFactory.create( + scope = testScope.backgroundScope, + repository = keyguardTransitionRepository, + keyguardInteractor = keyguardInteractor, + ) + .keyguardTransitionInteractor + fakeCommandQueue = withDeps.commandQueue alternateBouncerInteractor = @@ -248,13 +273,7 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() { testDispatcher, testScope.backgroundScope ) - keyguardTransitionRepository = FakeKeyguardTransitionRepository() - val keyguardTransitionInteractor = - KeyguardTransitionInteractorFactory.create( - scope = TestScope().backgroundScope, - repository = keyguardTransitionRepository, - ) - .keyguardTransitionInteractor + fakeFacePropertyRepository = FakeFacePropertyRepository() return DeviceEntryFaceAuthRepositoryImpl( mContext, @@ -271,6 +290,7 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() { deviceEntryFingerprintAuthRepository, trustRepository, keyguardRepository, + powerInteractor, keyguardInteractor, alternateBouncerInteractor, faceDetectBuffer, @@ -619,13 +639,7 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() { fun authenticateDoesNotRunWhenDeviceIsGoingToSleep() = testScope.runTest { testGatingCheckForFaceAuth { - keyguardRepository.setWakefulnessModel( - WakefulnessModel( - state = WakefulnessState.STARTING_TO_SLEEP, - lastWakeReason = WakeSleepReason.OTHER, - lastSleepReason = WakeSleepReason.OTHER, - ) - ) + powerInteractor.setAsleepForTest() } } @@ -717,21 +731,35 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() { } @Test - fun authenticateCanRunWhenDisplayIsOffAndWakingUp() = + fun authenticateCanRunWhenDisplayIsOffAndAwakeButTransitioningFromOff() = testScope.runTest { initCollectors() + allPreconditionsToRunFaceAuthAreTrue() + Log.i("TEST", "started waking") + keyguardTransitionRepository.sendTransitionStep(TransitionStep( + from = KeyguardState.LOCKSCREEN, + to = KeyguardState.OFF, + transitionState = TransitionState.FINISHED, + )) + runCurrent() + keyguardTransitionRepository.sendTransitionStep(TransitionStep( + from = KeyguardState.OFF, + to = KeyguardState.LOCKSCREEN, + transitionState = TransitionState.STARTED, + )) + runCurrent() + + Log.i("TEST", "sending display off") displayRepository.emit(setOf(display(0, 0, Display.DEFAULT_DISPLAY, Display.STATE_OFF))) displayRepository.emitDisplayChangeEvent(Display.DEFAULT_DISPLAY) - keyguardRepository.setWakefulnessModel( - WakefulnessModel( - WakefulnessState.STARTING_TO_WAKE, - lastWakeReason = WakeSleepReason.POWER_BUTTON, - lastSleepReason = WakeSleepReason.POWER_BUTTON - ) - ) + Log.i("TEST", "sending step") + + runCurrent() + + Log.i("TEST", "About to assert if face auth can run.") assertThat(canFaceAuthRun()).isTrue() } @@ -739,13 +767,13 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() { fun authenticateDoesNotRunWhenDisplayIsOffAndAwake() = testScope.runTest { testGatingCheckForFaceAuth { - keyguardRepository.setWakefulnessModel( - WakefulnessModel( - WakefulnessState.AWAKE, - lastWakeReason = WakeSleepReason.POWER_BUTTON, - lastSleepReason = WakeSleepReason.POWER_BUTTON - ) - ) + powerInteractor.onFinishedWakingUp() + keyguardTransitionRepository.sendTransitionStep(TransitionStep( + from = KeyguardState.OFF, + to = KeyguardState.LOCKSCREEN, + transitionState = TransitionState.FINISHED, + )) + runCurrent() displayRepository.emit( setOf(display(0, 0, Display.DEFAULT_DISPLAY, Display.STATE_OFF)) @@ -831,13 +859,7 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() { assertThat(authenticated()).isTrue() - keyguardRepository.setWakefulnessModel( - WakefulnessModel( - WakefulnessState.STARTING_TO_SLEEP, - lastWakeReason = WakeSleepReason.POWER_BUTTON, - lastSleepReason = WakeSleepReason.POWER_BUTTON - ) - ) + powerInteractor.setAsleepForTest() assertThat(authenticated()).isFalse() } @@ -856,13 +878,7 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() { assertThat(authenticated()).isTrue() - keyguardRepository.setWakefulnessModel( - WakefulnessModel( - WakefulnessState.ASLEEP, - lastWakeReason = WakeSleepReason.POWER_BUTTON, - lastSleepReason = WakeSleepReason.POWER_BUTTON - ) - ) + powerInteractor.setAsleepForTest() assertThat(authenticated()).isFalse() } @@ -907,13 +923,7 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() { fun detectDoesNotRunWhenDeviceSleepingStartingToSleep() = testScope.runTest { testGatingCheckForDetect { - keyguardRepository.setWakefulnessModel( - WakefulnessModel( - state = WakefulnessState.STARTING_TO_SLEEP, - lastWakeReason = WakeSleepReason.OTHER, - lastSleepReason = WakeSleepReason.OTHER, - ) - ) + powerInteractor.setAsleepForTest() } } @@ -1206,13 +1216,7 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() { .addLockoutResetCallback(faceLockoutResetCallback.capture()) trustRepository.setCurrentUserTrusted(false) keyguardRepository.setKeyguardGoingAway(false) - keyguardRepository.setWakefulnessModel( - WakefulnessModel( - WakefulnessState.STARTING_TO_WAKE, - WakeSleepReason.OTHER, - WakeSleepReason.OTHER - ) - ) + powerInteractor.setAwakeForTest() biometricSettingsRepository.setIsFaceAuthEnrolledAndEnabled(true) biometricSettingsRepository.setIsFaceAuthSupportedInCurrentPosture(true) biometricSettingsRepository.setIsFaceAuthCurrentlyAllowed(true) diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt index f93051c41b61..7983e30c66fb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt @@ -32,15 +32,10 @@ import com.android.systemui.doze.DozeTransitionCallback import com.android.systemui.doze.DozeTransitionListener import com.android.systemui.dreams.DreamOverlayCallbackController import com.android.systemui.keyguard.ScreenLifecycle -import com.android.systemui.keyguard.WakefulnessLifecycle import com.android.systemui.keyguard.shared.model.BiometricUnlockModel import com.android.systemui.keyguard.shared.model.BiometricUnlockSource import com.android.systemui.keyguard.shared.model.DozeStateModel import com.android.systemui.keyguard.shared.model.DozeTransitionModel -import com.android.systemui.keyguard.shared.model.ScreenModel -import com.android.systemui.keyguard.shared.model.ScreenState -import com.android.systemui.keyguard.shared.model.WakefulnessModel -import com.android.systemui.keyguard.shared.model.WakefulnessState import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.statusbar.phone.BiometricUnlockController import com.android.systemui.statusbar.phone.DozeParameters @@ -75,7 +70,6 @@ class KeyguardRepositoryImplTest : SysuiTestCase() { @Mock private lateinit var statusBarStateController: StatusBarStateController @Mock private lateinit var keyguardStateController: KeyguardStateController - @Mock private lateinit var wakefulnessLifecycle: WakefulnessLifecycle @Mock private lateinit var screenLifecycle: ScreenLifecycle @Mock private lateinit var biometricUnlockController: BiometricUnlockController @Mock private lateinit var dozeTransitionListener: DozeTransitionListener @@ -97,7 +91,6 @@ class KeyguardRepositoryImplTest : SysuiTestCase() { underTest = KeyguardRepositoryImpl( statusBarStateController, - wakefulnessLifecycle, screenLifecycle, biometricUnlockController, keyguardStateController, @@ -310,93 +303,6 @@ class KeyguardRepositoryImplTest : SysuiTestCase() { } @Test - fun wakefulness() = - testScope.runTest { - val values = mutableListOf<WakefulnessModel>() - val job = underTest.wakefulness.onEach(values::add).launchIn(this) - - runCurrent() - val captor = argumentCaptor<WakefulnessLifecycle.Observer>() - verify(wakefulnessLifecycle).addObserver(captor.capture()) - - whenever(wakefulnessLifecycle.wakefulness) - .thenReturn(WakefulnessLifecycle.WAKEFULNESS_WAKING) - captor.value.onStartedWakingUp() - runCurrent() - - whenever(wakefulnessLifecycle.wakefulness) - .thenReturn(WakefulnessLifecycle.WAKEFULNESS_AWAKE) - captor.value.onFinishedWakingUp() - runCurrent() - - whenever(wakefulnessLifecycle.wakefulness) - .thenReturn(WakefulnessLifecycle.WAKEFULNESS_GOING_TO_SLEEP) - captor.value.onStartedGoingToSleep() - runCurrent() - - whenever(wakefulnessLifecycle.wakefulness) - .thenReturn(WakefulnessLifecycle.WAKEFULNESS_ASLEEP) - captor.value.onFinishedGoingToSleep() - runCurrent() - - assertThat(values.map { it.state }) - .isEqualTo( - listOf( - // Initial value will be ASLEEP - WakefulnessState.ASLEEP, - WakefulnessState.STARTING_TO_WAKE, - WakefulnessState.AWAKE, - WakefulnessState.STARTING_TO_SLEEP, - WakefulnessState.ASLEEP, - ) - ) - - job.cancel() - } - - @Test - fun screenModel() = - testScope.runTest { - val values = mutableListOf<ScreenModel>() - val job = underTest.screenModel.onEach(values::add).launchIn(this) - - runCurrent() - val captor = argumentCaptor<ScreenLifecycle.Observer>() - verify(screenLifecycle).addObserver(captor.capture()) - - whenever(screenLifecycle.getScreenState()).thenReturn(ScreenLifecycle.SCREEN_TURNING_ON) - captor.value.onScreenTurningOn() - runCurrent() - - whenever(screenLifecycle.getScreenState()).thenReturn(ScreenLifecycle.SCREEN_ON) - captor.value.onScreenTurnedOn() - runCurrent() - - whenever(screenLifecycle.getScreenState()) - .thenReturn(ScreenLifecycle.SCREEN_TURNING_OFF) - captor.value.onScreenTurningOff() - runCurrent() - - whenever(screenLifecycle.getScreenState()).thenReturn(ScreenLifecycle.SCREEN_OFF) - captor.value.onScreenTurnedOff() - runCurrent() - - assertThat(values.map { it.state }) - .isEqualTo( - listOf( - // Initial value will be OFF - ScreenState.SCREEN_OFF, - ScreenState.SCREEN_TURNING_ON, - ScreenState.SCREEN_ON, - ScreenState.SCREEN_TURNING_OFF, - ScreenState.SCREEN_OFF, - ) - ) - - job.cancel() - } - - @Test fun isUdfpsSupported() = testScope.runTest { whenever(keyguardUpdateMonitor.isUdfpsSupported).thenReturn(true) diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/LightRevealScrimRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/LightRevealScrimRepositoryTest.kt index 6fcf54c0e54a..4942cf84a6fc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/LightRevealScrimRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/LightRevealScrimRepositoryTest.kt @@ -26,9 +26,10 @@ import com.android.systemui.animation.AnimatorTestRule import com.android.systemui.coroutines.collectLastValue import com.android.systemui.keyguard.shared.model.BiometricUnlockModel import com.android.systemui.keyguard.shared.model.BiometricUnlockSource -import com.android.systemui.keyguard.shared.model.WakeSleepReason -import com.android.systemui.keyguard.shared.model.WakefulnessModel -import com.android.systemui.keyguard.shared.model.WakefulnessState +import com.android.systemui.power.data.repository.FakePowerRepository +import com.android.systemui.power.domain.interactor.PowerInteractor +import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest +import com.android.systemui.power.domain.interactor.PowerInteractorFactory import com.android.systemui.statusbar.CircleReveal import com.android.systemui.statusbar.LightRevealEffect import junit.framework.Assert.assertEquals @@ -50,6 +51,8 @@ import org.mockito.MockitoAnnotations @RunWith(AndroidJUnit4::class) class LightRevealScrimRepositoryTest : SysuiTestCase() { private lateinit var fakeKeyguardRepository: FakeKeyguardRepository + private lateinit var powerRepository: FakePowerRepository + private lateinit var powerInteractor: PowerInteractor private lateinit var underTest: LightRevealScrimRepositoryImpl @get:Rule val animatorTestRule = AnimatorTestRule() @@ -58,7 +61,16 @@ class LightRevealScrimRepositoryTest : SysuiTestCase() { fun setUp() { MockitoAnnotations.initMocks(this) fakeKeyguardRepository = FakeKeyguardRepository() - underTest = LightRevealScrimRepositoryImpl(fakeKeyguardRepository, context) + powerRepository = FakePowerRepository() + powerInteractor = PowerInteractorFactory.create( + repository = powerRepository + ).powerInteractor + + underTest = LightRevealScrimRepositoryImpl( + fakeKeyguardRepository, + context, + powerInteractor, + ) } @Test @@ -66,13 +78,7 @@ class LightRevealScrimRepositoryTest : SysuiTestCase() { val values = mutableListOf<LightRevealEffect>() val job = launch { underTest.revealEffect.collect { values.add(it) } } - fakeKeyguardRepository.setWakefulnessModel( - WakefulnessModel( - WakefulnessState.STARTING_TO_WAKE, - WakeSleepReason.OTHER, - WakeSleepReason.OTHER - ) - ) + powerInteractor.setAwakeForTest() // We should initially emit the default reveal effect. runCurrent() values.assertEffectsMatchPredicates({ it == DEFAULT_REVEAL_EFFECT }) diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorTest.kt index e2bf2f82b1c4..4f6ec7147a57 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/FromLockscreenTransitionInteractorTest.kt @@ -23,6 +23,7 @@ import com.android.systemui.flags.FakeFeatureFlags import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.keyguard.shared.model.TransitionStep +import com.android.systemui.power.domain.interactor.PowerInteractorFactory import com.android.systemui.shade.data.repository.FakeShadeRepository import dagger.Lazy import junit.framework.Assert.assertEquals @@ -60,6 +61,7 @@ class FromLockscreenTransitionInteractorTest : KeyguardTransitionInteractorTestC keyguardInteractor = super.keyguardInteractor, flags = FakeFeatureFlags(), shadeRepository = FakeShadeRepository(), + powerInteractor = PowerInteractorFactory.create().powerInteractor, ) } 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 85bc374651e0..5bd747fc86e4 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 @@ -23,6 +23,7 @@ import com.android.systemui.flags.FakeFeatureFlags import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.keyguard.shared.model.TransitionStep +import com.android.systemui.power.domain.interactor.PowerInteractorFactory import com.android.systemui.util.mockito.mock import dagger.Lazy import junit.framework.Assert.assertEquals @@ -61,6 +62,7 @@ class FromPrimaryBouncerTransitionInteractorTest : KeyguardTransitionInteractorT keyguardInteractor = super.keyguardInteractor, flags = FakeFeatureFlags(), keyguardSecurityModel = mock(), + powerInteractor = PowerInteractorFactory.create().powerInteractor, ) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardFaceAuthInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardFaceAuthInteractorTest.kt index 518b3cc8933f..b527510fc56f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardFaceAuthInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardFaceAuthInteractorTest.kt @@ -20,6 +20,7 @@ package com.android.systemui.keyguard.domain.interactor import android.content.pm.UserInfo import android.hardware.biometrics.BiometricFaceConstants import android.os.Handler +import android.os.PowerManager import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.keyguard.FaceAuthUiEvent @@ -50,11 +51,12 @@ import com.android.systemui.keyguard.shared.model.ErrorFaceAuthenticationStatus import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.keyguard.shared.model.TransitionStep -import com.android.systemui.keyguard.shared.model.WakeSleepReason -import com.android.systemui.keyguard.shared.model.WakefulnessModel -import com.android.systemui.keyguard.shared.model.WakefulnessState import com.android.systemui.log.FaceAuthenticationLogger import com.android.systemui.plugins.statusbar.StatusBarStateController +import com.android.systemui.power.domain.interactor.PowerInteractor +import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest +import com.android.systemui.power.domain.interactor.PowerInteractorFactory +import com.android.systemui.power.shared.model.WakeSleepReason import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.user.data.model.SelectionStatus import com.android.systemui.user.data.repository.FakeUserRepository @@ -90,6 +92,7 @@ class KeyguardFaceAuthInteractorTest : SysuiTestCase() { private lateinit var fakeDeviceEntryFingerprintAuthRepository: FakeDeviceEntryFingerprintAuthRepository private lateinit var fakeKeyguardRepository: FakeKeyguardRepository + private lateinit var powerInteractor: PowerInteractor @Mock private lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor @Mock private lateinit var faceWakeUpTriggersConfig: FaceWakeUpTriggersConfig @@ -117,6 +120,7 @@ class KeyguardFaceAuthInteractorTest : SysuiTestCase() { fakeUserRepository.setUserInfos(listOf(primaryUser, secondaryUser)) facePropertyRepository = FakeFacePropertyRepository() fakeKeyguardRepository = FakeKeyguardRepository() + powerInteractor = PowerInteractorFactory.create().powerInteractor underTest = SystemUIKeyguardFaceAuthInteractor( mContext, @@ -154,6 +158,7 @@ class KeyguardFaceAuthInteractorTest : SysuiTestCase() { facePropertyRepository, fakeKeyguardRepository, faceWakeUpTriggersConfig, + powerInteractor, ) } @@ -162,13 +167,7 @@ class KeyguardFaceAuthInteractorTest : SysuiTestCase() { testScope.runTest { underTest.start() - fakeKeyguardRepository.setWakefulnessModel( - WakefulnessModel( - WakefulnessState.STARTING_TO_WAKE, - WakeSleepReason.LID, - WakeSleepReason.LID - ) - ) + powerInteractor.setAwakeForTest(reason = PowerManager.WAKE_REASON_LID) whenever( faceWakeUpTriggersConfig.shouldTriggerFaceAuthOnWakeUpFrom(WakeSleepReason.LID) ) @@ -210,13 +209,7 @@ class KeyguardFaceAuthInteractorTest : SysuiTestCase() { testScope.runTest { underTest.start() - fakeKeyguardRepository.setWakefulnessModel( - WakefulnessModel( - WakefulnessState.STARTING_TO_WAKE, - WakeSleepReason.LID, - WakeSleepReason.LID - ) - ) + powerInteractor.setAwakeForTest(reason = PowerManager.WAKE_REASON_LID) whenever( faceWakeUpTriggersConfig.shouldTriggerFaceAuthOnWakeUpFrom(WakeSleepReason.LID) ) @@ -242,13 +235,7 @@ class KeyguardFaceAuthInteractorTest : SysuiTestCase() { testScope.runTest { underTest.start() - fakeKeyguardRepository.setWakefulnessModel( - WakefulnessModel( - WakefulnessState.STARTING_TO_WAKE, - WakeSleepReason.LIFT, - WakeSleepReason.POWER_BUTTON - ) - ) + powerInteractor.setAwakeForTest(reason = PowerManager.WAKE_REASON_LIFT) whenever( faceWakeUpTriggersConfig.shouldTriggerFaceAuthOnWakeUpFrom(WakeSleepReason.LIFT) ) @@ -271,13 +258,7 @@ class KeyguardFaceAuthInteractorTest : SysuiTestCase() { testScope.runTest { underTest.start() - fakeKeyguardRepository.setWakefulnessModel( - WakefulnessModel( - WakefulnessState.STARTING_TO_WAKE, - WakeSleepReason.LID, - WakeSleepReason.LID - ) - ) + powerInteractor.setAwakeForTest(reason = PowerManager.WAKE_REASON_LID) whenever( faceWakeUpTriggersConfig.shouldTriggerFaceAuthOnWakeUpFrom(WakeSleepReason.LID) ) diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt index 82c7fa4c4d12..ca52cdb227e5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorTest.kt @@ -29,6 +29,7 @@ import com.android.systemui.flags.FakeFeatureFlagsClassic import com.android.systemui.flags.Flags.FACE_AUTH_REFACTOR import com.android.systemui.keyguard.data.repository.FakeCommandQueue import com.android.systemui.keyguard.shared.model.CameraLaunchSourceModel +import com.android.systemui.power.domain.interactor.PowerInteractorFactory import com.android.systemui.scene.SceneTestUtils import com.android.systemui.scene.shared.model.ObservableTransitionState import com.android.systemui.scene.shared.model.SceneKey @@ -66,6 +67,7 @@ class KeyguardInteractorTest : SysuiTestCase() { KeyguardInteractor( repository = repository, commandQueue = commandQueue, + powerInteractor = PowerInteractorFactory.create().powerInteractor, featureFlags = featureFlags, sceneContainerFlags = testUtils.sceneContainerFlags, deviceEntryRepository = testUtils.deviceEntryRepository, diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardKeyEventInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardKeyEventInteractorTest.kt index a3f7fc5fc8cf..bbe68234f055 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardKeyEventInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardKeyEventInteractorTest.kt @@ -23,11 +23,12 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.back.domain.interactor.BackActionInteractor -import com.android.systemui.keyguard.shared.model.WakeSleepReason -import com.android.systemui.keyguard.shared.model.WakefulnessModel -import com.android.systemui.keyguard.shared.model.WakefulnessState import com.android.systemui.media.controls.util.MediaSessionLegacyHelperWrapper import com.android.systemui.plugins.statusbar.StatusBarStateController +import com.android.systemui.power.domain.interactor.PowerInteractor +import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAsleepForTest +import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest +import com.android.systemui.power.domain.interactor.PowerInteractorFactory import com.android.systemui.shade.ShadeController import com.android.systemui.statusbar.StatusBarState import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager @@ -55,13 +56,10 @@ class KeyguardKeyEventInteractorTest : SysuiTestCase() { private val actionDownVolumeUpKeyEvent = KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_VOLUME_UP) private val backKeyEvent = KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK) - private val awakeWakefulnessMode = - WakefulnessModel(WakefulnessState.AWAKE, WakeSleepReason.OTHER, WakeSleepReason.OTHER) - private val asleepWakefulnessMode = - WakefulnessModel(WakefulnessState.ASLEEP, WakeSleepReason.OTHER, WakeSleepReason.OTHER) private lateinit var keyguardInteractorWithDependencies: KeyguardInteractorFactory.WithDependencies + private lateinit var powerInteractor: PowerInteractor @Mock private lateinit var statusBarStateController: StatusBarStateController @Mock private lateinit var statusBarKeyguardViewManager: StatusBarKeyguardViewManager @Mock private lateinit var shadeController: ShadeController @@ -76,6 +74,8 @@ class KeyguardKeyEventInteractorTest : SysuiTestCase() { whenever(mediaSessionLegacyHelperWrapper.getHelper(any())) .thenReturn(mediaSessionLegacyHelper) keyguardInteractorWithDependencies = KeyguardInteractorFactory.create() + powerInteractor = PowerInteractorFactory.create().powerInteractor + underTest = KeyguardKeyEventInteractor( context, @@ -85,6 +85,7 @@ class KeyguardKeyEventInteractorTest : SysuiTestCase() { shadeController, mediaSessionLegacyHelperWrapper, backActionInteractor, + powerInteractor, ) } @@ -132,7 +133,7 @@ class KeyguardKeyEventInteractorTest : SysuiTestCase() { @Test fun dispatchKeyEvent_menuActionUp_interactiveKeyguard_collapsesShade() { - keyguardInteractorWithDependencies.repository.setWakefulnessModel(awakeWakefulnessMode) + powerInteractor.setAwakeForTest() whenever(statusBarStateController.state).thenReturn(StatusBarState.KEYGUARD) whenever(statusBarKeyguardViewManager.shouldDismissOnMenuPressed()).thenReturn(true) @@ -143,7 +144,7 @@ class KeyguardKeyEventInteractorTest : SysuiTestCase() { @Test fun dispatchKeyEvent_menuActionUp_interactiveShadeLocked_collapsesShade() { - keyguardInteractorWithDependencies.repository.setWakefulnessModel(awakeWakefulnessMode) + powerInteractor.setAwakeForTest() whenever(statusBarStateController.state).thenReturn(StatusBarState.SHADE_LOCKED) whenever(statusBarKeyguardViewManager.shouldDismissOnMenuPressed()).thenReturn(true) @@ -160,7 +161,7 @@ class KeyguardKeyEventInteractorTest : SysuiTestCase() { @Test fun dispatchKeyEvent_menuActionUp_nonInteractiveKeyguard_neverCollapsesShade() { - keyguardInteractorWithDependencies.repository.setWakefulnessModel(asleepWakefulnessMode) + powerInteractor.setAsleepForTest() whenever(statusBarStateController.state).thenReturn(StatusBarState.KEYGUARD) whenever(statusBarKeyguardViewManager.shouldDismissOnMenuPressed()).thenReturn(true) @@ -171,7 +172,7 @@ class KeyguardKeyEventInteractorTest : SysuiTestCase() { @Test fun dispatchKeyEvent_spaceActionUp_interactiveKeyguard_collapsesShade() { - keyguardInteractorWithDependencies.repository.setWakefulnessModel(awakeWakefulnessMode) + powerInteractor.setAwakeForTest() whenever(statusBarStateController.state).thenReturn(StatusBarState.KEYGUARD) // action down: does NOT collapse the shade 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 591653ee214f..2cf0e77b5994 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 @@ -36,9 +36,10 @@ import com.android.systemui.keyguard.shared.model.StatusBarState import com.android.systemui.keyguard.shared.model.TransitionInfo import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.keyguard.shared.model.TransitionStep -import com.android.systemui.keyguard.shared.model.WakeSleepReason -import com.android.systemui.keyguard.shared.model.WakefulnessModel -import com.android.systemui.keyguard.shared.model.WakefulnessState +import com.android.systemui.power.domain.interactor.PowerInteractor +import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAsleepForTest +import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest +import com.android.systemui.power.domain.interactor.PowerInteractorFactory import com.android.systemui.shade.data.repository.FakeShadeRepository import com.android.systemui.shade.domain.model.ShadeModel import com.android.systemui.util.mockito.any @@ -99,6 +100,9 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { private lateinit var fromDreamingLockscreenHostedTransitionInteractor: FromDreamingLockscreenHostedTransitionInteractor + private lateinit var powerInteractor: PowerInteractor + private lateinit var keyguardInteractor: KeyguardInteractor + @Before fun setUp() { MockitoAnnotations.initMocks(this) @@ -109,6 +113,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { commandQueue = FakeCommandQueue() shadeRepository = FakeShadeRepository() transitionRepository = spy(FakeKeyguardTransitionRepository()) + powerInteractor = PowerInteractorFactory.create().powerInteractor whenever(keyguardSecurityModel.getSecurityMode(anyInt())).thenReturn(PIN) @@ -118,11 +123,13 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { set(Flags.KEYGUARD_WM_STATE_REFACTOR, false) } + keyguardInteractor = createKeyguardInteractor() + transitionInteractor = KeyguardTransitionInteractorFactory.create( scope = testScope, repository = transitionRepository, - keyguardInteractor = createKeyguardInteractor(), + keyguardInteractor = keyguardInteractor, fromLockscreenTransitionInteractor = { fromLockscreenTransitionInteractor }, fromPrimaryBouncerTransitionInteractor = { fromPrimaryBouncerTransitionInteractor @@ -133,29 +140,31 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { fromLockscreenTransitionInteractor = FromLockscreenTransitionInteractor( scope = testScope, - keyguardInteractor = createKeyguardInteractor(), + keyguardInteractor = keyguardInteractor, transitionRepository = transitionRepository, transitionInteractor = transitionInteractor, flags = featureFlags, shadeRepository = shadeRepository, + powerInteractor = powerInteractor, ) .apply { start() } fromPrimaryBouncerTransitionInteractor = FromPrimaryBouncerTransitionInteractor( scope = testScope, - keyguardInteractor = createKeyguardInteractor(), + keyguardInteractor = keyguardInteractor, transitionRepository = transitionRepository, transitionInteractor = transitionInteractor, flags = featureFlags, keyguardSecurityModel = keyguardSecurityModel, + powerInteractor = powerInteractor, ) .apply { start() } fromDreamingTransitionInteractor = FromDreamingTransitionInteractor( scope = testScope, - keyguardInteractor = createKeyguardInteractor(), + keyguardInteractor = keyguardInteractor, transitionRepository = transitionRepository, transitionInteractor = transitionInteractor, ) @@ -164,7 +173,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { fromDreamingLockscreenHostedTransitionInteractor = FromDreamingLockscreenHostedTransitionInteractor( scope = testScope, - keyguardInteractor = createKeyguardInteractor(), + keyguardInteractor = keyguardInteractor, transitionRepository = transitionRepository, transitionInteractor = transitionInteractor, ) @@ -173,7 +182,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { fromAodTransitionInteractor = FromAodTransitionInteractor( scope = testScope, - keyguardInteractor = createKeyguardInteractor(), + keyguardInteractor = keyguardInteractor, transitionRepository = transitionRepository, transitionInteractor = transitionInteractor, ) @@ -182,36 +191,40 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { fromGoneTransitionInteractor = FromGoneTransitionInteractor( scope = testScope, - keyguardInteractor = createKeyguardInteractor(), + keyguardInteractor = keyguardInteractor, transitionRepository = transitionRepository, transitionInteractor = transitionInteractor, + powerInteractor = powerInteractor, ) .apply { start() } fromDozingTransitionInteractor = FromDozingTransitionInteractor( scope = testScope, - keyguardInteractor = createKeyguardInteractor(), + keyguardInteractor = keyguardInteractor, transitionRepository = transitionRepository, transitionInteractor = transitionInteractor, + powerInteractor = powerInteractor, ) .apply { start() } fromOccludedTransitionInteractor = FromOccludedTransitionInteractor( scope = testScope, - keyguardInteractor = createKeyguardInteractor(), + keyguardInteractor = keyguardInteractor, transitionRepository = transitionRepository, transitionInteractor = transitionInteractor, + powerInteractor = powerInteractor, ) .apply { start() } fromAlternateBouncerTransitionInteractor = FromAlternateBouncerTransitionInteractor( scope = testScope, - keyguardInteractor = createKeyguardInteractor(), + keyguardInteractor = keyguardInteractor, transitionRepository = transitionRepository, transitionInteractor = transitionInteractor, + powerInteractor = powerInteractor, ) .apply { start() } } @@ -219,12 +232,8 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { @Test fun lockscreenToPrimaryBouncerViaBouncerShowingCall() = testScope.runTest { - // GIVEN a device that has at least woken up - keyguardRepository.setWakefulnessModel(startingToWake()) - runCurrent() - // GIVEN a prior transition has run to LOCKSCREEN - runTransition(KeyguardState.OFF, KeyguardState.LOCKSCREEN) + runTransitionAndSetWakefulness(KeyguardState.OFF, KeyguardState.LOCKSCREEN) // WHEN the primary bouncer is set to show bouncerRepository.setPrimaryShow(true) @@ -251,10 +260,10 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { runCurrent() // GIVEN a prior transition has run to OCCLUDED - runTransition(KeyguardState.LOCKSCREEN, KeyguardState.OCCLUDED) + runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.OCCLUDED) // WHEN the device begins to sleep - keyguardRepository.setWakefulnessModel(startingToSleep()) + powerInteractor.setAsleepForTest() runCurrent() val info = @@ -278,10 +287,10 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { runCurrent() // GIVEN a prior transition has run to OCCLUDED - runTransition(KeyguardState.LOCKSCREEN, KeyguardState.OCCLUDED) + runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.OCCLUDED) // WHEN the device begins to sleep - keyguardRepository.setWakefulnessModel(startingToSleep()) + powerInteractor.setAsleepForTest() runCurrent() val info = @@ -302,14 +311,13 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { testScope.runTest { // GIVEN a device that is not dreaming or dozing keyguardRepository.setDreamingWithOverlay(false) - keyguardRepository.setWakefulnessModel(startingToWake()) keyguardRepository.setDozeTransitionModel( DozeTransitionModel(from = DozeStateModel.DOZE, to = DozeStateModel.FINISH) ) runCurrent() // GIVEN a prior transition has run to LOCKSCREEN - runTransition(KeyguardState.GONE, KeyguardState.LOCKSCREEN) + runTransitionAndSetWakefulness(KeyguardState.GONE, KeyguardState.LOCKSCREEN) // WHEN the device begins to dream keyguardRepository.setDreamingWithOverlay(true) @@ -333,14 +341,13 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { testScope.runTest { // GIVEN a device that is not dreaming or dozing keyguardRepository.setDreamingWithOverlay(false) - keyguardRepository.setWakefulnessModel(startingToWake()) keyguardRepository.setDozeTransitionModel( DozeTransitionModel(from = DozeStateModel.DOZE, to = DozeStateModel.FINISH) ) runCurrent() // GIVEN a prior transition has run to LOCKSCREEN - runTransition(KeyguardState.GONE, KeyguardState.LOCKSCREEN) + runTransitionAndSetWakefulness(KeyguardState.GONE, KeyguardState.LOCKSCREEN) // WHEN the device begins to dream and the dream is lockscreen hosted keyguardRepository.setDreamingWithOverlay(true) @@ -368,10 +375,10 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { runCurrent() // GIVEN a prior transition has run to LOCKSCREEN - runTransition(KeyguardState.GONE, KeyguardState.LOCKSCREEN) + runTransitionAndSetWakefulness(KeyguardState.GONE, KeyguardState.LOCKSCREEN) // WHEN the device begins to sleep - keyguardRepository.setWakefulnessModel(startingToSleep()) + powerInteractor.setAsleepForTest() runCurrent() val info = @@ -395,10 +402,10 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { runCurrent() // GIVEN a prior transition has run to LOCKSCREEN - runTransition(KeyguardState.GONE, KeyguardState.LOCKSCREEN) + runTransitionAndSetWakefulness(KeyguardState.GONE, KeyguardState.LOCKSCREEN) // WHEN the device begins to sleep - keyguardRepository.setWakefulnessModel(startingToSleep()) + powerInteractor.setAsleepForTest() runCurrent() val info = @@ -419,14 +426,14 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { testScope.runTest { // GIVEN a device dreaming with the lockscreen hosted dream and not dozing keyguardRepository.setIsActiveDreamLockscreenHosted(true) - keyguardRepository.setWakefulnessModel(startingToWake()) keyguardRepository.setDozeTransitionModel( DozeTransitionModel(from = DozeStateModel.DOZE, to = DozeStateModel.FINISH) ) runCurrent() // GIVEN a prior transition has run to DREAMING_LOCKSCREEN_HOSTED - runTransition(KeyguardState.GONE, KeyguardState.DREAMING_LOCKSCREEN_HOSTED) + runTransitionAndSetWakefulness( + KeyguardState.GONE, KeyguardState.DREAMING_LOCKSCREEN_HOSTED) // WHEN the lockscreen hosted dream stops keyguardRepository.setIsActiveDreamLockscreenHosted(false) @@ -449,7 +456,8 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { fun dreamingLockscreenHostedToGone() = testScope.runTest { // GIVEN a prior transition has run to DREAMING_LOCKSCREEN_HOSTED - runTransition(KeyguardState.GONE, KeyguardState.DREAMING_LOCKSCREEN_HOSTED) + runTransitionAndSetWakefulness( + KeyguardState.GONE, KeyguardState.DREAMING_LOCKSCREEN_HOSTED) // WHEN biometrics succeeds with wake and unlock from dream mode keyguardRepository.setBiometricUnlockState( @@ -475,11 +483,11 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { testScope.runTest { // GIVEN a device dreaming with lockscreen hosted dream and not dozing keyguardRepository.setIsActiveDreamLockscreenHosted(true) - keyguardRepository.setWakefulnessModel(startingToWake()) runCurrent() // GIVEN a prior transition has run to DREAMING_LOCKSCREEN_HOSTED - runTransition(KeyguardState.GONE, KeyguardState.DREAMING_LOCKSCREEN_HOSTED) + runTransitionAndSetWakefulness( + KeyguardState.GONE, KeyguardState.DREAMING_LOCKSCREEN_HOSTED) // WHEN the primary bouncer is set to show bouncerRepository.setPrimaryShow(true) @@ -506,7 +514,8 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { runCurrent() // GIVEN a prior transition has run to DREAMING_LOCKSCREEN_HOSTED - runTransition(KeyguardState.GONE, KeyguardState.DREAMING_LOCKSCREEN_HOSTED) + runTransitionAndSetWakefulness( + KeyguardState.GONE, KeyguardState.DREAMING_LOCKSCREEN_HOSTED) // WHEN the device begins to sleep keyguardRepository.setIsActiveDreamLockscreenHosted(false) @@ -537,7 +546,8 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { runCurrent() // GIVEN a prior transition has run to DREAMING_LOCKSCREEN_HOSTED - runTransition(KeyguardState.GONE, KeyguardState.DREAMING_LOCKSCREEN_HOSTED) + runTransitionAndSetWakefulness( + KeyguardState.GONE, KeyguardState.DREAMING_LOCKSCREEN_HOSTED) // WHEN the keyguard is occluded and the lockscreen hosted dream stops keyguardRepository.setIsActiveDreamLockscreenHosted(false) @@ -561,10 +571,11 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { fun dozingToLockscreen() = testScope.runTest { // GIVEN a prior transition has run to DOZING - runTransition(KeyguardState.LOCKSCREEN, KeyguardState.DOZING) + runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.DOZING) + runCurrent() // WHEN the device begins to wake - keyguardRepository.setWakefulnessModel(startingToWake()) + powerInteractor.setAwakeForTest() runCurrent() val info = @@ -610,7 +621,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { fun dozingToGone() = testScope.runTest { // GIVEN a prior transition has run to DOZING - runTransition(KeyguardState.LOCKSCREEN, KeyguardState.DOZING) + runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.DOZING) // WHEN biometrics succeeds with wake and unlock mode keyguardRepository.setBiometricUnlockState(BiometricUnlockModel.WAKE_AND_UNLOCK) @@ -637,10 +648,10 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { runCurrent() // GIVEN a prior transition has run to GONE - runTransition(KeyguardState.LOCKSCREEN, KeyguardState.GONE) + runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.GONE) // WHEN the device begins to sleep - keyguardRepository.setWakefulnessModel(startingToSleep()) + powerInteractor.setAsleepForTest() runCurrent() val info = @@ -664,10 +675,10 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { runCurrent() // GIVEN a prior transition has run to GONE - runTransition(KeyguardState.LOCKSCREEN, KeyguardState.GONE) + runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.GONE) // WHEN the device begins to sleep - keyguardRepository.setWakefulnessModel(startingToSleep()) + powerInteractor.setAsleepForTest() runCurrent() val info = @@ -687,7 +698,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { fun goneToLockscreen() = testScope.runTest { // GIVEN a prior transition has run to GONE - runTransition(KeyguardState.LOCKSCREEN, KeyguardState.GONE) + runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.GONE) // WHEN the keyguard starts to show keyguardRepository.setKeyguardShowing(true) @@ -711,14 +722,13 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { testScope.runTest { // GIVEN a device that is not dreaming or dozing keyguardRepository.setDreamingWithOverlay(false) - keyguardRepository.setWakefulnessModel(startingToWake()) keyguardRepository.setDozeTransitionModel( DozeTransitionModel(from = DozeStateModel.DOZE, to = DozeStateModel.FINISH) ) runCurrent() // GIVEN a prior transition has run to GONE - runTransition(KeyguardState.LOCKSCREEN, KeyguardState.GONE) + runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.GONE) // WHEN the device begins to dream keyguardRepository.setDreamingWithOverlay(true) @@ -742,14 +752,13 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { testScope.runTest { // GIVEN a device that is not dreaming or dozing keyguardRepository.setDreamingWithOverlay(false) - keyguardRepository.setWakefulnessModel(startingToWake()) keyguardRepository.setDozeTransitionModel( DozeTransitionModel(from = DozeStateModel.DOZE, to = DozeStateModel.FINISH) ) runCurrent() // GIVEN a prior transition has run to GONE - runTransition(KeyguardState.LOCKSCREEN, KeyguardState.GONE) + runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.GONE) // WHEN the device begins to dream with the lockscreen hosted dream keyguardRepository.setDreamingWithOverlay(true) @@ -773,7 +782,8 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { fun alternateBouncerToPrimaryBouncer() = testScope.runTest { // GIVEN a prior transition has run to ALTERNATE_BOUNCER - runTransition(KeyguardState.LOCKSCREEN, KeyguardState.ALTERNATE_BOUNCER) + runTransitionAndSetWakefulness( + KeyguardState.LOCKSCREEN, KeyguardState.ALTERNATE_BOUNCER) // WHEN the alternateBouncer stops showing and then the primary bouncer shows bouncerRepository.setPrimaryShow(true) @@ -797,12 +807,13 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { testScope.runTest { // GIVEN a prior transition has run to ALTERNATE_BOUNCER bouncerRepository.setAlternateVisible(true) - runTransition(KeyguardState.LOCKSCREEN, KeyguardState.ALTERNATE_BOUNCER) + runTransitionAndSetWakefulness( + KeyguardState.LOCKSCREEN, KeyguardState.ALTERNATE_BOUNCER) // GIVEN the primary bouncer isn't showing, aod available and starting to sleep bouncerRepository.setPrimaryShow(false) keyguardRepository.setAodAvailable(true) - keyguardRepository.setWakefulnessModel(startingToSleep()) + powerInteractor.setAsleepForTest() // WHEN the alternateBouncer stops showing bouncerRepository.setAlternateVisible(false) @@ -826,13 +837,14 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { testScope.runTest { // GIVEN a prior transition has run to ALTERNATE_BOUNCER bouncerRepository.setAlternateVisible(true) - runTransition(KeyguardState.LOCKSCREEN, KeyguardState.ALTERNATE_BOUNCER) + runTransitionAndSetWakefulness( + KeyguardState.LOCKSCREEN, KeyguardState.ALTERNATE_BOUNCER) // GIVEN the primary bouncer isn't showing, aod not available and starting to sleep // to sleep bouncerRepository.setPrimaryShow(false) keyguardRepository.setAodAvailable(false) - keyguardRepository.setWakefulnessModel(startingToSleep()) + powerInteractor.setAsleepForTest() // WHEN the alternateBouncer stops showing bouncerRepository.setAlternateVisible(false) @@ -856,11 +868,11 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { testScope.runTest { // GIVEN a prior transition has run to ALTERNATE_BOUNCER bouncerRepository.setAlternateVisible(true) - runTransition(KeyguardState.LOCKSCREEN, KeyguardState.ALTERNATE_BOUNCER) + runTransitionAndSetWakefulness( + KeyguardState.LOCKSCREEN, KeyguardState.ALTERNATE_BOUNCER) // GIVEN the primary bouncer isn't showing and device not sleeping bouncerRepository.setPrimaryShow(false) - keyguardRepository.setWakefulnessModel(startingToWake()) // WHEN the alternateBouncer stops showing bouncerRepository.setAlternateVisible(false) @@ -884,11 +896,11 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { testScope.runTest { // GIVEN a prior transition has run to PRIMARY_BOUNCER bouncerRepository.setPrimaryShow(true) - runTransition(KeyguardState.LOCKSCREEN, KeyguardState.PRIMARY_BOUNCER) + runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.PRIMARY_BOUNCER) // GIVEN aod available and starting to sleep keyguardRepository.setAodAvailable(true) - keyguardRepository.setWakefulnessModel(startingToSleep()) + powerInteractor.setAsleepForTest() // WHEN the primaryBouncer stops showing bouncerRepository.setPrimaryShow(false) @@ -912,11 +924,11 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { testScope.runTest { // GIVEN a prior transition has run to PRIMARY_BOUNCER bouncerRepository.setPrimaryShow(true) - runTransition(KeyguardState.LOCKSCREEN, KeyguardState.PRIMARY_BOUNCER) + runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.PRIMARY_BOUNCER) // GIVEN aod not available and starting to sleep to sleep keyguardRepository.setAodAvailable(false) - keyguardRepository.setWakefulnessModel(startingToSleep()) + powerInteractor.setAsleepForTest() // WHEN the primaryBouncer stops showing bouncerRepository.setPrimaryShow(false) @@ -940,10 +952,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { testScope.runTest { // GIVEN a prior transition has run to PRIMARY_BOUNCER bouncerRepository.setPrimaryShow(true) - runTransition(KeyguardState.LOCKSCREEN, KeyguardState.PRIMARY_BOUNCER) - - // GIVEN device not sleeping - keyguardRepository.setWakefulnessModel(startingToWake()) + runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.PRIMARY_BOUNCER) // WHEN the alternateBouncer stops showing bouncerRepository.setPrimaryShow(false) @@ -967,11 +976,11 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { testScope.runTest { // GIVEN device dreaming with the lockscreen hosted dream and not dozing keyguardRepository.setIsActiveDreamLockscreenHosted(true) - keyguardRepository.setWakefulnessModel(startingToWake()) // GIVEN a prior transition has run to PRIMARY_BOUNCER bouncerRepository.setPrimaryShow(true) - runTransition(KeyguardState.DREAMING_LOCKSCREEN_HOSTED, KeyguardState.PRIMARY_BOUNCER) + runTransitionAndSetWakefulness( + KeyguardState.DREAMING_LOCKSCREEN_HOSTED, KeyguardState.PRIMARY_BOUNCER) // WHEN the primary bouncer stops showing and lockscreen hosted dream still active bouncerRepository.setPrimaryShow(false) @@ -998,7 +1007,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { runCurrent() // GIVEN a prior transition has run to OCCLUDED - runTransition(KeyguardState.LOCKSCREEN, KeyguardState.OCCLUDED) + runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.OCCLUDED) keyguardRepository.setKeyguardOccluded(true) runCurrent() @@ -1029,7 +1038,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { runCurrent() // GIVEN a prior transition has run to OCCLUDED - runTransition(KeyguardState.LOCKSCREEN, KeyguardState.OCCLUDED) + runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.OCCLUDED) keyguardRepository.setKeyguardOccluded(true) runCurrent() @@ -1054,7 +1063,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { fun occludedToAlternateBouncer() = testScope.runTest { // GIVEN a prior transition has run to OCCLUDED - runTransition(KeyguardState.LOCKSCREEN, KeyguardState.OCCLUDED) + runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.OCCLUDED) keyguardRepository.setKeyguardOccluded(true) runCurrent() @@ -1079,7 +1088,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { fun occludedToPrimaryBouncer() = testScope.runTest { // GIVEN a prior transition has run to OCCLUDED - runTransition(KeyguardState.LOCKSCREEN, KeyguardState.OCCLUDED) + runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.OCCLUDED) keyguardRepository.setKeyguardOccluded(true) runCurrent() @@ -1103,11 +1112,8 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { @Test fun primaryBouncerToOccluded() = testScope.runTest { - // GIVEN device not sleeping - keyguardRepository.setWakefulnessModel(startingToWake()) - // GIVEN a prior transition has run to PRIMARY_BOUNCER - runTransition(KeyguardState.LOCKSCREEN, KeyguardState.PRIMARY_BOUNCER) + runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.PRIMARY_BOUNCER) bouncerRepository.setPrimaryShow(true) runCurrent() @@ -1133,12 +1139,12 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { fun dozingToOccluded() = testScope.runTest { // GIVEN a prior transition has run to DOZING - runTransition(KeyguardState.LOCKSCREEN, KeyguardState.DOZING) + runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.DOZING) runCurrent() // WHEN the keyguard is occluded and device wakes up keyguardRepository.setKeyguardOccluded(true) - keyguardRepository.setWakefulnessModel(startingToWake()) + powerInteractor.setAwakeForTest() runCurrent() val info = @@ -1158,7 +1164,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { fun aodToOccluded() = testScope.runTest { // GIVEN a prior transition has run to AOD - runTransition(KeyguardState.LOCKSCREEN, KeyguardState.AOD) + runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.AOD) runCurrent() // WHEN the keyguard is occluded and aod ends @@ -1188,11 +1194,11 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { fun lockscreenToOccluded_fromCameraGesture() = testScope.runTest { // GIVEN a prior transition has run to LOCKSCREEN - runTransition(KeyguardState.AOD, KeyguardState.LOCKSCREEN) + runTransitionAndSetWakefulness(KeyguardState.AOD, KeyguardState.LOCKSCREEN) runCurrent() // WHEN the device begins to sleep (first power button press)... - keyguardRepository.setWakefulnessModel(startingToSleep()) + powerInteractor.setAsleepForTest() runCurrent() reset(transitionRepository) @@ -1221,7 +1227,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { fun lockscreenToPrimaryBouncerDragging() = testScope.runTest { // GIVEN a prior transition has run to LOCKSCREEN - runTransition(KeyguardState.AOD, KeyguardState.LOCKSCREEN) + runTransitionAndSetWakefulness(KeyguardState.AOD, KeyguardState.LOCKSCREEN) runCurrent() // GIVEN the keyguard is showing locked @@ -1247,7 +1253,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { // WHEN the user stops dragging and shade is back to expanded clearInvocations(transitionRepository) - runTransition(KeyguardState.LOCKSCREEN, KeyguardState.PRIMARY_BOUNCER) + runTransitionAndSetWakefulness(KeyguardState.LOCKSCREEN, KeyguardState.PRIMARY_BOUNCER) shadeRepository.setShadeModel( ShadeModel( expansionAmount = 1f, @@ -1268,31 +1274,21 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { coroutineContext.cancelChildren() } - private fun startingToWake() = - WakefulnessModel( - WakefulnessState.STARTING_TO_WAKE, - WakeSleepReason.OTHER, - WakeSleepReason.OTHER - ) - - private fun startingToSleep() = - WakefulnessModel( - WakefulnessState.STARTING_TO_SLEEP, - WakeSleepReason.OTHER, - WakeSleepReason.OTHER - ) - private fun createKeyguardInteractor(): KeyguardInteractor { return KeyguardInteractorFactory.create( featureFlags = featureFlags, repository = keyguardRepository, commandQueue = commandQueue, bouncerRepository = bouncerRepository, + powerInteractor = powerInteractor, ) .keyguardInteractor } - private suspend fun TestScope.runTransition(from: KeyguardState, to: KeyguardState) { + private suspend fun TestScope.runTransitionAndSetWakefulness( + from: KeyguardState, + to: KeyguardState + ) { transitionRepository.sendTransitionStep( TransitionStep( from = from, @@ -1321,5 +1317,11 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() { ) runCurrent() reset(transitionRepository) + + if (KeyguardState.deviceIsAwakeInState(to)) { + powerInteractor.setAwakeForTest() + } else { + powerInteractor.setAsleepForTest() + } } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/OccludingAppDeviceEntryInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/OccludingAppDeviceEntryInteractorTest.kt index 47365457d9e4..8262869ac6ea 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/OccludingAppDeviceEntryInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/OccludingAppDeviceEntryInteractorTest.kt @@ -84,6 +84,7 @@ class OccludingAppDeviceEntryInteractorTest : SysuiTestCase() { private lateinit var featureFlags: FakeFeatureFlags private lateinit var trustRepository: FakeTrustRepository private lateinit var powerRepository: FakePowerRepository + private lateinit var powerInteractor: PowerInteractor @Mock private lateinit var indicationHelper: IndicationHelper @Mock private lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor @@ -103,6 +104,14 @@ class OccludingAppDeviceEntryInteractorTest : SysuiTestCase() { featureFlags = FakeFeatureFlags().apply { set(Flags.FACE_AUTH_REFACTOR, false) } trustRepository = FakeTrustRepository() powerRepository = FakePowerRepository() + powerInteractor = + PowerInteractor( + powerRepository, + falsingCollector = mock(), + screenOffAnimationController = mock(), + statusBarStateController = mock(), + ) + underTest = OccludingAppDeviceEntryInteractor( BiometricMessageInteractor( @@ -120,6 +129,7 @@ class OccludingAppDeviceEntryInteractorTest : SysuiTestCase() { configurationRepository = configurationRepository, sceneInteractor = mock { whenever(transitioningTo).thenReturn(MutableStateFlow(null)) }, + powerInteractor = powerInteractor, ) .keyguardInteractor, PrimaryBouncerInteractor( @@ -147,13 +157,7 @@ class OccludingAppDeviceEntryInteractorTest : SysuiTestCase() { testScope.backgroundScope, mockedContext, activityStarter, - PowerInteractor( - powerRepository, - keyguardRepository, - falsingCollector = mock(), - screenOffAnimationController = mock(), - statusBarStateController = mock(), - ), + powerInteractor, ) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/UdfpsKeyguardInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/UdfpsKeyguardInteractorTest.kt index 6efec99ba834..3442df62a441 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/UdfpsKeyguardInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/UdfpsKeyguardInteractorTest.kt @@ -30,9 +30,9 @@ import com.android.systemui.flags.Flags import com.android.systemui.keyguard.data.repository.FakeCommandQueue import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository import com.android.systemui.keyguard.shared.model.StatusBarState -import com.android.systemui.keyguard.shared.model.WakeSleepReason -import com.android.systemui.keyguard.shared.model.WakefulnessModel -import com.android.systemui.keyguard.shared.model.WakefulnessState +import com.android.systemui.power.domain.interactor.PowerInteractor +import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest +import com.android.systemui.power.domain.interactor.PowerInteractorFactory import com.android.systemui.shade.data.repository.FakeShadeRepository import com.android.systemui.statusbar.phone.SystemUIDialogManager import com.android.systemui.util.mockito.argumentCaptor @@ -68,6 +68,7 @@ class UdfpsKeyguardInteractorTest : SysuiTestCase() { private lateinit var burnInInteractor: BurnInInteractor private lateinit var shadeRepository: FakeShadeRepository private lateinit var keyguardInteractor: KeyguardInteractor + private lateinit var powerInteractor: PowerInteractor @Mock private lateinit var burnInHelper: BurnInHelperWrapper @Mock private lateinit var dialogManager: SystemUIDialogManager @@ -99,6 +100,7 @@ class UdfpsKeyguardInteractorTest : SysuiTestCase() { configRepository, keyguardInteractor ) + powerInteractor = PowerInteractorFactory.create().powerInteractor underTest = UdfpsKeyguardInteractor( @@ -217,12 +219,6 @@ class UdfpsKeyguardInteractorTest : SysuiTestCase() { bouncerRepository.setAlternateVisible(false) keyguardRepository.setStatusBarState(StatusBarState.KEYGUARD) bouncerRepository.setPrimaryShow(false) - keyguardRepository.setWakefulnessModel( - WakefulnessModel( - WakefulnessState.AWAKE, - WakeSleepReason.POWER_BUTTON, - WakeSleepReason.POWER_BUTTON, - ) - ) + powerInteractor.setAwakeForTest() } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/power/domain/interactor/PowerInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/power/domain/interactor/PowerInteractorTest.kt index 5eda263be7a4..42cf9f4efc27 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/power/domain/interactor/PowerInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/power/domain/interactor/PowerInteractorTest.kt @@ -22,14 +22,16 @@ import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.classifier.FalsingCollector import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository -import com.android.systemui.keyguard.shared.model.WakeSleepReason -import com.android.systemui.keyguard.shared.model.WakefulnessModel -import com.android.systemui.keyguard.shared.model.WakefulnessState +import com.android.systemui.power.shared.model.WakeSleepReason +import com.android.systemui.power.shared.model.WakefulnessState import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.power.data.repository.FakePowerRepository import com.android.systemui.statusbar.phone.ScreenOffAnimationController import com.android.systemui.util.mockito.whenever import com.google.common.truth.Truth.assertThat +import junit.framework.Assert.assertFalse +import junit.framework.Assert.assertTrue +import kotlin.test.assertEquals import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -61,7 +63,6 @@ class PowerInteractorTest : SysuiTestCase() { underTest = PowerInteractor( repository, - keyguardRepository, falsingCollector, screenOffAnimationController, statusBarStateController, @@ -130,13 +131,7 @@ class PowerInteractorTest : SysuiTestCase() { @Test fun wakeUpForFullScreenIntent_notGoingToSleepAndNotDozing_notWoken() { - keyguardRepository.setWakefulnessModel( - WakefulnessModel( - state = WakefulnessState.AWAKE, - lastWakeReason = WakeSleepReason.OTHER, - lastSleepReason = WakeSleepReason.OTHER, - ) - ) + underTest.onFinishedWakingUp() whenever(statusBarStateController.isDozing).thenReturn(false) underTest.wakeUpForFullScreenIntent() @@ -147,13 +142,7 @@ class PowerInteractorTest : SysuiTestCase() { @Test fun wakeUpForFullScreenIntent_startingToSleep_woken() { - keyguardRepository.setWakefulnessModel( - WakefulnessModel( - state = WakefulnessState.STARTING_TO_SLEEP, - lastWakeReason = WakeSleepReason.OTHER, - lastSleepReason = WakeSleepReason.OTHER, - ) - ) + underTest.onStartedGoingToSleep(PowerManager.GO_TO_SLEEP_REASON_MIN) whenever(statusBarStateController.isDozing).thenReturn(false) underTest.wakeUpForFullScreenIntent() @@ -165,14 +154,7 @@ class PowerInteractorTest : SysuiTestCase() { @Test fun wakeUpForFullScreenIntent_dozing_woken() { whenever(statusBarStateController.isDozing).thenReturn(true) - keyguardRepository.setWakefulnessModel( - WakefulnessModel( - state = WakefulnessState.AWAKE, - lastWakeReason = WakeSleepReason.OTHER, - lastSleepReason = WakeSleepReason.OTHER, - ) - ) - + underTest.onFinishedWakingUp() underTest.wakeUpForFullScreenIntent() assertThat(repository.lastWakeWhy).isNotNull() @@ -205,6 +187,68 @@ class PowerInteractorTest : SysuiTestCase() { assertThat(repository.lastWakeReason).isNull() } + @Test + fun onStartedGoingToSleep_clearsPowerButtonLaunchGestureTriggered() { + underTest.onStartedWakingUp(PowerManager.WAKE_REASON_POWER_BUTTON, true) + + assertTrue(repository.wakefulness.value.powerButtonLaunchGestureTriggered) + + underTest.onFinishedWakingUp() + + assertTrue(repository.wakefulness.value.powerButtonLaunchGestureTriggered) + + underTest.onStartedGoingToSleep(PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON) + + assertFalse(repository.wakefulness.value.powerButtonLaunchGestureTriggered) + } + + @Test + fun onCameraLaunchGestureDetected_maintainsAllOtherState() { + underTest.onStartedWakingUp( + PowerManager.WAKE_REASON_POWER_BUTTON, + /*powerButtonLaunchGestureTriggeredDuringSleep= */ false + ) + underTest.onFinishedWakingUp() + underTest.onCameraLaunchGestureDetected() + + assertEquals(WakefulnessState.AWAKE, repository.wakefulness.value.internalWakefulnessState) + assertEquals(WakeSleepReason.POWER_BUTTON, repository.wakefulness.value.lastWakeReason) + assertTrue(repository.wakefulness.value.powerButtonLaunchGestureTriggered) + } + + @Test + fun onCameraLaunchGestureDetected_stillTrue_ifGestureNotDetectedOnWakingUp() { + underTest.onCameraLaunchGestureDetected() + // Ensure that the 'false' here does not clear the direct launch detection call earlier. + // This state should only be reset onStartedGoingToSleep. + underTest.onFinishedGoingToSleep(/*powerButtonLaunchGestureTriggeredDuringSleep= */ false) + underTest.onStartedWakingUp( + PowerManager.WAKE_REASON_POWER_BUTTON, + /*powerButtonLaunchGestureTriggeredDuringSleep= */ false + ) + underTest.onFinishedWakingUp() + + assertEquals(WakefulnessState.AWAKE, repository.wakefulness.value.internalWakefulnessState) + assertEquals(WakeSleepReason.POWER_BUTTON, repository.wakefulness.value.lastWakeReason) + assertTrue(repository.wakefulness.value.powerButtonLaunchGestureTriggered) + } + + @Test + fun cameraLaunchDetectedOnGoingToSleep_stillTrue_ifGestureNotDetectedOnWakingUp() { + underTest.onFinishedGoingToSleep(/*powerButtonLaunchGestureTriggeredDuringSleep= */ true) + // Ensure that the 'false' here does not clear the direct launch detection call earlier. + // This state should only be reset onStartedGoingToSleep. + underTest.onStartedWakingUp( + PowerManager.WAKE_REASON_POWER_BUTTON, + /*powerButtonLaunchGestureTriggeredDuringSleep= */ false + ) + underTest.onFinishedWakingUp() + + assertEquals(WakefulnessState.AWAKE, repository.wakefulness.value.internalWakefulnessState) + assertEquals(WakeSleepReason.POWER_BUTTON, repository.wakefulness.value.lastWakeReason) + assertTrue(repository.wakefulness.value.powerButtonLaunchGestureTriggered) + } + companion object { private val IMMEDIATE = Dispatchers.Main.immediate } diff --git a/packages/SystemUI/tests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt b/packages/SystemUI/tests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt index 5259013afc95..91f38656e02d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt @@ -24,10 +24,12 @@ import com.android.systemui.authentication.data.repository.FakeAuthenticationRep import com.android.systemui.authentication.domain.model.AuthenticationMethodModel as DomainLayerAuthenticationMethodModel import com.android.systemui.bouncer.ui.viewmodel.PinBouncerViewModel import com.android.systemui.coroutines.collectLastValue -import com.android.systemui.keyguard.shared.model.WakefulnessState import com.android.systemui.keyguard.ui.viewmodel.KeyguardLongPressViewModel import com.android.systemui.keyguard.ui.viewmodel.LockscreenSceneViewModel import com.android.systemui.model.SysUiState +import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAsleepForTest +import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest +import com.android.systemui.power.domain.interactor.PowerInteractorFactory import com.android.systemui.scene.SceneTestUtils.Companion.toDataLayer import com.android.systemui.scene.domain.startable.SceneContainerStartable import com.android.systemui.scene.shared.model.ObservableTransitionState @@ -158,6 +160,7 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { utils.keyguardInteractor( repository = keyguardRepository, ) + private val powerInteractor = PowerInteractorFactory.create().powerInteractor private var bouncerSceneJob: Job? = null @@ -197,6 +200,7 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { displayId = displayTracker.defaultDisplayId, sceneLogger = mock(), falsingCollector = utils.falsingCollector(), + powerInteractor = powerInteractor, ) startable.start() @@ -571,18 +575,12 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { /** Changes device wakefulness state from asleep to awake, going through intermediary states. */ private fun TestScope.wakeUpDevice() { - val wakefulnessModel = keyguardRepository.wakefulness.value + val wakefulnessModel = powerInteractor.detailedWakefulness.value assertWithMessage("Cannot wake up device as it's already awake!") - .that(wakefulnessModel.isStartingToWakeOrAwake()) + .that(wakefulnessModel.isAwake()) .isFalse() - keyguardRepository.setWakefulnessModel( - wakefulnessModel.copy(state = WakefulnessState.STARTING_TO_WAKE) - ) - runCurrent() - keyguardRepository.setWakefulnessModel( - wakefulnessModel.copy(state = WakefulnessState.AWAKE) - ) + powerInteractor.setAwakeForTest() runCurrent() } @@ -590,18 +588,12 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { private suspend fun TestScope.putDeviceToSleep( instantlyLockDevice: Boolean = true, ) { - val wakefulnessModel = keyguardRepository.wakefulness.value + val wakefulnessModel = powerInteractor.detailedWakefulness.value assertWithMessage("Cannot put device to sleep as it's already asleep!") - .that(wakefulnessModel.isStartingToWakeOrAwake()) + .that(wakefulnessModel.isAwake()) .isTrue() - keyguardRepository.setWakefulnessModel( - wakefulnessModel.copy(state = WakefulnessState.STARTING_TO_SLEEP) - ) - runCurrent() - keyguardRepository.setWakefulnessModel( - wakefulnessModel.copy(state = WakefulnessState.ASLEEP) - ) + powerInteractor.setAsleepForTest() runCurrent() if (instantlyLockDevice) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/scene/domain/interactor/WindowRootViewVisibilityInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/scene/domain/interactor/WindowRootViewVisibilityInteractorTest.kt index f304435b7a7a..3785fd7436c1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/scene/domain/interactor/WindowRootViewVisibilityInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/scene/domain/interactor/WindowRootViewVisibilityInteractorTest.kt @@ -22,9 +22,9 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.coroutines.collectLastValue import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository import com.android.systemui.keyguard.shared.model.StatusBarState -import com.android.systemui.keyguard.shared.model.WakeSleepReason -import com.android.systemui.keyguard.shared.model.WakefulnessModel -import com.android.systemui.keyguard.shared.model.WakefulnessState +import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAsleepForTest +import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest +import com.android.systemui.power.domain.interactor.PowerInteractorFactory import com.android.systemui.scene.data.repository.WindowRootViewVisibilityRepository import com.android.systemui.statusbar.NotificationPresenter import com.android.systemui.statusbar.notification.init.NotificationsController @@ -57,6 +57,7 @@ class WindowRootViewVisibilityInteractorTest : SysuiTestCase() { private val headsUpManager = mock<HeadsUpManager>() private val notificationPresenter = mock<NotificationPresenter>() private val notificationsController = mock<NotificationsController>() + private val powerInteractor = PowerInteractorFactory.create().powerInteractor private val underTest = WindowRootViewVisibilityInteractor( @@ -64,6 +65,7 @@ class WindowRootViewVisibilityInteractorTest : SysuiTestCase() { windowRootViewVisibilityRepository, keyguardRepository, headsUpManager, + powerInteractor, ) .apply { setUp(notificationPresenter, notificationsController) } @@ -96,7 +98,7 @@ class WindowRootViewVisibilityInteractorTest : SysuiTestCase() { fun isLockscreenOrShadeVisibleAndInteractive_notVisible_false() = testScope.runTest { val actual by collectLastValue(underTest.isLockscreenOrShadeVisibleAndInteractive) - setWakefulness(WakefulnessState.AWAKE) + powerInteractor.setAwakeForTest() underTest.setIsLockscreenOrShadeVisible(false) @@ -109,7 +111,7 @@ class WindowRootViewVisibilityInteractorTest : SysuiTestCase() { val actual by collectLastValue(underTest.isLockscreenOrShadeVisibleAndInteractive) underTest.setIsLockscreenOrShadeVisible(true) - setWakefulness(WakefulnessState.ASLEEP) + powerInteractor.setAsleepForTest() assertThat(actual).isFalse() } @@ -120,7 +122,7 @@ class WindowRootViewVisibilityInteractorTest : SysuiTestCase() { val actual by collectLastValue(underTest.isLockscreenOrShadeVisibleAndInteractive) underTest.setIsLockscreenOrShadeVisible(true) - setWakefulness(WakefulnessState.AWAKE) + powerInteractor.setAwakeForTest() assertThat(actual).isTrue() } @@ -131,20 +133,20 @@ class WindowRootViewVisibilityInteractorTest : SysuiTestCase() { val actual by collectLastValue(underTest.isLockscreenOrShadeVisibleAndInteractive) underTest.setIsLockscreenOrShadeVisible(true) - setWakefulness(WakefulnessState.STARTING_TO_WAKE) + powerInteractor.setAwakeForTest() assertThat(actual).isTrue() } @Test - fun isLockscreenOrShadeVisibleAndInteractive_visibleAndStartingToSleep_true() = + fun isLockscreenOrShadeVisibleAndStartingToSleep_false() = testScope.runTest { val actual by collectLastValue(underTest.isLockscreenOrShadeVisibleAndInteractive) underTest.setIsLockscreenOrShadeVisible(true) - setWakefulness(WakefulnessState.STARTING_TO_SLEEP) + powerInteractor.setAsleepForTest() - assertThat(actual).isTrue() + assertThat(actual).isFalse() } @Test @@ -334,13 +336,8 @@ class WindowRootViewVisibilityInteractorTest : SysuiTestCase() { private fun makeLockscreenShadeVisible() { underTest.setIsLockscreenOrShadeVisible(true) - setWakefulness(WakefulnessState.AWAKE) + powerInteractor.setAwakeForTest() testScope.runCurrent() executor.runAllReady() } - - private fun setWakefulness(state: WakefulnessState) { - val model = WakefulnessModel(state, WakeSleepReason.OTHER, WakeSleepReason.OTHER) - keyguardRepository.setWakefulnessModel(model) - } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt b/packages/SystemUI/tests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt index 00a20ccc1c0d..0216a0a98d84 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/scene/domain/startable/SceneContainerStartableTest.kt @@ -18,6 +18,7 @@ package com.android.systemui.scene.domain.startable +import android.os.PowerManager import android.view.Display import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase @@ -25,10 +26,10 @@ import com.android.systemui.authentication.domain.model.AuthenticationMethodMode import com.android.systemui.classifier.FalsingCollector import com.android.systemui.coroutines.collectLastValue import com.android.systemui.flags.Flags -import com.android.systemui.keyguard.shared.model.WakeSleepReason -import com.android.systemui.keyguard.shared.model.WakefulnessModel -import com.android.systemui.keyguard.shared.model.WakefulnessState import com.android.systemui.model.SysUiState +import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAsleepForTest +import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest +import com.android.systemui.power.domain.interactor.PowerInteractorFactory import com.android.systemui.scene.SceneTestUtils import com.android.systemui.scene.SceneTestUtils.Companion.toDataLayer import com.android.systemui.scene.shared.model.ObservableTransitionState @@ -68,6 +69,7 @@ class SceneContainerStartableTest : SysuiTestCase() { private val keyguardInteractor = utils.keyguardInteractor() private val sysUiState: SysUiState = mock() private val falsingCollector: FalsingCollector = mock() + private val powerInteractor = PowerInteractorFactory.create().powerInteractor private val underTest = SceneContainerStartable( @@ -81,6 +83,7 @@ class SceneContainerStartableTest : SysuiTestCase() { displayId = Display.DEFAULT_DISPLAY, sceneLogger = mock(), falsingCollector = falsingCollector, + powerInteractor = powerInteractor, ) @Test @@ -201,8 +204,7 @@ class SceneContainerStartableTest : SysuiTestCase() { ) assertThat(currentSceneKey).isEqualTo(SceneKey.Shade) underTest.start() - - utils.keyguardRepository.setWakefulnessModel(STARTING_TO_SLEEP) + powerInteractor.setAsleepForTest() assertThat(currentSceneKey).isEqualTo(SceneKey.Lockscreen) } @@ -247,8 +249,7 @@ class SceneContainerStartableTest : SysuiTestCase() { ) assertThat(currentSceneKey).isEqualTo(SceneKey.Lockscreen) underTest.start() - - utils.keyguardRepository.setWakefulnessModel(STARTING_TO_WAKE_FROM_POWER_BUTTON) + powerInteractor.setAwakeForTest() assertThat(currentSceneKey).isEqualTo(SceneKey.Gone) } @@ -263,8 +264,7 @@ class SceneContainerStartableTest : SysuiTestCase() { ) assertThat(currentSceneKey).isEqualTo(SceneKey.Lockscreen) underTest.start() - - utils.keyguardRepository.setWakefulnessModel(STARTING_TO_WAKE_FROM_POWER_BUTTON) + powerInteractor.setAwakeForTest() assertThat(currentSceneKey).isEqualTo(SceneKey.Lockscreen) } @@ -279,8 +279,7 @@ class SceneContainerStartableTest : SysuiTestCase() { ) assertThat(currentSceneKey).isEqualTo(SceneKey.Lockscreen) underTest.start() - - utils.keyguardRepository.setWakefulnessModel(STARTING_TO_WAKE_FROM_POWER_BUTTON) + powerInteractor.setAwakeForTest() assertThat(currentSceneKey).isEqualTo(SceneKey.Lockscreen) } @@ -299,7 +298,7 @@ class SceneContainerStartableTest : SysuiTestCase() { utils.deviceEntryRepository.setUnlocked(true) runCurrent() - utils.keyguardRepository.setWakefulnessModel(STARTING_TO_WAKE_FROM_POWER_BUTTON) + powerInteractor.setAwakeForTest() assertThat(currentSceneKey).isEqualTo(SceneKey.Gone) } @@ -411,31 +410,31 @@ class SceneContainerStartableTest : SysuiTestCase() { verify(falsingCollector, never()).onScreenOnFromTouch() verify(falsingCollector, never()).onScreenOff() - utils.keyguardRepository.setWakefulnessModel(STARTING_TO_WAKE_FROM_POWER_BUTTON) + powerInteractor.setAwakeForTest(reason = PowerManager.WAKE_REASON_POWER_BUTTON) runCurrent() verify(falsingCollector, times(1)).onScreenTurningOn() verify(falsingCollector, never()).onScreenOnFromTouch() verify(falsingCollector, never()).onScreenOff() - utils.keyguardRepository.setWakefulnessModel(ASLEEP) + powerInteractor.setAsleepForTest() runCurrent() verify(falsingCollector, times(1)).onScreenTurningOn() verify(falsingCollector, never()).onScreenOnFromTouch() verify(falsingCollector, times(1)).onScreenOff() - utils.keyguardRepository.setWakefulnessModel(STARTING_TO_WAKE_FROM_TAP) + powerInteractor.setAwakeForTest(reason = PowerManager.WAKE_REASON_TAP) runCurrent() verify(falsingCollector, times(1)).onScreenTurningOn() verify(falsingCollector, times(1)).onScreenOnFromTouch() verify(falsingCollector, times(1)).onScreenOff() - utils.keyguardRepository.setWakefulnessModel(ASLEEP) + powerInteractor.setAsleepForTest() runCurrent() verify(falsingCollector, times(1)).onScreenTurningOn() verify(falsingCollector, times(1)).onScreenOnFromTouch() verify(falsingCollector, times(2)).onScreenOff() - utils.keyguardRepository.setWakefulnessModel(STARTING_TO_WAKE_FROM_POWER_BUTTON) + powerInteractor.setAwakeForTest(reason = PowerManager.WAKE_REASON_POWER_BUTTON) runCurrent() verify(falsingCollector, times(2)).onScreenTurningOn() verify(falsingCollector, times(1)).onScreenOnFromTouch() @@ -458,31 +457,31 @@ class SceneContainerStartableTest : SysuiTestCase() { verify(falsingCollector, never()).onScreenOnFromTouch() verify(falsingCollector, never()).onScreenOff() - utils.keyguardRepository.setWakefulnessModel(STARTING_TO_WAKE_FROM_POWER_BUTTON) + powerInteractor.setAwakeForTest(reason = PowerManager.WAKE_REASON_POWER_BUTTON) runCurrent() verify(falsingCollector, never()).onScreenTurningOn() verify(falsingCollector, never()).onScreenOnFromTouch() verify(falsingCollector, never()).onScreenOff() - utils.keyguardRepository.setWakefulnessModel(ASLEEP) + powerInteractor.setAsleepForTest() runCurrent() verify(falsingCollector, never()).onScreenTurningOn() verify(falsingCollector, never()).onScreenOnFromTouch() verify(falsingCollector, never()).onScreenOff() - utils.keyguardRepository.setWakefulnessModel(STARTING_TO_WAKE_FROM_TAP) + powerInteractor.setAwakeForTest(reason = PowerManager.WAKE_REASON_TAP) runCurrent() verify(falsingCollector, never()).onScreenTurningOn() verify(falsingCollector, never()).onScreenOnFromTouch() verify(falsingCollector, never()).onScreenOff() - utils.keyguardRepository.setWakefulnessModel(ASLEEP) + powerInteractor.setAsleepForTest() runCurrent() verify(falsingCollector, never()).onScreenTurningOn() verify(falsingCollector, never()).onScreenOnFromTouch() verify(falsingCollector, never()).onScreenOff() - utils.keyguardRepository.setWakefulnessModel(STARTING_TO_WAKE_FROM_POWER_BUTTON) + powerInteractor.setAwakeForTest(reason = PowerManager.WAKE_REASON_POWER_BUTTON) runCurrent() verify(falsingCollector, never()).onScreenTurningOn() verify(falsingCollector, never()).onScreenOnFromTouch() @@ -540,31 +539,4 @@ class SceneContainerStartableTest : SysuiTestCase() { } return transitionStateFlow } - - companion object { - private val STARTING_TO_SLEEP = - WakefulnessModel( - state = WakefulnessState.STARTING_TO_SLEEP, - lastWakeReason = WakeSleepReason.POWER_BUTTON, - lastSleepReason = WakeSleepReason.POWER_BUTTON - ) - private val ASLEEP = - WakefulnessModel( - state = WakefulnessState.ASLEEP, - lastWakeReason = WakeSleepReason.POWER_BUTTON, - lastSleepReason = WakeSleepReason.POWER_BUTTON - ) - private val STARTING_TO_WAKE_FROM_POWER_BUTTON = - WakefulnessModel( - state = WakefulnessState.STARTING_TO_WAKE, - lastWakeReason = WakeSleepReason.POWER_BUTTON, - lastSleepReason = WakeSleepReason.POWER_BUTTON - ) - private val STARTING_TO_WAKE_FROM_TAP = - WakefulnessModel( - state = WakefulnessState.STARTING_TO_WAKE, - lastWakeReason = WakeSleepReason.TAP, - lastSleepReason = WakeSleepReason.POWER_BUTTON - ) - } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/LockscreenHostedDreamGestureListenerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/LockscreenHostedDreamGestureListenerTest.kt index 24d62fba8471..b4f890b5315e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/LockscreenHostedDreamGestureListenerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/LockscreenHostedDreamGestureListenerTest.kt @@ -27,9 +27,8 @@ import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository import com.android.systemui.plugins.FalsingManager import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.power.data.repository.FakePowerRepository -import com.android.systemui.power.domain.interactor.PowerInteractor +import com.android.systemui.power.domain.interactor.PowerInteractorFactory import com.android.systemui.statusbar.StatusBarState -import com.android.systemui.statusbar.phone.ScreenOffAnimationController import com.android.systemui.util.mockito.whenever import com.google.common.truth.Truth import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -54,7 +53,6 @@ class LockscreenHostedDreamGestureListenerTest : SysuiTestCase() { @Mock private lateinit var falsingCollector: FalsingCollector @Mock private lateinit var statusBarStateController: StatusBarStateController @Mock private lateinit var shadeLogger: ShadeLogger - @Mock private lateinit var screenOffAnimationController: ScreenOffAnimationController @Mock private lateinit var primaryBouncerInteractor: PrimaryBouncerInteractor private val testDispatcher = UnconfinedTestDispatcher() @@ -74,13 +72,11 @@ class LockscreenHostedDreamGestureListenerTest : SysuiTestCase() { underTest = LockscreenHostedDreamGestureListener( falsingManager, - PowerInteractor( - powerRepository, - keyguardRepository, - falsingCollector, - screenOffAnimationController, - statusBarStateController, - ), + PowerInteractorFactory.create( + repository = powerRepository, + statusBarStateController = statusBarStateController, + ) + .powerInteractor, statusBarStateController, primaryBouncerInteractor, keyguardRepository, diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java index ed731dd41cd3..7b12931b2b47 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java @@ -118,6 +118,7 @@ import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.qs.QS; +import com.android.systemui.power.domain.interactor.PowerInteractor; import com.android.systemui.qs.QSFragmentLegacy; import com.android.systemui.screenrecord.RecordingController; import com.android.systemui.shade.data.repository.FakeShadeRepository; @@ -181,8 +182,6 @@ import com.android.systemui.util.time.FakeSystemClock; import com.android.systemui.util.time.SystemClock; import com.android.wm.shell.animation.FlingAnimationUtils; -import dagger.Lazy; - import org.junit.After; import org.junit.Before; import org.mockito.ArgumentCaptor; @@ -194,6 +193,7 @@ import org.mockito.stubbing.Answer; import java.util.List; import java.util.Optional; +import dagger.Lazy; import kotlinx.coroutines.CoroutineDispatcher; public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { @@ -332,6 +332,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { protected KeyguardBottomAreaInteractor mKeyguardBottomAreaInteractor; protected FakeKeyguardRepository mFakeKeyguardRepository; protected KeyguardInteractor mKeyguardInteractor; + protected PowerInteractor mPowerInteractor; protected NotificationPanelViewController.TouchHandler mTouchHandler; protected ConfigurationController mConfigurationController; protected SysuiStatusBarStateController mStatusBarStateController; @@ -365,6 +366,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { mKeyguardBottomAreaInteractor = new KeyguardBottomAreaInteractor(mFakeKeyguardRepository); mKeyguardInteractor = keyguardInteractorDeps.getKeyguardInteractor(); mShadeRepository = new FakeShadeRepository(); + mPowerInteractor = keyguardInteractorDeps.getPowerInteractor(); SystemClock systemClock = new FakeSystemClock(); mStatusBarStateController = new StatusBarStateControllerImpl(mUiEventLogger, mDumpManager, @@ -385,7 +387,8 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { mFeatureFlags, mInteractionJankMonitor, mKeyguardInteractor, - mDumpManager)); + mDumpManager, + mPowerInteractor)); when(mAuthController.isUdfpsEnrolled(anyInt())).thenReturn(false); when(mHeadsUpCallback.getContext()).thenReturn(mContext); @@ -662,7 +665,8 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { mSharedNotificationContainerInteractor, mKeyguardViewConfigurator, mKeyguardFaceAuthInteractor, - new ResourcesSplitShadeStateController()); + new ResourcesSplitShadeStateController(), + mPowerInteractor); mNotificationPanelViewController.initDependencies( mCentralSurfaces, null, diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java index 37ec7622a836..0cc57163cc48 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java @@ -46,6 +46,7 @@ import static org.mockito.Mockito.when; import android.animation.Animator; import android.animation.ValueAnimator; import android.graphics.Point; +import android.os.PowerManager; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.view.MotionEvent; @@ -59,10 +60,8 @@ import com.android.keyguard.FaceAuthApiRequestReason; import com.android.systemui.DejankUtils; import com.android.systemui.res.R; import com.android.systemui.flags.Flags; -import com.android.systemui.keyguard.shared.model.WakeSleepReason; -import com.android.systemui.keyguard.shared.model.WakefulnessModel; -import com.android.systemui.keyguard.shared.model.WakefulnessState; import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.power.domain.interactor.PowerInteractor; import com.android.systemui.statusbar.notification.row.ExpandableView; import com.android.systemui.statusbar.notification.row.ExpandableView.OnHeightChangedListener; import com.android.systemui.statusbar.notification.stack.AmbientState; @@ -1282,12 +1281,8 @@ public class NotificationPanelViewControllerTest extends NotificationPanelViewCo @Test public void getFalsingThreshold_deviceNotInteractive_isQsThreshold() { - mFakeKeyguardRepository.setWakefulnessModel( - new WakefulnessModel( - WakefulnessState.ASLEEP, - /* lastWakeReason= */ WakeSleepReason.TAP, - /* lastSleepReason= */ WakeSleepReason.POWER_BUTTON) - ); + PowerInteractor.Companion.setAsleepForTest( + mPowerInteractor, PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON); when(mQsController.getFalsingThreshold()).thenReturn(14); assertThat(mNotificationPanelViewController.getFalsingThreshold()).isEqualTo(14); @@ -1295,12 +1290,8 @@ public class NotificationPanelViewControllerTest extends NotificationPanelViewCo @Test public void getFalsingThreshold_lastWakeNotDueToTouch_isQsThreshold() { - mFakeKeyguardRepository.setWakefulnessModel( - new WakefulnessModel( - WakefulnessState.AWAKE, - /* lastWakeReason= */ WakeSleepReason.POWER_BUTTON, - /* lastSleepReason= */ WakeSleepReason.POWER_BUTTON) - ); + PowerInteractor.Companion.setAwakeForTest( + mPowerInteractor, PowerManager.WAKE_REASON_POWER_BUTTON); when(mQsController.getFalsingThreshold()).thenReturn(14); assertThat(mNotificationPanelViewController.getFalsingThreshold()).isEqualTo(14); @@ -1308,12 +1299,7 @@ public class NotificationPanelViewControllerTest extends NotificationPanelViewCo @Test public void getFalsingThreshold_lastWakeDueToTouch_greaterThanQsThreshold() { - mFakeKeyguardRepository.setWakefulnessModel( - new WakefulnessModel( - WakefulnessState.AWAKE, - /* lastWakeReason= */ WakeSleepReason.TAP, - /* lastSleepReason= */ WakeSleepReason.POWER_BUTTON) - ); + PowerInteractor.Companion.setAwakeForTest(mPowerInteractor, PowerManager.WAKE_REASON_TAP); when(mQsController.getFalsingThreshold()).thenReturn(14); assertThat(mNotificationPanelViewController.getFalsingThreshold()).isGreaterThan(14); diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/PulsingGestureListenerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/PulsingGestureListenerTest.kt index 29bc64e6249d..3900defd4ed4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/PulsingGestureListenerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/PulsingGestureListenerTest.kt @@ -25,15 +25,13 @@ import android.testing.TestableLooper.RunWithLooper import android.view.MotionEvent import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase -import com.android.systemui.classifier.FalsingCollector import com.android.systemui.dock.DockManager import com.android.systemui.dump.DumpManager -import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository import com.android.systemui.keyguard.domain.interactor.DozeInteractor import com.android.systemui.plugins.FalsingManager import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.power.data.repository.FakePowerRepository -import com.android.systemui.power.domain.interactor.PowerInteractor +import com.android.systemui.power.domain.interactor.PowerInteractorFactory import com.android.systemui.settings.UserTracker import com.android.systemui.statusbar.phone.ScreenOffAnimationController import com.android.systemui.tuner.TunerService @@ -60,8 +58,6 @@ class PulsingGestureListenerTest : SysuiTestCase() { @Mock private lateinit var falsingManager: FalsingManager @Mock - private lateinit var falsingCollector: FalsingCollector - @Mock private lateinit var ambientDisplayConfiguration: AmbientDisplayConfiguration @Mock private lateinit var tunerService: TunerService @@ -91,13 +87,11 @@ class PulsingGestureListenerTest : SysuiTestCase() { underTest = PulsingGestureListener( falsingManager, dockManager, - PowerInteractor( - powerRepository, - FakeKeyguardRepository(), - falsingCollector, - screenOffAnimationController, - statusBarStateController, - ), + PowerInteractorFactory.create( + repository = powerRepository, + statusBarStateController = statusBarStateController, + screenOffAnimationController = screenOffAnimationController, + ).powerInteractor, ambientDisplayConfiguration, statusBarStateController, shadeLogger, diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeControllerImplTest.kt index bf2d6a6f2f16..b5841a9de150 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeControllerImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeControllerImplTest.kt @@ -27,6 +27,7 @@ import com.android.systemui.assist.AssistManager import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository import com.android.systemui.log.LogBuffer import com.android.systemui.plugins.statusbar.StatusBarStateController +import com.android.systemui.power.domain.interactor.PowerInteractorFactory import com.android.systemui.scene.data.repository.WindowRootViewVisibilityRepository import com.android.systemui.scene.domain.interactor.WindowRootViewVisibilityInteractor import com.android.systemui.statusbar.CommandQueue @@ -80,6 +81,7 @@ class ShadeControllerImplTest : SysuiTestCase() { WindowRootViewVisibilityRepository(iStatusBarService, executor), FakeKeyguardRepository(), headsUpManager, + PowerInteractorFactory.create().powerInteractor, ) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt index 6e990a7aae23..14e58e5f570a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt @@ -9,7 +9,6 @@ import com.android.systemui.ExpandHelper import com.android.systemui.res.R import com.android.systemui.SysuiTestCase import com.android.systemui.classifier.FalsingCollector -import com.android.systemui.classifier.FalsingCollectorFake import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository import com.android.systemui.dump.DumpManager import com.android.systemui.keyguard.WakefulnessLifecycle @@ -18,8 +17,7 @@ import com.android.systemui.media.controls.ui.MediaHierarchyManager import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.FalsingManager import com.android.systemui.plugins.qs.QS -import com.android.systemui.power.data.repository.FakePowerRepository -import com.android.systemui.power.domain.interactor.PowerInteractor +import com.android.systemui.power.domain.interactor.PowerInteractorFactory import com.android.systemui.scene.SceneTestUtils import com.android.systemui.scene.shared.flag.FakeSceneContainerFlags import com.android.systemui.shade.ShadeViewController @@ -63,8 +61,8 @@ import org.mockito.Mockito.clearInvocations import org.mockito.Mockito.never import org.mockito.Mockito.verify import org.mockito.Mockito.verifyZeroInteractions -import org.mockito.Mockito.`when` as whenever import org.mockito.junit.MockitoJUnit +import org.mockito.Mockito.`when` as whenever private fun <T> anyObject(): T { return Mockito.anyObject<T>() @@ -126,14 +124,7 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() { sharedNotificationContainerInteractor, repository = FakeShadeRepository(), ) - private val powerInteractor = - PowerInteractor( - FakePowerRepository(), - keyguardRepository, - FalsingCollectorFake(), - screenOffAnimationController = mock(), - statusBarStateController = mock(), - ) + private val powerInteractor = PowerInteractorFactory.create().powerInteractor @JvmField @Rule val mockito = MockitoJUnit.rule() private val configurationController = FakeConfigurationController() diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java index bbf0151a90ce..168e782d0481 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/logging/NotificationLoggerTest.java @@ -43,9 +43,8 @@ import com.android.internal.statusbar.NotificationVisibility; import com.android.keyguard.TestScopeProvider; import com.android.systemui.SysuiTestCase; import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository; -import com.android.systemui.keyguard.shared.model.WakeSleepReason; -import com.android.systemui.keyguard.shared.model.WakefulnessModel; -import com.android.systemui.keyguard.shared.model.WakefulnessState; +import com.android.systemui.power.domain.interactor.PowerInteractor; +import com.android.systemui.power.domain.interactor.PowerInteractorFactory; import com.android.systemui.scene.data.repository.WindowRootViewVisibilityRepository; import com.android.systemui.scene.domain.interactor.WindowRootViewVisibilityInteractor; import com.android.systemui.statusbar.NotificationListener; @@ -109,6 +108,8 @@ public class NotificationLoggerTest extends SysuiTestCase { new NotificationPanelLoggerFake(); private final TestScope mTestScope = TestScopeProvider.getTestScope(); private final FakeKeyguardRepository mKeyguardRepository = new FakeKeyguardRepository(); + private final PowerInteractor mPowerInteractor = + PowerInteractorFactory.create().getPowerInteractor(); private WindowRootViewVisibilityInteractor mWindowRootViewVisibilityInteractor; private final JavaAdapter mJavaAdapter = new JavaAdapter(mTestScope.getBackgroundScope()); @@ -121,7 +122,8 @@ public class NotificationLoggerTest extends SysuiTestCase { mTestScope.getBackgroundScope(), new WindowRootViewVisibilityRepository(mBarService, mUiBgExecutor), mKeyguardRepository, - mHeadsUpManager); + mHeadsUpManager, + mPowerInteractor); mWindowRootViewVisibilityInteractor.setIsLockscreenOrShadeVisible(true); mEntry = new NotificationEntryBuilder() @@ -285,20 +287,12 @@ public class NotificationLoggerTest extends SysuiTestCase { } private void setStateAsleep() { - mKeyguardRepository.setWakefulnessModel( - new WakefulnessModel( - WakefulnessState.ASLEEP, - WakeSleepReason.OTHER, - WakeSleepReason.OTHER)); + PowerInteractor.Companion.setAsleepForTest(mPowerInteractor); mTestScope.getTestScheduler().runCurrent(); } private void setStateAwake() { - mKeyguardRepository.setWakefulnessModel( - new WakefulnessModel( - WakefulnessState.AWAKE, - WakeSleepReason.OTHER, - WakeSleepReason.OTHER)); + PowerInteractor.Companion.setAwakeForTest(mPowerInteractor); mTestScope.getTestScheduler().runCurrent(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java index 0f1e63f4c0df..9f2afdf1b168 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java @@ -75,6 +75,7 @@ import com.android.systemui.people.widget.PeopleSpaceWidgetManager; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin; import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.power.domain.interactor.PowerInteractorFactory; import com.android.systemui.scene.data.repository.WindowRootViewVisibilityRepository; import com.android.systemui.scene.domain.interactor.WindowRootViewVisibilityInteractor; import com.android.systemui.settings.UserContextProvider; @@ -170,7 +171,8 @@ public class NotificationGutsManagerTest extends SysuiTestCase { mTestScope.getBackgroundScope(), new WindowRootViewVisibilityRepository(mBarService, mExecutor), new FakeKeyguardRepository(), - mHeadsUpManagerPhone); + mHeadsUpManagerPhone, + PowerInteractorFactory.create().getPowerInteractor()); mGutsManager = new NotificationGutsManager( mContext, diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/shelf/domain/interactor/NotificationShelfInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/shelf/domain/interactor/NotificationShelfInteractorTest.kt index 8881f42783fb..59d98c233f99 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/shelf/domain/interactor/NotificationShelfInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/shelf/domain/interactor/NotificationShelfInteractorTest.kt @@ -22,13 +22,12 @@ import android.os.PowerManager import android.testing.AndroidTestingRunner import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase -import com.android.systemui.classifier.FalsingCollectorFake import com.android.systemui.coroutines.collectLastValue import com.android.systemui.keyguard.data.repository.FakeDeviceEntryFaceAuthRepository import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.power.data.repository.FakePowerRepository -import com.android.systemui.power.domain.interactor.PowerInteractor +import com.android.systemui.power.domain.interactor.PowerInteractorFactory import com.android.systemui.statusbar.LockscreenShadeTransitionController import com.android.systemui.statusbar.phone.ScreenOffAnimationController import com.android.systemui.util.mockito.eq @@ -56,13 +55,12 @@ class NotificationShelfInteractorTest : SysuiTestCase() { private val statusBarStateController: StatusBarStateController = mock() private val powerRepository = FakePowerRepository() private val powerInteractor = - PowerInteractor( - powerRepository, - keyguardRepository, - FalsingCollectorFake(), - screenOffAnimationController, - statusBarStateController, - ) + PowerInteractorFactory.create( + repository = powerRepository, + screenOffAnimationController = screenOffAnimationController, + statusBarStateController = statusBarStateController, + ) + .powerInteractor private val keyguardTransitionController: LockscreenShadeTransitionController = mock() private val underTest = diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/shelf/ui/viewmodel/NotificationShelfViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/shelf/ui/viewmodel/NotificationShelfViewModelTest.kt index 6221f3e89ad6..390c1dd47858 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/shelf/ui/viewmodel/NotificationShelfViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/shelf/ui/viewmodel/NotificationShelfViewModelTest.kt @@ -24,13 +24,12 @@ import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.accessibility.data.repository.FakeAccessibilityRepository import com.android.systemui.accessibility.domain.interactor.AccessibilityInteractor -import com.android.systemui.classifier.FalsingCollectorFake import com.android.systemui.coroutines.collectLastValue import com.android.systemui.keyguard.data.repository.FakeDeviceEntryFaceAuthRepository import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.power.data.repository.FakePowerRepository -import com.android.systemui.power.domain.interactor.PowerInteractor +import com.android.systemui.power.domain.interactor.PowerInteractorFactory import com.android.systemui.statusbar.LockscreenShadeTransitionController import com.android.systemui.statusbar.notification.row.ui.viewmodel.ActivatableNotificationViewModel import com.android.systemui.statusbar.notification.shelf.domain.interactor.NotificationShelfInteractor @@ -67,13 +66,12 @@ class NotificationShelfViewModelTest : SysuiTestCase() { private val a11yRepo = FakeAccessibilityRepository() private val powerRepository = FakePowerRepository() private val powerInteractor by lazy { - PowerInteractor( - powerRepository, - keyguardRepository, - FalsingCollectorFake(), - screenOffAnimationController, - statusBarStateController, - ) + PowerInteractorFactory.create( + repository = powerRepository, + screenOffAnimationController = screenOffAnimationController, + statusBarStateController = statusBarStateController, + ) + .powerInteractor } // real impls diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java index 56062162bce6..ffe312be8fae 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java @@ -57,7 +57,6 @@ import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FakeFeatureFlags; import com.android.systemui.flags.Flags; import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository; -import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor; import com.android.systemui.keyguard.shared.model.KeyguardState; import com.android.systemui.keyguard.shared.model.TransitionStep; import com.android.systemui.media.controls.ui.KeyguardMediaController; @@ -65,6 +64,7 @@ import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.OnMenuEventListener; import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.power.domain.interactor.PowerInteractor; import com.android.systemui.shade.ShadeController; import com.android.systemui.statusbar.LockscreenShadeTransitionController; import com.android.systemui.statusbar.NotificationLockscreenUserManager; @@ -135,7 +135,7 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { @Mock private KeyguardMediaController mKeyguardMediaController; @Mock private SysuiStatusBarStateController mSysuiStatusBarStateController; @Mock private KeyguardBypassController mKeyguardBypassController; - @Mock private KeyguardInteractor mKeyguardInteractor; + @Mock private PowerInteractor mPowerInteractor; @Mock private PrimaryBouncerInteractor mPrimaryBouncerInteractor; @Mock private NotificationLockscreenUserManager mNotificationLockscreenUserManager; @Mock private MetricsLogger mMetricsLogger; @@ -681,7 +681,7 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { mSysuiStatusBarStateController, mKeyguardMediaController, mKeyguardBypassController, - mKeyguardInteractor, + mPowerInteractor, mPrimaryBouncerInteractor, mKeyguardTransitionRepo, mZenModeController, diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java index 20e732ad5296..700de5305778 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java @@ -154,7 +154,7 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase { mNotificationShadeWindowController, mKeyguardStateController, mHandler, mUpdateMonitor, res.getResources(), mKeyguardBypassController, mMetricsLogger, mDumpManager, mPowerManager, mLogger, - mNotificationMediaManager, mWakefulnessLifecycle, mScreenLifecycle, + mNotificationMediaManager, mWakefulnessLifecycle, mAuthController, mStatusBarStateController, mSessionTracker, mLatencyTracker, mScreenOffAnimationController, mVibratorHelper, mSystemClock, diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java index 05842a5df82b..c0d248ea15e7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java @@ -60,6 +60,8 @@ import com.android.systemui.flags.Flags; import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository; import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor; import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.power.domain.interactor.PowerInteractor; +import com.android.systemui.power.domain.interactor.PowerInteractorFactory; import com.android.systemui.res.R; import com.android.systemui.scene.SceneTestUtils; import com.android.systemui.scene.shared.flag.FakeSceneContainerFlags; @@ -163,6 +165,7 @@ public class KeyguardStatusBarViewControllerTest extends SysuiTestCase { mKeyguardInteractor = new KeyguardInteractor( mKeyguardRepository, mCommandQueue, + PowerInteractorFactory.create().getPowerInteractor(), mFeatureFlags, mSceneTestUtils.getSceneContainerFlags(), mSceneTestUtils.getDeviceEntryRepository(), diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java index 3151ad1d217f..8013e5eef44b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java @@ -67,12 +67,12 @@ import com.android.systemui.animation.ActivityLaunchAnimator; import com.android.systemui.assist.AssistManager; import com.android.systemui.classifier.FalsingCollectorFake; import com.android.systemui.flags.FakeFeatureFlags; -import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.ActivityStarter.OnDismissAction; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.power.data.repository.FakePowerRepository; import com.android.systemui.power.domain.interactor.PowerInteractor; +import com.android.systemui.power.domain.interactor.PowerInteractorFactory; import com.android.systemui.settings.UserTracker; import com.android.systemui.shade.ShadeControllerImpl; import com.android.systemui.shade.ShadeViewController; @@ -212,12 +212,11 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase { UserHandle.of(ActivityManager.getCurrentUser())); mPowerRepository = new FakePowerRepository(); - mPowerInteractor = new PowerInteractor( + mPowerInteractor = PowerInteractorFactory.create( mPowerRepository, - new FakeKeyguardRepository(), new FalsingCollectorFake(), mScreenOffAnimationController, - mStatusBarStateController); + mStatusBarStateController).getPowerInteractor(); HeadsUpManagerPhone headsUpManager = mock(HeadsUpManagerPhone.class); NotificationLaunchAnimatorControllerProvider notificationAnimationProvider = diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ui/viewmodel/KeyguardStatusBarViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/ui/viewmodel/KeyguardStatusBarViewModelTest.kt index f8ec8d1b172e..f4078d59bbdb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ui/viewmodel/KeyguardStatusBarViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/ui/viewmodel/KeyguardStatusBarViewModelTest.kt @@ -25,8 +25,8 @@ import com.android.systemui.flags.FakeFeatureFlagsClassic import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.keyguard.shared.model.StatusBarState +import com.android.systemui.power.domain.interactor.PowerInteractorFactory import com.android.systemui.scene.SceneTestUtils -import com.android.systemui.scene.shared.flag.FakeSceneContainerFlags import com.android.systemui.shade.data.repository.FakeShadeRepository import com.android.systemui.statusbar.CommandQueue import com.android.systemui.util.mockito.mock @@ -44,12 +44,13 @@ class KeyguardStatusBarViewModelTest : SysuiTestCase() { KeyguardInteractor( keyguardRepository, mock<CommandQueue>(), + PowerInteractorFactory.create().powerInteractor, FakeFeatureFlagsClassic(), sceneTestUtils.sceneContainerFlags, sceneTestUtils.deviceEntryRepository, FakeKeyguardBouncerRepository(), FakeConfigurationRepository(), - FakeShadeRepository() + FakeShadeRepository(), ) { sceneTestUtils.sceneInteractor() } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt index aa52609d6d47..9de7ad8ea780 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt @@ -26,20 +26,15 @@ import com.android.systemui.keyguard.shared.model.DismissAction import com.android.systemui.keyguard.shared.model.DozeTransitionModel import com.android.systemui.keyguard.shared.model.KeyguardDone import com.android.systemui.keyguard.shared.model.KeyguardRootViewVisibilityState -import com.android.systemui.keyguard.shared.model.ScreenModel -import com.android.systemui.keyguard.shared.model.ScreenState import com.android.systemui.keyguard.shared.model.StatusBarState -import com.android.systemui.keyguard.shared.model.WakeSleepReason -import com.android.systemui.keyguard.shared.model.WakefulnessModel -import com.android.systemui.keyguard.shared.model.WakefulnessState import dagger.Binds import dagger.Module -import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow +import javax.inject.Inject /** Fake implementation of [KeyguardRepository] */ @SysUISingleton @@ -96,15 +91,6 @@ class FakeKeyguardRepository @Inject constructor() : KeyguardRepository { private val _dozeTransitionModel = MutableStateFlow(DozeTransitionModel()) override val dozeTransitionModel: Flow<DozeTransitionModel> = _dozeTransitionModel - private val _wakefulnessModel = - MutableStateFlow( - WakefulnessModel(WakefulnessState.ASLEEP, WakeSleepReason.OTHER, WakeSleepReason.OTHER) - ) - override val wakefulness = _wakefulnessModel - - private val _screenModel = MutableStateFlow(ScreenModel(ScreenState.SCREEN_OFF)) - override val screenModel = _screenModel - private val _isUdfpsSupported = MutableStateFlow(false) private val _isKeyguardGoingAway = MutableStateFlow(false) @@ -216,10 +202,6 @@ class FakeKeyguardRepository @Inject constructor() : KeyguardRepository { _dozeAmount.value = dozeAmount } - fun setWakefulnessModel(model: WakefulnessModel) { - _wakefulnessModel.value = model - } - fun setBiometricUnlockState(state: BiometricUnlockModel) { _biometricUnlockState.tryEmit(state) } @@ -244,10 +226,6 @@ class FakeKeyguardRepository @Inject constructor() : KeyguardRepository { _statusBarState.value = state } - fun setScreenModel(screenModel: ScreenModel) { - _screenModel.value = screenModel - } - override fun isUdfpsSupported(): Boolean { return _isUdfpsSupported.value } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissInteractorFactory.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissInteractorFactory.kt index 945aaede0087..8e96b522e997 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissInteractorFactory.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissInteractorFactory.kt @@ -39,8 +39,7 @@ import com.android.systemui.keyguard.data.repository.FakeTrustRepository import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.power.data.repository.FakePowerRepository -import com.android.systemui.power.domain.interactor.PowerInteractor -import com.android.systemui.statusbar.phone.ScreenOffAnimationController +import com.android.systemui.power.domain.interactor.PowerInteractorFactory import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.telephony.data.repository.FakeTelephonyRepository import com.android.systemui.telephony.domain.interactor.TelephonyInteractor @@ -103,14 +102,10 @@ object KeyguardDismissInteractorFactory { FakeSystemClock(), keyguardUpdateMonitor, ) - val powerInteractor = - PowerInteractor( - powerRepository, - keyguardRepository, - mock(FalsingCollector::class.java), - mock(ScreenOffAnimationController::class.java), - mock(StatusBarStateController::class.java), - ) + val powerInteractorWithDeps = + PowerInteractorFactory.create( + repository = powerRepository, + ) val userInteractor = UserInteractor( applicationContext = context, @@ -153,7 +148,7 @@ object KeyguardDismissInteractorFactory { keyguardRepository, primaryBouncerInteractor, alternateBouncerInteractor, - powerInteractor, + powerInteractorWithDeps.powerInteractor, userInteractor, ), ) diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorFactory.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorFactory.kt index 1cae09b794b8..82ce802179a3 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorFactory.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorFactory.kt @@ -24,6 +24,8 @@ import com.android.systemui.flags.FakeFeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.keyguard.data.repository.FakeCommandQueue import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository +import com.android.systemui.power.domain.interactor.PowerInteractor +import com.android.systemui.power.domain.interactor.PowerInteractorFactory import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.shared.flag.FakeSceneContainerFlags import com.android.systemui.scene.shared.flag.SceneContainerFlags @@ -48,6 +50,7 @@ object KeyguardInteractorFactory { configurationRepository: FakeConfigurationRepository = FakeConfigurationRepository(), shadeRepository: FakeShadeRepository = FakeShadeRepository(), sceneInteractor: SceneInteractor = mock(), + powerInteractor: PowerInteractor = PowerInteractorFactory.create().powerInteractor, ): WithDependencies { return WithDependencies( repository = repository, @@ -58,6 +61,7 @@ object KeyguardInteractorFactory { bouncerRepository = bouncerRepository, configurationRepository = configurationRepository, shadeRepository = shadeRepository, + powerInteractor = powerInteractor, KeyguardInteractor( repository = repository, commandQueue = commandQueue, @@ -68,7 +72,8 @@ object KeyguardInteractorFactory { configurationRepository = configurationRepository, shadeRepository = shadeRepository, sceneInteractorProvider = { sceneInteractor }, - ) + powerInteractor = powerInteractor, + ), ) } @@ -86,6 +91,7 @@ object KeyguardInteractorFactory { val bouncerRepository: FakeKeyguardBouncerRepository, val configurationRepository: FakeConfigurationRepository, val shadeRepository: FakeShadeRepository, + val powerInteractor: PowerInteractor, val keyguardInteractor: KeyguardInteractor, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/power/data/repository/FakePowerRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/power/data/repository/FakePowerRepository.kt index 5ab8204edde4..957fbbd8680f 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/power/data/repository/FakePowerRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/power/data/repository/FakePowerRepository.kt @@ -18,6 +18,10 @@ package com.android.systemui.power.data.repository import android.os.PowerManager +import com.android.systemui.power.shared.model.ScreenPowerState +import com.android.systemui.power.shared.model.WakeSleepReason +import com.android.systemui.power.shared.model.WakefulnessModel +import com.android.systemui.power.shared.model.WakefulnessState import com.android.systemui.dagger.SysUISingleton import dagger.Binds import dagger.Module @@ -28,10 +32,15 @@ import kotlinx.coroutines.flow.asStateFlow @SysUISingleton class FakePowerRepository @Inject constructor() : PowerRepository { - private val _isInteractive = MutableStateFlow(true) override val isInteractive: Flow<Boolean> = _isInteractive.asStateFlow() + private val _wakefulness = MutableStateFlow(WakefulnessModel()) + override val wakefulness = _wakefulness.asStateFlow() + + private val _screenPowerState = MutableStateFlow(ScreenPowerState.SCREEN_OFF) + override val screenPowerState = _screenPowerState.asStateFlow() + var lastWakeWhy: String? = null var lastWakeReason: Int? = null @@ -49,6 +58,25 @@ class FakePowerRepository @Inject constructor() : PowerRepository { override fun userTouch() { userTouchRegistered = true } + + override fun updateWakefulness( + rawState: WakefulnessState, + lastWakeReason: WakeSleepReason, + lastSleepReason: WakeSleepReason, + powerButtonLaunchGestureTriggered: Boolean + ) { + _wakefulness.value = + WakefulnessModel( + rawState, + lastWakeReason, + lastSleepReason, + powerButtonLaunchGestureTriggered, + ) + } + + override fun setScreenPowerState(state: ScreenPowerState) { + _screenPowerState.value = state + } } @Module diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/power/domain/interactor/PowerInteractorFactory.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/power/domain/interactor/PowerInteractorFactory.kt new file mode 100644 index 000000000000..d92ace945b18 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/power/domain/interactor/PowerInteractorFactory.kt @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.systemui.power.domain.interactor + +import com.android.systemui.classifier.FalsingCollector +import com.android.systemui.classifier.FalsingCollectorFake +import com.android.systemui.plugins.statusbar.StatusBarStateController +import com.android.systemui.power.data.repository.FakePowerRepository +import com.android.systemui.statusbar.phone.ScreenOffAnimationController +import com.android.systemui.util.mockito.mock + +object PowerInteractorFactory { + @JvmOverloads + @JvmStatic + fun create( + repository: FakePowerRepository = FakePowerRepository(), + falsingCollector: FalsingCollector = FalsingCollectorFake(), + screenOffAnimationController: ScreenOffAnimationController = mock(), + statusBarStateController: StatusBarStateController = mock(), + ): WithDependencies { + return WithDependencies( + repository = repository, + falsingCollector = falsingCollector, + screenOffAnimationController = screenOffAnimationController, + statusBarStateController = statusBarStateController, + powerInteractor = + PowerInteractor( + repository, + falsingCollector, + screenOffAnimationController, + statusBarStateController, + ) + ) + } + + data class WithDependencies( + val repository: FakePowerRepository, + val falsingCollector: FalsingCollector, + val screenOffAnimationController: ScreenOffAnimationController, + val statusBarStateController: StatusBarStateController, + val powerInteractor: PowerInteractor, + ) +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneTestUtils.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneTestUtils.kt index 179206ff87b1..67777349ce12 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneTestUtils.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/scene/SceneTestUtils.kt @@ -43,10 +43,8 @@ import com.android.systemui.keyguard.data.repository.FakeCommandQueue import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository import com.android.systemui.keyguard.data.repository.KeyguardRepository import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor -import com.android.systemui.keyguard.shared.model.WakeSleepReason -import com.android.systemui.keyguard.shared.model.WakefulnessModel -import com.android.systemui.keyguard.shared.model.WakefulnessState import com.android.systemui.power.data.repository.FakePowerRepository +import com.android.systemui.power.domain.interactor.PowerInteractorFactory import com.android.systemui.scene.data.repository.SceneContainerRepository import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.shared.flag.FakeSceneContainerFlags @@ -83,21 +81,12 @@ class SceneTestUtils( currentTime = { testScope.currentTime }, ) } - val keyguardRepository: FakeKeyguardRepository by lazy { - FakeKeyguardRepository().apply { - setWakefulnessModel( - WakefulnessModel( - WakefulnessState.AWAKE, - WakeSleepReason.OTHER, - WakeSleepReason.OTHER, - ) - ) - } - } + val communalRepository: FakeCommunalRepository by lazy { FakeCommunalRepository() } private val communalWidgetRepository: FakeCommunalWidgetRepository by lazy { FakeCommunalWidgetRepository() } + val keyguardRepository: FakeKeyguardRepository by lazy { FakeKeyguardRepository() } val powerRepository: FakePowerRepository by lazy { FakePowerRepository() } private val userRepository: UserRepository by lazy { @@ -189,6 +178,7 @@ class SceneTestUtils( configurationRepository = FakeConfigurationRepository(), shadeRepository = FakeShadeRepository(), sceneInteractorProvider = { sceneInteractor() }, + powerInteractor = PowerInteractorFactory.create().powerInteractor, ) } |