Merge "Fix a flaky test."
diff --git a/java/src/com/android/inputmethod/latin/Constants.java b/java/src/com/android/inputmethod/latin/Constants.java
index 9a96530..c260434 100644
--- a/java/src/com/android/inputmethod/latin/Constants.java
+++ b/java/src/com/android/inputmethod/latin/Constants.java
@@ -70,38 +70,47 @@
 
         public static final class ExtraValue {
             /**
-             * The subtype extra value used to indicate that the subtype keyboard layout is capable
-             * for typing ASCII characters.
+             * The subtype extra value used to indicate that this subtype is capable of
+             * entering ASCII characters.
              */
             public static final String ASCII_CAPABLE = "AsciiCapable";
 
             /**
-             * The subtype extra value used to indicate that the subtype keyboard layout is capable
-             * for typing EMOJI characters.
+             * The subtype extra value used to indicate that this subtype is enabled
+             * when the default subtype is not marked as ascii capable.
+             */
+            public static final String ENABLED_WHEN_DEFAULT_IS_NOT_ASCII_CAPABLE =
+                    "EnabledWhenDefaultIsNotAsciiCapable";
+
+            /**
+             * The subtype extra value used to indicate that this subtype is capable of
+             * entering emoji characters.
              */
             public static final String EMOJI_CAPABLE = "EmojiCapable";
+
             /**
-             * The subtype extra value used to indicate that the subtype require network connection
-             * to work.
+             * The subtype extra value used to indicate that this subtype requires a network
+             * connection to work.
              */
             public static final String REQ_NETWORK_CONNECTIVITY = "requireNetworkConnectivity";
 
             /**
-             * The subtype extra value used to indicate that the subtype display name contains "%s"
-             * for replacement mark and it should be replaced by this extra value.
+             * The subtype extra value used to indicate that the display name of this subtype
+             * contains a "%s" for printf-like replacement and it should be replaced by
+             * this extra value.
              * This extra value is supported on JellyBean and later.
              */
             public static final String UNTRANSLATABLE_STRING_IN_SUBTYPE_NAME =
                     "UntranslatableReplacementStringInSubtypeName";
 
             /**
-             * The subtype extra value used to indicate that the subtype keyboard layout set name.
+             * The subtype extra value used to indicate this subtype keyboard layout set name.
              * This extra value is private to LatinIME.
              */
             public static final String KEYBOARD_LAYOUT_SET = "KeyboardLayoutSet";
 
             /**
-             * The subtype extra value used to indicate that the subtype is additional subtype
+             * The subtype extra value used to indicate that this subtype is an additional subtype
              * that the user defined. This extra value is private to LatinIME.
              */
             public static final String IS_ADDITIONAL_SUBTYPE = "isAdditionalSubtype";
diff --git a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
index cd9c89f..2e7501a 100644
--- a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
+++ b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
@@ -33,6 +33,7 @@
 
 import com.android.inputmethod.annotations.UsedForTesting;
 import com.android.inputmethod.keyboard.KeyboardSwitcher;
+import com.android.inputmethod.latin.utils.LocaleUtils;
 import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
 
 import java.util.List;
@@ -62,7 +63,7 @@
             SubtypeLocaleUtils.NO_LANGUAGE, "keyboard", "KeyboardLayoutSet="
                     + SubtypeLocaleUtils.QWERTY
                     + "," + Constants.Subtype.ExtraValue.ASCII_CAPABLE
-                    + ",EnabledWhenDefaultIsNotAsciiCapable,"
+                    + "," + Constants.Subtype.ExtraValue.ENABLED_WHEN_DEFAULT_IS_NOT_ASCII_CAPABLE
                     + Constants.Subtype.ExtraValue.EMOJI_CAPABLE,
             false /* isAuxiliary */, false /* overridesImplicitlyEnabledSubtype */);
     // Caveat: We probably should remove this when we add an Emoji subtype in {@link R.xml.method}.
@@ -256,18 +257,23 @@
         return mNeedsToDisplayLanguage.getValue();
     }
 
-    private static Locale sForcedLocaleForTesting = null;
+    private static InputMethodSubtype sForcedSubtypeForTesting = null;
     @UsedForTesting
