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

Commit e4364595 authored by YK Hung's avatar YK Hung Committed by Android (Google) Code Review
Browse files

Merge "Update setDenylist() input structure" into main

parents 44430350 24278e7a
Loading
Loading
Loading
Loading
+3 −21
Original line number Diff line number Diff line
@@ -20,18 +20,15 @@ import static android.net.NetworkPolicyManager.POLICY_NONE;
import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;

import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
import static com.android.settings.fuelgauge.BatteryUtils.UID_ZERO;

import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.NetworkPolicyManager;
import android.util.ArraySet;
import android.util.Log;

import androidx.annotation.VisibleForTesting;

import java.util.List;
import java.util.Set;

/** A class to dynamically manage per apps {@link NetworkPolicyManager} POLICY_ flags. */
@@ -95,20 +92,7 @@ public final class DynamicDenylistManager {
    }

    /** Suggest a list of package to set as POLICY_REJECT. */
    public void setDenylist(List<String> packageNameList) {
        final Set<Integer> denylistTargetUids = new ArraySet<>(packageNameList.size());
        for (String packageName : packageNameList) {
            try {
                final int uid = mContext.getPackageManager().getPackageUid(packageName, 0);
                if (uid == UID_ZERO) {
                    continue;
                }
                denylistTargetUids.add(uid);
            } catch (PackageManager.NameNotFoundException e) {
                Log.e(TAG, "Unknown package name: " + packageName, e);
            }
        }

    public void setDenylist(Set<Integer> denylistTargetUids) {
        final Set<Integer> manualDenylistUids = getDenylistAllUids(getManualDenylistPref());
        denylistTargetUids.removeAll(manualDenylistUids);

@@ -126,16 +110,14 @@ public final class DynamicDenylistManager {
                uid -> editor.putInt(String.valueOf(uid), POLICY_REJECT_METERED_BACKGROUND));
        editor.apply();

        // Set new added UIDs into REJECT policy.
        synchronized (mLock) {
            // Set new added UIDs into REJECT policy.
            for (int uid : denylistTargetUids) {
                if (!lastDynamicDenylistUids.contains(uid)) {
                    mNetworkPolicyManager.setUidPolicy(uid, POLICY_REJECT_METERED_BACKGROUND);
                }
            }
        }
            // Unset removed UIDs back to NONE policy.
        synchronized (mLock) {
            for (int uid : lastDynamicDenylistUids) {
                if (!denylistTargetUids.contains(uid)) {
                    mNetworkPolicyManager.setUidPolicy(uid, POLICY_NONE);
+32 −39
Original line number Diff line number Diff line
@@ -27,7 +27,6 @@ import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
@@ -37,8 +36,8 @@ import static org.mockito.Mockito.when;

import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.NetworkPolicyManager;
import android.util.ArraySet;

import org.junit.After;
import org.junit.Before;
@@ -51,6 +50,7 @@ import org.robolectric.RuntimeEnvironment;

import java.util.Collections;
import java.util.List;
import java.util.Set;

@RunWith(RobolectricTestRunner.class)
public class DynamicDenylistManagerTest {
@@ -67,8 +67,6 @@ public class DynamicDenylistManagerTest {

    @Mock
    private NetworkPolicyManager mNetworkPolicyManager;
    @Mock
    private PackageManager mPackageManager;

    @Before
    public void setUp() {
@@ -166,43 +164,36 @@ public class DynamicDenylistManagerTest {
    public void setDenylist_emptyListAndNoData_doNothing() {
        initDynamicDenylistManager(EMPTY_ARRAY);

        mDynamicDenylistManager.setDenylist(Collections.emptyList());
        setDenylist(Collections.emptySet());

        verify(mNetworkPolicyManager, never()).setUidPolicy(anyInt(), anyInt());
    }

    @Test
    public void setDenylist_uidDeniedAlready_doNothing()
            throws PackageManager.NameNotFoundException {
        when(mPackageManager.getPackageUid(anyString(), eq(0))).thenReturn(FAKE_UID_1_INT);
    public void setDenylist_uidDeniedAlready_doNothing() {
        initDynamicDenylistManager(new int[] {FAKE_UID_1_INT});

        mDynamicDenylistManager.setDenylist(List.of(FAKE_UID_1));
        setDenylist(new ArraySet<>(List.of(FAKE_UID_1_INT)));

        verify(mNetworkPolicyManager, never()).setUidPolicy(anyInt(), anyInt());
    }

    @Test
    public void setDenylist_sameList_doNothing() throws PackageManager.NameNotFoundException {
        when(mPackageManager.getPackageUid(eq(FAKE_UID_1), eq(0))).thenReturn(FAKE_UID_1_INT);
        when(mPackageManager.getPackageUid(eq(FAKE_UID_2), eq(0))).thenReturn(FAKE_UID_2_INT);
    public void setDenylist_sameList_doNothing() {
        initDynamicDenylistManager(EMPTY_ARRAY);
        setupPreference(mDynamicDenyListPref, FAKE_UID_2, FAKE_UID_1);

        mDynamicDenylistManager.setDenylist(List.of(FAKE_UID_1, FAKE_UID_2));
        setDenylist(new ArraySet<>(List.of(FAKE_UID_1_INT, FAKE_UID_2_INT)));

        verify(mNetworkPolicyManager, never()).setUidPolicy(anyInt(), anyInt());
    }

    @Test
    public void setDenylist_newListWithOldData_modifyPolicyNoneAndReject()
            throws PackageManager.NameNotFoundException {
        when(mPackageManager.getPackageUid(anyString(), eq(0))).thenReturn(
                Integer.parseInt(FAKE_UID_1));
    public void setDenylist_newListWithOldData_modifyPolicyNoneAndReject() {
        initDynamicDenylistManager(EMPTY_ARRAY);
        setupPreference(mDynamicDenyListPref, FAKE_UID_2);

        mDynamicDenylistManager.setDenylist(List.of(FAKE_UID_1));
        setDenylist(new ArraySet<>(List.of(FAKE_UID_1_INT)));

        verify(mNetworkPolicyManager).setUidPolicy(FAKE_UID_2_INT, POLICY_NONE);
        verify(mNetworkPolicyManager).setUidPolicy(FAKE_UID_1_INT,
@@ -212,13 +203,10 @@ public class DynamicDenylistManagerTest {
    }

    @Test
    public void setDenylist_newListWithoutOldData_modifyPolicyReject()
            throws PackageManager.NameNotFoundException {
        when(mPackageManager.getPackageUid(anyString(), eq(0))).thenReturn(
                Integer.parseInt(FAKE_UID_1));
    public void setDenylist_newListWithoutOldData_modifyPolicyReject() {
        initDynamicDenylistManager(EMPTY_ARRAY);

        mDynamicDenylistManager.setDenylist(List.of(FAKE_UID_1));
        setDenylist(new ArraySet<>(List.of(FAKE_UID_1_INT)));

        verify(mNetworkPolicyManager, never()).setUidPolicy(anyInt(), eq(POLICY_NONE));
        verify(mNetworkPolicyManager).setUidPolicy(FAKE_UID_1_INT,
@@ -232,7 +220,7 @@ public class DynamicDenylistManagerTest {
        initDynamicDenylistManager(EMPTY_ARRAY);
        setupPreference(mDynamicDenyListPref, FAKE_UID_2);

        mDynamicDenylistManager.setDenylist(Collections.emptyList());
        setDenylist(Collections.emptySet());

        verify(mNetworkPolicyManager).setUidPolicy(FAKE_UID_2_INT, POLICY_NONE);
        verify(mNetworkPolicyManager, never()).setUidPolicy(anyInt(),
@@ -314,7 +302,7 @@ public class DynamicDenylistManagerTest {
        verify(mNetworkPolicyManager).setUidPolicy(eq(FAKE_UID_2_INT), eq(POLICY_NONE));
    }

    @Test// 4
    @Test
    public void resetDenylistIfNeeded_forceResetWithInvalidPackageName_resetAndClear() {
        initDynamicDenylistManager(new int[0], new int[] {FAKE_UID_1_INT, FAKE_UID_2_INT});

@@ -372,10 +360,9 @@ public class DynamicDenylistManagerTest {
    private void initDynamicDenylistManager(int[] preload) {
        initDynamicDenylistManager(preload, preload);
    }

    private void initDynamicDenylistManager(int[] preload1, int[] preload2) {
        final Context context = spy(RuntimeEnvironment.application.getApplicationContext());
        when(context.getApplicationContext()).thenReturn(context);
        when(context.getPackageManager()).thenReturn(mPackageManager);
        when(mNetworkPolicyManager.getUidsWithPolicy(anyInt()))
                .thenReturn(preload1).thenReturn(preload2);
        mDynamicDenylistManager = new DynamicDenylistManager(context, mNetworkPolicyManager);
@@ -383,9 +370,15 @@ public class DynamicDenylistManagerTest {
        mDynamicDenyListPref = mDynamicDenylistManager.getDynamicDenylistPref();
    }

    private void setDenylist(Set<Integer> packageNameList) {
        mDynamicDenylistManager.setDenylist(packageNameList);
    }

    private void setupPreference(SharedPreferences sharedPreferences, String... uids) {
        final SharedPreferences.Editor editor = sharedPreferences.edit();
        for (String uid : uids) {
            sharedPreferences.edit().putInt(uid, POLICY_REJECT_METERED_BACKGROUND).apply();
            editor.putInt(uid, POLICY_REJECT_METERED_BACKGROUND);
        }
        editor.apply();
    }
}