(1/x) Consolidate Screen/Wakefulness lifecycle state into PowerRepository.

Despite being relied upon from all over System UI, these classes are
in the keyguard package. They're also confusing - screen lifecycle
methods aren't called at all if AOD is enabled.

This CL moves screen/wakefulness state from KeyguardRepository into
PowerRepository, and dispatches state directly from the source of
truth (KeyguardService and CommandQueue) into PowerRepository. It also
deprecates ScreenLifecycle/WakefulnessLifecycle - I will migrate uses
of those classes in follow-up CLs so they can be reverted if they
cause issues.

Bug: 298213384
Test: atest PowerInteractorTest
Test: atest SystemUITests
Change-Id: Ie735834bbf40f4c99b729db4fce6096ccc569eb2
diff --git a/packages/SystemUI/src/com/android/keyguard/FaceWakeUpTriggersConfig.kt b/packages/SystemUI/src/com/android/keyguard/FaceWakeUpTriggersConfig.kt
index 6a170a5..84a6b09 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.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 931ba6d..4b23795 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.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.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 @@
     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 @@
             FeatureFlags featureFlags,
             InteractionJankMonitor interactionJankMonitor,
             KeyguardInteractor keyguardInteractor,
-            DumpManager dumpManager) {
+            DumpManager dumpManager,
+            PowerInteractor powerInteractor) {
         super(keyguardStatusView);
         mKeyguardSliceViewController = keyguardSliceViewController;
         mKeyguardClockSwitchController = keyguardClockSwitchController;
@@ -147,6 +149,7 @@
         mFeatureFlags = featureFlags;
         mDumpManager = dumpManager;
         mKeyguardInteractor = keyguardInteractor;
+        mPowerInteractor = powerInteractor;
     }
 
     @Override
@@ -207,9 +210,9 @@
                         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 f6add9c..a1f0e77 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.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 @@
     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 @@
             KeyguardSurfaceBehindViewModel keyguardSurfaceBehindViewModel,
             KeyguardSurfaceBehindParamsApplier keyguardSurfaceBehindAnimator,
             @Application CoroutineScope scope,
-            FeatureFlags featureFlags) {
+            FeatureFlags featureFlags,
+            PowerInteractor powerInteractor) {
         super();
         mKeyguardViewMediator = keyguardViewMediator;
         mKeyguardLifecyclesDispatcher = keyguardLifecyclesDispatcher;
@@ -317,6 +321,7 @@
         mShellTransitions = shellTransitions;
         mDisplayTracker = displayTracker;
         mFlags = featureFlags;
+        mPowerInteractor = powerInteractor;
 
         if (mFlags.isEnabled(Flags.KEYGUARD_WM_STATE_REFACTOR)) {
             WindowManagerLockscreenVisibilityViewBinder.bind(
@@ -451,6 +456,7 @@
             checkPermission();
             mKeyguardViewMediator.onStartedGoingToSleep(
                     WindowManagerPolicyConstants.translateSleepReasonToOffReason(pmSleepReason));
+            mPowerInteractor.onStartedGoingToSleep(pmSleepReason);
             mKeyguardLifecyclesDispatcher.dispatch(
                     KeyguardLifecyclesDispatcher.STARTED_GOING_TO_SLEEP, pmSleepReason);
         }
@@ -464,6 +470,7 @@
             mKeyguardViewMediator.onFinishedGoingToSleep(
                     WindowManagerPolicyConstants.translateSleepReasonToOffReason(pmSleepReason),
                     cameraGestureTriggered);
+            mPowerInteractor.onFinishedGoingToSleep(cameraGestureTriggered);
             mKeyguardLifecyclesDispatcher.dispatch(
                     KeyguardLifecyclesDispatcher.FINISHED_GOING_TO_SLEEP);
         }
@@ -476,6 +483,7 @@
             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 @@
             trace("onFinishedWakingUp");
             Trace.beginSection("KeyguardService.mBinder#onFinishedWakingUp");
             checkPermission();
+            mPowerInteractor.onFinishedWakingUp();
             mKeyguardLifecyclesDispatcher.dispatch(KeyguardLifecyclesDispatcher.FINISHED_WAKING_UP);
             Trace.endSection();
         }
