am 3d52809b: Merge "Prevent excessive accessibility announcements in TimePicker" into lmp-mr1-dev
* commit '3d52809bad2d96f7f39aa50e51bd53c69607cb4e': Prevent excessive accessibility announcements in TimePicker
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user