Revert "Take the input device into account for meta state"

This reverts commit 8a1597b396. That
commit broke some of the handling of meta state, which in turn caused
CTS test failures, notably bug 10210151 (CTS:
android.text.method.cts.BaseKeyListenerTest#testBackspace_withSendKeys
is failing on KLP).

So this revert fixes those test failures, but leaves bug 8303489
(Pressing shift on the hardware keyboard messes with unrelated
keypresses, including virtual ones) still present. We'll plan to
address that in a future release.

Change-Id: Iea42c643b6d08f33cbd2ed1747e8de3b5f8116a6
This commit is contained in:
Raph Levien
2013-09-16 15:19:25 -07:00
parent 6b2b845948
commit 3954fd9a05
8 changed files with 6 additions and 62 deletions

View File

@@ -24925,9 +24925,7 @@ package android.text.method {
method public static void clearMetaKeyState(android.text.Editable, int);
method public long clearMetaKeyState(long, int);
method public static final int getMetaState(java.lang.CharSequence);
method public static final int getMetaState(java.lang.CharSequence, android.view.KeyEvent);
method public static final int getMetaState(java.lang.CharSequence, int);
method public static final int getMetaState(java.lang.CharSequence, int, android.view.KeyEvent);
method public static final int getMetaState(long);
method public static final int getMetaState(long, int);
method public static long handleKeyDown(long, int, android.view.KeyEvent);

View File

@@ -56,7 +56,7 @@ public class ArrowKeyMovementMethod extends BaseMovementMethod implements Moveme
if (event.getAction() == KeyEvent.ACTION_DOWN
&& event.getRepeatCount() == 0
&& MetaKeyKeyListener.getMetaState(buffer,
MetaKeyKeyListener.META_SELECTING, event) != 0) {
MetaKeyKeyListener.META_SELECTING) != 0) {
return widget.showContextMenu();
}
}

View File

@@ -75,7 +75,7 @@ public abstract class BaseKeyListener extends MetaKeyKeyListener
}
// Alt+Backspace or Alt+ForwardDelete deletes the current line, if possible.
if (getMetaState(content, META_ALT_ON, event) == 1) {
if (event.isAltPressed() || getMetaState(content, META_ALT_ON) == 1) {
if (deleteLine(view, content)) {
return true;
}

View File

@@ -135,7 +135,7 @@ public class BaseMovementMethod implements MovementMethod {
*/
protected int getMovementMetaState(Spannable buffer, KeyEvent event) {
// We ignore locked modifiers and SHIFT.
int metaState = MetaKeyKeyListener.getMetaState(buffer, event)
int metaState = (event.getMetaState() | MetaKeyKeyListener.getMetaState(buffer))
& ~(MetaKeyKeyListener.META_ALT_LOCKED | MetaKeyKeyListener.META_SYM_LOCKED);
return KeyEvent.normalizeMetaState(metaState) & ~KeyEvent.META_SHIFT_MASK;
}

View File

@@ -53,7 +53,7 @@ public class DialerKeyListener extends NumberKeyListener
* from the KeyEvent.
*/
protected int lookup(KeyEvent event, Spannable content) {
int meta = getMetaState(content, event);
int meta = event.getMetaState() | getMetaState(content);
int number = event.getNumber();
/*

View File

@@ -163,29 +163,6 @@ public abstract class MetaKeyKeyListener {
getActive(text, SELECTING, META_SELECTING, META_SELECTING);
}
/**
* Gets the state of the meta keys for a specific key event.
*
* For input devices that use toggled key modifiers, the `toggled' state
* is stored into the text buffer. This method retrieves the meta state
* for this event, accounting for the stored state. If the event has been
* created by a device that does not support toggled key modifiers, like
* a virtual device for example, the stored state is ignored.
*
* @param text the buffer in which the meta key would have been pressed.
* @param event the event for which to evaluate the meta state.
* @return an integer in which each bit set to one represents a pressed
* or locked meta key.
*/
public static final int getMetaState(final CharSequence text, final KeyEvent event) {
int metaState = event.getMetaState();
if (event.getKeyCharacterMap().getModifierBehavior()
== KeyCharacterMap.MODIFIER_BEHAVIOR_CHORDED_OR_TOGGLED) {
metaState |= getMetaState(text);
}
return metaState;
}
// As META_SELECTING is @hide we should not mention it in public comments, hence the
// omission in @param meta
/**
@@ -215,37 +192,6 @@ public abstract class MetaKeyKeyListener {
}
}
/**
* Gets the state of a particular meta key to use with a particular key event.
*
* If the key event has been created by a device that does not support toggled
* key modifiers, like a virtual keyboard for example, only the meta state in
* the key event is considered.
*
* @param meta META_SHIFT_ON, META_ALT_ON, META_SYM_ON
* @param text the buffer in which the meta key would have been pressed.
* @param event the event for which to evaluate the meta state.
* @return 0 if inactive, 1 if active, 2 if locked.
*/
public static final int getMetaState(final CharSequence text, final int meta,
final KeyEvent event) {
int metaState = event.getMetaState();
if (event.getKeyCharacterMap().getModifierBehavior()
== KeyCharacterMap.MODIFIER_BEHAVIOR_CHORDED_OR_TOGGLED) {
metaState |= getMetaState(text);
}
if (META_SELECTING == meta) {
// #getMetaState(long, int) does not support META_SELECTING, but we want the same
// behavior as #getMetaState(CharSequence, int) so we need to do it here
if ((metaState & META_SELECTING) != 0) {
// META_SELECTING is only ever set to PRESSED and can't be LOCKED, so return 1
return 1;
}
return 0;
}
return getMetaState(metaState, meta);
}
private static int getActive(CharSequence text, Object meta,
int on, int lock) {
if (!(text instanceof Spanned)) {

View File

@@ -41,7 +41,7 @@ public abstract class NumberKeyListener extends BaseKeyListener
protected abstract char[] getAcceptedChars();
protected int lookup(KeyEvent event, Spannable content) {
return event.getMatch(getAcceptedChars(), getMetaState(content, event));
return event.getMatch(getAcceptedChars(), event.getMetaState() | getMetaState(content));
}
public CharSequence filter(CharSequence source, int start, int end,

View File

@@ -108,7 +108,7 @@ public class QwertyKeyListener extends BaseKeyListener {
// QWERTY keyboard normal case
int i = event.getUnicodeChar(getMetaState(content, event));
int i = event.getUnicodeChar(event.getMetaState() | getMetaState(content));
if (!mFullKeyboard) {
int count = event.getRepeatCount();