From 7592e0073d4786408005dc499ec68e7c920f9d21 Mon Sep 17 00:00:00 2001 From: Robert Horvath Date: Wed, 23 Mar 2022 12:56:53 +0100 Subject: [PATCH] Don't poke user activity when dream ends The dream may end for various reasons, including some that do not represent user activity, such as app crashes or the app being updated. In these cases, the user activity should not be poked, as this would reset the inattentive sleep timer. Bug: 215559033 Test: atest PowerManagerServiceTest Test: Kill dream app, observe `dumpsys power` lastUserActivityTime Test: Kill dream app, verify inattentive sleep timer not affected Change-Id: If9b61cab3d5e21b89f3c0ab7fe541d46bc865f97 --- core/java/android/os/PowerManager.java | 10 ++++++++- .../server/power/PowerManagerService.java | 8 +++++-- .../server/power/PowerManagerServiceTest.java | 21 +++++++++++++++++++ 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java index e3be4d32a014a..8f2d218a20c12 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -566,7 +566,8 @@ public final class PowerManager { WAKE_REASON_HDMI, WAKE_REASON_DISPLAY_GROUP_ADDED, WAKE_REASON_DISPLAY_GROUP_TURNED_ON, - WAKE_REASON_UNFOLD_DEVICE + WAKE_REASON_UNFOLD_DEVICE, + WAKE_REASON_DREAM_FINISHED }) @Retention(RetentionPolicy.SOURCE) public @interface WakeReason{} @@ -672,6 +673,12 @@ public final class PowerManager { */ public static final int WAKE_REASON_UNFOLD_DEVICE = 12; + /** + * Wake up reason code: Waking the device due to the dream finishing. + * @hide + */ + public static final int WAKE_REASON_DREAM_FINISHED = 13; + /** * Convert the wake reason to a string for debugging purposes. * @hide @@ -691,6 +698,7 @@ public final class PowerManager { case WAKE_REASON_DISPLAY_GROUP_ADDED: return "WAKE_REASON_DISPLAY_GROUP_ADDED"; case WAKE_REASON_DISPLAY_GROUP_TURNED_ON: return "WAKE_REASON_DISPLAY_GROUP_TURNED_ON"; case WAKE_REASON_UNFOLD_DEVICE: return "WAKE_REASON_UNFOLD_DEVICE"; + case WAKE_REASON_DREAM_FINISHED: return "WAKE_REASON_DREAM_FINISHED"; default: return Integer.toString(wakeReason); } } diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 1a816220670a6..edf9ff6ea6ba6 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -664,8 +664,12 @@ public final class PowerManagerService extends SystemService int reason, int uid, int opUid, String opPackageName, String details) { if (wakefulness == WAKEFULNESS_AWAKE) { // Kick user activity to prevent newly awake group from timing out instantly. + // The dream may end without user activity if the dream app crashes / is updated, + // don't poke the user activity timer for these wakes. + int flags = reason == PowerManager.WAKE_REASON_DREAM_FINISHED + ? PowerManager.USER_ACTIVITY_FLAG_NO_CHANGE_LIGHTS : 0; userActivityNoUpdateLocked(mPowerGroups.get(groupId), eventTime, - PowerManager.USER_ACTIVITY_EVENT_OTHER, 0, uid); + PowerManager.USER_ACTIVITY_EVENT_OTHER, flags, uid); } mDirty |= DIRTY_DISPLAY_GROUP_WAKEFULNESS; updateGlobalWakefulnessLocked(eventTime, reason, uid, opUid, opPackageName, details); @@ -3200,7 +3204,7 @@ public final class PowerManagerService extends SystemService } } else { wakePowerGroupLocked(powerGroup, now, - PowerManager.WAKE_REASON_UNKNOWN, + PowerManager.WAKE_REASON_DREAM_FINISHED, "android.server.power:DREAM_FINISHED", Process.SYSTEM_UID, mContext.getOpPackageName(), Process.SYSTEM_UID); } diff --git a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java index 0b2ebbc69cb71..10267000edf1f 100644 --- a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java @@ -932,6 +932,27 @@ public class PowerManagerServiceTest { PowerManager.GO_TO_SLEEP_REASON_INATTENTIVE); } + @Test + public void testInattentiveSleep_dreamEnds_goesToSleepAfterTimeout() { + setMinimumScreenOffTimeoutConfig(5); + setAttentiveTimeout(30000); + createService(); + startSystem(); + + advanceTime(10000); + forceDream(); + advanceTime(10000); + final String pkg = mContextSpy.getOpPackageName(); + mService.getBinderServiceInstance().wakeUp(mClock.now(), + PowerManager.WAKE_REASON_DREAM_FINISHED, "PowerManagerServiceTest:DREAM_FINISHED", + pkg); + advanceTime(10001); + + assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_ASLEEP); + assertThat(mService.getBinderServiceInstance().getLastSleepReason()).isEqualTo( + PowerManager.GO_TO_SLEEP_REASON_INATTENTIVE); + } + @Test public void testInattentiveSleep_wakeLockOnAfterRelease_inattentiveSleepTimeoutNotAffected() { final DisplayInfo info = new DisplayInfo();