Merge "Separate debug information display from candidate view"
diff --git a/java/src/com/android/inputmethod/compat/InputMethodSubtypeCompatWrapper.java b/java/src/com/android/inputmethod/compat/InputMethodSubtypeCompatWrapper.java
index 806c355..667d86c 100644
--- a/java/src/com/android/inputmethod/compat/InputMethodSubtypeCompatWrapper.java
+++ b/java/src/com/android/inputmethod/compat/InputMethodSubtypeCompatWrapper.java
@@ -48,6 +48,8 @@
             CompatUtils.getMethod(CLASS_InputMethodSubtype, "containsExtraValueKey", String.class);
     private static final Method METHOD_getExtraValueOf =
             CompatUtils.getMethod(CLASS_InputMethodSubtype, "getExtraValueOf", String.class);
+    private static final Method METHOD_isAuxiliary =
+            CompatUtils.getMethod(CLASS_InputMethodSubtype, "isAuxiliary");
 
     private final int mDummyNameResId;
     private final int mDummyIconResId;
@@ -116,6 +118,10 @@
         return (String)CompatUtils.invoke(mObj, null, METHOD_getExtraValueOf, key);
     }
 
+    public boolean isAuxiliary() {
+        return (Boolean)CompatUtils.invoke(mObj, false, METHOD_isAuxiliary);
+    }
+
     public boolean isDummy() {
         return !hasOriginalObject();
     }
diff --git a/java/src/com/android/inputmethod/deprecated/voice/VoiceInput.java b/java/src/com/android/inputmethod/deprecated/voice/VoiceInput.java
index 92cc1c3..2dba014 100644
--- a/java/src/com/android/inputmethod/deprecated/voice/VoiceInput.java
+++ b/java/src/com/android/inputmethod/deprecated/voice/VoiceInput.java
@@ -192,7 +192,7 @@
         }
 
         mBlacklist = new Whitelist();
-        mBlacklist.addApp("com.google.android.setupwizard");
+        mBlacklist.addApp("com.android.setupwizard");
     }
 
     public void setCursorPos(int pos) {
diff --git a/java/src/com/android/inputmethod/latin/Utils.java b/java/src/com/android/inputmethod/latin/Utils.java
index 66a6d16..6bdc0a8 100644
--- a/java/src/com/android/inputmethod/latin/Utils.java
+++ b/java/src/com/android/inputmethod/latin/Utils.java
@@ -18,6 +18,7 @@
 
 import com.android.inputmethod.compat.InputMethodInfoCompatWrapper;
 import com.android.inputmethod.compat.InputMethodManagerCompatWrapper;
+import com.android.inputmethod.compat.InputMethodSubtypeCompatWrapper;
 import com.android.inputmethod.compat.InputTypeCompatUtils;
 import com.android.inputmethod.keyboard.Keyboard;
 import com.android.inputmethod.keyboard.KeyboardId;
@@ -43,8 +44,10 @@
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Locale;
 
 public class Utils {
@@ -109,7 +112,34 @@
     }
 
     public static boolean hasMultipleEnabledIMEsOrSubtypes(InputMethodManagerCompatWrapper imm) {
-        return imm.getEnabledInputMethodList().size() > 1
+        final List<InputMethodInfoCompatWrapper> enabledImis = imm.getEnabledInputMethodList();
+
+        // Filters out IMEs that have auxiliary subtypes only (including either implicitly or
+        // explicitly enabled ones).
+        final ArrayList<InputMethodInfoCompatWrapper> filteredImis =
+                new ArrayList<InputMethodInfoCompatWrapper>();
+
+        outerloop:
+        for (InputMethodInfoCompatWrapper imi : enabledImis) {
+            // We can return true immediately after we find two or more filtered IMEs.
+            if (filteredImis.size() > 1) return true;
+            final List<InputMethodSubtypeCompatWrapper> subtypes =
+                    imm.getEnabledInputMethodSubtypeList(imi, true);
+            // IMEs that have no subtypes should be included.
+            if (subtypes.isEmpty()) {
+                filteredImis.add(imi);
+                continue;
+            }
+            // IMEs that have one or more non-auxiliary subtypes should be included.
+            for (InputMethodSubtypeCompatWrapper subtype : subtypes) {
+                if (!subtype.isAuxiliary()) {
+                    filteredImis.add(imi);
+                    continue outerloop;
+                }
+            }
+        }
+
+        return filteredImis.size() > 1
         // imm.getEnabledInputMethodSubtypeList(null, false) will return the current IME's enabled
         // input method subtype (The current IME should be LatinIME.)
                 || imm.getEnabledInputMethodSubtypeList(null, false).size() > 1;