From 65260c7f5e62ed5b2c6a076c6654b16fc4e2710e Mon Sep 17 00:00:00 2001 From: ykhung Date: Fri, 24 Nov 2023 13:25:53 +0800 Subject: [PATCH] Reset the dynamic set denylist after reboot the device Reset the uids which are set into the POLICY_REJECT_METERED_BACKGROUND from the dynamic configured mechanism, rather than set by users manually, to avoid it still take effect after rebooting the device. Bug: 306329984 Test: make -j64 RunSettingsRoboTests ROBOTEST_FILTER="com.android.settings.fuelgauge" Change-Id: Idc0c21350cad7e48e6a5c7190565d5364236c2cd --- .../BatterySettingsMigrateChecker.java | 3 +-- .../datasaver/DynamicDenylistManager.java | 17 +++++++++++---- .../datasaver/DynamicDenylistManagerTest.java | 21 +++++++++++++++++++ 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/src/com/android/settings/fuelgauge/BatterySettingsMigrateChecker.java b/src/com/android/settings/fuelgauge/BatterySettingsMigrateChecker.java index dd49c8b2926..066e0fc15b6 100644 --- a/src/com/android/settings/fuelgauge/BatterySettingsMigrateChecker.java +++ b/src/com/android/settings/fuelgauge/BatterySettingsMigrateChecker.java @@ -51,8 +51,7 @@ public final class BatterySettingsMigrateChecker extends BroadcastReceiver { context = context.getApplicationContext(); verifySaverConfiguration(context); verifyBatteryOptimizeModes(context); - // Initialize and sync settings into SharedPreferences for migration. - DynamicDenylistManager.getInstance(context); + DynamicDenylistManager.getInstance(context).onBootComplete(); } /** Avoid users set important apps into the unexpected battery optimize modes */ diff --git a/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManager.java b/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManager.java index 3ac99878900..4a252389d04 100644 --- a/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManager.java +++ b/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManager.java @@ -139,16 +139,25 @@ public final class DynamicDenylistManager { return; } synchronized (mLock) { - for (int uid : mNetworkPolicyManager - .getUidsWithPolicy(POLICY_REJECT_METERED_BACKGROUND)) { - if (!getDenylistAllUids(getManualDenylistPref()).contains(uid)) { - mNetworkPolicyManager.setUidPolicy(uid, POLICY_NONE); + final int[] uids = mNetworkPolicyManager + .getUidsWithPolicy(POLICY_REJECT_METERED_BACKGROUND); + if (uids != null && uids.length != 0) { + for (int uid : uids) { + if (!getDenylistAllUids(getManualDenylistPref()).contains(uid)) { + mNetworkPolicyManager.setUidPolicy(uid, POLICY_NONE); + } } } } clearSharedPreferences(); } + /** Reset the POLICY_REJECT_METERED uids when device is boot completed. */ + public void onBootComplete() { + resetDenylistIfNeeded(/* packageName= */ null, /* force= */ true); + syncPolicyIfNeeded(); + } + /** Dump the data stored in the {@link SharedPreferences}. */ public void dump(PrintWriter writer) { writer.println("Dump of DynamicDenylistManager:"); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManagerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManagerTest.java index 06790bf07ff..c29541cfb7b 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManagerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManagerTest.java @@ -393,6 +393,27 @@ public class DynamicDenylistManagerTest { assertThat(dumpResults.contains("DynamicDenylist: null")).isTrue(); } + @Test + public void onBootComplete_resetIntoManualMode() { + initDynamicDenylistManager(new int[] {FAKE_UID_1_INT}); + setDenylist(new ArraySet<>(List.of(FAKE_UID_2_INT))); + // Ensure the testing environment for manual denylist. + assertThat(mManualDenyListPref.getAll()).hasSize(2); + assertTrue(mManualDenyListPref.contains(PREF_KEY_MANUAL_DENYLIST_SYNCED)); + assertTrue(mManualDenyListPref.contains(FAKE_UID_1)); + // Ensure the testing environment for dynamic denylist. + assertThat(mDynamicDenyListPref.getAll()).hasSize(1); + + mDynamicDenylistManager.onBootComplete(); + + // Keep the users set uids in the manual denylist. + assertThat(mManualDenyListPref.getAll()).hasSize(2); + assertTrue(mManualDenyListPref.contains(PREF_KEY_MANUAL_DENYLIST_SYNCED)); + assertTrue(mManualDenyListPref.contains(FAKE_UID_1)); + // Clear the uids in the dynamic denylist. + assertThat(mDynamicDenyListPref.getAll()).isEmpty(); + } + private void initDynamicDenylistManager(int[] preload) { initDynamicDenylistManager(preload, preload); }