am d408d293: am ab142f7f: Merge "Handle back key to cancel text action mode in full-screen IME." into mnc-dev
* commit 'd408d293a516a3022c0f80d54a93a2f83288af46': Handle back key to cancel text action mode in full-screen IME.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user