@@ -495,6 +504,7 @@
             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 @@
             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 void onScreenTurningOff() {
             trace("onScreenTurningOff");
             checkPermission();
+            mPowerInteractor.onScreenPowerStateUpdated(ScreenPowerState.SCREEN_TURNING_OFF);
             mKeyguardLifecyclesDispatcher.dispatch(KeyguardLifecyclesDispatcher.SCREEN_TURNING_OFF);
         }
 
@@ -546,6 +558,7 @@
         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 039460d..c52ca68 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.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 @@
 @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 @@
                 val isDozingFully =
                     keyguardInteractor.dozeAmount.map { it == 1f }.distinctUntilChanged()
                 combine(
-                        keyguardInteractor.wakefulnessModel.map { it.state },
+                        powerInteractor.isAsleep,
                         keyguardInteractor.isDreaming,
                         isDozingFully,
                         ::Triple
@@ -106,9 +107,9 @@
 
     @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 @@
         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 @@
         //      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 8535eda..633628f 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 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 @@
 
 /**
  * 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 d5316cd..4f02f75 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.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 @@
 
 /**
  * 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 fd048ff..3cdff76 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.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.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.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 @@
     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 @@
         // 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 @@
         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 @@
             ),
             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 36b93cd..a4a3126 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.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.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 @@
     /** 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 @@
 @Inject
 constructor(
     statusBarStateController: StatusBarStateController,
-    wakefulnessLifecycle: WakefulnessLifecycle,
     screenLifecycle: ScreenLifecycle,
     biometricUnlockController: BiometricUnlockController,
     private val keyguardStateController: KeyguardStateController,
@@ -542,85 +532,6 @@
         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 af01626..54031dc 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.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 @@
 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 @@
 
     /** 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 b050890..3ccf446 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.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 @@
     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 @@
                     combine(
                         keyguardInteractor.primaryBouncerShowing,
                         transitionInteractor.startedKeyguardTransitionStep,
-                        keyguardInteractor.wakefulnessModel,
+                        powerInteractor.isAwake,
                         keyguardInteractor.isAodAvailable,
                         ::toQuad
                     ),
@@ -75,7 +76,7 @@
                         isAlternateBouncerShowing,
                         isPrimaryBouncerShowing,
                         lastStartedTransitionStep,
-                        wakefulnessState,
+                        isAwake,
                         isAodAvailable) ->
                     if (
                         !isAlternateBouncerShowing &&
@@ -83,10 +84,7 @@
                             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 518ae2f..38eb730 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.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 712215f..e9719e7 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.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 @@
     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 @@
 
     private fun listenForDozingToLockscreenOrOccluded() {
         scope.launch {
-            keyguardInteractor.wakefulnessModel
+            powerInteractor.isAwake
                 .sample(
                     combine(
                         transitionInteractor.startedKeyguardTransitionStep,
@@ -61,11 +63,8 @@
                     ),
                     ::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 2b08b3d..ad51e74 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.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 @@
     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 @@
 
     private fun listenForGoneToAodOrDozing() {
         scope.launch {
-            keyguardInteractor.wakefulnessModel
+            powerInteractor.isAsleep
                 .sample(
                     combine(
                         transitionInteractor.startedKeyguardTransitionStep,
@@ -110,11 +111,8 @@
                     ),
                     ::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 8f39431..ffa1a49 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.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.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 @@
     private val keyguardInteractor: KeyguardInteractor,
     private val flags: FeatureFlags,
     private val shadeRepository: ShadeRepository,
+    private val powerInteractor: PowerInteractor,
 ) :
     TransitionInteractor(
         fromState = KeyguardState.LOCKSCREEN,
@@ -335,7 +336,7 @@
 
     private fun listenForLockscreenToAodOrDozing() {
         scope.launch {
-            keyguardInteractor.wakefulnessModel
+            powerInteractor.isAsleep
                 .sample(
                     combine(
                         transitionInteractor.startedKeyguardTransitionStep,
@@ -344,11 +345,8 @@
                     ),
                     ::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 714add4..dec38b5 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.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 @@
     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 @@
 
     private fun listenForOccludedToAodOrDozing() {
         scope.launch {
-            keyguardInteractor.wakefulnessModel
+            powerInteractor.isAsleep
                 .sample(
                     combine(
                         transitionInteractor.startedKeyguardTransitionStep,
@@ -140,10 +141,9 @@
                     ),
                     ::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 143be1d..ad2ec69 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.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 @@
     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 @@
             keyguardInteractor.primaryBouncerShowing
                 .sample(
                     combine(
-                        keyguardInteractor.wakefulnessModel,
+                        powerInteractor.isAwake,
                         transitionInteractor.startedKeyguardTransitionStep,
                         keyguardInteractor.isKeyguardOccluded,
                         keyguardInteractor.isActiveDreamLockscreenHosted,
@@ -131,15 +132,14 @@
                 .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 @@
             keyguardInteractor.primaryBouncerShowing
                 .sample(
                     combine(
-                        keyguardInteractor.wakefulnessModel,
+                        powerInteractor.isAsleep,
                         transitionInteractor.startedKeyguardTransitionStep,
                         keyguardInteractor.isAodAvailable,
                         ::Triple
@@ -163,13 +163,12 @@
                     ::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 @@
                             ),
                             ::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 8063468..6e19fdb 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.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.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.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 @@
 constructor(
     private val repository: KeyguardRepository,
     private val commandQueue: CommandQueue,
+    private val powerInteractor: PowerInteractor,
     featureFlags: FeatureFlags,
     sceneContainerFlags: SceneContainerFlags,
     deviceEntryRepository: DeviceEntryRepository,
@@ -137,12 +137,6 @@
         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 @@
             .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 635961b..d6987629 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.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 @@
     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 @@
 
     private fun dispatchMenuKeyEvent(): Boolean {
         val shouldUnlockOnMenuPressed =
-            isDeviceInteractive() &&
+            isDeviceAwake() &&
                 (statusBarStateController.state != StatusBarState.SHADE) &&
                 statusBarKeyguardViewManager.shouldDismissOnMenuPressed()
         if (shouldUnlockOnMenuPressed) {
@@ -97,7 +99,7 @@
     }
 
     private fun dispatchSpaceEvent(): Boolean {
-        if (isDeviceInteractive() && statusBarStateController.state != StatusBarState.SHADE) {
+        if (isDeviceAwake() && statusBarStateController.state != StatusBarState.SHADE) {
             shadeController.animateCollapseShadeForced()
             return true
         }
@@ -111,7 +113,7 @@
         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 0dc16e9..419524fe 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.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 @@
     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 9382618..1c43609 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.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.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 @@
             .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 @@
             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 20e55e5..ef1d5ac 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.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.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.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.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 @@
     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 @@
                 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 96bfdc6..49af664 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 @@
                 // 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 @@
 
     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 1e20cdb..cae6147 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 @@
     /*
      * 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 80a1b75..0000000
--- 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/ScreenState.kt b/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/ScreenState.kt
deleted file mode 100644
index fe5d935..0000000
--- a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/ScreenState.kt
+++ /dev/null
@@ -1,42 +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.ScreenLifecycle
-
-enum class ScreenState {
-    /** Screen is fully off. */
-    SCREEN_OFF,
-    /** Signal that the screen is turning on. */
-    SCREEN_TURNING_ON,
-    /** 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")
-            }
-        }
-    }
-}
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 2a5beaf..0000000
--- 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/keyguard/shared/model/WakefulnessState.kt b/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/WakefulnessState.kt
deleted file mode 100644
index 6791d88..0000000
--- a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/WakefulnessState.kt
+++ /dev/null
@@ -1,44 +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
-
-enum class WakefulnessState {
-    /** The device is asleep and not interactive. */
-    ASLEEP,
-    /** Received a signal that the device is beginning to wake up. */
-    STARTING_TO_WAKE,
-    /** 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")
-            }
-        }
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/log/FaceAuthenticationLogger.kt b/packages/SystemUI/src/com/android/systemui/log/FaceAuthenticationLogger.kt
index 66af36a..8c5690b 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 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 b2a8719..934f310 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.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 @@
         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 16885ed..dbd62fe 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 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 @@
 @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 @@
     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 @@
      * 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 @@
         }
     }
 
+    /**
+     * 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/power/shared/model/ScreenPowerState.kt b/packages/SystemUI/src/com/android/systemui/power/shared/model/ScreenPowerState.kt
new file mode 100644
index 0000000..53bbbddf
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/power/shared/model/ScreenPowerState.kt
@@ -0,0 +1,32 @@
+/*
+ * 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.power.shared.model
+
+/**
+ * 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. */
+    SCREEN_TURNING_ON,
+    /** Screen is fully on. */
+    SCREEN_ON,
+    /** Signal that the screen is turning off. */
+    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
similarity index 98%
rename from packages/SystemUI/src/com/android/systemui/keyguard/shared/model/WakeSleepReason.kt
rename to packages/SystemUI/src/com/android/systemui/power/shared/model/WakeSleepReason.kt
index 3602be8..faf9fbe 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 0000000..e1d1ec2
--- /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/power/shared/model/WakefulnessState.kt b/packages/SystemUI/src/com/android/systemui/power/shared/model/WakefulnessState.kt
new file mode 100644
index 0000000..b9fc332
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/power/shared/model/WakefulnessState.kt
@@ -0,0 +1,34 @@
+/*
+ * 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.power.shared.model
+
+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,
+    /** Received a signal that the device is beginning to wake up. */
+    STARTING_TO_WAKE,
+    /** Device is now fully awake and interactive. */
+    AWAKE,
+    /** Signal that the device is now going to sleep. */
+    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 16ffcc2..a6cccf1 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.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 @@
     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 @@
     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 a3499bd..584456d 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.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_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 @@
     @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 @@
         }
 
         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 @@
             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 1038c67..a821729 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.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.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 @@
     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 @@
             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 @@
         mKeyguardTransitionInteractor = keyguardTransitionInteractor;
         mSharedNotificationContainerInteractor = sharedNotificationContainerInteractor;
         mKeyguardInteractor = keyguardInteractor;
