(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,
)
}