diff --git a/res/values/strings.xml b/res/values/strings.xml
index 003cd9b..0f51ddd 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6611,8 +6611,12 @@
     <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. -->
-    <string name="battery_usage_time_info_and_battery_level"><xliff:g id="time_info" example="Battery usage for Monday 6 AM - 8 AM">%1$s</xliff:g> <xliff:g id="battery_level" example="Battery level percentage from 83% to 59%">%2$s</xliff:g></string>
+    <!-- [CHAR_LIMIT=NONE] Accessibility content description for each slot in battery chart view. Please reuse the words in tc/6732629268310936155 -->
+    <string name="battery_usage_status_time_info_and_battery_level"><xliff:g id="selected_status" example="Selected">%1$s</xliff:g>, <xliff:g id="time_info" example="Battery usage for Monday 6 AM - 8 AM">%2$s</xliff:g> <xliff:g id="battery_level" example="Battery level percentage from 83% to 59%">%3$s</xliff:g></string>
+    <!-- [CHAR_LIMIT=NONE] Accessibility content description for the battery usage slot is selected. -->
+    <string name="battery_chart_slot_status_selected">Selected</string>
+    <!-- [CHAR_LIMIT=NONE] Accessibility content description for the battery usage slot is not selected -->
+    <string name="battery_chart_slot_status_unselected">Unselected</string>
     <!-- [CHAR_LIMIT=NONE] Accessibility content description for battery chart view. -->
     <string name="battery_usage_chart">Battery usage chart</string>
     <!-- [CHAR_LIMIT=NONE] Accessibility content description for daily battery chart view. -->
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java
index a248bdf..2681067 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java
@@ -16,6 +16,9 @@
 
 package com.android.settings.fuelgauge.batteryusage;
 
+import static com.android.settings.fuelgauge.batteryusage.BatteryChartViewModel.SELECTED_INDEX_ALL;
+import static com.android.settings.fuelgauge.batteryusage.BatteryChartViewModel.SELECTED_INDEX_INVALID;
+
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
 import android.app.settings.SettingsEnums;
@@ -82,10 +85,10 @@
     @VisibleForTesting TextView mChartSummaryTextView;
     @VisibleForTesting BatteryChartView mDailyChartView;
     @VisibleForTesting BatteryChartView mHourlyChartView;
-    @VisibleForTesting int mDailyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL;
-    @VisibleForTesting int mHourlyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL;
-    @VisibleForTesting int mDailyHighlightSlotIndex = BatteryChartViewModel.SELECTED_INDEX_INVALID;
-    @VisibleForTesting int mHourlyHighlightSlotIndex = BatteryChartViewModel.SELECTED_INDEX_INVALID;
+    @VisibleForTesting int mDailyChartIndex = SELECTED_INDEX_ALL;
+    @VisibleForTesting int mHourlyChartIndex = SELECTED_INDEX_ALL;
+    @VisibleForTesting int mDailyHighlightSlotIndex = SELECTED_INDEX_INVALID;
+    @VisibleForTesting int mHourlyHighlightSlotIndex = SELECTED_INDEX_INVALID;
 
     private boolean mIs24HourFormat;
     private View mBatteryChartViewGroup;