+        mPowerInteractor = powerInteractor;
         mKeyguardViewConfigurator = keyguardViewConfigurator;
         mView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
             @Override
@@ -2337,7 +2341,7 @@
     }
 
     private WakefulnessModel getWakefulness() {
-        return mKeyguardInteractor.getWakefulnessModel().getValue();
+        return mPowerInteractor.getDetailedWakefulness().getValue();
     }
 
     @VisibleForTesting
@@ -3776,7 +3780,7 @@
             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 fdc049c..637cf96 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 @@
 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 @@
          */
         @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 664103f..c2863fb 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.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.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 @@
     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 @@
 
     @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 @@
         }, 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 @@
     @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 d058d04..7f5829d 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 @@
             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 b051809..66b2555 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.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.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 @@
     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 @@
                 @Override
                 public float getFalsingThresholdFactor() {
                     return ShadeViewController.getFalsingThresholdFactor(
-                            mKeyguardInteractor.getWakefulnessModel().getValue());
+                            mPowerInteractor.getDetailedWakefulness().getValue());
                 }
 
                 @Override
@@ -640,7 +640,7 @@
             SysuiStatusBarStateController statusBarStateController,
             KeyguardMediaController keyguardMediaController,
             KeyguardBypassController keyguardBypassController,
-            KeyguardInteractor keyguardInteractor,
+            PowerInteractor powerInteractor,
             PrimaryBouncerInteractor primaryBouncerInteractor,
             KeyguardTransitionRepository keyguardTransitionRepo,
             ZenModeController zenModeController,
