Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b20f910c authored by mxyyiyi's avatar mxyyiyi
Browse files

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
parent e8d26737
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -5864,12 +5864,16 @@
    <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] 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 battery chart view. -->
    <string name="battery_usage_chart">Battery usage chart</string>
    <!-- [CHAR_LIMIT=NONE] Accessibility content description for daily battery chart view. -->
    <string name="daily_battery_usage_chart">Daily battery usage chart</string>
    <!-- [CHAR_LIMIT=NONE] Accessibility content description for hourly battery chart view. -->
    <string name="hourly_battery_usage_chart">Hourly battery usage chart</string>
    <!-- [CHAR_LIMIT=NONE] Accessibility content description for battery level percentage. -->
    <string name="battery_level_percentage">Battery level percentage from <xliff:g id="start_percentage">%1$s</xliff:g> to <xliff:g id="end_percentage">%2$s</xliff:g></string>
    <!-- [CHAR_LIMIT=NONE] Battery usage breakdown title since last full charge -->
    <string name="battery_usage_breakdown_title_since_last_full_charge">Battery usage since last full charge</string>
    <!-- [CHAR_LIMIT=NONE] Battery usage breakdown title for a selected slot -->
+52 −7
Original line number Diff line number Diff line
@@ -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
        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<Integer> 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<Long> 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;

+8 −2
Original line number Diff line number Diff line
@@ -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);
+17 −2
Original line number Diff line number Diff line
@@ -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<Long> timestamps, int index);

        /** Generate the full text for accessibility. */
        /** Generates the full text for accessibility. */
        String generateFullText(List<Long> timestamps, int index);

        /** Generates the battery level text of a slot for accessibility.*/
        String generateSlotBatteryLevelText(List<Integer> levels, int index);
    }

    private final List<Integer> 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;
    }
+16 −0
Original line number Diff line number Diff line
@@ -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