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

Commit 9a18d2f1 authored by Xinyi Mao's avatar Xinyi Mao Committed by Android (Google) Code Review
Browse files

Merge "Remove nested PreferenceCategory in Battery Usage page." into main

parents ec1017c0 4c5f8481
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())