diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java index abc5347d17020..f0e263c70b6cd 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java +++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java @@ -1712,6 +1712,12 @@ public class JobSchedulerService extends com.android.server.SystemService return false; } + /** Return {@code true} if the specified job is currently executing. */ + @GuardedBy("mLock") + public boolean isCurrentlyRunningLocked(JobStatus job) { + return mConcurrencyManager.isJobRunningLocked(job); + } + void noteJobsPending(List jobs) { for (int i = jobs.size() - 1; i >= 0; i--) { JobStatus job = jobs.get(i); @@ -1719,10 +1725,13 @@ public class JobSchedulerService extends com.android.server.SystemService } } + private void noteJobNonPending(JobStatus job) { + mJobPackageTracker.noteNonpending(job); + } + void noteJobsNonpending(List jobs) { for (int i = jobs.size() - 1; i >= 0; i--) { - JobStatus job = jobs.get(i); - mJobPackageTracker.noteNonpending(job); + noteJobNonPending(jobs.get(i)); } } @@ -2214,14 +2223,19 @@ public class JobSchedulerService extends com.android.server.SystemService // Functor method invoked for each job via JobStore.forEachJob() @Override public void accept(JobStatus job) { - if (isReadyToBeExecutedLocked(job)) { + final boolean isRunning = isCurrentlyRunningLocked(job); + if (isReadyToBeExecutedLocked(job, false)) { if (mActivityManagerInternal.isAppStartModeDisabled(job.getUid(), job.getJob().getService().getPackageName())) { Slog.w(TAG, "Aborting job " + job.getUid() + ":" + job.getJob().toString() + " -- package not allowed to start"); - mHandler.obtainMessage(MSG_STOP_JOB, - JobParameters.STOP_REASON_BACKGROUND_RESTRICTION, 0, job) - .sendToTarget(); + if (isRunning) { + mHandler.obtainMessage(MSG_STOP_JOB, + JobParameters.STOP_REASON_BACKGROUND_RESTRICTION, 0, job) + .sendToTarget(); + } else if (mPendingJobs.remove(job)) { + noteJobNonPending(job); + } return; } @@ -2254,7 +2268,9 @@ public class JobSchedulerService extends com.android.server.SystemService } else { unbatchedCount++; } - runnableJobs.add(job); + if (!isRunning) { + runnableJobs.add(job); + } } else { evaluateControllerStatesLocked(job); } diff --git a/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java index e0cee4b4bf42b..697451ea749d9 100644 --- a/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/job/JobSchedulerServiceTest.java @@ -33,6 +33,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.when; @@ -705,7 +706,7 @@ public class JobSchedulerServiceTest { spyOn(mService); doNothing().when(mService).evaluateControllerStatesLocked(any()); doNothing().when(mService).noteJobsPending(any()); - doReturn(true).when(mService).isReadyToBeExecutedLocked(any()); + doReturn(true).when(mService).isReadyToBeExecutedLocked(any(), anyBoolean()); advanceElapsedClock(24 * HOUR_IN_MILLIS); JobSchedulerService.MaybeReadyJobQueueFunctor maybeQueueFunctor =