Chromium Code Reviews| 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 |