From 68ffee1a7db43fdf3aca16323a727f4a30db7280 Mon Sep 17 00:00:00 2001 From: Lei Yu Date: Mon, 26 Mar 2018 14:31:57 -0700 Subject: [PATCH] Remove the old battery page This CL removes PowerUsageSummaryLegacy and PowerUsageAdvancedLegacy and their related layouts and strigns. Also remove the isBatteryV2Enabled method in feature provider. Change-Id: I1ec30f713d733ed24335a3e698fb515751232948 Fixes: 76027338 Test: robo test still pass --- AndroidManifest.xml | 19 - res/values/strings.xml | 10 - res/xml/development_settings.xml | 5 - res/xml/power_usage_advanced_legacy.xml | 31 - res/xml/power_usage_summary_legacy.xml | 93 -- src/com/android/settings/Settings.java | 1 - .../android/settings/SettingsActivity.java | 10 +- .../android/settings/core/FeatureFlags.java | 1 - .../core/gateway/SettingsGateway.java | 3 - .../DevelopmentSettingsDashboardFragment.java | 2 - .../fuelgauge/PowerUsageAdvancedLegacy.java | 485 ---------- .../fuelgauge/PowerUsageFeatureProvider.java | 5 - .../PowerUsageFeatureProviderImpl.java | 8 - .../fuelgauge/PowerUsageSummaryLegacy.java | 911 ------------------ .../search/SearchIndexableResourcesImpl.java | 2 - ...randfather_not_implementing_index_provider | 1 - .../PowerUsageAdvancedLegacyTest.java | 437 --------- .../PowerUsageSummaryLegacyTest.java | 541 ----------- 18 files changed, 1 insertion(+), 2564 deletions(-) delete mode 100644 res/xml/power_usage_advanced_legacy.xml delete mode 100644 res/xml/power_usage_summary_legacy.xml delete mode 100644 src/com/android/settings/fuelgauge/PowerUsageAdvancedLegacy.java delete mode 100644 src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java delete mode 100644 tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedLegacyTest.java delete mode 100644 tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacyTest.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 90fc74cf32d..6fbdbc0cf4f 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2208,7 +2208,6 @@ android:name="Settings$PowerUsageSummaryActivity" android:label="@string/power_usage_summary_title" android:icon="@drawable/ic_homepage_battery" - android:enabled="false" android:taskAffinity="com.android.settings" android:parentActivityName="Settings"> @@ -2229,24 +2228,6 @@ android:value="com.android.settings.fuelgauge.PowerUsageSummary" /> - - - - - - - - - - - - Miscellaneous Over-counted - - Apps - - Services - - System - - Other users CPU total @@ -9658,8 +9650,6 @@ Turn on Bluetooth automatically when driving - - See Android 8.0 battery settings Wi-Fi control diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml index 215dee44244..77d4a7dffb3 100644 --- a/res/xml/development_settings.xml +++ b/res/xml/development_settings.xml @@ -76,11 +76,6 @@ android:summary="@string/runningservices_settings_summary" android:fragment="com.android.settings.applications.RunningServices" /> - - - - - - - - - - - diff --git a/res/xml/power_usage_summary_legacy.xml b/res/xml/power_usage_summary_legacy.xml deleted file mode 100644 index 059c737f6c5..00000000000 --- a/res/xml/power_usage_summary_legacy.xml +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java index 836fa754069..e3fcd5c9ada 100644 --- a/src/com/android/settings/Settings.java +++ b/src/com/android/settings/Settings.java @@ -158,7 +158,6 @@ public class Settings extends SettingsActivity { public static class NetworkDashboardActivity extends SettingsActivity {} public static class ConnectedDeviceDashboardActivity extends SettingsActivity {} public static class PowerUsageSummaryActivity extends SettingsActivity { /* empty */ } - public static class PowerUsageSummaryLegacyActivity extends SettingsActivity { /* empty */ } public static class AppAndNotificationDashboardActivity extends SettingsActivity {} public static class StorageDashboardActivity extends SettingsActivity {} public static class AccountDashboardActivity extends SettingsActivity {} diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java index 16e1a7b4ea0..970692d3778 100644 --- a/src/com/android/settings/SettingsActivity.java +++ b/src/com/android/settings/SettingsActivity.java @@ -655,17 +655,9 @@ public class SettingsActivity extends SettingsDrawerActivity Utils.showSimCardTile(this), isAdmin) || somethingChanged; - final boolean isBatterySettingsV2Enabled = featureFactory - .getPowerUsageFeatureProvider(this) - .isBatteryV2Enabled(); - // Enable new battery page if v2 enabled somethingChanged = setTileEnabled(new ComponentName(packageName, Settings.PowerUsageSummaryActivity.class.getName()), - mBatteryPresent && isBatterySettingsV2Enabled, isAdmin) || somethingChanged; - // Enable legacy battery page if v2 disabled - somethingChanged = setTileEnabled(new ComponentName(packageName, - Settings.PowerUsageSummaryLegacyActivity.class.getName()), - mBatteryPresent && !isBatterySettingsV2Enabled, isAdmin) || somethingChanged; + mBatteryPresent, isAdmin) || somethingChanged; final boolean isDataUsageSettingsV2Enabled = FeatureFlagUtils.isEnabled(this, FeatureFlags.DATA_USAGE_SETTINGS_V2); diff --git a/src/com/android/settings/core/FeatureFlags.java b/src/com/android/settings/core/FeatureFlags.java index a5edf3c7a52..a6e961b8774 100644 --- a/src/com/android/settings/core/FeatureFlags.java +++ b/src/com/android/settings/core/FeatureFlags.java @@ -20,7 +20,6 @@ package com.android.settings.core; * This class keeps track of all feature flags in Settings. */ public class FeatureFlags { - public static final String BATTERY_SETTINGS_V2 = "settings_battery_v2"; public static final String BATTERY_DISPLAY_APP_LIST = "settings_battery_display_app_list"; public static final String ZONE_PICKER_V2 = "settings_zone_picker_v2"; public static final String ABOUT_PHONE_V2 = "settings_about_phone_v2"; diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java index dbe8fbacec4..bbba8eaac67 100644 --- a/src/com/android/settings/core/gateway/SettingsGateway.java +++ b/src/com/android/settings/core/gateway/SettingsGateway.java @@ -76,7 +76,6 @@ import com.android.settings.dream.DreamSettings; import com.android.settings.enterprise.EnterprisePrivacySettings; import com.android.settings.fuelgauge.AdvancedPowerUsageDetail; import com.android.settings.fuelgauge.PowerUsageSummary; -import com.android.settings.fuelgauge.PowerUsageSummaryLegacy; import com.android.settings.fuelgauge.batterysaver.BatterySaverSettings; import com.android.settings.gestures.AssistGestureSettings; import com.android.settings.gestures.DoubleTapPowerSettings; @@ -184,7 +183,6 @@ public class SettingsGateway { AndroidBeam.class.getName(), WifiDisplaySettings.class.getName(), PowerUsageSummary.class.getName(), - PowerUsageSummaryLegacy.class.getName(), AccountSyncSettings.class.getName(), AssistGestureSettings.class.getName(), SwipeToNotificationSettings.class.getName(), @@ -270,7 +268,6 @@ public class SettingsGateway { Settings.SoundSettingsActivity.class.getName(), Settings.StorageDashboardActivity.class.getName(), Settings.PowerUsageSummaryActivity.class.getName(), - Settings.PowerUsageSummaryLegacyActivity.class.getName(), Settings.AccountDashboardActivity.class.getName(), Settings.SecurityDashboardActivity.class.getName(), Settings.AccessibilitySettingsActivity.class.getName(), diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java index 9666a6c2ae9..3ee5db1df74 100644 --- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java +++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java @@ -450,8 +450,6 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra controllers.add(new ShortcutManagerThrottlingPreferenceController(context)); controllers.add(new EnableGnssRawMeasFullTrackingPreferenceController(context)); controllers.add(new DefaultLaunchPreferenceController(context, "running_apps")); - controllers.add( - new DefaultLaunchPreferenceController(context, "android_o_battery_settings")); controllers.add(new DefaultLaunchPreferenceController(context, "demo_mode")); controllers.add(new DefaultLaunchPreferenceController(context, "quick_settings_tiles")); controllers.add(new DefaultLaunchPreferenceController(context, "feature_flags_dashboard")); diff --git a/src/com/android/settings/fuelgauge/PowerUsageAdvancedLegacy.java b/src/com/android/settings/fuelgauge/PowerUsageAdvancedLegacy.java deleted file mode 100644 index a4e3fefeea7..00000000000 --- a/src/com/android/settings/fuelgauge/PowerUsageAdvancedLegacy.java +++ /dev/null @@ -1,485 +0,0 @@ -/* - * 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.app.Activity; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.pm.PackageManager; -import android.content.pm.UserInfo; -import android.os.BatteryManager; -import android.os.BatteryStats; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.os.UserManager; -import android.provider.SearchIndexableResource; -import android.support.annotation.ColorInt; -import android.support.annotation.IntDef; -import android.support.annotation.NonNull; -import android.support.annotation.StringRes; -import android.support.annotation.VisibleForTesting; -import android.support.v7.preference.Preference; -import android.support.v7.preference.PreferenceGroup; -import android.text.TextUtils; - -import com.android.internal.logging.nano.MetricsProto; -import com.android.internal.os.BatterySipper; -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.datausage.DataUsageUtils; -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; - -import com.android.settingslib.utils.StringUtil; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class PowerUsageAdvancedLegacy extends PowerUsageBase { - private static final String TAG = "AdvancedBatteryUsage"; - 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 - final int[] mUsageTypes = { - UsageType.WIFI, - UsageType.CELL, - UsageType.SYSTEM, - UsageType.BLUETOOTH, - UsageType.USER, - UsageType.IDLE, - UsageType.APP, - UsageType.UNACCOUNTED, - UsageType.OVERCOUNTED}; - - @VisibleForTesting BatteryHistoryPreference mHistPref; - @VisibleForTesting PreferenceGroup mUsageListGroup; - private BatteryUtils mBatteryUtils; - private PowerUsageFeatureProvider mPowerUsageFeatureProvider; - private PackageManager mPackageManager; - private UserManager mUserManager; - private Map mBatteryDataMap; - - Handler mHandler = new Handler() { - - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case BatteryEntry.MSG_UPDATE_NAME_ICON: - final int dischargeAmount = mStatsHelper.getStats().getDischargeAmount( - STATUS_TYPE); - final double totalPower = mStatsHelper.getTotalPower(); - final BatteryEntry entry = (BatteryEntry) msg.obj; - final int usageType = extractUsageType(entry.sipper); - - PowerUsageData usageData = mBatteryDataMap.get(usageType); - Preference pref = findPreference(String.valueOf(usageType)); - if (pref != null && usageData != null) { - updateUsageDataSummary(usageData, totalPower, dischargeAmount); - pref.setSummary(usageData.summary); - } - break; - case BatteryEntry.MSG_REPORT_FULLY_DRAWN: - Activity activity = getActivity(); - if (activity != null) { - activity.reportFullyDrawn(); - } - break; - } - super.handleMessage(msg); - } - }; - - @Override - public void onCreate(Bundle icicle) { - super.onCreate(icicle); - - mHistPref = (BatteryHistoryPreference) findPreference(KEY_BATTERY_GRAPH); - mUsageListGroup = (PreferenceGroup) findPreference(KEY_BATTERY_USAGE_LIST); - - final Context context = getContext(); - mPowerUsageFeatureProvider = FeatureFactory.getFactory(context) - .getPowerUsageFeatureProvider(context); - mPackageManager = context.getPackageManager(); - mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); - mBatteryUtils = BatteryUtils.getInstance(context); - - // init the summary so other preferences won't have unnecessary move - updateHistPrefSummary(context); - } - - @Override - public void onResume() { - super.onResume(); - } - - @Override - public void onPause() { - BatteryEntry.stopRequestQueue(); - mHandler.removeMessages(BatteryEntry.MSG_UPDATE_NAME_ICON); - super.onPause(); - } - - @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_legacy; - } - - @Override - protected List createPreferenceControllers(Context context) { - return null; - } - - @Override - protected void refreshUi() { - final long startTime = System.currentTimeMillis(); - final Context context = getContext(); - if (context == null) { - return; - } - updatePreference(mHistPref); - refreshPowerUsageDataList(mStatsHelper, mUsageListGroup); - updateHistPrefSummary(context); - - BatteryEntry.startRequestQueue(); - BatteryUtils.logRuntime(TAG, "refreshUI", startTime); - } - - 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(); - } - } - - @VisibleForTesting - void refreshPowerUsageDataList(BatteryStatsHelper statsHelper, - PreferenceGroup preferenceGroup) { - List dataList = parsePowerUsageData(statsHelper); - preferenceGroup.removeAll(); - for (int i = 0, size = dataList.size(); i < size; i++) { - final PowerUsageData batteryData = dataList.get(i); - if (shouldHideCategory(batteryData)) { - continue; - } - final PowerGaugePreference pref = new PowerGaugePreference(getPrefContext()); - - pref.setKey(String.valueOf(batteryData.usageType)); - pref.setTitle(batteryData.titleResId); - pref.setSummary(batteryData.summary); - pref.setPercent(batteryData.percentage); - pref.setSelectable(false); - preferenceGroup.addPreference(pref); - } - } - - @VisibleForTesting - @UsageType - int extractUsageType(BatterySipper sipper) { - final DrainType drainType = sipper.drainType; - final int uid = sipper.getUid(); - - if (drainType == DrainType.WIFI) { - return UsageType.WIFI; - } else if (drainType == DrainType.BLUETOOTH) { - return UsageType.BLUETOOTH; - } else if (drainType == DrainType.IDLE) { - return UsageType.IDLE; - } else if (drainType == DrainType.USER) { - return UsageType.USER; - } else if (drainType == DrainType.CELL) { - return UsageType.CELL; - } else if (drainType == DrainType.UNACCOUNTED) { - return UsageType.UNACCOUNTED; - } else if (drainType == DrainType.OVERCOUNTED) { - return UsageType.OVERCOUNTED; - } else if (mPowerUsageFeatureProvider.isTypeSystem(sipper) - || mPowerUsageFeatureProvider.isTypeService(sipper)) { - return UsageType.SYSTEM; - } else { - return UsageType.APP; - } - } - - @VisibleForTesting - boolean shouldHideCategory(PowerUsageData powerUsageData) { - return powerUsageData.usageType == UsageType.UNACCOUNTED - || powerUsageData.usageType == UsageType.OVERCOUNTED - || (powerUsageData.usageType == UsageType.USER && isSingleNormalUser()) - || (powerUsageData.usageType == UsageType.CELL - && !DataUsageUtils.hasMobileData(getContext())); - } - - @VisibleForTesting - boolean shouldShowBatterySipper(BatterySipper batterySipper) { - return batterySipper.drainType != DrainType.SCREEN; - } - - @VisibleForTesting - List parsePowerUsageData(BatteryStatsHelper statusHelper) { - final List batterySippers = statusHelper.getUsageList(); - final Map batteryDataMap = new HashMap<>(); - - for (final @UsageType Integer type : mUsageTypes) { - batteryDataMap.put(type, new PowerUsageData(type)); - } - - // Accumulate power usage based on usage type - for (final BatterySipper sipper : batterySippers) { - sipper.mPackages = mPackageManager.getPackagesForUid(sipper.getUid()); - final PowerUsageData usageData = batteryDataMap.get(extractUsageType(sipper)); - usageData.totalPowerMah += sipper.totalPowerMah; - if (sipper.drainType == DrainType.APP && sipper.usageTimeMs != 0) { - sipper.usageTimeMs = mBatteryUtils.getProcessTimeMs( - BatteryUtils.StatusType.FOREGROUND, sipper.uidObj, STATUS_TYPE); - } - usageData.totalUsageTimeMs += sipper.usageTimeMs; - if (shouldShowBatterySipper(sipper)) { - usageData.usageList.add(sipper); - } - } - - final List batteryDataList = new ArrayList<>(batteryDataMap.values()); - final int dischargeAmount = statusHelper.getStats().getDischargeAmount(STATUS_TYPE); - final double totalPower = statusHelper.getTotalPower(); - final double hiddenPower = calculateHiddenPower(batteryDataList); - for (final PowerUsageData usageData : batteryDataList) { - usageData.percentage = mBatteryUtils.calculateBatteryPercent(usageData.totalPowerMah, - totalPower, hiddenPower, dischargeAmount); - updateUsageDataSummary(usageData, totalPower, dischargeAmount); - } - - Collections.sort(batteryDataList); - - mBatteryDataMap = batteryDataMap; - return batteryDataList; - } - - @VisibleForTesting - double calculateHiddenPower(List batteryDataList) { - for (final PowerUsageData usageData : batteryDataList) { - if (usageData.usageType == UsageType.UNACCOUNTED) { - return usageData.totalPowerMah; - } - } - - return 0; - } - - @VisibleForTesting - void updateUsageDataSummary(PowerUsageData usageData, double totalPower, int dischargeAmount) { - if (shouldHideSummary(usageData)) { - return; - } - if (usageData.usageList.size() <= 1) { - CharSequence timeSequence = StringUtil.formatElapsedTime(getContext(), - usageData.totalUsageTimeMs, false); - usageData.summary = usageData.usageType == UsageType.IDLE ? timeSequence - : TextUtils.expandTemplate(getText(R.string.battery_used_for), timeSequence); - } else { - BatterySipper sipper = findBatterySipperWithMaxBatteryUsage(usageData.usageList); - BatteryEntry batteryEntry = new BatteryEntry(getContext(), mHandler, mUserManager, - sipper); - final double percentage = (sipper.totalPowerMah / totalPower) * dischargeAmount; - usageData.summary = getString(R.string.battery_used_by, - Utils.formatPercentage(percentage, true), batteryEntry.name); - } - } - - @VisibleForTesting - boolean shouldHideSummary(PowerUsageData powerUsageData) { - @UsageType final int usageType = powerUsageData.usageType; - - return usageType == UsageType.CELL - || usageType == UsageType.BLUETOOTH - || usageType == UsageType.WIFI - || usageType == UsageType.APP - || usageType == UsageType.SYSTEM; - } - - @VisibleForTesting - BatterySipper findBatterySipperWithMaxBatteryUsage(List usageList) { - BatterySipper sipper = usageList.get(0); - for (int i = 1, size = usageList.size(); i < size; i++) { - final BatterySipper comparedSipper = usageList.get(i); - if (comparedSipper.totalPowerMah > sipper.totalPowerMah) { - sipper = comparedSipper; - } - } - - return sipper; - } - - @VisibleForTesting - void setPackageManager(PackageManager packageManager) { - mPackageManager = packageManager; - } - - @VisibleForTesting - void setPowerUsageFeatureProvider(PowerUsageFeatureProvider provider) { - mPowerUsageFeatureProvider = provider; - } - @VisibleForTesting - void setUserManager(UserManager userManager) { - mUserManager = userManager; - } - @VisibleForTesting - void setBatteryUtils(BatteryUtils batteryUtils) { - mBatteryUtils = batteryUtils; - } - - @VisibleForTesting - boolean isSingleNormalUser() { - int count = 0; - for (UserInfo userInfo : mUserManager.getUsers()) { - if (userInfo.isEnabled() && !userInfo.isManagedProfile()) { - count++; - } - } - - return count == 1; - } - - /** - * Class that contains data used in {@link PowerGaugePreference}. - */ - @VisibleForTesting - static class PowerUsageData implements Comparable { - - @Retention(RetentionPolicy.SOURCE) - @IntDef({UsageType.APP, - UsageType.WIFI, - UsageType.CELL, - UsageType.SYSTEM, - UsageType.BLUETOOTH, - UsageType.USER, - UsageType.IDLE, - UsageType.UNACCOUNTED, - UsageType.OVERCOUNTED}) - public @interface UsageType { - int APP = 0; - int WIFI = 1; - int CELL = 2; - int SYSTEM = 3; - int BLUETOOTH = 4; - int USER = 5; - int IDLE = 6; - int UNACCOUNTED = 7; - int OVERCOUNTED = 8; - } - - @StringRes - public int titleResId; - public CharSequence summary; - public double percentage; - public double totalPowerMah; - public long totalUsageTimeMs; - @ColorInt - public int iconColor; - @UsageType - public int usageType; - public List usageList; - - public PowerUsageData(@UsageType int usageType) { - this(usageType, 0); - } - - public PowerUsageData(@UsageType int usageType, double totalPower) { - this.usageType = usageType; - totalPowerMah = 0; - totalUsageTimeMs = 0; - titleResId = getTitleResId(usageType); - totalPowerMah = totalPower; - usageList = new ArrayList<>(); - } - - private int getTitleResId(@UsageType int usageType) { - switch (usageType) { - case UsageType.WIFI: - return R.string.power_wifi; - case UsageType.CELL: - return R.string.power_cell; - case UsageType.SYSTEM: - return R.string.power_system; - case UsageType.BLUETOOTH: - return R.string.power_bluetooth; - case UsageType.USER: - return R.string.power_user; - case UsageType.IDLE: - return R.string.power_idle; - case UsageType.UNACCOUNTED: - return R.string.power_unaccounted; - case UsageType.OVERCOUNTED: - return R.string.power_overcounted; - case UsageType.APP: - default: - return R.string.power_apps; - } - } - - @Override - public int compareTo(@NonNull PowerUsageData powerUsageData) { - final int diff = Double.compare(powerUsageData.totalPowerMah, totalPowerMah); - return diff != 0 ? diff : usageType - powerUsageData.usageType; - } - } - - 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_legacy; - return Arrays.asList(sir); - } - }; - -} diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java index 861ee5622b5..a6474fb21de 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java +++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java @@ -105,11 +105,6 @@ public interface PowerUsageFeatureProvider { */ String getAdvancedUsageScreenInfoString(); - /** - * Checks whether to display the battery v2. - */ - boolean isBatteryV2Enabled(); - /** * Returns a signal to indicate if the device will need to warn the user they may not make it * to their next charging time. diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java index 6c3897de02a..e7275218c54 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java +++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java @@ -16,13 +16,10 @@ package com.android.settings.fuelgauge; -import static com.android.settings.core.FeatureFlags.BATTERY_SETTINGS_V2; - import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Process; -import android.util.FeatureFlagUtils; import android.util.SparseIntArray; import com.android.internal.os.BatterySipper; @@ -127,11 +124,6 @@ public class PowerUsageFeatureProviderImpl implements PowerUsageFeatureProvider return null; } - @Override - public boolean isBatteryV2Enabled() { - return FeatureFlagUtils.isEnabled(mContext, BATTERY_SETTINGS_V2); - } - @Override public boolean getEarlyWarningSignal(Context context, String id) { return false; diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java b/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java deleted file mode 100644 index d321bb76f57..00000000000 --- a/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java +++ /dev/null @@ -1,911 +0,0 @@ -/* - * Copyright (C) 2009 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.app.Activity; -import android.app.LoaderManager; -import android.app.LoaderManager.LoaderCallbacks; -import android.content.Context; -import android.content.Loader; -import android.graphics.drawable.Drawable; -import android.os.BatteryStats; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.os.Process; -import android.os.UserHandle; -import android.support.annotation.VisibleForTesting; -import android.support.v7.preference.Preference; -import android.support.v7.preference.PreferenceGroup; -import android.text.TextUtils; -import android.text.format.DateUtils; -import android.text.format.Formatter; -import android.util.Log; -import android.util.SparseArray; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.View.OnLongClickListener; -import android.widget.TextView; - -import com.android.internal.hardware.AmbientDisplayConfiguration; -import com.android.internal.logging.nano.MetricsProto.MetricsEvent; -import com.android.internal.os.BatterySipper; -import com.android.internal.os.BatterySipper.DrainType; -import com.android.internal.os.PowerProfile; -import com.android.settings.R; -import com.android.settings.Settings.HighPowerApplicationsActivity; -import com.android.settings.SettingsActivity; -import com.android.settings.Utils; -import com.android.settings.applications.LayoutPreference; -import com.android.settings.applications.manageapplications.ManageApplications; -import com.android.settings.core.SubSettingLauncher; -import com.android.settings.dashboard.SummaryLoader; -import com.android.settings.display.AmbientDisplayPreferenceController; -import com.android.settings.display.AutoBrightnessPreferenceController; -import com.android.settings.display.BatteryPercentagePreferenceController; -import com.android.settings.display.TimeoutPreferenceController; -import com.android.settings.fuelgauge.anomaly.Anomaly; -import com.android.settings.fuelgauge.anomaly.AnomalyDetectionPolicy; -import com.android.settings.fuelgauge.anomaly.AnomalyDialogFragment.AnomalyDialogListener; -import com.android.settings.fuelgauge.anomaly.AnomalyLoader; -import com.android.settings.fuelgauge.anomaly.AnomalySummaryPreferenceController; -import com.android.settings.fuelgauge.anomaly.AnomalyUtils; -import com.android.settings.overlay.FeatureFactory; -import com.android.settingslib.core.AbstractPreferenceController; -import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; -import com.android.settingslib.utils.PowerUtil; -import com.android.settingslib.utils.StringUtil; - -import java.util.ArrayList; -import java.util.List; - -/** - * Displays a list of apps and subsystems that consume power, ordered by how much power was - * consumed since the last time it was unplugged. - * - * This is the battery page used in Android O with the app usage list. It is also used for battery - * debug. - */ -public class PowerUsageSummaryLegacy extends PowerUsageBase implements - AnomalyDialogListener, OnLongClickListener, OnClickListener { - - static final String TAG = "PowerUsageSummaryLegacy"; - - private static final boolean DEBUG = false; - private static final boolean USE_FAKE_DATA = false; - private static final String KEY_APP_LIST = "app_list"; - private static final String KEY_BATTERY_HEADER = "battery_header"; - private static final String KEY_SHOW_ALL_APPS = "show_all_apps"; - private static final int MAX_ITEMS_TO_LIST = USE_FAKE_DATA ? 30 : 10; - private static final int MIN_AVERAGE_POWER_THRESHOLD_MILLI_AMP = 10; - - private static final String KEY_SCREEN_USAGE = "screen_usage"; - private static final String KEY_TIME_SINCE_LAST_FULL_CHARGE = "last_full_charge"; - - private static final String KEY_AUTO_BRIGHTNESS = "auto_brightness_battery"; - private static final String KEY_SCREEN_TIMEOUT = "screen_timeout_battery"; - private static final String KEY_AMBIENT_DISPLAY = "ambient_display_battery"; - private static final String KEY_BATTERY_SAVER_SUMMARY = "battery_saver_summary"; - private static final String KEY_HIGH_USAGE = "high_usage"; - - @VisibleForTesting - static final int ANOMALY_LOADER = 1; - @VisibleForTesting - static final int BATTERY_INFO_LOADER = 2; - private static final int MENU_STATS_TYPE = Menu.FIRST; - @VisibleForTesting - static final int MENU_HIGH_POWER_APPS = Menu.FIRST + 3; - @VisibleForTesting - static final int MENU_TOGGLE_APPS = Menu.FIRST + 4; - private static final int MENU_HELP = Menu.FIRST + 5; - public static final int DEBUG_INFO_LOADER = 3; - - @VisibleForTesting - boolean mShowAllApps = false; - @VisibleForTesting - PowerGaugePreference mScreenUsagePref; - @VisibleForTesting - PowerGaugePreference mLastFullChargePref; - @VisibleForTesting - PowerUsageFeatureProvider mPowerFeatureProvider; - @VisibleForTesting - BatteryUtils mBatteryUtils; - @VisibleForTesting - LayoutPreference mBatteryLayoutPref; - - /** - * SparseArray that maps uid to {@link Anomaly}, so we could find {@link Anomaly} by uid - */ - @VisibleForTesting - SparseArray> mAnomalySparseArray; - @VisibleForTesting - PreferenceGroup mAppListGroup; - @VisibleForTesting - BatteryHeaderPreferenceController mBatteryHeaderPreferenceController; - private AnomalySummaryPreferenceController mAnomalySummaryPreferenceController; - private int mStatsType = BatteryStats.STATS_SINCE_CHARGED; - - private LoaderCallbacks> mAnomalyLoaderCallbacks = - new LoaderCallbacks>() { - - @Override - public Loader> onCreateLoader(int id, Bundle args) { - return new AnomalyLoader(getContext(), mStatsHelper); - } - - @Override - public void onLoadFinished(Loader> loader, List data) { - final AnomalyUtils anomalyUtils = AnomalyUtils.getInstance(getContext()); - anomalyUtils.logAnomalies(mMetricsFeatureProvider, data, - MetricsEvent.FUELGAUGE_POWER_USAGE_SUMMARY); - - // show high usage preference if possible - mAnomalySummaryPreferenceController.updateAnomalySummaryPreference(data); - - updateAnomalySparseArray(data); - refreshAnomalyIcon(); - } - - @Override - public void onLoaderReset(Loader> loader) { - - } - }; - - @VisibleForTesting - LoaderCallbacks mBatteryInfoLoaderCallbacks = - new LoaderCallbacks() { - - @Override - public Loader onCreateLoader(int i, Bundle bundle) { - return new BatteryInfoLoader(getContext(), mStatsHelper); - } - - @Override - public void onLoadFinished(Loader loader, BatteryInfo batteryInfo) { - mBatteryHeaderPreferenceController.updateHeaderPreference(batteryInfo); - } - - @Override - public void onLoaderReset(Loader loader) { - // do nothing - } - }; - - LoaderManager.LoaderCallbacks> mBatteryInfoDebugLoaderCallbacks = - new LoaderCallbacks>() { - @Override - public Loader> onCreateLoader(int i, Bundle bundle) { - return new DebugEstimatesLoader(getContext(), mStatsHelper); - } - - @Override - public void onLoadFinished(Loader> loader, - List batteryInfos) { - updateViews(batteryInfos); - } - - @Override - public void onLoaderReset(Loader> loader) { - } - }; - - protected void updateViews(List batteryInfos) { - final BatteryMeterView batteryView = mBatteryLayoutPref - .findViewById(R.id.battery_header_icon); - final TextView percentRemaining = - mBatteryLayoutPref.findViewById(R.id.battery_percent); - final TextView summary1 = mBatteryLayoutPref.findViewById(R.id.summary1); - final TextView summary2 = mBatteryLayoutPref.findViewById(R.id.summary2); - BatteryInfo oldInfo = batteryInfos.get(0); - BatteryInfo newInfo = batteryInfos.get(1); - percentRemaining.setText(Utils.formatPercentage(oldInfo.batteryLevel)); - - // set the text to the old estimate (copied from battery info). Note that this - // can sometimes say 0 time remaining because battery stats requires the phone - // be unplugged for a period of time before being willing ot make an estimate. - summary1.setText(mPowerFeatureProvider.getOldEstimateDebugString( - Formatter.formatShortElapsedTime(getContext(), - PowerUtil.convertUsToMs(oldInfo.remainingTimeUs)))); - - // for this one we can just set the string directly - summary2.setText(mPowerFeatureProvider.getEnhancedEstimateDebugString( - Formatter.formatShortElapsedTime(getContext(), - PowerUtil.convertUsToMs(newInfo.remainingTimeUs)))); - - batteryView.setBatteryLevel(oldInfo.batteryLevel); - batteryView.setCharging(!oldInfo.discharging); - } - - @Override - public void onCreate(Bundle icicle) { - super.onCreate(icicle); - setAnimationAllowed(true); - - initFeatureProvider(); - mBatteryLayoutPref = (LayoutPreference) findPreference(KEY_BATTERY_HEADER); - - mAppListGroup = (PreferenceGroup) findPreference(KEY_APP_LIST); - mScreenUsagePref = (PowerGaugePreference) findPreference(KEY_SCREEN_USAGE); - mLastFullChargePref = (PowerGaugePreference) findPreference( - KEY_TIME_SINCE_LAST_FULL_CHARGE); - mFooterPreferenceMixin.createFooterPreference().setTitle(R.string.battery_footer_summary); - mAnomalySummaryPreferenceController = new AnomalySummaryPreferenceController( - (SettingsActivity) getActivity(), this); - mBatteryUtils = BatteryUtils.getInstance(getContext()); - mAnomalySparseArray = new SparseArray<>(); - - restartBatteryInfoLoader(); - restoreSavedInstance(icicle); - } - - @Override - public int getMetricsCategory() { - return MetricsEvent.FUELGAUGE_POWER_USAGE_SUMMARY; - } - - @Override - public void onPause() { - BatteryEntry.stopRequestQueue(); - mHandler.removeMessages(BatteryEntry.MSG_UPDATE_NAME_ICON); - super.onPause(); - } - - @Override - public void onDestroy() { - super.onDestroy(); - if (getActivity().isChangingConfigurations()) { - BatteryEntry.clearUidCache(); - } - } - - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - outState.putBoolean(KEY_SHOW_ALL_APPS, mShowAllApps); - } - - @Override - public boolean onPreferenceTreeClick(Preference preference) { - if (mAnomalySummaryPreferenceController.onPreferenceTreeClick(preference)) { - return true; - } - if (KEY_BATTERY_HEADER.equals(preference.getKey())) { - performBatteryHeaderClick(); - return true; - } else if (!(preference instanceof PowerGaugePreference)) { - return super.onPreferenceTreeClick(preference); - } - PowerGaugePreference pgp = (PowerGaugePreference) preference; - BatteryEntry entry = pgp.getInfo(); - AdvancedPowerUsageDetail.startBatteryDetailPage((SettingsActivity) getActivity(), - this, mStatsHelper, mStatsType, entry, pgp.getPercent(), - mAnomalySparseArray.get(entry.sipper.getUid())); - return super.onPreferenceTreeClick(preference); - } - - @Override - protected String getLogTag() { - return TAG; - } - - @Override - protected int getPreferenceScreenResId() { - return R.xml.power_usage_summary_legacy; - } - - @Override - protected List createPreferenceControllers(Context context) { - final List controllers = new ArrayList<>(); - mBatteryHeaderPreferenceController = new BatteryHeaderPreferenceController( - context, getActivity(), this /* host */, getLifecycle()); - controllers.add(mBatteryHeaderPreferenceController); - controllers.add(new AutoBrightnessPreferenceController(context, KEY_AUTO_BRIGHTNESS)); - controllers.add(new TimeoutPreferenceController(context, KEY_SCREEN_TIMEOUT)); - controllers.add(new BatteryPercentagePreferenceController(context)); - controllers.add(new AmbientDisplayPreferenceController( - context, - new AmbientDisplayConfiguration(context), - KEY_AMBIENT_DISPLAY)); - BatterySaverController batterySaverController = new BatterySaverController(context); - controllers.add(batterySaverController); - getLifecycle().addObserver(batterySaverController); - return controllers; - } - - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - if (DEBUG) { - menu.add(Menu.NONE, MENU_STATS_TYPE, Menu.NONE, R.string.menu_stats_total) - .setIcon(com.android.internal.R.drawable.ic_menu_info_details) - .setAlphabeticShortcut('t'); - } - - menu.add(Menu.NONE, MENU_HIGH_POWER_APPS, Menu.NONE, R.string.high_power_apps); - - if (mPowerFeatureProvider.isPowerAccountingToggleEnabled()) { - 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 int getHelpResource() { - return R.string.help_url_battery; - } - - @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) { - mStatsType = BatteryStats.STATS_SINCE_UNPLUGGED; - } else { - mStatsType = BatteryStats.STATS_SINCE_CHARGED; - } - refreshUi(); - return true; - case MENU_HIGH_POWER_APPS: - Bundle args = new Bundle(); - args.putString(ManageApplications.EXTRA_CLASSNAME, - HighPowerApplicationsActivity.class.getName()); - new SubSettingLauncher(context) - .setDestination(ManageApplications.class.getName()) - .setArguments(args) - .setTitle(R.string.high_power_apps) - .setSourceMetricsCategory(getMetricsCategory()) - .launch(); - metricsFeatureProvider.action(context, - MetricsEvent.ACTION_SETTINGS_MENU_BATTERY_OPTIMIZATION); - return true; - case MENU_TOGGLE_APPS: - mShowAllApps = !mShowAllApps; - item.setTitle(mShowAllApps ? R.string.hide_extra_apps : R.string.show_all_apps); - metricsFeatureProvider.action(context, - MetricsEvent.ACTION_SETTINGS_MENU_BATTERY_APPS_TOGGLE, mShowAllApps); - restartBatteryStatsLoader(false /* clearHeader */); - return true; - default: - return super.onOptionsItemSelected(item); - } - } - - @VisibleForTesting - void restoreSavedInstance(Bundle savedInstance) { - if (savedInstance != null) { - mShowAllApps = savedInstance.getBoolean(KEY_SHOW_ALL_APPS, false); - } - } - - private void addNotAvailableMessage() { - final String NOT_AVAILABLE = "not_available"; - Preference notAvailable = getCachedPreference(NOT_AVAILABLE); - if (notAvailable == null) { - notAvailable = new Preference(getPrefContext()); - notAvailable.setKey(NOT_AVAILABLE); - notAvailable.setTitle(R.string.power_usage_not_available); - mAppListGroup.addPreference(notAvailable); - } - } - - private void performBatteryHeaderClick() { - if (mPowerFeatureProvider.isAdvancedUiEnabled()) { - new SubSettingLauncher(getContext()) - .setDestination(PowerUsageAdvancedLegacy.class.getName()) - .setSourceMetricsCategory(getMetricsCategory()) - .setTitle(R.string.advanced_battery_title) - .launch(); - } else { - mStatsHelper.storeStatsHistoryInFile(BatteryHistoryDetail.BATTERY_HISTORY_FILE); - Bundle args = new Bundle(2); - args.putString(BatteryHistoryDetail.EXTRA_STATS, - BatteryHistoryDetail.BATTERY_HISTORY_FILE); - args.putParcelable(BatteryHistoryDetail.EXTRA_BROADCAST, - mStatsHelper.getBatteryBroadcast()); - new SubSettingLauncher(getContext()) - .setDestination(BatteryHistoryDetail.class.getName()) - .setSourceMetricsCategory(getMetricsCategory()) - .setArguments(args) - .setTitle(R.string.history_details_title) - .launch(); - } - } - - private static boolean isSharedGid(int uid) { - return UserHandle.getAppIdFromSharedAppGid(uid) > 0; - } - - private static boolean isSystemUid(int uid) { - final int appUid = UserHandle.getAppId(uid); - return appUid >= Process.SYSTEM_UID && appUid < Process.FIRST_APPLICATION_UID; - } - - /** - * We want to coalesce some UIDs. For example, dex2oat runs under a shared gid that - * exists for all users of the same app. We detect this case and merge the power use - * for dex2oat to the device OWNER's use of the app. - * - * @return A sorted list of apps using power. - */ - private List getCoalescedUsageList(final List sippers) { - final SparseArray uidList = new SparseArray<>(); - - final ArrayList results = new ArrayList<>(); - final int numSippers = sippers.size(); - for (int i = 0; i < numSippers; i++) { - BatterySipper sipper = sippers.get(i); - if (sipper.getUid() > 0) { - int realUid = sipper.getUid(); - - // Check if this UID is a shared GID. If so, we combine it with the OWNER's - // actual app UID. - if (isSharedGid(sipper.getUid())) { - realUid = UserHandle.getUid(UserHandle.USER_SYSTEM, - UserHandle.getAppIdFromSharedAppGid(sipper.getUid())); - } - - // Check if this UID is a system UID (mediaserver, logd, nfc, drm, etc). - if (isSystemUid(realUid) - && !"mediaserver".equals(sipper.packageWithHighestDrain)) { - // Use the system UID for all UIDs running in their own sandbox that - // are not apps. We exclude mediaserver because we already are expected to - // report that as a separate item. - realUid = Process.SYSTEM_UID; - } - - if (realUid != sipper.getUid()) { - // Replace the BatterySipper with a new one with the real UID set. - BatterySipper newSipper = new BatterySipper(sipper.drainType, - new FakeUid(realUid), 0.0); - newSipper.add(sipper); - newSipper.packageWithHighestDrain = sipper.packageWithHighestDrain; - newSipper.mPackages = sipper.mPackages; - sipper = newSipper; - } - - int index = uidList.indexOfKey(realUid); - if (index < 0) { - // New entry. - uidList.put(realUid, sipper); - } else { - // Combine BatterySippers if we already have one with this UID. - final BatterySipper existingSipper = uidList.valueAt(index); - existingSipper.add(sipper); - if (existingSipper.packageWithHighestDrain == null - && sipper.packageWithHighestDrain != null) { - existingSipper.packageWithHighestDrain = sipper.packageWithHighestDrain; - } - - final int existingPackageLen = existingSipper.mPackages != null ? - existingSipper.mPackages.length : 0; - final int newPackageLen = sipper.mPackages != null ? - sipper.mPackages.length : 0; - if (newPackageLen > 0) { - String[] newPackages = new String[existingPackageLen + newPackageLen]; - if (existingPackageLen > 0) { - System.arraycopy(existingSipper.mPackages, 0, newPackages, 0, - existingPackageLen); - } - System.arraycopy(sipper.mPackages, 0, newPackages, existingPackageLen, - newPackageLen); - existingSipper.mPackages = newPackages; - } - } - } else { - results.add(sipper); - } - } - - final int numUidSippers = uidList.size(); - for (int i = 0; i < numUidSippers; i++) { - results.add(uidList.valueAt(i)); - } - - // The sort order must have changed, so re-sort based on total power use. - mBatteryUtils.sortUsageList(results); - return results; - } - - protected void refreshUi() { - final Context context = getContext(); - if (context == null) { - return; - } - - restartAnomalyDetectionIfPossible(); - - // reload BatteryInfo and updateUI - restartBatteryInfoLoader(); - final long lastFullChargeTime = mBatteryUtils.calculateLastFullChargeTime(mStatsHelper, - System.currentTimeMillis()); - updateScreenPreference(); - updateLastFullChargePreference(lastFullChargeTime); - - final CharSequence timeSequence = StringUtil.formatRelativeTime(context, lastFullChargeTime, - false); - final int resId = mShowAllApps ? R.string.power_usage_list_summary_device - : R.string.power_usage_list_summary; - mAppListGroup.setTitle(TextUtils.expandTemplate(getText(resId), timeSequence)); - - refreshAppListGroup(); - } - - private void refreshAppListGroup() { - final PowerProfile powerProfile = mStatsHelper.getPowerProfile(); - final BatteryStats stats = mStatsHelper.getStats(); - final double averagePower = powerProfile.getAveragePower(PowerProfile.POWER_SCREEN_FULL); - boolean addedSome = false; - final int dischargeAmount = USE_FAKE_DATA ? 5000 - : stats != null ? stats.getDischargeAmount(mStatsType) : 0; - - cacheRemoveAllPrefs(mAppListGroup); - mAppListGroup.setOrderingAsAdded(false); - - if (averagePower >= MIN_AVERAGE_POWER_THRESHOLD_MILLI_AMP || USE_FAKE_DATA) { - final List usageList = getCoalescedUsageList( - USE_FAKE_DATA ? getFakeStats() : mStatsHelper.getUsageList()); - double hiddenPowerMah = mShowAllApps ? 0 : - mBatteryUtils.removeHiddenBatterySippers(usageList); - mBatteryUtils.sortUsageList(usageList); - - final int numSippers = usageList.size(); - for (int i = 0; i < numSippers; i++) { - final BatterySipper sipper = usageList.get(i); - double totalPower = USE_FAKE_DATA ? 4000 : mStatsHelper.getTotalPower(); - - final double percentOfTotal = mBatteryUtils.calculateBatteryPercent( - sipper.totalPowerMah, totalPower, hiddenPowerMah, dischargeAmount); - - if (((int) (percentOfTotal + .5)) < 1) { - continue; - } - if (shouldHideSipper(sipper)) { - continue; - } - final UserHandle userHandle = new UserHandle(UserHandle.getUserId(sipper.getUid())); - final BatteryEntry entry = new BatteryEntry(getActivity(), mHandler, mUm, sipper); - final Drawable badgedIcon = mUm.getBadgedIconForUser(entry.getIcon(), - userHandle); - final CharSequence contentDescription = mUm.getBadgedLabelForUser(entry.getLabel(), - userHandle); - - final String key = extractKeyFromSipper(sipper); - PowerGaugePreference pref = (PowerGaugePreference) getCachedPreference(key); - if (pref == null) { - pref = new PowerGaugePreference(getPrefContext(), badgedIcon, - contentDescription, entry); - pref.setKey(key); - } - sipper.percent = percentOfTotal; - pref.setTitle(entry.getLabel()); - pref.setOrder(i + 1); - pref.setPercent(percentOfTotal); - pref.shouldShowAnomalyIcon(false); - if (sipper.usageTimeMs == 0 && sipper.drainType == DrainType.APP) { - sipper.usageTimeMs = mBatteryUtils.getProcessTimeMs( - BatteryUtils.StatusType.FOREGROUND, sipper.uidObj, mStatsType); - } - setUsageSummary(pref, sipper); - addedSome = true; - mAppListGroup.addPreference(pref); - if (mAppListGroup.getPreferenceCount() - getCachedCount() - > (MAX_ITEMS_TO_LIST + 1)) { - break; - } - } - } - if (!addedSome) { - addNotAvailableMessage(); - } - removeCachedPrefs(mAppListGroup); - - BatteryEntry.startRequestQueue(); - } - - @VisibleForTesting - boolean shouldHideSipper(BatterySipper sipper) { - // Don't show over-counted and unaccounted in any condition - return sipper.drainType == DrainType.OVERCOUNTED - || sipper.drainType == DrainType.UNACCOUNTED; - } - - @VisibleForTesting - void refreshAnomalyIcon() { - for (int i = 0, size = mAnomalySparseArray.size(); i < size; i++) { - final String key = extractKeyFromUid(mAnomalySparseArray.keyAt(i)); - final PowerGaugePreference pref = (PowerGaugePreference) mAppListGroup.findPreference( - key); - if (pref != null) { - pref.shouldShowAnomalyIcon(true); - } - } - } - - @VisibleForTesting - void restartAnomalyDetectionIfPossible() { - if (getAnomalyDetectionPolicy().isAnomalyDetectionEnabled()) { - getLoaderManager().restartLoader(ANOMALY_LOADER, Bundle.EMPTY, mAnomalyLoaderCallbacks); - } - } - - @VisibleForTesting - AnomalyDetectionPolicy getAnomalyDetectionPolicy() { - return new AnomalyDetectionPolicy(getContext()); - } - - @VisibleForTesting - BatterySipper findBatterySipperByType(List usageList, DrainType type) { - for (int i = 0, size = usageList.size(); i < size; i++) { - final BatterySipper sipper = usageList.get(i); - if (sipper.drainType == type) { - return sipper; - } - } - return null; - } - - @VisibleForTesting - void updateScreenPreference() { - final BatterySipper sipper = findBatterySipperByType( - mStatsHelper.getUsageList(), DrainType.SCREEN); - final long usageTimeMs = sipper != null ? sipper.usageTimeMs : 0; - - mScreenUsagePref.setSubtitle( - StringUtil.formatElapsedTime(getContext(), usageTimeMs, false)); - } - - @VisibleForTesting - void updateLastFullChargePreference(long timeMs) { - final CharSequence timeSequence = StringUtil.formatRelativeTime(getContext(), timeMs, false); - mLastFullChargePref.setSubtitle(timeSequence); - } - - @VisibleForTesting - void showBothEstimates() { - final Context context = getContext(); - if (context == null - || !mPowerFeatureProvider.isEnhancedBatteryPredictionEnabled(context)) { - return; - } - getLoaderManager().restartLoader(DEBUG_INFO_LOADER, Bundle.EMPTY, - mBatteryInfoDebugLoaderCallbacks); - } - - @VisibleForTesting - double calculatePercentage(double powerUsage, double dischargeAmount) { - final double totalPower = mStatsHelper.getTotalPower(); - return totalPower == 0 ? 0 : - ((powerUsage / totalPower) * dischargeAmount); - } - - @VisibleForTesting - void setUsageSummary(Preference preference, BatterySipper sipper) { - // Only show summary when usage time is longer than one minute - final long usageTimeMs = sipper.usageTimeMs; - if (usageTimeMs >= DateUtils.MINUTE_IN_MILLIS) { - final CharSequence timeSequence = - StringUtil.formatElapsedTime(getContext(), usageTimeMs, false); - preference.setSummary( - (sipper.drainType != DrainType.APP || mBatteryUtils.shouldHideSipper(sipper)) - ? timeSequence - : TextUtils.expandTemplate(getText(R.string.battery_used_for), - timeSequence)); - } - } - - @VisibleForTesting - String extractKeyFromSipper(BatterySipper sipper) { - if (sipper.uidObj != null) { - return extractKeyFromUid(sipper.getUid()); - } else if (sipper.drainType == DrainType.USER) { - return sipper.drainType.toString() + sipper.userId; - } else if (sipper.drainType != DrainType.APP) { - return sipper.drainType.toString(); - } else if (sipper.getPackages() != null) { - return TextUtils.concat(sipper.getPackages()).toString(); - } else { - Log.w(TAG, "Inappropriate BatterySipper without uid and package names: " + sipper); - return "-1"; - } - } - - @VisibleForTesting - String extractKeyFromUid(int uid) { - return Integer.toString(uid); - } - - @VisibleForTesting - void setBatteryLayoutPreference(LayoutPreference layoutPreference) { - mBatteryLayoutPref = layoutPreference; - } - - @VisibleForTesting - void initFeatureProvider() { - final Context context = getContext(); - mPowerFeatureProvider = FeatureFactory.getFactory(context) - .getPowerUsageFeatureProvider(context); - } - - @VisibleForTesting - void updateAnomalySparseArray(List anomalies) { - mAnomalySparseArray.clear(); - for (int i = 0, size = anomalies.size(); i < size; i++) { - final Anomaly anomaly = anomalies.get(i); - if (mAnomalySparseArray.get(anomaly.uid) == null) { - mAnomalySparseArray.append(anomaly.uid, new ArrayList<>()); - } - mAnomalySparseArray.get(anomaly.uid).add(anomaly); - } - } - - @VisibleForTesting - void restartBatteryInfoLoader() { - getLoaderManager().restartLoader(BATTERY_INFO_LOADER, Bundle.EMPTY, - mBatteryInfoLoaderCallbacks); - if (mPowerFeatureProvider.isEstimateDebugEnabled()) { - // Unfortunately setting a long click listener on a view means it will no - // longer pass the regular click event to the parent, so we have to register - // a regular click listener as well. - View header = mBatteryLayoutPref.findViewById(R.id.summary1); - header.setOnLongClickListener(this); - header.setOnClickListener(this); - } - } - - private static List getFakeStats() { - ArrayList stats = new ArrayList<>(); - float use = 5; - for (DrainType type : DrainType.values()) { - if (type == DrainType.APP) { - continue; - } - stats.add(new BatterySipper(type, null, use)); - use += 5; - } - for (int i = 0; i < 100; i++) { - stats.add(new BatterySipper(DrainType.APP, - new FakeUid(Process.FIRST_APPLICATION_UID + i), use)); - } - stats.add(new BatterySipper(DrainType.APP, - new FakeUid(0), use)); - - // Simulate dex2oat process. - BatterySipper sipper = new BatterySipper(DrainType.APP, - new FakeUid(UserHandle.getSharedAppGid(Process.FIRST_APPLICATION_UID)), 10.0f); - sipper.packageWithHighestDrain = "dex2oat"; - stats.add(sipper); - - sipper = new BatterySipper(DrainType.APP, - new FakeUid(UserHandle.getSharedAppGid(Process.FIRST_APPLICATION_UID + 1)), 10.0f); - sipper.packageWithHighestDrain = "dex2oat"; - stats.add(sipper); - - sipper = new BatterySipper(DrainType.APP, - new FakeUid(UserHandle.getSharedAppGid(Process.LOG_UID)), 9.0f); - stats.add(sipper); - - return stats; - } - - Handler mHandler = new Handler() { - - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case BatteryEntry.MSG_UPDATE_NAME_ICON: - BatteryEntry entry = (BatteryEntry) msg.obj; - PowerGaugePreference pgp = - (PowerGaugePreference) findPreference( - Integer.toString(entry.sipper.uidObj.getUid())); - if (pgp != null) { - final int userId = UserHandle.getUserId(entry.sipper.getUid()); - final UserHandle userHandle = new UserHandle(userId); - pgp.setIcon(mUm.getBadgedIconForUser(entry.getIcon(), userHandle)); - pgp.setTitle(entry.name); - if (entry.sipper.drainType == DrainType.APP) { - pgp.setContentDescription(entry.name); - } - } - break; - case BatteryEntry.MSG_REPORT_FULLY_DRAWN: - Activity activity = getActivity(); - if (activity != null) { - activity.reportFullyDrawn(); - } - break; - } - super.handleMessage(msg); - } - }; - - @Override - public void onAnomalyHandled(Anomaly anomaly) { - mAnomalySummaryPreferenceController.hideHighUsagePreference(); - } - - @Override - public boolean onLongClick(View view) { - showBothEstimates(); - view.setOnLongClickListener(null); - return true; - } - - @Override - public void onClick(View view) { - performBatteryHeaderClick(); - } - - @Override - protected void restartBatteryStatsLoader() { - restartBatteryStatsLoader(true /* clearHeader */); - } - - void restartBatteryStatsLoader(boolean clearHeader) { - super.restartBatteryStatsLoader(); - if (clearHeader) { - mBatteryHeaderPreferenceController.quickUpdateHeaderPreference(); - } - } - - private static class SummaryProvider implements SummaryLoader.SummaryProvider { - private final Context mContext; - private final SummaryLoader mLoader; - private final BatteryBroadcastReceiver mBatteryBroadcastReceiver; - - private SummaryProvider(Context context, SummaryLoader loader) { - mContext = context; - mLoader = loader; - mBatteryBroadcastReceiver = new BatteryBroadcastReceiver(mContext); - mBatteryBroadcastReceiver.setBatteryChangedListener(() -> { - BatteryInfo.getBatteryInfo(mContext, new BatteryInfo.Callback() { - @Override - public void onBatteryInfoLoaded(BatteryInfo info) { - mLoader.setSummary(PowerUsageSummaryLegacy.SummaryProvider.this, info.chargeLabel); - } - }, true /* shortString */); - }); - } - - @Override - public void setListening(boolean listening) { - if (listening) { - mBatteryBroadcastReceiver.register(); - } else { - mBatteryBroadcastReceiver.unRegister(); - } - } - } - - public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY - = new SummaryLoader.SummaryProviderFactory() { - @Override - public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity, - SummaryLoader summaryLoader) { - return new SummaryProvider(activity, summaryLoader); - } - }; -} diff --git a/src/com/android/settings/search/SearchIndexableResourcesImpl.java b/src/com/android/settings/search/SearchIndexableResourcesImpl.java index 61f5fecd18f..0bc8de62d8d 100644 --- a/src/com/android/settings/search/SearchIndexableResourcesImpl.java +++ b/src/com/android/settings/search/SearchIndexableResourcesImpl.java @@ -50,7 +50,6 @@ 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; import com.android.settings.fuelgauge.SmartBatterySettings; @@ -124,7 +123,6 @@ public class SearchIndexableResourcesImpl implements SearchIndexableResources { 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/assets/grandfather_not_implementing_index_provider b/tests/robotests/assets/grandfather_not_implementing_index_provider index 223d8f8d6df..39e63d4baa7 100644 --- a/tests/robotests/assets/grandfather_not_implementing_index_provider +++ b/tests/robotests/assets/grandfather_not_implementing_index_provider @@ -4,7 +4,6 @@ com.android.settings.bluetooth.BluetoothDeviceDetailsFragment com.android.settings.bluetooth.BluetoothPairingDetail com.android.settings.accounts.AccountDetailDashboardFragment com.android.settings.fuelgauge.PowerUsageAnomalyDetails -com.android.settings.fuelgauge.PowerUsageSummaryLegacy com.android.settings.fuelgauge.AdvancedPowerUsageDetail com.android.settings.development.featureflags.FeatureFlagsDashboard com.android.settings.development.qstile.DevelopmentTileConfigFragment diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedLegacyTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedLegacyTest.java deleted file mode 100644 index 756d9137e19..00000000000 --- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAdvancedLegacyTest.java +++ /dev/null @@ -1,437 +0,0 @@ -/* - * 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.Matchers.any; -import static org.mockito.Matchers.anyInt; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.atLeastOnce; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.pm.UserInfo; -import android.net.ConnectivityManager; -import android.os.UserManager; -import android.support.v7.preference.PreferenceCategory; -import android.support.v7.preference.PreferenceGroup; -import android.support.v7.preference.PreferenceManager; - -import com.android.internal.os.BatterySipper; -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.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; -import org.junit.runner.RunWith; -import org.mockito.Answers; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.robolectric.RuntimeEnvironment; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -@RunWith(SettingsRobolectricTestRunner.class) -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; - private static final double TYPE_APP_USAGE = 80; - private static final double TYPE_BLUETOOTH_USAGE = 50; - private static final double TYPE_WIFI_USAGE = 0; - private static final double TOTAL_USAGE = TYPE_APP_USAGE * 2 + TYPE_BLUETOOTH_USAGE - + TYPE_WIFI_USAGE; - private static final double TOTAL_POWER = 500; - private static final double PRECISION = 0.001; - private static final String STUB_STRING = "stub_string"; - @Mock - private BatterySipper mNormalBatterySipper; - @Mock - private BatterySipper mMaxBatterySipper; - @Mock(answer = Answers.RETURNS_DEEP_STUBS) - private BatteryStatsHelper mBatteryStatsHelper; - @Mock - private PowerUsageFeatureProvider mPowerUsageFeatureProvider; - @Mock - private PackageManager mPackageManager; - @Mock - private UserManager mUserManager; - @Mock - private BatteryHistoryPreference mHistPref; - @Mock - private PreferenceGroup mUsageListGroup; - @Mock - private ConnectivityManager mConnectivityManager; - @Mock - private UserInfo mNormalUserInfo; - @Mock - private UserInfo mManagedUserInfo; - private PowerUsageAdvancedLegacy mPowerUsageAdvanced; - private PowerUsageData mPowerUsageData; - private Context mShadowContext; - private Intent mDischargingBatteryIntent; - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - mShadowContext = spy(RuntimeEnvironment.application); - mPowerUsageAdvanced = spy(new PowerUsageAdvancedLegacy()); - - List batterySippers = new ArrayList<>(); - batterySippers.add(new BatterySipper(DrainType.APP, - new FakeUid(FAKE_UID_1), TYPE_APP_USAGE)); - batterySippers.add(new BatterySipper(DrainType.APP, - new FakeUid(FAKE_UID_2), TYPE_APP_USAGE)); - batterySippers.add(new BatterySipper(DrainType.BLUETOOTH, new FakeUid(FAKE_UID_1), - TYPE_BLUETOOTH_USAGE)); - batterySippers.add(new BatterySipper(DrainType.WIFI, new FakeUid(FAKE_UID_1), - TYPE_WIFI_USAGE)); - - mDischargingBatteryIntent = BatteryTestUtils.getDischargingIntent(); - doReturn(mDischargingBatteryIntent).when(mShadowContext).registerReceiver(any(), any()); - when(mBatteryStatsHelper.getStats().getDischargeAmount(anyInt())).thenReturn( - DISCHARGE_AMOUNT); - when(mBatteryStatsHelper.getUsageList()).thenReturn(batterySippers); - when(mBatteryStatsHelper.getTotalPower()).thenReturn(TOTAL_USAGE); - when(mPowerUsageAdvanced.getContext()).thenReturn(mShadowContext); - doReturn(STUB_STRING).when(mPowerUsageAdvanced).getString(anyInt(), any(), any()); - doReturn(STUB_STRING).when(mPowerUsageAdvanced).getString(anyInt(), any()); - doReturn(mShadowContext.getText(R.string.battery_used_for)).when( - mPowerUsageAdvanced).getText(R.string.battery_used_for); - mPowerUsageAdvanced.setPackageManager(mPackageManager); - mPowerUsageAdvanced.setPowerUsageFeatureProvider(mPowerUsageFeatureProvider); - mPowerUsageAdvanced.setUserManager(mUserManager); - mPowerUsageAdvanced.setBatteryUtils(BatteryUtils.getInstance(mShadowContext)); - when(mShadowContext.getSystemService(Context.CONNECTIVITY_SERVICE)).thenReturn( - mConnectivityManager); - - mPowerUsageData = new PowerUsageData(UsageType.USER); - mMaxBatterySipper.totalPowerMah = TYPE_BLUETOOTH_USAGE; - mMaxBatterySipper.drainType = DrainType.BLUETOOTH; - mNormalBatterySipper.drainType = DrainType.SCREEN; - - doReturn(true).when(mNormalUserInfo).isEnabled(); - doReturn(false).when(mNormalUserInfo).isManagedProfile(); - doReturn(true).when(mManagedUserInfo).isEnabled(); - doReturn(true).when(mManagedUserInfo).isManagedProfile(); - } - - @Test - public void testPrefs_shouldNotBeSelectable() { - PreferenceManager pm = new PreferenceManager(mShadowContext); - when(mPowerUsageAdvanced.getPreferenceManager()).thenReturn(pm); - PreferenceGroup prefGroup = spy(new PreferenceCategory(mShadowContext)); - when(prefGroup.getPreferenceManager()).thenReturn(pm); - - mPowerUsageAdvanced.refreshPowerUsageDataList(mBatteryStatsHelper, prefGroup); - assertThat(prefGroup.getPreferenceCount()).isAtLeast(1); - for (int i = 0, count = prefGroup.getPreferenceCount(); i < count; i++) { - PowerGaugePreference pref = (PowerGaugePreference) prefGroup.getPreference(i); - assertThat(pref.isSelectable()).isFalse(); - } - } - - @Test - public void testExtractUsageType_TypeSystem_ReturnSystem() { - mNormalBatterySipper.drainType = DrainType.APP; - when(mPowerUsageFeatureProvider.isTypeSystem(any())).thenReturn(true); - - assertThat(mPowerUsageAdvanced.extractUsageType(mNormalBatterySipper)) - .isEqualTo(UsageType.SYSTEM); - } - - @Test - public void testExtractUsageType_TypeEqualsToDrainType_ReturnRelevantType() { - final DrainType drainTypes[] = {DrainType.WIFI, DrainType.BLUETOOTH, DrainType.IDLE, - DrainType.USER, DrainType.CELL, DrainType.UNACCOUNTED}; - final int usageTypes[] = {UsageType.WIFI, UsageType.BLUETOOTH, UsageType.IDLE, - UsageType.USER, UsageType.CELL, UsageType.UNACCOUNTED}; - - assertThat(drainTypes.length).isEqualTo(usageTypes.length); - for (int i = 0, size = drainTypes.length; i < size; i++) { - mNormalBatterySipper.drainType = drainTypes[i]; - assertThat(mPowerUsageAdvanced.extractUsageType(mNormalBatterySipper)) - .isEqualTo(usageTypes[i]); - } - } - - @Test - public void testExtractUsageType_TypeService_ReturnSystem() { - mNormalBatterySipper.drainType = DrainType.APP; - when(mNormalBatterySipper.getUid()).thenReturn(FAKE_UID_1); - when(mPowerUsageFeatureProvider.isTypeService(any())).thenReturn(true); - - assertThat(mPowerUsageAdvanced.extractUsageType(mNormalBatterySipper)) - .isEqualTo(UsageType.SYSTEM); - } - - @Test - public void testParsePowerUsageData_PercentageCalculatedCorrectly() { - final double percentApp = TYPE_APP_USAGE * 2 / TOTAL_USAGE * DISCHARGE_AMOUNT; - final double percentWifi = TYPE_WIFI_USAGE / TOTAL_USAGE * DISCHARGE_AMOUNT; - final double percentBluetooth = TYPE_BLUETOOTH_USAGE / TOTAL_USAGE * DISCHARGE_AMOUNT; - - List batteryData = - mPowerUsageAdvanced.parsePowerUsageData(mBatteryStatsHelper); - for (PowerUsageData data : batteryData) { - switch (data.usageType) { - case UsageType.WIFI: - assertThat(data.percentage).isWithin(PRECISION).of(percentWifi); - break; - case UsageType.APP: - assertThat(data.percentage).isWithin(PRECISION).of(percentApp); - break; - case UsageType.BLUETOOTH: - assertThat(data.percentage).isWithin(PRECISION).of(percentBluetooth); - break; - default: - break; - } - } - } - - @Test - public void testUpdateUsageDataSummary_onlyOneApp_showUsageTime() { - final String expectedSummary = "Used for 0m"; - mPowerUsageData.usageList.add(mNormalBatterySipper); - - mPowerUsageAdvanced.updateUsageDataSummary(mPowerUsageData, TOTAL_POWER, DISCHARGE_AMOUNT); - - assertThat(mPowerUsageData.summary.toString()).isEqualTo(expectedSummary); - } - - @Test - public void testUpdateUsageDataSummary_typeIdle_showUsageTime() { - mPowerUsageData.usageType = UsageType.IDLE; - mPowerUsageData.usageList.add(mNormalBatterySipper); - - mPowerUsageAdvanced.updateUsageDataSummary(mPowerUsageData, TOTAL_POWER, DISCHARGE_AMOUNT); - - assertThat(mPowerUsageData.summary.toString()).isEqualTo("0m"); - } - - @Test - public void testUpdateUsageDataSummary_moreThanOneApp_showMaxUsageApp() { - mPowerUsageData.usageList.add(mNormalBatterySipper); - mPowerUsageData.usageList.add(mMaxBatterySipper); - doReturn(mMaxBatterySipper).when(mPowerUsageAdvanced) - .findBatterySipperWithMaxBatteryUsage(mPowerUsageData.usageList); - final double percentage = (TYPE_BLUETOOTH_USAGE / TOTAL_POWER) * DISCHARGE_AMOUNT; - mPowerUsageAdvanced.updateUsageDataSummary(mPowerUsageData, TOTAL_POWER, DISCHARGE_AMOUNT); - - verify(mPowerUsageAdvanced).getString(eq(R.string.battery_used_by), - eq(Utils.formatPercentage(percentage, true)), any()); - } - - @Test - public void testFindBatterySipperWithMaxBatteryUsage_findCorrectOne() { - mPowerUsageData.usageList.add(mNormalBatterySipper); - mPowerUsageData.usageList.add(mMaxBatterySipper); - BatterySipper sipper = - mPowerUsageAdvanced.findBatterySipperWithMaxBatteryUsage(mPowerUsageData.usageList); - - assertThat(sipper).isEqualTo(mMaxBatterySipper); - } - - @Test - public void testInit_ContainsAllUsageType() { - final int[] usageTypeSet = mPowerUsageAdvanced.mUsageTypes; - - assertThat(usageTypeSet).asList().containsExactly(UsageType.APP, UsageType.WIFI, - UsageType.CELL, UsageType.BLUETOOTH, UsageType.IDLE, UsageType.USER, - UsageType.SYSTEM, UsageType.UNACCOUNTED, UsageType.OVERCOUNTED); - } - - @Test - public void testPowerUsageData_SortedByUsage() { - List dataList = new ArrayList<>(); - - dataList.add(new PowerUsageData(UsageType.WIFI, TYPE_WIFI_USAGE)); - dataList.add(new PowerUsageData(UsageType.BLUETOOTH, TYPE_BLUETOOTH_USAGE)); - dataList.add(new PowerUsageData(UsageType.APP, TYPE_APP_USAGE)); - Collections.sort(dataList); - - for (int i = 1, size = dataList.size(); i < size; i++) { - assertThat(dataList.get(i - 1).totalPowerMah).isAtLeast(dataList.get(i).totalPowerMah); - } - } - - @Test - public void testShouldHideCategory_typeUnAccounted_returnTrue() { - mPowerUsageData.usageType = UsageType.UNACCOUNTED; - - assertThat(mPowerUsageAdvanced.shouldHideCategory(mPowerUsageData)).isTrue(); - } - - @Test - public void testShouldHideCategory_typeOverCounted_returnTrue() { - mPowerUsageData.usageType = UsageType.OVERCOUNTED; - - assertThat(mPowerUsageAdvanced.shouldHideCategory(mPowerUsageData)).isTrue(); - } - - @Test - public void testShouldHideCategory_typeUserAndOnlyOneNormalUser_returnTrue() { - mPowerUsageData.usageType = UsageType.USER; - List userInfos = new ArrayList<>(); - userInfos.add(mNormalUserInfo); - userInfos.add(mManagedUserInfo); - doReturn(userInfos).when(mUserManager).getUsers(); - - assertThat(mPowerUsageAdvanced.shouldHideCategory(mPowerUsageData)).isTrue(); - } - - @Test - public void testShouldHideCategory_typeCellWhileNotSupported_returnTrue() { - mPowerUsageData.usageType = UsageType.CELL; - doReturn(false).when(mConnectivityManager) - .isNetworkSupported(ConnectivityManager.TYPE_MOBILE); - - assertThat(mPowerUsageAdvanced.shouldHideCategory(mPowerUsageData)).isTrue(); - } - - @Test - public void testShouldHideCategory_typeCellWhileSupported_returnFalse() { - mPowerUsageData.usageType = UsageType.CELL; - doReturn(true).when(mConnectivityManager).isNetworkSupported( - ConnectivityManager.TYPE_MOBILE); - - assertThat(mPowerUsageAdvanced.shouldHideCategory(mPowerUsageData)).isFalse(); - } - - @Test - public void testShouldHideCategory_typeUserAndMoreThanOne_returnFalse() { - mPowerUsageData.usageType = UsageType.USER; - List userInfos = new ArrayList<>(); - userInfos.add(mNormalUserInfo); - userInfos.add(mNormalUserInfo); - doReturn(userInfos).when(mUserManager).getUsers(); - - assertThat(mPowerUsageAdvanced.shouldHideCategory(mPowerUsageData)).isFalse(); - } - - @Test - public void testShouldHideCategory_typeNormal_returnFalse() { - mPowerUsageData.usageType = UsageType.APP; - - assertThat(mPowerUsageAdvanced.shouldHideCategory(mPowerUsageData)).isFalse(); - } - - @Test - public void testShouldHideSummary_typeCell_returnTrue() { - mPowerUsageData.usageType = UsageType.CELL; - - assertThat(mPowerUsageAdvanced.shouldHideSummary(mPowerUsageData)).isTrue(); - } - - @Test - public void testShouldHideSummary_typeSystem_returnTrue() { - mPowerUsageData.usageType = UsageType.SYSTEM; - - assertThat(mPowerUsageAdvanced.shouldHideSummary(mPowerUsageData)).isTrue(); - } - - @Test - public void testShouldHideSummary_typeWifi_returnTrue() { - mPowerUsageData.usageType = UsageType.WIFI; - - assertThat(mPowerUsageAdvanced.shouldHideSummary(mPowerUsageData)).isTrue(); - } - - @Test - public void testShouldHideSummary_typeBluetooth_returnTrue() { - mPowerUsageData.usageType = UsageType.BLUETOOTH; - - assertThat(mPowerUsageAdvanced.shouldHideSummary(mPowerUsageData)).isTrue(); - } - - @Test - public void testShouldHideSummary_typeApp_returnTrue() { - mPowerUsageData.usageType = UsageType.APP; - - assertThat(mPowerUsageAdvanced.shouldHideSummary(mPowerUsageData)).isTrue(); - } - - @Test - public void testShouldHideSummary_typeNormal_returnFalse() { - mPowerUsageData.usageType = UsageType.IDLE; - - assertThat(mPowerUsageAdvanced.shouldHideSummary(mPowerUsageData)).isFalse(); - } - - @Test - public void testShouldShowBatterySipper_typeScreen_returnFalse() { - mNormalBatterySipper.drainType = DrainType.SCREEN; - - assertThat(mPowerUsageAdvanced.shouldShowBatterySipper(mNormalBatterySipper)).isFalse(); - } - - @Test - public void testShouldShowBatterySipper_typeNormal_returnTrue() { - mNormalBatterySipper.drainType = DrainType.APP; - - assertThat(mPowerUsageAdvanced.shouldShowBatterySipper(mNormalBatterySipper)).isTrue(); - } - - @Test - public void testCalculateHiddenPower_returnCorrectPower() { - List powerUsageDataList = new ArrayList<>(); - final double unaccountedPower = 100; - final double normalPower = 150; - powerUsageDataList.add(new PowerUsageData(UsageType.UNACCOUNTED, unaccountedPower)); - powerUsageDataList.add(new PowerUsageData(UsageType.APP, normalPower)); - powerUsageDataList.add(new PowerUsageData(UsageType.CELL, normalPower)); - - assertThat(mPowerUsageAdvanced.calculateHiddenPower(powerUsageDataList)) - .isWithin(PRECISION).of(unaccountedPower); - } - - @Test - public void testRefreshUi_addsSubtextWhenAppropriate() { - // Mock out all the battery stuff - mPowerUsageAdvanced.mHistPref = mHistPref; - mPowerUsageAdvanced.mStatsHelper = mBatteryStatsHelper; - doReturn(new ArrayList()) - .when(mPowerUsageAdvanced).parsePowerUsageData(any()); - doReturn("").when(mPowerUsageAdvanced).getString(anyInt()); - mPowerUsageAdvanced.mUsageListGroup = mUsageListGroup; - - // refresh the ui and check that text was not updated when enhanced prediction disabled - when(mPowerUsageFeatureProvider.isEnhancedBatteryPredictionEnabled(any())) - .thenReturn(false); - mPowerUsageAdvanced.refreshUi(); - verify(mHistPref, never()).setBottomSummary(any()); - - // refresh the ui and check that text was updated when enhanced prediction enabled - when(mPowerUsageFeatureProvider.isEnhancedBatteryPredictionEnabled(any())).thenReturn(true); - mPowerUsageAdvanced.refreshUi(); - verify(mHistPref, atLeastOnce()).setBottomSummary(any()); - } -} diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacyTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacyTest.java deleted file mode 100644 index 0e6efbc57ce..00000000000 --- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacyTest.java +++ /dev/null @@ -1,541 +0,0 @@ -/* - * Copyright (C) 2016 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.android.settings.fuelgauge.PowerUsageSummaryLegacy.MENU_HIGH_POWER_APPS; -import static com.android.settings.fuelgauge.PowerUsageSummaryLegacy.MENU_TOGGLE_APPS; -import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyInt; -import static org.mockito.Matchers.anyLong; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import android.app.LoaderManager; -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.support.v7.preference.PreferenceGroup; -import android.support.v7.preference.PreferenceScreen; -import android.text.TextUtils; -import android.text.format.DateUtils; -import android.util.SparseArray; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.widget.TextView; - -import com.android.internal.logging.nano.MetricsProto; -import com.android.internal.os.BatterySipper; -import com.android.internal.os.BatteryStatsHelper; -import com.android.internal.os.BatteryStatsImpl; -import com.android.settings.R; -import com.android.settings.SettingsActivity; -import com.android.settings.applications.LayoutPreference; -import com.android.settings.fuelgauge.anomaly.Anomaly; -import com.android.settings.fuelgauge.anomaly.AnomalyDetectionPolicy; -import com.android.settings.testutils.FakeFeatureFactory; -import com.android.settings.testutils.SettingsRobolectricTestRunner; -import com.android.settings.testutils.XmlTestUtils; -import com.android.settings.testutils.shadow.SettingsShadowResources; -import com.android.settingslib.core.AbstractPreferenceController; -import com.android.settingslib.utils.StringUtil; - -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Answers; -import org.mockito.ArgumentCaptor; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.robolectric.RuntimeEnvironment; -import org.robolectric.annotation.Config; - -import java.util.ArrayList; -import java.util.List; - -// TODO: Improve this test class so that it starts up the real activity and fragment. -@RunWith(SettingsRobolectricTestRunner.class) -@Config(shadows = { - SettingsShadowResources.class, - SettingsShadowResources.SettingsShadowTheme.class, -}) -public class PowerUsageSummaryLegacyTest { - - private static final String[] PACKAGE_NAMES = {"com.app1", "com.app2"}; - private static final String STUB_STRING = "stub_string"; - private static final int UID = 123; - private static final int UID_2 = 234; - private static final int POWER_MAH = 100; - private static final long TIME_SINCE_LAST_FULL_CHARGE_MS = 120 * 60 * 1000; - private static final long TIME_SINCE_LAST_FULL_CHARGE_US = - TIME_SINCE_LAST_FULL_CHARGE_MS * 1000; - private static final int DISCHARGE_AMOUNT = 100; - private static final long USAGE_TIME_MS = 65 * 60 * 1000; - private static final double TOTAL_POWER = 200; - private static final double PRECISION = 0.001; - private static final double POWER_USAGE_PERCENTAGE = 50; - private static final String NEW_ML_EST_SUFFIX = "(New ML est)"; - private static final String OLD_EST_SUFFIX = "(Old est)"; - private static Intent sAdditionalBatteryInfoIntent; - - @BeforeClass - public static void beforeClass() { - sAdditionalBatteryInfoIntent =new Intent("com.example.app.ADDITIONAL_BATTERY_INFO"); - } - - @Mock(answer = Answers.RETURNS_DEEP_STUBS) - private Menu mMenu; - @Mock - private MenuItem mToggleAppsMenu; - @Mock - private MenuItem mHighPowerMenu; - @Mock - private MenuInflater mMenuInflater; - @Mock - private BatterySipper mNormalBatterySipper; - @Mock - private BatterySipper mScreenBatterySipper; - @Mock - private BatterySipper mCellBatterySipper; - @Mock - private LayoutPreference mBatteryLayoutPref; - @Mock - private TextView mBatteryPercentText; - @Mock - private TextView mSummary1; - @Mock(answer = Answers.RETURNS_DEEP_STUBS) - private BatteryStatsHelper mBatteryHelper; - @Mock - private SettingsActivity mSettingsActivity; - @Mock - private LoaderManager mLoaderManager; - @Mock - private PreferenceScreen mPreferenceScreen; - @Mock - private PreferenceGroup mAppListGroup; - @Mock - private AnomalyDetectionPolicy mAnomalyDetectionPolicy; - @Mock - private BatteryHeaderPreferenceController mBatteryHeaderPreferenceController; - - private List mUsageList; - private Context mRealContext; - private TestFragment mFragment; - private FakeFeatureFactory mFeatureFactory; - private BatteryMeterView mBatteryMeterView; - private PowerGaugePreference mPreference; - private PowerGaugePreference mScreenUsagePref; - private PowerGaugePreference mLastFullChargePref; - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - - mRealContext = RuntimeEnvironment.application; - mFeatureFactory = FakeFeatureFactory.setupForTest(); - - mPreference = new PowerGaugePreference(mRealContext); - mScreenUsagePref = new PowerGaugePreference(mRealContext); - mLastFullChargePref = new PowerGaugePreference(mRealContext); - mFragment = spy(new TestFragment(mRealContext)); - mFragment.initFeatureProvider(); - mBatteryMeterView = new BatteryMeterView(mRealContext); - mBatteryMeterView.mDrawable = new BatteryMeterView.BatteryMeterDrawable(mRealContext, 0); - doNothing().when(mFragment).restartBatteryStatsLoader(); - doReturn(mock(LoaderManager.class)).when(mFragment).getLoaderManager(); - - when(mFragment.getActivity()).thenReturn(mSettingsActivity); - when(mToggleAppsMenu.getItemId()).thenReturn(MENU_TOGGLE_APPS); - when(mHighPowerMenu.getItemId()).thenReturn(MENU_HIGH_POWER_APPS); - when(mFeatureFactory.powerUsageFeatureProvider.getAdditionalBatteryInfoIntent()) - .thenReturn(sAdditionalBatteryInfoIntent); - when(mBatteryHelper.getTotalPower()).thenReturn(TOTAL_POWER); - when(mBatteryHelper.getStats().computeBatteryRealtime(anyLong(), anyInt())) - .thenReturn(TIME_SINCE_LAST_FULL_CHARGE_US); - - when(mNormalBatterySipper.getPackages()).thenReturn(PACKAGE_NAMES); - when(mNormalBatterySipper.getUid()).thenReturn(UID); - mNormalBatterySipper.totalPowerMah = POWER_MAH; - mNormalBatterySipper.drainType = BatterySipper.DrainType.APP; - - mCellBatterySipper.drainType = BatterySipper.DrainType.CELL; - mCellBatterySipper.totalPowerMah = POWER_MAH; - - when(mBatteryLayoutPref.findViewById(R.id.summary1)).thenReturn(mSummary1); - when(mBatteryLayoutPref.findViewById(R.id.battery_percent)).thenReturn(mBatteryPercentText); - when(mBatteryLayoutPref.findViewById(R.id.battery_header_icon)) - .thenReturn(mBatteryMeterView); - mFragment.setBatteryLayoutPreference(mBatteryLayoutPref); - - mScreenBatterySipper.drainType = BatterySipper.DrainType.SCREEN; - mScreenBatterySipper.usageTimeMs = USAGE_TIME_MS; - - mUsageList = new ArrayList<>(); - mUsageList.add(mNormalBatterySipper); - mUsageList.add(mScreenBatterySipper); - mUsageList.add(mCellBatterySipper); - - mFragment.mStatsHelper = mBatteryHelper; - when(mBatteryHelper.getUsageList()).thenReturn(mUsageList); - mFragment.mScreenUsagePref = mScreenUsagePref; - mFragment.mLastFullChargePref = mLastFullChargePref; - mFragment.mBatteryUtils = spy(new BatteryUtils(mRealContext)); - mFragment.mAppListGroup = mAppListGroup; - } - - @Test - public void testOptionsMenu_menuHighPower_metricEventInvoked() { - mFragment.onOptionsItemSelected(mHighPowerMenu); - - verify(mFeatureFactory.metricsFeatureProvider).action(mRealContext, - MetricsProto.MetricsEvent.ACTION_SETTINGS_MENU_BATTERY_OPTIMIZATION); - } - - @Test - public void testOptionsMenu_menuAppToggle_metricEventInvoked() { - mFragment.onOptionsItemSelected(mToggleAppsMenu); - mFragment.mShowAllApps = false; - - verify(mFeatureFactory.metricsFeatureProvider).action(mRealContext, - MetricsProto.MetricsEvent.ACTION_SETTINGS_MENU_BATTERY_APPS_TOGGLE, true); - } - - @Test - public void testOptionsMenu_toggleAppsEnabled() { - when(mFeatureFactory.powerUsageFeatureProvider.isPowerAccountingToggleEnabled()) - .thenReturn(true); - mFragment.mShowAllApps = false; - - mFragment.onCreateOptionsMenu(mMenu, mMenuInflater); - - verify(mMenu).add(Menu.NONE, MENU_TOGGLE_APPS, Menu.NONE, R.string.show_all_apps); - } - - @Test - public void testOptionsMenu_clickToggleAppsMenu_dataChanged() { - testToggleAllApps(true); - testToggleAllApps(false); - } - - @Test - public void testExtractKeyFromSipper_typeAPPUidObjectNull_returnPackageNames() { - mNormalBatterySipper.uidObj = null; - mNormalBatterySipper.drainType = BatterySipper.DrainType.APP; - - final String key = mFragment.extractKeyFromSipper(mNormalBatterySipper); - assertThat(key).isEqualTo(TextUtils.concat(mNormalBatterySipper.getPackages()).toString()); - } - - @Test - public void testExtractKeyFromSipper_typeOther_returnDrainType() { - mNormalBatterySipper.uidObj = null; - mNormalBatterySipper.drainType = BatterySipper.DrainType.BLUETOOTH; - - final String key = mFragment.extractKeyFromSipper(mNormalBatterySipper); - assertThat(key).isEqualTo(mNormalBatterySipper.drainType.toString()); - } - - @Test - public void testExtractKeyFromSipper_typeUser_returnDrainTypeWithUserId() { - mNormalBatterySipper.uidObj = null; - mNormalBatterySipper.drainType = BatterySipper.DrainType.USER; - mNormalBatterySipper.userId = 2; - - final String key = mFragment.extractKeyFromSipper(mNormalBatterySipper); - assertThat(key).isEqualTo("USER2"); - } - - @Test - public void testExtractKeyFromSipper_typeAPPUidObjectNotNull_returnUid() { - mNormalBatterySipper.uidObj = new BatteryStatsImpl.Uid(new BatteryStatsImpl(), UID); - mNormalBatterySipper.drainType = BatterySipper.DrainType.APP; - - final String key = mFragment.extractKeyFromSipper(mNormalBatterySipper); - assertThat(key).isEqualTo(Integer.toString(mNormalBatterySipper.getUid())); - } - - @Test - public void testSetUsageSummary_timeLessThanOneMinute_DoNotSetSummary() { - mNormalBatterySipper.usageTimeMs = 59 * DateUtils.SECOND_IN_MILLIS; - - mFragment.setUsageSummary(mPreference, mNormalBatterySipper); - assertThat(mPreference.getSummary()).isNull(); - } - - @Test - public void testSetUsageSummary_timeMoreThanOneMinute_normalApp_setScreenSummary() { - mNormalBatterySipper.usageTimeMs = 2 * DateUtils.MINUTE_IN_MILLIS; - doReturn(mRealContext.getText(R.string.battery_used_for)).when(mFragment) - .getText(R.string.battery_used_for); - when(mFragment.getContext()).thenReturn(mRealContext); - - mFragment.setUsageSummary(mPreference, mNormalBatterySipper); - - assertThat(mPreference.getSummary().toString()).isEqualTo("Used for 2m"); - } - - @Test - public void testSetUsageSummary_timeMoreThanOneMinute_hiddenApp_setUsedSummary() { - mNormalBatterySipper.usageTimeMs = 2 * DateUtils.MINUTE_IN_MILLIS; - doReturn(true).when(mFragment.mBatteryUtils).shouldHideSipper(mNormalBatterySipper); - when(mFragment.getContext()).thenReturn(mRealContext); - - mFragment.setUsageSummary(mPreference, mNormalBatterySipper); - - assertThat(mPreference.getSummary().toString()).isEqualTo("2m"); - } - - @Test - public void testSetUsageSummary_timeMoreThanOneMinute_notApp_setUsedSummary() { - mNormalBatterySipper.usageTimeMs = 2 * DateUtils.MINUTE_IN_MILLIS; - mNormalBatterySipper.drainType = BatterySipper.DrainType.PHONE; - when(mFragment.getContext()).thenReturn(mRealContext); - - mFragment.setUsageSummary(mPreference, mNormalBatterySipper); - - assertThat(mPreference.getSummary().toString()).isEqualTo("2m"); - } - - private void testToggleAllApps(final boolean isShowApps) { - mFragment.mShowAllApps = isShowApps; - - mFragment.onOptionsItemSelected(mToggleAppsMenu); - assertThat(mFragment.mShowAllApps).isEqualTo(!isShowApps); - } - - @Test - public void testFindBatterySipperByType_findTypeScreen() { - BatterySipper sipper = - mFragment.findBatterySipperByType(mUsageList, BatterySipper.DrainType.SCREEN); - - assertThat(sipper).isSameAs(mScreenBatterySipper); - } - - @Test - public void testFindBatterySipperByType_findTypeApp() { - BatterySipper sipper = - mFragment.findBatterySipperByType(mUsageList, BatterySipper.DrainType.APP); - - assertThat(sipper).isSameAs(mNormalBatterySipper); - } - - @Test - public void testUpdateScreenPreference_showCorrectSummary() { - doReturn(mScreenBatterySipper).when(mFragment).findBatterySipperByType(any(), any()); - when(mFragment.getContext()).thenReturn(mRealContext); - final CharSequence expectedSummary = - StringUtil.formatElapsedTime(mRealContext, USAGE_TIME_MS, false); - - mFragment.updateScreenPreference(); - - assertThat(mScreenUsagePref.getSubtitle()).isEqualTo(expectedSummary); - } - - @Test - public void testUpdateLastFullChargePreference_showCorrectSummary() { - when(mFragment.getContext()).thenReturn(mRealContext); - - mFragment.updateLastFullChargePreference(TIME_SINCE_LAST_FULL_CHARGE_MS); - - assertThat(mLastFullChargePref.getSubtitle()).isEqualTo("2 hours ago"); - } - - @Test - public void testUpdatePreference_usageListEmpty_shouldNotCrash() { - when(mBatteryHelper.getUsageList()).thenReturn(new ArrayList<>()); - doReturn(STUB_STRING).when(mFragment).getString(anyInt(), any()); - when(mFragment.getContext()).thenReturn(mRealContext); - - // Should not crash when update - mFragment.updateScreenPreference(); - } - - @Test - public void testCalculatePercentage() { - final double percent = mFragment.calculatePercentage(POWER_MAH, DISCHARGE_AMOUNT); - assertThat(percent).isWithin(PRECISION).of(POWER_USAGE_PERCENTAGE); - } - - @Test - public void testPreferenceControllers_getPreferenceKeys_existInPreferenceScreen() { - final Context context = RuntimeEnvironment.application; - final PowerUsageSummary fragment = new PowerUsageSummary(); - final List preferenceScreenKeys = - XmlTestUtils.getKeysFromPreferenceXml(context, fragment.getPreferenceScreenResId()); - final List preferenceKeys = new ArrayList<>(); - - for (AbstractPreferenceController controller : fragment.createPreferenceControllers(context)) { - preferenceKeys.add(controller.getPreferenceKey()); - } - - assertThat(preferenceScreenKeys).containsAllIn(preferenceKeys); - } - - @Test - public void testUpdateAnomalySparseArray() { - mFragment.mAnomalySparseArray = new SparseArray<>(); - final List anomalies = new ArrayList<>(); - final Anomaly anomaly1 = new Anomaly.Builder().setUid(UID).build(); - final Anomaly anomaly2 = new Anomaly.Builder().setUid(UID).build(); - final Anomaly anomaly3 = new Anomaly.Builder().setUid(UID_2).build(); - anomalies.add(anomaly1); - anomalies.add(anomaly2); - anomalies.add(anomaly3); - - mFragment.updateAnomalySparseArray(anomalies); - - assertThat(mFragment.mAnomalySparseArray.get(UID)).containsExactly(anomaly1, anomaly2); - assertThat(mFragment.mAnomalySparseArray.get(UID_2)).containsExactly(anomaly3); - } - - @Test - public void testInitAnomalyDetectionIfPossible_detectionEnabled_init() { - doReturn(mLoaderManager).when(mFragment).getLoaderManager(); - doReturn(mAnomalyDetectionPolicy).when(mFragment).getAnomalyDetectionPolicy(); - when(mAnomalyDetectionPolicy.isAnomalyDetectionEnabled()).thenReturn(true); - - mFragment.restartAnomalyDetectionIfPossible(); - - verify(mLoaderManager) - .restartLoader(eq(PowerUsageSummaryLegacy.ANOMALY_LOADER), eq(Bundle.EMPTY), any()); - } - - @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 testRefreshAnomalyIcon_containsAnomaly_showAnomalyIcon() { - PowerGaugePreference preference = new PowerGaugePreference(mRealContext); - final String key = mFragment.extractKeyFromUid(UID); - preference.setKey(key); - doReturn(preference).when(mAppListGroup).findPreference(key); - mFragment.mAnomalySparseArray = new SparseArray<>(); - mFragment.mAnomalySparseArray.append(UID, null); - - mFragment.refreshAnomalyIcon(); - - assertThat(preference.showAnomalyIcon()).isTrue(); - } - - @Test - public void testShouldHideSipper_typeOvercounted_returnTrue() { - mNormalBatterySipper.drainType = BatterySipper.DrainType.OVERCOUNTED; - - assertThat(mFragment.shouldHideSipper(mNormalBatterySipper)).isTrue(); - } - - @Test - public void testShouldHideSipper_typeUnaccounted_returnTrue() { - mNormalBatterySipper.drainType = BatterySipper.DrainType.UNACCOUNTED; - - assertThat(mFragment.shouldHideSipper(mNormalBatterySipper)).isTrue(); - } - - @Test - public void testShouldHideSipper_typeNormal_returnFalse() { - mNormalBatterySipper.drainType = BatterySipper.DrainType.APP; - - assertThat(mFragment.shouldHideSipper(mNormalBatterySipper)).isFalse(); - } - - @Test - public void testDebugMode() { - doReturn(true).when(mFeatureFactory.powerUsageFeatureProvider).isEstimateDebugEnabled(); - doReturn(new TextView(mRealContext)).when(mBatteryLayoutPref).findViewById(R.id.summary2); - - mFragment.restartBatteryInfoLoader(); - ArgumentCaptor listener = ArgumentCaptor.forClass( - View.OnLongClickListener.class); - verify(mSummary1).setOnLongClickListener(listener.capture()); - - // Calling the listener should disable it. - listener.getValue().onLongClick(mSummary1); - verify(mSummary1).setOnLongClickListener(null); - - // Restarting the loader should reset the listener. - mFragment.restartBatteryInfoLoader(); - verify(mSummary1, times(2)).setOnLongClickListener(any(View.OnLongClickListener.class)); - } - - @Test - public void testRestartBatteryStatsLoader_notClearHeader_quickUpdateNotInvoked() { - mFragment.mBatteryHeaderPreferenceController = mBatteryHeaderPreferenceController; - - mFragment.restartBatteryStatsLoader(false /* clearHeader */); - - verify(mBatteryHeaderPreferenceController, never()).quickUpdateHeaderPreference(); - } - - public static class TestFragment extends PowerUsageSummaryLegacy { - - private Context mContext; - - public TestFragment(Context context) { - mContext = context; - } - - @Override - public Context getContext() { - return mContext; - } - - @Override - public void startActivity(Intent intent) { - } - - @Override - protected void refreshUi() { - // Leave it empty for toggle apps menu test - } - - @Override - void showBothEstimates() { - List fakeBatteryInfo = new ArrayList<>(2); - BatteryInfo info1 = new BatteryInfo(); - info1.batteryLevel = 10; - info1.remainingTimeUs = 10000; - info1.discharging = true; - - BatteryInfo info2 = new BatteryInfo(); - info2.batteryLevel = 10; - info2.remainingTimeUs = 10000; - info2.discharging = true; - - fakeBatteryInfo.add(info1); - fakeBatteryInfo.add(info2); - updateViews(fakeBatteryInfo); - } - } -}