diff options
author | Yohei Yukawa <yukawa@google.com> | 2015-06-25 19:39:31 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2015-06-25 19:39:36 +0000 |
commit | ab142f7f57c8fd805e6cf65fccf2c8d3eba285b5 (patch) | |
tree | 1026b8334ccfa06a1352b91806367c221f631a38 | |
parent | f9c6dbb6d1c2001c0ccd7479668eb59b1d4b7c5c (diff) | |
parent | 38940aab693be587d5901f4ef110cbf95da0e22f (diff) | |
download | frameworks_base-ab142f7f57c8fd805e6cf65fccf2c8d3eba285b5.zip frameworks_base-ab142f7f57c8fd805e6cf65fccf2c8d3eba285b5.tar.gz frameworks_base-ab142f7f57c8fd805e6cf65fccf2c8d3eba285b5.tar.bz2 |
Merge "Handle back key to cancel text action mode in full-screen IME." into mnc-dev
-rw-r--r-- | core/java/android/inputmethodservice/InputMethodService.java | 37 | ||||
-rw-r--r-- | core/java/android/widget/TextView.java | 54 |
2 files changed, 61 insertions, 30 deletions
diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java index ae74b9a..ff7a300 100644 --- a/core/java/android/inputmethodservice/InputMethodService.java +++ b/core/java/android/inputmethodservice/InputMethodService.java @@ -1819,7 +1819,18 @@ public class InputMethodService extends AbstractInputMethodService { } return false; } - + + /** + * @return {#link ExtractEditText} if it is considered to be visible and active. Otherwise + * {@code null} is returned. + */ + private ExtractEditText getExtractEditTextIfVisible() { + if (!isExtractViewShown() || !isInputViewShown()) { + return null; + } + return mExtractEditText; + } + /** * Override this to intercept key down events before they are processed by the * application. If you return true, the application will not @@ -1835,6 +1846,10 @@ public class InputMethodService extends AbstractInputMethodService { */ public boolean onKeyDown(int keyCode, KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { + final ExtractEditText eet = getExtractEditTextIfVisible(); + if (eet != null && eet.handleBackInTextActionModeIfNeeded(event)) { + return true; + } if (handleBack(false)) { event.startTracking(); return true; @@ -1882,11 +1897,15 @@ public class InputMethodService extends AbstractInputMethodService { * them to perform navigation in the underlying application. */ public boolean onKeyUp(int keyCode, KeyEvent event) { - if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.isTracking() - && !event.isCanceled()) { - return handleBack(true); + if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { + final ExtractEditText eet = getExtractEditTextIfVisible(); + if (eet != null && eet.handleBackInTextActionModeIfNeeded(event)) { + return true; + } + if (event.isTracking() && !event.isCanceled()) { + return handleBack(true); + } } - return doMovementKey(keyCode, event, MOVEMENT_UP); } @@ -1952,10 +1971,10 @@ public class InputMethodService extends AbstractInputMethodService { } onExtractedCursorMovement(dx, dy); } - + boolean doMovementKey(int keyCode, KeyEvent event, int count) { - final ExtractEditText eet = mExtractEditText; - if (isExtractViewShown() && isInputViewShown() && eet != null) { + final ExtractEditText eet = getExtractEditTextIfVisible(); + if (eet != null) { // If we are in fullscreen mode, the cursor will move around // the extract edit text, but should NOT cause focus to move // to other fields. @@ -2006,7 +2025,7 @@ public class InputMethodService extends AbstractInputMethodService { return true; } } - + return false; } diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 207605e..6631f26 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -5849,31 +5849,43 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener @Override public boolean onKeyPreIme(int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_BACK) { - boolean isInSelectionMode = mEditor != null && mEditor.mTextActionMode != null; - - if (isInSelectionMode) { - if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) { - KeyEvent.DispatcherState state = getKeyDispatcherState(); - if (state != null) { - state.startTracking(event, this); - } - return true; - } else if (event.getAction() == KeyEvent.ACTION_UP) { - KeyEvent.DispatcherState state = getKeyDispatcherState(); - if (state != null) { - state.handleUpEvent(event); - } - if (event.isTracking() && !event.isCanceled()) { - stopTextActionMode(); - return true; - } - } - } + // Note: If the IME is in fullscreen mode and IMS#mExtractEditText is in text action mode, + // InputMethodService#onKeyDown and InputMethodService#onKeyUp are responsible to call + // InputMethodService#mExtractEditText.maybeHandleBackInTextActionMode(event). + if (keyCode == KeyEvent.KEYCODE_BACK && handleBackInTextActionModeIfNeeded(event)) { + return true; } return super.onKeyPreIme(keyCode, event); } + /** + * @hide + */ + public boolean handleBackInTextActionModeIfNeeded(KeyEvent event) { + // Do nothing unless mEditor is in text action mode. + if (mEditor == null || mEditor.mTextActionMode == null) { + return false; + } + + if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) { + KeyEvent.DispatcherState state = getKeyDispatcherState(); + if (state != null) { + state.startTracking(event, this); + } + return true; + } else if (event.getAction() == KeyEvent.ACTION_UP) { + KeyEvent.DispatcherState state = getKeyDispatcherState(); + if (state != null) { + state.handleUpEvent(event); + } + if (event.isTracking() && !event.isCanceled()) { + stopTextActionMode(); + return true; + } + } + return false; + } + @Override public boolean onKeyDown(int keyCode, KeyEvent event) { int which = doKeyDown(keyCode, event, null); |