Merge "Update accessibility content description for battery usage chart view." into main

This commit is contained in:
Xinyi Mao
2024-01-09 04:00:23 +00:00
committed by Android (Google) Code Review
5 changed files with 97 additions and 11 deletions

View File

@@ -5866,12 +5866,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> <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"). --> <!-- [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> <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. --> <!-- [CHAR_LIMIT=NONE] Accessibility content description for battery chart view. -->
<string name="battery_usage_chart">Battery usage chart</string> <string name="battery_usage_chart">Battery usage chart</string>
<!-- [CHAR_LIMIT=NONE] Accessibility content description for daily battery chart view. --> <!-- [CHAR_LIMIT=NONE] Accessibility content description for daily battery chart view. -->
<string name="daily_battery_usage_chart">Daily battery usage chart</string> <string name="daily_battery_usage_chart">Daily battery usage chart</string>
<!-- [CHAR_LIMIT=NONE] Accessibility content description for hourly battery chart view. --> <!-- [CHAR_LIMIT=NONE] Accessibility content description for hourly battery chart view. -->
<string name="hourly_battery_usage_chart">Hourly battery usage chart</string> <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 --> <!-- [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> <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 --> <!-- [CHAR_LIMIT=NONE] Battery usage breakdown title for a selected slot -->

View File

@@ -35,6 +35,7 @@ import androidx.preference.PreferenceScreen;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.SettingsActivity; import com.android.settings.SettingsActivity;
import com.android.settings.Utils;
import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.AbstractPreferenceController;
@@ -427,13 +428,35 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
R.string.battery_usage_day_and_hour, selectedDayText, selectedHourText); 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() { private String getAccessibilityAnnounceMessage() {
final String slotInformation = getSlotInformation(); final String slotInformation = getSlotInformation();
return slotInformation == null final String slotInformationMessage =
? mPrefContext.getString( slotInformation == null
R.string.battery_usage_breakdown_title_since_last_full_charge) ? mPrefContext.getString(
: mPrefContext.getString( R.string.battery_usage_breakdown_title_since_last_full_charge)
R.string.battery_usage_breakdown_title_for_slot, slotInformation); : 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() { private void animateBatteryChartViewGroup() {
@@ -573,7 +596,29 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
return null; 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 { implements BatteryChartViewModel.LabelTextGenerator {
@Override @Override
public String generateText(List<Long> timestamps, int index) { 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 { implements BatteryChartViewModel.LabelTextGenerator {
private static final int FULL_CHARGE_BATTERY_LEVEL = 100; private static final int FULL_CHARGE_BATTERY_LEVEL = 100;

View File

@@ -784,10 +784,16 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
} }
final AccessibilityNodeInfo childInfo = final AccessibilityNodeInfo childInfo =
new AccessibilityNodeInfo(BatteryChartView.this, index); new AccessibilityNodeInfo(BatteryChartView.this, index);
final String slotTimeInfo = mViewModel.getFullText(index);
final String batteryLevelInfo = mViewModel.getSlotBatteryLevelText(index);
onInitializeAccessibilityNodeInfo(childInfo); onInitializeAccessibilityNodeInfo(childInfo);
childInfo.setClickable(isValidToDraw(mViewModel, index)); childInfo.setClickable(isValidToDraw(mViewModel, index));
childInfo.setText(mViewModel.getFullText(index)); childInfo.setText(slotTimeInfo);
childInfo.setContentDescription(mViewModel.getFullText(index)); childInfo.setContentDescription(
mContext.getString(
R.string.battery_usage_time_info_and_battery_level,
slotTimeInfo,
batteryLevelInfo));
final Rect bounds = new Rect(); final Rect bounds = new Rect();
getBoundsOnScreen(bounds, true); getBoundsOnScreen(bounds, true);

View File

@@ -40,11 +40,14 @@ class BatteryChartViewModel {
} }
interface LabelTextGenerator { 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); 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); 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; private final List<Integer> mLevels;
@@ -53,6 +56,7 @@ class BatteryChartViewModel {
private final LabelTextGenerator mLabelTextGenerator; private final LabelTextGenerator mLabelTextGenerator;
private final String[] mTexts; private final String[] mTexts;
private final String[] mFullTexts; private final String[] mFullTexts;
private final String[] mBatteryLevelTexts;
private int mSelectedIndex = SELECTED_INDEX_ALL; private int mSelectedIndex = SELECTED_INDEX_ALL;
private int mHighlightSlotIndex = SELECTED_INDEX_INVALID; private int mHighlightSlotIndex = SELECTED_INDEX_INVALID;
@@ -75,6 +79,8 @@ class BatteryChartViewModel {
mLabelTextGenerator = labelTextGenerator; mLabelTextGenerator = labelTextGenerator;
mTexts = new String[size()]; mTexts = new String[size()];
mFullTexts = new String[size()]; mFullTexts = new String[size()];
// Last one for SELECTED_INDEX_ALL
mBatteryLevelTexts = new String[size() + 1];
} }
public int size() { public int size() {
@@ -99,6 +105,15 @@ class BatteryChartViewModel {
return mFullTexts[index]; 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() { public AxisLabelPosition axisLabelPosition() {
return mAxisLabelPosition; return mAxisLabelPosition;
} }

View File

@@ -384,6 +384,8 @@ public final class BatteryChartPreferenceControllerTest {
mBatteryChartPreferenceController.mHourlyChartIndex = SELECTED_INDEX_ALL; mBatteryChartPreferenceController.mHourlyChartIndex = SELECTED_INDEX_ALL;
assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo(null); assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo(null);
assertThat(mBatteryChartPreferenceController.getBatteryLevelPercentageInfo())
.isEqualTo("Battery level percentage from 100% to 66%");
} }
@Test @Test
@@ -393,6 +395,8 @@ public final class BatteryChartPreferenceControllerTest {
mBatteryChartPreferenceController.mHourlyChartIndex = SELECTED_INDEX_ALL; mBatteryChartPreferenceController.mHourlyChartIndex = SELECTED_INDEX_ALL;
assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo(null); assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo(null);
assertThat(mBatteryChartPreferenceController.getBatteryLevelPercentageInfo())
.isEqualTo("Battery level percentage from 100% to 66%");
} }
@Test @Test
@@ -402,6 +406,8 @@ public final class BatteryChartPreferenceControllerTest {
mBatteryChartPreferenceController.mHourlyChartIndex = SELECTED_INDEX_ALL; mBatteryChartPreferenceController.mHourlyChartIndex = SELECTED_INDEX_ALL;
assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo("Sunday"); assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo("Sunday");
assertThat(mBatteryChartPreferenceController.getBatteryLevelPercentageInfo())
.isEqualTo("Battery level percentage from 83% to 59%");
} }
@Test @Test
@@ -412,6 +418,8 @@ public final class BatteryChartPreferenceControllerTest {
assertThat(mBatteryChartPreferenceController.getSlotInformation()) assertThat(mBatteryChartPreferenceController.getSlotInformation())
.isEqualTo("10 AM - 12 PM"); .isEqualTo("10 AM - 12 PM");
assertThat(mBatteryChartPreferenceController.getBatteryLevelPercentageInfo())
.isEqualTo("Battery level percentage from 97% to 95%");
} }
@Test @Test
@@ -422,6 +430,8 @@ public final class BatteryChartPreferenceControllerTest {
assertThat(mBatteryChartPreferenceController.getSlotInformation()) assertThat(mBatteryChartPreferenceController.getSlotInformation())
.isEqualTo("Sunday 4 PM - 6 PM"); .isEqualTo("Sunday 4 PM - 6 PM");
assertThat(mBatteryChartPreferenceController.getBatteryLevelPercentageInfo())
.isEqualTo("Battery level percentage from 67% to 65%");
} }
@Test @Test
@@ -432,6 +442,8 @@ public final class BatteryChartPreferenceControllerTest {
assertThat(mBatteryChartPreferenceController.getSlotInformation()) assertThat(mBatteryChartPreferenceController.getSlotInformation())
.isEqualTo("7:01 AM - 8 AM"); .isEqualTo("7:01 AM - 8 AM");
assertThat(mBatteryChartPreferenceController.getBatteryLevelPercentageInfo())
.isEqualTo("Battery level percentage from 100% to 99%");
} }
@Test @Test
@@ -441,6 +453,8 @@ public final class BatteryChartPreferenceControllerTest {
mBatteryChartPreferenceController.mHourlyChartIndex = 3; mBatteryChartPreferenceController.mHourlyChartIndex = 3;
assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo("12 PM - now"); assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo("12 PM - now");
assertThat(mBatteryChartPreferenceController.getBatteryLevelPercentageInfo())
.isEqualTo("Battery level percentage from 95% to 66%");
} }
@Test @Test
@@ -451,6 +465,8 @@ public final class BatteryChartPreferenceControllerTest {
assertThat(mBatteryChartPreferenceController.getSlotInformation()) assertThat(mBatteryChartPreferenceController.getSlotInformation())
.isEqualTo("7:01 AM - now"); .isEqualTo("7:01 AM - now");
assertThat(mBatteryChartPreferenceController.getBatteryLevelPercentageInfo())
.isEqualTo("Battery level percentage from 100% to 66%");
} }
@Test @Test