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:
@@ -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<BatteryDiffEntry> 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<BatteryDiffEntry> 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<BatteryDiffEntry> entries = mSpinnerPosition == 0
|
||||
? mBatteryDiffData.getAppDiffEntryList()
|
||||
: mBatteryDiffData.getSystemDiffEntryList();
|
||||
final List<BatteryDiffEntry> 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<BatteryDiffEntry> entries = getBatteryDiffEntries();
|
||||
Set<String> 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
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user