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());