Merge change 8462 into donut

* changes:
  Make the DatePicker respect the date format setting if the date is numeric.
This commit is contained in:
Android (Google) Code Review
2009-07-24 10:00:05 -07:00
2 changed files with 76 additions and 35 deletions

View File

@@ -284,6 +284,12 @@ public class DateFormat {
*/ */
public static java.text.DateFormat getDateFormatForSetting(Context context, public static java.text.DateFormat getDateFormatForSetting(Context context,
String value) { String value) {
String format = getDateFormatStringForSetting(context, value);
return new java.text.SimpleDateFormat(format);
}
private static String getDateFormatStringForSetting(Context context, String value) {
if (value != null) { if (value != null) {
int month = value.indexOf('M'); int month = value.indexOf('M');
int day = value.indexOf('d'); int day = value.indexOf('d');
@@ -291,7 +297,7 @@ public class DateFormat {
if (month >= 0 && day >= 0 && year >= 0) { if (month >= 0 && day >= 0 && year >= 0) {
String template = context.getString(R.string.numeric_date_template); String template = context.getString(R.string.numeric_date_template);
if (year < month) { if (year < month && year < day) {
if (month < day) { if (month < day) {
value = String.format(template, "yyyy", "MM", "dd"); value = String.format(template, "yyyy", "MM", "dd");
} else { } 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. * so that we get a four-digit year instead a two-digit year.
*/ */
value = context.getString(R.string.numeric_date_format); 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 * 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 * 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) { public static final char[] getDateFormatOrder(Context context) {
char[] order = new char[] {DATE, MONTH, YEAR}; char[] order = new char[] {DATE, MONTH, YEAR};
@@ -380,22 +390,10 @@ public class DateFormat {
} }
private static String getDateFormatString(Context context) { 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(), String value = Settings.System.getString(context.getContentResolver(),
Settings.System.DATE_FORMAT); Settings.System.DATE_FORMAT);
if (value == null || value.length() < 6) {
/* return getDateFormatStringForSetting(context, value);
* 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;
} }
/** /**

View File

@@ -31,6 +31,7 @@ import com.android.internal.widget.NumberPicker;
import com.android.internal.widget.NumberPicker.OnChangedListener; import com.android.internal.widget.NumberPicker.OnChangedListener;
import java.text.DateFormatSymbols; import java.text.DateFormatSymbols;
import java.text.SimpleDateFormat;
import java.util.Calendar; import java.util.Calendar;
/** /**
@@ -101,7 +102,8 @@ public class DatePicker extends FrameLayout {
mMonthPicker = (NumberPicker) findViewById(R.id.month); mMonthPicker = (NumberPicker) findViewById(R.id.month);
mMonthPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER); mMonthPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
DateFormatSymbols dfs = new DateFormatSymbols(); DateFormatSymbols dfs = new DateFormatSymbols();
mMonthPicker.setRange(1, 12, dfs.getShortMonths()); String[] months = dfs.getShortMonths();
mMonthPicker.setRange(1, 12, months);
mMonthPicker.setSpeed(200); mMonthPicker.setSpeed(200);
mMonthPicker.setOnChangeListener(new OnChangedListener() { mMonthPicker.setOnChangeListener(new OnChangedListener() {
public void onChanged(NumberPicker picker, int oldVal, int newVal) { 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); 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 // re-order the number pickers to match the current date format
reorderPickers(); reorderPickers(months);
if (!isEnabled()) { if (!isEnabled()) {
setEnabled(false); setEnabled(false);
@@ -161,29 +163,69 @@ public class DatePicker extends FrameLayout {
mYearPicker.setEnabled(enabled); mYearPicker.setEnabled(enabled);
} }
private void reorderPickers() { private void reorderPickers(String[] months) {
char[] order = DateFormat.getDateFormatOrder(mContext); java.text.DateFormat format;
String order;
/* Default order is month, date, year so if that's the order then
* do nothing. /*
* 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 /* Remove the 3 pickers from their parent and then add them back in the
* required order. * required order.
*/ */
LinearLayout parent = (LinearLayout) findViewById(R.id.parent); LinearLayout parent = (LinearLayout) findViewById(R.id.parent);
parent.removeAllViews(); parent.removeAllViews();
for (char c : order) {
if (c == DateFormat.DATE) { boolean quoted = false;
parent.addView(mDayPicker); boolean didDay = false, didMonth = false, didYear = false;
} else if (c == DateFormat.MONTH) {
parent.addView(mMonthPicker); for (int i = 0; i < order.length(); i++) {
} else { char c = order.charAt(i);
parent.addView (mYearPicker);
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);
} }
} }
@@ -192,6 +234,7 @@ public class DatePicker extends FrameLayout {
mMonth = monthOfYear; mMonth = monthOfYear;
mDay = dayOfMonth; mDay = dayOfMonth;
updateSpinners(); updateSpinners();
reorderPickers(new DateFormatSymbols().getShortMonths());
} }
private static class SavedState extends BaseSavedState { private static class SavedState extends BaseSavedState {