diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerV2.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerV2.java index 2be6204f4f8..84b90c34c87 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerV2.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerV2.java @@ -106,6 +106,10 @@ public class BatteryChartPreferenceControllerV2 extends AbstractPreferenceContro private boolean mIsFooterPrefAdded = false; private PreferenceScreen mPreferenceScreen; private FooterPreference mFooterPreference; + // Daily view model only saves abbreviated day of week texts (e.g. MON). This field saves the + // full day of week texts (e.g. Monday), which is used in category title and battery detail + // page. + private List mDailyTimestampFullTexts; private BatteryChartViewModel mDailyViewModel; private List mHourlyViewModels; @@ -266,15 +270,20 @@ public class BatteryChartPreferenceControllerV2 extends AbstractPreferenceContro }); Log.d(TAG, "getBatteryLevelData: " + batteryLevelData); if (batteryLevelData == null) { + mDailyTimestampFullTexts = null; mDailyViewModel = null; mHourlyViewModels = null; addFooterPreferenceIfNeeded(false); return; } + mDailyTimestampFullTexts = generateTimestampDayOfWeekTexts( + mContext, batteryLevelData.getDailyBatteryLevels().getTimestamps(), + /* isAbbreviation= */ false); mDailyViewModel = new BatteryChartViewModel( batteryLevelData.getDailyBatteryLevels().getLevels(), generateTimestampDayOfWeekTexts( - mContext, batteryLevelData.getDailyBatteryLevels().getTimestamps()), + mContext, batteryLevelData.getDailyBatteryLevels().getTimestamps(), + /* isAbbreviation= */ true), mDailyChartIndex, BatteryChartViewModel.AxisLabelPosition.CENTER_OF_TRAPEZOIDS); mHourlyViewModels = new ArrayList<>(); @@ -506,9 +515,33 @@ public class BatteryChartPreferenceControllerV2 extends AbstractPreferenceContro } } - private String getSlotInformation() { - // TODO: Generate the right slot information from daily and hourly chart selection. - return null; + @VisibleForTesting + String getSlotInformation() { + if (mDailyTimestampFullTexts == null || mDailyViewModel == null + || mHourlyViewModels == null) { + // No data + return null; + } + if (isAllSelected()) { + return null; + } + + final String selectedDayText = mDailyTimestampFullTexts.get(mDailyChartIndex); + if (mHourlyChartIndex == BatteryChartViewModel.SELECTED_INDEX_ALL) { + return selectedDayText; + } + + final String fromHourText = mHourlyViewModels.get(mDailyChartIndex).texts().get( + mHourlyChartIndex); + final String toHourText = mHourlyViewModels.get(mDailyChartIndex).texts().get( + mHourlyChartIndex + 1); + final String selectedHourText = + String.format("%s%s%s", fromHourText, mIs24HourFormat ? "-" : " - ", toHourText); + if (isBatteryLevelDataInOneDay()) { + return selectedHourText; + } + + return String.format("%s %s", selectedDayText, selectedHourText); } @VisibleForTesting @@ -578,14 +611,20 @@ public class BatteryChartPreferenceControllerV2 extends AbstractPreferenceContro } private boolean isBatteryLevelDataInOneDay() { - return mHourlyViewModels.size() == 1; + return mHourlyViewModels != null && mHourlyViewModels.size() == 1; } - private static List generateTimestampDayOfWeekTexts( - @NonNull final Context context, @NonNull final List timestamps) { + private boolean isAllSelected() { + return (isBatteryLevelDataInOneDay() + || mDailyChartIndex == BatteryChartViewModel.SELECTED_INDEX_ALL) + && mHourlyChartIndex == BatteryChartViewModel.SELECTED_INDEX_ALL; + } + + private static List generateTimestampDayOfWeekTexts(@NonNull final Context context, + @NonNull final List timestamps, final boolean isAbbreviation) { final ArrayList texts = new ArrayList<>(); for (Long timestamp : timestamps) { - texts.add(ConvertUtils.utcToLocalTimeDayOfWeek(context, timestamp)); + texts.add(ConvertUtils.utcToLocalTimeDayOfWeek(context, timestamp, isAbbreviation)); } return texts; } diff --git a/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java b/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java index b89bfe68bad..8d2013ce793 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java +++ b/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java @@ -150,10 +150,12 @@ public final class ConvertUtils { } /** Converts UTC timestamp to local time day of week data. */ - public static String utcToLocalTimeDayOfWeek(final Context context, final long timestamp) { + public static String utcToLocalTimeDayOfWeek( + final Context context, final long timestamp, final boolean isAbbreviation) { final Locale locale = getLocale(context); - final String pattern = DateFormat.getBestDateTimePattern(locale, "E"); - return DateFormat.format(pattern, timestamp).toString().toUpperCase(locale); + final String pattern = DateFormat.getBestDateTimePattern(locale, + isAbbreviation ? "E" : "EEEE"); + return DateFormat.format(pattern, timestamp).toString(); } /** Gets indexed battery usage data for each corresponding time slot. */ diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerV2Test.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerV2Test.java index f78653c523f..989790e59cd 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerV2Test.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerV2Test.java @@ -188,7 +188,7 @@ public final class BatteryChartPreferenceControllerV2Test { verify(mHourlyChartView, atLeastOnce()).setVisibility(View.GONE); verify(mDailyChartView).setViewModel(new BatteryChartViewModel( List.of(100, 83, 59, 41), - List.of("SAT", "SUN", "MON", "MON"), + List.of("Sat", "Sun", "Mon", "Mon"), BatteryChartViewModel.SELECTED_INDEX_ALL, BatteryChartViewModel.AxisLabelPosition.CENTER_OF_TRAPEZOIDS)); @@ -200,7 +200,7 @@ public final class BatteryChartPreferenceControllerV2Test { verify(mHourlyChartView).setVisibility(View.VISIBLE); verify(mDailyChartView).setViewModel(new BatteryChartViewModel( List.of(100, 83, 59, 41), - List.of("SAT", "SUN", "MON", "MON"), + List.of("Sat", "Sun", "Mon", "Mon"), 0, BatteryChartViewModel.AxisLabelPosition.CENTER_OF_TRAPEZOIDS)); verify(mHourlyChartView).setViewModel(new BatteryChartViewModel( @@ -219,7 +219,7 @@ public final class BatteryChartPreferenceControllerV2Test { verify(mHourlyChartView).setVisibility(View.VISIBLE); verify(mDailyChartView).setViewModel(new BatteryChartViewModel( List.of(100, 83, 59, 41), - List.of("SAT", "SUN", "MON", "MON"), + List.of("Sat", "Sun", "Mon", "Mon"), 1, BatteryChartViewModel.AxisLabelPosition.CENTER_OF_TRAPEZOIDS)); verify(mHourlyChartView).setViewModel(new BatteryChartViewModel( @@ -239,7 +239,7 @@ public final class BatteryChartPreferenceControllerV2Test { verify(mHourlyChartView).setVisibility(View.VISIBLE); verify(mDailyChartView).setViewModel(new BatteryChartViewModel( List.of(100, 83, 59, 41), - List.of("SAT", "SUN", "MON", "MON"), + List.of("Sat", "Sun", "Mon", "Mon"), 2, BatteryChartViewModel.AxisLabelPosition.CENTER_OF_TRAPEZOIDS)); verify(mHourlyChartView).setViewModel(new BatteryChartViewModel( @@ -355,7 +355,7 @@ public final class BatteryChartPreferenceControllerV2Test { } @Test - public void handlePreferenceTreeiClick_notPowerGaugePreference_returnFalse() { + public void handlePreferenceTreeClick_notPowerGaugePreference_returnFalse() { assertThat(mBatteryChartPreferenceController.handlePreferenceTreeClick(mAppListGroup)) .isFalse(); @@ -523,6 +523,8 @@ public final class BatteryChartPreferenceControllerV2Test { mBatteryChartPreferenceController.mExpandDividerPreference = spy(new ExpandDividerPreference(mContext)); // Simulates select all condition. + mBatteryChartPreferenceController.mDailyChartIndex = + BatteryChartViewModel.SELECTED_INDEX_ALL; mBatteryChartPreferenceController.mHourlyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL; @@ -542,23 +544,79 @@ public final class BatteryChartPreferenceControllerV2Test { .isEqualTo("System usage since last full charge"); } + @Test + public void selectedSlotText_selectAllDaysAllHours_returnNull() { + mBatteryChartPreferenceController.setBatteryHistoryMap(createBatteryHistoryMap(60)); + mBatteryChartPreferenceController.mDailyChartIndex = + BatteryChartViewModel.SELECTED_INDEX_ALL; + mBatteryChartPreferenceController.mHourlyChartIndex = + BatteryChartViewModel.SELECTED_INDEX_ALL; + + assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo(null); + } + + @Test + public void selectedSlotText_onlyOneDayDataSelectAllHours_returnNull() { + mBatteryChartPreferenceController.setBatteryHistoryMap(createBatteryHistoryMap(6)); + mBatteryChartPreferenceController.mDailyChartIndex = 0; + mBatteryChartPreferenceController.mHourlyChartIndex = + BatteryChartViewModel.SELECTED_INDEX_ALL; + + assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo(null); + } + + @Test + public void selectedSlotText_selectADayAllHours_onlyDayText() { + mBatteryChartPreferenceController.setBatteryHistoryMap(createBatteryHistoryMap(60)); + mBatteryChartPreferenceController.mDailyChartIndex = 1; + mBatteryChartPreferenceController.mHourlyChartIndex = + BatteryChartViewModel.SELECTED_INDEX_ALL; + + assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo("Sunday"); + } + + @Test + public void selectedSlotText_onlyOneDayDataSelectAnHour_onlyHourText() { + mBatteryChartPreferenceController.setBatteryHistoryMap(createBatteryHistoryMap(6)); + mBatteryChartPreferenceController.mDailyChartIndex = 0; + mBatteryChartPreferenceController.mHourlyChartIndex = 1; + + assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo( + "10 am - 12 pm"); + } + + @Test + public void selectedSlotText_SelectADayAnHour_dayAndHourText() { + mBatteryChartPreferenceController.setBatteryHistoryMap(createBatteryHistoryMap(60)); + mBatteryChartPreferenceController.mDailyChartIndex = 1; + mBatteryChartPreferenceController.mHourlyChartIndex = 8; + + assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo( + "Sunday 4 pm - 6 pm"); + } + @Test public void onSaveInstanceState_restoreSelectedIndexAndExpandState() { - final int expectedIndex = 1; + final int expectedDailyIndex = 1; + final int expectedHourlyIndex = 2; final boolean isExpanded = true; final Bundle bundle = new Bundle(); - mBatteryChartPreferenceController.mHourlyChartIndex = expectedIndex; + mBatteryChartPreferenceController.mDailyChartIndex = expectedDailyIndex; + mBatteryChartPreferenceController.mHourlyChartIndex = expectedHourlyIndex; mBatteryChartPreferenceController.mIsExpanded = isExpanded; mBatteryChartPreferenceController.onSaveInstanceState(bundle); // Replaces the original controller with other values. + mBatteryChartPreferenceController.mDailyChartIndex = -1; mBatteryChartPreferenceController.mHourlyChartIndex = -1; mBatteryChartPreferenceController.mIsExpanded = false; mBatteryChartPreferenceController.onCreate(bundle); mBatteryChartPreferenceController.setBatteryHistoryMap(createBatteryHistoryMap(25)); + assertThat(mBatteryChartPreferenceController.mDailyChartIndex) + .isEqualTo(expectedDailyIndex); assertThat(mBatteryChartPreferenceController.mHourlyChartIndex) - .isEqualTo(expectedIndex); + .isEqualTo(expectedHourlyIndex); assertThat(mBatteryChartPreferenceController.mIsExpanded).isTrue(); }