From 949e9df25bccb736675f950591d3a286ae4052fc Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Tue, 30 Apr 2013 13:41:06 -0700 Subject: [PATCH] Show CJK dates as all-numeric in the DatePicker. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before, we'd have something like 2006 4月12. After, we have 2006 4 12. The alternative would require using custom NumberPicker.Formatter instances for the year and day fields in these locales, and that seems significantly more disruptive. Bug: 8766552 Change-Id: I568578aae2f80f2acfc53cd277ef3beae6743472 --- core/java/android/widget/DatePicker.java | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/core/java/android/widget/DatePicker.java b/core/java/android/widget/DatePicker.java index ad29e7e482a9b..fdf8e78c9bf44 100644 --- a/core/java/android/widget/DatePicker.java +++ b/core/java/android/widget/DatePicker.java @@ -39,6 +39,7 @@ import android.widget.NumberPicker.OnValueChangeListener; import com.android.internal.R; +import java.text.DateFormatSymbols; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Arrays; @@ -480,13 +481,26 @@ public class DatePicker extends FrameLayout { mCurrentDate = getCalendarForLocale(mCurrentDate, locale); mNumberOfMonths = mTempDate.getActualMaximum(Calendar.MONTH) + 1; - mShortMonths = new String[mNumberOfMonths]; - for (int i = 0; i < mNumberOfMonths; i++) { - mShortMonths[i] = DateUtils.getMonthString(Calendar.JANUARY + i, - DateUtils.LENGTH_MEDIUM); + mShortMonths = new DateFormatSymbols().getShortMonths(); + + if (usingNumericMonths()) { + // We're in a locale where a date should either be all-numeric, or all-text. + // All-text would require custom NumberPicker formatters for day and year. + mShortMonths = new String[mNumberOfMonths]; + for (int i = 0; i < mNumberOfMonths; ++i) { + mShortMonths[i] = String.format("%d", i + 1); + } } } + /** + * Tests whether the current locale is one where there are no real month names, + * such as Chinese, Japanese, or Korean locales. + */ + private boolean usingNumericMonths() { + return Character.isDigit(mShortMonths[Calendar.JANUARY].charAt(0)); + } + /** * Gets a calendar for locale bootstrapped with the value of a given calendar. * @@ -667,7 +681,7 @@ public class DatePicker extends FrameLayout { mMonthSpinner.setValue(mCurrentDate.get(Calendar.MONTH)); mDaySpinner.setValue(mCurrentDate.get(Calendar.DAY_OF_MONTH)); - if (Character.isDigit(displayedValues[0].charAt(0))) { + if (usingNumericMonths()) { mMonthSpinnerInput.setRawInputType(InputType.TYPE_CLASS_NUMBER); } }