Loading res/xml/power_usage_advanced.xml +3 −4 Original line number Diff line number Diff line Loading @@ -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" /> Loading src/com/android/settings/fuelgauge/batteryusage/AnomalyAppItemPreference.java +2 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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(); Loading src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java +39 −38 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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; Loading Loading @@ -143,7 +141,7 @@ public class BatteryUsageBreakdownController extends BasePreferenceController public void onDestroy() { mHandler.removeCallbacksAndMessages(/* token= */ null); mPreferenceCache.clear(); mAppListPreferenceGroup.removeAll(); mRootPreferenceGroup.removeAll(); } @Override Loading Loading @@ -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( Loading @@ -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[] { Loading Loading @@ -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) { Loading @@ -350,7 +348,6 @@ public class BatteryUsageBreakdownController extends BasePreferenceController return; } mSpinnerPreference.setVisible(true); mAppListPreferenceGroup.setVisible(true); mHandler.post( () -> { removeAndCacheAllUnusedPreferences(); Loading @@ -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(); Loading @@ -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, Loading @@ -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); } } Loading tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java +19 −20 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -90,7 +91,7 @@ public final class BatteryUsageBreakdownControllerTest { .when(mFeatureFactory.powerUsageFeatureProvider) .getHideApplicationSet(); mBatteryUsageBreakdownController = createController(); mBatteryUsageBreakdownController.mAppListPreferenceGroup = mAppListPreferenceGroup; mBatteryUsageBreakdownController.mRootPreferenceGroup = mRootPreferenceGroup; mBatteryDiffEntry = new BatteryDiffEntry( mContext, Loading Loading @@ -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 Loading @@ -147,7 +148,7 @@ public final class BatteryUsageBreakdownControllerTest { @Test public void onDestroy_removeAllPreferenceFromPreferenceGroup() { mBatteryUsageBreakdownController.onDestroy(); verify(mAppListPreferenceGroup).removeAll(); verify(mRootPreferenceGroup).removeAll(); } @Test Loading @@ -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(); Loading @@ -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(); Loading @@ -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. Loading @@ -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. Loading @@ -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()) Loading Loading
res/xml/power_usage_advanced.xml +3 −4 Original line number Diff line number Diff line Loading @@ -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" /> Loading
src/com/android/settings/fuelgauge/batteryusage/AnomalyAppItemPreference.java +2 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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(); Loading
src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownController.java +39 −38 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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; Loading Loading @@ -143,7 +141,7 @@ public class BatteryUsageBreakdownController extends BasePreferenceController public void onDestroy() { mHandler.removeCallbacksAndMessages(/* token= */ null); mPreferenceCache.clear(); mAppListPreferenceGroup.removeAll(); mRootPreferenceGroup.removeAll(); } @Override Loading Loading @@ -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( Loading @@ -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[] { Loading Loading @@ -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) { Loading @@ -350,7 +348,6 @@ public class BatteryUsageBreakdownController extends BasePreferenceController return; } mSpinnerPreference.setVisible(true); mAppListPreferenceGroup.setVisible(true); mHandler.post( () -> { removeAndCacheAllUnusedPreferences(); Loading @@ -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(); Loading @@ -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, Loading @@ -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); } } Loading
tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryUsageBreakdownControllerTest.java +19 −20 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -90,7 +91,7 @@ public final class BatteryUsageBreakdownControllerTest { .when(mFeatureFactory.powerUsageFeatureProvider) .getHideApplicationSet(); mBatteryUsageBreakdownController = createController(); mBatteryUsageBreakdownController.mAppListPreferenceGroup = mAppListPreferenceGroup; mBatteryUsageBreakdownController.mRootPreferenceGroup = mRootPreferenceGroup; mBatteryDiffEntry = new BatteryDiffEntry( mContext, Loading Loading @@ -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 Loading @@ -147,7 +148,7 @@ public final class BatteryUsageBreakdownControllerTest { @Test public void onDestroy_removeAllPreferenceFromPreferenceGroup() { mBatteryUsageBreakdownController.onDestroy(); verify(mAppListPreferenceGroup).removeAll(); verify(mRootPreferenceGroup).removeAll(); } @Test Loading @@ -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(); Loading @@ -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(); Loading @@ -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. Loading @@ -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. Loading @@ -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()) Loading