diff options
author | Elliott Hughes <enh@google.com> | 2014-08-21 16:20:16 -0700 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2014-08-22 13:52:12 -0700 |
commit | ebe417d7808ac5bce5bc14d36d6af4c31218326d (patch) | |
tree | 3b0628fd8d7f8769ed148403312b85e5605f4dc7 /luni | |
parent | 4781e999a945a5c44778b60166cde5a8b65c1c02 (diff) | |
download | libcore-ebe417d7808ac5bce5bc14d36d6af4c31218326d.zip libcore-ebe417d7808ac5bce5bc14d36d6af4c31218326d.tar.gz libcore-ebe417d7808ac5bce5bc14d36d6af4c31218326d.tar.bz2 |
Support narrow am/pm markers in LocaleData.
Bug: 16938600
Change-Id: I7334c1ea57ea0593b3e0bd7943f8a5208c704881
Diffstat (limited to 'luni')
-rw-r--r-- | luni/src/main/java/libcore/icu/LocaleData.java | 4 | ||||
-rw-r--r-- | luni/src/main/native/libcore_icu_ICU.cpp | 40 | ||||
-rw-r--r-- | luni/src/test/java/libcore/icu/LocaleDataTest.java | 2 |
3 files changed, 44 insertions, 2 deletions
diff --git a/luni/src/main/java/libcore/icu/LocaleData.java b/luni/src/main/java/libcore/icu/LocaleData.java index 6f59257..9e07244 100644 --- a/luni/src/main/java/libcore/icu/LocaleData.java +++ b/luni/src/main/java/libcore/icu/LocaleData.java @@ -79,6 +79,10 @@ public final class LocaleData { public String mediumDateFormat; public String shortDateFormat; + // Used by TimePicker. Not currently used by UTS#35. + public String narrowAm; // "a". + public String narrowPm; // "p". + // shortDateFormat, but guaranteed to have 4-digit years. // Used by android.text.format.DateFormat.getDateFormatStringForSetting. public String shortDateFormat4; diff --git a/luni/src/main/native/libcore_icu_ICU.cpp b/luni/src/main/native/libcore_icu_ICU.cpp index df26b39..1528a2d 100644 --- a/luni/src/main/native/libcore_icu_ICU.cpp +++ b/luni/src/main/native/libcore_icu_ICU.cpp @@ -450,6 +450,29 @@ class LocaleNameIterator { DISALLOW_COPY_AND_ASSIGN(LocaleNameIterator); }; +static bool getAmPmMarkersNarrow(JNIEnv* env, jobject localeData, const char* locale_name) { + UErrorCode status = U_ZERO_ERROR; + ScopedResourceBundle root(ures_open(NULL, locale_name, &status)); + if (U_FAILURE(status)) { + return false; + } + ScopedResourceBundle calendar(ures_getByKey(root.get(), "calendar", NULL, &status)); + if (U_FAILURE(status)) { + return false; + } + ScopedResourceBundle gregorian(ures_getByKey(calendar.get(), "gregorian", NULL, &status)); + if (U_FAILURE(status)) { + return false; + } + ScopedResourceBundle amPmMarkersNarrow(ures_getByKey(gregorian.get(), "AmPmMarkersNarrow", NULL, &status)); + if (U_FAILURE(status)) { + return false; + } + setStringField(env, localeData, "narrowAm", amPmMarkersNarrow.get(), 0); + setStringField(env, localeData, "narrowPm", amPmMarkersNarrow.get(), 1); + return true; +} + static bool getDateTimePatterns(JNIEnv* env, jobject localeData, const char* locale_name) { UErrorCode status = U_ZERO_ERROR; ScopedResourceBundle root(ures_open(NULL, locale_name, &status)); @@ -493,14 +516,14 @@ static bool getYesterdayTodayAndTomorrow(JNIEnv* env, jobject localeData, const UnicodeString today(ures_getUnicodeStringByKey(relative.get(), "0", &status)); UnicodeString tomorrow(ures_getUnicodeStringByKey(relative.get(), "1", &status)); if (U_FAILURE(status)) { - ALOGE("Error getting yesterday/today/tomorrow: %s", u_errorName(status)); + ALOGE("Error getting yesterday/today/tomorrow for %s: %s", locale_name, u_errorName(status)); return false; } // We title-case the strings so they have consistent capitalization (http://b/14493853). UniquePtr<BreakIterator> brk(BreakIterator::createSentenceInstance(locale, status)); if (U_FAILURE(status)) { - ALOGE("Error getting yesterday/today/tomorrow break iterator: %s", u_errorName(status)); + ALOGE("Error getting yesterday/today/tomorrow break iterator for %s: %s", locale_name, u_errorName(status)); return false; } yesterday.toTitle(brk.get(), locale, U_TITLECASE_NO_LOWERCASE | U_TITLECASE_NO_BREAK_ADJUSTMENT); @@ -554,6 +577,19 @@ static jboolean ICU_initLocaleDataNative(JNIEnv* env, jclass, jstring javaLangua return JNI_FALSE; } + // Get the narrow "AM" and "PM" strings. + bool foundAmPmMarkersNarrow = false; + for (LocaleNameIterator it(icuLocale.locale().getBaseName(), status); it.HasNext(); it.Up()) { + if (getAmPmMarkersNarrow(env, localeData, it.Get())) { + foundAmPmMarkersNarrow = true; + break; + } + } + if (!foundAmPmMarkersNarrow) { + ALOGE("Couldn't find ICU AmPmMarkersNarrow for %s", languageTag.c_str()); + return JNI_FALSE; + } + status = U_ZERO_ERROR; UniquePtr<Calendar> cal(Calendar::createInstance(icuLocale.locale(), status)); if (U_FAILURE(status)) { diff --git a/luni/src/test/java/libcore/icu/LocaleDataTest.java b/luni/src/test/java/libcore/icu/LocaleDataTest.java index b692f34..0a83c53 100644 --- a/luni/src/test/java/libcore/icu/LocaleDataTest.java +++ b/luni/src/test/java/libcore/icu/LocaleDataTest.java @@ -31,6 +31,8 @@ public class LocaleDataTest extends junit.framework.TestCase { public void test_en_US() throws Exception { LocaleData l = LocaleData.get(Locale.US); assertEquals("AM", l.amPm[0]); + assertEquals("a", l.narrowAm); + assertEquals("BC", l.eras[0]); assertEquals("January", l.longMonthNames[0]); |