Help talkback to read the hyphen of time frame '{day}{time}-{time}'

Talkback Hover: https://screenshot.googleplex.com/6Z5KMhXRPRWrqh9
Talkback Click: https://screenshot.googleplex.com/5iYVWXE95rgH98D

Bug: 322855775
Test: atest SettingsRoboTests:com.android.settings.fuelgauge.batteryusage
Change-Id: I54b78e9e29c67d514c0346ddae8331450bf53f01
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 4ee7c0e..dea6b60 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6080,6 +6080,8 @@
     <string name="battery_usage_chart_label_now">now</string>
     <!-- [CHAR_LIMIT=NONE] A hyphen for two timestamps. For example, "6 AM - 8 AM", which means "from 6 AM to 8 AM". Please notice the spaces around the hyphen -->
     <string name="battery_usage_timestamps_hyphen"><xliff:g id="from_timestamp">%1$s</xliff:g> - <xliff:g id="to_timestamp">%2$s</xliff:g></string>
+    <!-- [CHAR_LIMIT=NONE] Accessibility content description for two timestamps. For example, Battery usage for "6 AM to 8 PM" -->
+    <string name="battery_usage_timestamps_content_description"><xliff:g id="from_timestamp">%1$s</xliff:g> to <xliff:g id="to_timestamp">%2$s</xliff:g></string>
     <!-- [CHAR_LIMIT=NONE] The first slot is a week day (e.g. "Monday"); the second slot is a hourly time span (e.g. "6 AM - 8 AM"). -->
     <string name="battery_usage_day_and_hour"><xliff:g id="day">%1$s</xliff:g> <xliff:g id="hour">%2$s</xliff:g></string>
     <!-- [CHAR_LIMIT=NONE] Accessibility content description for each slot in battery chart view. -->
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java
index cf4f67f..b938c72 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java
@@ -404,7 +404,7 @@
         }
     }
 
-    String getSlotInformation() {
+    String getSlotInformation(boolean isAccessibilityText) {
         if (mDailyViewModel == null || mHourlyViewModels == null) {
             // No data
             return null;
@@ -413,13 +413,20 @@
             return null;
         }
 
-        final String selectedDayText = mDailyViewModel.getFullText(mDailyChartIndex);
+        final String selectedDayText =
+                isAccessibilityText
+                        ? mDailyViewModel.getContentDescription(mDailyChartIndex)
+                        : mDailyViewModel.getFullText(mDailyChartIndex);
         if (mHourlyChartIndex == BatteryChartViewModel.SELECTED_INDEX_ALL) {
             return selectedDayText;
         }
 
         final String selectedHourText =
-                mHourlyViewModels.get(mDailyChartIndex).getFullText(mHourlyChartIndex);
+                isAccessibilityText
+                        ? mHourlyViewModels
+                                .get(mDailyChartIndex)
+                                .getContentDescription(mHourlyChartIndex)
+                        : mHourlyViewModels.get(mDailyChartIndex).getFullText(mHourlyChartIndex);
         if (isBatteryLevelDataInOneDay()) {
             return selectedHourText;
         }
@@ -444,7 +451,7 @@
     }
 
     private String getAccessibilityAnnounceMessage() {
-        final String slotInformation = getSlotInformation();
+        final String slotInformation = getSlotInformation(/* isAccessibilityText= */ true);
         final String slotInformationMessage =
                 slotInformation == null
                         ? mPrefContext.getString(
@@ -601,6 +608,11 @@
     private abstract class BaseLabelTextGenerator
             implements BatteryChartViewModel.LabelTextGenerator {
         @Override
+        public String generateContentDescription(List<Long> timestamps, int index) {
+            return generateFullText(timestamps, index);
+        }
+
+        @Override
         public String generateSlotBatteryLevelText(List<Integer> levels, int index) {
             final int fromBatteryLevelIndex =
                     index == BatteryChartViewModel.SELECTED_INDEX_ALL ? 0 : index;
@@ -673,6 +685,16 @@
                             generateText(timestamps, index + 1));
         }
 
+        @Override
+        public String generateContentDescription(List<Long> timestamps, int index) {
+            return index == timestamps.size() - 1
+                    ? generateText(timestamps, index)
+                    : mContext.getString(
+                    R.string.battery_usage_timestamps_content_description,
+                    generateText(timestamps, index),
+                    generateText(timestamps, index + 1));
+        }
+
         HourlyChartLabelTextGenerator updateSpecialCaseContext(
                 @NonNull final BatteryLevelData batteryLevelData) {
             BatteryLevelData.PeriodBatteryLevelData firstDayLevelData =
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java
index 111a5a1..37d2fce 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java
@@ -784,7 +784,7 @@
             }
             final AccessibilityNodeInfo childInfo =
                     new AccessibilityNodeInfo(BatteryChartView.this, index);
-            final String slotTimeInfo = mViewModel.getFullText(index);
+            final String slotTimeInfo = mViewModel.getContentDescription(index);
             final String batteryLevelInfo = mViewModel.getSlotBatteryLevelText(index);
             onInitializeAccessibilityNodeInfo(childInfo);
             childInfo.setClickable(isValidToDraw(mViewModel, index));
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewModel.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewModel.java
index 86890d5..dfd15c3 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewModel.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewModel.java
@@ -43,9 +43,12 @@
         /** Generates the label text. The text may be abbreviated to save space. */
         String generateText(List<Long> timestamps, int index);
 
-        /** Generates the full text for accessibility. */
+        /** Generates the full text for slot information. */
         String generateFullText(List<Long> timestamps, int index);
 
+        /** Generates the full text for accessibility. */
+        String generateContentDescription(List<Long> timestamps, int index);
+
         /** Generates the battery level text of a slot for accessibility.*/
         String generateSlotBatteryLevelText(List<Integer> levels, int index);
     }
@@ -56,6 +59,7 @@
     private final LabelTextGenerator mLabelTextGenerator;
     private final String[] mTexts;
     private final String[] mFullTexts;
+    private final String[] mContentDescription;
     private final String[] mBatteryLevelTexts;
 
     private int mSelectedIndex = SELECTED_INDEX_ALL;
@@ -79,6 +83,7 @@
         mLabelTextGenerator = labelTextGenerator;
         mTexts = new String[size()];
         mFullTexts = new String[size()];
+        mContentDescription = new String[size()];
         // Last one for SELECTED_INDEX_ALL
         mBatteryLevelTexts = new String[size() + 1];
     }
@@ -105,6 +110,14 @@
         return mFullTexts[index];
     }
 
