diff --git a/res/values/strings.xml b/res/values/strings.xml
index 09cd23ce520..402f5263e51 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -5866,12 +5866,16 @@
%1$s - %2$s
%1$s %2$s
+
+ %1$s %2$s
Battery usage chart
Daily battery usage chart
Hourly battery usage chart
+
+ Battery level percentage from %1$s to %2$s
Battery usage since last full charge
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java
index 8ae8edd4be0..51dce26fdf4 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceController.java
@@ -35,6 +35,7 @@ import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
+import com.android.settings.Utils;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.AbstractPreferenceController;
@@ -427,13 +428,35 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
R.string.battery_usage_day_and_hour, selectedDayText, selectedHourText);
}
+ @VisibleForTesting
+ String getBatteryLevelPercentageInfo() {
+ if (mDailyViewModel == null || mHourlyViewModels == null) {
+ // No data
+ return "";
+ }
+
+ if (mDailyChartIndex == BatteryChartViewModel.SELECTED_INDEX_ALL
+ || mHourlyChartIndex == BatteryChartViewModel.SELECTED_INDEX_ALL) {
+ return mDailyViewModel.getSlotBatteryLevelText(mDailyChartIndex);
+ }
+
+ return mHourlyViewModels.get(mDailyChartIndex).getSlotBatteryLevelText(mHourlyChartIndex);
+ }
+
private String getAccessibilityAnnounceMessage() {
final String slotInformation = getSlotInformation();
- return slotInformation == null
- ? mPrefContext.getString(
- R.string.battery_usage_breakdown_title_since_last_full_charge)
- : mPrefContext.getString(
- R.string.battery_usage_breakdown_title_for_slot, slotInformation);
+ final String slotInformationMessage =
+ slotInformation == null
+ ? mPrefContext.getString(
+ R.string.battery_usage_breakdown_title_since_last_full_charge)
+ : mPrefContext.getString(
+ R.string.battery_usage_breakdown_title_for_slot, slotInformation);
+ final String batteryLevelPercentageMessage = getBatteryLevelPercentageInfo();
+
+ return mPrefContext.getString(
+ R.string.battery_usage_time_info_and_battery_level,
+ slotInformationMessage,
+ batteryLevelPercentageMessage);
}
private void animateBatteryChartViewGroup() {
@@ -573,7 +596,29 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
return null;
}
- private final class DailyChartLabelTextGenerator
+ private abstract class BaseLabelTextGenerator
+ implements BatteryChartViewModel.LabelTextGenerator {
+ @Override
+ public String generateSlotBatteryLevelText(List levels, int index) {
+ final int fromBatteryLevelIndex =
+ index == BatteryChartViewModel.SELECTED_INDEX_ALL ? 0 : index;
+ final int toBatteryLevelIndex =
+ index == BatteryChartViewModel.SELECTED_INDEX_ALL
+ ? levels.size() - 1
+ : index + 1;
+ return mPrefContext.getString(
+ R.string.battery_level_percentage,
+ generateBatteryLevelText(levels.get(fromBatteryLevelIndex)),
+ generateBatteryLevelText(levels.get(toBatteryLevelIndex)));
+ }
+
+ @VisibleForTesting
+ private static String generateBatteryLevelText(Integer level) {
+ return Utils.formatPercentage(level);
+ }
+ }
+
+ private final class DailyChartLabelTextGenerator extends BaseLabelTextGenerator
implements BatteryChartViewModel.LabelTextGenerator {
@Override
public String generateText(List timestamps, int index) {
@@ -588,7 +633,7 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
}
}
- private final class HourlyChartLabelTextGenerator
+ private final class HourlyChartLabelTextGenerator extends BaseLabelTextGenerator
implements BatteryChartViewModel.LabelTextGenerator {
private static final int FULL_CHARGE_BATTERY_LEVEL = 100;
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java
index 6ff52a2bc1d..111a5a1c677 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java
@@ -784,10 +784,16 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
}
final AccessibilityNodeInfo childInfo =
new AccessibilityNodeInfo(BatteryChartView.this, index);
+ final String slotTimeInfo = mViewModel.getFullText(index);
+ final String batteryLevelInfo = mViewModel.getSlotBatteryLevelText(index);
onInitializeAccessibilityNodeInfo(childInfo);
childInfo.setClickable(isValidToDraw(mViewModel, index));
- childInfo.setText(mViewModel.getFullText(index));
- childInfo.setContentDescription(mViewModel.getFullText(index));
+ childInfo.setText(slotTimeInfo);
+ childInfo.setContentDescription(
+ mContext.getString(
+ R.string.battery_usage_time_info_and_battery_level,
+ slotTimeInfo,
+ batteryLevelInfo));
final Rect bounds = new Rect();
getBoundsOnScreen(bounds, true);
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewModel.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewModel.java
index 6ec01a4c344..86890d5926e 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewModel.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewModel.java
@@ -40,11 +40,14 @@ class BatteryChartViewModel {
}
interface LabelTextGenerator {
- /** Generate the label text. The text may be abbreviated to save space. */
+ /** Generates the label text. The text may be abbreviated to save space. */
String generateText(List timestamps, int index);
- /** Generate the full text for accessibility. */
+ /** Generates the full text for accessibility. */
String generateFullText(List timestamps, int index);
+
+ /** Generates the battery level text of a slot for accessibility.*/
+ String generateSlotBatteryLevelText(List levels, int index);
}
private final List mLevels;
@@ -53,6 +56,7 @@ class BatteryChartViewModel {
private final LabelTextGenerator mLabelTextGenerator;
private final String[] mTexts;
private final String[] mFullTexts;
+ private final String[] mBatteryLevelTexts;
private int mSelectedIndex = SELECTED_INDEX_ALL;
private int mHighlightSlotIndex = SELECTED_INDEX_INVALID;
@@ -75,6 +79,8 @@ class BatteryChartViewModel {
mLabelTextGenerator = labelTextGenerator;
mTexts = new String[size()];
mFullTexts = new String[size()];
+ // Last one for SELECTED_INDEX_ALL
+ mBatteryLevelTexts = new String[size() + 1];
}
public int size() {
@@ -99,6 +105,15 @@ class BatteryChartViewModel {
return mFullTexts[index];
}
+ public String getSlotBatteryLevelText(int index) {
+ final int textIndex = index != SELECTED_INDEX_ALL ? index : size();
+ if (mBatteryLevelTexts[textIndex] == null) {
+ mBatteryLevelTexts[textIndex] =
+ mLabelTextGenerator.generateSlotBatteryLevelText(mLevels, index);
+ }
+ return mBatteryLevelTexts[textIndex];
+ }
+
public AxisLabelPosition axisLabelPosition() {
return mAxisLabelPosition;
}
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 bbb022edb3b..6fb021cbdae 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java
@@ -384,6 +384,8 @@ public final class BatteryChartPreferenceControllerTest {
mBatteryChartPreferenceController.mHourlyChartIndex = SELECTED_INDEX_ALL;
assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo(null);
+ assertThat(mBatteryChartPreferenceController.getBatteryLevelPercentageInfo())
+ .isEqualTo("Battery level percentage from 100% to 66%");
}
@Test
@@ -393,6 +395,8 @@ public final class BatteryChartPreferenceControllerTest {
mBatteryChartPreferenceController.mHourlyChartIndex = SELECTED_INDEX_ALL;
assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo(null);
+ assertThat(mBatteryChartPreferenceController.getBatteryLevelPercentageInfo())
+ .isEqualTo("Battery level percentage from 100% to 66%");
}
@Test
@@ -402,6 +406,8 @@ public final class BatteryChartPreferenceControllerTest {
mBatteryChartPreferenceController.mHourlyChartIndex = SELECTED_INDEX_ALL;
assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo("Sunday");
+ assertThat(mBatteryChartPreferenceController.getBatteryLevelPercentageInfo())
+ .isEqualTo("Battery level percentage from 83% to 59%");
}
@Test
@@ -412,6 +418,8 @@ public final class BatteryChartPreferenceControllerTest {
assertThat(mBatteryChartPreferenceController.getSlotInformation())
.isEqualTo("10 AM - 12 PM");
+ assertThat(mBatteryChartPreferenceController.getBatteryLevelPercentageInfo())
+ .isEqualTo("Battery level percentage from 97% to 95%");
}
@Test
@@ -422,6 +430,8 @@ public final class BatteryChartPreferenceControllerTest {
assertThat(mBatteryChartPreferenceController.getSlotInformation())
.isEqualTo("Sunday 4 PM - 6 PM");
+ assertThat(mBatteryChartPreferenceController.getBatteryLevelPercentageInfo())
+ .isEqualTo("Battery level percentage from 67% to 65%");
}
@Test
@@ -432,6 +442,8 @@ public final class BatteryChartPreferenceControllerTest {
assertThat(mBatteryChartPreferenceController.getSlotInformation())
.isEqualTo("7:01 AM - 8 AM");
+ assertThat(mBatteryChartPreferenceController.getBatteryLevelPercentageInfo())
+ .isEqualTo("Battery level percentage from 100% to 99%");
}
@Test
@@ -441,6 +453,8 @@ public final class BatteryChartPreferenceControllerTest {
mBatteryChartPreferenceController.mHourlyChartIndex = 3;
assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo("12 PM - now");
+ assertThat(mBatteryChartPreferenceController.getBatteryLevelPercentageInfo())
+ .isEqualTo("Battery level percentage from 95% to 66%");
}
@Test
@@ -451,6 +465,8 @@ public final class BatteryChartPreferenceControllerTest {
assertThat(mBatteryChartPreferenceController.getSlotInformation())
.isEqualTo("7:01 AM - now");
+ assertThat(mBatteryChartPreferenceController.getBatteryLevelPercentageInfo())
+ .isEqualTo("Battery level percentage from 100% to 66%");
}
@Test