From d0086188d204c8c24834c03bef5e3578ecaaa509 Mon Sep 17 00:00:00 2001 From: jackqdyulei Date: Tue, 27 Feb 2018 14:12:32 -0800 Subject: [PATCH 1/3] Change current PowerUsageAdvanced to legacy code In future cl, we will create new PowerUsageAdvanced page. Bug: 73300636 Test: Build Change-Id: I608f6b1fb9bf29a6ef5d7f9d67bcb6eea9e7aec7 Merged-In: I608f6b1fb9bf29a6ef5d7f9d67bcb6eea9e7aec7 --- ..._advanced.xml => power_usage_advanced_legacy.xml} | 6 +++--- ...geAdvanced.java => PowerUsageAdvancedLegacy.java} | 12 ++++++------ .../settings/fuelgauge/PowerUsageSummaryLegacy.java | 2 +- .../search/SearchIndexableResourcesImpl.java | 4 ++-- ...edTest.java => PowerUsageAdvancedLegacyTest.java} | 11 +++++------ 5 files changed, 17 insertions(+), 18 deletions(-) rename res/xml/{power_usage_advanced.xml => power_usage_advanced_legacy.xml} (88%) rename src/com/android/settings/fuelgauge/{PowerUsageAdvanced.java => PowerUsageAdvancedLegacy.java} (98%) rename tests/robotests/src/com/android/settings/fuelgauge/{PowerUsageAdvancedTest.java => PowerUsageAdvancedLegacyTest.java} (98%) diff --git a/res/xml/power_usage_advanced.xml b/res/xml/power_usage_advanced_legacy.xml similarity index 88% rename from res/xml/power_usage_advanced.xml rename to res/xml/power_usage_advanced_legacy.xml index b31eb403db1..26be727c038 100644 --- a/res/xml/power_usage_advanced.xml +++ b/res/xml/power_usage_advanced_legacy.xml @@ -17,15 +17,15 @@ + android:key="battery_graph_legacy"/> diff --git a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java b/src/com/android/settings/fuelgauge/PowerUsageAdvancedLegacy.java similarity index 98% rename from src/com/android/settings/fuelgauge/PowerUsageAdvanced.java rename to src/com/android/settings/fuelgauge/PowerUsageAdvancedLegacy.java index 2e94e2c74bc..a4e3fefeea7 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java +++ b/src/com/android/settings/fuelgauge/PowerUsageAdvancedLegacy.java @@ -42,7 +42,7 @@ import com.android.internal.os.BatteryStatsHelper; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.datausage.DataUsageUtils; -import com.android.settings.fuelgauge.PowerUsageAdvanced.PowerUsageData.UsageType; +import com.android.settings.fuelgauge.PowerUsageAdvancedLegacy.PowerUsageData.UsageType; import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.core.AbstractPreferenceController; @@ -57,10 +57,10 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -public class PowerUsageAdvanced extends PowerUsageBase { +public class PowerUsageAdvancedLegacy extends PowerUsageBase { private static final String TAG = "AdvancedBatteryUsage"; - private static final String KEY_BATTERY_GRAPH = "battery_graph"; - private static final String KEY_BATTERY_USAGE_LIST = "battery_usage_list"; + private static final String KEY_BATTERY_GRAPH = "battery_graph_legacy"; + private static final String KEY_BATTERY_USAGE_LIST = "battery_usage_list_legacy"; private static final int STATUS_TYPE = BatteryStats.STATS_SINCE_CHARGED; @VisibleForTesting @@ -163,7 +163,7 @@ public class PowerUsageAdvanced extends PowerUsageBase { @Override protected int getPreferenceScreenResId() { - return R.xml.power_usage_advanced; + return R.xml.power_usage_advanced_legacy; } @Override @@ -477,7 +477,7 @@ public class PowerUsageAdvanced extends PowerUsageBase { public List getXmlResourcesToIndex( Context context, boolean enabled) { final SearchIndexableResource sir = new SearchIndexableResource(context); - sir.xmlResId = R.xml.power_usage_advanced; + sir.xmlResId = R.xml.power_usage_advanced_legacy; return Arrays.asList(sir); } }; diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java b/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java index 79425cb6b28..d321bb76f57 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java +++ b/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java @@ -415,7 +415,7 @@ public class PowerUsageSummaryLegacy extends PowerUsageBase implements private void performBatteryHeaderClick() { if (mPowerFeatureProvider.isAdvancedUiEnabled()) { new SubSettingLauncher(getContext()) - .setDestination(PowerUsageAdvanced.class.getName()) + .setDestination(PowerUsageAdvancedLegacy.class.getName()) .setSourceMetricsCategory(getMetricsCategory()) .setTitle(R.string.advanced_battery_title) .launch(); diff --git a/src/com/android/settings/search/SearchIndexableResourcesImpl.java b/src/com/android/settings/search/SearchIndexableResourcesImpl.java index 87c2a9107b7..b9f4db2d017 100644 --- a/src/com/android/settings/search/SearchIndexableResourcesImpl.java +++ b/src/com/android/settings/search/SearchIndexableResourcesImpl.java @@ -49,8 +49,8 @@ import com.android.settings.display.NightDisplaySettings; import com.android.settings.display.ScreenZoomSettings; import com.android.settings.dream.DreamSettings; import com.android.settings.enterprise.EnterprisePrivacySettings; +import com.android.settings.fuelgauge.PowerUsageAdvancedLegacy; import com.android.settings.fuelgauge.batterysaver.BatterySaverSettings; -import com.android.settings.fuelgauge.PowerUsageAdvanced; import com.android.settings.fuelgauge.PowerUsageSummary; import com.android.settings.fuelgauge.SmartBatterySettings; import com.android.settings.gestures.AssistGestureSettings; @@ -121,7 +121,7 @@ public class SearchIndexableResourcesImpl implements SearchIndexableResources { addIndex(SoundSettings.class); addIndex(ZenModeSettings.class); addIndex(StorageSettings.class); - addIndex(PowerUsageAdvanced.class); + addIndex(PowerUsageAdvancedLegacy.class); addIndex(DefaultAppSettings.class); addIndex(ManageAssist.class); addIndex(SpecialAccessSettings.class); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedLegacyTest.java similarity index 98% rename from tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java rename to tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedLegacyTest.java index 81d40a36ac4..756d9137e19 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedLegacyTest.java @@ -41,10 +41,10 @@ import com.android.internal.os.BatterySipper.DrainType; import com.android.internal.os.BatteryStatsHelper; import com.android.settings.R; import com.android.settings.Utils; -import com.android.settings.fuelgauge.PowerUsageAdvanced.PowerUsageData; -import com.android.settings.fuelgauge.PowerUsageAdvanced.PowerUsageData.UsageType; import com.android.settings.testutils.BatteryTestUtils; import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.fuelgauge.PowerUsageAdvancedLegacy.PowerUsageData; +import com.android.settings.fuelgauge.PowerUsageAdvancedLegacy.PowerUsageData.UsageType; import org.junit.Before; import org.junit.Test; @@ -59,8 +59,7 @@ import java.util.Collections; import java.util.List; @RunWith(SettingsRobolectricTestRunner.class) -public class PowerUsageAdvancedTest { - +public class PowerUsageAdvancedLegacyTest { private static final int FAKE_UID_1 = 50; private static final int FAKE_UID_2 = 100; private static final int DISCHARGE_AMOUNT = 60; @@ -94,7 +93,7 @@ public class PowerUsageAdvancedTest { private UserInfo mNormalUserInfo; @Mock private UserInfo mManagedUserInfo; - private PowerUsageAdvanced mPowerUsageAdvanced; + private PowerUsageAdvancedLegacy mPowerUsageAdvanced; private PowerUsageData mPowerUsageData; private Context mShadowContext; private Intent mDischargingBatteryIntent; @@ -103,7 +102,7 @@ public class PowerUsageAdvancedTest { public void setUp() { MockitoAnnotations.initMocks(this); mShadowContext = spy(RuntimeEnvironment.application); - mPowerUsageAdvanced = spy(new PowerUsageAdvanced()); + mPowerUsageAdvanced = spy(new PowerUsageAdvancedLegacy()); List batterySippers = new ArrayList<>(); batterySippers.add(new BatterySipper(DrainType.APP, From 31a59604243f19f14d852f8cb54a3a1febf9f051 Mon Sep 17 00:00:00 2001 From: jackqdyulei Date: Tue, 27 Feb 2018 14:30:57 -0800 Subject: [PATCH 2/3] Create new PowerUsageAdvanced page This page contains the graph at the top and app list at the bottom In this cl, we reused some part of the code in PowerUsageAdvancedLegacy to construct the graph, and also used controller to construct the app list(So glad that we extracted it to controller before..) Bug: 73300636 Test: RunSettingsRoboTests Change-Id: I30afbc0327a5186f8280f5e3678330b363e2dc0d Merged-In: I30afbc0327a5186f8280f5e3678330b363e2dc0d --- res/xml/power_usage_advanced.xml | 31 +++ res/xml/power_usage_summary.xml | 4 - .../BatteryAppListPreferenceController.java | 13 +- .../fuelgauge/PowerUsageAdvanced.java | 176 ++++++++++++++++++ .../settings/fuelgauge/PowerUsageSummary.java | 9 - ...atteryAppListPreferenceControllerTest.java | 14 -- .../fuelgauge/PowerUsageAdvancedTest.java | 111 +++++++++++ 7 files changed, 327 insertions(+), 31 deletions(-) create mode 100644 res/xml/power_usage_advanced.xml create mode 100644 src/com/android/settings/fuelgauge/PowerUsageAdvanced.java create mode 100644 tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java diff --git a/res/xml/power_usage_advanced.xml b/res/xml/power_usage_advanced.xml new file mode 100644 index 00000000000..d32611ce969 --- /dev/null +++ b/res/xml/power_usage_advanced.xml @@ -0,0 +1,31 @@ + + + + + + + + + + diff --git a/res/xml/power_usage_summary.xml b/res/xml/power_usage_summary.xml index d89653ae5ce..ac96151557e 100644 --- a/res/xml/power_usage_summary.xml +++ b/res/xml/power_usage_summary.xml @@ -66,8 +66,4 @@ - - diff --git a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java index 3ba5ee47fc0..5028264b596 100644 --- a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java +++ b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java @@ -149,7 +149,7 @@ public class BatteryAppListPreferenceController extends AbstractPreferenceContro @Override public boolean isAvailable() { - return FeatureFlagUtils.isEnabled(mContext, FeatureFlags.BATTERY_DISPLAY_APP_LIST); + return true; } @Override @@ -186,12 +186,17 @@ public class BatteryAppListPreferenceController extends AbstractPreferenceContro } } - public void refreshAppListGroup(BatteryStatsHelper statsHelper, boolean showAllApps, - CharSequence timeSequence) { + public void refreshAppListGroup(BatteryStatsHelper statsHelper, boolean showAllApps) { if (!isAvailable()) { return; } + mBatteryStatsHelper = statsHelper; + final long lastFullChargeTime = mBatteryUtils.calculateLastFullChargeTime( + mBatteryStatsHelper, System.currentTimeMillis()); + final CharSequence timeSequence = StringUtil.formatRelativeTime(mContext, + lastFullChargeTime, + false); final int resId = showAllApps ? R.string.power_usage_list_summary_device : R.string.power_usage_list_summary; mAppListGroup.setTitle(TextUtils.expandTemplate(mContext.getText(resId), timeSequence)); @@ -361,7 +366,7 @@ public class BatteryAppListPreferenceController extends AbstractPreferenceContro final long usageTimeMs = sipper.usageTimeMs; if (usageTimeMs >= DateUtils.MINUTE_IN_MILLIS) { final CharSequence timeSequence = - StringUtil.formatElapsedTime(mContext, usageTimeMs, false); + StringUtil.formatElapsedTime(mContext, usageTimeMs, false); preference.setSummary( (sipper.drainType != DrainType.APP || mBatteryUtils.shouldHideSipper(sipper)) ? timeSequence diff --git a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java new file mode 100644 index 00000000000..89f66bd8806 --- /dev/null +++ b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java @@ -0,0 +1,176 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ +package com.android.settings.fuelgauge; + +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.BatteryManager; +import android.os.Bundle; +import android.provider.SearchIndexableResource; +import android.support.annotation.VisibleForTesting; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; + +import com.android.internal.logging.nano.MetricsProto; +import com.android.settings.R; +import com.android.settings.SettingsActivity; +import com.android.settings.overlay.FeatureFactory; +import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.utils.StringUtil; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class PowerUsageAdvanced extends PowerUsageBase { + private static final String TAG = "AdvancedBatteryUsage"; + private static final String KEY_BATTERY_GRAPH = "battery_graph"; + private static final String KEY_APP_LIST = "app_list"; + private static final String KEY_SHOW_ALL_APPS = "show_all_apps"; + @VisibleForTesting + static final int MENU_TOGGLE_APPS = Menu.FIRST + 1; + + @VisibleForTesting + BatteryHistoryPreference mHistPref; + private BatteryUtils mBatteryUtils; + private PowerUsageFeatureProvider mPowerUsageFeatureProvider; + private BatteryAppListPreferenceController mBatteryAppListPreferenceController; + @VisibleForTesting + boolean mShowAllApps = false; + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + final Context context = getContext(); + + mHistPref = (BatteryHistoryPreference) findPreference(KEY_BATTERY_GRAPH); + mPowerUsageFeatureProvider = FeatureFactory.getFactory(context) + .getPowerUsageFeatureProvider(context); + mBatteryUtils = BatteryUtils.getInstance(context); + + // init the summary so other preferences won't have unnecessary move + updateHistPrefSummary(context); + restoreSavedInstance(icicle); + } + + @Override + public void onDestroy() { + super.onDestroy(); + if (getActivity().isChangingConfigurations()) { + BatteryEntry.clearUidCache(); + } + } + + @Override + public int getMetricsCategory() { + return MetricsProto.MetricsEvent.FUELGAUGE_BATTERY_HISTORY_DETAIL; + } + + @Override + protected String getLogTag() { + return TAG; + } + + @Override + protected int getPreferenceScreenResId() { + return R.xml.power_usage_advanced; + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + menu.add(Menu.NONE, MENU_TOGGLE_APPS, Menu.NONE, + mShowAllApps ? R.string.hide_extra_apps : R.string.show_all_apps); + super.onCreateOptionsMenu(menu, inflater); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case MENU_TOGGLE_APPS: + mShowAllApps = !mShowAllApps; + item.setTitle(mShowAllApps ? R.string.hide_extra_apps : R.string.show_all_apps); + mMetricsFeatureProvider.action(getContext(), + MetricsProto.MetricsEvent.ACTION_SETTINGS_MENU_BATTERY_APPS_TOGGLE, + mShowAllApps); + restartBatteryStatsLoader(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + + @VisibleForTesting + void restoreSavedInstance(Bundle savedInstance) { + if (savedInstance != null) { + mShowAllApps = savedInstance.getBoolean(KEY_SHOW_ALL_APPS, false); + } + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putBoolean(KEY_SHOW_ALL_APPS, mShowAllApps); + } + + @Override + protected List createPreferenceControllers(Context context) { + final List controllers = new ArrayList<>(); + + mBatteryAppListPreferenceController = new BatteryAppListPreferenceController(context, + KEY_APP_LIST, getLifecycle(), (SettingsActivity) getActivity(), this); + controllers.add(mBatteryAppListPreferenceController); + + return controllers; + } + + @Override + protected void refreshUi() { + final Context context = getContext(); + if (context == null) { + return; + } + updatePreference(mHistPref); + updateHistPrefSummary(context); + + mBatteryAppListPreferenceController.refreshAppListGroup(mStatsHelper, mShowAllApps); + } + + private void updateHistPrefSummary(Context context) { + Intent batteryIntent = + context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); + final boolean plugged = batteryIntent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1) != 0; + + if (mPowerUsageFeatureProvider.isEnhancedBatteryPredictionEnabled(context) && !plugged) { + mHistPref.setBottomSummary( + mPowerUsageFeatureProvider.getAdvancedUsageScreenInfoString()); + } else { + mHistPref.hideBottomSummary(); + } + } + + public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider() { + @Override + public List getXmlResourcesToIndex( + Context context, boolean enabled) { + final SearchIndexableResource sir = new SearchIndexableResource(context); + sir.xmlResId = R.xml.power_usage_advanced; + return Arrays.asList(sir); + } + }; + +} diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java index bf0b627f910..8d70e46463f 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java +++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java @@ -101,7 +101,6 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList SparseArray> mAnomalySparseArray; @VisibleForTesting BatteryHeaderPreferenceController mBatteryHeaderPreferenceController; - private BatteryAppListPreferenceController mBatteryAppListPreferenceController; private BatteryTipPreferenceController mBatteryTipPreferenceController; private int mStatsType = BatteryStats.STATS_SINCE_CHARGED; @@ -231,9 +230,6 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList mBatteryHeaderPreferenceController = new BatteryHeaderPreferenceController( context, activity, this /* host */, lifecycle); controllers.add(mBatteryHeaderPreferenceController); - mBatteryAppListPreferenceController = new BatteryAppListPreferenceController(context, - KEY_APP_LIST, lifecycle, activity, this); - controllers.add(mBatteryAppListPreferenceController); mBatteryTipPreferenceController = new BatteryTipPreferenceController(context, KEY_BATTERY_TIP, (SettingsActivity) getActivity(), this /* fragment */, this /* BatteryTipListener */); @@ -294,11 +290,6 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList updateLastFullChargePreference(lastFullChargeTime); mScreenUsagePref.setSubtitle(StringUtil.formatElapsedTime(getContext(), mBatteryUtils.calculateScreenUsageTime(mStatsHelper), false)); - - final CharSequence timeSequence = StringUtil.formatRelativeTime(context, lastFullChargeTime, - false); - mBatteryAppListPreferenceController.refreshAppListGroup(mStatsHelper, - false /* showAllApps */, timeSequence); } @VisibleForTesting diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java index b223a10ed21..8156428d136 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java @@ -202,20 +202,6 @@ public class BatteryAppListPreferenceControllerTest { assertThat(mPreferenceController.shouldHideSipper(mNormalBatterySipper)).isFalse(); } - @Test - public void testIsAvailable_featureOn_returnTrue() { - FeatureFlagUtils.setEnabled(mContext, FeatureFlags.BATTERY_DISPLAY_APP_LIST, true); - - assertThat(mPreferenceController.isAvailable()).isTrue(); - } - - @Test - public void testIsAvailable_featureOff_returnFalse() { - FeatureFlagUtils.setEnabled(mContext, FeatureFlags.BATTERY_DISPLAY_APP_LIST, false); - - assertThat(mPreferenceController.isAvailable()).isFalse(); - } - @Test public void testNeverUseFakeData() { assertThat(BatteryAppListPreferenceController.USE_FAKE_DATA).isFalse(); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java new file mode 100644 index 00000000000..eba62522b80 --- /dev/null +++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.settings.fuelgauge; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.nullable; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.os.Bundle; +import android.support.v7.preference.PreferenceScreen; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; + +import com.android.internal.logging.nano.MetricsProto; +import com.android.settings.R; +import com.android.settings.TestConfig; +import com.android.settings.testutils.FakeFeatureFactory; +import com.android.settings.testutils.SettingsRobolectricTestRunner; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Answers; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) +public class PowerUsageAdvancedTest { + @Mock + private PreferenceScreen mPreferenceScreen; + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private Menu mMenu; + @Mock + private MenuInflater mMenuInflater; + @Mock + private MenuItem mToggleAppsMenu; + private Context mContext; + private PowerUsageAdvanced mFragment; + private FakeFeatureFactory mFeatureFactory; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + + mContext = RuntimeEnvironment.application; + mFeatureFactory = FakeFeatureFactory.setupForTest(); + when(mToggleAppsMenu.getItemId()).thenReturn(PowerUsageAdvanced.MENU_TOGGLE_APPS); + + mFragment = spy(new PowerUsageAdvanced()); + mFragment.onAttach(mContext); + } + + @Test + public void testSaveInstanceState_showAllAppsRestored() { + Bundle bundle = new Bundle(); + mFragment.mShowAllApps = true; + doReturn(mPreferenceScreen).when(mFragment).getPreferenceScreen(); + + mFragment.onSaveInstanceState(bundle); + mFragment.restoreSavedInstance(bundle); + + assertThat(mFragment.mShowAllApps).isTrue(); + } + + @Test + public void testOptionsMenu_menuAppToggle_metricEventInvoked() { + mFragment.mShowAllApps = false; + doNothing().when(mFragment).restartBatteryStatsLoader(); + + mFragment.onOptionsItemSelected(mToggleAppsMenu); + + verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class), + eq(MetricsProto.MetricsEvent.ACTION_SETTINGS_MENU_BATTERY_APPS_TOGGLE), eq(true)); + } + + @Test + public void testOptionsMenu_toggleAppsEnabled() { + when(mFeatureFactory.powerUsageFeatureProvider.isPowerAccountingToggleEnabled()) + .thenReturn(true); + mFragment.mShowAllApps = false; + + mFragment.onCreateOptionsMenu(mMenu, mMenuInflater); + + verify(mMenu).add(Menu.NONE, PowerUsageAdvanced.MENU_TOGGLE_APPS, Menu.NONE, + R.string.show_all_apps); + } +} From 094278e6363560ad620353b3431f476a42869f80 Mon Sep 17 00:00:00 2001 From: jackqdyulei Date: Tue, 27 Feb 2018 14:58:06 -0800 Subject: [PATCH 3/3] Hook up the new page to PowerUsageSummary Add a menu to point to the new page Bug: 73300636 Test: RunSettingsRoboTests Change-Id: I9956e349cdbbe2cd752bdf65020a540a329bdee3 Merged-In: I9956e349cdbbe2cd752bdf65020a540a329bdee3 --- .../BatteryAppListPreferenceController.java | 3 +- .../fuelgauge/PowerUsageAdvanced.java | 10 +++++ .../settings/fuelgauge/PowerUsageSummary.java | 22 ++++++---- .../search/SearchIndexableResourcesImpl.java | 2 + .../fuelgauge/PowerUsageAdvancedTest.java | 3 -- .../fuelgauge/PowerUsageSummaryTest.java | 44 ++++++++++++++++++- 6 files changed, 70 insertions(+), 14 deletions(-) diff --git a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java index 5028264b596..de01533272c 100644 --- a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java +++ b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java @@ -22,6 +22,7 @@ import android.content.Context; import android.graphics.drawable.Drawable; import android.os.BatteryStats; import android.os.Handler; +import android.os.Looper; import android.os.Message; import android.os.Process; import android.os.UserHandle; @@ -81,7 +82,7 @@ public class BatteryAppListPreferenceController extends AbstractPreferenceContro private Context mPrefContext; SparseArray> mAnomalySparseArray; - private Handler mHandler = new Handler() { + private Handler mHandler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { switch (msg.what) { diff --git a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java index 89f66bd8806..327a6c58bfa 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java +++ b/src/com/android/settings/fuelgauge/PowerUsageAdvanced.java @@ -171,6 +171,16 @@ public class PowerUsageAdvanced extends PowerUsageBase { sir.xmlResId = R.xml.power_usage_advanced; return Arrays.asList(sir); } + + @Override + public List createPreferenceControllers( + Context context) { + final List controllers = new ArrayList<>(); + controllers.add(new BatteryAppListPreferenceController(context, + KEY_APP_LIST, null /* lifecycle */, null /* activity */, + null /* fragment */)); + return controllers; + } }; } diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java index 8d70e46463f..b64dc526bad 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java +++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java @@ -39,6 +39,7 @@ import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.Utils; import com.android.settings.applications.LayoutPreference; +import com.android.settings.core.SubSettingLauncher; import com.android.settings.dashboard.SummaryLoader; import com.android.settings.display.BatteryPercentagePreferenceController; import com.android.settings.fuelgauge.anomaly.Anomaly; @@ -49,7 +50,6 @@ import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.core.AbstractPreferenceController; -import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.utils.PowerUtil; import com.android.settingslib.utils.StringUtil; @@ -68,7 +68,6 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList static final String TAG = "PowerUsageSummary"; private static final boolean DEBUG = false; - private static final String KEY_APP_LIST = "app_list"; private static final String KEY_BATTERY_HEADER = "battery_header"; private static final String KEY_BATTERY_TIP = "battery_tip"; @@ -80,7 +79,10 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList static final int BATTERY_INFO_LOADER = 1; @VisibleForTesting static final int BATTERY_TIP_LOADER = 2; - private static final int MENU_STATS_TYPE = Menu.FIRST; + @VisibleForTesting + static final int MENU_STATS_TYPE = Menu.FIRST; + @VisibleForTesting + static final int MENU_ADVANCED_BATTERY = Menu.FIRST + 1; public static final int DEBUG_INFO_LOADER = 3; @VisibleForTesting @@ -246,6 +248,8 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList .setAlphabeticShortcut('t'); } + menu.add(Menu.NONE, MENU_ADVANCED_BATTERY, Menu.NONE, R.string.advanced_battery_title); + super.onCreateOptionsMenu(menu, inflater); } @@ -256,11 +260,6 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList @Override public boolean onOptionsItemSelected(MenuItem item) { - final SettingsActivity sa = (SettingsActivity) getActivity(); - final Context context = getContext(); - final MetricsFeatureProvider metricsFeatureProvider = - FeatureFactory.getFactory(context).getMetricsFeatureProvider(); - switch (item.getItemId()) { case MENU_STATS_TYPE: if (mStatsType == BatteryStats.STATS_SINCE_CHARGED) { @@ -270,6 +269,13 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList } refreshUi(); return true; + case MENU_ADVANCED_BATTERY: + new SubSettingLauncher(getContext()) + .setDestination(PowerUsageAdvanced.class.getName()) + .setSourceMetricsCategory(getMetricsCategory()) + .setTitle(R.string.advanced_battery_title) + .launch(); + return true; default: return super.onOptionsItemSelected(item); } diff --git a/src/com/android/settings/search/SearchIndexableResourcesImpl.java b/src/com/android/settings/search/SearchIndexableResourcesImpl.java index b9f4db2d017..1798d34e303 100644 --- a/src/com/android/settings/search/SearchIndexableResourcesImpl.java +++ b/src/com/android/settings/search/SearchIndexableResourcesImpl.java @@ -49,6 +49,7 @@ import com.android.settings.display.NightDisplaySettings; import com.android.settings.display.ScreenZoomSettings; import com.android.settings.dream.DreamSettings; import com.android.settings.enterprise.EnterprisePrivacySettings; +import com.android.settings.fuelgauge.PowerUsageAdvanced; import com.android.settings.fuelgauge.PowerUsageAdvancedLegacy; import com.android.settings.fuelgauge.batterysaver.BatterySaverSettings; import com.android.settings.fuelgauge.PowerUsageSummary; @@ -121,6 +122,7 @@ public class SearchIndexableResourcesImpl implements SearchIndexableResources { addIndex(SoundSettings.class); addIndex(ZenModeSettings.class); addIndex(StorageSettings.class); + addIndex(PowerUsageAdvanced.class); addIndex(PowerUsageAdvancedLegacy.class); addIndex(DefaultAppSettings.class); addIndex(ManageAssist.class); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java index eba62522b80..4a905b4603a 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedTest.java @@ -34,7 +34,6 @@ import android.view.MenuItem; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; -import com.android.settings.TestConfig; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; @@ -45,10 +44,8 @@ import org.mockito.Answers; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; -import org.robolectric.annotation.Config; @RunWith(SettingsRobolectricTestRunner.class) -@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public class PowerUsageAdvancedTest { @Mock private PreferenceScreen mPreferenceScreen; diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java index 7f6e39d4096..6176bef4544 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java @@ -15,6 +15,8 @@ */ package com.android.settings.fuelgauge; +import static com.android.settings.fuelgauge.PowerUsageSummary.MENU_ADVANCED_BATTERY; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; @@ -35,6 +37,8 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.util.SparseArray; +import android.view.Menu; +import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.TextView; @@ -53,7 +57,6 @@ import com.android.settingslib.core.AbstractPreferenceController; import org.junit.Before; import org.junit.BeforeClass; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Answers; @@ -114,6 +117,12 @@ public class PowerUsageSummaryTest { private LoaderManager mLoaderManager; @Mock private BatteryHeaderPreferenceController mBatteryHeaderPreferenceController; + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private Menu mMenu; + @Mock + private MenuInflater mMenuInflater; + @Mock + private MenuItem mAdvancedPageMenu; private List mUsageList; private Context mRealContext; @@ -122,12 +131,13 @@ public class PowerUsageSummaryTest { private BatteryMeterView mBatteryMeterView; private PowerGaugePreference mScreenUsagePref; private PowerGaugePreference mLastFullChargePref; + private Intent mIntent; @Before public void setUp() { MockitoAnnotations.initMocks(this); - mRealContext = RuntimeEnvironment.application; + mRealContext = spy(RuntimeEnvironment.application); mFeatureFactory = FakeFeatureFactory.setupForTest(); mScreenUsagePref = new PowerGaugePreference(mRealContext); mLastFullChargePref = new PowerGaugePreference(mRealContext); @@ -137,6 +147,7 @@ public class PowerUsageSummaryTest { mBatteryMeterView.mDrawable = new BatteryMeterView.BatteryMeterDrawable(mRealContext, 0); doNothing().when(mFragment).restartBatteryStatsLoader(); doReturn(mock(LoaderManager.class)).when(mFragment).getLoaderManager(); + doReturn(MENU_ADVANCED_BATTERY).when(mAdvancedPageMenu).getItemId(); when(mFragment.getActivity()).thenReturn(mSettingsActivity); when(mFeatureFactory.powerUsageFeatureProvider.getAdditionalBatteryInfoIntent()) @@ -294,6 +305,35 @@ public class PowerUsageSummaryTest { verify(mBatteryHeaderPreferenceController, never()).quickUpdateHeaderPreference(); } + @Test + public void testOptionsMenu_advancedPageEnabled() { + when(mFeatureFactory.powerUsageFeatureProvider.isPowerAccountingToggleEnabled()) + .thenReturn(true); + + mFragment.onCreateOptionsMenu(mMenu, mMenuInflater); + + verify(mMenu).add(Menu.NONE, MENU_ADVANCED_BATTERY, Menu.NONE, + R.string.advanced_battery_title); + } + + @Test + public void testOptionsMenu_clickAdvancedPage_fireIntent() { + final ArgumentCaptor captor = ArgumentCaptor.forClass(Intent.class); + doAnswer(invocation -> { + // Get the intent in which it has the app info bundle + mIntent = captor.getValue(); + return true; + }).when(mRealContext).startActivity(captor.capture()); + + mFragment.onOptionsItemSelected(mAdvancedPageMenu); + + assertThat(mIntent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT)).isEqualTo( + PowerUsageAdvanced.class.getName()); + assertThat( + mIntent.getIntExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID, 0)).isEqualTo( + R.string.advanced_battery_title); + } + public static class TestFragment extends PowerUsageSummary { private Context mContext;