@@ -692,7 +692,7 @@
         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 023efdd..2809cad 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.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 @@
             BiometricUnlockLogger biometricUnlockLogger,
             NotificationMediaManager notificationMediaManager,
             WakefulnessLifecycle wakefulnessLifecycle,
-            ScreenLifecycle screenLifecycle,
             AuthController authController,
             StatusBarStateController statusBarStateController,
             SessionTracker sessionTracker,
@@ -295,7 +293,6 @@
         mLatencyTracker = latencyTracker;
         mWakefulnessLifecycle = wakefulnessLifecycle;
         mWakefulnessLifecycle.addObserver(mWakefulnessObserver);
-        screenLifecycle.addObserver(mScreenObserver);
 
         mNotificationShadeWindowController = notificationShadeWindowController;
         mDozeScrimController = dozeScrimController;
@@ -851,18 +848,6 @@
                 }
             };
 
-    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 484b119..989164e 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.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 @@
     @Mock protected ViewTreeObserver mViewTreeObserver;
     @Mock protected DumpManager mDumpManager;
     protected FakeKeyguardRepository mFakeKeyguardRepository;
+    protected FakePowerRepository mFakePowerRepository;
 
     protected KeyguardStatusViewController mController;
 
@@ -74,6 +77,7 @@
 
         KeyguardInteractorFactory.WithDependencies deps = KeyguardInteractorFactory.create();
         mFakeKeyguardRepository = deps.getRepository();