-    void forceLocale(final Locale locale) {
-        sForcedLocaleForTesting = locale;
+    void forceSubtype(final InputMethodSubtype subtype) {
+        sForcedSubtypeForTesting = subtype;
     }
 
     public Locale getCurrentSubtypeLocale() {
-        if (null != sForcedLocaleForTesting) return sForcedLocaleForTesting;
+        if (null != sForcedSubtypeForTesting) {
+            return LocaleUtils.constructLocaleFromString(sForcedSubtypeForTesting.getLocale());
+        }
         return SubtypeLocaleUtils.getSubtypeLocale(getCurrentSubtype());
     }
 
     public InputMethodSubtype getCurrentSubtype() {
+        if (null != sForcedSubtypeForTesting) {
+            return sForcedSubtypeForTesting;
+        }
         return mRichImm.getCurrentInputMethodSubtype(getNoLanguageSubtype());
     }
 
@@ -279,8 +285,8 @@
         if (mNoLanguageSubtype != null) {
             return mNoLanguageSubtype;
         }
-        Log.w(TAG, "Can't find no lanugage with QWERTY subtype");
-        Log.w(TAG, "No input method subtype found; return dummy subtype: "
+        Log.w(TAG, "Can't find any language with QWERTY subtype");
+        Log.w(TAG, "No input method subtype found; returning dummy subtype: "
                 + DUMMY_NO_LANGUAGE_SUBTYPE);
         return DUMMY_NO_LANGUAGE_SUBTYPE;
     }
@@ -293,8 +299,9 @@
         if (mEmojiSubtype != null) {
             return mEmojiSubtype;
         }
-        Log.w(TAG, "Can't find Emoji subtype");
-        Log.w(TAG, "No input method subtype found; return dummy subtype: " + DUMMY_EMOJI_SUBTYPE);
+        Log.w(TAG, "Can't find emoji subtype");
+        Log.w(TAG, "No input method subtype found; returning dummy subtype: "
+                + DUMMY_EMOJI_SUBTYPE);
         return DUMMY_EMOJI_SUBTYPE;
     }
 }
diff --git a/tests/src/com/android/inputmethod/latin/InputTestsBase.java b/tests/src/com/android/inputmethod/latin/InputTestsBase.java
index 3cb980c..6306571 100644
--- a/tests/src/com/android/inputmethod/latin/InputTestsBase.java
+++ b/tests/src/com/android/inputmethod/latin/InputTestsBase.java
@@ -30,6 +30,7 @@
 import android.view.ViewGroup;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputConnection;
+import android.view.inputmethod.InputMethodSubtype;
 import android.widget.EditText;
 import android.widget.FrameLayout;
 
@@ -37,6 +38,7 @@
 import com.android.inputmethod.keyboard.Keyboard;
 import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
 import com.android.inputmethod.latin.utils.LocaleUtils;
+import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
 
 import java.util.Locale;
 
@@ -244,7 +246,18 @@
 
     protected void changeLanguageWithoutWait(final String locale) {
         mEditText.mCurrentLocale = LocaleUtils.constructLocaleFromString(locale);
-        SubtypeSwitcher.getInstance().forceLocale(mEditText.mCurrentLocale);
+        final InputMethodSubtype subtype = new InputMethodSubtype(
+            R.string.subtype_no_language_qwerty, R.drawable.ic_ime_switcher_dark,
+            locale, "keyboard", "KeyboardLayoutSet="
+                    // TODO: this is forcing a QWERTY keyboard for all locales, which is wrong.
+                    // It's still better than using whatever keyboard is the current one, but we
+                    // should actually use the default keyboard for this locale.
+                    + SubtypeLocaleUtils.QWERTY
+                    + "," + Constants.Subtype.ExtraValue.ASCII_CAPABLE
+                    + "," + Constants.Subtype.ExtraValue.ENABLED_WHEN_DEFAULT_IS_NOT_ASCII_CAPABLE
+                    + Constants.Subtype.ExtraValue.EMOJI_CAPABLE,
+                    false /* isAuxiliary */, false /* overridesImplicitlyEnabledSubtype */);
+        SubtypeSwitcher.getInstance().forceSubtype(subtype);
         mLatinIME.loadKeyboard();
         runMessages();
         mKeyboard = mLatinIME.mKeyboardSwitcher.getKeyboard();