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