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

Commit 4c5f8481 authored by mxyyiyi's avatar mxyyiyi
Browse files

Remove nested PreferenceCategory in Battery Usage page.

https://screenshot.googleplex.com/83LwysPKMCRoRoG

Bug: 349652542
Test: atest BatteryUsageBreakdownControllerTest
Flag: EXEMPT for simple fix
Change-Id: If97b5e3de9757b814ad72aa47f6491d29106b8a3
parent 33008bc6
Loading
Loading
Loading
Loading
+3 −4
Original line number Diff line number Diff line
@@ -59,16 +59,15 @@

        <com.android.settingslib.widget.SettingsSpinnerPreference
            android:key="battery_usage_spinner"
            android:order="0"
            settings:isPreferenceVisible="false" />

        <PreferenceCategory
            android:key="app_list"
            android:layout="@layout/preference_category_no_label"
            settings:isPreferenceVisible="false" />
        <!-- App usage preference list will be added here with the order in range [100, 1000). -->

        <com.android.settingslib.widget.FooterPreference
            android:key="battery_usage_footer"
            android:selectable="false"
            android:order="1000"
            settings:isPreferenceVisible="false"
            settings:searchable="false" />

+2 −1
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.settings.fuelgauge.batteryusage;

import android.annotation.Nullable;
import android.content.Context;
import android.text.TextUtils;
import android.view.View;
@@ -37,7 +38,7 @@ class AnomalyAppItemPreference extends PowerGaugePreference {
        setLayoutResource(R.layout.anomaly_app_item_preference);
    }

    void setAnomalyHint(CharSequence anomalyHintText) {
    void setAnomalyHint(@Nullable CharSequence anomalyHintText) {
        if (!TextUtils.equals(mAnomalyHintText, anomalyHintText)) {
            mAnomalyHintText = anomalyHintText;
            notifyChanged();
+39 −38
Original line number Diff line number Diff line
@@ -31,7 +31,6 @@ import android.view.View;
import android.widget.AdapterView;

import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceScreen;

@@ -68,11 +67,11 @@ public class BatteryUsageBreakdownController extends BasePreferenceController
    private static final String ROOT_PREFERENCE_KEY = "battery_usage_breakdown";
    private static final String FOOTER_PREFERENCE_KEY = "battery_usage_footer";
    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 String SLOT_TIMESTAMP = "slot_timestamp";
    private static final String ANOMALY_KEY = "anomaly_key";
    private static final String KEY_SPINNER_POSITION = "spinner_position";
    private static final int ENTRY_PREF_ORDER_OFFSET = 100;
    private static final List<BatteryDiffEntry> EMPTY_ENTRY_LIST = new ArrayList<>();

    private static int sUiMode = Configuration.UI_MODE_NIGHT_UNDEFINED;
@@ -89,8 +88,7 @@ public class BatteryUsageBreakdownController extends BasePreferenceController
    private SettingsSpinnerAdapter<CharSequence> mSpinnerAdapter;

    @VisibleForTesting Context mPrefContext;
    @VisibleForTesting PreferenceCategory mRootPreference;
    @VisibleForTesting PreferenceGroup mAppListPreferenceGroup;
    @VisibleForTesting PreferenceGroup mRootPreferenceGroup;
    @VisibleForTesting FooterPreference mFooterPreference;
    @VisibleForTesting BatteryDiffData mBatteryDiffData;
    @VisibleForTesting String mBatteryUsageBreakdownTitleLastFullChargeText;
@@ -143,7 +141,7 @@ public class BatteryUsageBreakdownController extends BasePreferenceController
    public void onDestroy() {
        mHandler.removeCallbacksAndMessages(/* token= */ null);
        mPreferenceCache.clear();
        mAppListPreferenceGroup.removeAll();
        mRootPreferenceGroup.removeAll();
    }

    @Override
@@ -226,9 +224,8 @@ public class BatteryUsageBreakdownController extends BasePreferenceController
    public void displayPreference(PreferenceScreen screen) {
        super.displayPreference(screen);
        mPrefContext = screen.getContext();
        mRootPreference = screen.findPreference(ROOT_PREFERENCE_KEY);
        mRootPreferenceGroup = screen.findPreference(ROOT_PREFERENCE_KEY);
        mSpinnerPreference = screen.findPreference(SPINNER_PREFERENCE_KEY);
        mAppListPreferenceGroup = screen.findPreference(APP_LIST_PREFERENCE_KEY);
        mFooterPreference = screen.findPreference(FOOTER_PREFERENCE_KEY);
        mBatteryUsageBreakdownTitleLastFullChargeText =
                mPrefContext.getString(
@@ -242,7 +239,7 @@ public class BatteryUsageBreakdownController extends BasePreferenceController
                        R.string.battery_usage_less_than_percent_content_description,
                        formatPercentage);

        mAppListPreferenceGroup.setOrderingAsAdded(false);
        mRootPreferenceGroup.setOrderingAsAdded(false);
        mSpinnerAdapter = new SettingsSpinnerAdapter<>(mPrefContext);
        mSpinnerAdapter.addAll(
                new String[] {
@@ -328,8 +325,9 @@ public class BatteryUsageBreakdownController extends BasePreferenceController
                        : mPrefContext.getString(
                                R.string.battery_usage_breakdown_title_for_slot,
                                accessibilitySlotTimestamp);
        mRootPreference.setTitle(Utils.createAccessibleSequence(displayTitle, accessibilityTitle));
        mRootPreference.setVisible(true);
        mRootPreferenceGroup.setTitle(
                Utils.createAccessibleSequence(displayTitle, accessibilityTitle));
        mRootPreferenceGroup.setVisible(true);
    }

    private void showFooterPreference(boolean isAllBatteryUsageEmpty) {
@@ -350,7 +348,6 @@ public class BatteryUsageBreakdownController extends BasePreferenceController
            return;
        }
        mSpinnerPreference.setVisible(true);
        mAppListPreferenceGroup.setVisible(true);
        mHandler.post(
                () -> {
                    removeAndCacheAllUnusedPreferences();
@@ -374,7 +371,7 @@ public class BatteryUsageBreakdownController extends BasePreferenceController
        }
        final long start = System.currentTimeMillis();
        final List<BatteryDiffEntry> entries = getBatteryDiffEntries();
        int prefIndex = mAppListPreferenceGroup.getPreferenceCount();
        int preferenceOrder = ENTRY_PREF_ORDER_OFFSET;
        for (BatteryDiffEntry entry : entries) {
            boolean isAdded = false;
            final String appLabel = entry.getAppLabel();
@@ -384,33 +381,32 @@ public class BatteryUsageBreakdownController extends BasePreferenceController
                continue;
            }
            final String prefKey = entry.getKey();
            AnomalyAppItemPreference pref = mAppListPreferenceGroup.findPreference(prefKey);
            if (pref != null) {
            AnomalyAppItemPreference preference = mRootPreferenceGroup.findPreference(prefKey);
            if (preference != null) {
                isAdded = true;
            } else {
                pref = (AnomalyAppItemPreference) mPreferenceCache.get(prefKey);
                preference = (AnomalyAppItemPreference) mPreferenceCache.get(prefKey);
            }
            // Creates new instance if cached preference is not found.
            if (pref == null) {
                pref = new AnomalyAppItemPreference(mPrefContext);
                pref.setKey(prefKey);
                mPreferenceCache.put(prefKey, pref);
            }
            pref.setIcon(appIcon);
            pref.setTitle(appLabel);
            pref.setOrder(prefIndex);
            pref.setSingleLineTitle(true);
            if (preference == null) {
                preference = new AnomalyAppItemPreference(mPrefContext);
                preference.setKey(prefKey);
                mPreferenceCache.put(prefKey, preference);
            }
            preference.setIcon(appIcon);
            preference.setTitle(appLabel);
            preference.setOrder(++preferenceOrder);
            preference.setSingleLineTitle(true);
            // Updates App item preference style
            pref.setAnomalyHint(isAnomalyBatteryDiffEntry(entry) ? mAnomalyHintString : null);
            preference.setAnomalyHint(isAnomalyBatteryDiffEntry(entry) ? mAnomalyHintString : null);
            // Sets the BatteryDiffEntry to preference for launching detailed page.
            pref.setBatteryDiffEntry(entry);
            pref.setSelectable(entry.validForRestriction());
            setPreferencePercentage(pref, entry);
            setPreferenceSummary(pref, entry);
            preference.setBatteryDiffEntry(entry);
            preference.setSelectable(entry.validForRestriction());
            setPreferencePercentage(preference, entry);
            setPreferenceSummary(preference, entry);
            if (!isAdded) {
                mAppListPreferenceGroup.addPreference(pref);
                mRootPreferenceGroup.addPreference(preference);
            }
            prefIndex++;
        }
        Log.d(
                TAG,
@@ -424,17 +420,22 @@ public class BatteryUsageBreakdownController extends BasePreferenceController
        List<BatteryDiffEntry> entries = getBatteryDiffEntries();
        Set<String> entryKeySet = new ArraySet<>(entries.size());
        entries.forEach(entry -> entryKeySet.add(entry.getKey()));
        final int prefsCount = mAppListPreferenceGroup.getPreferenceCount();
        for (int index = prefsCount - 1; index >= 0; index--) {
            final Preference pref = mAppListPreferenceGroup.getPreference(index);
            if (entryKeySet.contains(pref.getKey())) {
                // The pref is still used, don't remove.
        final int preferenceCount = mRootPreferenceGroup.getPreferenceCount();
        for (int index = preferenceCount - 1; index >= 0; index--) {
            final Preference preference = mRootPreferenceGroup.getPreference(index);
            if ((preference instanceof SettingsSpinnerPreference)
                    || (preference instanceof FooterPreference)) {
                // Consider the app preference only and skip others
                continue;
            }
            if (!TextUtils.isEmpty(pref.getKey())) {
                mPreferenceCache.put(pref.getKey(), pref);
            if (entryKeySet.contains(preference.getKey())) {
                // Don't remove the preference if it is still in use
                continue;
            }
            if (!TextUtils.isEmpty(preference.getKey())) {
                mPreferenceCache.put(preference.getKey(), preference);
            }
            mAppListPreferenceGroup.removePreference(pref);
            mRootPreferenceGroup.removePreference(preference);
        }
    }

+19 −20
Original line number Diff line number Diff line
@@ -59,11 +59,12 @@ public final class BatteryUsageBreakdownControllerTest {
    private static final String PREF_KEY2 = "pref_key2";
    private static final String PREF_SUMMARY = "fake preference summary";
    private static final String KEY_SPINNER_POSITION = "spinner_position";
    private static final int ENTRY_PREF_ORDER_OFFSET = 100;
    private static final long TIME_LESS_THAN_HALF_MINUTE = DateUtils.MINUTE_IN_MILLIS / 2 - 1;

    @Mock private InstrumentedPreferenceFragment mFragment;
    @Mock private SettingsActivity mSettingsActivity;
    @Mock private PreferenceGroup mAppListPreferenceGroup;
    @Mock private PreferenceGroup mRootPreferenceGroup;
    @Mock private Drawable mDrawable;
    @Mock private BatteryHistEntry mBatteryHistEntry;
    @Mock private AnomalyAppItemPreference mAnomalyAppItemPreference;
@@ -90,7 +91,7 @@ public final class BatteryUsageBreakdownControllerTest {
                .when(mFeatureFactory.powerUsageFeatureProvider)
                .getHideApplicationSet();
        mBatteryUsageBreakdownController = createController();
        mBatteryUsageBreakdownController.mAppListPreferenceGroup = mAppListPreferenceGroup;
        mBatteryUsageBreakdownController.mRootPreferenceGroup = mRootPreferenceGroup;
        mBatteryDiffEntry =
                new BatteryDiffEntry(
                        mContext,
@@ -130,7 +131,7 @@ public final class BatteryUsageBreakdownControllerTest {
        BatteryDiffEntry.sResourceCache.put(
                "fakeBatteryDiffEntryKey",
                new BatteryEntry.NameAndIcon("fakeName", /* icon= */ null, /* iconId= */ 1));
        doReturn(mAnomalyAppItemPreference).when(mAppListPreferenceGroup).findPreference(PREF_KEY);
        doReturn(mAnomalyAppItemPreference).when(mRootPreferenceGroup).findPreference(PREF_KEY);
    }

    @Test
@@ -147,7 +148,7 @@ public final class BatteryUsageBreakdownControllerTest {
    @Test
    public void onDestroy_removeAllPreferenceFromPreferenceGroup() {
        mBatteryUsageBreakdownController.onDestroy();
        verify(mAppListPreferenceGroup).removeAll();
        verify(mRootPreferenceGroup).removeAll();
    }

    @Test
@@ -162,11 +163,11 @@ public final class BatteryUsageBreakdownControllerTest {
    @Test
    public void addAllPreferences_addAllPreferences() {
        final String appLabel = "fake app label";
        doReturn(1).when(mAppListPreferenceGroup).getPreferenceCount();
        doReturn(1).when(mRootPreferenceGroup).getPreferenceCount();
        doReturn(mDrawable).when(mBatteryDiffEntry).getAppIcon();
        doReturn(appLabel).when(mBatteryDiffEntry).getAppLabel();
        doReturn(PREF_KEY).when(mBatteryDiffEntry).getKey();
        doReturn(null).when(mAppListPreferenceGroup).findPreference(PREF_KEY);
        doReturn(null).when(mRootPreferenceGroup).findPreference(PREF_KEY);
        doReturn(false).when(mBatteryDiffEntry).validForRestriction();

        mBatteryUsageBreakdownController.addAllPreferences();
@@ -177,11 +178,11 @@ public final class BatteryUsageBreakdownControllerTest {
                        mBatteryUsageBreakdownController.mPreferenceCache.get(PREF_KEY);
        assertThat(pref).isNotNull();
        // Verifies the added preference configuration.
        verify(mAppListPreferenceGroup).addPreference(pref);
        verify(mRootPreferenceGroup).addPreference(pref);
        assertThat(pref.getKey()).isEqualTo(PREF_KEY);
        assertThat(pref.getTitle().toString()).isEqualTo(appLabel);
        assertThat(pref.getIcon()).isEqualTo(mDrawable);
        assertThat(pref.getOrder()).isEqualTo(1);
        assertThat(pref.getOrder()).isEqualTo(ENTRY_PREF_ORDER_OFFSET + 1);
        assertThat(pref.getBatteryDiffEntry()).isSameInstanceAs(mBatteryDiffEntry);
        assertThat(pref.isSingleLineTitle()).isTrue();
        assertThat(pref.isSelectable()).isFalse();
@@ -190,20 +191,20 @@ public final class BatteryUsageBreakdownControllerTest {
    @Test
    public void addPreferenceToScreen_alreadyInScreen_notAddPreferenceAgain() {
        final String appLabel = "fake app label";
        doReturn(1).when(mAppListPreferenceGroup).getPreferenceCount();
        doReturn(1).when(mRootPreferenceGroup).getPreferenceCount();
        doReturn(mDrawable).when(mBatteryDiffEntry).getAppIcon();
        doReturn(appLabel).when(mBatteryDiffEntry).getAppLabel();
        doReturn(PREF_KEY).when(mBatteryDiffEntry).getKey();

        mBatteryUsageBreakdownController.addAllPreferences();

        verify(mAppListPreferenceGroup, never()).addPreference(any());
        verify(mRootPreferenceGroup, never()).addPreference(any());
    }

    @Test
    public void removeAndCacheAllUnusedPreferences_removePref_buildCacheAndRemoveAllPreference() {
        doReturn(1).when(mAppListPreferenceGroup).getPreferenceCount();
        doReturn(mAnomalyAppItemPreference).when(mAppListPreferenceGroup).getPreference(0);
        doReturn(1).when(mRootPreferenceGroup).getPreferenceCount();
        doReturn(mAnomalyAppItemPreference).when(mRootPreferenceGroup).getPreference(0);
        doReturn(PREF_KEY2).when(mBatteryHistEntry).getKey();
        doReturn(PREF_KEY).when(mAnomalyAppItemPreference).getKey();
        // Ensures the testing data is correct.
@@ -213,13 +214,13 @@ public final class BatteryUsageBreakdownControllerTest {

        assertThat(mBatteryUsageBreakdownController.mPreferenceCache.get(PREF_KEY))
                .isEqualTo(mAnomalyAppItemPreference);
        verify(mAppListPreferenceGroup).removePreference(mAnomalyAppItemPreference);
        verify(mRootPreferenceGroup).removePreference(mAnomalyAppItemPreference);
    }

    @Test
    public void removeAndCacheAllUnusedPreferences_keepPref_KeepAllPreference() {
        doReturn(1).when(mAppListPreferenceGroup).getPreferenceCount();
        doReturn(mAnomalyAppItemPreference).when(mAppListPreferenceGroup).getPreference(0);
        doReturn(1).when(mRootPreferenceGroup).getPreferenceCount();
        doReturn(mAnomalyAppItemPreference).when(mRootPreferenceGroup).getPreference(0);
        doReturn(PREF_KEY).when(mBatteryDiffEntry).getKey();
        doReturn(PREF_KEY).when(mAnomalyAppItemPreference).getKey();
        // Ensures the testing data is correct.
@@ -227,15 +228,13 @@ public final class BatteryUsageBreakdownControllerTest {

        mBatteryUsageBreakdownController.removeAndCacheAllUnusedPreferences();

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

    @Test
    public void handlePreferenceTreeClick_notPowerGaugePreference_returnFalse() {
        assertThat(
                        mBatteryUsageBreakdownController.handlePreferenceTreeClick(
                                mAppListPreferenceGroup))
        assertThat(mBatteryUsageBreakdownController.handlePreferenceTreeClick(mRootPreferenceGroup))
                .isFalse();

        verify(mMetricsFeatureProvider, never())