+    public String getContentDescription(int index) {
+        if (mContentDescription[index] == null) {
+            mContentDescription[index] =
+                    mLabelTextGenerator.generateContentDescription(mTimestamps, index);
+        }
+        return mContentDescription[index];
+    }
+
     public String getSlotBatteryLevelText(int index) {
         final int textIndex = index != SELECTED_INDEX_ALL ? index : size();
         if (mBatteryLevelTexts[textIndex] == null) {
diff --git a/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvanced.java b/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvanced.java
index 45091f6..ad29f28 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvanced.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/PowerUsageAdvanced.java
@@ -239,7 +239,9 @@
         }
         final int dailyIndex = mBatteryChartPreferenceController.getDailyChartIndex();
         final int hourlyIndex = mBatteryChartPreferenceController.getHourlyChartIndex();
-        final String slotInformation = mBatteryChartPreferenceController.getSlotInformation();
+        final String slotInformation =
+                mBatteryChartPreferenceController.getSlotInformation(
+                        /* isAccessibilityText= */ false);
         final BatteryDiffData slotUsageData = mBatteryUsageMap.get(dailyIndex).get(hourlyIndex);
         mScreenOnTimeController.handleSceenOnTimeUpdated(
                 slotUsageData != null ? slotUsageData.getScreenOnTime() : 0L, slotInformation);
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 6fb021c..f62fdb8 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java
@@ -383,7 +383,7 @@
         mBatteryChartPreferenceController.mDailyChartIndex = SELECTED_INDEX_ALL;
         mBatteryChartPreferenceController.mHourlyChartIndex = SELECTED_INDEX_ALL;
 
-        assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo(null);
+        assertThat(mBatteryChartPreferenceController.getSlotInformation(false)).isEqualTo(null);
         assertThat(mBatteryChartPreferenceController.getBatteryLevelPercentageInfo())
                 .isEqualTo("Battery level percentage from 100% to 66%");
     }
@@ -394,7 +394,7 @@
         mBatteryChartPreferenceController.mDailyChartIndex = 0;
         mBatteryChartPreferenceController.mHourlyChartIndex = SELECTED_INDEX_ALL;
 
-        assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo(null);
+        assertThat(mBatteryChartPreferenceController.getSlotInformation(false)).isEqualTo(null);
         assertThat(mBatteryChartPreferenceController.getBatteryLevelPercentageInfo())
                 .isEqualTo("Battery level percentage from 100% to 66%");
     }
@@ -405,7 +405,7 @@
         mBatteryChartPreferenceController.mDailyChartIndex = 1;
         mBatteryChartPreferenceController.mHourlyChartIndex = SELECTED_INDEX_ALL;
 
-        assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo("Sunday");
+        assertThat(mBatteryChartPreferenceController.getSlotInformation(false)).isEqualTo("Sunday");
         assertThat(mBatteryChartPreferenceController.getBatteryLevelPercentageInfo())
                 .isEqualTo("Battery level percentage from 83% to 59%");
     }
