summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Dianne Hackborn <hackbod@google.com> 2016-03-18 15:34:54 -0700
committer Dianne Hackborn <hackbod@google.com> 2016-03-18 16:52:30 -0700
commit2fefbcf0d1b91f37684387971721c90112a9ac89 (patch)
tree4f1599f3199415432f382758f9fd95c79473e863
parent0cc531ae31e1bb13ecca2cdcd8ddb296542362e0 (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
-rw-r--r--core/java/android/app/AlarmManager.java7
-rw-r--r--core/java/android/os/BatteryStats.java22
-rw-r--r--core/java/com/android/internal/os/BatteryStatsImpl.java16
-rw-r--r--services/core/java/com/android/server/AlarmManagerService.java2
-rw-r--r--services/core/java/com/android/server/DeviceIdleController.java171
-rw-r--r--services/core/java/com/android/server/job/JobSchedulerService.java4
-rw-r--r--services/core/java/com/android/server/job/controllers/TimeController.java4
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;