Merge "BinaryDictionaryTests uses ver4 dictionary, too."
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/RichInputConnection.java b/java/src/com/android/inputmethod/latin/RichInputConnection.java
index 4a7f530..5aa824e 100644
--- a/java/src/com/android/inputmethod/latin/RichInputConnection.java
+++ b/java/src/com/android/inputmethod/latin/RichInputConnection.java
@@ -243,6 +243,7 @@
         if (DEBUG_PREVIOUS_TEXT) checkConsistencyForDebug();
         mCommittedTextBeforeComposingText.append(text);
         mExpectedSelStart += text.length() - mComposingText.length();
+        mExpectedSelEnd = mExpectedSelStart;
         mComposingText.setLength(0);
         if (null != mIC) {
             mIC.commitText(text, i);
@@ -493,6 +494,7 @@
         if (DEBUG_BATCH_NESTING) checkBatchEdit();
         if (DEBUG_PREVIOUS_TEXT) checkConsistencyForDebug();
         mExpectedSelStart = start;
+        mExpectedSelEnd = end;
         if (null != mIC) {
             final boolean isIcValid = mIC.setSelection(start, end);
             if (!isIcValid) {
@@ -524,6 +526,7 @@
         if (null == text) text = "";
         mCommittedTextBeforeComposingText.append(text);
         mExpectedSelStart += text.length() - mComposingText.length();
+        mExpectedSelEnd = mExpectedSelStart;
         mComposingText.setLength(0);
         if (null != mIC) {
             mIC.commitCompletion(completionInfo);
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/java/src/com/android/inputmethod/latin/settings/SettingsFragment.java b/java/src/com/android/inputmethod/latin/settings/SettingsFragment.java
index 5c60a73..f841f20 100644
--- a/java/src/com/android/inputmethod/latin/settings/SettingsFragment.java
+++ b/java/src/com/android/inputmethod/latin/settings/SettingsFragment.java
@@ -48,7 +48,6 @@
 import com.android.inputmethod.latin.utils.ApplicationUtils;
 import com.android.inputmethod.latin.utils.FeedbackUtils;
 import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
-import com.android.inputmethod.research.ResearchLogger;
 import com.android.inputmethodcommon.InputMethodSettingsFragment;
 
 import java.util.TreeSet;
@@ -143,12 +142,7 @@
                 feedbackSettings.setOnPreferenceClickListener(new OnPreferenceClickListener() {
                     @Override
                     public boolean onPreferenceClick(final Preference pref) {
-                        if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) {
-                            // Use development-only feedback mechanism
-                            ResearchLogger.getInstance().presentFeedbackDialogFromSettings();
-                        } else {
-                            FeedbackUtils.showFeedbackForm(getActivity());
-                        }
+                        FeedbackUtils.showFeedbackForm(getActivity());
                         return true;
                     }
                 });
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();