Loading core/java/android/app/AlarmManager.java +4 −3 Original line number Diff line number Diff line Loading @@ -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); } /** Loading core/java/android/os/BatteryStats.java +11 −11 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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); Loading Loading @@ -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]; Loading Loading @@ -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); Loading Loading @@ -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()); } Loading @@ -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) { Loading core/java/com/android/internal/os/BatteryStatsImpl.java +8 −8 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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; } Loading @@ -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; Loading Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading services/core/java/com/android/server/AlarmManagerService.java +1 −1 Original line number Diff line number Diff line Loading @@ -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(); Loading services/core/java/com/android/server/DeviceIdleController.java +113 −58 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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; Loading Loading @@ -329,15 +320,37 @@ public class DeviceIdleController extends SystemService removePowerSaveWhitelistAppInternal(ssp); } } } else if (ACTION_STEP_LIGHT_IDLE_STATE.equals(intent.getAction())) { } } }; private final AlarmManager.OnAlarmListener mLightAlarmListener = new AlarmManager.OnAlarmListener() { @Override public void onAlarm() { synchronized (DeviceIdleController.this) { stepLightIdleStateLocked("s:alarm"); } } else if (ACTION_STEP_IDLE_STATE.equals(intent.getAction())) { } }; 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(); } } }; Loading Loading @@ -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"; Loading Loading @@ -518,6 +533,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 Loading Loading @@ -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, Loading Loading @@ -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(); Loading Loading @@ -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) { } Loading Loading @@ -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); Loading @@ -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); Loading Loading @@ -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); Loading Loading @@ -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. Loading @@ -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."); Loading @@ -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; } } Loading Loading @@ -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. Loading @@ -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; } } Loading Loading @@ -1886,14 +1934,27 @@ 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) { if (now >= (mMaintenanceStartTime + mConstants.MIN_DEEP_MAINTENANCE_TIME)) { stepIdleStateLocked("s:early"); } } else { if (now >= (mMaintenanceStartTime + mConstants.MIN_LIGHT_MAINTENANCE_TIME)) { stepLightIdleStateLocked("s:early"); } } } } } void motionLocked() { if (DEBUG) Slog.d(TAG, "motionLocked()"); Loading Loading @@ -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); } } Loading @@ -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); } } Loading @@ -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, Loading Loading @@ -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."); Loading Loading @@ -2272,24 +2331,20 @@ public class DeviceIdleController extends SystemService null); synchronized (this) { long token = Binder.clearCallingIdentity(); String arg = shell.getNextArg(); try { if (arg == null || "deep".equals(arg)) { exitForceIdleLocked(); stepIdleStateLocked("s:shell"); pw.print("Stepped to: "); pw.print("Stepped to deep: "); 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 { } else if ("light".equals(arg)) { exitForceIdleLocked(); stepLightIdleStateLocked("s:shell"); pw.print("Stepped to: "); pw.println(lightStateToString(mLightState)); pw.print("Stepped to light: "); pw.println(lightStateToString(mLightState)); } else { pw.println("Unknown idle mode: " + arg); } } finally { Binder.restoreCallingIdentity(token); } Loading Loading
core/java/android/app/AlarmManager.java +4 −3 Original line number Diff line number Diff line Loading @@ -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); } /** Loading
core/java/android/os/BatteryStats.java +11 −11 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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); Loading Loading @@ -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]; Loading Loading @@ -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); Loading Loading @@ -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()); } Loading @@ -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) { Loading
core/java/com/android/internal/os/BatteryStatsImpl.java +8 −8 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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; } Loading @@ -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; Loading Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading
services/core/java/com/android/server/AlarmManagerService.java +1 −1 Original line number Diff line number Diff line Loading @@ -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(); Loading
services/core/java/com/android/server/DeviceIdleController.java +113 −58 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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; Loading Loading @@ -329,15 +320,37 @@ public class DeviceIdleController extends SystemService removePowerSaveWhitelistAppInternal(ssp); } } } else if (ACTION_STEP_LIGHT_IDLE_STATE.equals(intent.getAction())) { } } }; private final AlarmManager.OnAlarmListener mLightAlarmListener = new AlarmManager.OnAlarmListener() { @Override public void onAlarm() { synchronized (DeviceIdleController.this) { stepLightIdleStateLocked("s:alarm"); } } else if (ACTION_STEP_IDLE_STATE.equals(intent.getAction())) { } }; 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(); } } }; Loading Loading @@ -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"; Loading Loading @@ -518,6 +533,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 Loading Loading @@ -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, Loading Loading @@ -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(); Loading Loading @@ -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) { } Loading Loading @@ -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); Loading @@ -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); Loading Loading @@ -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); Loading Loading @@ -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. Loading @@ -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."); Loading @@ -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; } } Loading Loading @@ -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. Loading @@ -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; } } Loading Loading @@ -1886,14 +1934,27 @@ 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) { if (now >= (mMaintenanceStartTime + mConstants.MIN_DEEP_MAINTENANCE_TIME)) { stepIdleStateLocked("s:early"); } } else { if (now >= (mMaintenanceStartTime + mConstants.MIN_LIGHT_MAINTENANCE_TIME)) { stepLightIdleStateLocked("s:early"); } } } } } void motionLocked() { if (DEBUG) Slog.d(TAG, "motionLocked()"); Loading Loading @@ -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); } } Loading @@ -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); } } Loading @@ -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, Loading Loading @@ -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."); Loading Loading @@ -2272,24 +2331,20 @@ public class DeviceIdleController extends SystemService null); synchronized (this) { long token = Binder.clearCallingIdentity(); String arg = shell.getNextArg(); try { if (arg == null || "deep".equals(arg)) { exitForceIdleLocked(); stepIdleStateLocked("s:shell"); pw.print("Stepped to: "); pw.print("Stepped to deep: "); 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 { } else if ("light".equals(arg)) { exitForceIdleLocked(); stepLightIdleStateLocked("s:shell"); pw.print("Stepped to: "); pw.println(lightStateToString(mLightState)); pw.print("Stepped to light: "); pw.println(lightStateToString(mLightState)); } else { pw.println("Unknown idle mode: " + arg); } } finally { Binder.restoreCallingIdentity(token); } Loading