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.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
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user