Merge "Perform action when action button pressed during text input."
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index e7ab826..8618510 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -479,6 +479,38 @@
return super.deleteSurroundingText(leftLength, rightLength);
}
+ @Override
+ public boolean performEditorAction(int editorAction) {
+
+ boolean handled = true;
+ switch (editorAction) {
+ case EditorInfo.IME_ACTION_NEXT:
+ WebView.this.requestFocus(FOCUS_FORWARD);
+ break;
+ case EditorInfo.IME_ACTION_PREVIOUS:
+ WebView.this.requestFocus(FOCUS_BACKWARD);
+ break;
+ case EditorInfo.IME_ACTION_DONE:
+ WebView.this.hideSoftKeyboard();
+ break;
+ case EditorInfo.IME_ACTION_GO:
+ case EditorInfo.IME_ACTION_SEARCH:
+ WebView.this.hideSoftKeyboard();
+ String text = getEditable().toString();
+ passToJavaScript(text, new KeyEvent(KeyEvent.ACTION_DOWN,
+ KeyEvent.KEYCODE_ENTER));
+ passToJavaScript(text, new KeyEvent(KeyEvent.ACTION_UP,
+ KeyEvent.KEYCODE_ENTER));
+ break;
+
+ default:
+ handled = super.performEditorAction(editorAction);
+ break;
+ }
+
+ return handled;
+ }
+
public void initEditorInfo(WebViewCore.TextFieldInitData initData) {
int type = initData.mType;
int inputType = InputType.TYPE_CLASS_TEXT
@@ -578,7 +610,7 @@
if (isCharacterAdd) {
sendCharacter(text.charAt(textLength - 1));
} else if (isCharacterDelete) {
- sendDeleteKey();
+ sendKey(KeyEvent.KEYCODE_DEL);
} else if ((textLength != originalLength) ||
!TextUtils.regionMatches(text, 0, original, 0,
textLength)) {
@@ -613,16 +645,18 @@
}
/**
- * Send the delete character as a key down and up event.
+ * Send a key event for a specific key code, not a standard
+ * unicode character.
+ * @param keyCode The key code to send.
*/
- private void sendDeleteKey() {
+ private void sendKey(int keyCode) {
long eventTime = SystemClock.uptimeMillis();
sendKeyEvent(new KeyEvent(eventTime, eventTime,
- KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL, 0, 0,
+ KeyEvent.ACTION_DOWN, keyCode, 0, 0,
KeyCharacterMap.VIRTUAL_KEYBOARD, 0,
KeyEvent.FLAG_SOFT_KEYBOARD));
sendKeyEvent(new KeyEvent(SystemClock.uptimeMillis(), eventTime,
- KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL, 0, 0,
+ KeyEvent.ACTION_UP, keyCode, 0, 0,
KeyCharacterMap.VIRTUAL_KEYBOARD, 0,
KeyEvent.FLAG_SOFT_KEYBOARD));
}