diff --git a/extensions/jobdispatcher/src/main/java/com/google/android/exoplayer2/ext/jobdispatcher/JobDispatcherScheduler.java b/extensions/jobdispatcher/src/main/java/com/google/android/exoplayer2/ext/jobdispatcher/JobDispatcherScheduler.java
index b7818546f9..677d3c2ebd 100644
--- a/extensions/jobdispatcher/src/main/java/com/google/android/exoplayer2/ext/jobdispatcher/JobDispatcherScheduler.java
+++ b/extensions/jobdispatcher/src/main/java/com/google/android/exoplayer2/ext/jobdispatcher/JobDispatcherScheduler.java
@@ -129,7 +129,7 @@ public final class JobDispatcherScheduler implements Scheduler {
Bundle extras = new Bundle();
extras.putString(KEY_SERVICE_ACTION, serviceAction);
extras.putString(KEY_SERVICE_PACKAGE, servicePackage);
- extras.putInt(KEY_REQUIREMENTS, requirements.getRequirementsData());
+ extras.putInt(KEY_REQUIREMENTS, requirements.getRequirements());
builder.setExtras(extras);
return builder.build();
diff --git a/library/core/src/main/java/com/google/android/exoplayer2/scheduler/PlatformScheduler.java b/library/core/src/main/java/com/google/android/exoplayer2/scheduler/PlatformScheduler.java
index ed06d3745a..b8272dc036 100644
--- a/library/core/src/main/java/com/google/android/exoplayer2/scheduler/PlatformScheduler.java
+++ b/library/core/src/main/java/com/google/android/exoplayer2/scheduler/PlatformScheduler.java
@@ -130,7 +130,7 @@ public final class PlatformScheduler implements Scheduler {
PersistableBundle extras = new PersistableBundle();
extras.putString(KEY_SERVICE_ACTION, serviceAction);
extras.putString(KEY_SERVICE_PACKAGE, servicePackage);
- extras.putInt(KEY_REQUIREMENTS, requirements.getRequirementsData());
+ extras.putInt(KEY_REQUIREMENTS, requirements.getRequirements());
builder.setExtras(extras);
return builder.build();
diff --git a/library/core/src/main/java/com/google/android/exoplayer2/scheduler/Requirements.java b/library/core/src/main/java/com/google/android/exoplayer2/scheduler/Requirements.java
index 5acd31ee0d..4019d1ae70 100644
--- a/library/core/src/main/java/com/google/android/exoplayer2/scheduler/Requirements.java
+++ b/library/core/src/main/java/com/google/android/exoplayer2/scheduler/Requirements.java
@@ -25,6 +25,7 @@ import android.net.NetworkInfo;
import android.os.BatteryManager;
import android.os.PowerManager;
import android.support.annotation.IntDef;
+import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.Log;
import com.google.android.exoplayer2.util.Util;
import java.lang.annotation.Documented;
@@ -50,22 +51,49 @@ public final class Requirements {
NETWORK_TYPE_METERED,
})
public @interface NetworkType {}
+
+ /**
+ * Requirement flags.
+ *
+ *
Combination of the following values is possible:
+ *
+ *
+ * - Only one of {@link #NETWORK_TYPE_ANY}, {@link #NETWORK_TYPE_UNMETERED}, {@link
+ * #NETWORK_TYPE_NOT_ROAMING} or {@link #NETWORK_TYPE_METERED}.
+ *
- {@link #DEVICE_IDLE}
+ *
- {@link #DEVICE_CHARGING}
+ *
+ */
+ @Documented
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(
+ flag = true,
+ value = {
+ NETWORK_TYPE_ANY,
+ NETWORK_TYPE_UNMETERED,
+ NETWORK_TYPE_NOT_ROAMING,
+ NETWORK_TYPE_METERED,
+ DEVICE_IDLE,
+ DEVICE_CHARGING
+ })
+ public @interface RequirementFlags {}
+
/** This job doesn't require network connectivity. */
public static final int NETWORK_TYPE_NONE = 0;
/** This job requires network connectivity. */
public static final int NETWORK_TYPE_ANY = 1;
/** This job requires network connectivity that is unmetered. */
- public static final int NETWORK_TYPE_UNMETERED = 2;
+ public static final int NETWORK_TYPE_UNMETERED = 1 << 1;
/** This job requires network connectivity that is not roaming. */
- public static final int NETWORK_TYPE_NOT_ROAMING = 3;
+ public static final int NETWORK_TYPE_NOT_ROAMING = 1 << 2;
/** This job requires metered connectivity such as most cellular data networks. */
- public static final int NETWORK_TYPE_METERED = 4;
+ public static final int NETWORK_TYPE_METERED = 1 << 3;
/** This job requires the device to be idle. */
- private static final int DEVICE_IDLE = 8;
+ public static final int DEVICE_IDLE = 1 << 4;
/** This job requires the device to be charging. */
- private static final int DEVICE_CHARGING = 16;
+ public static final int DEVICE_CHARGING = 1 << 5;
- private static final int NETWORK_TYPE_MASK = 7;
+ private static final int NETWORK_TYPE_MASK = 0b1111;
private static final String TAG = "Requirements";
@@ -86,7 +114,7 @@ public final class Requirements {
}
}
- private final int requirements;
+ @RequirementFlags private final int requirements;
/**
* @param networkType Required network type.
@@ -97,9 +125,12 @@ public final class Requirements {
this(networkType | (charging ? DEVICE_CHARGING : 0) | (idle ? DEVICE_IDLE : 0));
}
- /** @param requirementsData The value returned by {@link #getRequirementsData()}. */
- public Requirements(int requirementsData) {
- this.requirements = requirementsData;
+ /** @param requirements A combination of requirement flags. */
+ public Requirements(@RequirementFlags int requirements) {
+ this.requirements = requirements;
+ int networkType = getRequiredNetworkType();
+ // Check if only one network type is specified.
+ Assertions.checkState((networkType & (networkType - 1)) == 0);
}
/** Returns required network type. */
@@ -121,6 +152,7 @@ public final class Requirements {
* Returns whether the requirements are met.
*
* @param context Any context.
+ * @return Whether the requirements are met.
*/
public boolean checkRequirements(Context context) {
return checkNetworkRequirements(context)
@@ -128,8 +160,22 @@ public final class Requirements {
&& checkIdleRequirement(context);
}
- /** Returns the encoded requirements data which can be used with {@link #Requirements(int)}. */
- public int getRequirementsData() {
+ /**
+ * Returns the requirement flags that are not met, or 0.
+ *
+ * @param context Any context.
+ * @return The requirement flags that are not met, or 0.
+ */
+ @RequirementFlags
+ public int getNotMetRequirements(Context context) {
+ return (!checkNetworkRequirements(context) ? getRequiredNetworkType() : 0)
+ | (!checkChargingRequirement(context) ? DEVICE_CHARGING : 0)
+ | (!checkIdleRequirement(context) ? DEVICE_IDLE : 0);
+ }
+
+ /** Returns the requirement flags. */
+ @RequirementFlags
+ public int getRequirements() {
return requirements;
}