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
This commit is contained in:
Zaiyue Xue
2023-04-05 16:40:20 +08:00
parent 222a89acc1
commit c616a65144
2 changed files with 53 additions and 17 deletions

View File

@@ -23,6 +23,7 @@ import android.graphics.drawable.Drawable;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.ArraySet;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
import android.widget.AdapterView; 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.core.lifecycle.events.OnResume;
import com.android.settingslib.widget.FooterPreference; import com.android.settingslib.widget.FooterPreference;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
/** Controller for battery usage breakdown preference group. */ /** Controller for battery usage breakdown preference group. */
public class BatteryUsageBreakdownController extends BasePreferenceController 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 SPINNER_PREFERENCE_KEY = "battery_usage_spinner";
private static final String APP_LIST_PREFERENCE_KEY = "app_list"; private static final String APP_LIST_PREFERENCE_KEY = "app_list";
private static final String PACKAGE_NAME_NONE = "none"; private static final String PACKAGE_NAME_NONE = "none";
private static final List<BatteryDiffEntry> EMPTY_ENTRY_LIST = new ArrayList<>();
private static int sUiMode = Configuration.UI_MODE_NIGHT_UNDEFINED; private static int sUiMode = Configuration.UI_MODE_NIGHT_UNDEFINED;
@@ -183,7 +187,7 @@ public class BatteryUsageBreakdownController extends BasePreferenceController
if (mSpinnerPosition != position) { if (mSpinnerPosition != position) {
mSpinnerPosition = position; mSpinnerPosition = position;
mHandler.post(() -> { mHandler.post(() -> {
removeAndCacheAllPreferences(); removeAndCacheAllUnusedPreferences();
addAllPreferences(); addAllPreferences();
mMetricsFeatureProvider.action( mMetricsFeatureProvider.action(
mPrefContext, mPrefContext,
@@ -238,27 +242,34 @@ public class BatteryUsageBreakdownController extends BasePreferenceController
private void showSpinnerAndAppList() { private void showSpinnerAndAppList() {
if (mBatteryDiffData == null) { if (mBatteryDiffData == null) {
mHandler.post(() -> { mHandler.post(() -> {
removeAndCacheAllPreferences(); removeAndCacheAllUnusedPreferences();
}); });
return; return;
} }
mSpinnerPreference.setVisible(true); mSpinnerPreference.setVisible(true);
mAppListPreferenceGroup.setVisible(true); mAppListPreferenceGroup.setVisible(true);
mHandler.post(() -> { mHandler.post(() -> {
removeAndCacheAllPreferences(); removeAndCacheAllUnusedPreferences();
addAllPreferences(); addAllPreferences();
}); });
} }
private List<BatteryDiffEntry> getBatteryDiffEntries() {
if (mBatteryDiffData == null) {
return EMPTY_ENTRY_LIST;
}
return mSpinnerPosition == 0
? mBatteryDiffData.getAppDiffEntryList()
: mBatteryDiffData.getSystemDiffEntryList();
}
@VisibleForTesting @VisibleForTesting
void addAllPreferences() { void addAllPreferences() {
if (mBatteryDiffData == null) { if (mBatteryDiffData == null) {
return; return;
} }
final long start = System.currentTimeMillis(); final long start = System.currentTimeMillis();
final List<BatteryDiffEntry> entries = mSpinnerPosition == 0 final List<BatteryDiffEntry> entries = getBatteryDiffEntries();
? mBatteryDiffData.getAppDiffEntryList()
: mBatteryDiffData.getSystemDiffEntryList();
int prefIndex = mAppListPreferenceGroup.getPreferenceCount(); int prefIndex = mAppListPreferenceGroup.getPreferenceCount();
for (BatteryDiffEntry entry : entries) { for (BatteryDiffEntry entry : entries) {
boolean isAdded = false; boolean isAdded = false;
@@ -272,7 +283,6 @@ public class BatteryUsageBreakdownController extends BasePreferenceController
PowerGaugePreference pref = mAppListPreferenceGroup.findPreference(prefKey); PowerGaugePreference pref = mAppListPreferenceGroup.findPreference(prefKey);
if (pref != null) { if (pref != null) {
isAdded = true; isAdded = true;
Log.w(TAG, "preference should be removed for:" + entry.getPackageName());
} else { } else {
pref = (PowerGaugePreference) mPreferenceCache.get(prefKey); pref = (PowerGaugePreference) mPreferenceCache.get(prefKey);
} }
@@ -301,16 +311,25 @@ public class BatteryUsageBreakdownController extends BasePreferenceController
} }
@VisibleForTesting @VisibleForTesting
void removeAndCacheAllPreferences() { void removeAndCacheAllUnusedPreferences() {
List<BatteryDiffEntry> entries = getBatteryDiffEntries();
Set<String> entryKeySet = new ArraySet<>();
for (BatteryDiffEntry entry : entries) {
entryKeySet.add(entry.getKey());
}
final int prefsCount = mAppListPreferenceGroup.getPreferenceCount(); 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); 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; continue;
} }
mPreferenceCache.put(pref.getKey(), pref); if (!TextUtils.isEmpty(pref.getKey())) {
mPreferenceCache.put(pref.getKey(), pref);
}
mAppListPreferenceGroup.removePreference(pref);
} }
mAppListPreferenceGroup.removeAll();
} }
@VisibleForTesting @VisibleForTesting

View File

@@ -55,6 +55,7 @@ import java.util.TimeZone;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public final class BatteryUsageBreakdownControllerTest { public final class BatteryUsageBreakdownControllerTest {
private static final String PREF_KEY = "pref_key"; 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"; private static final String PREF_SUMMARY = "fake preference summary";
@Mock @Mock
@@ -175,7 +176,24 @@ public final class BatteryUsageBreakdownControllerTest {
} }
@Test @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(1).when(mAppListPreferenceGroup).getPreferenceCount();
doReturn(mPowerGaugePreference).when(mAppListPreferenceGroup).getPreference(0); doReturn(mPowerGaugePreference).when(mAppListPreferenceGroup).getPreference(0);
doReturn(PREF_KEY).when(mBatteryHistEntry).getKey(); doReturn(PREF_KEY).when(mBatteryHistEntry).getKey();
@@ -184,11 +202,10 @@ public final class BatteryUsageBreakdownControllerTest {
// Ensures the testing data is correct. // Ensures the testing data is correct.
assertThat(mBatteryUsageBreakdownController.mPreferenceCache).isEmpty(); assertThat(mBatteryUsageBreakdownController.mPreferenceCache).isEmpty();
mBatteryUsageBreakdownController.removeAndCacheAllPreferences(); mBatteryUsageBreakdownController.removeAndCacheAllUnusedPreferences();
assertThat(mBatteryUsageBreakdownController.mPreferenceCache.get(PREF_KEY)) verify(mAppListPreferenceGroup, never()).removePreference(any());
.isEqualTo(mPowerGaugePreference); assertThat(mBatteryUsageBreakdownController.mPreferenceCache).isEmpty();
verify(mAppListPreferenceGroup).removeAll();
} }
@Test @Test