Stop overrunning jobs when doze and battery saver turn on.

If we let a job run longer than its minimum runtime guarantee, make sure
we stop it as soon as battery saver or doze turns on.

Bug: 171305774
Test: atest CtsJobSchedulerTestCases
Change-Id: Ibe378da7393740dfa3712394dd8bca8c23315027
This commit is contained in:
Kweku Adams
2021-03-04 10:01:42 -08:00
parent 156864ee64
commit a84568723f

View File

@@ -317,6 +317,8 @@ class JobConcurrencyManager {
final IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); final IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF); filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED);
filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
mContext.registerReceiver(mReceiver, filter); mContext.registerReceiver(mReceiver, filter);
try { try {
ActivityManager.getService().registerUserSwitchObserver(mGracePeriodObserver, TAG); ActivityManager.getService().registerUserSwitchObserver(mGracePeriodObserver, TAG);
@@ -340,6 +342,20 @@ class JobConcurrencyManager {
case Intent.ACTION_SCREEN_OFF: case Intent.ACTION_SCREEN_OFF:
onInteractiveStateChanged(false); onInteractiveStateChanged(false);
break; break;
case PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED:
if (mPowerManager != null && mPowerManager.isDeviceIdleMode()) {
synchronized (mLock) {
stopLongRunningJobsLocked("deep doze");
}
}
break;
case PowerManager.ACTION_POWER_SAVE_MODE_CHANGED:
if (mPowerManager != null && mPowerManager.isPowerSaveMode()) {
synchronized (mLock) {
stopLongRunningJobsLocked("battery saver");
}
}
break;
} }
} }
}; };
@@ -634,6 +650,18 @@ class JobConcurrencyManager {
noteConcurrency(); noteConcurrency();
} }
@GuardedBy("mLock")
private void stopLongRunningJobsLocked(@NonNull String debugReason) {
for (int i = 0; i < MAX_JOB_CONTEXTS_COUNT; ++i) {
final JobServiceContext jsc = mService.mActiveServices.get(i);
final JobStatus jobStatus = jsc.getRunningJobLocked();
if (jobStatus != null && !jsc.isWithinExecutionGuaranteeTime()) {
jsc.cancelExecutingJobLocked(JobParameters.REASON_TIMEOUT, debugReason);
}
}
}
private void noteConcurrency() { private void noteConcurrency() {
mService.mJobPackageTracker.noteConcurrency(mRunningJobs.size(), mService.mJobPackageTracker.noteConcurrency(mRunningJobs.size(),
// TODO: log per type instead of only TOP // TODO: log per type instead of only TOP