summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Felipe Leme <felipeal@google.com> 2016-01-22 09:44:57 -0800
committer Felipe Leme <felipeal@google.com> 2016-01-22 10:50:11 -0800
commit1b103238b90ca0aa7a2dcaaf0912361d583367a9 (patch)
treecc552a3339faed9131e3379d1bc50d1518f0edab
parentaae84105d1b8cfe6144afbb82bc70481cb39f8c8 (diff)
Created new public API so applications can customize its metered network
usage while running in background. The new API is 'int getRestrictBackgroundStatus()' and returns the following values: - RESTRICT_BACKGROUND_STATUS_DISABLED: no restrictions - RESTRICT_BACKGROUND_STATUS_WHITELISTED: restriction but app is whitelisted - RESTRICT_BACKGROUND_STATUS_ENABLED: full restriction The proper way to interprete these values for using metered networks while running on background is: - When disabled, there is no restriction and the application could use the metered networks freely. - When whitelisted, the application can use the metered network, but should try to minimize the usage. - When enabled, the application should not try to use metered networks at all, since the usage will be denied. BUG: 26451391 Change-Id: If07d42bb88e4c02802df0234861f38aef2cfead7
-rw-r--r--api/current.txt7
-rw-r--r--api/system-current.txt7
-rw-r--r--api/test-current.txt7
-rw-r--r--core/java/android/net/ConnectivityManager.java59
-rw-r--r--core/java/android/net/INetworkPolicyManager.aidl6
-rw-r--r--services/core/java/com/android/server/net/NetworkPolicyManagerService.java17
6 files changed, 102 insertions, 1 deletions
diff --git a/api/current.txt b/api/current.txt
index e50eba11393f..99195baa4d39 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -22760,6 +22760,7 @@ package android.net {
method public android.net.NetworkInfo getNetworkInfo(android.net.Network);
method public deprecated int getNetworkPreference();
method public static deprecated android.net.Network getProcessDefaultNetwork();
+ method public int getRestrictBackgroundStatus();
method public boolean isActiveNetworkMetered();
method public boolean isDefaultNetworkActive();
method public static deprecated boolean isNetworkTypeValid(int);
@@ -22794,6 +22795,9 @@ package android.net {
field public static final java.lang.String EXTRA_NO_CONNECTIVITY = "noConnectivity";
field public static final java.lang.String EXTRA_OTHER_NETWORK_INFO = "otherNetwork";
field public static final java.lang.String EXTRA_REASON = "reason";
+ field public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; // 0x1
+ field public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; // 0x3
+ field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
field public static final int TYPE_BLUETOOTH = 7; // 0x7
field public static final int TYPE_DUMMY = 8; // 0x8
field public static final int TYPE_ETHERNET = 9; // 0x9
@@ -22820,6 +22824,9 @@ package android.net {
method public abstract void onNetworkActive();
}
+ public static abstract class ConnectivityManager.RestrictBackgroundStatus implements java.lang.annotation.Annotation {
+ }
+
public class Credentials {
ctor public Credentials(int, int, int);
method public int getGid();
diff --git a/api/system-current.txt b/api/system-current.txt
index 2d358bfe0bf8..abdf6804df48 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -24348,6 +24348,7 @@ package android.net {
method public android.net.NetworkInfo getNetworkInfo(android.net.Network);
method public deprecated int getNetworkPreference();
method public static deprecated android.net.Network getProcessDefaultNetwork();
+ method public int getRestrictBackgroundStatus();
method public boolean isActiveNetworkMetered();
method public boolean isDefaultNetworkActive();
method public static deprecated boolean isNetworkTypeValid(int);
@@ -24382,6 +24383,9 @@ package android.net {
field public static final java.lang.String EXTRA_NO_CONNECTIVITY = "noConnectivity";
field public static final java.lang.String EXTRA_OTHER_NETWORK_INFO = "otherNetwork";
field public static final java.lang.String EXTRA_REASON = "reason";
+ field public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; // 0x1
+ field public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; // 0x3
+ field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
field public static final int TYPE_BLUETOOTH = 7; // 0x7
field public static final int TYPE_DUMMY = 8; // 0x8
field public static final int TYPE_ETHERNET = 9; // 0x9
@@ -24408,6 +24412,9 @@ package android.net {
method public abstract void onNetworkActive();
}
+ public static abstract class ConnectivityManager.RestrictBackgroundStatus implements java.lang.annotation.Annotation {
+ }
+
public class Credentials {
ctor public Credentials(int, int, int);
method public int getGid();
diff --git a/api/test-current.txt b/api/test-current.txt
index bcdf5c1b22d9..7c967999619f 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -22768,6 +22768,7 @@ package android.net {
method public android.net.NetworkInfo getNetworkInfo(android.net.Network);
method public deprecated int getNetworkPreference();
method public static deprecated android.net.Network getProcessDefaultNetwork();
+ method public int getRestrictBackgroundStatus();
method public boolean isActiveNetworkMetered();
method public boolean isDefaultNetworkActive();
method public static deprecated boolean isNetworkTypeValid(int);
@@ -22802,6 +22803,9 @@ package android.net {
field public static final java.lang.String EXTRA_NO_CONNECTIVITY = "noConnectivity";
field public static final java.lang.String EXTRA_OTHER_NETWORK_INFO = "otherNetwork";
field public static final java.lang.String EXTRA_REASON = "reason";
+ field public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; // 0x1
+ field public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; // 0x3
+ field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
field public static final int TYPE_BLUETOOTH = 7; // 0x7
field public static final int TYPE_DUMMY = 8; // 0x8
field public static final int TYPE_ETHERNET = 9; // 0x9
@@ -22828,6 +22832,9 @@ package android.net {
method public abstract void onNetworkActive();
}
+ public static abstract class ConnectivityManager.RestrictBackgroundStatus implements java.lang.annotation.Annotation {
+ }
+
public class Credentials {
ctor public Credentials(int, int, int);
method public int getGid();
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index c4f0847e694b..5584cde2aa6c 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -16,7 +16,7 @@
package android.net;
import static com.android.internal.util.Preconditions.checkNotNull;
-
+import android.annotation.IntDef;
import android.annotation.Nullable;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
@@ -49,6 +49,8 @@ import com.android.internal.util.Protocol;
import libcore.net.event.NetworkEventDispatcher;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.net.InetAddress;
import java.util.HashMap;
import java.util.concurrent.atomic.AtomicInteger;
@@ -512,6 +514,7 @@ public class ConnectivityManager {
private final Context mContext;
private INetworkManagementService mNMService;
+ private INetworkPolicyManager mNPManager;
/**
* Tests if a given integer represents a valid network type.
@@ -3025,4 +3028,58 @@ public class ConnectivityManager {
return NetworkUtils.bindProcessToNetworkForHostResolution(
network == null ? NETID_UNSET : network.netId);
}
+
+ /**
+ * Device is not restricting metered network activity while application is running on
+ * background.
+ */
+ public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1;
+
+ /**
+ * Device is restricting metered network activity while application is running on background,
+ * but application is allowed to bypass it.
+ * <p>
+ * In this state, application should take action to mitigate metered network access.
+ * For example, a music streaming application should switch to a low-bandwidth bitrate.
+ */
+ public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2;
+
+ /**
+ * Device is restricting metered network activity while application is running on background.
+ * In this state, application should not try to use the network while running on background,
+ * because it would be denied.
+ */
+ public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3;
+
+ @IntDef(flag = false, value = {
+ RESTRICT_BACKGROUND_STATUS_DISABLED,
+ RESTRICT_BACKGROUND_STATUS_WHITELISTED,
+ RESTRICT_BACKGROUND_STATUS_ENABLED,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface RestrictBackgroundStatus {
+ }
+
+ private INetworkPolicyManager getNetworkPolicyManager() {
+ synchronized (this) {
+ if (mNPManager != null) {
+ return mNPManager;
+ }
+ mNPManager = INetworkPolicyManager.Stub.asInterface(ServiceManager
+ .getService(Context.NETWORK_POLICY_SERVICE));
+ return mNPManager;
+ }
+ }
+
+ /**
+ * Determines if the calling application is subject to metered network restrictions while
+ * running on background.
+ */
+ public @RestrictBackgroundStatus int getRestrictBackgroundStatus() {
+ try {
+ return getNetworkPolicyManager().getRestrictBackgroundByCaller();
+ } catch (RemoteException e) {
+ return RESTRICT_BACKGROUND_STATUS_DISABLED;
+ }
+ }
}
diff --git a/core/java/android/net/INetworkPolicyManager.aidl b/core/java/android/net/INetworkPolicyManager.aidl
index 06aa616b9317..a57fac3afe6c 100644
--- a/core/java/android/net/INetworkPolicyManager.aidl
+++ b/core/java/android/net/INetworkPolicyManager.aidl
@@ -56,6 +56,12 @@ interface INetworkPolicyManager {
void addRestrictBackgroundWhitelistedUid(int uid);
void removeRestrictBackgroundWhitelistedUid(int uid);
int[] getRestrictBackgroundWhitelistedUids();
+ /** Gets the restrict background status based on the caller's UID:
+ 1 - disabled
+ 2 - whitelisted
+ 3 - enabled
+ */
+ int getRestrictBackgroundByCaller();
void setDeviceIdleMode(boolean enabled);
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index 38ebc8003bc7..26584896460e 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -31,6 +31,9 @@ import static android.content.Intent.EXTRA_UID;
import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
import static android.net.ConnectivityManager.TYPE_MOBILE;
import static android.net.ConnectivityManager.TYPE_WIMAX;
+import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_DISABLED;
+import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED;
+import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_WHITELISTED;
import static android.net.ConnectivityManager.isNetworkTypeMobile;
import static android.net.NetworkPolicy.CYCLE_NONE;
import static android.net.NetworkPolicy.LIMIT_DISABLED;
@@ -1873,6 +1876,20 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
}
@Override
+ public int getRestrictBackgroundByCaller() {
+ mContext.enforceCallingOrSelfPermission(ACCESS_NETWORK_STATE, TAG);
+ final int uid = Binder.getCallingUid();
+ synchronized (mRulesLock) {
+ if (!mRestrictBackground) {
+ return RESTRICT_BACKGROUND_STATUS_DISABLED;
+ }
+ return mRestrictBackgroundWhitelistUids.get(uid)
+ ? RESTRICT_BACKGROUND_STATUS_WHITELISTED
+ : RESTRICT_BACKGROUND_STATUS_ENABLED;
+ }
+ }
+
+ @Override
public boolean getRestrictBackground() {
mContext.enforceCallingOrSelfPermission(MANAGE_NETWORK_POLICY, TAG);