Implement API review feedback for JobScheduler
BUG: 17005336
Took the opportunity to clean up some back-off logic
Change-Id: Ibc8ae34d1d44dd064ba071e4cbad17872f7e38cf
diff --git a/services/backup/java/com/android/server/backup/FullBackupJob.java b/services/backup/java/com/android/server/backup/FullBackupJob.java
index deb2293..601f15e 100644
--- a/services/backup/java/com/android/server/backup/FullBackupJob.java
+++ b/services/backup/java/com/android/server/backup/FullBackupJob.java
@@ -20,10 +20,8 @@
import android.app.job.JobParameters;
import android.app.job.JobScheduler;
import android.app.job.JobService;
-import android.app.job.JobInfo.NetworkType;
import android.content.ComponentName;
import android.content.Context;
-import android.util.Slog;
public class FullBackupJob extends JobService {
private static final String TAG = "FullBackupJob";
@@ -40,7 +38,7 @@
JobScheduler js = (JobScheduler) ctx.getSystemService(Context.JOB_SCHEDULER_SERVICE);
JobInfo.Builder builder = new JobInfo.Builder(JOB_ID, sIdleService)
.setRequiresDeviceIdle(true)
- .setRequiredNetworkCapabilities(NetworkType.UNMETERED)
+ .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.setRequiresCharging(true);
if (minDelay > 0) {
builder.setMinimumLatency(minDelay);
diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java
index 60f880c..379ec94 100644
--- a/services/core/java/com/android/server/job/JobSchedulerService.java
+++ b/services/core/java/com/android/server/job/JobSchedulerService.java
@@ -407,26 +407,26 @@
final JobInfo job = failureToReschedule.getJob();
final long initialBackoffMillis = job.getInitialBackoffMillis();
- final int backoffAttempt = failureToReschedule.getNumFailures() + 1;
- long newEarliestRuntimeElapsed = elapsedNowMillis;
+ final int backoffAttempts = failureToReschedule.getNumFailures() + 1;
+ long delayMillis;
switch (job.getBackoffPolicy()) {
- case JobInfo.BackoffPolicy.LINEAR:
- newEarliestRuntimeElapsed += initialBackoffMillis * backoffAttempt;
+ case JobInfo.BACKOFF_POLICY_LINEAR:
+ delayMillis = initialBackoffMillis * backoffAttempts;
break;
default:
if (DEBUG) {
Slog.v(TAG, "Unrecognised back-off policy, defaulting to exponential.");
}
- case JobInfo.BackoffPolicy.EXPONENTIAL:
- newEarliestRuntimeElapsed +=
- Math.pow(initialBackoffMillis * 0.001, backoffAttempt) * 1000;
+ case JobInfo.BACKOFF_POLICY_EXPONENTIAL:
+ delayMillis =
+ (long) Math.scalb(initialBackoffMillis, backoffAttempts - 1);
break;
}
- newEarliestRuntimeElapsed =
- Math.min(newEarliestRuntimeElapsed, JobInfo.MAX_BACKOFF_DELAY_MILLIS);
- return new JobStatus(failureToReschedule, newEarliestRuntimeElapsed,
- JobStatus.NO_LATEST_RUNTIME, backoffAttempt);
+ delayMillis =
+ Math.min(delayMillis, JobInfo.MAX_BACKOFF_DELAY_MILLIS);
+ return new JobStatus(failureToReschedule, elapsedNowMillis + delayMillis,
+ JobStatus.NO_LATEST_RUNTIME, backoffAttempts);
}
/**
diff --git a/services/core/java/com/android/server/job/JobStore.java b/services/core/java/com/android/server/job/JobStore.java
index 46f557f..df12e1a 100644
--- a/services/core/java/com/android/server/job/JobStore.java
+++ b/services/core/java/com/android/server/job/JobStore.java
@@ -515,7 +515,7 @@
// Read out job identifier attributes.
try {
jobBuilder = buildBuilderFromXml(parser);
- jobBuilder.setIsPersisted(true);
+ jobBuilder.setPersisted(true);
uid = Integer.valueOf(parser.getAttributeValue(null, "uid"));
} catch (NumberFormatException e) {
Slog.e(TAG, "Error parsing job's required fields, skipping");
@@ -622,11 +622,11 @@
private void buildConstraintsFromXml(JobInfo.Builder jobBuilder, XmlPullParser parser) {
String val = parser.getAttributeValue(null, "unmetered");
if (val != null) {
- jobBuilder.setRequiredNetworkCapabilities(JobInfo.NetworkType.UNMETERED);
+ jobBuilder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED);
}
val = parser.getAttributeValue(null, "connectivity");
if (val != null) {
- jobBuilder.setRequiredNetworkCapabilities(JobInfo.NetworkType.ANY);
+ jobBuilder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
}
val = parser.getAttributeValue(null, "idle");
if (val != null) {
diff --git a/services/core/java/com/android/server/job/controllers/JobStatus.java b/services/core/java/com/android/server/job/controllers/JobStatus.java
index a257ea0..6f5d3c2 100644
--- a/services/core/java/com/android/server/job/controllers/JobStatus.java
+++ b/services/core/java/com/android/server/job/controllers/JobStatus.java
@@ -159,11 +159,11 @@
}
public boolean hasConnectivityConstraint() {
- return job.getNetworkCapabilities() == JobInfo.NetworkType.ANY;
+ return job.getNetworkType() == JobInfo.NETWORK_TYPE_ANY;
}
public boolean hasUnmeteredConstraint() {
- return job.getNetworkCapabilities() == JobInfo.NetworkType.UNMETERED;
+ return job.getNetworkType() == JobInfo.NETWORK_TYPE_UNMETERED;
}
public boolean hasChargingConstraint() {
@@ -219,7 +219,7 @@
+ ",u" + getUserId()
+ ",R=(" + formatRunTime(earliestRunTimeElapsedMillis, NO_EARLIEST_RUNTIME)
+ "," + formatRunTime(latestRunTimeElapsedMillis, NO_LATEST_RUNTIME) + ")"
- + ",N=" + job.getNetworkCapabilities() + ",C=" + job.isRequireCharging()
+ + ",N=" + job.getNetworkType() + ",C=" + job.isRequireCharging()
+ ",I=" + job.isRequireDeviceIdle() + ",F=" + numFailures
+ ",P=" + job.isPersisted()
+ (isReady() ? "(READY)" : "")
diff --git a/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java b/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java
index 2b693a3..402f0dd 100644
--- a/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java
+++ b/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java
@@ -51,11 +51,11 @@
final JobInfo task = new Builder(taskId, mComponent)
.setRequiresCharging(true)
- .setRequiredNetworkCapabilities(JobInfo.NetworkType.ANY)
- .setBackoffCriteria(initialBackoff, JobInfo.BackoffPolicy.EXPONENTIAL)
+ .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
+ .setBackoffCriteria(initialBackoff, JobInfo.BACKOFF_POLICY_EXPONENTIAL)
.setOverrideDeadline(runByMillis)
.setMinimumLatency(runFromMillis)
- .setIsPersisted(true)
+ .setPersisted(true)
.build();
final JobStatus ts = new JobStatus(task, SOME_UID);
mTaskStoreUnderTest.add(ts);
@@ -80,14 +80,14 @@
.setRequiresDeviceIdle(true)
.setPeriodic(10000L)
.setRequiresCharging(true)
- .setIsPersisted(true)
+ .setPersisted(true)
.build();
final JobInfo task2 = new Builder(12, mComponent)
.setMinimumLatency(5000L)
- .setBackoffCriteria(15000L, JobInfo.BackoffPolicy.LINEAR)
+ .setBackoffCriteria(15000L, JobInfo.BACKOFF_POLICY_LINEAR)
.setOverrideDeadline(30000L)
- .setRequiredNetworkCapabilities(JobInfo.NetworkType.UNMETERED)
- .setIsPersisted(true)
+ .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
+ .setPersisted(true)
.build();
final JobStatus taskStatus1 = new JobStatus(task1, SOME_UID);
final JobStatus taskStatus2 = new JobStatus(task2, SOME_UID);
@@ -121,7 +121,7 @@
.setRequiresDeviceIdle(true)
.setPeriodic(10000L)
.setRequiresCharging(true)
- .setIsPersisted(true);
+ .setPersisted(true);
PersistableBundle extras = new PersistableBundle();
extras.putDouble("hello", 3.2);
@@ -159,11 +159,11 @@
assertEquals("Invalid idle constraint.", first.isRequireDeviceIdle(),
second.isRequireDeviceIdle());
assertEquals("Invalid unmetered constraint.",
- first.getNetworkCapabilities() == JobInfo.NetworkType.UNMETERED,
- second.getNetworkCapabilities() == JobInfo.NetworkType.UNMETERED);
+ first.getNetworkType() == JobInfo.NETWORK_TYPE_UNMETERED,
+ second.getNetworkType() == JobInfo.NETWORK_TYPE_UNMETERED);
assertEquals("Invalid connectivity constraint.",
- first.getNetworkCapabilities() == JobInfo.NetworkType.ANY,
- second.getNetworkCapabilities() == JobInfo.NetworkType.ANY);
+ first.getNetworkType() == JobInfo.NETWORK_TYPE_ANY,
+ second.getNetworkType() == JobInfo.NETWORK_TYPE_ANY);
assertEquals("Invalid deadline constraint.",
first.hasLateConstraint(),
second.hasLateConstraint());