Merge "Fix Locale.getDisplayName."
diff --git a/luni/src/main/java/java/util/Locale.java b/luni/src/main/java/java/util/Locale.java
index 885d150..3161769 100644
--- a/luni/src/main/java/java/util/Locale.java
+++ b/luni/src/main/java/java/util/Locale.java
@@ -1034,13 +1034,14 @@
     /**
      * Returns this locale's language name, country name, and variant, localized
      * to {@code locale}. The exact output form depends on whether this locale
-     * corresponds to a specific language, country and variant.
+     * corresponds to a specific language, script, country and variant.
      *
      * <p>For example:
      * <ul>
      * <li>{@code new Locale("en").getDisplayName(Locale.US)} -> {@code English}
      * <li>{@code new Locale("en", "US").getDisplayName(Locale.US)} -> {@code English (United States)}
      * <li>{@code new Locale("en", "US", "POSIX").getDisplayName(Locale.US)} -> {@code English (United States,Computer)}
+     * <li>{@code Locale.fromLanguageTag("zh-Hant-CN").getDisplayName(Locale.US)} -> {@code Chinese (Traditional Han,China)}
      * <li>{@code new Locale("en").getDisplayName(Locale.FRANCE)} -> {@code anglais}
      * <li>{@code new Locale("en", "US").getDisplayName(Locale.FRANCE)} -> {@code anglais (États-Unis)}
      * <li>{@code new Locale("en", "US", "POSIX").getDisplayName(Locale.FRANCE)} -> {@code anglais (États-Unis,informatique)}.
@@ -1059,12 +1060,14 @@
                 buffer.append(" (");
             }
             String displayScript = getDisplayScript(locale);
-            buffer.append(displayScript.isEmpty() ? countryCode : displayScript);
+            buffer.append(displayScript.isEmpty() ? scriptCode : displayScript);
             ++count;
         }
         if (!countryCode.isEmpty()) {
             if (count == 1) {
                 buffer.append(" (");
+            } else if (count == 2) {
+                buffer.append(",");
             }
             String displayCountry = getDisplayCountry(locale);
             buffer.append(displayCountry.isEmpty() ? countryCode : displayCountry);
@@ -1073,7 +1076,7 @@
         if (!variantCode.isEmpty()) {
             if (count == 1) {
                 buffer.append(" (");
-            } else if (count == 2) {
+            } else if (count == 2 || count == 3) {
                 buffer.append(",");
             }
             String displayVariant = getDisplayVariant(locale);
diff --git a/luni/src/test/java/libcore/java/util/LocaleTest.java b/luni/src/test/java/libcore/java/util/LocaleTest.java
index c463269..cadd472 100644
--- a/luni/src/test/java/libcore/java/util/LocaleTest.java
+++ b/luni/src/test/java/libcore/java/util/LocaleTest.java
@@ -69,6 +69,22 @@
         assertEquals("Deutsch", Locale.GERMAN.getDisplayLanguage(Locale.GERMAN));
     }
 
+    // https://b/issue?id=13790528
+    public void test_getDisplayName_withScriptsAndVariants() throws Exception {
+        // Script + Country.
+        assertEquals("Chinese (Traditional Han,China)",
+                Locale.forLanguageTag("zh-Hant-CN").getDisplayName(Locale.US));
+        // Script + Variant.
+        assertEquals("Chinese (Traditional Han,VARIANT)",
+                Locale.forLanguageTag("zh-Hant-VARIANT").getDisplayName(Locale.US));
+        // Country + Variant.
+        assertEquals("Chinese (China,VARIANT)",
+                Locale.forLanguageTag("zh-CN-VARIANT").getDisplayName(Locale.US));
+        // Script + Country + variant.
+        assertEquals("Chinese (Traditional Han,China,VARIANT)",
+                Locale.forLanguageTag("zh-Hant-CN-VARIANT").getDisplayName(Locale.US));
+    }
+
     public void test_getDisplayCountry_8870289() throws Exception {
         assertEquals("Hong Kong", new Locale("", "HK").getDisplayCountry(Locale.US));
         assertEquals("Macau", new Locale("", "MO").getDisplayCountry(Locale.US));