• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package com.android.systemui.power.shared.model
2 
3 import com.android.systemui.keyguard.KeyguardService
4 import com.android.systemui.log.table.Diffable
5 import com.android.systemui.log.table.TableRowLogger
6 
7 /**
8  * Models whether the device is awake or asleep, along with information about why we're in that
9  * state.
10  */
11 data class WakefulnessModel(
12     /**
13      * Internal-only wakefulness state, which we receive via [KeyguardService]. This is a more
14      * granular state that tells us whether we've started or finished waking up or going to sleep.
15      *
16      * This distinction has historically been confusing - the display is on once we've "finished"
17      * waking up, but we're still playing screen-on animations. Similarly, the screen off animation
18      * is still playing even once we've "finished" going to sleep.
19      *
20      * Avoid using this whenever possible - [isAwake] and [isAsleep] should be sufficient for nearly
21      * all use cases. If you need more granular information about a waking/sleeping transition, use
22      * the [KeyguardTransitionInteractor].
23      */
24     val internalWakefulnessState: WakefulnessState = WakefulnessState.AWAKE,
25     val lastWakeReason: WakeSleepReason = WakeSleepReason.OTHER,
26     val lastSleepReason: WakeSleepReason = WakeSleepReason.OTHER,
27 
28     /**
29      * Whether the power button double tap gesture was triggered since the last time went to sleep.
30      * If this value is true while [isAsleep]=true, it means we'll be waking back up shortly. If it
31      * is true while [isAwake]=true, it means we're awake because of the button gesture.
32      *
33      * This value remains true until the next time [isAsleep]=true, since it would otherwise be
34      * totally arbitrary at what point we decide the gesture was no longer "triggered". Since a
35      * sleep event is guaranteed to arrive prior to the next power button gesture (as the first tap
36      * of the double tap always begins a sleep transition), this will always be reset to false prior
37      * to a subsequent power gesture.
38      */
39     val powerButtonLaunchGestureTriggered: Boolean = false,
40 ) : Diffable<WakefulnessModel> {
isAwakenull41     fun isAwake() =
42         internalWakefulnessState == WakefulnessState.AWAKE ||
43             internalWakefulnessState == WakefulnessState.STARTING_TO_WAKE
44 
45     fun isAsleep() = !isAwake()
46 
47     fun isAwakeFrom(wakeSleepReason: WakeSleepReason) =
48         isAwake() && lastWakeReason == wakeSleepReason
49 
50     fun isAwakeFromTouch(): Boolean {
51         return isAwake() && lastWakeReason.isTouch
52     }
53 
isAsleepFromnull54     fun isAsleepFrom(wakeSleepReason: WakeSleepReason) =
55         isAsleep() && lastSleepReason == wakeSleepReason
56 
57     fun isAwakeOrAsleepFrom(reason: WakeSleepReason) = isAsleepFrom(reason) || isAwakeFrom(reason)
58 
59     fun isAwakeFromTapOrGesture(): Boolean {
60         return isAwake() &&
61             (lastWakeReason == WakeSleepReason.TAP || lastWakeReason == WakeSleepReason.GESTURE)
62     }
63 
isAwakeFromMotionOrLiftnull64     fun isAwakeFromMotionOrLift(): Boolean {
65         return isAwake() &&
66             (lastWakeReason == WakeSleepReason.MOTION || lastWakeReason == WakeSleepReason.LIFT)
67     }
68 
logDiffsnull69     override fun logDiffs(prevVal: WakefulnessModel, row: TableRowLogger) {
70         row.logChange(columnName = "wakefulness", value = toString())
71     }
72 }
73