summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/os/PowerManager.java10
-rw-r--r--services/core/java/com/android/server/power/PowerManagerService.java8
-rw-r--r--services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java21
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;