@@ -198,8 +201,8 @@
                 getTotalHours(batteryLevelData));
 
         if (batteryLevelData == null) {
-            mDailyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL;
-            mHourlyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL;
+            mDailyChartIndex = SELECTED_INDEX_ALL;
+            mHourlyChartIndex = SELECTED_INDEX_ALL;
             mDailyViewModel = null;
             mHourlyViewModels = null;
             refreshUi();
@@ -226,9 +229,9 @@
     }
 
     boolean isHighlightSlotFocused() {
-        return (mDailyHighlightSlotIndex != BatteryChartViewModel.SELECTED_INDEX_INVALID
+        return (mDailyHighlightSlotIndex != SELECTED_INDEX_INVALID
                 && mDailyHighlightSlotIndex == mDailyChartIndex
-                && mHourlyHighlightSlotIndex != BatteryChartViewModel.SELECTED_INDEX_INVALID
+                && mHourlyHighlightSlotIndex != SELECTED_INDEX_INVALID
                 && mHourlyHighlightSlotIndex == mHourlyChartIndex);
     }
 
@@ -242,8 +245,8 @@
     }
 
     void selectHighlightSlotIndex() {
-        if (mDailyHighlightSlotIndex == BatteryChartViewModel.SELECTED_INDEX_INVALID
-                || mHourlyHighlightSlotIndex == BatteryChartViewModel.SELECTED_INDEX_INVALID) {
+        if (mDailyHighlightSlotIndex == SELECTED_INDEX_INVALID
+                || mHourlyHighlightSlotIndex == SELECTED_INDEX_INVALID) {
             return;
         }
         if (mDailyHighlightSlotIndex == mDailyChartIndex
@@ -258,8 +261,11 @@
                         "onDailyChartSelect:%d, onHourlyChartSelect:%d",
                         mDailyChartIndex, mHourlyChartIndex));
         refreshUi();
+        // The highlight slot must be selected.
         mHandler.post(
-                () -> mDailyChartView.setAccessibilityPaneTitle(getAccessibilityAnnounceMessage()));
+                () ->
+                        mDailyChartView.setAccessibilityPaneTitle(
+                                getAccessibilityAnnounceMessage(/* isSlotSelected= */ true)));
         if (mOnSelectedIndexUpdatedListener != null) {
             mOnSelectedIndexUpdatedListener.onSelectedIndexUpdated();
         }
@@ -295,15 +301,16 @@
                     }
                     Log.d(TAG, "onDailyChartSelect:" + trapezoidIndex);
                     mDailyChartIndex = trapezoidIndex;
-                    mHourlyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL;
+                    mHourlyChartIndex = SELECTED_INDEX_ALL;
                     refreshUi();
                     mHandler.post(
                             () ->
                                     mDailyChartView.setAccessibilityPaneTitle(
-                                            getAccessibilityAnnounceMessage()));
+                                            getAccessibilityAnnounceMessage(
+                                                    mDailyChartIndex != SELECTED_INDEX_ALL)));
                     mMetricsFeatureProvider.action(
                             mPrefContext,
-                            trapezoidIndex == BatteryChartViewModel.SELECTED_INDEX_ALL
+                            trapezoidIndex == SELECTED_INDEX_ALL
                                     ? SettingsEnums.ACTION_BATTERY_USAGE_DAILY_SHOW_ALL
                                     : SettingsEnums.ACTION_BATTERY_USAGE_DAILY_TIME_SLOT,
                             mDailyChartIndex);
@@ -314,7 +321,7 @@
         mHourlyChartView = hourlyChartView;
         mHourlyChartView.setOnSelectListener(
                 trapezoidIndex -> {
-                    if (mDailyChartIndex == BatteryChartViewModel.SELECTED_INDEX_ALL) {
+                    if (mDailyChartIndex == SELECTED_INDEX_ALL) {
                         // This will happen when a daily slot and an hour slot are clicked together.
                         return;
                     }
@@ -327,10 +334,11 @@
                     mHandler.post(
                             () ->
                                     mHourlyChartView.setAccessibilityPaneTitle(
-                                            getAccessibilityAnnounceMessage()));
+                                            getAccessibilityAnnounceMessage(
+                                                    mHourlyChartIndex != SELECTED_INDEX_ALL)));
                     mMetricsFeatureProvider.action(
                             mPrefContext,
-                            trapezoidIndex == BatteryChartViewModel.SELECTED_INDEX_ALL
+                            trapezoidIndex == SELECTED_INDEX_ALL
                                     ? SettingsEnums.ACTION_BATTERY_USAGE_SHOW_ALL
                                     : SettingsEnums.ACTION_BATTERY_USAGE_TIME_SLOT,
                             mHourlyChartIndex);
@@ -378,27 +386,27 @@
         } else {
             mDailyChartView.setVisibility(View.VISIBLE);
             if (mDailyChartIndex >= mDailyViewModel.size()) {
-                mDailyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL;
+                mDailyChartIndex = SELECTED_INDEX_ALL;
             }
             mDailyViewModel.setSelectedIndex(mDailyChartIndex);
             mDailyViewModel.setHighlightSlotIndex(mDailyHighlightSlotIndex);
             mDailyChartView.setViewModel(mDailyViewModel);
         }
 
