diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java index 5123a9f451766..882e99abfb07b 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -715,28 +715,28 @@ public final class PowerManager { * @hide */ public static class WakeData { - public WakeData(long wakeTime, @WakeReason int wakeReason, long sleepDuration) { + public WakeData(long wakeTime, @WakeReason int wakeReason, long sleepDurationRealtime) { this.wakeTime = wakeTime; this.wakeReason = wakeReason; - this.sleepDuration = sleepDuration; + this.sleepDurationRealtime = sleepDurationRealtime; } public final long wakeTime; public final @WakeReason int wakeReason; - public final long sleepDuration; + public final long sleepDurationRealtime; @Override public boolean equals(@Nullable Object o) { if (o instanceof WakeData) { final WakeData other = (WakeData) o; return wakeTime == other.wakeTime && wakeReason == other.wakeReason - && sleepDuration == other.sleepDuration; + && sleepDurationRealtime == other.sleepDurationRealtime; } return false; } @Override public int hashCode() { - return Objects.hash(wakeTime, wakeReason, sleepDuration); + return Objects.hash(wakeTime, wakeReason, sleepDurationRealtime); } } diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index dd952f4e903b7..cbab2c594b4e8 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -4585,12 +4585,13 @@ public class PhoneWindowManager implements WindowManagerPolicy { return false; } - final long sleepDuration = mPowerManagerInternal.getLastWakeup().sleepDuration; + final long sleepDurationRealtime = + mPowerManagerInternal.getLastWakeup().sleepDurationRealtime; if (DEBUG_WAKEUP) { - Log.i(TAG, "shouldWakeUpWithHomeIntent: sleepDuration= " + sleepDuration + Log.i(TAG, "shouldWakeUpWithHomeIntent: sleepDurationRealtime= " + sleepDurationRealtime + " mWakeUpToLastStateTimeout= " + mWakeUpToLastStateTimeout); } - return sleepDuration > mWakeUpToLastStateTimeout; + return sleepDurationRealtime > mWakeUpToLastStateTimeout; } private void wakeUpFromPowerKey(long eventTime) { diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 70be8b82ba782..39dfb0a53ea36 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -376,6 +376,10 @@ public final class PowerManagerService extends SystemService private long mLastGlobalWakeTime; private long mLastGlobalSleepTime; + // Timestamp (in the elapsed realtime timebase) of the last time was awoken or put to sleep. + private long mLastGlobalWakeTimeRealtime; + private long mLastGlobalSleepTimeRealtime; + // Last reason the device went to sleep. private @WakeReason int mLastGlobalWakeReason; private @GoToSleepReason int mLastGlobalSleepReason; @@ -927,6 +931,11 @@ public final class PowerManagerService extends SystemService * Returns current time in milliseconds since boot, not counting time spent in deep sleep. */ long uptimeMillis(); + + /** + * Returns milliseconds since boot, including time spent in sleep. + */ + long elapsedRealtime(); } @VisibleForTesting @@ -1005,7 +1014,18 @@ public final class PowerManagerService extends SystemService } Clock createClock() { - return SystemClock::uptimeMillis; + return new Clock() { + @Override + public long uptimeMillis() { + return SystemClock.uptimeMillis(); + } + + @Override + public long elapsedRealtime() { + return SystemClock.elapsedRealtime(); + } + }; + } /** @@ -2141,6 +2161,7 @@ public final class PowerManagerService extends SystemService + ")..."); mLastGlobalWakeTime = eventTime; mLastGlobalWakeReason = reason; + mLastGlobalWakeTimeRealtime = mClock.elapsedRealtime(); break; case WAKEFULNESS_DREAMING: @@ -2152,9 +2173,9 @@ public final class PowerManagerService extends SystemService traceMethodName = "goToSleep"; Slog.i(TAG, "Going to sleep due to " + PowerManager.sleepReasonToString(reason) + " (uid " + uid + ")..."); - mLastGlobalSleepTime = eventTime; mLastGlobalSleepReason = reason; + mLastGlobalSleepTimeRealtime = mClock.elapsedRealtime(); mDozeStartInProgress = true; break; @@ -4404,6 +4425,10 @@ public final class PowerManagerService extends SystemService pw.println(" mLastSleepTime=" + TimeUtils.formatUptime(mLastGlobalSleepTime)); pw.println(" mLastSleepReason=" + PowerManager.sleepReasonToString( mLastGlobalSleepReason)); + pw.println(" mLastGlobalWakeTimeRealtime=" + + TimeUtils.formatUptime(mLastGlobalWakeTimeRealtime)); + pw.println(" mLastGlobalSleepTimeRealtime=" + + TimeUtils.formatUptime(mLastGlobalSleepTimeRealtime)); pw.println(" mLastInteractivePowerHintTime=" + TimeUtils.formatUptime(mLastInteractivePowerHintTime)); pw.println(" mLastScreenBrightnessBoostTime=" @@ -5886,7 +5911,7 @@ public final class PowerManagerService extends SystemService boolean isPersonalized) { // Get current time before acquiring the lock so that the calculated end time is as // accurate as possible. - final long nowElapsed = SystemClock.elapsedRealtime(); + final long nowElapsed = mClock.elapsedRealtime(); if (mContext.checkCallingOrSelfPermission( android.Manifest.permission.BATTERY_PREDICTION) != PackageManager.PERMISSION_GRANTED) { @@ -5950,7 +5975,7 @@ public final class PowerManagerService extends SystemService synchronized (mEnhancedDischargeTimeLock) { // Get current time after acquiring the lock so that the calculated duration // is as accurate as possible. - final long nowElapsed = SystemClock.elapsedRealtime(); + final long nowElapsed = mClock.elapsedRealtime(); if (isEnhancedDischargePredictionValidLocked(nowElapsed)) { return new ParcelDuration(mEnhancedDischargeTimeElapsed - nowElapsed); } @@ -5969,7 +5994,7 @@ public final class PowerManagerService extends SystemService final long ident = Binder.clearCallingIdentity(); try { synchronized (mEnhancedDischargeTimeLock) { - return isEnhancedDischargePredictionValidLocked(SystemClock.elapsedRealtime()) + return isEnhancedDischargePredictionValidLocked(mClock.elapsedRealtime()) && mEnhancedDischargePredictionIsPersonalized; } } finally { @@ -6459,7 +6484,7 @@ public final class PowerManagerService extends SystemService private PowerManager.WakeData getLastWakeupInternal() { synchronized (mLock) { return new PowerManager.WakeData(mLastGlobalWakeTime, mLastGlobalWakeReason, - mLastGlobalWakeTime - mLastGlobalSleepTime); + mLastGlobalWakeTimeRealtime - mLastGlobalSleepTimeRealtime); } } diff --git a/services/tests/mockingservicestests/src/com/android/server/power/PowerManagerServiceMockingTest.java b/services/tests/mockingservicestests/src/com/android/server/power/PowerManagerServiceMockingTest.java index 5c4657fb00273..0f2c27c83791a 100644 --- a/services/tests/mockingservicestests/src/com/android/server/power/PowerManagerServiceMockingTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/power/PowerManagerServiceMockingTest.java @@ -223,7 +223,17 @@ public class PowerManagerServiceMockingTest { @Override PowerManagerService.Clock createClock() { - return () -> mClock.now(); + return new PowerManagerService.Clock() { + @Override + public long uptimeMillis() { + return mClock.now(); + } + + @Override + public long elapsedRealtime() { + return mClock.now(); + } + }; } @Override 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 78f7f66ec7eb1..f1f423d537dc5 100644 --- a/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/power/PowerManagerServiceTest.java @@ -158,6 +158,7 @@ public class PowerManagerServiceTest { private UserSwitchedReceiver mUserSwitchedReceiver; private Resources mResourcesSpy; private OffsettableClock mClock; + private long mLastElapsedRealtime; private TestLooper mTestLooper; private static class IntentFilterMatcher implements ArgumentMatcher { @@ -286,7 +287,18 @@ public class PowerManagerServiceTest { @Override PowerManagerService.Clock createClock() { - return () -> mClock.now(); + return new PowerManagerService.Clock() { + @Override + public long uptimeMillis() { + return mClock.now(); + } + + @Override + public long elapsedRealtime() { + mLastElapsedRealtime = mClock.now(); + return mLastElapsedRealtime; + } + }; } @Override @@ -1686,6 +1698,7 @@ public class PowerManagerServiceTest { mService.setWakefulnessLocked(nonDefaultPowerGroupId, WAKEFULNESS_DOZING, eventTime2, 0, PowerManager.GO_TO_SLEEP_REASON_APPLICATION, 0, null, null); + long eventElapsedRealtime1 = mLastElapsedRealtime; assertThat(mService.getGlobalWakefulnessLocked()).isEqualTo(WAKEFULNESS_DOZING); assertThat(mService.getBinderServiceInstance().getLastSleepReason()).isEqualTo( PowerManager.GO_TO_SLEEP_REASON_APPLICATION); @@ -1693,19 +1706,20 @@ public class PowerManagerServiceTest { mService.setWakefulnessLocked(Display.DEFAULT_DISPLAY_GROUP, WAKEFULNESS_AWAKE, eventTime3, /* uid= */ 0, PowerManager.WAKE_REASON_PLUGGED_IN, /* opUid= */ 0, /* opPackageName= */ null, /* details= */ null); + long eventElapsedRealtime2 = mLastElapsedRealtime; PowerManager.WakeData wakeData = mService.getLocalServiceInstance().getLastWakeup(); assertThat(wakeData.wakeTime).isEqualTo(eventTime3); assertThat(wakeData.wakeReason).isEqualTo(PowerManager.WAKE_REASON_PLUGGED_IN); - assertThat(wakeData.sleepDuration).isEqualTo(eventTime3 - eventTime2); + assertThat(wakeData.sleepDurationRealtime) + .isEqualTo(eventElapsedRealtime2 - eventElapsedRealtime1); // The global wake time and reason as well as sleep duration shouldn't change when another // PowerGroup wakes up. mService.setWakefulnessLocked(nonDefaultPowerGroupId, WAKEFULNESS_AWAKE, eventTime4, /* uid= */ 0, PowerManager.WAKE_REASON_CAMERA_LAUNCH, /* opUid= */ 0, /* opPackageName= */ null, /* details= */ null); - assertThat(wakeData.wakeTime).isEqualTo(eventTime3); - assertThat(wakeData.wakeReason).isEqualTo(PowerManager.WAKE_REASON_PLUGGED_IN); - assertThat(wakeData.sleepDuration).isEqualTo(eventTime3 - eventTime2); + PowerManager.WakeData wakeData2 = mService.getLocalServiceInstance().getLastWakeup(); + assertThat(wakeData2).isEqualTo(wakeData); } @Test