diff options
| -rw-r--r-- | apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java | 17 | ||||
| -rw-r--r-- | services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java | 82 |
2 files changed, 98 insertions, 1 deletions
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java index 26d6ba254f8a..7cc2f28a5664 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java +++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java @@ -1131,10 +1131,25 @@ public final class JobStatus { */ @JobInfo.Priority public int getEffectivePriority() { - final int rawPriority = job.getPriority(); + final boolean isDemoted = + (getInternalFlags() & INTERNAL_FLAG_DEMOTED_BY_USER) != 0 + || (job.isUserInitiated() + && (getInternalFlags() & INTERNAL_FLAG_DEMOTED_BY_SYSTEM_UIJ) != 0); + final int maxPriority; + if (isDemoted) { + // If the job was demoted for some reason, limit its priority to HIGH. + maxPriority = JobInfo.PRIORITY_HIGH; + } else { + maxPriority = JobInfo.PRIORITY_MAX; + } + final int rawPriority = Math.min(maxPriority, job.getPriority()); if (numFailures < 2) { return rawPriority; } + if (shouldTreatAsUserInitiatedJob()) { + // Don't drop priority of UI jobs. + return rawPriority; + } // Slowly decay priority of jobs to prevent starvation of other jobs. if (isRequestedExpeditedJob()) { // EJs can't fall below HIGH priority. diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java index df6f9998c326..c040b1928ce4 100644 --- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/JobStatusTest.java @@ -397,6 +397,14 @@ public class JobStatusTest { job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, numSystemStops, 0, 0, 0); assertEquals(JobInfo.PRIORITY_MAX, job.getEffectivePriority()); + + // Less than 2 failures, but job is downgraded. + numFailures = 1; + numSystemStops = 0; + job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, + numSystemStops, 0, 0, 0); + job.addInternalFlags(JobStatus.INTERNAL_FLAG_DEMOTED_BY_USER); + assertEquals(JobInfo.PRIORITY_HIGH, job.getEffectivePriority()); } @Test @@ -500,6 +508,80 @@ public class JobStatusTest { } @Test + public void testGetEffectivePriority_UserInitiated() { + final JobInfo jobInfo = + new JobInfo.Builder(101, new ComponentName("foo", "bar")) + .setUserInitiated(true) + .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY) + .build(); + JobStatus job = createJobStatus(jobInfo); + + // Less than 2 failures, priority shouldn't be affected. + assertEquals(JobInfo.PRIORITY_MAX, job.getEffectivePriority()); + int numFailures = 1; + int numSystemStops = 0; + job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, + numSystemStops, 0, 0, 0); + assertEquals(JobInfo.PRIORITY_MAX, job.getEffectivePriority()); + + // 2+ failures, priority shouldn't be affected while job is still a UI job + numFailures = 2; + job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, + numSystemStops, 0, 0, 0); + assertEquals(JobInfo.PRIORITY_MAX, job.getEffectivePriority()); + numFailures = 5; + job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, + numSystemStops, 0, 0, 0); + assertEquals(JobInfo.PRIORITY_MAX, job.getEffectivePriority()); + numFailures = 8; + job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, + numSystemStops, 0, 0, 0); + assertEquals(JobInfo.PRIORITY_MAX, job.getEffectivePriority()); + + // System stops shouldn't factor in the downgrade. + numSystemStops = 10; + numFailures = 0; + job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, + numSystemStops, 0, 0, 0); + assertEquals(JobInfo.PRIORITY_MAX, job.getEffectivePriority()); + + // Job can no long run as user-initiated. Downgrades should be effective. + // Priority can't be max. + job = createJobStatus(jobInfo); + job.addInternalFlags(JobStatus.INTERNAL_FLAG_DEMOTED_BY_USER); + assertFalse(job.shouldTreatAsUserInitiatedJob()); + + // Less than 2 failures. + assertEquals(JobInfo.PRIORITY_HIGH, job.getEffectivePriority()); + numFailures = 1; + numSystemStops = 0; + job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, + numSystemStops, 0, 0, 0); + assertEquals(JobInfo.PRIORITY_HIGH, job.getEffectivePriority()); + + // 2+ failures, priority should start getting lower + numFailures = 2; + job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, + numSystemStops, 0, 0, 0); + assertEquals(JobInfo.PRIORITY_DEFAULT, job.getEffectivePriority()); + numFailures = 5; + job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, + numSystemStops, 0, 0, 0); + assertEquals(JobInfo.PRIORITY_LOW, job.getEffectivePriority()); + numFailures = 8; + job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, + numSystemStops, 0, 0, 0); + assertEquals(JobInfo.PRIORITY_MIN, job.getEffectivePriority()); + + // System stops shouldn't factor in the downgrade. + numSystemStops = 10; + numFailures = 0; + job = new JobStatus(job, NO_EARLIEST_RUNTIME, NO_LATEST_RUNTIME, numFailures, + numSystemStops, 0, 0, 0); + assertEquals(JobInfo.PRIORITY_HIGH, job.getEffectivePriority()); + } + + @Test public void testShouldTreatAsUserInitiated() { JobInfo jobInfo = new JobInfo.Builder(101, new ComponentName("foo", "bar")) .setUserInitiated(false) |