-        if (mDailyChartIndex == BatteryChartViewModel.SELECTED_INDEX_ALL) {
+        if (mDailyChartIndex == SELECTED_INDEX_ALL) {
             // Multiple days are selected, hide the hourly chart view.
             animateBatteryHourlyChartView(/* visible= */ false);
         } else {
             animateBatteryHourlyChartView(/* visible= */ true);
             final BatteryChartViewModel hourlyViewModel = mHourlyViewModels.get(mDailyChartIndex);
             if (mHourlyChartIndex >= hourlyViewModel.size()) {
-                mHourlyChartIndex = BatteryChartViewModel.SELECTED_INDEX_ALL;
+                mHourlyChartIndex = SELECTED_INDEX_ALL;
             }
             hourlyViewModel.setSelectedIndex(mHourlyChartIndex);
             hourlyViewModel.setHighlightSlotIndex(
                     (mDailyChartIndex == mDailyHighlightSlotIndex)
                             ? mHourlyHighlightSlotIndex
-                            : BatteryChartViewModel.SELECTED_INDEX_INVALID);
+                            : SELECTED_INDEX_INVALID);
             mHourlyChartView.setViewModel(hourlyViewModel);
         }
     }
@@ -416,7 +424,7 @@
                 isAccessibilityText
                         ? mDailyViewModel.getContentDescription(mDailyChartIndex)
                         : mDailyViewModel.getFullText(mDailyChartIndex);
-        if (mHourlyChartIndex == BatteryChartViewModel.SELECTED_INDEX_ALL) {
+        if (mHourlyChartIndex == SELECTED_INDEX_ALL) {
             return selectedDayText;
         }
 
@@ -441,15 +449,19 @@
             return "";
         }
 
-        if (mDailyChartIndex == BatteryChartViewModel.SELECTED_INDEX_ALL
-                || mHourlyChartIndex == BatteryChartViewModel.SELECTED_INDEX_ALL) {
+        if (mDailyChartIndex == SELECTED_INDEX_ALL || mHourlyChartIndex == SELECTED_INDEX_ALL) {
             return mDailyViewModel.getSlotBatteryLevelText(mDailyChartIndex);
         }
 
         return mHourlyViewModels.get(mDailyChartIndex).getSlotBatteryLevelText(mHourlyChartIndex);
     }
 
-    private String getAccessibilityAnnounceMessage() {
+    private String getAccessibilityAnnounceMessage(final boolean isSlotSelected) {
+        final String selectedInformation =
+                mPrefContext.getString(
+                        isSlotSelected
+                                ? R.string.battery_chart_slot_status_selected
+                                : R.string.battery_chart_slot_status_unselected);
         final String slotInformation = getSlotInformation(/* isAccessibilityText= */ true);
         final String slotInformationMessage =
                 slotInformation == null
@@ -460,7 +472,8 @@
         final String batteryLevelPercentageMessage = getBatteryLevelPercentageInfo();
 
         return mPrefContext.getString(
-                R.string.battery_usage_time_info_and_battery_level,
+                R.string.battery_usage_status_time_info_and_battery_level,
+                selectedInformation,
                 slotInformationMessage,
                 batteryLevelPercentageMessage);
     }
@@ -533,9 +546,8 @@
     }
 
     private boolean isAllSelected() {
-        return (isBatteryLevelDataInOneDay()
-                        || mDailyChartIndex == BatteryChartViewModel.SELECTED_INDEX_ALL)
-                && mHourlyChartIndex == BatteryChartViewModel.SELECTED_INDEX_ALL;
+        return (isBatteryLevelDataInOneDay() || mDailyChartIndex == SELECTED_INDEX_ALL)
+                && mHourlyChartIndex == SELECTED_INDEX_ALL;
     }
 
     @VisibleForTesting