@@ -416,8 +416,10 @@
         mBatteryChartPreferenceController.mDailyChartIndex = 0;
         mBatteryChartPreferenceController.mHourlyChartIndex = 2;
 
-        assertThat(mBatteryChartPreferenceController.getSlotInformation())
+        assertThat(mBatteryChartPreferenceController.getSlotInformation(false))
                 .isEqualTo("10 AM - 12 PM");
+        assertThat(mBatteryChartPreferenceController.getSlotInformation(true))
+                .isEqualTo("10 AM to 12 PM");
         assertThat(mBatteryChartPreferenceController.getBatteryLevelPercentageInfo())
                 .isEqualTo("Battery level percentage from 97% to 95%");
     }
@@ -428,8 +430,10 @@
         mBatteryChartPreferenceController.mDailyChartIndex = 1;
         mBatteryChartPreferenceController.mHourlyChartIndex = 8;
 
-        assertThat(mBatteryChartPreferenceController.getSlotInformation())
+        assertThat(mBatteryChartPreferenceController.getSlotInformation(false))
                 .isEqualTo("Sunday 4 PM - 6 PM");
+        assertThat(mBatteryChartPreferenceController.getSlotInformation(true))
+                .isEqualTo("Sunday 4 PM to 6 PM");
         assertThat(mBatteryChartPreferenceController.getBatteryLevelPercentageInfo())
                 .isEqualTo("Battery level percentage from 67% to 65%");
     }
@@ -440,8 +444,10 @@
         mBatteryChartPreferenceController.mDailyChartIndex = 0;
         mBatteryChartPreferenceController.mHourlyChartIndex = 0;
 
-        assertThat(mBatteryChartPreferenceController.getSlotInformation())
+        assertThat(mBatteryChartPreferenceController.getSlotInformation(false))
                 .isEqualTo("7:01 AM - 8 AM");
+        assertThat(mBatteryChartPreferenceController.getSlotInformation(true))
+                .isEqualTo("7:01 AM to 8 AM");
         assertThat(mBatteryChartPreferenceController.getBatteryLevelPercentageInfo())
                 .isEqualTo("Battery level percentage from 100% to 99%");
     }
@@ -452,7 +458,10 @@
         mBatteryChartPreferenceController.mDailyChartIndex = 0;
         mBatteryChartPreferenceController.mHourlyChartIndex = 3;
 
-        assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo("12 PM - now");
+        assertThat(mBatteryChartPreferenceController.getSlotInformation(false))
+                .isEqualTo("12 PM - now");
+        assertThat(mBatteryChartPreferenceController.getSlotInformation(true))
+                .isEqualTo("12 PM to now");
         assertThat(mBatteryChartPreferenceController.getBatteryLevelPercentageInfo())
                 .isEqualTo("Battery level percentage from 95% to 66%");
     }
@@ -463,8 +472,10 @@
         mBatteryChartPreferenceController.mDailyChartIndex = 0;
         mBatteryChartPreferenceController.mHourlyChartIndex = 0;
 
-        assertThat(mBatteryChartPreferenceController.getSlotInformation())
+        assertThat(mBatteryChartPreferenceController.getSlotInformation(false))
                 .isEqualTo("7:01 AM - now");
+        assertThat(mBatteryChartPreferenceController.getSlotInformation(true))
+                .isEqualTo("7:01 AM to now");
         assertThat(mBatteryChartPreferenceController.getBatteryLevelPercentageInfo())
                 .isEqualTo("Battery level percentage from 100% to 66%");
     }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ScreenOnTimeControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ScreenOnTimeControllerTest.java
index 282ec9e..4bac42a 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ScreenOnTimeControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ScreenOnTimeControllerTest.java
@@ -68,7 +68,7 @@
     @Test
     public void handleSceenOnTimeUpdated_nullScreenOnTime_hideAllPreference() {
         mScreenOnTimeController.handleSceenOnTimeUpdated(
-                /* screenOnTime= */ null, "Friday 12:00-now");
+                /* screenOnTime= */ null, "Friday 12:00 to now");
 
         verify(mRootPreference).setVisible(false);
         verify(mScreenOnTimeTextPreference).setVisible(false);
@@ -84,9 +84,9 @@
 
     @Test
     public void showCategoryTitle_notNull_slotTimestamp() {
-        mScreenOnTimeController.showCategoryTitle("Friday 12:00-now");
+        mScreenOnTimeController.showCategoryTitle("Friday 12:00 to now");
 
-        verify(mRootPreference).setTitle("Screen time for Friday 12:00-now");
+        verify(mRootPreference).setTitle("Screen time for Friday 12:00 to now");
         verify(mRootPreference).setVisible(true);
     }