Merge "Fix missing synchronized modifier" into jb-dev
diff --git a/java/src/com/android/inputmethod/latin/SubtypeLocale.java b/java/src/com/android/inputmethod/latin/SubtypeLocale.java
index 9f89f9e..7694b56 100644
--- a/java/src/com/android/inputmethod/latin/SubtypeLocale.java
+++ b/java/src/com/android/inputmethod/latin/SubtypeLocale.java
@@ -22,6 +22,8 @@
 import android.content.res.Resources;
 import android.view.inputmethod.InputMethodSubtype;
 
+import com.android.inputmethod.latin.LocaleUtils.RunInLocale;
+
 import java.util.HashMap;
 import java.util.Locale;
 
@@ -121,18 +123,27 @@
     //  fr    azerty F  Français
     //  fr_CA qwerty F  Français (Canada)
     //  de    qwertz F  Deutsch
-    //  zz    qwerty F  No language (QWERTY)
+    //  zz    qwerty F  No language (QWERTY)    in system locale
     //  fr    qwertz T  Français (QWERTZ)
     //  de    qwerty T  Deutsch (QWERTY)
     //  en_US azerty T  English (US) (AZERTY)
-    //  zz    azerty T  No language (AZERTY)
+    //  zz    azerty T  No language (AZERTY)    in system locale
 
     public static String getSubtypeDisplayName(InputMethodSubtype subtype, Resources res) {
         // TODO: Remove this check when InputMethodManager.getLastInputMethodSubtype is
         // fixed.
         if (!ImfUtils.checkIfSubtypeBelongsToThisIme(sContext, subtype)) return "";
         final String language = getSubtypeLocaleDisplayName(subtype.getLocale());
-        return res.getString(subtype.getNameResId(), language);
+        final int nameResId = subtype.getNameResId();
+        final RunInLocale<String> getSubtypeName = new RunInLocale<String>() {
+            @Override
+            protected String job(Resources res) {
+                return res.getString(nameResId, language);
+            }
+        };
+        final Locale locale = isNoLanguage(subtype)
+                ? res.getConfiguration().locale : getSubtypeLocale(subtype);
+        return getSubtypeName.runInLocale(res, locale);
     }
 
     public static boolean isNoLanguage(InputMethodSubtype subtype) {
diff --git a/tests/src/com/android/inputmethod/keyboard/SpacebarTextTests.java b/tests/src/com/android/inputmethod/keyboard/SpacebarTextTests.java
index 663f708..a34e0ef 100644
--- a/tests/src/com/android/inputmethod/keyboard/SpacebarTextTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/SpacebarTextTests.java
@@ -21,7 +21,6 @@
 import android.test.AndroidTestCase;
 import android.view.inputmethod.InputMethodSubtype;
 
-import com.android.inputmethod.compat.InputMethodManagerCompatWrapper;
 import com.android.inputmethod.latin.AdditionalSubtype;
 import com.android.inputmethod.latin.ImfUtils;
 import com.android.inputmethod.latin.StringUtils;
@@ -41,7 +40,6 @@
         super.setUp();
         final Context context = getContext();
         mRes = context.getResources();
-        InputMethodManagerCompatWrapper.init(context);
         SubtypeLocale.init(context);
     }
 
diff --git a/tests/src/com/android/inputmethod/latin/SubtypeLocaleTests.java b/tests/src/com/android/inputmethod/latin/SubtypeLocaleTests.java
index 5393b23..8863bcf 100644
--- a/tests/src/com/android/inputmethod/latin/SubtypeLocaleTests.java
+++ b/tests/src/com/android/inputmethod/latin/SubtypeLocaleTests.java
@@ -21,7 +21,6 @@
 import android.test.AndroidTestCase;
 import android.view.inputmethod.InputMethodSubtype;
 
-import com.android.inputmethod.compat.InputMethodManagerCompatWrapper;
 import com.android.inputmethod.latin.LocaleUtils.RunInLocale;
 
 import java.util.ArrayList;
@@ -31,14 +30,15 @@
     // Locale to subtypes list.
     private final ArrayList<InputMethodSubtype> mSubtypesList = new ArrayList<InputMethodSubtype>();
 
+    private Context mContext;
     private Resources mRes;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         final Context context = getContext();
+        mContext = context;
         mRes = context.getResources();
-        InputMethodManagerCompatWrapper.init(context);
         SubtypeLocale.init(context);
     }
 
@@ -65,13 +65,13 @@
     //  fr    azerty F  Français
     //  fr_CA qwerty F  Français (Canada)
     //  de    qwertz F  Deutsch
-    //  zz    qwerty F  No language (QWERTY)
+    //  zz    qwerty F  No language (QWERTY)    in system locale
     //  fr    qwertz T  Français (QWERTZ)
     //  de    qwerty T  Deutsch (QWERTY)
     //  en_US azerty T  English (US) (AZERTY)
