Fix Locale.getDisplayName for unlocalizable languages/countries/variants.

This does not address the interpretation of script identifiers, but does bring us
in line with the RI's behavior. That's why the test doesn't use the example from
the bug.

Bug: 2611311
Change-Id: I54af89aaf418cd520dc6ebdb1e27dc1ac373f70f
diff --git a/libcore/luni/src/main/java/java/util/Locale.java b/libcore/luni/src/main/java/java/util/Locale.java
index 8e6354d..7d03eac 100644
--- a/libcore/luni/src/main/java/java/util/Locale.java
+++ b/libcore/luni/src/main/java/java/util/Locale.java
@@ -242,7 +242,7 @@
         if (language == null || country == null || variant == null) {
             throw new NullPointerException();
         }
-        if(language.length() == 0 && country.length() == 0){
+        if(language.isEmpty() && country.isEmpty()){
             languageCode = "";
             countryCode = "";
             variantCode = variant;
@@ -398,25 +398,28 @@
     public String getDisplayName(Locale locale) {
         int count = 0;
         StringBuilder buffer = new StringBuilder();
-        if (languageCode.length() > 0) {
-            buffer.append(getDisplayLanguage(locale));
-            count++;
+        if (!languageCode.isEmpty()) {
+            String displayLanguage = getDisplayLanguage(locale);
+            buffer.append(displayLanguage.isEmpty() ? languageCode : displayLanguage);
+            ++count;
         }
-        if (countryCode.length() > 0) {
+        if (!countryCode.isEmpty()) {
             if (count == 1) {
                 buffer.append(" (");
             }
-            buffer.append(getDisplayCountry(locale));
-            count++;
+            String displayCountry = getDisplayCountry(locale);
+            buffer.append(displayCountry.isEmpty() ? countryCode : displayCountry);
+            ++count;
         }
-        if (variantCode.length() > 0) {
+        if (!variantCode.isEmpty()) {
             if (count == 1) {
                 buffer.append(" (");
             } else if (count == 2) {
                 buffer.append(",");
             }
-            buffer.append(getDisplayVariant(locale));
-            count++;
+            String displayVariant = getDisplayVariant(locale);
+            buffer.append(displayVariant.isEmpty() ? variantCode : displayVariant);
+            ++count;
         }
         if (count > 1) {
             buffer.append(")");
diff --git a/libcore/luni/src/test/java/java/util/AllTests.java b/libcore/luni/src/test/java/java/util/AllTests.java
index 6539162..6680a8e 100644
--- a/libcore/luni/src/test/java/java/util/AllTests.java
+++ b/libcore/luni/src/test/java/java/util/AllTests.java
@@ -26,6 +26,7 @@
         suite.addTestSuite(java.util.CurrencyTest.class);
         suite.addTestSuite(java.util.DateTest.class);
         suite.addTestSuite(java.util.FormatterTest.class);
+        suite.addTestSuite(java.util.LocaleTest.class);
         suite.addTestSuite(java.util.RandomTest.class);
         suite.addTestSuite(java.util.ServiceLoaderTest.class);
         suite.addTestSuite(java.util.TimeZoneTest.class);
diff --git a/libcore/luni/src/test/java/java/util/LocaleTest.java b/libcore/luni/src/test/java/java/util/LocaleTest.java
new file mode 100644
index 0000000..c8a24f1
--- /dev/null
+++ b/libcore/luni/src/test/java/java/util/LocaleTest.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package java.util;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class LocaleTest extends junit.framework.TestCase {
+    public void test_getDisplayName() throws Exception {
+        // http://b/2611311; if there's no display language/country/variant, use the raw codes.
+        Locale weird = new Locale("AaBbCc", "DdEeFf", "GgHhIi");
+        assertEquals("aabbcc", weird.getLanguage());
+        assertEquals("", weird.getDisplayLanguage());
+        assertEquals("DDEEFF", weird.getCountry());
+        assertEquals("", weird.getDisplayCountry());
+        assertEquals("GgHhIi", weird.getVariant());
+        assertEquals("", weird.getDisplayVariant());
+        assertEquals("aabbcc (DDEEFF,GgHhIi)", weird.getDisplayName());
+    }
+}