Skip to content

Commit ef7ec7a

Browse files
committed
Use different version of CLDR data in DatePicker
The ICU CLDR data doesn't use the month abbreviations that are appropriate for the DatePicker, so use the framework copy of the CLDR data. Bug: 2641810 Note: cherry-picked from Honeycomb Change-Id: I3c045dbfb751b8b7ce6361b5a67407206fc64db1
1 parent 1175ef7 commit ef7ec7a

File tree

1 file changed

+33
-6
lines changed

1 file changed

+33
-6
lines changed

core/java/android/widget/DatePicker.java

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import android.os.Parcel;
2323
import android.os.Parcelable;
2424
import android.text.format.DateFormat;
25+
import android.text.format.DateUtils;
2526
import android.util.AttributeSet;
2627
import android.util.SparseArray;
2728
import android.view.LayoutInflater;
@@ -33,6 +34,7 @@
3334
import java.text.DateFormatSymbols;
3435
import java.text.SimpleDateFormat;
3536
import java.util.Calendar;
37+
import java.util.Locale;
3638

3739
/**
3840
* A view for selecting a month / year / day based on a calendar like layout.
@@ -47,7 +49,10 @@ public class DatePicker extends FrameLayout {
4749

4850
private static final int DEFAULT_START_YEAR = 1900;
4951
private static final int DEFAULT_END_YEAR = 2100;
50-
52+
53+
// This ignores Undecimber, but we only support real Gregorian calendars.
54+
private static final int NUMBER_OF_MONTHS = 12;
55+
5156
/* UI Components */
5257
private final NumberPicker mDayPicker;
5358
private final NumberPicker mMonthPicker;
@@ -62,6 +67,10 @@ public class DatePicker extends FrameLayout {
6267
private int mMonth;
6368
private int mYear;
6469

70+
private Object mMonthUpdateLock = new Object();
71+
private volatile Locale mMonthLocale;
72+
private String[] mShortMonths;
73+
6574
/**
6675
* The callback used to indicate the user changes the date.
6776
*/
@@ -102,8 +111,7 @@ public void onChanged(NumberPicker picker, int oldVal, int newVal) {
102111
});
103112
mMonthPicker = (NumberPicker) findViewById(R.id.month);
104113
mMonthPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
105-
DateFormatSymbols dfs = new DateFormatSymbols();
106-
String[] months = dfs.getShortMonths();
114+
final String[] months = getShortMonths();
107115

108116
/*
109117
* If the user is in a locale where the month names are numeric,
@@ -114,9 +122,9 @@ public void onChanged(NumberPicker picker, int oldVal, int newVal) {
114122
for (int i = 0; i < months.length; i++) {
115123
months[i] = String.valueOf(i + 1);
116124
}
117-
mMonthPicker.setRange(1, 12);
125+
mMonthPicker.setRange(1, NUMBER_OF_MONTHS);
118126
} else {
119-
mMonthPicker.setRange(1, 12, months);
127+
mMonthPicker.setRange(1, NUMBER_OF_MONTHS, months);
120128
}
121129

122130
mMonthPicker.setSpeed(200);
@@ -246,11 +254,30 @@ public void updateDate(int year, int monthOfYear, int dayOfMonth) {
246254
mMonth = monthOfYear;
247255
mDay = dayOfMonth;
248256
updateSpinners();
249-
reorderPickers(new DateFormatSymbols().getShortMonths());
257+
reorderPickers(getShortMonths());
250258
notifyDateChanged();
251259
}
252260
}
253261

262+
private String[] getShortMonths() {
263+
final Locale currentLocale = Locale.getDefault();
264+
if (currentLocale.equals(mMonthLocale) && mShortMonths != null) {
265+
return mShortMonths;
266+
} else {
267+
synchronized (mMonthUpdateLock) {
268+
if (!currentLocale.equals(mMonthLocale)) {
269+
mShortMonths = new String[NUMBER_OF_MONTHS];
270+
for (int i = 0; i < NUMBER_OF_MONTHS; i++) {
271+
mShortMonths[i] = DateUtils.getMonthString(Calendar.JANUARY + i,
272+
DateUtils.LENGTH_MEDIUM);
273+
}
274+
mMonthLocale = currentLocale;
275+
}
276+
}
277+
return mShortMonths;
278+
}
279+
}
280+
254281
private static class SavedState extends BaseSavedState {
255282

256283
private final int mYear;

0 commit comments

Comments
 (0)