diff options
3 files changed, 36 insertions, 3 deletions
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java index e3be4d32a014..8f2d218a20c1 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{} @@ -673,6 +674,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 048f8d6a04fa..ed0185129da2 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -667,8 +667,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); @@ -3211,7 +3215,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 b2f506a5b1f9..df512bd19e64 100644 --- a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java @@ -887,6 +887,27 @@ public class PowerManagerServiceTest { } @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 testScreenOffTimeout_goesToSleepAfterTimeout() { final DisplayInfo info = new DisplayInfo(); info.displayGroupId = Display.DEFAULT_DISPLAY_GROUP; |