diff options
| author | 2016-03-18 15:34:54 -0700 | |
|---|---|---|
| committer | 2016-03-18 16:52:30 -0700 | |
| commit | 2fefbcf0d1b91f37684387971721c90112a9ac89 (patch) | |
| tree | 4f1599f3199415432f382758f9fd95c79473e863 | |
| parent | 0cc531ae31e1bb13ecca2cdcd8ddb296542362e0 (diff) | |
Fix issue #27653326: Sync doesn't work in doze maintenance
Add a (configurable) delay between when we start a maintenance
window until the minimum time we will end it.
Also switch to using the alarm manager callback API. (Yay!)
Also fix a little printing problem in the alarm manager dump
so we put the package name and not some class hash in the
summary string of an alarm entry.
Change-Id: I4281e5c80bc8b26ebc1fb6f603ec33ec0e379daa
7 files changed, 142 insertions, 84 deletions
diff --git a/core/java/android/app/AlarmManager.java b/core/java/android/app/AlarmManager.java index b08142add4d8..cb2130c4528e 100644 --- a/core/java/android/app/AlarmManager.java +++ b/core/java/android/app/AlarmManager.java @@ -559,9 +559,10 @@ public class AlarmManager { * the given time. * @hide */ - public void setIdleUntil(int type, long triggerAtMillis, PendingIntent operation) { - setImpl(type, triggerAtMillis, WINDOW_EXACT, 0, FLAG_IDLE_UNTIL, operation, - null, null, null, null, null); + public void setIdleUntil(int type, long triggerAtMillis, String tag, OnAlarmListener listener, + Handler targetHandler) { + setImpl(type, triggerAtMillis, WINDOW_EXACT, 0, FLAG_IDLE_UNTIL, null, + listener, tag, targetHandler, null, null); } /** diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index 6df2a9d693d3..e730ad81fb92 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -1679,7 +1679,7 @@ public abstract class BatteryStats implements Parcelable { /** * Constant for device idle mode: active in full mode. */ - public static final int DEVICE_IDLE_MODE_FULL = 2; + public static final int DEVICE_IDLE_MODE_DEEP = 2; /** * Returns the time in microseconds that device has been in idle mode while @@ -2754,11 +2754,11 @@ public abstract class BatteryStats implements Parcelable { final long powerSaveModeEnabledTime = getPowerSaveModeEnabledTime(rawRealtime, which); final long deviceIdleModeLightTime = getDeviceIdleModeTime(DEVICE_IDLE_MODE_LIGHT, rawRealtime, which); - final long deviceIdleModeFullTime = getDeviceIdleModeTime(DEVICE_IDLE_MODE_FULL, + final long deviceIdleModeFullTime = getDeviceIdleModeTime(DEVICE_IDLE_MODE_DEEP, rawRealtime, which); final long deviceLightIdlingTime = getDeviceIdlingTime(DEVICE_IDLE_MODE_LIGHT, rawRealtime, which); - final long deviceIdlingTime = getDeviceIdlingTime(DEVICE_IDLE_MODE_FULL, + final long deviceIdlingTime = getDeviceIdlingTime(DEVICE_IDLE_MODE_DEEP, rawRealtime, which); final int connChanges = getNumConnectivityChange(which); final long phoneOnTime = getPhoneOnTime(rawRealtime, which); @@ -2844,14 +2844,14 @@ public abstract class BatteryStats implements Parcelable { getMobileRadioActiveTime(rawRealtime, which) / 1000, getMobileRadioActiveAdjustedTime(which) / 1000, interactiveTime / 1000, powerSaveModeEnabledTime / 1000, connChanges, deviceIdleModeFullTime / 1000, - getDeviceIdleModeCount(DEVICE_IDLE_MODE_FULL, which), deviceIdlingTime / 1000, - getDeviceIdlingCount(DEVICE_IDLE_MODE_FULL, which), + getDeviceIdleModeCount(DEVICE_IDLE_MODE_DEEP, which), deviceIdlingTime / 1000, + getDeviceIdlingCount(DEVICE_IDLE_MODE_DEEP, which), getMobileRadioActiveCount(which), getMobileRadioActiveUnknownTime(which) / 1000, deviceIdleModeLightTime / 1000, getDeviceIdleModeCount(DEVICE_IDLE_MODE_LIGHT, which), deviceLightIdlingTime / 1000, getDeviceIdlingCount(DEVICE_IDLE_MODE_LIGHT, which), getLongestDeviceIdleModeTime(DEVICE_IDLE_MODE_LIGHT), - getLongestDeviceIdleModeTime(DEVICE_IDLE_MODE_FULL)); + getLongestDeviceIdleModeTime(DEVICE_IDLE_MODE_DEEP)); // Dump screen brightness stats Object[] args = new Object[NUM_SCREEN_BRIGHTNESS_BINS]; @@ -3330,11 +3330,11 @@ public abstract class BatteryStats implements Parcelable { final long powerSaveModeEnabledTime = getPowerSaveModeEnabledTime(rawRealtime, which); final long deviceIdleModeLightTime = getDeviceIdleModeTime(DEVICE_IDLE_MODE_LIGHT, rawRealtime, which); - final long deviceIdleModeFullTime = getDeviceIdleModeTime(DEVICE_IDLE_MODE_FULL, + final long deviceIdleModeFullTime = getDeviceIdleModeTime(DEVICE_IDLE_MODE_DEEP, rawRealtime, which); final long deviceLightIdlingTime = getDeviceIdlingTime(DEVICE_IDLE_MODE_LIGHT, rawRealtime, which); - final long deviceIdlingTime = getDeviceIdlingTime(DEVICE_IDLE_MODE_FULL, + final long deviceIdlingTime = getDeviceIdlingTime(DEVICE_IDLE_MODE_DEEP, rawRealtime, which); final long phoneOnTime = getPhoneOnTime(rawRealtime, which); final long wifiRunningTime = getGlobalWifiRunningTime(rawRealtime, which); @@ -3411,7 +3411,7 @@ public abstract class BatteryStats implements Parcelable { formatTimeMs(sb, deviceIdlingTime / 1000); sb.append("("); sb.append(formatRatioLocked(deviceIdlingTime, whichBatteryRealtime)); - sb.append(") "); sb.append(getDeviceIdlingCount(DEVICE_IDLE_MODE_FULL, which)); + sb.append(") "); sb.append(getDeviceIdlingCount(DEVICE_IDLE_MODE_DEEP, which)); sb.append("x"); pw.println(sb.toString()); } @@ -3423,10 +3423,10 @@ public abstract class BatteryStats implements Parcelable { sb.append("("); sb.append(formatRatioLocked(deviceIdleModeFullTime, whichBatteryRealtime)); sb.append(") "); - sb.append(getDeviceIdleModeCount(DEVICE_IDLE_MODE_FULL, which)); + sb.append(getDeviceIdleModeCount(DEVICE_IDLE_MODE_DEEP, which)); sb.append("x"); sb.append(" -- longest "); - formatTimeMs(sb, getLongestDeviceIdleModeTime(DEVICE_IDLE_MODE_FULL)); + formatTimeMs(sb, getLongestDeviceIdleModeTime(DEVICE_IDLE_MODE_DEEP)); pw.println(sb.toString()); } if (phoneOnTime != 0) { diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index d11787d86571..b0ef01281677 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -3444,7 +3444,7 @@ public class BatteryStatsImpl extends BatteryStats { public void noteDeviceIdleModeLocked(int mode, String activeReason, int activeUid) { final long elapsedRealtime = mClocks.elapsedRealtime(); final long uptime = mClocks.uptimeMillis(); - boolean nowIdling = mode == DEVICE_IDLE_MODE_FULL; + boolean nowIdling = mode == DEVICE_IDLE_MODE_DEEP; if (mDeviceIdling && !nowIdling && activeReason == null) { // We don't go out of general idling mode until explicitly taken out of // device idle through going active or significant motion. @@ -3492,7 +3492,7 @@ public class BatteryStatsImpl extends BatteryStats { mLongestLightIdleTime = lastDuration; } mDeviceIdleModeLightTimer.stopRunningLocked(elapsedRealtime); - } else if (mDeviceIdleMode == DEVICE_IDLE_MODE_FULL) { + } else if (mDeviceIdleMode == DEVICE_IDLE_MODE_DEEP) { if (lastDuration > mLongestFullIdleTime) { mLongestFullIdleTime = lastDuration; } @@ -3500,7 +3500,7 @@ public class BatteryStatsImpl extends BatteryStats { } if (mode == DEVICE_IDLE_MODE_LIGHT) { mDeviceIdleModeLightTimer.startRunningLocked(elapsedRealtime); - } else if (mode == DEVICE_IDLE_MODE_FULL) { + } else if (mode == DEVICE_IDLE_MODE_DEEP) { mDeviceIdleModeFullTimer.startRunningLocked(elapsedRealtime); } mDeviceIdleMode = mode; @@ -4452,7 +4452,7 @@ public class BatteryStatsImpl extends BatteryStats { switch (mode) { case DEVICE_IDLE_MODE_LIGHT: return mDeviceIdleModeLightTimer.getTotalTimeLocked(elapsedRealtimeUs, which); - case DEVICE_IDLE_MODE_FULL: + case DEVICE_IDLE_MODE_DEEP: return mDeviceIdleModeFullTimer.getTotalTimeLocked(elapsedRealtimeUs, which); } return 0; @@ -4462,7 +4462,7 @@ public class BatteryStatsImpl extends BatteryStats { switch (mode) { case DEVICE_IDLE_MODE_LIGHT: return mDeviceIdleModeLightTimer.getCountLocked(which); - case DEVICE_IDLE_MODE_FULL: + case DEVICE_IDLE_MODE_DEEP: return mDeviceIdleModeFullTimer.getCountLocked(which); } return 0; @@ -4472,7 +4472,7 @@ public class BatteryStatsImpl extends BatteryStats { switch (mode) { case DEVICE_IDLE_MODE_LIGHT: return mLongestLightIdleTime; - case DEVICE_IDLE_MODE_FULL: + case DEVICE_IDLE_MODE_DEEP: return mLongestFullIdleTime; } return 0; @@ -4482,7 +4482,7 @@ public class BatteryStatsImpl extends BatteryStats { switch (mode) { case DEVICE_IDLE_MODE_LIGHT: return mDeviceLightIdlingTimer.getTotalTimeLocked(elapsedRealtimeUs, which); - case DEVICE_IDLE_MODE_FULL: + case DEVICE_IDLE_MODE_DEEP: return mDeviceIdlingTimer.getTotalTimeLocked(elapsedRealtimeUs, which); } return 0; @@ -4492,7 +4492,7 @@ public class BatteryStatsImpl extends BatteryStats { switch (mode) { case DEVICE_IDLE_MODE_LIGHT: return mDeviceLightIdlingTimer.getCountLocked(which); - case DEVICE_IDLE_MODE_FULL: + case DEVICE_IDLE_MODE_DEEP: return mDeviceIdlingTimer.getCountLocked(which); } return 0; diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java index c5a210c6802d..7da247a45341 100644 --- a/services/core/java/com/android/server/AlarmManagerService.java +++ b/services/core/java/com/android/server/AlarmManagerService.java @@ -2297,7 +2297,7 @@ class AlarmManagerService extends SystemService { if (operation != null) { sb.append(operation.getTargetPackage()); } else { - sb.append(listener.asBinder().toString()); + sb.append(packageName); } sb.append('}'); return sb.toString(); diff --git a/services/core/java/com/android/server/DeviceIdleController.java b/services/core/java/com/android/server/DeviceIdleController.java index 7bf4b56c03d1..c8763b135f62 100644 --- a/services/core/java/com/android/server/DeviceIdleController.java +++ b/services/core/java/com/android/server/DeviceIdleController.java @@ -19,7 +19,6 @@ package com.android.server; import android.Manifest; import android.app.ActivityManagerNative; import android.app.AlarmManager; -import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.Context; @@ -111,12 +110,6 @@ public class DeviceIdleController extends SystemService private static final int EVENT_BUFFER_SIZE = 40; - private static final String ACTION_STEP_IDLE_STATE = - "com.android.server.device_idle.STEP_IDLE_STATE"; - - private static final String ACTION_STEP_LIGHT_IDLE_STATE = - "com.android.server.device_idle.STEP_LIGHT_IDLE_STATE"; - private AlarmManager mAlarmManager; private IBatteryStats mBatteryStats; private PowerManagerInternal mLocalPowerManager; @@ -127,8 +120,6 @@ public class DeviceIdleController extends SystemService private Sensor mMotionSensor; private LocationManager mLocationManager; private LocationRequest mLocationRequest; - private PendingIntent mAlarmIntent; - private PendingIntent mLightAlarmIntent; private Intent mIdleIntent; private Intent mLightIdleIntent; private Display mCurDisplay; @@ -329,14 +320,36 @@ public class DeviceIdleController extends SystemService removePowerSaveWhitelistAppInternal(ssp); } } - } else if (ACTION_STEP_LIGHT_IDLE_STATE.equals(intent.getAction())) { - synchronized (DeviceIdleController.this) { - stepLightIdleStateLocked("s:alarm"); - } - } else if (ACTION_STEP_IDLE_STATE.equals(intent.getAction())) { - synchronized (DeviceIdleController.this) { - stepIdleStateLocked("s:alarm"); - } + } + } + }; + + private final AlarmManager.OnAlarmListener mLightAlarmListener + = new AlarmManager.OnAlarmListener() { + @Override + public void onAlarm() { + synchronized (DeviceIdleController.this) { + stepLightIdleStateLocked("s:alarm"); + } + } + }; + + private final AlarmManager.OnAlarmListener mDeepAlarmListener + = new AlarmManager.OnAlarmListener() { + @Override + public void onAlarm() { + synchronized (DeviceIdleController.this) { + stepIdleStateLocked("s:alarm"); + } + } + }; + + private final AlarmManager.OnAlarmListener mMaintenanceMinCheckListener + = new AlarmManager.OnAlarmListener() { + @Override + public void onAlarm() { + synchronized (DeviceIdleController.this) { + exitMaintenanceEarlyIfNeededLocked(); } } }; @@ -470,6 +483,8 @@ public class DeviceIdleController extends SystemService = "light_idle_maintenance_min_budget"; private static final String KEY_LIGHT_IDLE_MAINTENANCE_MAX_BUDGET = "light_idle_maintenance_max_budget"; + private static final String KEY_MIN_LIGHT_MAINTENANCE_TIME = "min_light_maintenance_time"; + private static final String KEY_MIN_DEEP_MAINTENANCE_TIME = "min_deep_maintenance_time"; private static final String KEY_INACTIVE_TIMEOUT = "inactive_to"; private static final String KEY_SENSING_TIMEOUT = "sensing_to"; private static final String KEY_LOCATING_TIMEOUT = "locating_to"; @@ -519,6 +534,28 @@ public class DeviceIdleController extends SystemService public long LIGHT_IDLE_MAINTENANCE_MAX_BUDGET; /** + * This is the minimum amount of time that we will stay in maintenance mode after + * a light doze. We have this minimum to allow various things to respond to switching + * in to maintenance mode and scheduling their work -- otherwise we may + * see there is nothing to do (no jobs or downloads pending) and go out of maintenance + * mode immediately. + * @see Settings.Global#DEVICE_IDLE_CONSTANTS + * @see #KEY_MIN_LIGHT_MAINTENANCE_TIME + */ + public long MIN_LIGHT_MAINTENANCE_TIME; + + /** + * This is the minimum amount of time that we will stay in maintenance mode after + * a full doze. We have this minimum to allow various things to respond to switching + * in to maintenance mode and scheduling their work -- otherwise we may + * see there is nothing to do (no jobs or downloads pending) and go out of maintenance + * mode immediately. + * @see Settings.Global#DEVICE_IDLE_CONSTANTS + * @see #KEY_MIN_DEEP_MAINTENANCE_TIME + */ + public long MIN_DEEP_MAINTENANCE_TIME; + + /** * This is the time, after becoming inactive, at which we start looking at the * motion sensor to determine if the device is being left alone. We don't do this * immediately after going inactive just because we don't want to be continually running @@ -682,6 +719,12 @@ public class DeviceIdleController extends SystemService LIGHT_IDLE_MAINTENANCE_MAX_BUDGET = mParser.getLong( KEY_LIGHT_IDLE_MAINTENANCE_MAX_BUDGET, !COMPRESS_TIME ? 5 * 60 * 1000L : 30 * 1000L); + MIN_LIGHT_MAINTENANCE_TIME = mParser.getLong( + KEY_MIN_LIGHT_MAINTENANCE_TIME, + !COMPRESS_TIME ? 5 * 1000L : 1 * 1000L); + MIN_DEEP_MAINTENANCE_TIME = mParser.getLong( + KEY_MIN_DEEP_MAINTENANCE_TIME, + !COMPRESS_TIME ? 30 * 1000L : 5 * 1000L); INACTIVE_TIMEOUT = mParser.getLong(KEY_INACTIVE_TIMEOUT, !COMPRESS_TIME ? 30 * 60 * 1000L : 3 * 60 * 1000L); SENSING_TIMEOUT = mParser.getLong(KEY_SENSING_TIMEOUT, @@ -731,6 +774,14 @@ public class DeviceIdleController extends SystemService TimeUtils.formatDuration(LIGHT_IDLE_MAINTENANCE_MAX_BUDGET, pw); pw.println(); + pw.print(" "); pw.print(KEY_MIN_LIGHT_MAINTENANCE_TIME); pw.print("="); + TimeUtils.formatDuration(MIN_LIGHT_MAINTENANCE_TIME, pw); + pw.println(); + + pw.print(" "); pw.print(KEY_MIN_DEEP_MAINTENANCE_TIME); pw.print("="); + TimeUtils.formatDuration(MIN_DEEP_MAINTENANCE_TIME, pw); + pw.println(); + pw.print(" "); pw.print(KEY_INACTIVE_TIMEOUT); pw.print("="); TimeUtils.formatDuration(INACTIVE_TIMEOUT, pw); pw.println(); @@ -860,7 +911,7 @@ public class DeviceIdleController extends SystemService try { mNetworkPolicyManager.setDeviceIdleMode(true); mBatteryStats.noteDeviceIdleMode(msg.what == MSG_REPORT_IDLE_ON - ? BatteryStats.DEVICE_IDLE_MODE_FULL + ? BatteryStats.DEVICE_IDLE_MODE_DEEP : BatteryStats.DEVICE_IDLE_MODE_LIGHT, null, Process.myUid()); } catch (RemoteException e) { } @@ -1220,16 +1271,6 @@ public class DeviceIdleController extends SystemService (PowerManager) getContext().getSystemService(Context.POWER_SERVICE), mHandler, mSensorManager, this, angleThreshold); - Intent intent = new Intent(ACTION_STEP_IDLE_STATE) - .setPackage("android") - .setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); - mAlarmIntent = PendingIntent.getBroadcast(getContext(), 0, intent, 0); - - Intent intentLight = new Intent(ACTION_STEP_LIGHT_IDLE_STATE) - .setPackage("android") - .setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); - mLightAlarmIntent = PendingIntent.getBroadcast(getContext(), 0, intentLight, 0); - mIdleIntent = new Intent(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED); mIdleIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND); @@ -1239,8 +1280,6 @@ public class DeviceIdleController extends SystemService IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_BATTERY_CHANGED); - filter.addAction(ACTION_STEP_IDLE_STATE); - filter.addAction(ACTION_STEP_LIGHT_IDLE_STATE); getContext().registerReceiver(mReceiver, filter); filter = new IntentFilter(); filter.addAction(Intent.ACTION_PACKAGE_REMOVED); @@ -1582,6 +1621,7 @@ public class DeviceIdleController extends SystemService mInactiveTimeout = mConstants.INACTIVE_TIMEOUT; mCurIdleBudget = 0; mMaintenanceStartTime = 0; + mAlarmManager.cancel(mMaintenanceMinCheckListener); resetIdleManagementLocked(); resetLightIdleManagementLocked(); addEvent(EVENT_NORMAL); @@ -1664,6 +1704,7 @@ public class DeviceIdleController extends SystemService EventLogTags.writeDeviceIdleLight(mLightState, reason); addEvent(EVENT_LIGHT_IDLE); mHandler.sendEmptyMessage(MSG_REPORT_IDLE_ON_LIGHT); + mAlarmManager.cancel(mMaintenanceMinCheckListener); break; case LIGHT_STATE_IDLE: // We have been idling long enough, now it is time to do some work. @@ -1674,7 +1715,6 @@ public class DeviceIdleController extends SystemService } else if (mCurIdleBudget > mConstants.LIGHT_IDLE_MAINTENANCE_MAX_BUDGET) { mCurIdleBudget = mConstants.LIGHT_IDLE_MAINTENANCE_MAX_BUDGET; } - mMaintenanceStartTime = SystemClock.elapsedRealtime(); scheduleLightAlarmLocked(mCurIdleBudget); if (DEBUG) Slog.d(TAG, "Moved from LIGHT_STATE_IDLE to LIGHT_STATE_IDLE_MAINTENANCE."); @@ -1682,6 +1722,9 @@ public class DeviceIdleController extends SystemService EventLogTags.writeDeviceIdleLight(mLightState, reason); addEvent(EVENT_LIGHT_MAINTENANCE); mHandler.sendEmptyMessage(MSG_REPORT_IDLE_OFF); + mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME, + mMaintenanceStartTime + mConstants.MIN_LIGHT_MAINTENANCE_TIME, + "DeviceIdleController.maint-check", mMaintenanceMinCheckListener, mHandler); break; } } @@ -1773,6 +1816,7 @@ public class DeviceIdleController extends SystemService EventLogTags.writeDeviceIdle(mState, reason); addEvent(EVENT_DEEP_IDLE); mHandler.sendEmptyMessage(MSG_REPORT_IDLE_ON); + mAlarmManager.cancel(mMaintenanceMinCheckListener); break; case STATE_IDLE: // We have been idling long enough, now it is time to do some work. @@ -1780,12 +1824,16 @@ public class DeviceIdleController extends SystemService scheduleAlarmLocked(mNextIdlePendingDelay, false); if (DEBUG) Slog.d(TAG, "Moved from STATE_IDLE to STATE_IDLE_MAINTENANCE. " + "Next alarm in " + mNextIdlePendingDelay + " ms."); + mMaintenanceStartTime = SystemClock.elapsedRealtime(); mNextIdlePendingDelay = Math.min(mConstants.MAX_IDLE_PENDING_TIMEOUT, (long)(mNextIdlePendingDelay * mConstants.IDLE_PENDING_FACTOR)); mState = STATE_IDLE_MAINTENANCE; EventLogTags.writeDeviceIdle(mState, reason); addEvent(EVENT_DEEP_MAINTENANCE); mHandler.sendEmptyMessage(MSG_REPORT_IDLE_OFF); + mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME, + mMaintenanceStartTime + mConstants.MIN_DEEP_MAINTENANCE_TIME, + "DeviceIdleController.maint-check", mMaintenanceMinCheckListener, mHandler); break; } } @@ -1886,10 +1934,23 @@ public class DeviceIdleController extends SystemService if (mState == STATE_IDLE_MAINTENANCE || mLightState == LIGHT_STATE_IDLE_MAINTENANCE) { if (mActiveIdleOpCount <= 0 && mDownloadServiceActive == null && !mSyncActive && !mJobsActive && !mAlarmsActive) { + final long now = SystemClock.elapsedRealtime(); + if (DEBUG) { + StringBuilder sb = new StringBuilder(); + sb.append("Exit: start="); + TimeUtils.formatDuration(mMaintenanceStartTime, sb); + sb.append(" now="); + TimeUtils.formatDuration(now, sb); + Slog.d(TAG, sb.toString()); + } if (mState == STATE_IDLE_MAINTENANCE) { - stepIdleStateLocked("s:early"); + if (now >= (mMaintenanceStartTime + mConstants.MIN_DEEP_MAINTENANCE_TIME)) { + stepIdleStateLocked("s:early"); + } } else { - stepLightIdleStateLocked("s:early"); + if (now >= (mMaintenanceStartTime + mConstants.MIN_LIGHT_MAINTENANCE_TIME)) { + stepLightIdleStateLocked("s:early"); + } } } } @@ -1977,14 +2038,14 @@ public class DeviceIdleController extends SystemService void cancelAlarmLocked() { if (mNextAlarmTime != 0) { mNextAlarmTime = 0; - mAlarmManager.cancel(mAlarmIntent); + mAlarmManager.cancel(mDeepAlarmListener); } } void cancelLightAlarmLocked() { if (mNextLightAlarmTime != 0) { mNextLightAlarmTime = 0; - mAlarmManager.cancel(mLightAlarmIntent); + mAlarmManager.cancel(mLightAlarmListener); } } @@ -2008,10 +2069,10 @@ public class DeviceIdleController extends SystemService mNextAlarmTime = SystemClock.elapsedRealtime() + delay; if (idleUntil) { mAlarmManager.setIdleUntil(AlarmManager.ELAPSED_REALTIME_WAKEUP, - mNextAlarmTime, mAlarmIntent); + mNextAlarmTime, "DeviceIdleController.deep", mDeepAlarmListener, mHandler); } else { mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, - mNextAlarmTime, mAlarmIntent); + mNextAlarmTime, "DeviceIdleController.deep", mDeepAlarmListener, mHandler); } } @@ -2026,7 +2087,7 @@ public class DeviceIdleController extends SystemService } mNextLightAlarmTime = SystemClock.elapsedRealtime() + delay; mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, - mNextLightAlarmTime, mLightAlarmIntent); + mNextLightAlarmTime, "DeviceIdleController.light", mLightAlarmListener, mHandler); } private static int[] buildAppIdArray(ArrayMap<String, Integer> systemApps, @@ -2229,10 +2290,8 @@ public class DeviceIdleController extends SystemService pw.println("Device idle controller (deviceidle) commands:"); pw.println(" help"); pw.println(" Print this help text."); - pw.println(" step"); + pw.println(" step [light|deep]"); pw.println(" Immediately step to next state, without waiting for alarm."); - pw.println(" light-step"); - pw.println(" Immediately step to next light idle state, without waiting for alarm."); pw.println(" force-idle"); pw.println(" Force directly into idle mode, regardless of other device state."); pw.println(" Use \"step\" to get out."); @@ -2272,24 +2331,20 @@ public class DeviceIdleController extends SystemService null); synchronized (this) { long token = Binder.clearCallingIdentity(); + String arg = shell.getNextArg(); try { - exitForceIdleLocked(); - stepIdleStateLocked("s:shell"); - pw.print("Stepped to: "); - pw.println(stateToString(mState)); - } finally { - Binder.restoreCallingIdentity(token); - } - } - } else if ("light-step".equals(cmd)) { - getContext().enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, - null); - synchronized (this) { - long token = Binder.clearCallingIdentity(); - try { - exitForceIdleLocked(); - stepLightIdleStateLocked("s:shell"); - pw.print("Stepped to: "); pw.println(lightStateToString(mLightState)); + if (arg == null || "deep".equals(arg)) { + exitForceIdleLocked(); + stepIdleStateLocked("s:shell"); + pw.print("Stepped to deep: "); + pw.println(stateToString(mState)); + } else if ("light".equals(arg)) { + exitForceIdleLocked(); + stepLightIdleStateLocked("s:shell"); + pw.print("Stepped to light: "); pw.println(lightStateToString(mLightState)); + } else { + pw.println("Unknown idle mode: " + arg); + } } finally { Binder.restoreCallingIdentity(token); } diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java index 9fd7f90e7e72..e34fb9bef2ba 100644 --- a/services/core/java/com/android/server/job/JobSchedulerService.java +++ b/services/core/java/com/android/server/job/JobSchedulerService.java @@ -209,7 +209,9 @@ public final class JobSchedulerService extends com.android.server.SystemService private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - Slog.d(TAG, "Receieved: " + intent.getAction()); + if (DEBUG) { + Slog.d(TAG, "Receieved: " + intent.getAction()); + } if (Intent.ACTION_PACKAGE_REMOVED.equals(intent.getAction())) { // If this is an outright uninstall rather than the first half of an // app update sequence, cancel the jobs associated with the app. diff --git a/services/core/java/com/android/server/job/controllers/TimeController.java b/services/core/java/com/android/server/job/controllers/TimeController.java index 36fa9ec68050..35432495942d 100644 --- a/services/core/java/com/android/server/job/controllers/TimeController.java +++ b/services/core/java/com/android/server/job/controllers/TimeController.java @@ -39,9 +39,9 @@ public class TimeController extends StateController { private static final String TAG = "JobScheduler.Time"; /** Deadline alarm tag for logging purposes */ - private final String DEADLINE_TAG = "deadline"; + private final String DEADLINE_TAG = "JobScheduler.deadline"; /** Delay alarm tag for logging purposes */ - private final String DELAY_TAG = "delay"; + private final String DELAY_TAG = "JobScheduler.delay"; private long mNextJobExpiredElapsedMillis; private long mNextDelayExpiredElapsedMillis; |