From c616a6514461d1535f35c8a9025c6c7b262ebd8e Mon Sep 17 00:00:00 2001 From: Zaiyue Xue Date: Wed, 5 Apr 2023 16:40:20 +0800 Subject: [PATCH] Fix b/276423111: Keep unchanged perferences in the app list instead of clear all. Bug: 276423111 Bug: 269203672 Fix: 276423111 Fix: 269203672 Test: manual Change-Id: Ie2cb668ae4c46f5c40eed555510be034be45d713 --- .../BatteryUsageBreakdownController.java | 43 +++++++++++++------ .../BatteryUsageBreakdownControllerTest.java | 27 +++++++++--- 2 files changed, 53 insertions(+), 17 deletions(-) diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java index 0be6c988ec7..2121c60218b 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java @@ -23,6 +23,7 @@ import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Looper; import android.text.TextUtils; +import android.util.ArraySet; import android.util.Log; import android.view.View; import android.widget.AdapterView; @@ -48,9 +49,11 @@ import com.android.settingslib.core.lifecycle.events.OnDestroy; import com.android.settingslib.core.lifecycle.events.OnResume; import com.android.settingslib.widget.FooterPreference; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** Controller for battery usage breakdown preference group. */ public class BatteryUsageBreakdownController extends BasePreferenceController @@ -61,6 +64,7 @@ public class BatteryUsageBreakdownController extends BasePreferenceController private static final String SPINNER_PREFERENCE_KEY = "battery_usage_spinner"; private static final String APP_LIST_PREFERENCE_KEY = "app_list"; private static final String PACKAGE_NAME_NONE = "none"; + private static final List EMPTY_ENTRY_LIST = new ArrayList<>(); private static int sUiMode = Configuration.UI_MODE_NIGHT_UNDEFINED; @@ -183,7 +187,7 @@ public class BatteryUsageBreakdownController extends BasePreferenceController if (mSpinnerPosition != position) { mSpinnerPosition = position; mHandler.post(() -> { - removeAndCacheAllPreferences(); + removeAndCacheAllUnusedPreferences(); addAllPreferences(); mMetricsFeatureProvider.action( mPrefContext, @@ -238,27 +242,34 @@ public class BatteryUsageBreakdownController extends BasePreferenceController private void showSpinnerAndAppList() { if (mBatteryDiffData == null) { mHandler.post(() -> { - removeAndCacheAllPreferences(); + removeAndCacheAllUnusedPreferences(); }); return; } mSpinnerPreference.setVisible(true); mAppListPreferenceGroup.setVisible(true); mHandler.post(() -> { - removeAndCacheAllPreferences(); + removeAndCacheAllUnusedPreferences(); addAllPreferences(); }); } + private List getBatteryDiffEntries() { + if (mBatteryDiffData == null) { + return EMPTY_ENTRY_LIST; + } + return mSpinnerPosition == 0 + ? mBatteryDiffData.getAppDiffEntryList() + : mBatteryDiffData.getSystemDiffEntryList(); + } + @VisibleForTesting void addAllPreferences() { if (mBatteryDiffData == null) { return; } final long start = System.currentTimeMillis(); - final List entries = mSpinnerPosition == 0 - ? mBatteryDiffData.getAppDiffEntryList() - : mBatteryDiffData.getSystemDiffEntryList(); + final List entries = getBatteryDiffEntries(); int prefIndex = mAppListPreferenceGroup.getPreferenceCount(); for (BatteryDiffEntry entry : entries) { boolean isAdded = false; @@ -272,7 +283,6 @@ public class BatteryUsageBreakdownController extends BasePreferenceController PowerGaugePreference pref = mAppListPreferenceGroup.findPreference(prefKey); if (pref != null) { isAdded = true; - Log.w(TAG, "preference should be removed for:" + entry.getPackageName()); } else { pref = (PowerGaugePreference) mPreferenceCache.get(prefKey); } @@ -301,16 +311,25 @@ public class BatteryUsageBreakdownController extends BasePreferenceController } @VisibleForTesting - void removeAndCacheAllPreferences() { + void removeAndCacheAllUnusedPreferences() { + List entries = getBatteryDiffEntries(); + Set entryKeySet = new ArraySet<>(); + for (BatteryDiffEntry entry : entries) { + entryKeySet.add(entry.getKey()); + } + final int prefsCount = mAppListPreferenceGroup.getPreferenceCount(); - for (int index = 0; index < prefsCount; index++) { + for (int index = prefsCount - 1; index >= 0; index--) { final Preference pref = mAppListPreferenceGroup.getPreference(index); - if (TextUtils.isEmpty(pref.getKey())) { + if (entryKeySet.contains(pref.getKey())) { + // The pref is still used, don't remove. continue; } - mPreferenceCache.put(pref.getKey(), pref); + if (!TextUtils.isEmpty(pref.getKey())) { + mPreferenceCache.put(pref.getKey(), pref); + } + mAppListPreferenceGroup.removePreference(pref); } - mAppListPreferenceGroup.removeAll(); } @VisibleForTesting diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java index 37f05bc0d8a..16fec0909e0 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java @@ -55,6 +55,7 @@ import java.util.TimeZone; @RunWith(RobolectricTestRunner.class) public final class BatteryUsageBreakdownControllerTest { private static final String PREF_KEY = "pref_key"; + private static final String PREF_KEY2 = "pref_key2"; private static final String PREF_SUMMARY = "fake preference summary"; @Mock @@ -175,7 +176,24 @@ public final class BatteryUsageBreakdownControllerTest { } @Test - public void removeAndCacheAllPreferences_buildCacheAndRemoveAllPreference() { + public void removeAndCacheAllUnusedPreferences_removePerf_buildCacheAndRemoveAllPreference() { + doReturn(1).when(mAppListPreferenceGroup).getPreferenceCount(); + doReturn(mPowerGaugePreference).when(mAppListPreferenceGroup).getPreference(0); + doReturn(PREF_KEY2).when(mBatteryHistEntry).getKey(); + doReturn(PREF_KEY).when(mPowerGaugePreference).getKey(); + doReturn(mPowerGaugePreference).when(mAppListPreferenceGroup).findPreference(PREF_KEY); + // Ensures the testing data is correct. + assertThat(mBatteryUsageBreakdownController.mPreferenceCache).isEmpty(); + + mBatteryUsageBreakdownController.removeAndCacheAllUnusedPreferences(); + + assertThat(mBatteryUsageBreakdownController.mPreferenceCache.get(PREF_KEY)) + .isEqualTo(mPowerGaugePreference); + verify(mAppListPreferenceGroup).removePreference(mPowerGaugePreference); + } + + @Test + public void removeAndCacheAllUnusedPreferences_keepPerf_KeepAllPreference() { doReturn(1).when(mAppListPreferenceGroup).getPreferenceCount(); doReturn(mPowerGaugePreference).when(mAppListPreferenceGroup).getPreference(0); doReturn(PREF_KEY).when(mBatteryHistEntry).getKey(); @@ -184,11 +202,10 @@ public final class BatteryUsageBreakdownControllerTest { // Ensures the testing data is correct. assertThat(mBatteryUsageBreakdownController.mPreferenceCache).isEmpty(); - mBatteryUsageBreakdownController.removeAndCacheAllPreferences(); + mBatteryUsageBreakdownController.removeAndCacheAllUnusedPreferences(); - assertThat(mBatteryUsageBreakdownController.mPreferenceCache.get(PREF_KEY)) - .isEqualTo(mPowerGaugePreference); - verify(mAppListPreferenceGroup).removeAll(); + verify(mAppListPreferenceGroup, never()).removePreference(any()); + assertThat(mBatteryUsageBreakdownController.mPreferenceCache).isEmpty(); } @Test