Add a showing input method picker option by longpressing setting key

Bug: 2959271

Change-Id: I4b7e9a2de3cbe17b168ed8d0541a9b1cd9a9e107
diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml
index 0952114..7b760f0 100644
--- a/java/res/values/strings.xml
+++ b/java/res/values/strings.xml
@@ -320,7 +320,10 @@
 
     <!-- Menu item for launching Input method switcher -->
     <string name="inputMethod">Input method</string>
-    
+
+    <!-- Menu item for launching Input method picker -->
+    <string name="selectInputMethod">Select input method</string>
+
     <!-- Title for input language selection screen -->
     <string name="language_selection_title">Input languages</string>
     <!-- Title summary for input language selection screen -->
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index d0e6e69..3b4b4ff 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -1083,6 +1083,40 @@
         }
     }
 
+    private boolean hasMultipleEnabledIMEs() {
+        return ((InputMethodManager) getSystemService(
+                INPUT_METHOD_SERVICE)).getEnabledInputMethodList().size() > 1;
+    }
+
+    private void showInputMethodPicker() {
+        ((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE))
+                .showInputMethodPicker();
+    }
+
+    private void onOptionKeyPressed() {
+        if (!isShowingOptionDialog()) {
+            if (hasMultipleEnabledIMEs()) {
+                showOptionsMenu();
+            } else {
+                launchSettings();
+            }
+        }
+    }
+
+    private void onOptionKeyLongPressed() {
+        if (!isShowingOptionDialog()) {
+            if (hasMultipleEnabledIMEs()) {
+                showInputMethodPicker();
+            } else {
+                launchSettings();
+            }
+        }
+    }
+
+    private boolean isShowingOptionDialog() {
+        return mOptionsDialog != null && mOptionsDialog.isShowing();
+    }
+
     // Implementation of KeyboardViewListener
 
     public void onKey(int primaryCode, int[] keyCodes, int x, int y) {
@@ -1102,12 +1136,15 @@
                 // Shift key is handled in onPress().
                 break;
             case Keyboard.KEYCODE_CANCEL:
-                if (mOptionsDialog == null || !mOptionsDialog.isShowing()) {
+                if (!isShowingOptionDialog()) {
                     handleClose();
                 }
                 break;
             case LatinKeyboardView.KEYCODE_OPTIONS:
-                showOptionsMenu();
+                onOptionKeyPressed();
+                break;
+            case LatinKeyboardView.KEYCODE_OPTIONS_LONGPRESS:
+                onOptionKeyLongPressed();
                 break;
             case LatinKeyboardView.KEYCODE_NEXT_LANGUAGE:
                 toggleLanguage(false, true);
@@ -2400,7 +2437,7 @@
         builder.setIcon(R.drawable.ic_dialog_keyboard);
         builder.setNegativeButton(android.R.string.cancel, null);
         CharSequence itemSettings = getString(R.string.english_ime_settings);
-        CharSequence itemInputMethod = getString(R.string.inputMethod);
+        CharSequence itemInputMethod = getString(R.string.selectInputMethod);
         builder.setItems(new CharSequence[] {
                 itemSettings, itemInputMethod},
                 new DialogInterface.OnClickListener() {
diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java
index 7a99366..9236d68 100644
--- a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java
+++ b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java
@@ -32,6 +32,7 @@
 public class LatinKeyboardView extends LatinKeyboardBaseView {
 
     static final int KEYCODE_OPTIONS = -100;
+    static final int KEYCODE_OPTIONS_LONGPRESS = -101;
     static final int KEYCODE_VOICE = -102;
     static final int KEYCODE_F1 = -103;
     static final int KEYCODE_NEXT_LANGUAGE = -104;
@@ -76,7 +77,12 @@
 
     @Override
     protected boolean onLongPress(Key key) {
-        if (key.codes[0] == '0' && getKeyboard() == mPhoneKeyboard) {
+        if (key.codes[0] == KEYCODE_OPTIONS) {
+            getOnKeyboardActionListener().onKey(KEYCODE_OPTIONS_LONGPRESS, null,
+                    LatinKeyboardBaseView.NOT_A_TOUCH_COORDINATE,
+                    LatinKeyboardBaseView.NOT_A_TOUCH_COORDINATE);
+            return true;
+        } else if (key.codes[0] == '0' && getKeyboard() == mPhoneKeyboard) {
             // Long pressing on 0 in phone number keypad gives you a '+'.
             getOnKeyboardActionListener().onKey(
                     '+', null, LatinKeyboardBaseView.NOT_A_TOUCH_COORDINATE,