diff options
-rw-r--r-- | core/java/android/widget/DatePickerCalendarDelegate.java | 48 | ||||
-rw-r--r-- | core/java/android/widget/TimePickerClockDelegate.java | 52 |
2 files changed, 38 insertions, 62 deletions
diff --git a/core/java/android/widget/DatePickerCalendarDelegate.java b/core/java/android/widget/DatePickerCalendarDelegate.java index 536b81f77174..4f7eef007a68 100644 --- a/core/java/android/widget/DatePickerCalendarDelegate.java +++ b/core/java/android/widget/DatePickerCalendarDelegate.java @@ -34,6 +34,7 @@ import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityNodeInfo; import android.widget.DayPickerView.OnDaySelectedListener; import android.widget.YearPickerView.OnYearSelectedListener; @@ -76,10 +77,6 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate { private DayPickerView mDayPickerView; private YearPickerView mYearPickerView; - // Accessibility strings. - private String mSelectDay; - private String mSelectYear; - private int mCurrentView = UNINITIALIZED; private final Calendar mTempDate; @@ -118,8 +115,15 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate { final ViewGroup header = mContainer.findViewById(R.id.date_picker_header); mHeaderYear = header.findViewById(R.id.date_picker_header_year); mHeaderYear.setOnClickListener(mOnHeaderClickListener); + mHeaderYear.setAccessibilityDelegate( + new ClickActionDelegate(context, R.string.select_year)); + mHeaderYear.setAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_POLITE); + mHeaderMonthDay = header.findViewById(R.id.date_picker_header_date); mHeaderMonthDay.setOnClickListener(mOnHeaderClickListener); + mHeaderMonthDay.setAccessibilityDelegate( + new ClickActionDelegate(context, R.string.select_day)); + mHeaderMonthDay.setAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_POLITE); // For the sake of backwards compatibility, attempt to extract the text // color from the header month text appearance. If it's set, we'll let @@ -170,10 +174,6 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate { mYearPickerView.setYear(mCurrentDate.get(Calendar.YEAR)); mYearPickerView.setOnYearSelectedListener(mOnYearSelectedListener); - // Set up content descriptions. - mSelectDay = res.getString(R.string.select_day); - mSelectYear = res.getString(R.string.select_year); - // Initialize for current locale. This also initializes the date, so no // need to call onDateChanged. onLocaleChanged(mCurrentLocale); @@ -230,6 +230,22 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate { return srcRgb | (dstAlpha << 24); } + private static class ClickActionDelegate extends View.AccessibilityDelegate { + private final AccessibilityNodeInfo.AccessibilityAction mClickAction; + + ClickActionDelegate(Context context, int resId) { + mClickAction = new AccessibilityNodeInfo.AccessibilityAction( + AccessibilityNodeInfo.ACTION_CLICK, context.getString(resId)); + } + + @Override + public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(host, info); + + info.addAction(mClickAction); + } + } + /** * Listener called when the user selects a day in the day picker view. */ @@ -310,10 +326,10 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate { mYearFormat = DateFormat.getInstanceForSkeleton("y", locale); // Update the header text. - onCurrentDateChanged(false); + onCurrentDateChanged(); } - private void onCurrentDateChanged(boolean announce) { + private void onCurrentDateChanged() { if (mHeaderYear == null) { // Abort, we haven't initialized yet. This method will get called // again later after everything has been set up. @@ -325,11 +341,6 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate { final String monthDay = mMonthDayFormat.format(mCurrentDate.getTime()); mHeaderMonthDay.setText(monthDay); - - // TODO: This should use live regions. - if (announce) { - mAnimator.announceForAccessibility(getFormattedCurrentDate()); - } } private void setCurrentView(final int viewIndex) { @@ -343,8 +354,6 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate { mAnimator.setDisplayedChild(VIEW_MONTH_DAY); mCurrentView = viewIndex; } - - mAnimator.announceForAccessibility(mSelectDay); break; case VIEW_YEAR: final int year = mCurrentDate.get(Calendar.YEAR); @@ -364,7 +373,6 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate { mCurrentView = viewIndex; } - mAnimator.announceForAccessibility(mSelectYear); break; } } @@ -409,7 +417,7 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate { mDayPickerView.setDate(mCurrentDate.getTimeInMillis()); mYearPickerView.setYear(year); - onCurrentDateChanged(fromUser); + onCurrentDateChanged(); if (fromUser) { tryVibrate(); @@ -564,7 +572,7 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate { mMinDate.setTimeInMillis(ss.getMinDate()); mMaxDate.setTimeInMillis(ss.getMaxDate()); - onCurrentDateChanged(false); + onCurrentDateChanged(); final int currentView = ss.getCurrentView(); setCurrentView(currentView); diff --git a/core/java/android/widget/TimePickerClockDelegate.java b/core/java/android/widget/TimePickerClockDelegate.java index a453c2818566..ebb0f99e988b 100644 --- a/core/java/android/widget/TimePickerClockDelegate.java +++ b/core/java/android/widget/TimePickerClockDelegate.java @@ -121,12 +121,8 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate { // Localization data. private boolean mHourFormatShowLeadingZero; - private boolean mHourFormatStartsAtZero; - - // Most recent time announcement values for accessibility. - private CharSequence mLastAnnouncedText; - private boolean mLastAnnouncedIsHour; + private boolean mHourFormatStartsAtZero; public TimePickerClockDelegate(TimePicker delegator, Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(delegator, context); @@ -155,6 +151,7 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate { mHourView.setOnDigitEnteredListener(mDigitEnteredListener); mHourView.setAccessibilityDelegate( new ClickActionDelegate(context, R.string.select_hours)); + mHourView.setAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_POLITE); mSeparatorView = (TextView) mainView.findViewById(R.id.separator); mMinuteView = (NumericTextView) mainView.findViewById(R.id.minutes); mMinuteView.setOnClickListener(mClickListener); @@ -162,6 +159,7 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate { mMinuteView.setOnDigitEnteredListener(mDigitEnteredListener); mMinuteView.setAccessibilityDelegate( new ClickActionDelegate(context, R.string.select_minutes)); + mMinuteView.setAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_POLITE); mMinuteView.setRange(0, 59); // Set up AM/PM labels. @@ -435,7 +433,7 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate { private void updateRadialPicker(int index) { mRadialTimePickerView.initialize(mCurrentHour, mCurrentMinute, mIs24Hour); - setCurrentItemShowing(index, false, true); + setCurrentItemShowing(index, false); } private void updateHeaderAmPm() { @@ -786,18 +784,10 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate { private void updateHeaderHour(int hourOfDay, boolean announce) { final int localizedHour = getLocalizedHour(hourOfDay); mHourView.setValue(localizedHour); - - if (announce) { - tryAnnounceForAccessibility(mHourView.getText(), true); - } } private void updateHeaderMinute(int minuteOfHour, boolean announce) { mMinuteView.setValue(minuteOfHour); - - if (announce) { - tryAnnounceForAccessibility(mMinuteView.getText(), false); - } } /** @@ -876,31 +866,12 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate { return -1; } - 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; - } - } - /** * Show either Hours or Minutes. */ - private void setCurrentItemShowing(int index, boolean animateCircle, boolean announce) { + private void setCurrentItemShowing(int index, boolean animateCircle) { mRadialTimePickerView.setCurrentItemShowing(index, animateCircle); - if (index == HOUR_INDEX) { - if (announce) { - mDelegator.announceForAccessibility(mSelectHours); - } - } else { - if (announce) { - mDelegator.announceForAccessibility(mSelectMinutes); - } - } - mHourView.setActivated(index == HOUR_INDEX); mMinuteView.setActivated(index == MINUTE_INDEX); } @@ -930,10 +901,7 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate { final boolean isTransition = mAllowAutoAdvance && autoAdvance; setHourInternal(newValue, FROM_RADIAL_PICKER, !isTransition, true); if (isTransition) { - setCurrentItemShowing(MINUTE_INDEX, true, false); - - final int localizedHour = getLocalizedHour(newValue); - mDelegator.announceForAccessibility(localizedHour + ". " + mSelectMinutes); + setCurrentItemShowing(MINUTE_INDEX, true); } break; case RadialTimePickerView.MINUTES: @@ -1030,10 +998,10 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate { setAmOrPm(PM); break; case R.id.hours: - setCurrentItemShowing(HOUR_INDEX, true, true); + setCurrentItemShowing(HOUR_INDEX, true); break; case R.id.minutes: - setCurrentItemShowing(MINUTE_INDEX, true, true); + setCurrentItemShowing(MINUTE_INDEX, true); break; default: // Failed to handle this click, don't vibrate. @@ -1058,10 +1026,10 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate { setAmOrPm(PM); break; case R.id.hours: - setCurrentItemShowing(HOUR_INDEX, true, true); + setCurrentItemShowing(HOUR_INDEX, true); break; case R.id.minutes: - setCurrentItemShowing(MINUTE_INDEX, true, true); + setCurrentItemShowing(MINUTE_INDEX, true); break; default: // Failed to handle this click, don't vibrate. |