Merge "Introduce NETWORK_TYPE_METERED job constraint" into oc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
28dab313ee
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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()) {
|
||||
|
@ -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);
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user