From b20f910cd180168367151cd0d0fa52111b140b69 Mon Sep 17 00:00:00 2001 From: mxyyiyi Date: Wed, 3 Jan 2024 17:15:21 +0800 Subject: [PATCH] Update accessibility content description for battery usage chart view. - Add battery level percentage description. Bug: 317000579 Test: make RunSettingsRoboTests ROBOTEST_FILTER="com.android.settings.fuelgauge.batteryusage.*" Change-Id: I03c8a97c521997170cbd72b7e0fcc88f7eb97221 --- res/values/strings.xml | 4 ++ .../BatteryChartPreferenceController.java | 59 ++++++++++++++++--- .../batteryusage/BatteryChartView.java | 10 +++- .../batteryusage/BatteryChartViewModel.java | 19 +++++- .../BatteryChartPreferenceControllerTest.java | 16 +++++ 5 files changed, 97 insertions(+), 11 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 9b4d9ee49bd..ce83035228f 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -5864,12 +5864,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