Merge "Created a ACTION_RESTRICT_BACKGROUND_CHANGED intent."
diff --git a/api/current.txt b/api/current.txt
index 80a6e9e..18a1582 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -23394,6 +23394,7 @@
method public void unregisterNetworkCallback(android.app.PendingIntent);
field public static final deprecated java.lang.String ACTION_BACKGROUND_DATA_SETTING_CHANGED = "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED";
field public static final java.lang.String ACTION_CAPTIVE_PORTAL_SIGN_IN = "android.net.conn.CAPTIVE_PORTAL";
+ field public static final java.lang.String ACTION_RESTRICT_BACKGROUND_CHANGED = "android.net.conn.RESTRICT_BACKGROUND_CHANGED";
field public static final java.lang.String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
field public static final deprecated int DEFAULT_NETWORK_PREFERENCE = 1; // 0x1
field public static final java.lang.String EXTRA_CAPTIVE_PORTAL = "android.net.extra.CAPTIVE_PORTAL";
diff --git a/api/system-current.txt b/api/system-current.txt
index 05954e2..7c181c8 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -24962,6 +24962,7 @@
method public void unregisterNetworkCallback(android.app.PendingIntent);
field public static final deprecated java.lang.String ACTION_BACKGROUND_DATA_SETTING_CHANGED = "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED";
field public static final java.lang.String ACTION_CAPTIVE_PORTAL_SIGN_IN = "android.net.conn.CAPTIVE_PORTAL";
+ field public static final java.lang.String ACTION_RESTRICT_BACKGROUND_CHANGED = "android.net.conn.RESTRICT_BACKGROUND_CHANGED";
field public static final java.lang.String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
field public static final deprecated int DEFAULT_NETWORK_PREFERENCE = 1; // 0x1
field public static final java.lang.String EXTRA_CAPTIVE_PORTAL = "android.net.extra.CAPTIVE_PORTAL";
diff --git a/api/test-current.txt b/api/test-current.txt
index 454dd38..8551950 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -23403,6 +23403,7 @@
method public void unregisterNetworkCallback(android.app.PendingIntent);
field public static final deprecated java.lang.String ACTION_BACKGROUND_DATA_SETTING_CHANGED = "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED";
field public static final java.lang.String ACTION_CAPTIVE_PORTAL_SIGN_IN = "android.net.conn.CAPTIVE_PORTAL";
+ field public static final java.lang.String ACTION_RESTRICT_BACKGROUND_CHANGED = "android.net.conn.RESTRICT_BACKGROUND_CHANGED";
field public static final java.lang.String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
field public static final deprecated int DEFAULT_NETWORK_PREFERENCE = 1; // 0x1
field public static final java.lang.String EXTRA_CAPTIVE_PORTAL = "android.net.extra.CAPTIVE_PORTAL";
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index 25b38c0..7004e97 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -3215,11 +3215,24 @@
/**
* Device is restricting metered network activity while application is running on background.
+ * <p>
* 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;
+ /**
+ * A change in the background metered network activity restriction has occurred.
+ * <p>
+ * Applications should call {@link #getRestrictBackgroundStatus()} to check if the restriction
+ * applies to them.
+ * <p>
+ * This is only sent to registered receivers, not manifest receivers.
+ */
+ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
+ public static final String ACTION_RESTRICT_BACKGROUND_CHANGED =
+ "android.net.conn.RESTRICT_BACKGROUND_CHANGED";
+
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@IntDef(flag = false, value = {
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 045ce5f..7729d48c 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -231,6 +231,7 @@
<!-- @deprecated. Only {@link android.net.ConnectivityManager.CONNECTIVITY_ACTION} is sent. -->
<protected-broadcast android:name="android.net.conn.CONNECTIVITY_CHANGE_IMMEDIATE" />
<protected-broadcast android:name="android.net.conn.DATA_ACTIVITY_CHANGE" />
+ <protected-broadcast android:name="android.net.conn.RESTRICT_BACKGROUND_CHANGED" />
<protected-broadcast android:name="android.net.conn.BACKGROUND_DATA_SETTING_CHANGED" />
<protected-broadcast android:name="android.net.conn.CAPTIVE_PORTAL_TEST_COMPLETED" />
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index 5c77079..544f255 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -255,6 +255,7 @@
private static final int MSG_RESTRICT_BACKGROUND_CHANGED = 6;
private static final int MSG_ADVISE_PERSIST_THRESHOLD = 7;
private static final int MSG_SCREEN_ON_CHANGED = 8;
+ private static final int MSG_RESTRICT_BACKGROUND_WHITELIST_CHANGED = 9;
private final Context mContext;
private final IActivityManager mActivityManager;
@@ -1864,6 +1865,7 @@
writePolicyLocked();
// TODO: call other update methods like updateNetworkRulesLocked?
}
+ mHandler.obtainMessage(MSG_RESTRICT_BACKGROUND_WHITELIST_CHANGED, uid, 0).sendToTarget();
}
@Override
@@ -1873,6 +1875,7 @@
synchronized (mRulesLock) {
removeRestrictBackgroundWhitelistedUidLocked(uid, true);
}
+ mHandler.obtainMessage(MSG_RESTRICT_BACKGROUND_WHITELIST_CHANGED, uid, 0).sendToTarget();
}
private void removeRestrictBackgroundWhitelistedUidLocked(int uid, boolean writePolicy) {
@@ -2571,6 +2574,25 @@
}
}
mListeners.finishBroadcast();
+ final Intent intent =
+ new Intent(ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED);
+ intent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
+ mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
+ return true;
+ }
+ case MSG_RESTRICT_BACKGROUND_WHITELIST_CHANGED: {
+ final int uid = msg.arg1;
+ final PackageManager pm = mContext.getPackageManager();
+ final String[] packages = pm.getPackagesForUid(uid);
+ final int userId = UserHandle.getUserId(uid);
+ for (String packageName : packages) {
+ final Intent intent =
+ new Intent(ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED);
+ intent.setPackage(packageName);
+ intent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
+ mContext.sendBroadcastAsUser(intent, UserHandle.of(userId));
+ }
+
return true;
}
case MSG_ADVISE_PERSIST_THRESHOLD: {
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java b/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java
index 7b1acca..5830b0e 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java
@@ -20,6 +20,7 @@
import android.content.Intent;
import android.net.INetworkPolicyManager;
+import android.os.Binder;
import android.os.RemoteException;
import android.os.ShellCommand;
@@ -86,7 +87,7 @@
}
switch(type) {
case "restrict-background":
- return getRestrictBackgroundWhitelist();
+ return getRestrictBackground();
}
pw.println("Error: unknown get type '" + type + "'");
return -1;
@@ -101,7 +102,7 @@
}
switch(type) {
case "restrict-background":
- return setRestrictBackgroundWhitelist();
+ return setRestrictBackground();
}
pw.println("Error: unknown set type '" + type + "'");
return -1;
@@ -169,19 +170,24 @@
return 0;
}
- private int getRestrictBackgroundWhitelist() throws RemoteException {
+ private int getRestrictBackground() throws RemoteException {
final PrintWriter pw = getOutPrintWriter();
pw.print("Restrict background status: ");
pw.println(mInterface.getRestrictBackground() ? "enabled" : "disabled");
return 0;
}
- private int setRestrictBackgroundWhitelist() throws RemoteException {
+ private int setRestrictBackground() throws RemoteException {
final int enabled = getNextBooleanArg();
if (enabled < 0) {
return enabled;
}
- mInterface.setRestrictBackground(enabled > 0);
+ final long token = Binder.clearCallingIdentity();
+ try {
+ mInterface.setRestrictBackground(enabled > 0);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
return 0;
}