Loading core/java/android/text/format/DateFormat.java +16 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading @@ -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); Loading Loading @@ -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); } } core/java/android/text/format/DateUtils.java +2 −1 Original line number Diff line number Diff line Loading @@ -222,7 +222,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]; } /** Loading core/java/android/text/format/TimeFormatter.java +11 −4 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ package android.text.format; import android.content.res.Resources; import android.icu.text.DateFormatSymbols; import com.android.i18n.timezone.ZoneInfoData; Loading Loading @@ -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; Loading @@ -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(); Loading @@ -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; Loading Loading @@ -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); Loading core/java/android/text/method/NumberKeyListener.java +1 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading core/java/android/widget/TimePicker.java +7 −5 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; } Loading Loading
core/java/android/text/format/DateFormat.java +16 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading @@ -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); Loading Loading @@ -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); } }
core/java/android/text/format/DateUtils.java +2 −1 Original line number Diff line number Diff line Loading @@ -222,7 +222,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]; } /** Loading
core/java/android/text/format/TimeFormatter.java +11 −4 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ package android.text.format; import android.content.res.Resources; import android.icu.text.DateFormatSymbols; import com.android.i18n.timezone.ZoneInfoData; Loading Loading @@ -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; Loading @@ -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(); Loading @@ -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; Loading Loading @@ -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); Loading
core/java/android/text/method/NumberKeyListener.java +1 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading
core/java/android/widget/TimePicker.java +7 −5 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; } Loading