Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2748)

Unified Diff: content/public/android/java/src/org/chromium/content/browser/ImeAdapter.java

Issue 11914003: Start sending synthetic keyevents for enter and tab in Android IME (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Added call to performEditorAction Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/public/android/java/src/org/chromium/content/browser/ImeAdapter.java
diff --git a/content/public/android/java/src/org/chromium/content/browser/ImeAdapter.java b/content/public/android/java/src/org/chromium/content/browser/ImeAdapter.java
index 88f9578f731751adf0b262c3155a8aa4fa608839..149f44ecf2abffb5c34ef0a77403263e0f01c497 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ImeAdapter.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ImeAdapter.java
@@ -10,6 +10,7 @@ import android.os.ResultReceiver;
import android.text.Editable;
import android.text.InputType;
import android.text.Selection;
+import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.BaseInputConnection;
@@ -28,9 +29,7 @@ import org.chromium.base.JNINamespace;
// 2. Native ImeAdapter notifies java side to clear composition text.
//
// The basic flow is:
-// 1. Intercept dispatchKeyEventPreIme() to record the current key event, but do
-// nothing else.
-// 2. When InputConnectionAdapter gets called with composition or result text:
+// 1. When InputConnectionAdapter gets called with composition or result text:
// a) If a key event has been recorded in dispatchKeyEventPreIme() and we
aurimas (slooooooooow) 2013/01/16 23:54:46 Should this dispatchKeyEventPreIme() comment chang
Yusuf 2013/01/17 00:44:19 Done.
// receive a result text with single character, then we probably need to
// send the result text as a Char event rather than a ConfirmComposition
@@ -41,7 +40,7 @@ import org.chromium.base.JNINamespace;
// dispatchKeyEventPreIme(), we just need to dispatch a synthetic key
// event with special keycode 229, and then dispatch the composition or
// result text.
-// 3. Intercept dispatchKeyEvent() method for key events not handled by IME, we
+// 2. Intercept dispatchKeyEvent() method for key events not handled by IME, we
// need to dispatch them to webkit and check webkit's reply. Then inject a
// new key event for further processing if webkit didn't handle it.
@JNINamespace("content")
@@ -117,7 +116,6 @@ class ImeAdapter {
private int mNativeImeAdapterAndroid;
private int mTextInputType;
- private int mPreImeEventCount;
private Context mContext;
private SelectionHandleController mSelectionHandleController;
@@ -152,7 +150,6 @@ class ImeAdapter {
ImeAdapter(Context context, SelectionHandleController selectionHandleController,
InsertionHandleController insertionHandleController, ViewEmbedder embedder) {
- mPreImeEventCount = 0;
mContext = context;
mSelectionHandleController = selectionHandleController;
mInsertionHandleController = insertionHandleController;
@@ -302,14 +299,7 @@ class ImeAdapter {
return InputDialogContainer.isDialogInputType(mTextInputType);
}
- void dispatchKeyEventPreIme(KeyEvent event) {
- // We only register that a key was pressed, but we don't actually intercept
- // it.
- ++mPreImeEventCount;
- }
-
boolean dispatchKeyEvent(KeyEvent event) {
- mPreImeEventCount = 0;
return translateAndSendNativeEvents(event);
}
@@ -341,28 +331,47 @@ class ImeAdapter {
mInsertionHandleController.hideAndDisallowAutomaticShowing();
}
mViewEmbedder.onImeEvent(isFinish);
- boolean hasSingleChar = mPreImeEventCount == 1 && text.length() == 1;
- int keyCode = hasSingleChar ? text.codePointAt(0) : COMPOSITION_KEY_CODE;
- int keyChar = hasSingleChar ? text.codePointAt(0) : 0;
+ int keyCode = shouldSendKeyEventWithKeyCode(text);
long timeStampMs = System.currentTimeMillis();
- nativeSendSyntheticKeyEvent(mNativeImeAdapterAndroid, sEventTypeRawKeyDown,
- timeStampMs, keyCode, keyChar);
- if (hasSingleChar) {
- nativeSendSyntheticKeyEvent(mNativeImeAdapterAndroid, sEventTypeChar,
- timeStampMs, text.codePointAt(0), text.codePointAt(0));
+
+ if (keyCode != COMPOSITION_KEY_CODE) {
+ sendKeyEventWithKeyCode(keyCode,
+ KeyEvent.FLAG_SOFT_KEYBOARD | KeyEvent.FLAG_KEEP_TOUCH_MODE);
} else {
+ nativeSendSyntheticKeyEvent(mNativeImeAdapterAndroid, sEventTypeRawKeyDown,
+ timeStampMs, keyCode, 0);
if (isCommit) {
nativeCommitText(mNativeImeAdapterAndroid, text);
} else {
nativeSetComposingText(mNativeImeAdapterAndroid, text, newCursorPosition);
}
+ nativeSendSyntheticKeyEvent(mNativeImeAdapterAndroid, sEventTypeKeyUp,
+ timeStampMs, keyCode, 0);
}
- nativeSendSyntheticKeyEvent(mNativeImeAdapterAndroid, sEventTypeKeyUp,
- timeStampMs, keyCode, keyChar);
- mPreImeEventCount = 0;
+
return true;
}
+ private int shouldSendKeyEventWithKeyCode(String text) {
+ if (text.length() != 1) return COMPOSITION_KEY_CODE;
+
+ if (text.equals("\n")) return KeyEvent.KEYCODE_ENTER;
+ else if (text.equals("\t")) return KeyEvent.KEYCODE_TAB;
+ else return COMPOSITION_KEY_CODE;
+ }
+
+ private void sendKeyEventWithKeyCode(int KeyCode, int flags) {
Ted C 2013/01/16 23:48:57 s/KeyCode/keyCode
Yusuf 2013/01/17 00:44:19 Done.
Yusuf 2013/01/17 00:44:19 Done.
+ long eventTime = System.currentTimeMillis();
+ translateAndSendNativeEvents(new KeyEvent(eventTime, eventTime,
+ KeyEvent.ACTION_DOWN, KeyCode, 0, 0,
+ KeyCharacterMap.VIRTUAL_KEYBOARD, 0,
+ flags));
+ translateAndSendNativeEvents(new KeyEvent(System.currentTimeMillis(), eventTime,
+ KeyEvent.ACTION_UP, KeyCode, 0, 0,
+ KeyCharacterMap.VIRTUAL_KEYBOARD, 0,
+ flags));
+ }
+
private boolean translateAndSendNativeEvents(KeyEvent event) {
if (mNativeImeAdapterAndroid == 0) {
return false;
@@ -597,8 +606,10 @@ class ImeAdapter {
mImeAdapter.dismissInput(true);
break;
}
-
- return super.performEditorAction(actionCode);
+ mImeAdapter.sendKeyEventWithKeyCode(KeyEvent.KEYCODE_ENTER,
Ted C 2013/01/16 23:48:57 Hmm...it seems odd that we are treating a search a
aurimas (slooooooooow) 2013/01/16 23:54:46 There is KeyEvent.KEYCODE_SEARCH. Should we be usi
Yusuf 2013/01/17 00:44:19 I dont think KEY_CODE_SEARCH will have any corresp
+ KeyEvent.FLAG_SOFT_KEYBOARD | KeyEvent.FLAG_KEEP_TOUCH_MODE
+ | KeyEvent.FLAG_EDITOR_ACTION);
+ return true;
}
@Override
« no previous file with comments | « content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698