OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.content.browser.input; | 5 package org.chromium.content.browser.input; |
6 | 6 |
7 import android.os.SystemClock; | 7 import android.os.SystemClock; |
8 import android.text.Editable; | 8 import android.text.Editable; |
9 import android.text.InputType; | 9 import android.text.InputType; |
10 import android.text.Selection; | 10 import android.text.Selection; |
11 import android.text.TextUtils; | 11 import android.text.TextUtils; |
12 import android.util.Log; | 12 import android.util.Log; |
13 import android.view.KeyCharacterMap; | 13 import android.view.KeyCharacterMap; |
14 import android.view.KeyEvent; | 14 import android.view.KeyEvent; |
15 import android.view.View; | 15 import android.view.View; |
16 import android.view.inputmethod.BaseInputConnection; | 16 import android.view.inputmethod.BaseInputConnection; |
17 import android.view.inputmethod.EditorInfo; | 17 import android.view.inputmethod.EditorInfo; |
18 import android.view.inputmethod.ExtractedText; | 18 import android.view.inputmethod.ExtractedText; |
19 import android.view.inputmethod.ExtractedTextRequest; | 19 import android.view.inputmethod.ExtractedTextRequest; |
20 | 20 |
21 import org.chromium.base.VisibleForTesting; | 21 import org.chromium.base.VisibleForTesting; |
| 22 import org.chromium.blink_public.web.WebInputEventType; |
| 23 import org.chromium.blink_public.web.WebTextInputFlags; |
22 import org.chromium.ui.base.ime.TextInputType; | 24 import org.chromium.ui.base.ime.TextInputType; |
23 | 25 |
24 /** | 26 /** |
25 * InputConnection is created by ContentView.onCreateInputConnection. | 27 * InputConnection is created by ContentView.onCreateInputConnection. |
26 * It then adapts android's IME to chrome's RenderWidgetHostView using the | 28 * It then adapts android's IME to chrome's RenderWidgetHostView using the |
27 * native ImeAdapterAndroid via the class ImeAdapter. | 29 * native ImeAdapterAndroid via the class ImeAdapter. |
28 */ | 30 */ |
29 public class AdapterInputConnection extends BaseInputConnection { | 31 public class AdapterInputConnection extends BaseInputConnection { |
30 private static final String TAG = "AdapterInputConnection"; | 32 private static final String TAG = "AdapterInputConnection"; |
31 private static final boolean DEBUG = false; | 33 private static final boolean DEBUG = false; |
(...skipping 30 matching lines...) Expand all Loading... |
62 // when taking ownership of an existing Editable. | 64 // when taking ownership of an existing Editable. |
63 removeComposingSpans(mEditable); | 65 removeComposingSpans(mEditable); |
64 mSingleLine = true; | 66 mSingleLine = true; |
65 outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_FULLSCREEN | 67 outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_FULLSCREEN |
66 | EditorInfo.IME_FLAG_NO_EXTRACT_UI; | 68 | EditorInfo.IME_FLAG_NO_EXTRACT_UI; |
67 outAttrs.inputType = EditorInfo.TYPE_CLASS_TEXT | 69 outAttrs.inputType = EditorInfo.TYPE_CLASS_TEXT |
68 | EditorInfo.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT; | 70 | EditorInfo.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT; |
69 | 71 |
70 int inputType = imeAdapter.getTextInputType(); | 72 int inputType = imeAdapter.getTextInputType(); |
71 int inputFlags = imeAdapter.getTextInputFlags(); | 73 int inputFlags = imeAdapter.getTextInputFlags(); |
72 if ((inputFlags & ImeAdapter.sTextInputFlagAutocompleteOff) != 0) { | 74 if ((inputFlags & WebTextInputFlags.AutocompleteOff) != 0) { |
73 outAttrs.inputType |= EditorInfo.TYPE_TEXT_FLAG_NO_SUGGESTIONS; | 75 outAttrs.inputType |= EditorInfo.TYPE_TEXT_FLAG_NO_SUGGESTIONS; |
74 } | 76 } |
75 | 77 |
76 if (inputType == TextInputType.TEXT) { | 78 if (inputType == TextInputType.TEXT) { |
77 // Normal text field | 79 // Normal text field |
78 outAttrs.imeOptions |= EditorInfo.IME_ACTION_GO; | 80 outAttrs.imeOptions |= EditorInfo.IME_ACTION_GO; |
79 if ((inputFlags & ImeAdapter.sTextInputFlagAutocorrectOff) == 0) { | 81 if ((inputFlags & WebTextInputFlags.AutocorrectOff) == 0) { |
80 outAttrs.inputType |= EditorInfo.TYPE_TEXT_FLAG_AUTO_CORRECT; | 82 outAttrs.inputType |= EditorInfo.TYPE_TEXT_FLAG_AUTO_CORRECT; |
81 } | 83 } |
82 } else if (inputType == TextInputType.TEXT_AREA | 84 } else if (inputType == TextInputType.TEXT_AREA |
83 || inputType == TextInputType.CONTENT_EDITABLE) { | 85 || inputType == TextInputType.CONTENT_EDITABLE) { |
84 // TextArea or contenteditable. | 86 // TextArea or contenteditable. |
85 outAttrs.inputType |= EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE | 87 outAttrs.inputType |= EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE |
86 | EditorInfo.TYPE_TEXT_FLAG_CAP_SENTENCES; | 88 | EditorInfo.TYPE_TEXT_FLAG_CAP_SENTENCES; |
87 if ((inputFlags & ImeAdapter.sTextInputFlagAutocorrectOff) == 0) { | 89 if ((inputFlags & WebTextInputFlags.AutocorrectOff) == 0) { |
88 outAttrs.inputType |= EditorInfo.TYPE_TEXT_FLAG_AUTO_CORRECT; | 90 outAttrs.inputType |= EditorInfo.TYPE_TEXT_FLAG_AUTO_CORRECT; |
89 } | 91 } |
90 outAttrs.imeOptions |= EditorInfo.IME_ACTION_NONE; | 92 outAttrs.imeOptions |= EditorInfo.IME_ACTION_NONE; |
91 mSingleLine = false; | 93 mSingleLine = false; |
92 } else if (inputType == TextInputType.PASSWORD) { | 94 } else if (inputType == TextInputType.PASSWORD) { |
93 // Password | 95 // Password |
94 outAttrs.inputType = InputType.TYPE_CLASS_TEXT | 96 outAttrs.inputType = InputType.TYPE_CLASS_TEXT |
95 | InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD; | 97 | InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD; |
96 outAttrs.imeOptions |= EditorInfo.IME_ACTION_GO; | 98 outAttrs.imeOptions |= EditorInfo.IME_ACTION_GO; |
97 } else if (inputType == TextInputType.SEARCH) { | 99 } else if (inputType == TextInputType.SEARCH) { |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
262 * @see BaseInputConnection#performEditorAction(int) | 264 * @see BaseInputConnection#performEditorAction(int) |
263 */ | 265 */ |
264 @Override | 266 @Override |
265 public boolean performEditorAction(int actionCode) { | 267 public boolean performEditorAction(int actionCode) { |
266 if (DEBUG) Log.w(TAG, "performEditorAction [" + actionCode + "]"); | 268 if (DEBUG) Log.w(TAG, "performEditorAction [" + actionCode + "]"); |
267 if (actionCode == EditorInfo.IME_ACTION_NEXT) { | 269 if (actionCode == EditorInfo.IME_ACTION_NEXT) { |
268 restartInput(); | 270 restartInput(); |
269 // Send TAB key event | 271 // Send TAB key event |
270 long timeStampMs = SystemClock.uptimeMillis(); | 272 long timeStampMs = SystemClock.uptimeMillis(); |
271 mImeAdapter.sendSyntheticKeyEvent( | 273 mImeAdapter.sendSyntheticKeyEvent( |
272 ImeAdapter.sEventTypeRawKeyDown, timeStampMs, KeyEvent.KEYCO
DE_TAB, 0, 0); | 274 WebInputEventType.RawKeyDown, timeStampMs, KeyEvent.KEYCODE_
TAB, 0, 0); |
273 } else { | 275 } else { |
274 mImeAdapter.sendKeyEventWithKeyCode(KeyEvent.KEYCODE_ENTER, | 276 mImeAdapter.sendKeyEventWithKeyCode(KeyEvent.KEYCODE_ENTER, |
275 KeyEvent.FLAG_SOFT_KEYBOARD | KeyEvent.FLAG_KEEP_TOUCH_MODE | 277 KeyEvent.FLAG_SOFT_KEYBOARD | KeyEvent.FLAG_KEEP_TOUCH_MODE |
276 | KeyEvent.FLAG_EDITOR_ACTION); | 278 | KeyEvent.FLAG_EDITOR_ACTION); |
277 } | 279 } |
278 return true; | 280 return true; |
279 } | 281 } |
280 | 282 |
281 /** | 283 /** |
282 * @see BaseInputConnection#performContextMenuAction(int) | 284 * @see BaseInputConnection#performContextMenuAction(int) |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
359 int keyCode = KeyEvent.KEYCODE_UNKNOWN; | 361 int keyCode = KeyEvent.KEYCODE_UNKNOWN; |
360 if (originalBeforeLength == 1 && originalAfterLength == 0) { | 362 if (originalBeforeLength == 1 && originalAfterLength == 0) { |
361 keyCode = KeyEvent.KEYCODE_DEL; | 363 keyCode = KeyEvent.KEYCODE_DEL; |
362 } else if (originalBeforeLength == 0 && originalAfterLength == 1) { | 364 } else if (originalBeforeLength == 0 && originalAfterLength == 1) { |
363 keyCode = KeyEvent.KEYCODE_FORWARD_DEL; | 365 keyCode = KeyEvent.KEYCODE_FORWARD_DEL; |
364 } | 366 } |
365 | 367 |
366 boolean result = true; | 368 boolean result = true; |
367 if (keyCode == KeyEvent.KEYCODE_UNKNOWN) { | 369 if (keyCode == KeyEvent.KEYCODE_UNKNOWN) { |
368 result = mImeAdapter.sendSyntheticKeyEvent( | 370 result = mImeAdapter.sendSyntheticKeyEvent( |
369 ImeAdapter.sEventTypeRawKeyDown, SystemClock.uptimeMillis(),
keyCode, 0, 0); | 371 WebInputEventType.RawKeyDown, SystemClock.uptimeMillis(), ke
yCode, 0, 0); |
370 result &= mImeAdapter.deleteSurroundingText(beforeLength, afterLengt
h); | 372 result &= mImeAdapter.deleteSurroundingText(beforeLength, afterLengt
h); |
371 result &= mImeAdapter.sendSyntheticKeyEvent( | 373 result &= mImeAdapter.sendSyntheticKeyEvent( |
372 ImeAdapter.sEventTypeKeyUp, SystemClock.uptimeMillis(), keyC
ode, 0, 0); | 374 WebInputEventType.KeyUp, SystemClock.uptimeMillis(), keyCode
, 0, 0); |
373 } else { | 375 } else { |
374 mImeAdapter.sendKeyEventWithKeyCode( | 376 mImeAdapter.sendKeyEventWithKeyCode( |
375 keyCode, KeyEvent.FLAG_SOFT_KEYBOARD | KeyEvent.FLAG_KEEP_TO
UCH_MODE); | 377 keyCode, KeyEvent.FLAG_SOFT_KEYBOARD | KeyEvent.FLAG_KEEP_TO
UCH_MODE); |
376 } | 378 } |
377 return result; | 379 return result; |
378 } | 380 } |
379 | 381 |
380 /** | 382 /** |
381 * @see BaseInputConnection#sendKeyEvent(android.view.KeyEvent) | 383 * @see BaseInputConnection#sendKeyEvent(android.view.KeyEvent) |
382 */ | 384 */ |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
605 @VisibleForTesting | 607 @VisibleForTesting |
606 ImeState getImeStateForTesting() { | 608 ImeState getImeStateForTesting() { |
607 String text = mEditable.toString(); | 609 String text = mEditable.toString(); |
608 int selectionStart = Selection.getSelectionStart(mEditable); | 610 int selectionStart = Selection.getSelectionStart(mEditable); |
609 int selectionEnd = Selection.getSelectionEnd(mEditable); | 611 int selectionEnd = Selection.getSelectionEnd(mEditable); |
610 int compositionStart = getComposingSpanStart(mEditable); | 612 int compositionStart = getComposingSpanStart(mEditable); |
611 int compositionEnd = getComposingSpanEnd(mEditable); | 613 int compositionEnd = getComposingSpanEnd(mEditable); |
612 return new ImeState(text, selectionStart, selectionEnd, compositionStart
, compositionEnd); | 614 return new ImeState(text, selectionStart, selectionEnd, compositionStart
, compositionEnd); |
613 } | 615 } |
614 } | 616 } |
OLD | NEW |