Support narrow am/pm markers in LocaleData.

Bug: 16938600
Change-Id: I7334c1ea57ea0593b3e0bd7943f8a5208c704881
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 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 @@
   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 @@
   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 @@
       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 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]);