+        mFakePowerRepository = new FakePowerRepository();
 
         mController = new KeyguardStatusViewController(
                 mKeyguardStatusView,
@@ -88,7 +92,10 @@
                 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 2b9797e..17f77aa 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 @@
 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.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 @@
         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 ddb482f..8693d5c 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.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 @@
             WindowRootViewVisibilityRepository(iStatusBarService, executor),
             keyguardRepository,
             headsUpManager,
+            powerInteractor,
         )
     }
 
@@ -112,6 +113,8 @@
             .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 @@
     fun shadeVisibleAndDeviceAwake_callbackRegistered() {
         backActionInteractor.start()
         windowRootViewVisibilityInteractor.setIsLockscreenOrShadeVisible(true)
-        setWakefulness(WakefulnessState.AWAKE)
+        powerInteractor.setAwakeForTest()
 
         testScope.runCurrent()
 
@@ -193,7 +196,7 @@
 
         backActionInteractor.start()
         windowRootViewVisibilityInteractor.setIsLockscreenOrShadeVisible(true)
-        setWakefulness(WakefulnessState.AWAKE)
+        powerInteractor.setAwakeForTest()
 
         testScope.runCurrent()
         // No assert necessary, just testing no crash
@@ -203,7 +206,7 @@
     fun shadeNotVisible_callbackUnregistered() {
         backActionInteractor.start()
         windowRootViewVisibilityInteractor.setIsLockscreenOrShadeVisible(true)
-        setWakefulness(WakefulnessState.AWAKE)
+        powerInteractor.setAwakeForTest()
         val callback = getBackInvokedCallback()
 
         windowRootViewVisibilityInteractor.setIsLockscreenOrShadeVisible(false)
@@ -216,10 +219,10 @@
     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 @@
         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 @@
         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 @@
         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 @@
         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 @@
         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 @@
 
     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 05d6b99..00951c3 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.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 @@
     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 @@
         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 @@
         resourceTrimmer =
             ResourceTrimmer(
                 keyguardInteractor,
+                powerInteractor,
                 KeyguardTransitionInteractorFactory.create(
                         scope = TestScope().backgroundScope,
                         repository = keyguardTransitionRepository,
@@ -91,13 +92,7 @@
     @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 @@
         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 @@
         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 @@
         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 @@
         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 5a95ebe..307204da 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.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.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.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.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.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 @@
         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 @@
     private var wasAuthCancelled = false
     private var wasDetectCancelled = false
 
+    private lateinit var keyguardTransitionInteractor: KeyguardTransitionInteractor
+
     @Before
     fun setup() {
         MockitoAnnotations.initMocks(this)
@@ -187,13 +195,30 @@
                 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 @@
                 testDispatcher,
                 testScope.backgroundScope
             )
-        keyguardTransitionRepository = FakeKeyguardTransitionRepository()
-        val keyguardTransitionInteractor =
-            KeyguardTransitionInteractorFactory.create(
-                    scope = TestScope().backgroundScope,
-                    repository = keyguardTransitionRepository,
-                )
-                .keyguardTransitionInteractor
+
         fakeFacePropertyRepository = FakeFacePropertyRepository()
         return DeviceEntryFaceAuthRepositoryImpl(
             mContext,
@@ -271,6 +290,7 @@
             deviceEntryFingerprintAuthRepository,
             trustRepository,
             keyguardRepository,
+            powerInteractor,
             keyguardInteractor,
             alternateBouncerInteractor,
             faceDetectBuffer,
@@ -619,13 +639,7 @@
     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 @@
         }
 
     @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 @@
     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 @@
 
             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 @@
 
             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 @@
     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 @@
             .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 f93051c..7983e30 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.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 @@
 
     @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 @@
         underTest =
             KeyguardRepositoryImpl(
                 statusBarStateController,
-                wakefulnessLifecycle,
                 screenLifecycle,
                 biometricUnlockController,
                 keyguardStateController,
@@ -310,93 +303,6 @@
         }
 
     @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 6fcf54c..4942cf8 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.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 @@
 @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 @@
     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 @@
         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 e2bf2f8..4f6ec71 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.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 @@
                 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 85bc374..5bd747f 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.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 @@
                 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 518b3cc..b527510 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 @@
 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.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 @@
     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 @@
         fakeUserRepository.setUserInfos(listOf(primaryUser, secondaryUser))
         facePropertyRepository = FakeFacePropertyRepository()
         fakeKeyguardRepository = FakeKeyguardRepository()
+        powerInteractor = PowerInteractorFactory.create().powerInteractor
         underTest =
             SystemUIKeyguardFaceAuthInteractor(
                 mContext,
@@ -154,6 +158,7 @@
                 facePropertyRepository,
                 fakeKeyguardRepository,
                 faceWakeUpTriggersConfig,
+                powerInteractor,
             )
     }
 
@@ -162,13 +167,7 @@
         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 @@
         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 @@
         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 @@
         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 82c7fa4..ca52cdb 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.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 @@
         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 a3f7fc5..bbe6823 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.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 @@
     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 @@
         whenever(mediaSessionLegacyHelperWrapper.getHelper(any()))
             .thenReturn(mediaSessionLegacyHelper)
         keyguardInteractorWithDependencies = KeyguardInteractorFactory.create()
+        powerInteractor = PowerInteractorFactory.create().powerInteractor
+
         underTest =
             KeyguardKeyEventInteractor(
                 context,
@@ -85,6 +85,7 @@
                 shadeController,
                 mediaSessionLegacyHelperWrapper,
                 backActionInteractor,
+                powerInteractor,
             )
     }
 
@@ -132,7 +133,7 @@
 
     @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 @@
 
     @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 @@
 
     @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 @@
 
     @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 591653e..2cf0e77 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.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 @@
     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 @@
         commandQueue = FakeCommandQueue()
         shadeRepository = FakeShadeRepository()
         transitionRepository = spy(FakeKeyguardTransitionRepository())
+        powerInteractor = PowerInteractorFactory.create().powerInteractor
 
         whenever(keyguardSecurityModel.getSecurityMode(anyInt())).thenReturn(PIN)
 
@@ -118,11 +123,13 @@
                 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 @@
         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 @@
         fromDreamingLockscreenHostedTransitionInteractor =
             FromDreamingLockscreenHostedTransitionInteractor(
                     scope = testScope,
-                    keyguardInteractor = createKeyguardInteractor(),
+                    keyguardInteractor = keyguardInteractor,
                     transitionRepository = transitionRepository,
                     transitionInteractor = transitionInteractor,
                 )
@@ -173,7 +182,7 @@
         fromAodTransitionInteractor =
             FromAodTransitionInteractor(
                     scope = testScope,
-                    keyguardInteractor = createKeyguardInteractor(),
+                    keyguardInteractor = keyguardInteractor,
                     transitionRepository = transitionRepository,
                     transitionInteractor = transitionInteractor,
                 )
@@ -182,36 +191,40 @@
         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 @@
     @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 @@
             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 @@
             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 @@
         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 @@
         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 @@
             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 @@
             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 @@
         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 @@
     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 @@
         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 @@
             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 @@
             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 @@
     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 @@
     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 @@
             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 @@
             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 @@
     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 @@
         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 @@
         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 @@
     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 @@
         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 @@
         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 @@
         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 @@
         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 @@
         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 @@
         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 @@
         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 @@
             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 @@
             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 @@
     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 @@
     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 @@
     @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 @@
     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 @@
     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 @@
     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 @@
     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 @@
 
             // 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 @@
             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 @@
         )
         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 4736545..8262869 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 @@
     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 @@
         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 @@
                         configurationRepository = configurationRepository,
                         sceneInteractor =
                             mock { whenever(transitioningTo).thenReturn(MutableStateFlow(null)) },
+                        powerInteractor = powerInteractor,
                     )
                     .keyguardInteractor,
                 PrimaryBouncerInteractor(
@@ -147,13 +157,7 @@
                 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 6efec99..3442df6 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.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 @@
     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 @@
                 configRepository,
                 keyguardInteractor
             )
