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 |