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

Commit bd2f8fab authored by Tommy Webb's avatar Tommy Webb Committed by Michael Bestas
Browse files

Fix background data clobbering other policies

Stop removing preexisting UID policies when toggling
Background network access / unrestricted data usage.

Issue: calyxos#2118
Change-Id: If54d0a0925c5da0f3d519d0a85491ff3b7b62351
parent 5b7f96d1
Loading
Loading
Loading
Loading
+40 −13
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import com.android.settingslib.utils.ThreadUtils;
import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
import java.util.Arrays;

public class DataSaverBackend {

@@ -82,8 +83,7 @@ public class DataSaverBackend {
    }

    public void setIsAllowlisted(int uid, String packageName, boolean allowlisted) {
        final int policy = allowlisted ? POLICY_ALLOW_METERED_BACKGROUND : POLICY_NONE;
        mUidPolicies.put(uid, policy);
        setUidPolicyFlag(uid, POLICY_ALLOW_METERED_BACKGROUND, allowlisted);
        if (allowlisted) {
            mPolicyManager.addUidPolicy(uid, POLICY_ALLOW_METERED_BACKGROUND);
            mMetricsFeatureProvider.action(
@@ -96,17 +96,14 @@ public class DataSaverBackend {

    public boolean isAllowlisted(int uid) {
        loadAllowlist();
        return mUidPolicies.get(uid, POLICY_NONE) == POLICY_ALLOW_METERED_BACKGROUND;
        return isUidPolicyFlagSet(uid, POLICY_ALLOW_METERED_BACKGROUND);
    }

    private void loadAllowlist() {
        if (mAllowlistInitialized) {
            return;
        }

        for (int uid : mPolicyManager.getUidsWithPolicy(POLICY_ALLOW_METERED_BACKGROUND)) {
            mUidPolicies.put(uid, POLICY_ALLOW_METERED_BACKGROUND);
        }
        loadUidPolicies(POLICY_ALLOW_METERED_BACKGROUND);
        mAllowlistInitialized = true;
    }

@@ -115,8 +112,7 @@ public class DataSaverBackend {
    }

    public void setIsDenylisted(int uid, String packageName, boolean denylisted) {
        final int policy = denylisted ? POLICY_REJECT_METERED_BACKGROUND : POLICY_NONE;
        mUidPolicies.put(uid, policy);
        setUidPolicyFlag(uid, POLICY_REJECT_METERED_BACKGROUND, denylisted);
        if (denylisted) {
            mPolicyManager.addUidPolicy(uid, POLICY_REJECT_METERED_BACKGROUND);
            mMetricsFeatureProvider.action(
@@ -127,18 +123,49 @@ public class DataSaverBackend {
        mPolicyManager.removeUidPolicy(uid, POLICY_ALLOW_METERED_BACKGROUND);
    }

    private void loadUidPolicies(int policy) {
        final int[] uidsWithPolicy = mPolicyManager.getUidsWithPolicy(policy);
        for (int uid : uidsWithPolicy) {
            setCachedUidPolicyFlag(uid, policy, true);
        }
        for (int i = 0; i < mUidPolicies.size(); i++) {
            final int uid = mUidPolicies.keyAt(i);
            if (!Arrays.asList(uidsWithPolicy).contains(uid)) {
                setCachedUidPolicyFlag(uid, policy, false);
            }
        }
    }

    private int setCachedUidPolicyFlag(int uid, int policy, boolean add) {
        final int currentPolicy = mUidPolicies.get(uid, POLICY_NONE);
        final int newPolicy = add ? (currentPolicy | policy) : (currentPolicy & ~policy);
        mUidPolicies.put(uid, newPolicy);
        return newPolicy;
    }

    private int setUidPolicyFlag(int uid, int policy, boolean add) {
        if (add) {
            mPolicyManager.addUidPolicy(uid, policy);
        } else {
            mPolicyManager.removeUidPolicy(uid, policy);
        }
        return setCachedUidPolicyFlag(uid, policy, add);
    }

    private boolean isUidPolicyFlagSet(int uid, int policy) {
        return (mUidPolicies.get(uid, POLICY_NONE) & policy) == policy;
    }

    public boolean isDenylisted(int uid) {
        loadDenylist();
        return mUidPolicies.get(uid, POLICY_NONE) == POLICY_REJECT_METERED_BACKGROUND;
        return isUidPolicyFlagSet(uid, POLICY_REJECT_METERED_BACKGROUND);
    }

    private void loadDenylist() {
        if (mDenylistInitialized) {
            return;
        }
        for (int uid : mPolicyManager.getUidsWithPolicy(POLICY_REJECT_METERED_BACKGROUND)) {
            mUidPolicies.put(uid, POLICY_REJECT_METERED_BACKGROUND);
        }
        loadUidPolicies(POLICY_REJECT_METERED_BACKGROUND);
        mDenylistInitialized = true;
    }