+        powerInteractor = PowerInteractorFactory.create().powerInteractor
 
         underTest =
             UdfpsKeyguardInteractor(
@@ -217,12 +219,6 @@
         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 5eda263..42cf9f4 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 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 @@
         underTest =
             PowerInteractor(
                 repository,
-                keyguardRepository,
                 falsingCollector,
                 screenOffAnimationController,
                 statusBarStateController,
@@ -130,13 +131,7 @@
 
     @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 @@
 
     @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 @@
     @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 @@
         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 5259013..91f3865 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.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 @@
         utils.keyguardInteractor(
             repository = keyguardRepository,
         )
+    private val powerInteractor = PowerInteractorFactory.create().powerInteractor
 
     private var bouncerSceneJob: Job? = null
 
@@ -197,6 +200,7 @@
                 displayId = displayTracker.defaultDisplayId,
                 sceneLogger = mock(),
                 falsingCollector = utils.falsingCollector(),
+                powerInteractor = powerInteractor,
             )
         startable.start()
 
@@ -571,18 +575,12 @@
 
     /** 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 @@
     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 f304435..3785fd7 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.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 @@
     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 @@
                 windowRootViewVisibilityRepository,
                 keyguardRepository,
                 headsUpManager,
+                powerInteractor,
             )
             .apply { setUp(notificationPresenter, notificationsController) }
 
@@ -96,7 +98,7 @@
     fun isLockscreenOrShadeVisibleAndInteractive_notVisible_false() =
         testScope.runTest {
             val actual by collectLastValue(underTest.isLockscreenOrShadeVisibleAndInteractive)
-            setWakefulness(WakefulnessState.AWAKE)
+            powerInteractor.setAwakeForTest()
 
             underTest.setIsLockscreenOrShadeVisible(false)
 
@@ -109,7 +111,7 @@
             val actual by collectLastValue(underTest.isLockscreenOrShadeVisibleAndInteractive)
             underTest.setIsLockscreenOrShadeVisible(true)
 
-            setWakefulness(WakefulnessState.ASLEEP)
+            powerInteractor.setAsleepForTest()
 
             assertThat(actual).isFalse()
         }
@@ -120,7 +122,7 @@
             val actual by collectLastValue(underTest.isLockscreenOrShadeVisibleAndInteractive)
 
             underTest.setIsLockscreenOrShadeVisible(true)
-            setWakefulness(WakefulnessState.AWAKE)
+            powerInteractor.setAwakeForTest()
 
             assertThat(actual).isTrue()
         }
@@ -131,20 +133,20 @@
             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 @@
 
     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 00a20cc..0216a0a 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.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 @@
     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 @@
             displayId = Display.DEFAULT_DISPLAY,
             sceneLogger = mock(),
             falsingCollector = falsingCollector,
+            powerInteractor = powerInteractor,
         )
 
     @Test
@@ -201,8 +204,7 @@
             )
             assertThat(currentSceneKey).isEqualTo(SceneKey.Shade)
             underTest.start()
-
-            utils.keyguardRepository.setWakefulnessModel(STARTING_TO_SLEEP)
+            powerInteractor.setAsleepForTest()
 
             assertThat(currentSceneKey).isEqualTo(SceneKey.Lockscreen)
         }
@@ -247,8 +249,7 @@
             )
             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 @@
             )
             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 @@
             )
             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 @@
 
             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 @@
             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 @@
             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 @@
         }
         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 24d62fb..b4f890b 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.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 @@
     @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 @@
         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 ed731dd..7b12931 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.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.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 java.util.List;
 import java.util.Optional;
 
+import dagger.Lazy;
 import kotlinx.coroutines.CoroutineDispatcher;
 
 public class NotificationPanelViewControllerBaseTest extends SysuiTestCase {
@@ -332,6 +332,7 @@
     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 @@
         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 @@
                 mFeatureFlags,
                 mInteractionJankMonitor,
                 mKeyguardInteractor,
-                mDumpManager));
+                mDumpManager,
+                mPowerInteractor));
 
         when(mAuthController.isUdfpsEnrolled(anyInt())).thenReturn(false);
         when(mHeadsUpCallback.getContext()).thenReturn(mContext);
@@ -662,7 +665,8 @@
                 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 37ec762..0cc5716 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 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.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 @@
 
     @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 @@
 
     @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 @@
 
     @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 29bc64e..3900def 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.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 @@
     @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 @@
         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 bf2d6a6..b5841a9 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.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 @@
             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 6e990a7..14e58e5 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.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.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.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 @@
             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 bbf0151..168e782 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.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 @@
             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 @@
                 mTestScope.getBackgroundScope(),
                 new WindowRootViewVisibilityRepository(mBarService, mUiBgExecutor),
                 mKeyguardRepository,
-                mHeadsUpManager);
+                mHeadsUpManager,
+                mPowerInteractor);
         mWindowRootViewVisibilityInteractor.setIsLockscreenOrShadeVisible(true);
 
         mEntry = new NotificationEntryBuilder()
@@ -285,20 +287,12 @@
     }
 
     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 0f1e63f..9f2afdf 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.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 @@
                 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 8881f42..59d98c2 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.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 @@
     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 6221f3e..390c1dd 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 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 @@
     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 5606216..ffe312b 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.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.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 @@
     @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 @@
                 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 20e732a..700de53 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 @@
                 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 05842a5..c0d248e 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.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 @@
         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 3151ad1..8013e5e 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.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 @@
                 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 f8ec8d1..f4078d5 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.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 @@
         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 aa52609..9de7ad8 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.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 @@
     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 @@
         _dozeAmount.value = dozeAmount
     }
 
-    fun setWakefulnessModel(model: WakefulnessModel) {
-        _wakefulnessModel.value = model
-    }
-
     fun setBiometricUnlockState(state: BiometricUnlockModel) {
         _biometricUnlockState.tryEmit(state)
     }
@@ -244,10 +226,6 @@
         _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 945aaed..8e96b52 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.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 @@
                 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 @@
                     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 1cae09b..82ce802 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.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 @@
         configurationRepository: FakeConfigurationRepository = FakeConfigurationRepository(),
         shadeRepository: FakeShadeRepository = FakeShadeRepository(),
         sceneInteractor: SceneInteractor = mock(),
+        powerInteractor: PowerInteractor = PowerInteractorFactory.create().powerInteractor,
     ): WithDependencies {
         return WithDependencies(
             repository = repository,
@@ -58,6 +61,7 @@
             bouncerRepository = bouncerRepository,
             configurationRepository = configurationRepository,
             shadeRepository = shadeRepository,
+            powerInteractor = powerInteractor,
             KeyguardInteractor(
                 repository = repository,
                 commandQueue = commandQueue,
@@ -68,7 +72,8 @@
                 configurationRepository = configurationRepository,
                 shadeRepository = shadeRepository,
                 sceneInteractorProvider = { sceneInteractor },
-            )
+                powerInteractor = powerInteractor,
+            ),
         )
     }
 
@@ -86,6 +91,7 @@
         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 5ab8204..957fbbd 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 @@
 
 @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 @@
     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 0000000..d92ace9
--- /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 179206f..6777734 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.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 @@
             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 @@
             configurationRepository = FakeConfigurationRepository(),
             shadeRepository = FakeShadeRepository(),
             sceneInteractorProvider = { sceneInteractor() },
+            powerInteractor = PowerInteractorFactory.create().powerInteractor,
         )
     }