am d020fd33: Merge changes Ib18c99b9,I9f42eeb9 into klp-modular-dev
* commit 'd020fd33d147c88a9cda4976d2fa559e55b4ab03': Generate and respect ACTION_CANCEL for joystick fallbacks. DO NOT MERGE Adds API for determining confirm and cancel keys.
This commit is contained in:
@@ -26839,8 +26839,10 @@ package android.view {
|
|||||||
method public final boolean hasModifiers(int);
|
method public final boolean hasModifiers(int);
|
||||||
method public final boolean hasNoModifiers();
|
method public final boolean hasNoModifiers();
|
||||||
method public final boolean isAltPressed();
|
method public final boolean isAltPressed();
|
||||||
|
method public final boolean isCancelKey();
|
||||||
method public final boolean isCanceled();
|
method public final boolean isCanceled();
|
||||||
method public final boolean isCapsLockOn();
|
method public final boolean isCapsLockOn();
|
||||||
|
method public final boolean isConfirmKey();
|
||||||
method public final boolean isCtrlPressed();
|
method public final boolean isCtrlPressed();
|
||||||
method public final boolean isFunctionPressed();
|
method public final boolean isFunctionPressed();
|
||||||
method public static final boolean isGamepadButton(int);
|
method public static final boolean isGamepadButton(int);
|
||||||
|
|||||||
@@ -1847,13 +1847,32 @@ public class KeyEvent extends InputEvent implements Parcelable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Whether key will, by default, trigger a click on the focused view.
|
/**
|
||||||
* @hide
|
* Returns true if the key event should be treated as a confirming action.
|
||||||
|
* @return True for a confirmation key, such as {@link #KEYCODE_DPAD_CENTER},
|
||||||
|
* {@link #KEYCODE_ENTER}, or {@link #KEYCODE_BUTTON_A}.
|
||||||
*/
|
*/
|
||||||
public static final boolean isConfirmKey(int keyCode) {
|
public final boolean isConfirmKey() {
|
||||||
switch (keyCode) {
|
switch (mKeyCode) {
|
||||||
case KeyEvent.KEYCODE_DPAD_CENTER:
|
case KeyEvent.KEYCODE_DPAD_CENTER:
|
||||||
case KeyEvent.KEYCODE_ENTER:
|
case KeyEvent.KEYCODE_ENTER:
|
||||||
|
case KeyEvent.KEYCODE_BUTTON_A:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the key event should be treated as a cancelling action.
|
||||||
|
* @return True for a cancellation key, such as {@link #KEYCODE_ESCAPE},
|
||||||
|
* {@link #KEYCODE_BACK}, or {@link #KEYCODE_BUTTON_B}.
|
||||||
|
*/
|
||||||
|
public final boolean isCancelKey() {
|
||||||
|
switch (mKeyCode) {
|
||||||
|
case KeyEvent.KEYCODE_BUTTON_B:
|
||||||
|
case KeyEvent.KEYCODE_ESCAPE:
|
||||||
|
case KeyEvent.KEYCODE_BACK:
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -3372,11 +3372,11 @@ public final class MotionEvent extends InputEvent implements Parcelable {
|
|||||||
throw new IllegalArgumentException("Axis out of range.");
|
throw new IllegalArgumentException("Axis out of range.");
|
||||||
}
|
}
|
||||||
final long bits = mPackedAxisBits;
|
final long bits = mPackedAxisBits;
|
||||||
final long axisBit = 1L << axis;
|
final long axisBit = 0x8000000000000000L >>> axis;
|
||||||
if ((bits & axisBit) == 0) {
|
if ((bits & axisBit) == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
final int index = Long.bitCount(bits & (axisBit - 1L));
|
final int index = Long.bitCount(bits & ~(0xFFFFFFFFFFFFFFFFL >>> axis));
|
||||||
return mPackedAxisValues[index];
|
return mPackedAxisValues[index];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3425,8 +3425,8 @@ public final class MotionEvent extends InputEvent implements Parcelable {
|
|||||||
throw new IllegalArgumentException("Axis out of range.");
|
throw new IllegalArgumentException("Axis out of range.");
|
||||||
}
|
}
|
||||||
final long bits = mPackedAxisBits;
|
final long bits = mPackedAxisBits;
|
||||||
final long axisBit = 1L << axis;
|
final long axisBit = 0x8000000000000000L >>> axis;
|
||||||
final int index = Long.bitCount(bits & (axisBit - 1L));
|
final int index = Long.bitCount(bits & ~(0xFFFFFFFFFFFFFFFFL >>> axis));
|
||||||
float[] values = mPackedAxisValues;
|
float[] values = mPackedAxisValues;
|
||||||
if ((bits & axisBit) == 0) {
|
if ((bits & axisBit) == 0) {
|
||||||
if (values == null) {
|
if (values == null) {
|
||||||
|
|||||||
@@ -8186,7 +8186,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
|
|||||||
public boolean onKeyDown(int keyCode, KeyEvent event) {
|
public boolean onKeyDown(int keyCode, KeyEvent event) {
|
||||||
boolean result = false;
|
boolean result = false;
|
||||||
|
|
||||||
if (KeyEvent.isConfirmKey(keyCode)) {
|
if (event.isConfirmKey()) {
|
||||||
if ((mViewFlags & ENABLED_MASK) == DISABLED) {
|
if ((mViewFlags & ENABLED_MASK) == DISABLED) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -8228,7 +8228,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
|
|||||||
* @param event The KeyEvent object that defines the button action.
|
* @param event The KeyEvent object that defines the button action.
|
||||||
*/
|
*/
|
||||||
public boolean onKeyUp(int keyCode, KeyEvent event) {
|
public boolean onKeyUp(int keyCode, KeyEvent event) {
|
||||||
if (KeyEvent.isConfirmKey(keyCode)) {
|
if (event.isConfirmKey()) {
|
||||||
if ((mViewFlags & ENABLED_MASK) == DISABLED) {
|
if ((mViewFlags & ENABLED_MASK) == DISABLED) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4319,6 +4319,7 @@ public final class ViewRootImpl implements ViewParent,
|
|||||||
* Creates dpad events from unhandled joystick movements.
|
* Creates dpad events from unhandled joystick movements.
|
||||||
*/
|
*/
|
||||||
final class SyntheticJoystickHandler extends Handler {
|
final class SyntheticJoystickHandler extends Handler {
|
||||||
|
private final static String TAG = "SyntheticJoystickHandler";
|
||||||
private final static int MSG_ENQUEUE_X_AXIS_KEY_REPEAT = 1;
|
private final static int MSG_ENQUEUE_X_AXIS_KEY_REPEAT = 1;
|
||||||
private final static int MSG_ENQUEUE_Y_AXIS_KEY_REPEAT = 2;
|
private final static int MSG_ENQUEUE_Y_AXIS_KEY_REPEAT = 2;
|
||||||
|
|
||||||
@@ -4351,10 +4352,21 @@ public final class ViewRootImpl implements ViewParent,
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void process(MotionEvent event) {
|
public void process(MotionEvent event) {
|
||||||
|
switch(event.getActionMasked()) {
|
||||||
|
case MotionEvent.ACTION_CANCEL:
|
||||||
|
cancel(event);
|
||||||
|
break;
|
||||||
|
case MotionEvent.ACTION_MOVE:
|
||||||
update(event, true);
|
update(event, true);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Log.w(TAG, "Unexpected action: " + event.getActionMasked());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void cancel(MotionEvent event) {
|
private void cancel(MotionEvent event) {
|
||||||
|
removeMessages(MSG_ENQUEUE_X_AXIS_KEY_REPEAT);
|
||||||
|
removeMessages(MSG_ENQUEUE_Y_AXIS_KEY_REPEAT);
|
||||||
update(event, false);
|
update(event, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3039,7 +3039,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onKeyUp(int keyCode, KeyEvent event) {
|
public boolean onKeyUp(int keyCode, KeyEvent event) {
|
||||||
if (KeyEvent.isConfirmKey(keyCode)) {
|
if (event.isConfirmKey()) {
|
||||||
if (!isEnabled()) {
|
if (!isEnabled()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1228,7 +1228,7 @@ public class Gallery extends AbsSpinner implements GestureDetector.OnGestureList
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onKeyUp(int keyCode, KeyEvent event) {
|
public boolean onKeyUp(int keyCode, KeyEvent event) {
|
||||||
if (KeyEvent.isConfirmKey(keyCode)) {
|
if (event.isConfirmKey()) {
|
||||||
if (mReceivedInvokeKeyDown) {
|
if (mReceivedInvokeKeyDown) {
|
||||||
if (mItemCount > 0) {
|
if (mItemCount > 0) {
|
||||||
dispatchPress(mSelectedChild);
|
dispatchPress(mSelectedChild);
|
||||||
|
|||||||
@@ -843,7 +843,7 @@ public class ListPopupWindow {
|
|||||||
// to select one of its items
|
// to select one of its items
|
||||||
if (keyCode != KeyEvent.KEYCODE_SPACE
|
if (keyCode != KeyEvent.KEYCODE_SPACE
|
||||||
&& (mDropDownList.getSelectedItemPosition() >= 0
|
&& (mDropDownList.getSelectedItemPosition() >= 0
|
||||||
|| !KeyEvent.isConfirmKey(keyCode))) {
|
|| !event.isConfirmKey())) {
|
||||||
int curIndex = mDropDownList.getSelectedItemPosition();
|
int curIndex = mDropDownList.getSelectedItemPosition();
|
||||||
boolean consumed;
|
boolean consumed;
|
||||||
|
|
||||||
@@ -931,7 +931,7 @@ public class ListPopupWindow {
|
|||||||
public boolean onKeyUp(int keyCode, KeyEvent event) {
|
public boolean onKeyUp(int keyCode, KeyEvent event) {
|
||||||
if (isShowing() && mDropDownList.getSelectedItemPosition() >= 0) {
|
if (isShowing() && mDropDownList.getSelectedItemPosition() >= 0) {
|
||||||
boolean consumed = mDropDownList.onKeyUp(keyCode, event);
|
boolean consumed = mDropDownList.onKeyUp(keyCode, event);
|
||||||
if (consumed && KeyEvent.isConfirmKey(keyCode)) {
|
if (consumed && event.isConfirmKey()) {
|
||||||
// if the list accepts the key events and the key event was a click, the text view
|
// if the list accepts the key events and the key event was a click, the text view
|
||||||
// gets the selected item from the drop down as its content
|
// gets the selected item from the drop down as its content
|
||||||
dismiss();
|
dismiss();
|
||||||
|
|||||||
@@ -4105,18 +4105,39 @@ bool InputDispatcher::InputState::trackMotion(const MotionEntry* entry,
|
|||||||
case AMOTION_EVENT_ACTION_POINTER_UP:
|
case AMOTION_EVENT_ACTION_POINTER_UP:
|
||||||
case AMOTION_EVENT_ACTION_POINTER_DOWN:
|
case AMOTION_EVENT_ACTION_POINTER_DOWN:
|
||||||
case AMOTION_EVENT_ACTION_MOVE: {
|
case AMOTION_EVENT_ACTION_MOVE: {
|
||||||
|
if (entry->source & AINPUT_SOURCE_CLASS_NAVIGATION) {
|
||||||
|
// Trackballs can send MOVE events with a corresponding DOWN or UP. There's no need to
|
||||||
|
// generate cancellation events for these since they're based in relative rather than
|
||||||
|
// absolute units.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
ssize_t index = findMotionMemento(entry, false /*hovering*/);
|
ssize_t index = findMotionMemento(entry, false /*hovering*/);
|
||||||
|
|
||||||
|
if (entry->source & AINPUT_SOURCE_CLASS_JOYSTICK) {
|
||||||
|
// Joysticks can send MOVE events without a corresponding DOWN or UP. Since all
|
||||||
|
// joystick axes are normalized to [-1, 1] we can trust that 0 means it's neutral. Any
|
||||||
|
// other value and we need to track the motion so we can send cancellation events for
|
||||||
|
// anything generating fallback events (e.g. DPad keys for joystick movements).
|
||||||
|
if (index >= 0) {
|
||||||
|
if (entry->pointerCoords[0].isEmpty()) {
|
||||||
|
mMotionMementos.removeAt(index);
|
||||||
|
} else {
|
||||||
|
MotionMemento& memento = mMotionMementos.editItemAt(index);
|
||||||
|
memento.setPointers(entry);
|
||||||
|
}
|
||||||
|
} else if (!entry->pointerCoords[0].isEmpty()) {
|
||||||
|
addMotionMemento(entry, flags, false /*hovering*/);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Joysticks and trackballs can send MOVE events without corresponding DOWN or UP.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (index >= 0) {
|
if (index >= 0) {
|
||||||
MotionMemento& memento = mMotionMementos.editItemAt(index);
|
MotionMemento& memento = mMotionMementos.editItemAt(index);
|
||||||
memento.setPointers(entry);
|
memento.setPointers(entry);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (actionMasked == AMOTION_EVENT_ACTION_MOVE
|
|
||||||
&& (entry->source & (AINPUT_SOURCE_CLASS_JOYSTICK
|
|
||||||
| AINPUT_SOURCE_CLASS_NAVIGATION))) {
|
|
||||||
// Joysticks and trackballs can send MOVE events without corresponding DOWN or UP.
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
#if DEBUG_OUTBOUND_EVENT_DETAILS
|
#if DEBUG_OUTBOUND_EVENT_DETAILS
|
||||||
ALOGD("Dropping inconsistent motion pointer up/down or move event: "
|
ALOGD("Dropping inconsistent motion pointer up/down or move event: "
|
||||||
"deviceId=%d, source=%08x, actionMasked=%d",
|
"deviceId=%d, source=%08x, actionMasked=%d",
|
||||||
|
|||||||
Reference in New Issue
Block a user