@@ -571,9 +583,7 @@
             return null;
         }
         BatteryDiffData allBatteryDiffData =
-                batteryUsageData
-                        .get(BatteryChartViewModel.SELECTED_INDEX_ALL)
-                        .get(BatteryChartViewModel.SELECTED_INDEX_ALL);
+                batteryUsageData.get(SELECTED_INDEX_ALL).get(SELECTED_INDEX_ALL);
         return allBatteryDiffData == null ? null : allBatteryDiffData.getAppDiffEntryList();
     }
 
@@ -613,12 +623,9 @@
 
         @Override
         public String generateSlotBatteryLevelText(List<Integer> levels, int index) {
-            final int fromBatteryLevelIndex =
-                    index == BatteryChartViewModel.SELECTED_INDEX_ALL ? 0 : index;
+            final int fromBatteryLevelIndex = index == SELECTED_INDEX_ALL ? 0 : index;
             final int toBatteryLevelIndex =
-                    index == BatteryChartViewModel.SELECTED_INDEX_ALL
-                            ? levels.size() - 1
-                            : index + 1;
+                    index == SELECTED_INDEX_ALL ? levels.size() - 1 : index + 1;
             return mPrefContext.getString(
                     R.string.battery_level_percentage,
                     generateBatteryLevelText(levels.get(fromBatteryLevelIndex)),
@@ -687,9 +694,9 @@
             return index == timestamps.size() - 1
                     ? generateText(timestamps, index)
                     : mContext.getString(
-                    R.string.battery_usage_timestamps_content_description,
-                    generateText(timestamps, index),
-                    generateText(timestamps, index + 1));
+                            R.string.battery_usage_timestamps_content_description,
+                            generateText(timestamps, index),
+                            generateText(timestamps, index + 1));
         }
 
         HourlyChartLabelTextGenerator updateSpecialCaseContext(
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java
index eafccdb..393d751 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java
@@ -17,6 +17,8 @@
 
 import static com.android.settings.Utils.formatPercentage;
 import static com.android.settings.fuelgauge.batteryusage.BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS;
+import static com.android.settings.fuelgauge.batteryusage.BatteryChartViewModel.SELECTED_INDEX_ALL;
+import static com.android.settings.fuelgauge.batteryusage.BatteryChartViewModel.SELECTED_INDEX_INVALID;
 import static com.android.settingslib.fuelgauge.BatteryStatus.BATTERY_LEVEL_UNKNOWN;
 
 import static java.lang.Math.abs;
@@ -81,7 +83,7 @@
             getContext().getResources().getConfiguration().getLayoutDirection();
 
     private BatteryChartViewModel mViewModel;
-    private int mHoveredIndex = BatteryChartViewModel.SELECTED_INDEX_INVALID;
+    private int mHoveredIndex = SELECTED_INDEX_INVALID;
     private int mDividerWidth;
     private int mDividerHeight;
     private float mTrapezoidVOffset;
@@ -245,9 +247,9 @@
                 // sent here.
                 return true;
             case MotionEvent.ACTION_HOVER_EXIT:
-                if (mHoveredIndex != BatteryChartViewModel.SELECTED_INDEX_INVALID) {
+                if (mHoveredIndex != SELECTED_INDEX_INVALID) {
                     sendAccessibilityEventForHover(AccessibilityEvent.TYPE_VIEW_HOVER_EXIT);
-                    mHoveredIndex = BatteryChartViewModel.SELECTED_INDEX_INVALID; // reset
+                    mHoveredIndex = SELECTED_INDEX_INVALID; // reset
                     invalidate();
                 }
                 // Ignore the super.onHoverEvent() because the hovered trapezoid has already been
@@ -262,7 +264,7 @@
     public void onHoverChanged(boolean hovered) {
         super.onHoverChanged(hovered);
         if (!hovered) {
-            mHoveredIndex = BatteryChartViewModel.SELECTED_INDEX_INVALID; // reset
+            mHoveredIndex = SELECTED_INDEX_INVALID; // reset
             invalidate();
         }
     }
@@ -295,9 +297,7 @@
         if (mOnSelectListener != null) {
             // Selects all if users click the same trapezoid item two times.
             mOnSelectListener.onSelect(
-                    index == mViewModel.selectedIndex()
-                            ? BatteryChartViewModel.SELECTED_INDEX_ALL
-                            : index);
+                    index == mViewModel.selectedIndex() ? SELECTED_INDEX_ALL : index);
         }
         view.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK);
     }
