am ab142f7f: Merge "Handle back key to cancel text action mode in full-screen IME." into mnc-dev

* commit 'ab142f7f57c8fd805e6cf65fccf2c8d3eba285b5':
  Handle back key to cancel text action mode in full-screen IME.
This commit is contained in:
Yohei Yukawa
2015-06-25 19:48:16 +00:00
committed by Android Git Automerger
2 changed files with 61 additions and 30 deletions

View File

@@ -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;
}

View File

@@ -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);