Show locale names in alphabetical order, in their own language.

Bug 1776043: List the locales in alphabetical order.
Bug 1703550: List the locales in their own languages instead of
in the current language.
diff --git a/src/com/android/settings/LocalePicker.java b/src/com/android/settings/LocalePicker.java
index 67978ee..ecd9689 100644
--- a/src/com/android/settings/LocalePicker.java
+++ b/src/com/android/settings/LocalePicker.java
@@ -30,6 +30,7 @@
 
 import java.io.BufferedWriter;
 import java.io.FileOutputStream;
+import java.text.Collator;
 import java.util.Arrays;
 import java.util.Locale;
 
@@ -38,7 +39,9 @@
 
     Loc[] mLocales;
 
-    private static class Loc {
+    private static class Loc implements Comparable {
+        static Collator sCollator = Collator.getInstance();
+
         String label;
         Locale locale;
 
@@ -51,6 +54,10 @@
         public String toString() {
             return this.label;
         }
+
+        public int compareTo(Object o) {
+            return sCollator.compare(this.label, ((Loc) o).label);
+        }
     }
 
     int getContentView() {
@@ -78,9 +85,9 @@
 
                 if (finalSize == 0) {
                     Log.v(TAG, "adding initial "+
-                            toTitleCase(l.getDisplayLanguage()));
+                            toTitleCase(l.getDisplayLanguage(l)));
                     preprocess[finalSize++] =
-                            new Loc(toTitleCase(l.getDisplayLanguage()), l);
+                            new Loc(toTitleCase(l.getDisplayLanguage(l)), l);
                 } else {
                     // check previous entry:
                     //  same lang and a country -> upgrade to full name and
@@ -91,20 +98,20 @@
                         Log.v(TAG, "backing up and fixing "+
                                 preprocess[finalSize-1].label+" to "+
                                 preprocess[finalSize-1].locale.
-                                getDisplayName());
+                                getDisplayName(l));
                         preprocess[finalSize-1].label = toTitleCase(
                                 preprocess[finalSize-1].
-                                locale.getDisplayName());
+                                locale.getDisplayName(l));
                         Log.v(TAG, "  and adding "+
-                                toTitleCase(l.getDisplayName()));
+                                toTitleCase(l.getDisplayName(l)));
                         preprocess[finalSize++] =
-                                new Loc(toTitleCase(l.getDisplayName()), l);
+                                new Loc(toTitleCase(l.getDisplayName(l)), l);
                     } else {
                         String displayName;
                         if (s.equals("zz_ZZ")) {
                             displayName = "Pseudo...";
                         } else {
-                            displayName = toTitleCase(l.getDisplayLanguage());
+                            displayName = toTitleCase(l.getDisplayLanguage(l));
                         }
                         Log.v(TAG, "adding "+displayName);
                         preprocess[finalSize++] = new Loc(displayName, l);
@@ -116,6 +123,7 @@
         for (int i = 0; i < finalSize ; i++) {
             mLocales[i] = preprocess[i];
         }
+        Arrays.sort(mLocales);
         int layoutId = R.layout.locale_picker_item;
         int fieldId = R.id.locale;
         ArrayAdapter<Loc> adapter =