diff --git a/apex/jobscheduler/framework/java/android/app/job/JobParameters.java b/apex/jobscheduler/framework/java/android/app/job/JobParameters.java index 40c094696b5ca..48b62a607a5e6 100644 --- a/apex/jobscheduler/framework/java/android/app/job/JobParameters.java +++ b/apex/jobscheduler/framework/java/android/app/job/JobParameters.java @@ -82,6 +82,15 @@ public class JobParameters implements Parcelable { * @hide */ public static final int INTERNAL_STOP_REASON_DATA_CLEARED = 8; + /** + * @hide + */ + public static final int INTERNAL_STOP_REASON_RTC_UPDATED = 9; + /** + * The app called jobFinished() on its own. + * @hide + */ + public static final int INTERNAL_STOP_REASON_SUCCESSFUL_FINISH = 10; /** * All the stop reason codes. This should be regarded as an immutable array at runtime. @@ -116,6 +125,10 @@ public class JobParameters implements Parcelable { case INTERNAL_STOP_REASON_DEVICE_IDLE: return "device_idle"; case INTERNAL_STOP_REASON_DEVICE_THERMAL: return "thermal"; case INTERNAL_STOP_REASON_RESTRICTED_BUCKET: return "restricted_bucket"; + case INTERNAL_STOP_REASON_UNINSTALL: return "uninstall"; + case INTERNAL_STOP_REASON_DATA_CLEARED: return "data_cleared"; + case INTERNAL_STOP_REASON_RTC_UPDATED: return "rtc_updated"; + case INTERNAL_STOP_REASON_SUCCESSFUL_FINISH: return "successful_finish"; default: return "unknown:" + reasonCode; } } 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 3548c2e85bd0a..313cd208f7fba 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java +++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java @@ -1497,7 +1497,7 @@ public class JobSchedulerService extends com.android.server.SystemService Slog.v(TAG, " replacing " + oldJob + " with " + newJob); } cancelJobImplLocked(oldJob, newJob, JobParameters.STOP_REASON_SYSTEM_PROCESSING, - JobParameters.INTERNAL_STOP_REASON_CANCELED, "deferred rtc calculation"); + JobParameters.INTERNAL_STOP_REASON_RTC_UPDATED, "deferred rtc calculation"); } } }; diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java b/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java index ce7480c30f151..6ab2be32f5c34 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java +++ b/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java @@ -409,7 +409,20 @@ public final class JobServiceContext implements ServiceConnection { } void doJobFinished(JobCallback cb, int jobId, boolean reschedule) { - doCallback(cb, reschedule, "app called jobFinished"); + final long ident = Binder.clearCallingIdentity(); + try { + synchronized (mLock) { + if (!verifyCallerLocked(cb)) { + return; + } + mParams.setStopReason(JobParameters.STOP_REASON_UNDEFINED, + JobParameters.INTERNAL_STOP_REASON_SUCCESSFUL_FINISH, + "app called jobFinished"); + doCallbackLocked(reschedule, "app called jobFinished"); + } + } finally { + Binder.restoreCallingIdentity(ident); + } } void doAcknowledgeStopMessage(JobCallback cb, int jobId, boolean reschedule) { @@ -433,6 +446,9 @@ public final class JobServiceContext implements ServiceConnection { } final JobWorkItem work = mRunningJob.dequeueWorkLocked(); if (work == null && !mRunningJob.hasExecutingWorkLocked()) { + mParams.setStopReason(JobParameters.STOP_REASON_UNDEFINED, + JobParameters.INTERNAL_STOP_REASON_SUCCESSFUL_FINISH, + "last work dequeued"); // This will finish the job. doCallbackLocked(false, "last work dequeued"); }