-    //  zz    azerty T  No language (AZERTY)
+    //  zz    azerty T  No language (AZERTY)    in system locale
 
-    public void testPredefinedSubtypes() {
+    public void testPredefinedSubtypesInEnglish() {
         final Context context = getContext();
         final InputMethodSubtype EN_US = ImfUtils.findSubtypeByLocaleAndKeyboardLayoutSet(
                 context, Locale.US.toString(), "qwerty");
@@ -93,21 +93,28 @@
         assertEquals("de   ", "qwertz", SubtypeLocale.getKeyboardLayoutSetName(DE));
         assertEquals("zz   ", "qwerty", SubtypeLocale.getKeyboardLayoutSetName(ZZ));
 
-        assertEquals("en_US", "English (US)",
-                SubtypeLocale.getSubtypeDisplayName(EN_US, mRes));
-        assertEquals("en_GB", "English (UK)",
-                SubtypeLocale.getSubtypeDisplayName(EN_GB, mRes));
-        assertEquals("fr   ", "Français",
-                SubtypeLocale.getSubtypeDisplayName(FR, mRes));
-        assertEquals("fr_CA", "Français (Canada)",
-                SubtypeLocale.getSubtypeDisplayName(FR_CA, mRes));
-        assertEquals("de   ", "Deutsch",
-                SubtypeLocale.getSubtypeDisplayName(DE, mRes));
-        assertEquals("zz   ", "No language (QWERTY)",
-                SubtypeLocale.getSubtypeDisplayName(ZZ, mRes));
+        final RunInLocale<Void> tests = new RunInLocale<Void>() {
+            @Override
+            protected Void job(Resources res) {
+                assertEquals("en_US", "English (US)",
+                        SubtypeLocale.getSubtypeDisplayName(EN_US, res));
+                assertEquals("en_GB", "English (UK)",
+                        SubtypeLocale.getSubtypeDisplayName(EN_GB, res));
+                assertEquals("fr   ", "Français",
+                        SubtypeLocale.getSubtypeDisplayName(FR, res));
+                assertEquals("fr_CA", "Français (Canada)",
+                        SubtypeLocale.getSubtypeDisplayName(FR_CA, res));
+                assertEquals("de   ", "Deutsch",
+                        SubtypeLocale.getSubtypeDisplayName(DE, res));
+                assertEquals("zz   ", "No language (QWERTY)",
+                        SubtypeLocale.getSubtypeDisplayName(ZZ, res));
+                return null;
+            }
+        };
+        tests.runInLocale(mRes, Locale.ENGLISH);
     }
 
-    public void testAdditionalSubtype() {
+    public void testAdditionalSubtypesInEnglish() {
         final InputMethodSubtype DE_QWERTY = AdditionalSubtype.createAdditionalSubtype(
                 Locale.GERMAN.toString(), "qwerty", null);
         final InputMethodSubtype FR_QWERTZ = AdditionalSubtype.createAdditionalSubtype(
@@ -117,32 +124,87 @@
         final InputMethodSubtype ZZ_AZERTY = AdditionalSubtype.createAdditionalSubtype(
                 SubtypeLocale.NO_LANGUAGE, "azerty", null);
 
-        assertEquals("fr qwertz",    "Français (QWERTZ)",
-                SubtypeLocale.getSubtypeDisplayName(FR_QWERTZ, mRes));
-        assertEquals("de qwerty",    "Deutsch (QWERTY)",
-                SubtypeLocale.getSubtypeDisplayName(DE_QWERTY, mRes));
-        assertEquals("en_US azerty", "English (US) (AZERTY)",
-                SubtypeLocale.getSubtypeDisplayName(US_AZERTY, mRes));
-        assertEquals("zz azerty",    "No language (AZERTY)",
-                SubtypeLocale.getSubtypeDisplayName(ZZ_AZERTY, mRes));
-    }
-
-    public void testNoLanguageInFrench() {
-        final Context context = getContext();
-        final InputMethodSubtype ZZ = ImfUtils.findSubtypeByLocaleAndKeyboardLayoutSet(
-                context, SubtypeLocale.NO_LANGUAGE, "qwerty");
-        final InputMethodSubtype ZZ_AZERTY = AdditionalSubtype.createAdditionalSubtype(
-                SubtypeLocale.NO_LANGUAGE, "azerty", null);
+        ImfUtils.setAdditionalInputMethodSubtypes(mContext, new InputMethodSubtype[] {
+                DE_QWERTY, FR_QWERTZ, US_AZERTY, ZZ_AZERTY
+        });
 
         final RunInLocale<Void> tests = new RunInLocale<Void>() {
             @Override
             protected Void job(Resources res) {
-                assertEquals("zz   ", "qwerty", SubtypeLocale.getKeyboardLayoutSetName(ZZ));
-                assertEquals("zz   ", "azerty", SubtypeLocale.getKeyboardLayoutSetName(ZZ_AZERTY));
+                assertEquals("fr qwertz",    "Français (QWERTZ)",
+                        SubtypeLocale.getSubtypeDisplayName(FR_QWERTZ, res));
+                assertEquals("de qwerty",    "Deutsch (QWERTY)",
+                        SubtypeLocale.getSubtypeDisplayName(DE_QWERTY, res));
+                assertEquals("en_US azerty", "English (US) (AZERTY)",
+                        SubtypeLocale.getSubtypeDisplayName(US_AZERTY, res));
+                assertEquals("zz azerty",    "No language (AZERTY)",
+                        SubtypeLocale.getSubtypeDisplayName(ZZ_AZERTY, res));
+                return null;
+            }
+        };
+        tests.runInLocale(mRes, Locale.ENGLISH);
+    }
 
-                assertEquals("zz   ",     "Pas de langue (QWERTY)",
+    public void testPredefinedSubtypesInFrench() {
+        final Context context = getContext();
+        final InputMethodSubtype EN_US = ImfUtils.findSubtypeByLocaleAndKeyboardLayoutSet(
+                context, Locale.US.toString(), "qwerty");
+        final InputMethodSubtype EN_GB = ImfUtils.findSubtypeByLocaleAndKeyboardLayoutSet(
+                context, Locale.UK.toString(), "qwerty");
+        final InputMethodSubtype FR = ImfUtils.findSubtypeByLocaleAndKeyboardLayoutSet(
+                context, Locale.FRENCH.toString(), "azerty");
+        final InputMethodSubtype FR_CA = ImfUtils.findSubtypeByLocaleAndKeyboardLayoutSet(
+                context, Locale.CANADA_FRENCH.toString(), "qwerty");
+        final InputMethodSubtype DE = ImfUtils.findSubtypeByLocaleAndKeyboardLayoutSet(
+                context, Locale.GERMAN.toString(), "qwertz");
+        final InputMethodSubtype ZZ = ImfUtils.findSubtypeByLocaleAndKeyboardLayoutSet(
+                context, SubtypeLocale.NO_LANGUAGE, "qwerty");
+
+        final RunInLocale<Void> tests = new RunInLocale<Void>() {
+            @Override
+            protected Void job(Resources res) {
+                assertEquals("en_US", "English (US)",
+                        SubtypeLocale.getSubtypeDisplayName(EN_US, res));
+                assertEquals("en_GB", "English (UK)",
+                        SubtypeLocale.getSubtypeDisplayName(EN_GB, res));
+                assertEquals("fr   ", "Français",
+                        SubtypeLocale.getSubtypeDisplayName(FR, res));
+                assertEquals("fr_CA", "Français (Canada)",
+                        SubtypeLocale.getSubtypeDisplayName(FR_CA, res));
+                assertEquals("de   ", "Deutsch",
+                        SubtypeLocale.getSubtypeDisplayName(DE, res));
+                assertEquals("zz   ", "Pas de langue (QWERTY)",
                         SubtypeLocale.getSubtypeDisplayName(ZZ, res));
-                assertEquals("zz azerty", "Pas de langue (AZERTY)",
+                return null;
+            }
+        };
+        tests.runInLocale(mRes, Locale.FRENCH);
+    }
+
+    public void testAdditionalSubtypesInFrench() {
+        final InputMethodSubtype DE_QWERTY = AdditionalSubtype.createAdditionalSubtype(
+                Locale.GERMAN.toString(), "qwerty", null);
+        final InputMethodSubtype FR_QWERTZ = AdditionalSubtype.createAdditionalSubtype(
+                Locale.FRENCH.toString(), "qwertz", null);
+        final InputMethodSubtype US_AZERTY = AdditionalSubtype.createAdditionalSubtype(
+                Locale.US.toString(), "azerty", null);
+        final InputMethodSubtype ZZ_AZERTY = AdditionalSubtype.createAdditionalSubtype(
+                SubtypeLocale.NO_LANGUAGE, "azerty", null);
+
+        ImfUtils.setAdditionalInputMethodSubtypes(mContext, new InputMethodSubtype[] {
+                DE_QWERTY, FR_QWERTZ, US_AZERTY, ZZ_AZERTY
+        });
+
+        final RunInLocale<Void> tests = new RunInLocale<Void>() {
+            @Override
+            protected Void job(Resources res) {
+                assertEquals("fr qwertz",    "Français (QWERTZ)",
+                        SubtypeLocale.getSubtypeDisplayName(FR_QWERTZ, res));
+                assertEquals("de qwerty",    "Deutsch (QWERTY)",
+                        SubtypeLocale.getSubtypeDisplayName(DE_QWERTY, res));
+                assertEquals("en_US azerty", "English (US) (AZERTY)",
+                        SubtypeLocale.getSubtypeDisplayName(US_AZERTY, res));
+                assertEquals("zz azerty",    "Aucune langue (AZERTY)",
                         SubtypeLocale.getSubtypeDisplayName(ZZ_AZERTY, res));
                 return null;
             }