am 1b2e5c11: Merge "Revert "Revert "Add new MotionEvent actions for button press and release.""" into mnc-dev

* commit '1b2e5c11b6a89d56d5058907c3b0c88bf0170857':
  Revert "Revert "Add new MotionEvent actions for button press and release.""
This commit is contained in:
Michael Wright
2015-05-14 15:45:34 +00:00
committed by Android Git Automerger
8 changed files with 197 additions and 23 deletions

View File

@@ -35365,6 +35365,7 @@ package android.view {
method public static java.lang.String axisToString(int);
method public final int findPointerIndex(int);
method public final int getAction();
method public final int getActionButton();
method public final int getActionIndex();
method public final int getActionMasked();
method public final float getAxisValue(int);
@@ -35428,7 +35429,6 @@ package android.view {
method public final float getY(int);
method public final float getYPrecision();
method public final boolean isButtonPressed(int);
method public final boolean isStylusButtonPressed();
method public static android.view.MotionEvent obtain(long, long, int, int, android.view.MotionEvent.PointerProperties[], android.view.MotionEvent.PointerCoords[], int, int, float, float, int, int, int, int);
method public static deprecated android.view.MotionEvent obtain(long, long, int, int, int[], android.view.MotionEvent.PointerCoords[], int, float, float, int, int, int, int);
method public static android.view.MotionEvent obtain(long, long, int, float, float, float, float, int, float, float, int, int);
@@ -35444,6 +35444,8 @@ package android.view {
method public final void setSource(int);
method public final void transform(android.graphics.Matrix);
method public void writeToParcel(android.os.Parcel, int);
field public static final int ACTION_BUTTON_PRESS = 11; // 0xb
field public static final int ACTION_BUTTON_RELEASE = 12; // 0xc
field public static final int ACTION_CANCEL = 3; // 0x3
field public static final int ACTION_DOWN = 0; // 0x0
field public static final int ACTION_HOVER_ENTER = 9; // 0x9
@@ -35512,6 +35514,8 @@ package android.view {
field public static final int BUTTON_FORWARD = 16; // 0x10
field public static final int BUTTON_PRIMARY = 1; // 0x1
field public static final int BUTTON_SECONDARY = 2; // 0x2
field public static final int BUTTON_STYLUS_PRIMARY = 32; // 0x20
field public static final int BUTTON_STYLUS_SECONDARY = 64; // 0x40
field public static final int BUTTON_TERTIARY = 4; // 0x4
field public static final android.os.Parcelable.Creator<android.view.MotionEvent> CREATOR;
field public static final int EDGE_BOTTOM = 2; // 0x2

View File

@@ -37626,6 +37626,7 @@ package android.view {
method public static java.lang.String axisToString(int);
method public final int findPointerIndex(int);
method public final int getAction();
method public final int getActionButton();
method public final int getActionIndex();
method public final int getActionMasked();
method public final float getAxisValue(int);
@@ -37689,7 +37690,6 @@ package android.view {
method public final float getY(int);
method public final float getYPrecision();
method public final boolean isButtonPressed(int);
method public final boolean isStylusButtonPressed();
method public static android.view.MotionEvent obtain(long, long, int, int, android.view.MotionEvent.PointerProperties[], android.view.MotionEvent.PointerCoords[], int, int, float, float, int, int, int, int);
method public static deprecated android.view.MotionEvent obtain(long, long, int, int, int[], android.view.MotionEvent.PointerCoords[], int, float, float, int, int, int, int);
method public static android.view.MotionEvent obtain(long, long, int, float, float, float, float, int, float, float, int, int);
@@ -37705,6 +37705,8 @@ package android.view {
method public final void setSource(int);
method public final void transform(android.graphics.Matrix);
method public void writeToParcel(android.os.Parcel, int);
field public static final int ACTION_BUTTON_PRESS = 11; // 0xb
field public static final int ACTION_BUTTON_RELEASE = 12; // 0xc
field public static final int ACTION_CANCEL = 3; // 0x3
field public static final int ACTION_DOWN = 0; // 0x0
field public static final int ACTION_HOVER_ENTER = 9; // 0x9
@@ -37773,6 +37775,8 @@ package android.view {
field public static final int BUTTON_FORWARD = 16; // 0x10
field public static final int BUTTON_PRIMARY = 1; // 0x1
field public static final int BUTTON_SECONDARY = 2; // 0x2
field public static final int BUTTON_STYLUS_PRIMARY = 32; // 0x20
field public static final int BUTTON_STYLUS_SECONDARY = 64; // 0x40
field public static final int BUTTON_TERTIARY = 4; // 0x4
field public static final android.os.Parcelable.Creator<android.view.MotionEvent> CREATOR;
field public static final int EDGE_BOTTOM = 2; // 0x2

View File

@@ -97,6 +97,9 @@ public final class InputEventConsistencyVerifier {
// Set to true if we received hover enter.
private boolean mHoverEntered;
// The bitset of buttons which we've received ACTION_BUTTON_PRESS for.
private int mButtonsPressed;
// The current violation message.
private StringBuilder mViolationMessage;
@@ -148,6 +151,7 @@ public final class InputEventConsistencyVerifier {
mTouchEventStreamIsTainted = false;
mTouchEventStreamUnhandled = false;
mHoverEntered = false;
mButtonsPressed = 0;
while (mKeyStateList != null) {
final KeyState state = mKeyStateList;
@@ -466,6 +470,8 @@ public final class InputEventConsistencyVerifier {
final int action = event.getAction();
final int source = event.getSource();
final int buttonState = event.getButtonState();
final int actionButton = event.getActionButton();
if ((source & InputDevice.SOURCE_CLASS_POINTER) != 0) {
switch (action) {
case MotionEvent.ACTION_HOVER_ENTER:
@@ -486,6 +492,62 @@ public final class InputEventConsistencyVerifier {
ensureHistorySizeIsZeroForThisAction(event);
ensurePointerCountIsOneForThisAction(event);
break;
case MotionEvent.ACTION_BUTTON_PRESS:
ensureActionButtonIsNonZeroForThisAction(event);
if ((mButtonsPressed & actionButton) != 0) {
problem("Action button for ACTION_BUTTON_PRESS event is " +
actionButton + ", but it has already been pressed and " +
"has yet to be released.");
}
mButtonsPressed |= actionButton;
// The system will automatically mirror the stylus buttons onto the button
// state as the old set of generic buttons for apps targeting pre-M. If
// it looks this has happened, go ahead and set the generic buttons as
// pressed to prevent spurious errors.
if (actionButton == MotionEvent.BUTTON_STYLUS_PRIMARY &&
(buttonState & MotionEvent.BUTTON_SECONDARY) != 0) {
mButtonsPressed |= MotionEvent.BUTTON_SECONDARY;
} else if (actionButton == MotionEvent.BUTTON_STYLUS_SECONDARY &&
(buttonState & MotionEvent.BUTTON_TERTIARY) != 0) {
mButtonsPressed |= MotionEvent.BUTTON_TERTIARY;
}
if (mButtonsPressed != buttonState) {
problem(String.format("Reported button state differs from " +
"expected button state based on press and release events. " +
"Is 0x%08x but expected 0x%08x.",
buttonState, mButtonsPressed));
}
break;
case MotionEvent.ACTION_BUTTON_RELEASE:
ensureActionButtonIsNonZeroForThisAction(event);
if ((mButtonsPressed & actionButton) != actionButton) {
problem("Action button for ACTION_BUTTON_RELEASE event is " +
actionButton + ", but it was either never pressed or has " +
"already been released.");
}
mButtonsPressed &= ~actionButton;
// The system will automatically mirror the stylus buttons onto the button
// state as the old set of generic buttons for apps targeting pre-M. If
// it looks this has happened, go ahead and set the generic buttons as
// released to prevent spurious errors.
if (actionButton == MotionEvent.BUTTON_STYLUS_PRIMARY &&
(buttonState & MotionEvent.BUTTON_SECONDARY) == 0) {
mButtonsPressed &= ~MotionEvent.BUTTON_SECONDARY;
} else if (actionButton == MotionEvent.BUTTON_STYLUS_SECONDARY &&
(buttonState & MotionEvent.BUTTON_TERTIARY) == 0) {
mButtonsPressed &= ~MotionEvent.BUTTON_TERTIARY;
}
if (mButtonsPressed != buttonState) {
problem(String.format("Reported button state differs from " +
"expected button state based on press and release events. " +
"Is 0x%08x but expected 0x%08x.",
buttonState, mButtonsPressed));
}
break;
default:
problem("Invalid action for generic pointer event.");
break;
@@ -563,6 +625,15 @@ public final class InputEventConsistencyVerifier {
}
}
private void ensureActionButtonIsNonZeroForThisAction(MotionEvent event) {
final int actionButton = event.getActionButton();
if (actionButton == 0) {
problem("No action button set. Action button should always be non-zero for " +
MotionEvent.actionToString(event.getAction()));
}
}
private void ensureHistorySizeIsZeroForThisAction(MotionEvent event) {
final int historySize = event.getHistorySize();
if (historySize != 0) {

View File

@@ -302,6 +302,32 @@ public final class MotionEvent extends InputEvent implements Parcelable {
*/
public static final int ACTION_HOVER_EXIT = 10;
/**
* Constant for {@link #getActionMasked}: A button has been pressed.
*
* <p>
* Use {@link #getActionButton()} to get which button was pressed.
* </p><p>
* This action is not a touch event so it is delivered to
* {@link View#onGenericMotionEvent(MotionEvent)} rather than
* {@link View#onTouchEvent(MotionEvent)}.
* </p>
*/
public static final int ACTION_BUTTON_PRESS = 11;
/**
* Constant for {@link #getActionMasked}: A button has been released.
*
* <p>
* Use {@link #getActionButton()} to get which button was released.
* </p><p>
* This action is not a touch event so it is delivered to
* {@link View#onGenericMotionEvent(MotionEvent)} rather than
* {@link View#onTouchEvent(MotionEvent)}.
* </p>
*/
public static final int ACTION_BUTTON_RELEASE = 12;
/**
* Bits in the action code that represent a pointer index, used with
* {@link #ACTION_POINTER_DOWN} and {@link #ACTION_POINTER_UP}. Shifting
@@ -1174,14 +1200,14 @@ public final class MotionEvent extends InputEvent implements Parcelable {
public static final int BUTTON_PRIMARY = 1 << 0;
/**
* Button constant: Secondary button (right mouse button, stylus first button).
* Button constant: Secondary button (right mouse button).
*
* @see #getButtonState
*/
public static final int BUTTON_SECONDARY = 1 << 1;
/**
* Button constant: Tertiary button (middle mouse button, stylus second button).
* Button constant: Tertiary button (middle mouse button).
*
* @see #getButtonState
*/
@@ -1209,6 +1235,20 @@ public final class MotionEvent extends InputEvent implements Parcelable {
*/
public static final int BUTTON_FORWARD = 1 << 4;
/**
* Button constant: Primary stylus button pressed.
*
* @see #getButtonState
*/
public static final int BUTTON_STYLUS_PRIMARY = 1 << 5;
/**
* Button constant: Secondary stylus button pressed.
*
* @see #getButtonState
*/
public static final int BUTTON_STYLUS_SECONDARY = 1 << 6;
// NOTE: If you add a new axis here you must also add it to:
// native/include/android/input.h
@@ -1220,8 +1260,8 @@ public final class MotionEvent extends InputEvent implements Parcelable {
"BUTTON_TERTIARY",
"BUTTON_BACK",
"BUTTON_FORWARD",
"0x00000020",
"0x00000040",
"BUTTON_STYLUS_PRIMARY",
"BUTTON_STYLUS_SECONDARY",
"0x00000080",
"0x00000100",
"0x00000200",
@@ -1357,6 +1397,8 @@ public final class MotionEvent extends InputEvent implements Parcelable {
private static native void nativeSetEdgeFlags(long nativePtr, int action);
private static native int nativeGetMetaState(long nativePtr);
private static native int nativeGetButtonState(long nativePtr);
private static native void nativeSetButtonState(long nativePtr, int buttonState);
private static native int nativeGetActionButton(long nativePtr);
private static native void nativeOffsetLocation(long nativePtr, float deltaX, float deltaY);
private static native float nativeGetXOffset(long nativePtr);
private static native float nativeGetYOffset(long nativePtr);
@@ -2212,11 +2254,35 @@ public final class MotionEvent extends InputEvent implements Parcelable {
* @see #BUTTON_TERTIARY
* @see #BUTTON_FORWARD
* @see #BUTTON_BACK
* @see #BUTTON_STYLUS_PRIMARY
* @see #BUTTON_STYLUS_SECONDARY
*/
public final int getButtonState() {
return nativeGetButtonState(mNativePtr);
}
/**
* Sets the bitfield indicating which buttons are pressed.
*
* @see #getButtonState()
* @hide
*/
public final void setButtonState(int buttonState) {
nativeSetButtonState(mNativePtr, buttonState);
}
/**
* Gets which button has been modified during a press or release action.
*
* For actions other than {@link #ACTION_BUTTON_PRESS} and {@link #ACTION_BUTTON_RELEASE}
* the returned value is undefined.
*
* @see #getButtonState()
*/
public final int getActionButton() {
return nativeGetActionButton(mNativePtr);
}
/**
* Returns the original raw X coordinate of this event. For touch
* events on the screen, this is the original location of the event
@@ -3013,6 +3079,7 @@ public final class MotionEvent extends InputEvent implements Parcelable {
public String toString() {
StringBuilder msg = new StringBuilder();
msg.append("MotionEvent { action=").append(actionToString(getAction()));
msg.append(", actionButton=").append(buttonStateToString(getActionButton()));
final int pointerCount = getPointerCount();
for (int i = 0; i < pointerCount; i++) {
@@ -3066,6 +3133,10 @@ public final class MotionEvent extends InputEvent implements Parcelable {
return "ACTION_HOVER_ENTER";
case ACTION_HOVER_EXIT:
return "ACTION_HOVER_EXIT";
case ACTION_BUTTON_PRESS:
return "ACTION_BUTTON_PRESS";
case ACTION_BUTTON_RELEASE:
return "ACTION_BUTTON_RELEASE";
}
int index = (action & ACTION_POINTER_INDEX_MASK) >> ACTION_POINTER_INDEX_SHIFT;
switch (action & ACTION_MASK) {
@@ -3172,6 +3243,8 @@ public final class MotionEvent extends InputEvent implements Parcelable {
* @see #BUTTON_TERTIARY
* @see #BUTTON_FORWARD
* @see #BUTTON_BACK
* @see #BUTTON_STYLUS_PRIMARY
* @see #BUTTON_STYLUS_SECONDARY
*/
public final boolean isButtonPressed(int button) {
if (button == 0) {
@@ -3180,18 +3253,6 @@ public final class MotionEvent extends InputEvent implements Parcelable {
return (getButtonState() & button) == button;
}
/**
* Checks if a stylus is being used and if the first stylus button is
* pressed.
*
* @return True if the tool is a stylus and if the first stylus button is
* pressed.
* @see #BUTTON_SECONDARY
*/
public final boolean isStylusButtonPressed() {
return (isButtonPressed(BUTTON_SECONDARY) && getToolType(0) == TOOL_TYPE_STYLUS);
}
public static final Parcelable.Creator<MotionEvent> CREATOR
= new Parcelable.Creator<MotionEvent>() {
public MotionEvent createFromParcel(Parcel in) {

View File

@@ -5221,8 +5221,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @return True if the event was consumed.
*/
private boolean performStylusActionOnButtonPress(MotionEvent event) {
if (isStylusButtonPressable() && !mInStylusButtonPress
&& !mHasPerformedLongPress && event.isStylusButtonPressed()) {
if (isStylusButtonPressable() && !mInStylusButtonPress && !mHasPerformedLongPress
&& event.isButtonPressed(MotionEvent.BUTTON_STYLUS_SECONDARY)) {
if (performStylusButtonPress()) {
mInStylusButtonPress = true;
setPressed(true, event.getX(), event.getY());

View File

@@ -40,6 +40,7 @@ import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayManager.DisplayListener;
import android.media.AudioManager;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
import android.os.Debug;
import android.os.Handler;
@@ -5352,7 +5353,7 @@ public final class ViewRootImpl implements ViewParent,
//Log.d(TAG, ">>>>>> CALLING relayout");
if (params != null && mOrigWindowType != params.type) {
// For compatibility with old apps, don't crash here.
if (mTargetSdkVersion < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
if (mTargetSdkVersion < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
Slog.w(TAG, "Window type can not be changed after "
+ "the window is added; ignoring change of " + mView);
params.type = mOrigWindowType;
@@ -5777,6 +5778,7 @@ public final class ViewRootImpl implements ViewParent,
void enqueueInputEvent(InputEvent event,
InputEventReceiver receiver, int flags, boolean processImmediately) {
adjustInputEventForCompatibility(event);
QueuedInputEvent q = obtainQueuedInputEvent(event, receiver, flags);
// Always enqueue the input event in order, regardless of its time stamp.
@@ -5882,6 +5884,19 @@ public final class ViewRootImpl implements ViewParent,
recycleQueuedInputEvent(q);
}
private void adjustInputEventForCompatibility(InputEvent e) {
if (mTargetSdkVersion < Build.VERSION_CODES.MNC && e instanceof MotionEvent) {
MotionEvent motion = (MotionEvent) e;
final int mask =
MotionEvent.BUTTON_STYLUS_PRIMARY | MotionEvent.BUTTON_STYLUS_SECONDARY;
final int buttonState = motion.getButtonState();
final int compatButtonState = (buttonState & mask) >> 4;
if (compatButtonState != 0) {
motion.setButtonState(buttonState | compatButtonState);
}
}
}
static boolean isTerminalInputEvent(InputEvent event) {
if (event instanceof KeyEvent) {
final KeyEvent keyEvent = (KeyEvent)event;

View File

@@ -135,7 +135,8 @@ status_t NativeInputEventSender::sendMotionEvent(uint32_t seq, const MotionEvent
for (size_t i = 0; i <= event->getHistorySize(); i++) {
publishedSeq = mNextPublishedSeq++;
status_t status = mInputPublisher.publishMotionEvent(publishedSeq,
event->getDeviceId(), event->getSource(), event->getAction(), event->getFlags(),
event->getDeviceId(), event->getSource(),
event->getAction(), event->getActionButton(), event->getFlags(),
event->getEdgeFlags(), event->getMetaState(), event->getButtonState(),
event->getXOffset(), event->getYOffset(),
event->getXPrecision(), event->getYPrecision(),

View File

@@ -370,7 +370,7 @@ static jlong android_view_MotionEvent_nativeInitialize(JNIEnv* env, jclass clazz
env->DeleteLocalRef(pointerCoordsObj);
}
event->initialize(deviceId, source, action, flags, edgeFlags, metaState, buttonState,
event->initialize(deviceId, source, action, flags, edgeFlags, metaState, buttonState, 0,
xOffset, yOffset, xPrecision, yPrecision,
downTimeNanos, eventTimeNanos, pointerCount, pointerProperties, rawPointerCoords);
@@ -456,6 +456,12 @@ static void android_view_MotionEvent_nativeSetAction(JNIEnv* env, jclass clazz,
event->setAction(action);
}
static int android_view_MotionEvent_nativeGetActionButton(JNIEnv* env, jclass clazz,
jlong nativePtr) {
MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
return event->getActionButton();
}
static jboolean android_view_MotionEvent_nativeIsTouchEvent(JNIEnv* env, jclass clazz,
jlong nativePtr) {
MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
@@ -498,6 +504,12 @@ static jint android_view_MotionEvent_nativeGetButtonState(JNIEnv* env, jclass cl
return event->getButtonState();
}
static void android_view_MotionEvent_nativeSetButtonState(JNIEnv* env, jclass clazz,
jlong nativePtr, jint buttonState) {
MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
event->setButtonState(buttonState);
}
static void android_view_MotionEvent_nativeOffsetLocation(JNIEnv* env, jclass clazz,
jlong nativePtr, jfloat deltaX, jfloat deltaY) {
MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr);
@@ -764,6 +776,9 @@ static JNINativeMethod gMotionEventMethods[] = {
{ "nativeSetAction",
"(JI)V",
(void*)android_view_MotionEvent_nativeSetAction },
{ "nativeGetActionButton",
"(J)I",
(void*)android_view_MotionEvent_nativeGetActionButton},
{ "nativeIsTouchEvent",
"(J)Z",
(void*)android_view_MotionEvent_nativeIsTouchEvent },
@@ -785,6 +800,9 @@ static JNINativeMethod gMotionEventMethods[] = {
{ "nativeGetButtonState",
"(J)I",
(void*)android_view_MotionEvent_nativeGetButtonState },
{ "nativeSetButtonState",
"(JI)V",
(void*)android_view_MotionEvent_nativeSetButtonState },
{ "nativeOffsetLocation",
"(JFF)V",
(void*)android_view_MotionEvent_nativeOffsetLocation },