am ba1abbba: Merge "Revert "Revert "Take the input device into account for meta state""" into klp-dev

* commit 'ba1abbba1f140f4be5956ade8ffd4ef4b3f9ffe0':
  Revert "Revert "Take the input device into account for meta state""
This commit is contained in:
Raph Levien
2013-09-18 13:42:41 -07:00
committed by Android Git Automerger
8 changed files with 62 additions and 6 deletions

View File

@@ -25019,7 +25019,9 @@ 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) != 0) {
MetaKeyKeyListener.META_SELECTING, event) != 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 (event.isAltPressed() || getMetaState(content, META_ALT_ON) == 1) {
if (getMetaState(content, META_ALT_ON, event) == 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 = (event.getMetaState() | MetaKeyKeyListener.getMetaState(buffer))
int metaState = MetaKeyKeyListener.getMetaState(buffer, event)
& ~(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 = event.getMetaState() | getMetaState(content);
int meta = getMetaState(content, event);
int number = event.getNumber();
/*

View File

@@ -163,6 +163,29 @@ 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
/**
@@ -192,6 +215,37 @@ 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(), event.getMetaState() | getMetaState(content));
return event.getMatch(getAcceptedChars(), getMetaState(content, event));
}
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(event.getMetaState() | getMetaState(content));
int i = event.getUnicodeChar(getMetaState(content, event));
if (!mFullKeyboard) {
int count = event.getRepeatCount();