Skip to content

Commit 9e5b1a4

Browse files
sganovAndroid (Google) Code Review
authored andcommitted
Merge "Use different version of CLDR data in DatePicker" into gingerbread
2 parents 5644d0e + ef7ec7a commit 9e5b1a4

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)