Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c616a651 authored by Zaiyue Xue's avatar Zaiyue Xue
Browse files

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
parent 222a89ac
Loading
Loading
Loading
Loading
+31 −12
Original line number Diff line number Diff line
@@ -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;
            }
            if (!TextUtils.isEmpty(pref.getKey())) {
                mPreferenceCache.put(pref.getKey(), pref);
            }
        mAppListPreferenceGroup.removeAll();
            mAppListPreferenceGroup.removePreference(pref);
        }
    }

    @VisibleForTesting
+21 −4
Original line number Diff line number Diff line
@@ -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,20 +176,36 @@ 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_KEY).when(mBatteryHistEntry).getKey();
        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.removeAndCacheAllPreferences();
        mBatteryUsageBreakdownController.removeAndCacheAllUnusedPreferences();

        assertThat(mBatteryUsageBreakdownController.mPreferenceCache.get(PREF_KEY))
                .isEqualTo(mPowerGaugePreference);
        verify(mAppListPreferenceGroup).removeAll();
        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();
        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();

        verify(mAppListPreferenceGroup, never()).removePreference(any());
        assertThat(mBatteryUsageBreakdownController.mPreferenceCache).isEmpty();
    }

    @Test