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 40bca909cad815b4f09aff5166e3709e717b23d1..3e2600a1837ff8925a73716943cb0bd0b88e1504 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; |
@@ -29,22 +30,13 @@ 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: |
- a) If a key event has been recorded in dispatchKeyEventPreIme() and we |
- receive a result text with single character, then we probably need to |
- send the result text as a Char event rather than a ConfirmComposition |
- event. So we need to dispatch the recorded key event followed by a |
- synthetic Char event. |
- b) If we receive a composition text or a result text with more than one |
- characters, then no matter if we recorded a key event or not in |
- 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 |
- 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. |
+ 1. When InputConnectionAdapter gets called with composition or result text: |
+ If we receive a composition text or a result text, then we just need to |
+ dispatch a synthetic key event with special keycode 229, and then dispatch |
+ the composition or result text. |
+ 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") |
class ImeAdapter { |
@@ -117,7 +109,6 @@ class ImeAdapter { |
private int mNativeImeAdapterAndroid; |
private int mTextInputType; |
- private int mPreImeEventCount; |
private Context mContext; |
private SelectionHandleController mSelectionHandleController; |
@@ -151,7 +142,6 @@ class ImeAdapter { |
ImeAdapter(Context context, SelectionHandleController selectionHandleController, |
InsertionHandleController insertionHandleController, ViewEmbedder embedder) { |
- mPreImeEventCount = 0; |
mContext = context; |
mSelectionHandleController = selectionHandleController; |
mInsertionHandleController = insertionHandleController; |
@@ -264,14 +254,7 @@ class ImeAdapter { |
return isTextInputType(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); |
} |
@@ -303,28 +286,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) { |
+ 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; |
@@ -559,8 +561,10 @@ class ImeAdapter { |
mImeAdapter.dismissInput(true); |
break; |
} |
- |
- return super.performEditorAction(actionCode); |
+ mImeAdapter.sendKeyEventWithKeyCode(KeyEvent.KEYCODE_ENTER, |
+ KeyEvent.FLAG_SOFT_KEYBOARD | KeyEvent.FLAG_KEEP_TOUCH_MODE |
+ | KeyEvent.FLAG_EDITOR_ACTION); |
+ return true; |
} |
@Override |
@@ -628,7 +632,8 @@ class ImeAdapter { |
} |
} |
} |
- return super.sendKeyEvent(event); |
+ mImeAdapter.translateAndSendNativeEvents(event); |
+ return true; |
} |
@Override |