Merge change 8462 into donut
* changes: Make the DatePicker respect the date format setting if the date is numeric.
This commit is contained in:
@@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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,14 +163,28 @@ 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
|
||||||
@@ -176,14 +192,40 @@ public class DatePicker extends FrameLayout {
|
|||||||
*/
|
*/
|
||||||
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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user