Add special case for speaking ACTION_ENTER keys.

Bug: 6576058
Change-Id: If9a4fc2ddd5bcbac5f610d705441aa379c499a6f
diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml
index e1f0371..d51d378 100644
--- a/java/res/values/strings.xml
+++ b/java/res/values/strings.xml
@@ -188,6 +188,8 @@
     <string name="spoken_description_smiley">Smiley face</string>
     <!-- Spoken description for the "Return" keyboard key. -->
     <string name="spoken_description_return">Return</string>
+    <!-- Spoken description for the "Search" keyboard key. -->
+    <string name="spoken_description_search">Search</string>
     <!-- Spoken description for the "U+2022" (BULLET) keyboard key. -->
     <string name="spoken_description_dot">Dot</string>
 
diff --git a/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java b/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java
index 7e1889a..23acb8b 100644
--- a/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java
+++ b/java/src/com/android/inputmethod/accessibility/KeyCodeDescriptionMapper.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.text.TextUtils;
 import android.util.Log;
+import android.view.inputmethod.EditorInfo;
 
 import com.android.inputmethod.keyboard.Key;
 import com.android.inputmethod.keyboard.Keyboard;
@@ -104,6 +105,10 @@
             return getDescriptionForShiftKey(context, keyboard);
         }
 
+        if (code == Keyboard.CODE_ACTION_ENTER) {
+            return getDescriptionForActionKey(context, keyboard, key);
+        }
+
         if (!TextUtils.isEmpty(key.mLabel)) {
             final String label = key.mLabel.toString().trim();
 
@@ -192,6 +197,52 @@
     }
 
     /**
+     * Returns a context-sensitive description of the "Enter" action key.
+     *
+     * @param context The package's context.
+     * @param keyboard The keyboard on which the key resides.
+     * @param key The key to describe.
+     * @return Returns a context-sensitive description of the "Enter" action
+     *         key.
+     */
+    private String getDescriptionForActionKey(Context context, Keyboard keyboard, Key key) {
+        final KeyboardId keyboardId = keyboard.mId;
+        final int actionId = keyboardId.imeActionId();
+        final int resId;
+
+        // Always use the label, if available.
+        if (!TextUtils.isEmpty(key.mLabel)) {
+            return key.mLabel.toString().trim();
+        }
+
+        // Otherwise, use the action ID.
+        switch (actionId) {
+        case EditorInfo.IME_ACTION_SEARCH:
+            resId = R.string.spoken_description_search;
+            break;
+        case EditorInfo.IME_ACTION_GO:
+            resId = R.string.label_go_key;
+            break;
+        case EditorInfo.IME_ACTION_SEND:
+            resId = R.string.label_send_key;
+            break;
+        case EditorInfo.IME_ACTION_NEXT:
+            resId = R.string.label_next_key;
+            break;
+        case EditorInfo.IME_ACTION_DONE:
+            resId = R.string.label_done_key;
+            break;
+        case EditorInfo.IME_ACTION_PREVIOUS:
+            resId = R.string.label_previous_key;
+            break;
+        default:
+            resId = R.string.spoken_description_return;
+        }
+
+        return context.getString(resId);
+    }
+
+    /**
      * Returns a localized character sequence describing what will happen when
      * the specified key is pressed based on its key code.
      * <p>