From 923845fdaa03a3f807a759d0eef3d0decca107d6 Mon Sep 17 00:00:00 2001 From: Felipe Leme Date: Wed, 2 Mar 2016 13:42:48 -0800 Subject: [PATCH] Handles blacklist on getRestrictBackgroundStatus(). Initial implementation of getRestrictBackgroundStatus() was just handling the whitelist status of apps when data saver is turned on, but when an app is blacklisted, it should return RESTRICT_BACKGROUND_STATUS_ENABLED regardless of the data saver status. BUG: 27432317 Change-Id: I5a027d8b7d17a13075510ff8f29d41eaa5a6beb8 --- .../net/NetworkPolicyManagerService.java | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index 09b7a18af40fd..3513e5487325b 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -1631,7 +1631,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); @@ -1651,7 +1651,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); } } } @@ -1668,11 +1668,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); @@ -2000,7 +2011,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; }