Merge "Fix inconsistent behavior with the back-to-the-main-keyboard key"
diff --git a/java/src/com/android/inputmethod/keyboard/EmojiPalettesView.java b/java/src/com/android/inputmethod/keyboard/EmojiPalettesView.java
index 36ebbb5..672759a 100644
--- a/java/src/com/android/inputmethod/keyboard/EmojiPalettesView.java
+++ b/java/src/com/android/inputmethod/keyboard/EmojiPalettesView.java
@@ -487,24 +487,20 @@
         deleteKey.setTag(Constants.CODE_DELETE);
         deleteKey.setOnTouchListener(mDeleteKeyOnTouchListener);
 
-        // alphabetKey depends only on OnTouchListener as it does everything in key-press in
-        // ACTION_DOWN.
+        // alphabetKey, alphabetKey2, and spaceKey depend on {@link View.OnClickListener} as well as
+        // {@link View.OnTouchListener}. {@link View.OnTouchListener} is used as the trigger of
+        // key-press, while {@link View.OnClickListener} is used as the trigger of key-release which
+        // does not occur if the event is canceled by moving off the finger from the view.
         final ImageView alphabetKey = (ImageView)findViewById(R.id.emoji_keyboard_alphabet);
         alphabetKey.setBackgroundResource(mEmojiFunctionalKeyBackgroundId);
-        alphabetKey.setTag(Constants.CODE_SWITCH_ALPHA_SYMBOL);
+        alphabetKey.setTag(Constants.CODE_ALPHA_FROM_EMOJI);
         alphabetKey.setOnTouchListener(this);
-
-        // alphabetKey2 depends only on OnTouchListener as it does everything in key-press in
-        // ACTION_DOWN.
+        alphabetKey.setOnClickListener(this);
         final ImageView alphabetKey2 = (ImageView)findViewById(R.id.emoji_keyboard_alphabet2);
         alphabetKey2.setBackgroundResource(mEmojiFunctionalKeyBackgroundId);
-        alphabetKey2.setTag(Constants.CODE_SWITCH_ALPHA_SYMBOL);
+        alphabetKey2.setTag(Constants.CODE_ALPHA_FROM_EMOJI);
         alphabetKey2.setOnTouchListener(this);
-
-        // spaceKey depends on {@link View.OnClickListener} as well as {@link View.OnTouchListener}.
-        // {@link View.OnTouchListener} is used as the trigger of key-press while
-        // {@link View.OnClickListener} is used as the trigger of key-release which may not occur
-        // if the event is canceled by moving off the finger from the view.
+        alphabetKey2.setOnClickListener(this);
         final ImageView spaceKey = (ImageView)findViewById(R.id.emoji_keyboard_space);
         spaceKey.setBackgroundResource(mKeyBackgroundId);
         spaceKey.setTag(Constants.CODE_SPACE);
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java
index dc815e5..78809d5 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java
@@ -54,6 +54,7 @@
         "key_shift_enter",
         "key_language_switch",
         "key_emoji",
+        "key_alpha_from_emoji",
         "key_unspecified",
         "key_left_parenthesis",
         "key_right_parenthesis",
@@ -91,6 +92,7 @@
         Constants.CODE_SHIFT_ENTER,
         Constants.CODE_LANGUAGE_SWITCH,
         Constants.CODE_EMOJI,
+        Constants.CODE_ALPHA_FROM_EMOJI,
         Constants.CODE_UNSPECIFIED,
         CODE_LEFT_PARENTHESIS,
         CODE_RIGHT_PARENTHESIS,
@@ -119,6 +121,7 @@
         DEFAULT[13],
         DEFAULT[14],
         DEFAULT[15],
+        DEFAULT[16],
         CODE_RIGHT_PARENTHESIS,
         CODE_LEFT_PARENTHESIS,
         CODE_GREATER_THAN_SIGN,
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardState.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardState.java
index 0c80ce2..ec0b5c9 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardState.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardState.java
@@ -645,6 +645,8 @@
             updateAlphabetShiftState(autoCaps, RecapitalizeStatus.NOT_A_RECAPITALIZE_MODE);
         } else if (code == Constants.CODE_EMOJI) {
             setEmojiKeyboard();
+        } else if (code == Constants.CODE_ALPHA_FROM_EMOJI) {
+            setAlphabetKeyboard();
         }
     }
 
diff --git a/java/src/com/android/inputmethod/latin/Constants.java b/java/src/com/android/inputmethod/latin/Constants.java
index 0477133..0b396b1 100644
--- a/java/src/com/android/inputmethod/latin/Constants.java
+++ b/java/src/com/android/inputmethod/latin/Constants.java
@@ -217,8 +217,9 @@
     public static final int CODE_EMOJI = -11;
     public static final int CODE_SHIFT_ENTER = -12;
     public static final int CODE_SYMBOL_SHIFT = -13;
+    public static final int CODE_ALPHA_FROM_EMOJI = -14;
     // Code value representing the code is not specified.
-    public static final int CODE_UNSPECIFIED = -14;
+    public static final int CODE_UNSPECIFIED = -15;
 
     public static boolean isLetterCode(final int code) {
         return code >= CODE_SPACE;
@@ -241,6 +242,7 @@
         case CODE_UNSPECIFIED: return "unspec";
         case CODE_TAB: return "tab";
         case CODE_ENTER: return "enter";
+        case CODE_ALPHA_FROM_EMOJI: return "alpha";
         default:
             if (code < CODE_SPACE) return String.format("'\\u%02x'", code);
             if (code < 0x100) return String.format("'%c'", code);
diff --git a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
index bbeb74b..ce3ef53 100644
--- a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
+++ b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
@@ -349,6 +349,10 @@
             didAutoCorrect = handleNonSpecialCharacter(settingsValues, Constants.CODE_ENTER,
                     x, y, spaceState, keyboardSwitcher, handler);
             break;
+        case Constants.CODE_ALPHA_FROM_EMOJI:
+            // Note: Switching back from Emoji keyboard to the main keyboard is being handled in
+            // {@link KeyboardState#onCodeInput(int,int)}.
+            break;
         default:
             didAutoCorrect = handleNonSpecialCharacter(settingsValues,
                     code, x, y, spaceState, keyboardSwitcher, handler);