From dd80f0065c0088bff30f9ce5e166df47ddf10690 Mon Sep 17 00:00:00 2001 From: Andrei Stingaceanu Date: Thu, 16 Jun 2016 12:00:39 +0100 Subject: [PATCH] DatePicker A11Y fix time announced for date widgets * introduced a new method (getFormattedCurrentDate) which formats the date for all DatePickerDelegates * implemented (moved) onPopulateAccessibilityEvent in the AbstractDatePickerDelegate thus all announcements for date pickers use the same format * note: added FORMAT_SHOW_WEEKDAY to the current format because I find the information valuable E.g: * Before: "Thu Jun 16 11:49:14 GMT+01:00 2016" * Now: "Thursday, 16 June 2016" Bug: 29099922 Change-Id: I94447067f10659747ae310f9e07cf3f487c97e05 --- core/java/android/widget/DatePicker.java | 14 ++++++++++++++ .../android/widget/DatePickerCalendarDelegate.java | 12 +----------- .../android/widget/DatePickerSpinnerDelegate.java | 11 ----------- 3 files changed, 15 insertions(+), 22 deletions(-) diff --git a/core/java/android/widget/DatePicker.java b/core/java/android/widget/DatePicker.java index 56a8966ca03ba..e196cf0734a5d 100644 --- a/core/java/android/widget/DatePicker.java +++ b/core/java/android/widget/DatePicker.java @@ -27,6 +27,7 @@ import android.icu.util.Calendar; import android.icu.util.TimeZone; import android.os.Parcel; import android.os.Parcelable; +import android.text.format.DateUtils; import android.util.AttributeSet; import android.util.SparseArray; import android.view.View; @@ -500,6 +501,8 @@ public class DatePicker extends FrameLayout { // The context protected Context mContext; + protected Calendar mCurrentDate; + // The current locale protected Locale mCurrentLocale; @@ -541,6 +544,17 @@ public class DatePicker extends FrameLayout { // Stub. } + @Override + public void onPopulateAccessibilityEvent(AccessibilityEvent event) { + event.getText().add(getFormattedCurrentDate()); + } + + protected String getFormattedCurrentDate() { + return DateUtils.formatDateTime(mContext, mCurrentDate.getTimeInMillis(), + DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR + | DateUtils.FORMAT_SHOW_WEEKDAY); + } + /** * Class for managing state storing/restoring. */ diff --git a/core/java/android/widget/DatePickerCalendarDelegate.java b/core/java/android/widget/DatePickerCalendarDelegate.java index 9488d414314e7..1bf0c876aa811 100755 --- a/core/java/android/widget/DatePickerCalendarDelegate.java +++ b/core/java/android/widget/DatePickerCalendarDelegate.java @@ -29,7 +29,6 @@ import android.icu.text.SimpleDateFormat; import android.icu.util.Calendar; import android.os.Parcelable; import android.text.format.DateFormat; -import android.text.format.DateUtils; import android.util.AttributeSet; import android.util.StateSet; import android.view.HapticFeedbackConstants; @@ -84,7 +83,6 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate { private int mCurrentView = UNINITIALIZED; - private final Calendar mCurrentDate; private final Calendar mTempDate; private final Calendar mMinDate; private final Calendar mMaxDate; @@ -324,10 +322,7 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate { // TODO: This should use live regions. if (announce) { - final long millis = mCurrentDate.getTimeInMillis(); - final int flags = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR; - final String fullDateText = DateUtils.formatDateTime(mContext, millis, flags); - mAnimator.announceForAccessibility(fullDateText); + mAnimator.announceForAccessibility(getFormattedCurrentDate()); } } @@ -582,11 +577,6 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate { return true; } - @Override - public void onPopulateAccessibilityEvent(AccessibilityEvent event) { - event.getText().add(mCurrentDate.getTime().toString()); - } - public CharSequence getAccessibilityClassName() { return DatePicker.class.getName(); } diff --git a/core/java/android/widget/DatePickerSpinnerDelegate.java b/core/java/android/widget/DatePickerSpinnerDelegate.java index 1a6d351575f90..9ecf8a54518e6 100644 --- a/core/java/android/widget/DatePickerSpinnerDelegate.java +++ b/core/java/android/widget/DatePickerSpinnerDelegate.java @@ -24,7 +24,6 @@ import android.os.Parcelable; import android.text.InputType; import android.text.TextUtils; import android.text.format.DateFormat; -import android.text.format.DateUtils; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; @@ -87,8 +86,6 @@ class DatePickerSpinnerDelegate extends AbstractDatePickerDelegate { private Calendar mMaxDate; - private Calendar mCurrentDate; - private boolean mIsEnabled = DEFAULT_ENABLED_STATE; DatePickerSpinnerDelegate(DatePicker delegator, Context context, AttributeSet attrs, @@ -398,14 +395,6 @@ class DatePickerSpinnerDelegate extends AbstractDatePickerDelegate { return true; } - @Override - public void onPopulateAccessibilityEvent(AccessibilityEvent event) { - final int flags = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR; - String selectedDateUtterance = DateUtils.formatDateTime(mContext, - mCurrentDate.getTimeInMillis(), flags); - event.getText().add(selectedDateUtterance); - } - /** * Sets the current locale. *