From bf27786ba491b9a8af8e18a7abb57cd67db23755 Mon Sep 17 00:00:00 2001 From: Kweku Adams Date: Fri, 19 Jul 2019 15:20:44 -0700 Subject: [PATCH] Enter quick doze with non-wakeup alarm. If a user has an AlarmClock going off within the next hour, the device won't go into deep Doze. When in Battery Saver, the system tries to enter deep Doze faster, scheduling an alarm one minute after the screen turns off to enter deep Doze. This conflict results in the system scheduling a wakeup alarm every minute until the AlarmClock alarm. Switching to a non-wakeup alarm prevents the system from waking up every minute if the device is in Battery Saver mode and there's an AlarmClock scheduled within the next hour. Bug: 135975445 Test: atest com.android.server.DeviceIdleControllerTest Change-Id: Ia60ec769979dc9a792dc73f2a6a646397af7adcb Merged-In: I98bf4131b7b4a1006e37aa42bcbc7dda7e137d1d --- .../com/android/server/DeviceIdleController.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/DeviceIdleController.java b/services/core/java/com/android/server/DeviceIdleController.java index 52a4218238e7b..2ab46e65e77fa 100644 --- a/services/core/java/com/android/server/DeviceIdleController.java +++ b/services/core/java/com/android/server/DeviceIdleController.java @@ -2737,7 +2737,9 @@ public class DeviceIdleController extends SystemService resetIdleManagementLocked(); // Wait a small amount of time in case something (eg: background service from // recently closed app) needs to finish running. - scheduleAlarmLocked(mConstants.QUICK_DOZE_DELAY_TIMEOUT, false); + // Use a non-wakeup alarm for going into quick doze in case an AlarmClock alarm + // is scheduled soon. The non-wakeup alarm will be delayed by at most 2 minutes. + scheduleAlarmLocked(mConstants.QUICK_DOZE_DELAY_TIMEOUT, false, false); EventLogTags.writeDeviceIdle(mState, "no activity"); } else if (mState == STATE_ACTIVE) { mState = STATE_INACTIVE; @@ -3362,6 +3364,10 @@ public class DeviceIdleController extends SystemService } void scheduleAlarmLocked(long delay, boolean idleUntil) { + scheduleAlarmLocked(delay, idleUntil, true); + } + + private void scheduleAlarmLocked(long delay, boolean idleUntil, boolean useWakeupAlarm) { if (DEBUG) Slog.d(TAG, "scheduleAlarmLocked(" + delay + ", " + idleUntil + ")"); if (mUseMotionSensor && mMotionSensor == null @@ -3377,12 +3383,14 @@ public class DeviceIdleController extends SystemService // can continue until the user interacts with the device. return; } + final int alarmType = useWakeupAlarm + ? AlarmManager.ELAPSED_REALTIME_WAKEUP : AlarmManager.ELAPSED_REALTIME; mNextAlarmTime = SystemClock.elapsedRealtime() + delay; if (idleUntil) { - mAlarmManager.setIdleUntil(AlarmManager.ELAPSED_REALTIME_WAKEUP, + mAlarmManager.setIdleUntil(alarmType, mNextAlarmTime, "DeviceIdleController.deep", mDeepAlarmListener, mHandler); } else { - mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, + mAlarmManager.set(alarmType, mNextAlarmTime, "DeviceIdleController.deep", mDeepAlarmListener, mHandler); } }