Merge "Introduce NETWORK_TYPE_METERED job constraint" into oc-dev

This commit is contained in:
TreeHugger Robot
2017-04-14 19:04:30 +00:00
committed by Android (Google) Code Review
8 changed files with 72 additions and 25 deletions

View File

@ -6793,6 +6793,7 @@ package android.app.job {
field public static final long DEFAULT_INITIAL_BACKOFF_MILLIS = 30000L; // 0x7530L
field public static final long MAX_BACKOFF_DELAY_MILLIS = 18000000L; // 0x112a880L
field public static final int NETWORK_TYPE_ANY = 1; // 0x1
field public static final int NETWORK_TYPE_METERED = 4; // 0x4
field public static final int NETWORK_TYPE_NONE = 0; // 0x0
field public static final int NETWORK_TYPE_NOT_ROAMING = 3; // 0x3
field public static final int NETWORK_TYPE_UNMETERED = 2; // 0x2

View File

@ -7226,6 +7226,7 @@ package android.app.job {
field public static final long DEFAULT_INITIAL_BACKOFF_MILLIS = 30000L; // 0x7530L
field public static final long MAX_BACKOFF_DELAY_MILLIS = 18000000L; // 0x112a880L
field public static final int NETWORK_TYPE_ANY = 1; // 0x1
field public static final int NETWORK_TYPE_METERED = 4; // 0x4
field public static final int NETWORK_TYPE_NONE = 0; // 0x0
field public static final int NETWORK_TYPE_NOT_ROAMING = 3; // 0x3
field public static final int NETWORK_TYPE_UNMETERED = 2; // 0x2

View File

@ -6823,6 +6823,7 @@ package android.app.job {
field public static final long DEFAULT_INITIAL_BACKOFF_MILLIS = 30000L; // 0x7530L
field public static final long MAX_BACKOFF_DELAY_MILLIS = 18000000L; // 0x112a880L
field public static final int NETWORK_TYPE_ANY = 1; // 0x1
field public static final int NETWORK_TYPE_METERED = 4; // 0x4
field public static final int NETWORK_TYPE_NONE = 0; // 0x0
field public static final int NETWORK_TYPE_NOT_ROAMING = 3; // 0x3
field public static final int NETWORK_TYPE_UNMETERED = 2; // 0x2

View File

@ -51,6 +51,8 @@ public class JobInfo implements Parcelable {
public static final int NETWORK_TYPE_UNMETERED = 2;
/** This job requires network connectivity that is not roaming. */
public static final int NETWORK_TYPE_NOT_ROAMING = 3;
/** This job requires metered connectivity such as most cellular data networks. */
public static final int NETWORK_TYPE_METERED = 4;
/**
* Amount of backoff a job has initially by default, in milliseconds.
@ -347,10 +349,13 @@ public class JobInfo implements Parcelable {
}
/**
* One of {@link android.app.job.JobInfo#NETWORK_TYPE_ANY},
* The kind of connectivity requirements that the job has.
*
* @return One of {@link android.app.job.JobInfo#NETWORK_TYPE_ANY},
* {@link android.app.job.JobInfo#NETWORK_TYPE_NONE},
* {@link android.app.job.JobInfo#NETWORK_TYPE_UNMETERED}, or
* {@link android.app.job.JobInfo#NETWORK_TYPE_NOT_ROAMING}.
* {@link android.app.job.JobInfo#NETWORK_TYPE_UNMETERED},
* {@link android.app.job.JobInfo#NETWORK_TYPE_METERED}, or
* {@link android.app.job.JobInfo#NETWORK_TYPE_NOT_ROAMING},
*/
public int getNetworkType() {
return networkType;

View File

@ -1271,8 +1271,7 @@ public final class JobSchedulerService extends com.android.server.SystemService
if (job.hasIdleConstraint()) {
idleCount++;
}
if (job.hasConnectivityConstraint() || job.hasUnmeteredConstraint()
|| job.hasNotRoamingConstraint()) {
if (job.hasConnectivityConstraint()) {
connectivityCount++;
}
if (job.hasChargingConstraint()) {

View File

@ -368,13 +368,16 @@ public class JobStore {
*/
private void writeConstraintsToXml(XmlSerializer out, JobStatus jobStatus) throws IOException {
out.startTag(null, XML_TAG_PARAMS_CONSTRAINTS);
if (jobStatus.hasConnectivityConstraint()) {
if (jobStatus.needsAnyConnectivity()) {
out.attribute(null, "connectivity", Boolean.toString(true));
}
if (jobStatus.hasUnmeteredConstraint()) {
if (jobStatus.needsMeteredConnectivity()) {
out.attribute(null, "metered", Boolean.toString(true));
}
if (jobStatus.needsUnmeteredConnectivity()) {
out.attribute(null, "unmetered", Boolean.toString(true));
}
if (jobStatus.hasNotRoamingConstraint()) {
if (jobStatus.needsNonRoamingConnectivity()) {
out.attribute(null, "not-roaming", Boolean.toString(true));
}
if (jobStatus.hasIdleConstraint()) {
@ -713,6 +716,10 @@ public class JobStore {
if (val != null) {
jobBuilder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
}
val = parser.getAttributeValue(null, "metered");
if (val != null) {
jobBuilder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_METERED);
}
val = parser.getAttributeValue(null, "unmetered");
if (val != null) {
jobBuilder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED);

View File

@ -84,8 +84,7 @@ public class ConnectivityController extends StateController implements
@Override
public void maybeStartTrackingJobLocked(JobStatus jobStatus, JobStatus lastJob) {
if (jobStatus.hasConnectivityConstraint() || jobStatus.hasUnmeteredConstraint()
|| jobStatus.hasNotRoamingConstraint()) {
if (jobStatus.hasConnectivityConstraint()) {
updateConstraintsSatisfied(jobStatus, null);
mTrackedJobs.add(jobStatus);
}
@ -94,8 +93,7 @@ public class ConnectivityController extends StateController implements
@Override
public void maybeStopTrackingJobLocked(JobStatus jobStatus, JobStatus incomingJob,
boolean forUpdate) {
if (jobStatus.hasConnectivityConstraint() || jobStatus.hasUnmeteredConstraint()
|| jobStatus.hasNotRoamingConstraint()) {
if (jobStatus.hasConnectivityConstraint()) {
mTrackedJobs.remove(jobStatus);
}
}
@ -114,11 +112,13 @@ public class ConnectivityController extends StateController implements
&& capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
final boolean connected = info != null && info.isConnected();
final boolean connectionUsable = connected && validated;
final boolean metered = connected && info.isMetered();
final boolean unmetered = connected && !info.isMetered();
final boolean notRoaming = connected && !info.isRoaming();
boolean changed = false;
changed |= jobStatus.setConnectivityConstraintSatisfied(connectionUsable);
changed |= jobStatus.setMeteredConstraintSatisfied(metered);
changed |= jobStatus.setUnmeteredConstraintSatisfied(unmetered);
changed |= jobStatus.setNotRoamingConstraintSatisfied(notRoaming);
@ -134,6 +134,7 @@ public class ConnectivityController extends StateController implements
+ " for " + jobStatus + ": usable=" + connectionUsable
+ " connected=" + connected
+ " validated=" + validated
+ " metered=" + metered
+ " unmetered=" + unmetered
+ " notRoaming=" + notRoaming);
}
@ -244,9 +245,10 @@ public class ConnectivityController extends StateController implements
js.printUniqueId(pw);
pw.print(" from ");
UserHandle.formatUid(pw, js.getSourceUid());
pw.print(": C="); pw.print(js.hasConnectivityConstraint());
pw.print(": UM="); pw.print(js.hasUnmeteredConstraint());
pw.print(": NR="); pw.println(js.hasNotRoamingConstraint());
pw.print(": C="); pw.print(js.needsAnyConnectivity());
pw.print(": M="); pw.print(js.needsMeteredConnectivity());
pw.print(": UM="); pw.print(js.needsUnmeteredConnectivity());
pw.print(": NR="); pw.println(js.needsNonRoamingConnectivity());
}
}
}

View File

@ -68,6 +68,11 @@ public final class JobStatus {
static final int CONSTRAINT_CONTENT_TRIGGER = 1<<26;
static final int CONSTRAINT_DEVICE_NOT_DOZING = 1<<25;
static final int CONSTRAINT_NOT_ROAMING = 1<<24;
static final int CONSTRAINT_METERED = 1<<23;
static final int CONNECTIVITY_MASK =
CONSTRAINT_UNMETERED | CONSTRAINT_CONNECTIVITY |
CONSTRAINT_NOT_ROAMING | CONSTRAINT_METERED;
// Soft override: ignore constraints like time that don't affect API availability
public static final int OVERRIDE_SOFT = 1;
@ -191,15 +196,28 @@ public final class JobStatus {
this.numFailures = numFailures;
int requiredConstraints = job.getConstraintFlags();
if (job.getNetworkType() == JobInfo.NETWORK_TYPE_ANY) {
requiredConstraints |= CONSTRAINT_CONNECTIVITY;
}
if (job.getNetworkType() == JobInfo.NETWORK_TYPE_UNMETERED) {
requiredConstraints |= CONSTRAINT_UNMETERED;
}
if (job.getNetworkType() == JobInfo.NETWORK_TYPE_NOT_ROAMING) {
requiredConstraints |= CONSTRAINT_NOT_ROAMING;
switch (job.getNetworkType()) {
case JobInfo.NETWORK_TYPE_NONE:
// No constraint.
break;
case JobInfo.NETWORK_TYPE_ANY:
requiredConstraints |= CONSTRAINT_CONNECTIVITY;
break;
case JobInfo.NETWORK_TYPE_UNMETERED:
requiredConstraints |= CONSTRAINT_UNMETERED;
break;
case JobInfo.NETWORK_TYPE_NOT_ROAMING:
requiredConstraints |= CONSTRAINT_NOT_ROAMING;
break;
case JobInfo.NETWORK_TYPE_METERED:
requiredConstraints |= CONSTRAINT_METERED;
break;
default:
Slog.w(TAG, "Unrecognized networking constraint " + job.getNetworkType());
break;
}
if (earliestRunTimeElapsedMillis != NO_EARLIEST_RUNTIME) {
requiredConstraints |= CONSTRAINT_TIMING_DELAY;
}
@ -467,15 +485,24 @@ public final class JobStatus {
return job.getFlags();
}
/** Does this job have any sort of networking constraint? */
public boolean hasConnectivityConstraint() {
return (requiredConstraints&CONNECTIVITY_MASK) != 0;
}
public boolean needsAnyConnectivity() {
return (requiredConstraints&CONSTRAINT_CONNECTIVITY) != 0;
}
public boolean hasUnmeteredConstraint() {
public boolean needsUnmeteredConnectivity() {
return (requiredConstraints&CONSTRAINT_UNMETERED) != 0;
}
public boolean hasNotRoamingConstraint() {
public boolean needsMeteredConnectivity() {
return (requiredConstraints&CONSTRAINT_METERED) != 0;
}
public boolean needsNonRoamingConnectivity() {
return (requiredConstraints&CONSTRAINT_NOT_ROAMING) != 0;
}
@ -571,6 +598,10 @@ public final class JobStatus {
return setConstraintSatisfied(CONSTRAINT_UNMETERED, state);
}
boolean setMeteredConstraintSatisfied(boolean state) {
return setConstraintSatisfied(CONSTRAINT_METERED, state);
}
boolean setNotRoamingConstraintSatisfied(boolean state) {
return setConstraintSatisfied(CONSTRAINT_NOT_ROAMING, state);
}