summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYohei Yukawa <yukawa@google.com>2015-06-25 19:39:31 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2015-06-25 19:39:36 +0000
commitab142f7f57c8fd805e6cf65fccf2c8d3eba285b5 (patch)
tree1026b8334ccfa06a1352b91806367c221f631a38
parentf9c6dbb6d1c2001c0ccd7479668eb59b1d4b7c5c (diff)
parent38940aab693be587d5901f4ef110cbf95da0e22f (diff)
downloadframeworks_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.java37
-rw-r--r--core/java/android/widget/TextView.java54
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);