diff options
author | Eric Fischer <enf@google.com> | 2009-07-23 18:32:42 -0700 |
---|---|---|
committer | Eric Fischer <enf@google.com> | 2009-07-23 18:48:44 -0700 |
commit | 03a8017d0fe3b55b69c4328aa0d27bd96a2f1360 (patch) | |
tree | 5557f7ca36e7736cea8e105b8d6e4e60719c6376 /core/java/android | |
parent | 1d4b87d492dfefb5506e9fcf358ced680322b754 (diff) | |
download | frameworks_base-03a8017d0fe3b55b69c4328aa0d27bd96a2f1360.zip frameworks_base-03a8017d0fe3b55b69c4328aa0d27bd96a2f1360.tar.gz frameworks_base-03a8017d0fe3b55b69c4328aa0d27bd96a2f1360.tar.bz2 |
Make the DatePicker respect the date format setting if the date is numeric.
In some locales, there are no abbreviated month names; the abbreviated
date formats are essentially numeric. If the user is in such a locale,
have the DatePicker respect the date format setting so that the order
of the fields will match other numeric-only dates.
In locales that have abbreviated month names, continue to use the order
that is normal in spelled-out dates.
And update the order in updateDate() so that the new order is reflected
if you change the order setting and immediately go to change the date
without leaving and returning to the Date & Time settings in between.
At the same time, change DateFormat.getDateFormatOrder() back to working
the way it did in cupcake (prioritizing the date order preference over
the locale), even though the DatePicker no longer calls the method.
Bug 1805085
Diffstat (limited to 'core/java/android')
-rw-r--r-- | core/java/android/text/format/DateFormat.java | 34 | ||||
-rw-r--r-- | core/java/android/widget/DatePicker.java | 77 |
2 files changed, 76 insertions, 35 deletions
diff --git a/core/java/android/text/format/DateFormat.java b/core/java/android/text/format/DateFormat.java index 3d10f17..524f941 100644 --- a/core/java/android/text/format/DateFormat.java +++ b/core/java/android/text/format/DateFormat.java @@ -284,6 +284,12 @@ public class DateFormat { */ public static java.text.DateFormat getDateFormatForSetting(Context context, String value) { + String format = getDateFormatStringForSetting(context, value); + + return new java.text.SimpleDateFormat(format); + } + + private static String getDateFormatStringForSetting(Context context, String value) { if (value != null) { int month = value.indexOf('M'); int day = value.indexOf('d'); @@ -291,7 +297,7 @@ public class DateFormat { if (month >= 0 && day >= 0 && year >= 0) { String template = context.getString(R.string.numeric_date_template); - if (year < month) { + if (year < month && year < day) { if (month < day) { value = String.format(template, "yyyy", "MM", "dd"); } else { @@ -311,7 +317,7 @@ public class DateFormat { } } - return new java.text.SimpleDateFormat(value); + return value; } } @@ -321,7 +327,7 @@ public class DateFormat { * so that we get a four-digit year instead a two-digit year. */ value = context.getString(R.string.numeric_date_format); - return new java.text.SimpleDateFormat(value); + return value; } /** @@ -347,7 +353,11 @@ public class DateFormat { /** * Gets the current date format stored as a char array. The array will contain * 3 elements ({@link #DATE}, {@link #MONTH}, and {@link #YEAR}) in the order - * preferred by the user. + * specified by the user's format preference. Note that this order is + * only appropriate for all-numeric dates; spelled-out (MEDIUM and LONG) + * dates will generally contain other punctuation, spaces, or words, + * not just the day, month, and year, and not necessarily in the same + * order returned here. */ public static final char[] getDateFormatOrder(Context context) { char[] order = new char[] {DATE, MONTH, YEAR}; @@ -380,22 +390,10 @@ public class DateFormat { } private static String getDateFormatString(Context context) { - java.text.DateFormat df; - df = java.text.DateFormat.getDateInstance(java.text.DateFormat.SHORT); - if (df instanceof SimpleDateFormat) { - return ((SimpleDateFormat) df).toPattern(); - } - String value = Settings.System.getString(context.getContentResolver(), Settings.System.DATE_FORMAT); - if (value == null || value.length() < 6) { - /* - * No need to localize -- this is an emergency fallback in case - * the setting is missing, but it should always be set. - */ - value = "MM-dd-yyyy"; - } - return value; + + return getDateFormatStringForSetting(context, value); } /** diff --git a/core/java/android/widget/DatePicker.java b/core/java/android/widget/DatePicker.java index 3b9f1de..5e76cc3 100644 --- a/core/java/android/widget/DatePicker.java +++ b/core/java/android/widget/DatePicker.java @@ -31,6 +31,7 @@ import com.android.internal.widget.NumberPicker; import com.android.internal.widget.NumberPicker.OnChangedListener; import java.text.DateFormatSymbols; +import java.text.SimpleDateFormat; import java.util.Calendar; /** @@ -101,7 +102,8 @@ public class DatePicker extends FrameLayout { mMonthPicker = (NumberPicker) findViewById(R.id.month); mMonthPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER); DateFormatSymbols dfs = new DateFormatSymbols(); - mMonthPicker.setRange(1, 12, dfs.getShortMonths()); + String[] months = dfs.getShortMonths(); + mMonthPicker.setRange(1, 12, months); mMonthPicker.setSpeed(200); mMonthPicker.setOnChangeListener(new OnChangedListener() { public void onChanged(NumberPicker picker, int oldVal, int newVal) { @@ -146,7 +148,7 @@ public class DatePicker extends FrameLayout { init(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), null); // re-order the number pickers to match the current date format - reorderPickers(); + reorderPickers(months); if (!isEnabled()) { setEnabled(false); @@ -161,30 +163,70 @@ public class DatePicker extends FrameLayout { mYearPicker.setEnabled(enabled); } - private void reorderPickers() { - char[] order = DateFormat.getDateFormatOrder(mContext); - - /* Default order is month, date, year so if that's the order then - * do nothing. + private void reorderPickers(String[] months) { + java.text.DateFormat format; + String order; + + /* + * If the user is in a locale where the medium date format is + * still numeric (Japanese and Czech, for example), respect + * the date format order setting. Otherwise, use the order + * that the locale says is appropriate for a spelled-out date. */ - if ((order[0] == DateFormat.MONTH) && (order[1] == DateFormat.DATE)) { - return; + + if (months[0].startsWith("1")) { + format = DateFormat.getDateFormat(getContext()); + } else { + format = DateFormat.getMediumDateFormat(getContext()); } - + + if (format instanceof SimpleDateFormat) { + order = ((SimpleDateFormat) format).toPattern(); + } else { + // Shouldn't happen, but just in case. + order = new String(DateFormat.getDateFormatOrder(getContext())); + } + /* Remove the 3 pickers from their parent and then add them back in the * required order. */ LinearLayout parent = (LinearLayout) findViewById(R.id.parent); parent.removeAllViews(); - for (char c : order) { - if (c == DateFormat.DATE) { - parent.addView(mDayPicker); - } else if (c == DateFormat.MONTH) { - parent.addView(mMonthPicker); - } else { - parent.addView (mYearPicker); + + boolean quoted = false; + boolean didDay = false, didMonth = false, didYear = false; + + for (int i = 0; i < order.length(); i++) { + char c = order.charAt(i); + + if (c == '\'') { + quoted = !quoted; + } + + if (!quoted) { + if (c == DateFormat.DATE && !didDay) { + parent.addView(mDayPicker); + didDay = true; + } else if ((c == DateFormat.MONTH || c == 'L') && !didMonth) { + parent.addView(mMonthPicker); + didMonth = true; + } else if (c == DateFormat.YEAR && !didYear) { + parent.addView (mYearPicker); + didYear = true; + } } } + + // Shouldn't happen, but just in case. + if (!didMonth) { + parent.addView(mMonthPicker); + } + if (!didDay) { + parent.addView(mDayPicker); + } + if (!didYear) { + parent.addView(mYearPicker); + } } public void updateDate(int year, int monthOfYear, int dayOfMonth) { @@ -192,6 +234,7 @@ public class DatePicker extends FrameLayout { mMonth = monthOfYear; mDay = dayOfMonth; updateSpinners(); + reorderPickers(new DateFormatSymbols().getShortMonths()); } private static class SavedState extends BaseSavedState { |