diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index 290034522c5db..a818bddf3e034 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -1619,7 +1619,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { try { final int oldPolicy = mUidPolicy.get(uid, POLICY_NONE); if (oldPolicy != policy) { - setUidPolicyUncheckedLocked(uid, policy, true); + setUidPolicyUncheckedLocked(uid, oldPolicy, policy, true); } } finally { Binder.restoreCallingIdentity(token); @@ -1639,7 +1639,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { final int oldPolicy = mUidPolicy.get(uid, POLICY_NONE); policy |= oldPolicy; if (oldPolicy != policy) { - setUidPolicyUncheckedLocked(uid, policy, true); + setUidPolicyUncheckedLocked(uid, oldPolicy, policy, true); } } } @@ -1656,11 +1656,22 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { final int oldPolicy = mUidPolicy.get(uid, POLICY_NONE); policy = oldPolicy & ~policy; if (oldPolicy != policy) { - setUidPolicyUncheckedLocked(uid, policy, true); + setUidPolicyUncheckedLocked(uid, oldPolicy, policy, true); } } } + private void setUidPolicyUncheckedLocked(int uid, int oldPolicy, int policy, boolean persist) { + setUidPolicyUncheckedLocked(uid, policy, persist); + + // Checks if app was added or removed to the blacklist. + if ((oldPolicy == POLICY_NONE && policy == POLICY_REJECT_METERED_BACKGROUND) + || (oldPolicy == POLICY_REJECT_METERED_BACKGROUND && policy == POLICY_NONE)) { + mHandler.obtainMessage(MSG_RESTRICT_BACKGROUND_WHITELIST_CHANGED, uid, 0) + .sendToTarget(); + } + } + private void setUidPolicyUncheckedLocked(int uid, int policy, boolean persist) { mUidPolicy.put(uid, policy); @@ -1988,7 +1999,20 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { public int getRestrictBackgroundByCaller() { mContext.enforceCallingOrSelfPermission(ACCESS_NETWORK_STATE, TAG); final int uid = Binder.getCallingUid(); + synchronized (mRulesLock) { + // Must clear identity because getUidPolicy() is restricted to system. + final long token = Binder.clearCallingIdentity(); + final int policy; + try { + policy = getUidPolicy(uid); + } finally { + Binder.restoreCallingIdentity(token); + } + if (policy == POLICY_REJECT_METERED_BACKGROUND) { + // App is blacklisted. + return RESTRICT_BACKGROUND_STATUS_ENABLED; + } if (!mRestrictBackground) { return RESTRICT_BACKGROUND_STATUS_DISABLED; }