Merge "Prevent excessive accessibility announcements in TimePicker" into lmp-mr1-dev

This commit is contained in:
Alan Viverette
2014-10-21 18:16:24 +00:00
committed by Android (Google) Code Review

View File

@@ -105,6 +105,10 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
private String mMinutePickerDescription; private String mMinutePickerDescription;
private String mSelectMinutes; private String mSelectMinutes;
// Most recent time announcement values for accessibility.
private CharSequence mLastAnnouncedText;
private boolean mLastAnnouncedIsHour;
private Calendar mTempCalendar; private Calendar mTempCalendar;
public TimePickerSpinnerDelegate(TimePicker delegator, Context context, AttributeSet attrs, public TimePickerSpinnerDelegate(TimePicker delegator, Context context, AttributeSet attrs,
@@ -224,11 +228,11 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
// Enable or disable the AM/PM view. // Enable or disable the AM/PM view.
updateHeaderAmPm(); updateHeaderAmPm();
// Update Hour and Minutes // Update Hour and Minutes
updateHeaderHour(mInitialHourOfDay, true); updateHeaderHour(mInitialHourOfDay, false);
// Update time separator // Update time separator
updateHeaderSeparator(); updateHeaderSeparator();
// Update Minutes // Update Minutes
updateHeaderMinute(mInitialMinute); updateHeaderMinute(mInitialMinute, false);
// Invalidate everything // Invalidate everything
mDelegator.invalidate(); mDelegator.invalidate();
} }
@@ -293,7 +297,7 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
return; return;
} }
mInitialHourOfDay = currentHour; mInitialHourOfDay = currentHour;
updateHeaderHour(currentHour, true /* accessibility announce */); updateHeaderHour(currentHour, true);
updateHeaderAmPm(); updateHeaderAmPm();
mRadialTimePickerView.setCurrentHour(currentHour); mRadialTimePickerView.setCurrentHour(currentHour);
mRadialTimePickerView.setAmOrPm(mInitialHourOfDay < 12 ? AM : PM); mRadialTimePickerView.setAmOrPm(mInitialHourOfDay < 12 ? AM : PM);
@@ -329,7 +333,7 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
return; return;
} }
mInitialMinute = currentMinute; mInitialMinute = currentMinute;
updateHeaderMinute(currentMinute); updateHeaderMinute(currentMinute, true);
mRadialTimePickerView.setCurrentMinute(currentMinute); mRadialTimePickerView.setCurrentMinute(currentMinute);
mDelegator.invalidate(); mDelegator.invalidate();
onTimeChanged(); onTimeChanged();
@@ -357,7 +361,7 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
generateLegalTimesTree(); generateLegalTimesTree();
int hour = mRadialTimePickerView.getCurrentHour(); int hour = mRadialTimePickerView.getCurrentHour();
mInitialHourOfDay = hour; mInitialHourOfDay = hour;
updateHeaderHour(hour, false /* no accessibility announce */); updateHeaderHour(hour, false);
updateHeaderAmPm(); updateHeaderAmPm();
updateRadialPicker(mRadialTimePickerView.getCurrentItemShowing()); updateRadialPicker(mRadialTimePickerView.getCurrentItemShowing());
mDelegator.invalidate(); mDelegator.invalidate();
@@ -604,19 +608,17 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
@Override @Override
public void onValueSelected(int pickerIndex, int newValue, boolean autoAdvance) { public void onValueSelected(int pickerIndex, int newValue, boolean autoAdvance) {
if (pickerIndex == HOUR_INDEX) { if (pickerIndex == HOUR_INDEX) {
updateHeaderHour(newValue, false);
String announcement = String.format("%d", newValue);
if (mAllowAutoAdvance && autoAdvance) { if (mAllowAutoAdvance && autoAdvance) {
updateHeaderHour(newValue, false);
setCurrentItemShowing(MINUTE_INDEX, true, false); setCurrentItemShowing(MINUTE_INDEX, true, false);
announcement += ". " + mSelectMinutes; mRadialTimePickerView.announceForAccessibility(newValue + ". " + mSelectMinutes);
} else { } else {
updateHeaderHour(newValue, true);
mRadialTimePickerView.setContentDescription( mRadialTimePickerView.setContentDescription(
mHourPickerDescription + ": " + newValue); mHourPickerDescription + ": " + newValue);
} }
mRadialTimePickerView.announceForAccessibility(announcement);
} else if (pickerIndex == MINUTE_INDEX){ } else if (pickerIndex == MINUTE_INDEX){
updateHeaderMinute(newValue); updateHeaderMinute(newValue, true);
mRadialTimePickerView.setContentDescription(mMinutePickerDescription + ": " + newValue); mRadialTimePickerView.setContentDescription(mMinutePickerDescription + ": " + newValue);
} else if (pickerIndex == AMPM_INDEX) { } else if (pickerIndex == AMPM_INDEX) {
updateAmPmLabelStates(newValue); updateAmPmLabelStates(newValue);
@@ -664,7 +666,16 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
CharSequence text = String.format(format, value); CharSequence text = String.format(format, value);
mHourView.setText(text); mHourView.setText(text);
if (announce) { if (announce) {
mRadialTimePickerView.announceForAccessibility(text); tryAnnounceForAccessibility(text, true);
}
}
private void tryAnnounceForAccessibility(CharSequence text, boolean isHour) {
if (mLastAnnouncedIsHour != isHour || !text.equals(mLastAnnouncedText)) {
// TODO: Find a better solution, potentially live regions?
mDelegator.announceForAccessibility(text);
mLastAnnouncedText = text;
mLastAnnouncedIsHour = isHour;
} }
} }
@@ -715,13 +726,15 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
return -1; return -1;
} }
private void updateHeaderMinute(int value) { private void updateHeaderMinute(int value, boolean announceForAccessibility) {
if (value == 60) { if (value == 60) {
value = 0; value = 0;
} }
CharSequence text = String.format(mCurrentLocale, "%02d", value); final CharSequence text = String.format(mCurrentLocale, "%02d", value);
mRadialTimePickerView.announceForAccessibility(text);
mMinuteView.setText(text); mMinuteView.setText(text);
if (announceForAccessibility) {
tryAnnounceForAccessibility(text, false);
}
} }
/** /**
@@ -921,8 +934,8 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im
if (!allowEmptyDisplay && mTypedTimes.isEmpty()) { if (!allowEmptyDisplay && mTypedTimes.isEmpty()) {
int hour = mRadialTimePickerView.getCurrentHour(); int hour = mRadialTimePickerView.getCurrentHour();
int minute = mRadialTimePickerView.getCurrentMinute(); int minute = mRadialTimePickerView.getCurrentMinute();
updateHeaderHour(hour, true); updateHeaderHour(hour, false);
updateHeaderMinute(minute); updateHeaderMinute(minute, false);
if (!mIs24HourView) { if (!mIs24HourView) {
updateAmPmLabelStates(hour < 12 ? AM : PM); updateAmPmLabelStates(hour < 12 ? AM : PM);
} }