@@ -332,8 +332,8 @@
         setBackgroundColor(Color.TRANSPARENT);
         mTrapezoidSolidColor = Utils.getColorAccentDefaultColor(context);
         mTrapezoidColor = Utils.getDisabled(context, mTrapezoidSolidColor);
-        mTrapezoidHoverColor = context.getColor(
-                com.android.internal.R.color.materialColorSecondaryContainer);
+        mTrapezoidHoverColor =
+                context.getColor(com.android.internal.R.color.materialColorSecondaryContainer);
         // Initializes the divider line paint.
         final Resources resources = getContext().getResources();
         mDividerWidth = resources.getDimensionPixelSize(R.dimen.chartview_divider_width);
@@ -623,8 +623,7 @@
             // Configures the trapezoid paint color.
             final int trapezoidColor =
                     (mViewModel.selectedIndex() == index
-                                    || mViewModel.selectedIndex()
-                                            == BatteryChartViewModel.SELECTED_INDEX_ALL)
+                                    || mViewModel.selectedIndex() == SELECTED_INDEX_ALL)
                             ? mTrapezoidSolidColor
                             : mTrapezoidColor;
             final boolean isHoverState =
@@ -659,9 +658,7 @@
     }
 
     private boolean isHighlightSlotValid() {
-        return mViewModel != null
-                && mViewModel.getHighlightSlotIndex()
-                        != BatteryChartViewModel.SELECTED_INDEX_INVALID;
+        return mViewModel != null && mViewModel.getHighlightSlotIndex() != SELECTED_INDEX_INVALID;
     }
 
     private void drawTransomLine(Canvas canvas) {
@@ -715,7 +712,7 @@
     // Searches the corresponding trapezoid index from x location.
     private int getTrapezoidIndex(float x) {
         if (mTrapezoidSlots == null) {
-            return BatteryChartViewModel.SELECTED_INDEX_INVALID;
+            return SELECTED_INDEX_INVALID;
         }
         for (int index = 0; index < mTrapezoidSlots.length; index++) {
             final TrapezoidSlot slot = mTrapezoidSlots[index];
@@ -723,7 +720,7 @@
                 return index;
             }
         }
-        return BatteryChartViewModel.SELECTED_INDEX_INVALID;
+        return SELECTED_INDEX_INVALID;
     }
 
     private void initializeAxisLabelsBounds() {
@@ -796,7 +793,11 @@
             childInfo.setText(slotTimeInfo);
             childInfo.setContentDescription(
                     mContext.getString(
-                            R.string.battery_usage_time_info_and_battery_level,
+                            R.string.battery_usage_status_time_info_and_battery_level,
+                            mContext.getString(
+                                    mViewModel.selectedIndex() == virtualViewId
+                                            ? R.string.battery_chart_slot_status_selected
+                                            : R.string.battery_chart_slot_status_unselected),
                             slotTimeInfo,
                             batteryLevelInfo));
             childInfo.setAccessibilityFocused(virtualViewId == mAccessibilityFocusNodeViewId);
