Loading src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManager.java +3 −21 Original line number Diff line number Diff line Loading @@ -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. */ Loading Loading @@ -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); Loading @@ -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); Loading tests/robotests/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManagerTest.java +32 −39 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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 { Loading @@ -67,8 +67,6 @@ public class DynamicDenylistManagerTest { @Mock private NetworkPolicyManager mNetworkPolicyManager; @Mock private PackageManager mPackageManager; @Before public void setUp() { Loading Loading @@ -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, Loading @@ -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, Loading @@ -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(), Loading Loading @@ -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}); Loading Loading @@ -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); Loading @@ -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(); } } Loading
src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManager.java +3 −21 Original line number Diff line number Diff line Loading @@ -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. */ Loading Loading @@ -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); Loading @@ -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); Loading
tests/robotests/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManagerTest.java +32 −39 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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 { Loading @@ -67,8 +67,6 @@ public class DynamicDenylistManagerTest { @Mock private NetworkPolicyManager mNetworkPolicyManager; @Mock private PackageManager mPackageManager; @Before public void setUp() { Loading Loading @@ -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, Loading @@ -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, Loading @@ -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(), Loading Loading @@ -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}); Loading Loading @@ -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); Loading @@ -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(); } }