diff options
author | Alan Viverette <alanv@google.com> | 2014-10-21 18:16:24 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-10-21 18:16:25 +0000 |
commit | 3d52809bad2d96f7f39aa50e51bd53c69607cb4e (patch) | |
tree | 709864182e93e305e57c2ca9c92604fec998c464 | |
parent | 46b4920ac85c5294174df9421eb9a69b0c9b5d55 (diff) | |
parent | 26c563b051aacf5be66a0453be00a645ed3f50cd (diff) | |
download | frameworks_base-3d52809bad2d96f7f39aa50e51bd53c69607cb4e.zip frameworks_base-3d52809bad2d96f7f39aa50e51bd53c69607cb4e.tar.gz frameworks_base-3d52809bad2d96f7f39aa50e51bd53c69607cb4e.tar.bz2 |
Merge "Prevent excessive accessibility announcements in TimePicker" into lmp-mr1-dev
-rw-r--r-- | core/java/android/widget/TimePickerSpinnerDelegate.java | 47 |
1 files changed, 30 insertions, 17 deletions
diff --git a/core/java/android/widget/TimePickerSpinnerDelegate.java b/core/java/android/widget/TimePickerSpinnerDelegate.java index e4342b1..d9c4114 100644 --- a/core/java/android/widget/TimePickerSpinnerDelegate.java +++ b/core/java/android/widget/TimePickerSpinnerDelegate.java @@ -105,6 +105,10 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im private String mMinutePickerDescription; private String mSelectMinutes; + // Most recent time announcement values for accessibility. + private CharSequence mLastAnnouncedText; + private boolean mLastAnnouncedIsHour; + private Calendar mTempCalendar; 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. updateHeaderAmPm(); // Update Hour and Minutes - updateHeaderHour(mInitialHourOfDay, true); + updateHeaderHour(mInitialHourOfDay, false); // Update time separator updateHeaderSeparator(); // Update Minutes - updateHeaderMinute(mInitialMinute); + updateHeaderMinute(mInitialMinute, false); // Invalidate everything mDelegator.invalidate(); } @@ -293,7 +297,7 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im return; } mInitialHourOfDay = currentHour; - updateHeaderHour(currentHour, true /* accessibility announce */); + updateHeaderHour(currentHour, true); updateHeaderAmPm(); mRadialTimePickerView.setCurrentHour(currentHour); mRadialTimePickerView.setAmOrPm(mInitialHourOfDay < 12 ? AM : PM); @@ -329,7 +333,7 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im return; } mInitialMinute = currentMinute; - updateHeaderMinute(currentMinute); + updateHeaderMinute(currentMinute, true); mRadialTimePickerView.setCurrentMinute(currentMinute); mDelegator.invalidate(); onTimeChanged(); @@ -357,7 +361,7 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im generateLegalTimesTree(); int hour = mRadialTimePickerView.getCurrentHour(); mInitialHourOfDay = hour; - updateHeaderHour(hour, false /* no accessibility announce */); + updateHeaderHour(hour, false); updateHeaderAmPm(); updateRadialPicker(mRadialTimePickerView.getCurrentItemShowing()); mDelegator.invalidate(); @@ -604,19 +608,17 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im @Override public void onValueSelected(int pickerIndex, int newValue, boolean autoAdvance) { if (pickerIndex == HOUR_INDEX) { - updateHeaderHour(newValue, false); - String announcement = String.format("%d", newValue); if (mAllowAutoAdvance && autoAdvance) { + updateHeaderHour(newValue, false); setCurrentItemShowing(MINUTE_INDEX, true, false); - announcement += ". " + mSelectMinutes; + mRadialTimePickerView.announceForAccessibility(newValue + ". " + mSelectMinutes); } else { + updateHeaderHour(newValue, true); mRadialTimePickerView.setContentDescription( mHourPickerDescription + ": " + newValue); } - - mRadialTimePickerView.announceForAccessibility(announcement); } else if (pickerIndex == MINUTE_INDEX){ - updateHeaderMinute(newValue); + updateHeaderMinute(newValue, true); mRadialTimePickerView.setContentDescription(mMinutePickerDescription + ": " + newValue); } else if (pickerIndex == AMPM_INDEX) { updateAmPmLabelStates(newValue); @@ -664,7 +666,16 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im CharSequence text = String.format(format, value); mHourView.setText(text); 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; } - private void updateHeaderMinute(int value) { + private void updateHeaderMinute(int value, boolean announceForAccessibility) { if (value == 60) { value = 0; } - CharSequence text = String.format(mCurrentLocale, "%02d", value); - mRadialTimePickerView.announceForAccessibility(text); + final CharSequence text = String.format(mCurrentLocale, "%02d", value); mMinuteView.setText(text); + if (announceForAccessibility) { + tryAnnounceForAccessibility(text, false); + } } /** @@ -921,8 +934,8 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate im if (!allowEmptyDisplay && mTypedTimes.isEmpty()) { int hour = mRadialTimePickerView.getCurrentHour(); int minute = mRadialTimePickerView.getCurrentMinute(); - updateHeaderHour(hour, true); - updateHeaderMinute(minute); + updateHeaderHour(hour, false); + updateHeaderMinute(minute, false); if (!mIs24HourView) { updateAmPmLabelStates(hour < 12 ? AM : PM); } |