Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 923845fd authored by Felipe Leme's avatar Felipe Leme
Browse files

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
parent 8486706a
Loading
Loading
Loading
Loading
+27 −3
Original line number Diff line number Diff line
@@ -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;
            }