More work on issue #26390151: Add new JobScheduler API...
...for monitoring content providers
- Improve media provider change reporting so that observers can
avoid spurious reports of the top-level content directory changing.
- Fix a bug where collected content changes while a job was running
were not being properly propagated to the next job.
Change-Id: I29e3c2960e6fec75b16ee3ee6588d47342bf8c75
diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java
index fa8620f..b235002 100644
--- a/services/core/java/com/android/server/job/JobSchedulerService.java
+++ b/services/core/java/com/android/server/job/JobSchedulerService.java
@@ -304,7 +304,7 @@
toCancel = mJobs.getJobByUidAndJobId(uId, job.getId());
if (toCancel != null) {
- cancelJobImpl(toCancel);
+ cancelJobImpl(toCancel, jobStatus);
}
startTrackingJob(jobStatus, toCancel);
}
@@ -331,7 +331,7 @@
}
for (int i=0; i<jobsForUser.size(); i++) {
JobStatus toRemove = jobsForUser.get(i);
- cancelJobImpl(toRemove);
+ cancelJobImpl(toRemove, null);
}
}
@@ -360,7 +360,7 @@
} catch (RemoteException e) {
}
}
- cancelJobImpl(toRemove);
+ cancelJobImpl(toRemove, null);
}
}
@@ -377,13 +377,13 @@
toCancel = mJobs.getJobByUidAndJobId(uid, jobId);
}
if (toCancel != null) {
- cancelJobImpl(toCancel);
+ cancelJobImpl(toCancel, null);
}
}
- private void cancelJobImpl(JobStatus cancelled) {
+ private void cancelJobImpl(JobStatus cancelled, JobStatus incomingJob) {
if (DEBUG) Slog.d(TAG, "CANCEL: " + cancelled.toShortString());
- stopTrackingJob(cancelled, true /* writeBack */);
+ stopTrackingJob(cancelled, incomingJob, true /* writeBack */);
synchronized (mLock) {
// Remove from pending queue.
mPendingJobs.remove(cancelled);
@@ -549,7 +549,7 @@
for (int i = 0; i < mControllers.size(); i++) {
StateController controller = mControllers.get(i);
if (update) {
- controller.maybeStopTrackingJobLocked(jobStatus, true);
+ controller.maybeStopTrackingJobLocked(jobStatus, null, true);
}
controller.maybeStartTrackingJobLocked(jobStatus, lastJob);
}
@@ -561,14 +561,15 @@
* Called when we want to remove a JobStatus object that we've finished executing. Returns the
* object removed.
*/
- private boolean stopTrackingJob(JobStatus jobStatus, boolean writeBack) {
+ private boolean stopTrackingJob(JobStatus jobStatus, JobStatus incomingJob,
+ boolean writeBack) {
synchronized (mLock) {
// Remove from store as well as controllers.
final boolean removed = mJobs.remove(jobStatus, writeBack);
if (removed && mReadyToRock) {
for (int i=0; i<mControllers.size(); i++) {
StateController controller = mControllers.get(i);
- controller.maybeStopTrackingJobLocked(jobStatus, false);
+ controller.maybeStopTrackingJobLocked(jobStatus, incomingJob, false);
}
}
return removed;
@@ -696,7 +697,7 @@
}
// Do not write back immediately if this is a periodic job. The job may get lost if system
// shuts down before it is added back.
- if (!stopTrackingJob(jobStatus, !jobStatus.getJob().isPeriodic())) {
+ if (!stopTrackingJob(jobStatus, null, !jobStatus.getJob().isPeriodic())) {
if (DEBUG) {
Slog.d(TAG, "Could not find job to remove. Was job removed while executing?");
}
@@ -780,7 +781,7 @@
}
break;
case MSG_STOP_JOB:
- cancelJobImpl((JobStatus)message.obj);
+ cancelJobImpl((JobStatus)message.obj, null);
break;
}
maybeRunPendingJobsH();