diff --git a/res/drawable/ic_cellular_1_bar.xml b/res/drawable/ic_cellular_1_bar.xml index 23caacc2244..a07e25752fe 100644 --- a/res/drawable/ic_cellular_1_bar.xml +++ b/res/drawable/ic_cellular_1_bar.xml @@ -1,5 +1,5 @@ + + + diff --git a/res/drawable/ic_settings_camera.xml b/res/drawable/ic_settings_camera.xml index 3c855323183..278d29508ce 100644 --- a/res/drawable/ic_settings_camera.xml +++ b/res/drawable/ic_settings_camera.xml @@ -1,5 +1,5 @@ + + + + diff --git a/res/layout/battery_chart_graph.xml b/res/layout/battery_chart_graph.xml index b95c6604be2..f116c8ee313 100644 --- a/res/layout/battery_chart_graph.xml +++ b/res/layout/battery_chart_graph.xml @@ -31,25 +31,33 @@ android:textColor="?android:attr/textColorSecondary" android:text="@string/battery_usage_chart_graph_hint_last_full_charge" /> - + android:layout_height="wrap_content" + android:orientation="vertical" + android:alpha="0"> + + + + - @*android:color/ripple_material_light + + + @android:color/white diff --git a/res/values/colors.xml b/res/values/colors.xml index e818a285fe6..7ca1ab2451c 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -209,4 +209,7 @@ ?androidprv:attr/colorSurface + + + ?android:attr/textColorPrimary diff --git a/res/values/strings.xml b/res/values/strings.xml index 083064f75fc..921cb5227fe 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -6790,6 +6790,10 @@ Battery usage data will be available after you use your phone for a few hours Battery usage chart + + Daily battery usage chart + + Hourly battery usage chart diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java index 88bec0d9d05..45ae8c595bf 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java @@ -65,7 +65,10 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll private static final String TAG = "BatteryChartPreferenceController"; private static final String KEY_FOOTER_PREF = "battery_graph_footer"; private static final String PACKAGE_NAME_NONE = "none"; + private static final int ENABLED_ICON_ALPHA = 255; + private static final int DISABLED_ICON_ALPHA = 255 / 3; + private static final long FADE_ANIMATION_DURATION = 350L; private static final long VALID_USAGE_TIME_DURATION = DateUtils.HOUR_IN_MILLIS * 2; private static final long VALID_DIFF_DURATION = DateUtils.MINUTE_IN_MILLIS * 3; @@ -102,6 +105,7 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll private boolean mIs24HourFormat; private boolean mIsFooterPrefAdded = false; + private View mBatteryChartViewGroup; private PreferenceScreen mPreferenceScreen; private FooterPreference mFooterPreference; // Daily view model only saves abbreviated day of week texts (e.g. MON). This field saves the @@ -202,7 +206,7 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll mPrefContext = screen.getContext(); mAppListPrefGroup = screen.findPreference(mPreferenceKey); mAppListPrefGroup.setOrderingAsAdded(false); - mAppListPrefGroup.setTitle(mPrefContext.getString(R.string.battery_app_usage)); + mAppListPrefGroup.setTitle(""); mFooterPreference = screen.findPreference(KEY_FOOTER_PREF); // Removes footer first until usage data is loaded to avoid flashing. if (mFooterPreference != null) { @@ -260,6 +264,8 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll final Map> batteryHistoryMap) { Log.d(TAG, "setBatteryHistoryMap() " + (batteryHistoryMap == null ? "null" : ("size=" + batteryHistoryMap.size()))); + // Ensure the battery chart group is visible for users. + animateBatteryChartViewGroup(); final BatteryLevelData batteryLevelData = DataProcessor.getBatteryLevelData(mContext, mHandler, batteryHistoryMap, batteryUsageMap -> { @@ -267,6 +273,11 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll refreshUi(); }); Log.d(TAG, "getBatteryLevelData: " + batteryLevelData); + mMetricsFeatureProvider.action( + mPrefContext, + SettingsEnums.ACTION_BATTERY_HISTORY_LOADED, + getTotalHours(batteryLevelData)); + if (batteryLevelData == null) { mDailyTimestampFullTexts = null; mDailyViewModel = null; @@ -297,8 +308,13 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll void setBatteryChartView(@NonNull final BatteryChartView dailyChartView, @NonNull final BatteryChartView hourlyChartView) { + final View parentView = (View) dailyChartView.getParent(); + if (parentView != null && parentView.getId() == R.id.battery_chart_group) { + mBatteryChartViewGroup = (View) dailyChartView.getParent(); + } if (mDailyChartView != dailyChartView || mHourlyChartView != hourlyChartView) { mHandler.post(() -> setBatteryChartViewInner(dailyChartView, hourlyChartView)); + animateBatteryChartViewGroup(); } } @@ -313,7 +329,12 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll mDailyChartIndex = trapezoidIndex; mHourlyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL; refreshUi(); - // TODO: Change to log daily data. + mMetricsFeatureProvider.action( + mPrefContext, + trapezoidIndex == BatteryChartViewModel.SELECTED_INDEX_ALL + ? SettingsEnums.ACTION_BATTERY_USAGE_DAILY_SHOW_ALL + : SettingsEnums.ACTION_BATTERY_USAGE_DAILY_TIME_SLOT, + mDailyChartIndex); }); mHourlyChartView = hourlyChartView; mHourlyChartView.setOnSelectListener(trapezoidIndex -> { @@ -327,7 +348,8 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll mPrefContext, trapezoidIndex == BatteryChartViewModel.SELECTED_INDEX_ALL ? SettingsEnums.ACTION_BATTERY_USAGE_SHOW_ALL - : SettingsEnums.ACTION_BATTERY_USAGE_TIME_SLOT); + : SettingsEnums.ACTION_BATTERY_USAGE_TIME_SLOT, + mHourlyChartIndex); }); refreshUi(); } @@ -452,6 +474,7 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll if (!isAdded) { mAppListPrefGroup.addPreference(pref); } + appIcon.setAlpha(pref.isEnabled() ? ENABLED_ICON_ALPHA : DISABLED_ICON_ALPHA); prefIndex++; } } @@ -601,6 +624,13 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll return !DataProcessor.contains(packageName, mNotAllowShowSummaryPackages); } + private void animateBatteryChartViewGroup() { + if (mBatteryChartViewGroup != null && mBatteryChartViewGroup.getAlpha() == 0) { + mBatteryChartViewGroup.animate().alpha(1f).setDuration(FADE_ANIMATION_DURATION) + .start(); + } + } + private void addFooterPreferenceIfNeeded(boolean containAppItems) { if (mIsFooterPrefAdded || mFooterPreference == null) { return; @@ -623,6 +653,16 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll && mHourlyChartIndex == BatteryChartViewModel.SELECTED_INDEX_ALL; } + @VisibleForTesting + static int getTotalHours(final BatteryLevelData batteryLevelData) { + if (batteryLevelData == null) { + return 0; + } + List dailyTimestamps = batteryLevelData.getDailyBatteryLevels().getTimestamps(); + return (int) ((dailyTimestamps.get(dailyTimestamps.size() - 1) - dailyTimestamps.get(0)) + / DateUtils.HOUR_IN_MILLIS); + } + private static List generateTimestampDayOfWeekTexts(@NonNull final Context context, @NonNull final List timestamps, final boolean isAbbreviation) { final ArrayList texts = new ArrayList<>(); diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryEntry.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryEntry.java index 24d6dad8f88..ccb2fb786eb 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryEntry.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryEntry.java @@ -574,7 +574,7 @@ public class BatteryEntry { break; case BatteryConsumer.POWER_COMPONENT_BLUETOOTH: name = context.getResources().getString(R.string.power_bluetooth); - iconId = com.android.internal.R.drawable.ic_settings_bluetooth; + iconId = R.drawable.ic_settings_bluetooth; break; case BatteryConsumer.POWER_COMPONENT_CAMERA: name = context.getResources().getString(R.string.power_camera); @@ -598,7 +598,7 @@ public class BatteryEntry { break; case BatteryConsumer.POWER_COMPONENT_WIFI: name = context.getResources().getString(R.string.power_wifi); - iconId = R.drawable.ic_settings_wireless; + iconId = R.drawable.ic_settings_wireless_no_theme; break; case BatteryConsumer.POWER_COMPONENT_IDLE: case BatteryConsumer.POWER_COMPONENT_MEMORY: diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryHistoryPreference.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryHistoryPreference.java index 71fd26ce95c..674822359be 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryHistoryPreference.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryHistoryPreference.java @@ -106,12 +106,11 @@ public class BatteryHistoryPreference extends Preference { return; } if (mIsChartGraphEnabled) { + final TextView companionTextView = (TextView) view.findViewById(R.id.companion_text); mDailyChartView = (BatteryChartView) view.findViewById(R.id.daily_battery_chart); - mDailyChartView.setCompanionTextView( - (TextView) view.findViewById(R.id.companion_text)); + mDailyChartView.setCompanionTextView(companionTextView); mHourlyChartView = (BatteryChartView) view.findViewById(R.id.hourly_battery_chart); - mHourlyChartView.setCompanionTextView( - (TextView) view.findViewById(R.id.companion_text)); + mHourlyChartView.setCompanionTextView(companionTextView); if (mChartPreferenceController != null) { mChartPreferenceController.setBatteryChartView(mDailyChartView, mHourlyChartView); } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java index 016287e2f87..1eead821372 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java @@ -630,6 +630,18 @@ public final class BatteryChartPreferenceControllerTest { .isFalse(); } + @Test + public void getTotalHours_getExpectedResult() { + Map> batteryHistoryMap = createBatteryHistoryMap(60); + BatteryLevelData batteryLevelData = DataProcessor.getBatteryLevelData(mContext, null, + batteryHistoryMap, null); + + final int totalHour = BatteryChartPreferenceController.getTotalHours(batteryLevelData); + + // Only calculate the even hours. + assertThat(totalHour).isEqualTo(58); + } + private static Long generateTimestamp(int index) { // "2021-04-23 07:00:00 UTC" + index hours return 1619247600000L + index * DateUtils.HOUR_IN_MILLIS; diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryEntryTest.java index 5ca3aca189f..ffc6d9a02e6 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryEntryTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryEntryTest.java @@ -307,7 +307,7 @@ public class BatteryEntryTest { R.drawable.ic_settings_aod); assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_BLUETOOTH, R.string.power_bluetooth, - com.android.internal.R.drawable.ic_settings_bluetooth); + R.drawable.ic_settings_bluetooth); assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_CAMERA, R.string.power_camera, R.drawable.ic_settings_camera); @@ -325,7 +325,7 @@ public class BatteryEntryTest { R.drawable.ic_settings_display); assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_WIFI, R.string.power_wifi, - R.drawable.ic_settings_wireless); + R.drawable.ic_settings_wireless_no_theme); assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_IDLE, R.string.power_idle, R.drawable.ic_settings_phone_idle);