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); }