Merge "Use DateFormatSymbols directly instead of using LocaleData" am: 3bd9f08ae5 am: da5838aa43 am: 36a3657be8
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1364767 Change-Id: I2f8a2bf66f5acac30b57140d6304646826d3c7c2
This commit is contained in:
@@ -19,6 +19,7 @@ package android.text.format;
|
||||
import android.annotation.NonNull;
|
||||
import android.compat.annotation.UnsupportedAppUsage;
|
||||
import android.content.Context;
|
||||
import android.icu.text.DateFormatSymbols;
|
||||
import android.icu.text.DateTimePatternGenerator;
|
||||
import android.provider.Settings;
|
||||
import android.text.SpannableStringBuilder;
|
||||
@@ -475,6 +476,8 @@ public class DateFormat {
|
||||
int count;
|
||||
|
||||
LocaleData localeData = LocaleData.get(Locale.getDefault());
|
||||
DateFormatSymbols dfs = getIcuDateFormatSymbols(Locale.getDefault());
|
||||
String[] amPm = dfs.getAmPmStrings();
|
||||
|
||||
int len = inFormat.length();
|
||||
|
||||
@@ -496,7 +499,7 @@ public class DateFormat {
|
||||
switch (c) {
|
||||
case 'A':
|
||||
case 'a':
|
||||
replacement = localeData.amPm[inDate.get(Calendar.AM_PM) - Calendar.AM];
|
||||
replacement = amPm[inDate.get(Calendar.AM_PM) - Calendar.AM];
|
||||
break;
|
||||
case 'd':
|
||||
replacement = zeroPad(inDate.get(Calendar.DATE), count);
|
||||
@@ -678,4 +681,16 @@ public class DateFormat {
|
||||
private static String zeroPad(int inValue, int inMinDigits) {
|
||||
return String.format(Locale.getDefault(), "%0" + inMinDigits + "d", inValue);
|
||||
}
|
||||
|
||||
/**
|
||||
* We use Gregorian calendar for date formats in android.text.format and various UI widget
|
||||
* historically. It's a utility method to get an {@link DateFormatSymbols} instance. Note that
|
||||
* {@link DateFormatSymbols} has cache, and external cache is not needed unless same instance is
|
||||
* requested repeatedly in the performance critical code.
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
public static DateFormatSymbols getIcuDateFormatSymbols(Locale locale) {
|
||||
return new DateFormatSymbols(android.icu.util.GregorianCalendar.class, locale);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -225,7 +225,8 @@ public class DateUtils
|
||||
*/
|
||||
@Deprecated
|
||||
public static String getAMPMString(int ampm) {
|
||||
return LocaleData.get(Locale.getDefault()).amPm[ampm - Calendar.AM];
|
||||
String[] amPm = DateFormat.getIcuDateFormatSymbols(Locale.getDefault()).getAmPmStrings();
|
||||
return amPm[ampm - Calendar.AM];
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
package android.text.format;
|
||||
|
||||
import android.content.res.Resources;
|
||||
import android.icu.text.DateFormatSymbols;
|
||||
|
||||
import com.android.i18n.timezone.ZoneInfoData;
|
||||
|
||||
@@ -55,11 +56,13 @@ class TimeFormatter {
|
||||
* The Locale for which the cached LocaleData and formats have been loaded.
|
||||
*/
|
||||
private static Locale sLocale;
|
||||
private static DateFormatSymbols sDateFormatSymbols;
|
||||
private static LocaleData sLocaleData;
|
||||
private static String sTimeOnlyFormat;
|
||||
private static String sDateOnlyFormat;
|
||||
private static String sDateTimeFormat;
|
||||
|
||||
private final DateFormatSymbols dateFormatSymbols;
|
||||
private final LocaleData localeData;
|
||||
private final String dateTimeFormat;
|
||||
private final String timeOnlyFormat;
|
||||
@@ -74,6 +77,7 @@ class TimeFormatter {
|
||||
|
||||
if (sLocale == null || !(locale.equals(sLocale))) {
|
||||
sLocale = locale;
|
||||
sDateFormatSymbols = DateFormat.getIcuDateFormatSymbols(locale);
|
||||
sLocaleData = LocaleData.get(locale);
|
||||
|
||||
Resources r = Resources.getSystem();
|
||||
@@ -82,6 +86,7 @@ class TimeFormatter {
|
||||
sDateTimeFormat = r.getString(com.android.internal.R.string.date_and_time);
|
||||
}
|
||||
|
||||
this.dateFormatSymbols = sDateFormatSymbols;
|
||||
this.dateTimeFormat = sDateTimeFormat;
|
||||
this.timeOnlyFormat = sTimeOnlyFormat;
|
||||
this.dateOnlyFormat = sDateOnlyFormat;
|
||||
@@ -310,12 +315,14 @@ class TimeFormatter {
|
||||
outputBuilder.append('\n');
|
||||
return false;
|
||||
case 'p':
|
||||
modifyAndAppend((wallTime.getHour() >= (HOURSPERDAY / 2)) ? localeData.amPm[1]
|
||||
: localeData.amPm[0], modifier);
|
||||
modifyAndAppend((wallTime.getHour() >= (HOURSPERDAY / 2))
|
||||
? dateFormatSymbols.getAmPmStrings()[1]
|
||||
: dateFormatSymbols.getAmPmStrings()[0], modifier);
|
||||
return false;
|
||||
case 'P':
|
||||
modifyAndAppend((wallTime.getHour() >= (HOURSPERDAY / 2)) ? localeData.amPm[1]
|
||||
: localeData.amPm[0], FORCE_LOWER_CASE);
|
||||
modifyAndAppend((wallTime.getHour() >= (HOURSPERDAY / 2))
|
||||
? dateFormatSymbols.getAmPmStrings()[1]
|
||||
: dateFormatSymbols.getAmPmStrings()[0], FORCE_LOWER_CASE);
|
||||
return false;
|
||||
case 'R':
|
||||
formatInternal("%H:%M", wallTime, zoneInfoData);
|
||||
|
||||
@@ -29,8 +29,6 @@ import android.text.format.DateFormat;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.View;
|
||||
|
||||
import libcore.icu.LocaleData;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Locale;
|
||||
|
||||
@@ -228,7 +226,7 @@ public abstract class NumberKeyListener extends BaseKeyListener
|
||||
if (locale == null) {
|
||||
return false;
|
||||
}
|
||||
final String[] amPm = LocaleData.get(locale).amPm;
|
||||
final String[] amPm = DateFormat.getIcuDateFormatSymbols(locale).getAmPmStrings();
|
||||
for (int i = 0; i < amPm.length; i++) {
|
||||
for (int j = 0; j < amPm[i].length(); j++) {
|
||||
final char ch = amPm[i].charAt(j);
|
||||
|
||||
@@ -24,9 +24,11 @@ import android.annotation.Widget;
|
||||
import android.compat.annotation.UnsupportedAppUsage;
|
||||
import android.content.Context;
|
||||
import android.content.res.TypedArray;
|
||||
import android.icu.text.DateFormatSymbols;
|
||||
import android.icu.util.Calendar;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.text.format.DateFormat;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Log;
|
||||
import android.util.MathUtils;
|
||||
@@ -39,8 +41,6 @@ import android.view.inspector.InspectableProperty;
|
||||
|
||||
import com.android.internal.R;
|
||||
|
||||
import libcore.icu.LocaleData;
|
||||
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.util.Locale;
|
||||
@@ -421,11 +421,13 @@ public class TimePicker extends FrameLayout {
|
||||
|
||||
static String[] getAmPmStrings(Context context) {
|
||||
final Locale locale = context.getResources().getConfiguration().locale;
|
||||
final LocaleData d = LocaleData.get(locale);
|
||||
DateFormatSymbols dfs = DateFormat.getIcuDateFormatSymbols(locale);
|
||||
String[] amPm = dfs.getAmPmStrings();
|
||||
String[] narrowAmPm = dfs.getAmpmNarrowStrings();
|
||||
|
||||
final String[] result = new String[2];
|
||||
result[0] = d.amPm[0].length() > 4 ? d.narrowAm : d.amPm[0];
|
||||
result[1] = d.amPm[1].length() > 4 ? d.narrowPm : d.amPm[1];
|
||||
result[0] = amPm[0].length() > 4 ? narrowAmPm[0] : amPm[0];
|
||||
result[1] = amPm[1].length() > 4 ? narrowAmPm[1] : amPm[1];
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -35,8 +35,6 @@ import android.view.inputmethod.InputMethodManager;
|
||||
|
||||
import com.android.internal.R;
|
||||
|
||||
import libcore.icu.LocaleData;
|
||||
|
||||
import java.util.Calendar;
|
||||
|
||||
/**
|
||||
@@ -143,7 +141,7 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate {
|
||||
mMinuteSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_NEXT);
|
||||
|
||||
// Get the localized am/pm strings and use them in the spinner.
|
||||
mAmPmStrings = getAmPmStrings(context);
|
||||
mAmPmStrings = TimePicker.getAmPmStrings(context);
|
||||
|
||||
// am/pm
|
||||
final View amPmView = mDelegator.findViewById(R.id.amPm);
|
||||
@@ -574,12 +572,4 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate {
|
||||
target.setContentDescription(mContext.getString(contDescResId));
|
||||
}
|
||||
}
|
||||
|
||||
public static String[] getAmPmStrings(Context context) {
|
||||
String[] result = new String[2];
|
||||
LocaleData d = LocaleData.get(context.getResources().getConfiguration().locale);
|
||||
result[0] = d.amPm[0].length() > 4 ? d.narrowAm : d.amPm[0];
|
||||
result[1] = d.amPm[1].length() > 4 ? d.narrowPm : d.amPm[1];
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.junit.Assert.fail;
|
||||
|
||||
import android.icu.text.DateFormatSymbols;
|
||||
import android.platform.test.annotations.Presubmit;
|
||||
|
||||
import androidx.test.filters.SmallTest;
|
||||
@@ -59,6 +60,15 @@ public class DateFormatTest {
|
||||
assertTrue(DateFormat.is24HourLocale(Locale.GERMANY));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testgetIcuDateFormatSymbols() {
|
||||
DateFormatSymbols dfs = DateFormat.getIcuDateFormatSymbols(Locale.US);
|
||||
assertEquals("AM", dfs.getAmPmStrings()[0]);
|
||||
assertEquals("PM", dfs.getAmPmStrings()[1]);
|
||||
assertEquals("a", dfs.getAmpmNarrowStrings()[0]);
|
||||
assertEquals("p", dfs.getAmpmNarrowStrings()[1]);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetDateFormatOrder() {
|
||||
// lv and fa use differing orders depending on whether you're using numeric or
|
||||
|
||||
Reference in New Issue
Block a user