Merge changes from topic 'button_actions' into mnc-dev

* changes:
  Fix input tests to work with new MotionEvent member
  Revert "Revert "Add new MotionEvent actions for button press and release.""
This commit is contained in:
Michael Wright 2015-05-14 15:31:10 +00:00 committed by Android (Google) Code Review
commit 7c000280a5
15 changed files with 244 additions and 119 deletions

View File

@ -305,6 +305,12 @@ enum {
/* The pointer is not down but has exited the boundaries of a window or view. /* The pointer is not down but has exited the boundaries of a window or view.
*/ */
AMOTION_EVENT_ACTION_HOVER_EXIT = 10, AMOTION_EVENT_ACTION_HOVER_EXIT = 10,
/* One or more buttons have been pressed. */
AMOTION_EVENT_ACTION_BUTTON_PRESS = 11,
/* One or more buttons have been released. */
AMOTION_EVENT_ACTION_BUTTON_RELEASE = 12,
}; };
/* /*
@ -405,6 +411,8 @@ enum {
AMOTION_EVENT_BUTTON_TERTIARY = 1 << 2, AMOTION_EVENT_BUTTON_TERTIARY = 1 << 2,
AMOTION_EVENT_BUTTON_BACK = 1 << 3, AMOTION_EVENT_BUTTON_BACK = 1 << 3,
AMOTION_EVENT_BUTTON_FORWARD = 1 << 4, AMOTION_EVENT_BUTTON_FORWARD = 1 << 4,
AMOTION_EVENT_BUTTON_STYLUS_PRIMARY = 1 << 5,
AMOTION_EVENT_BUTTON_STYLUS_SECONDARY = 1 << 6,
}; };
/* /*

View File

@ -379,6 +379,10 @@ public:
inline int32_t getButtonState() const { return mButtonState; } inline int32_t getButtonState() const { return mButtonState; }
inline int32_t setButtonState(int32_t buttonState) { mButtonState = buttonState; }
inline int32_t getActionButton() const { return mActionButton; }
inline float getXOffset() const { return mXOffset; } inline float getXOffset() const { return mXOffset; }
inline float getYOffset() const { return mYOffset; } inline float getYOffset() const { return mYOffset; }
@ -532,6 +536,7 @@ public:
int32_t deviceId, int32_t deviceId,
int32_t source, int32_t source,
int32_t action, int32_t action,
int32_t actionButton,
int32_t flags, int32_t flags,
int32_t edgeFlags, int32_t edgeFlags,
int32_t metaState, int32_t metaState,
@ -584,6 +589,7 @@ public:
protected: protected:
int32_t mAction; int32_t mAction;
int32_t mActionButton;
int32_t mFlags; int32_t mFlags;
int32_t mEdgeFlags; int32_t mEdgeFlags;
int32_t mMetaState; int32_t mMetaState;

View File

@ -84,6 +84,7 @@ struct InputMessage {
int32_t deviceId; int32_t deviceId;
int32_t source; int32_t source;
int32_t action; int32_t action;
int32_t actionButton;
int32_t flags; int32_t flags;
int32_t metaState; int32_t metaState;
int32_t buttonState; int32_t buttonState;
@ -95,7 +96,7 @@ struct InputMessage {
float yPrecision; float yPrecision;
uint32_t pointerCount; uint32_t pointerCount;
// Note that PointerCoords requires 8 byte alignment. // Note that PointerCoords requires 8 byte alignment.
struct Pointer{ struct Pointer {
PointerProperties properties; PointerProperties properties;
PointerCoords coords; PointerCoords coords;
} pointers[MAX_POINTERS]; } pointers[MAX_POINTERS];
@ -232,6 +233,7 @@ public:
int32_t deviceId, int32_t deviceId,
int32_t source, int32_t source,
int32_t action, int32_t action,
int32_t actionButton,
int32_t flags, int32_t flags,
int32_t edgeFlags, int32_t edgeFlags,
int32_t metaState, int32_t metaState,

View File

@ -216,6 +216,7 @@ void MotionEvent::initialize(
int32_t deviceId, int32_t deviceId,
int32_t source, int32_t source,
int32_t action, int32_t action,
int32_t actionButton,
int32_t flags, int32_t flags,
int32_t edgeFlags, int32_t edgeFlags,
int32_t metaState, int32_t metaState,
@ -231,6 +232,7 @@ void MotionEvent::initialize(
const PointerCoords* pointerCoords) { const PointerCoords* pointerCoords) {
InputEvent::initialize(deviceId, source); InputEvent::initialize(deviceId, source);
mAction = action; mAction = action;
mActionButton = actionButton;
mFlags = flags; mFlags = flags;
mEdgeFlags = edgeFlags; mEdgeFlags = edgeFlags;
mMetaState = metaState; mMetaState = metaState;
@ -250,6 +252,7 @@ void MotionEvent::initialize(
void MotionEvent::copyFrom(const MotionEvent* other, bool keepHistory) { void MotionEvent::copyFrom(const MotionEvent* other, bool keepHistory) {
InputEvent::initialize(other->mDeviceId, other->mSource); InputEvent::initialize(other->mDeviceId, other->mSource);
mAction = other->mAction; mAction = other->mAction;
mActionButton = other->mActionButton;
mFlags = other->mFlags; mFlags = other->mFlags;
mEdgeFlags = other->mEdgeFlags; mEdgeFlags = other->mEdgeFlags;
mMetaState = other->mMetaState; mMetaState = other->mMetaState;
@ -428,6 +431,7 @@ status_t MotionEvent::readFromParcel(Parcel* parcel) {
mDeviceId = parcel->readInt32(); mDeviceId = parcel->readInt32();
mSource = parcel->readInt32(); mSource = parcel->readInt32();
mAction = parcel->readInt32(); mAction = parcel->readInt32();
mActionButton = parcel->readInt32();
mFlags = parcel->readInt32(); mFlags = parcel->readInt32();
mEdgeFlags = parcel->readInt32(); mEdgeFlags = parcel->readInt32();
mMetaState = parcel->readInt32(); mMetaState = parcel->readInt32();
@ -475,6 +479,7 @@ status_t MotionEvent::writeToParcel(Parcel* parcel) const {
parcel->writeInt32(mDeviceId); parcel->writeInt32(mDeviceId);
parcel->writeInt32(mSource); parcel->writeInt32(mSource);
parcel->writeInt32(mAction); parcel->writeInt32(mAction);
parcel->writeInt32(mActionButton);
parcel->writeInt32(mFlags); parcel->writeInt32(mFlags);
parcel->writeInt32(mEdgeFlags); parcel->writeInt32(mEdgeFlags);
parcel->writeInt32(mMetaState); parcel->writeInt32(mMetaState);

View File

@ -283,6 +283,7 @@ status_t InputPublisher::publishMotionEvent(
int32_t deviceId, int32_t deviceId,
int32_t source, int32_t source,
int32_t action, int32_t action,
int32_t actionButton,
int32_t flags, int32_t flags,
int32_t edgeFlags, int32_t edgeFlags,
int32_t metaState, int32_t metaState,
@ -298,12 +299,12 @@ status_t InputPublisher::publishMotionEvent(
const PointerCoords* pointerCoords) { const PointerCoords* pointerCoords) {
#if DEBUG_TRANSPORT_ACTIONS #if DEBUG_TRANSPORT_ACTIONS
ALOGD("channel '%s' publisher ~ publishMotionEvent: seq=%u, deviceId=%d, source=0x%x, " ALOGD("channel '%s' publisher ~ publishMotionEvent: seq=%u, deviceId=%d, source=0x%x, "
"action=0x%x, flags=0x%x, edgeFlags=0x%x, metaState=0x%x, buttonState=0x%x, " "action=0x%x, actionButton=0x%08x, flags=0x%x, edgeFlags=0x%x, "
"xOffset=%f, yOffset=%f, " "metaState=0x%x, buttonState=0x%x, xOffset=%f, yOffset=%f, "
"xPrecision=%f, yPrecision=%f, downTime=%lld, eventTime=%lld, " "xPrecision=%f, yPrecision=%f, downTime=%lld, eventTime=%lld, "
"pointerCount=%" PRIu32, "pointerCount=%" PRIu32,
mChannel->getName().string(), seq, mChannel->getName().string(), seq,
deviceId, source, action, flags, edgeFlags, metaState, buttonState, deviceId, source, action, actionButton, flags, edgeFlags, metaState, buttonState,
xOffset, yOffset, xPrecision, yPrecision, downTime, eventTime, pointerCount); xOffset, yOffset, xPrecision, yPrecision, downTime, eventTime, pointerCount);
#endif #endif
@ -324,6 +325,7 @@ status_t InputPublisher::publishMotionEvent(
msg.body.motion.deviceId = deviceId; msg.body.motion.deviceId = deviceId;
msg.body.motion.source = source; msg.body.motion.source = source;
msg.body.motion.action = action; msg.body.motion.action = action;
msg.body.motion.actionButton = actionButton;
msg.body.motion.flags = flags; msg.body.motion.flags = flags;
msg.body.motion.edgeFlags = edgeFlags; msg.body.motion.edgeFlags = edgeFlags;
msg.body.motion.metaState = metaState; msg.body.motion.metaState = metaState;
@ -907,6 +909,7 @@ void InputConsumer::initializeMotionEvent(MotionEvent* event, const InputMessage
msg->body.motion.deviceId, msg->body.motion.deviceId,
msg->body.motion.source, msg->body.motion.source,
msg->body.motion.action, msg->body.motion.action,
msg->body.motion.actionButton,
msg->body.motion.flags, msg->body.motion.flags,
msg->body.motion.edgeFlags, msg->body.motion.edgeFlags,
msg->body.motion.metaState, msg->body.motion.metaState,

View File

@ -248,7 +248,7 @@ void MotionEventTest::initializeEventWithHistory(MotionEvent* event) {
pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, 26); pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, 26);
pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR, 27); pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR, 27);
pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, 28); pointerCoords[1].setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, 28);
event->initialize(2, AINPUT_SOURCE_TOUCHSCREEN, AMOTION_EVENT_ACTION_MOVE, event->initialize(2, AINPUT_SOURCE_TOUCHSCREEN, AMOTION_EVENT_ACTION_MOVE, 0,
AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED, AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED,
AMOTION_EVENT_EDGE_FLAG_TOP, AMETA_ALT_ON, AMOTION_EVENT_BUTTON_PRIMARY, AMOTION_EVENT_EDGE_FLAG_TOP, AMETA_ALT_ON, AMOTION_EVENT_BUTTON_PRIMARY,
X_OFFSET, Y_OFFSET, 2.0f, 2.1f, X_OFFSET, Y_OFFSET, 2.0f, 2.1f,
@ -557,7 +557,7 @@ TEST_F(MotionEventTest, Transform) {
pointerCoords[i].setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, angle); pointerCoords[i].setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, angle);
} }
MotionEvent event; MotionEvent event;
event.initialize(0, 0, AMOTION_EVENT_ACTION_MOVE, 0, 0, 0, 0, event.initialize(0, 0, AMOTION_EVENT_ACTION_MOVE, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, pointerCount, pointerProperties, pointerCoords); 0, 0, 0, 0, 0, 0, pointerCount, pointerProperties, pointerCoords);
float originalRawX = 0 + 3; float originalRawX = 0 + 3;
float originalRawY = -RADIUS + 2; float originalRawY = -RADIUS + 2;

View File

@ -133,6 +133,7 @@ void InputPublisherAndConsumerTest::PublishAndConsumeMotionEvent() {
const int32_t deviceId = 1; const int32_t deviceId = 1;
const int32_t source = AINPUT_SOURCE_TOUCHSCREEN; const int32_t source = AINPUT_SOURCE_TOUCHSCREEN;
const int32_t action = AMOTION_EVENT_ACTION_MOVE; const int32_t action = AMOTION_EVENT_ACTION_MOVE;
const int32_t actionButton = 0;
const int32_t flags = AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED; const int32_t flags = AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED;
const int32_t edgeFlags = AMOTION_EVENT_EDGE_FLAG_TOP; const int32_t edgeFlags = AMOTION_EVENT_EDGE_FLAG_TOP;
const int32_t metaState = AMETA_ALT_LEFT_ON | AMETA_ALT_ON; const int32_t metaState = AMETA_ALT_LEFT_ON | AMETA_ALT_ON;
@ -163,8 +164,8 @@ void InputPublisherAndConsumerTest::PublishAndConsumeMotionEvent() {
pointerCoords[i].setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, 3.5 * i); pointerCoords[i].setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, 3.5 * i);
} }
status = mPublisher->publishMotionEvent(seq, deviceId, source, action, flags, edgeFlags, status = mPublisher->publishMotionEvent(seq, deviceId, source, action, actionButton,
metaState, buttonState, xOffset, yOffset, xPrecision, yPrecision, flags, edgeFlags, metaState, buttonState, xOffset, yOffset, xPrecision, yPrecision,
downTime, eventTime, pointerCount, downTime, eventTime, pointerCount,
pointerProperties, pointerCoords); pointerProperties, pointerCoords);
ASSERT_EQ(OK, status) ASSERT_EQ(OK, status)
@ -255,7 +256,7 @@ TEST_F(InputPublisherAndConsumerTest, PublishMotionEvent_WhenPointerCountLessTha
PointerProperties pointerProperties[pointerCount]; PointerProperties pointerProperties[pointerCount];
PointerCoords pointerCoords[pointerCount]; PointerCoords pointerCoords[pointerCount];
status = mPublisher->publishMotionEvent(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, status = mPublisher->publishMotionEvent(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
pointerCount, pointerProperties, pointerCoords); pointerCount, pointerProperties, pointerCoords);
ASSERT_EQ(BAD_VALUE, status) ASSERT_EQ(BAD_VALUE, status)
<< "publisher publishMotionEvent should return BAD_VALUE"; << "publisher publishMotionEvent should return BAD_VALUE";
@ -271,7 +272,7 @@ TEST_F(InputPublisherAndConsumerTest, PublishMotionEvent_WhenPointerCountGreater
pointerCoords[i].clear(); pointerCoords[i].clear();
} }
status = mPublisher->publishMotionEvent(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, status = mPublisher->publishMotionEvent(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
pointerCount, pointerProperties, pointerCoords); pointerCount, pointerProperties, pointerCoords);
ASSERT_EQ(BAD_VALUE, status) ASSERT_EQ(BAD_VALUE, status)
<< "publisher publishMotionEvent should return BAD_VALUE"; << "publisher publishMotionEvent should return BAD_VALUE";

View File

@ -51,10 +51,11 @@ void TestInputMessageAlignment() {
CHECK_OFFSET(InputMessage::Body::Motion, deviceId, 16); CHECK_OFFSET(InputMessage::Body::Motion, deviceId, 16);
CHECK_OFFSET(InputMessage::Body::Motion, source, 20); CHECK_OFFSET(InputMessage::Body::Motion, source, 20);
CHECK_OFFSET(InputMessage::Body::Motion, action, 24); CHECK_OFFSET(InputMessage::Body::Motion, action, 24);
CHECK_OFFSET(InputMessage::Body::Motion, flags, 28); CHECK_OFFSET(InputMessage::Body::Motion, actionButton, 28);
CHECK_OFFSET(InputMessage::Body::Motion, metaState, 32); CHECK_OFFSET(InputMessage::Body::Motion, flags, 32);
CHECK_OFFSET(InputMessage::Body::Motion, buttonState, 36); CHECK_OFFSET(InputMessage::Body::Motion, metaState, 36);
CHECK_OFFSET(InputMessage::Body::Motion, edgeFlags, 40); CHECK_OFFSET(InputMessage::Body::Motion, buttonState, 40);
CHECK_OFFSET(InputMessage::Body::Motion, edgeFlags, 44);
CHECK_OFFSET(InputMessage::Body::Motion, downTime, 48); CHECK_OFFSET(InputMessage::Body::Motion, downTime, 48);
CHECK_OFFSET(InputMessage::Body::Motion, xOffset, 56); CHECK_OFFSET(InputMessage::Body::Motion, xOffset, 56);
CHECK_OFFSET(InputMessage::Body::Motion, yOffset, 60); CHECK_OFFSET(InputMessage::Body::Motion, yOffset, 60);

View File

@ -119,7 +119,7 @@ static bool validateKeyEvent(int32_t action) {
return true; return true;
} }
static bool isValidMotionAction(int32_t action, size_t pointerCount) { static bool isValidMotionAction(int32_t action, int32_t actionButton, int32_t pointerCount) {
switch (action & AMOTION_EVENT_ACTION_MASK) { switch (action & AMOTION_EVENT_ACTION_MASK) {
case AMOTION_EVENT_ACTION_DOWN: case AMOTION_EVENT_ACTION_DOWN:
case AMOTION_EVENT_ACTION_UP: case AMOTION_EVENT_ACTION_UP:
@ -136,14 +136,17 @@ static bool isValidMotionAction(int32_t action, size_t pointerCount) {
int32_t index = getMotionEventActionPointerIndex(action); int32_t index = getMotionEventActionPointerIndex(action);
return index >= 0 && size_t(index) < pointerCount; return index >= 0 && size_t(index) < pointerCount;
} }
case AMOTION_EVENT_ACTION_BUTTON_PRESS:
case AMOTION_EVENT_ACTION_BUTTON_RELEASE:
return actionButton != 0;
default: default:
return false; return false;
} }
} }
static bool validateMotionEvent(int32_t action, size_t pointerCount, static bool validateMotionEvent(int32_t action, int32_t actionButton, size_t pointerCount,
const PointerProperties* pointerProperties) { const PointerProperties* pointerProperties) {
if (! isValidMotionAction(action, pointerCount)) { if (! isValidMotionAction(action, actionButton, pointerCount)) {
ALOGE("Motion event has invalid action code 0x%x", action); ALOGE("Motion event has invalid action code 0x%x", action);
return false; return false;
} }
@ -874,12 +877,12 @@ bool InputDispatcher::dispatchMotionLocked(
void InputDispatcher::logOutboundMotionDetailsLocked(const char* prefix, const MotionEntry* entry) { void InputDispatcher::logOutboundMotionDetailsLocked(const char* prefix, const MotionEntry* entry) {
#if DEBUG_OUTBOUND_EVENT_DETAILS #if DEBUG_OUTBOUND_EVENT_DETAILS
ALOGD("%seventTime=%lld, deviceId=%d, source=0x%x, policyFlags=0x%x, " ALOGD("%seventTime=%lld, deviceId=%d, source=0x%x, policyFlags=0x%x, "
"action=0x%x, flags=0x%x, " "action=0x%x, actionButton=0x%x, flags=0x%x, "
"metaState=0x%x, buttonState=0x%x, " "metaState=0x%x, buttonState=0x%x,"
"edgeFlags=0x%x, xPrecision=%f, yPrecision=%f, downTime=%lld", "edgeFlags=0x%x, xPrecision=%f, yPrecision=%f, downTime=%lld",
prefix, prefix,
entry->eventTime, entry->deviceId, entry->source, entry->policyFlags, entry->eventTime, entry->deviceId, entry->source, entry->policyFlags,
entry->action, entry->flags, entry->action, entry->actionButton entry->flags,
entry->metaState, entry->buttonState, entry->metaState, entry->buttonState,
entry->edgeFlags, entry->xPrecision, entry->yPrecision, entry->edgeFlags, entry->xPrecision, entry->yPrecision,
entry->downTime); entry->downTime);
@ -1981,10 +1984,10 @@ void InputDispatcher::startDispatchCycleLocked(nsecs_t currentTime,
// Publish the motion event. // Publish the motion event.
status = connection->inputPublisher.publishMotionEvent(dispatchEntry->seq, status = connection->inputPublisher.publishMotionEvent(dispatchEntry->seq,
motionEntry->deviceId, motionEntry->source, motionEntry->deviceId, motionEntry->source,
dispatchEntry->resolvedAction, dispatchEntry->resolvedFlags, dispatchEntry->resolvedAction, motionEntry->actionButton,
motionEntry->edgeFlags, motionEntry->metaState, motionEntry->buttonState, dispatchEntry->resolvedFlags, motionEntry->edgeFlags,
xOffset, yOffset, motionEntry->metaState, motionEntry->buttonState,
motionEntry->xPrecision, motionEntry->yPrecision, xOffset, yOffset, motionEntry->xPrecision, motionEntry->yPrecision,
motionEntry->downTime, motionEntry->eventTime, motionEntry->downTime, motionEntry->eventTime,
motionEntry->pointerCount, motionEntry->pointerProperties, motionEntry->pointerCount, motionEntry->pointerProperties,
usingCoords); usingCoords);
@ -2298,6 +2301,7 @@ InputDispatcher::splitMotionEvent(const MotionEntry* originalMotionEntry, BitSet
originalMotionEntry->source, originalMotionEntry->source,
originalMotionEntry->policyFlags, originalMotionEntry->policyFlags,
action, action,
originalMotionEntry->actionButton,
originalMotionEntry->flags, originalMotionEntry->flags,
originalMotionEntry->metaState, originalMotionEntry->metaState,
originalMotionEntry->buttonState, originalMotionEntry->buttonState,
@ -2432,10 +2436,10 @@ bool InputDispatcher::shouldSendKeyToInputFilterLocked(const NotifyKeyArgs* args
void InputDispatcher::notifyMotion(const NotifyMotionArgs* args) { void InputDispatcher::notifyMotion(const NotifyMotionArgs* args) {
#if DEBUG_INBOUND_EVENT_DETAILS #if DEBUG_INBOUND_EVENT_DETAILS
ALOGD("notifyMotion - eventTime=%lld, deviceId=%d, source=0x%x, policyFlags=0x%x, " ALOGD("notifyMotion - eventTime=%lld, deviceId=%d, source=0x%x, policyFlags=0x%x, "
"action=0x%x, flags=0x%x, metaState=0x%x, buttonState=0x%x, edgeFlags=0x%x, " "action=0x%x, actionButton=0x%x, flags=0x%x, metaState=0x%x, buttonState=0x%x,"
"xPrecision=%f, yPrecision=%f, downTime=%lld", "edgeFlags=0x%x, xPrecision=%f, yPrecision=%f, downTime=%lld",
args->eventTime, args->deviceId, args->source, args->policyFlags, args->eventTime, args->deviceId, args->source, args->policyFlags,
args->action, args->flags, args->metaState, args->buttonState, args->action, args->actionButton, args->flags, args->metaState, args->buttonState,
args->edgeFlags, args->xPrecision, args->yPrecision, args->downTime); args->edgeFlags, args->xPrecision, args->yPrecision, args->downTime);
for (uint32_t i = 0; i < args->pointerCount; i++) { for (uint32_t i = 0; i < args->pointerCount; i++) {
ALOGD(" Pointer %d: id=%d, toolType=%d, " ALOGD(" Pointer %d: id=%d, toolType=%d, "
@ -2455,7 +2459,8 @@ void InputDispatcher::notifyMotion(const NotifyMotionArgs* args) {
args->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION)); args->pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION));
} }
#endif #endif
if (!validateMotionEvent(args->action, args->pointerCount, args->pointerProperties)) { if (!validateMotionEvent(args->action, args->actionButton,
args->pointerCount, args->pointerProperties)) {
return; return;
} }
@ -2471,9 +2476,9 @@ void InputDispatcher::notifyMotion(const NotifyMotionArgs* args) {
mLock.unlock(); mLock.unlock();
MotionEvent event; MotionEvent event;
event.initialize(args->deviceId, args->source, args->action, args->flags, event.initialize(args->deviceId, args->source, args->action, args->actionButton,
args->edgeFlags, args->metaState, args->buttonState, 0, 0, args->flags, args->edgeFlags, args->metaState, args->buttonState,
args->xPrecision, args->yPrecision, 0, 0, args->xPrecision, args->yPrecision,
args->downTime, args->eventTime, args->downTime, args->eventTime,
args->pointerCount, args->pointerProperties, args->pointerCoords); args->pointerCount, args->pointerProperties, args->pointerCoords);
@ -2488,7 +2493,8 @@ void InputDispatcher::notifyMotion(const NotifyMotionArgs* args) {
// Just enqueue a new motion event. // Just enqueue a new motion event.
MotionEntry* newEntry = new MotionEntry(args->eventTime, MotionEntry* newEntry = new MotionEntry(args->eventTime,
args->deviceId, args->source, policyFlags, args->deviceId, args->source, policyFlags,
args->action, args->flags, args->metaState, args->buttonState, args->action, args->actionButton, args->flags,
args->metaState, args->buttonState,
args->edgeFlags, args->xPrecision, args->yPrecision, args->downTime, args->edgeFlags, args->xPrecision, args->yPrecision, args->downTime,
args->displayId, args->displayId,
args->pointerCount, args->pointerProperties, args->pointerCoords, 0, 0); args->pointerCount, args->pointerProperties, args->pointerCoords, 0, 0);
@ -2589,7 +2595,8 @@ int32_t InputDispatcher::injectInputEvent(const InputEvent* event, int32_t displ
int32_t action = motionEvent->getAction(); int32_t action = motionEvent->getAction();
size_t pointerCount = motionEvent->getPointerCount(); size_t pointerCount = motionEvent->getPointerCount();
const PointerProperties* pointerProperties = motionEvent->getPointerProperties(); const PointerProperties* pointerProperties = motionEvent->getPointerProperties();
if (! validateMotionEvent(action, pointerCount, pointerProperties)) { int32_t actionButton = motionEvent->getActionButton();
if (! validateMotionEvent(action, actionButton, pointerCount, pointerProperties)) {
return INPUT_EVENT_INJECTION_FAILED; return INPUT_EVENT_INJECTION_FAILED;
} }
@ -2603,7 +2610,7 @@ int32_t InputDispatcher::injectInputEvent(const InputEvent* event, int32_t displ
const PointerCoords* samplePointerCoords = motionEvent->getSamplePointerCoords(); const PointerCoords* samplePointerCoords = motionEvent->getSamplePointerCoords();
firstInjectedEntry = new MotionEntry(*sampleEventTimes, firstInjectedEntry = new MotionEntry(*sampleEventTimes,
motionEvent->getDeviceId(), motionEvent->getSource(), policyFlags, motionEvent->getDeviceId(), motionEvent->getSource(), policyFlags,
action, motionEvent->getFlags(), action, actionButton, motionEvent->getFlags(),
motionEvent->getMetaState(), motionEvent->getButtonState(), motionEvent->getMetaState(), motionEvent->getButtonState(),
motionEvent->getEdgeFlags(), motionEvent->getEdgeFlags(),
motionEvent->getXPrecision(), motionEvent->getYPrecision(), motionEvent->getXPrecision(), motionEvent->getYPrecision(),
@ -2616,7 +2623,7 @@ int32_t InputDispatcher::injectInputEvent(const InputEvent* event, int32_t displ
samplePointerCoords += pointerCount; samplePointerCoords += pointerCount;
MotionEntry* nextInjectedEntry = new MotionEntry(*sampleEventTimes, MotionEntry* nextInjectedEntry = new MotionEntry(*sampleEventTimes,
motionEvent->getDeviceId(), motionEvent->getSource(), policyFlags, motionEvent->getDeviceId(), motionEvent->getSource(), policyFlags,
action, motionEvent->getFlags(), action, actionButton, motionEvent->getFlags(),
motionEvent->getMetaState(), motionEvent->getButtonState(), motionEvent->getMetaState(), motionEvent->getButtonState(),
motionEvent->getEdgeFlags(), motionEvent->getEdgeFlags(),
motionEvent->getXPrecision(), motionEvent->getYPrecision(), motionEvent->getXPrecision(), motionEvent->getYPrecision(),
@ -3907,18 +3914,18 @@ void InputDispatcher::KeyEntry::recycle() {
// --- InputDispatcher::MotionEntry --- // --- InputDispatcher::MotionEntry ---
InputDispatcher::MotionEntry::MotionEntry(nsecs_t eventTime, InputDispatcher::MotionEntry::MotionEntry(nsecs_t eventTime, int32_t deviceId,
int32_t deviceId, uint32_t source, uint32_t policyFlags, int32_t action, int32_t flags, uint32_t source, uint32_t policyFlags, int32_t action, int32_t actionButton,
int32_t metaState, int32_t buttonState, int32_t flags, int32_t metaState, int32_t buttonState, int32_t edgeFlags,
int32_t edgeFlags, float xPrecision, float yPrecision, float xPrecision, float yPrecision, nsecs_t downTime,
nsecs_t downTime, int32_t displayId, uint32_t pointerCount, int32_t displayId, uint32_t pointerCount,
const PointerProperties* pointerProperties, const PointerCoords* pointerCoords, const PointerProperties* pointerProperties, const PointerCoords* pointerCoords,
float xOffset, float yOffset) : float xOffset, float yOffset) :
EventEntry(TYPE_MOTION, eventTime, policyFlags), EventEntry(TYPE_MOTION, eventTime, policyFlags),
eventTime(eventTime), eventTime(eventTime),
deviceId(deviceId), source(source), action(action), flags(flags), deviceId(deviceId), source(source), action(action), actionButton(actionButton),
metaState(metaState), buttonState(buttonState), edgeFlags(edgeFlags), flags(flags), metaState(metaState), buttonState(buttonState),
xPrecision(xPrecision), yPrecision(yPrecision), edgeFlags(edgeFlags), xPrecision(xPrecision), yPrecision(yPrecision),
downTime(downTime), displayId(displayId), pointerCount(pointerCount) { downTime(downTime), displayId(displayId), pointerCount(pointerCount) {
for (uint32_t i = 0; i < pointerCount; i++) { for (uint32_t i = 0; i < pointerCount; i++) {
this->pointerProperties[i].copyFrom(pointerProperties[i]); this->pointerProperties[i].copyFrom(pointerProperties[i]);
@ -3933,10 +3940,10 @@ InputDispatcher::MotionEntry::~MotionEntry() {
} }
void InputDispatcher::MotionEntry::appendDescription(String8& msg) const { void InputDispatcher::MotionEntry::appendDescription(String8& msg) const {
msg.appendFormat("MotionEvent(deviceId=%d, source=0x%08x, action=%d, " msg.appendFormat("MotionEvent(deviceId=%d, source=0x%08x, action=%d, actionButton=0x%08x, "
"flags=0x%08x, metaState=0x%08x, buttonState=0x%08x, edgeFlags=0x%08x, " "flags=0x%08x, metaState=0x%08x, buttonState=0x%08x, "
"xPrecision=%.1f, yPrecision=%.1f, displayId=%d, pointers=[", "edgeFlags=0x%08x, xPrecision=%.1f, yPrecision=%.1f, displayId=%d, pointers=[",
deviceId, source, action, flags, metaState, buttonState, edgeFlags, deviceId, source, action, actionButton, flags, metaState, buttonState, edgeFlags,
xPrecision, yPrecision, displayId); xPrecision, yPrecision, displayId);
for (uint32_t i = 0; i < pointerCount; i++) { for (uint32_t i = 0; i < pointerCount; i++) {
if (i) { if (i) {
@ -4237,7 +4244,7 @@ void InputDispatcher::InputState::synthesizeCancelationEvents(nsecs_t currentTim
memento.hovering memento.hovering
? AMOTION_EVENT_ACTION_HOVER_EXIT ? AMOTION_EVENT_ACTION_HOVER_EXIT
: AMOTION_EVENT_ACTION_CANCEL, : AMOTION_EVENT_ACTION_CANCEL,
memento.flags, 0, 0, 0, memento.flags, 0, 0, 0, 0,
memento.xPrecision, memento.yPrecision, memento.downTime, memento.xPrecision, memento.yPrecision, memento.downTime,
memento.displayId, memento.displayId,
memento.pointerCount, memento.pointerProperties, memento.pointerCoords, memento.pointerCount, memento.pointerProperties, memento.pointerCoords,

View File

@ -504,6 +504,7 @@ private:
int32_t deviceId; int32_t deviceId;
uint32_t source; uint32_t source;
int32_t action; int32_t action;
int32_t actionButton;
int32_t flags; int32_t flags;
int32_t metaState; int32_t metaState;
int32_t buttonState; int32_t buttonState;
@ -518,10 +519,10 @@ private:
MotionEntry(nsecs_t eventTime, MotionEntry(nsecs_t eventTime,
int32_t deviceId, uint32_t source, uint32_t policyFlags, int32_t deviceId, uint32_t source, uint32_t policyFlags,
int32_t action, int32_t flags, int32_t action, int32_t actionButton, int32_t flags,
int32_t metaState, int32_t buttonState, int32_t edgeFlags, int32_t metaState, int32_t buttonState, int32_t edgeFlags,
float xPrecision, float yPrecision, float xPrecision, float yPrecision, nsecs_t downTime,
nsecs_t downTime, int32_t displayId, uint32_t pointerCount, int32_t displayId, uint32_t pointerCount,
const PointerProperties* pointerProperties, const PointerCoords* pointerCoords, const PointerProperties* pointerProperties, const PointerCoords* pointerCoords,
float xOffset, float yOffset); float xOffset, float yOffset);
virtual void appendDescription(String8& msg) const; virtual void appendDescription(String8& msg) const;

View File

@ -68,12 +68,13 @@ void NotifyKeyArgs::notify(const sp<InputListenerInterface>& listener) const {
NotifyMotionArgs::NotifyMotionArgs(nsecs_t eventTime, int32_t deviceId, uint32_t source, NotifyMotionArgs::NotifyMotionArgs(nsecs_t eventTime, int32_t deviceId, uint32_t source,
uint32_t policyFlags, uint32_t policyFlags,
int32_t action, int32_t flags, int32_t metaState, int32_t buttonState, int32_t action, int32_t actionButton, int32_t flags, int32_t metaState,
int32_t edgeFlags, int32_t displayId, uint32_t pointerCount, int32_t buttonState, int32_t edgeFlags, int32_t displayId, uint32_t pointerCount,
const PointerProperties* pointerProperties, const PointerCoords* pointerCoords, const PointerProperties* pointerProperties, const PointerCoords* pointerCoords,
float xPrecision, float yPrecision, nsecs_t downTime) : float xPrecision, float yPrecision, nsecs_t downTime) :
eventTime(eventTime), deviceId(deviceId), source(source), policyFlags(policyFlags), eventTime(eventTime), deviceId(deviceId), source(source), policyFlags(policyFlags),
action(action), flags(flags), metaState(metaState), buttonState(buttonState), action(action), actionButton(actionButton),
flags(flags), metaState(metaState), buttonState(buttonState),
edgeFlags(edgeFlags), displayId(displayId), pointerCount(pointerCount), edgeFlags(edgeFlags), displayId(displayId), pointerCount(pointerCount),
xPrecision(xPrecision), yPrecision(yPrecision), downTime(downTime) { xPrecision(xPrecision), yPrecision(yPrecision), downTime(downTime) {
for (uint32_t i = 0; i < pointerCount; i++) { for (uint32_t i = 0; i < pointerCount; i++) {
@ -85,10 +86,9 @@ NotifyMotionArgs::NotifyMotionArgs(nsecs_t eventTime, int32_t deviceId, uint32_t
NotifyMotionArgs::NotifyMotionArgs(const NotifyMotionArgs& other) : NotifyMotionArgs::NotifyMotionArgs(const NotifyMotionArgs& other) :
eventTime(other.eventTime), deviceId(other.deviceId), source(other.source), eventTime(other.eventTime), deviceId(other.deviceId), source(other.source),
policyFlags(other.policyFlags), policyFlags(other.policyFlags),
action(other.action), flags(other.flags), action(other.action), actionButton(other.actionButton), flags(other.flags),
metaState(other.metaState), buttonState(other.buttonState), metaState(other.metaState), buttonState(other.buttonState),
edgeFlags(other.edgeFlags), displayId(other.displayId), edgeFlags(other.edgeFlags), displayId(other.displayId), pointerCount(other.pointerCount),
pointerCount(other.pointerCount),
xPrecision(other.xPrecision), yPrecision(other.yPrecision), downTime(other.downTime) { xPrecision(other.xPrecision), yPrecision(other.yPrecision), downTime(other.downTime) {
for (uint32_t i = 0; i < pointerCount; i++) { for (uint32_t i = 0; i < pointerCount; i++) {
pointerProperties[i].copyFrom(other.pointerProperties[i]); pointerProperties[i].copyFrom(other.pointerProperties[i]);

View File

@ -84,6 +84,7 @@ struct NotifyMotionArgs : public NotifyArgs {
uint32_t source; uint32_t source;
uint32_t policyFlags; uint32_t policyFlags;
int32_t action; int32_t action;
int32_t actionButton;
int32_t flags; int32_t flags;
int32_t metaState; int32_t metaState;
int32_t buttonState; int32_t buttonState;
@ -99,7 +100,8 @@ struct NotifyMotionArgs : public NotifyArgs {
inline NotifyMotionArgs() { } inline NotifyMotionArgs() { }
NotifyMotionArgs(nsecs_t eventTime, int32_t deviceId, uint32_t source, uint32_t policyFlags, NotifyMotionArgs(nsecs_t eventTime, int32_t deviceId, uint32_t source, uint32_t policyFlags,
int32_t action, int32_t flags, int32_t metaState, int32_t buttonState, int32_t action, int32_t actionButton, int32_t flags,
int32_t metaState, int32_t buttonState,
int32_t edgeFlags, int32_t displayId, uint32_t pointerCount, int32_t edgeFlags, int32_t displayId, uint32_t pointerCount,
const PointerProperties* pointerProperties, const PointerCoords* pointerCoords, const PointerProperties* pointerProperties, const PointerCoords* pointerCoords,
float xPrecision, float yPrecision, nsecs_t downTime); float xPrecision, float yPrecision, nsecs_t downTime);

View File

@ -1442,10 +1442,10 @@ void TouchButtonAccumulator::process(const RawEvent* rawEvent) {
uint32_t TouchButtonAccumulator::getButtonState() const { uint32_t TouchButtonAccumulator::getButtonState() const {
uint32_t result = 0; uint32_t result = 0;
if (mBtnStylus) { if (mBtnStylus) {
result |= AMOTION_EVENT_BUTTON_SECONDARY; result |= AMOTION_EVENT_BUTTON_STYLUS_PRIMARY;
} }
if (mBtnStylus2) { if (mBtnStylus2) {
result |= AMOTION_EVENT_BUTTON_TERTIARY; result |= AMOTION_EVENT_BUTTON_STYLUS_SECONDARY;
} }
return result; return result;
} }
@ -2547,7 +2547,8 @@ void CursorInputMapper::sync(nsecs_t when) {
} }
nsecs_t downTime = mDownTime; nsecs_t downTime = mDownTime;
bool buttonsChanged = currentButtonState != lastButtonState; bool buttonsChanged = currentButtonState != lastButtonState;
bool buttonsPressed = currentButtonState & ~lastButtonState; int32_t buttonsPressed = currentButtonState & ~lastButtonState;
int32_t buttonsReleased = lastButtonState & ~currentButtonState;
float deltaX = mCursorMotionAccumulator.getRelativeX() * mXScale; float deltaX = mCursorMotionAccumulator.getRelativeX() * mXScale;
float deltaY = mCursorMotionAccumulator.getRelativeY() * mYScale; float deltaY = mCursorMotionAccumulator.getRelativeY() * mYScale;
@ -2623,6 +2624,7 @@ void CursorInputMapper::sync(nsecs_t when) {
// Send motion event. // Send motion event.
if (downChanged || moved || scrolled || buttonsChanged) { if (downChanged || moved || scrolled || buttonsChanged) {
int32_t metaState = mContext->getGlobalMetaState(); int32_t metaState = mContext->getGlobalMetaState();
int32_t buttonState = lastButtonState;
int32_t motionEventAction; int32_t motionEventAction;
if (downChanged) { if (downChanged) {
motionEventAction = down ? AMOTION_EVENT_ACTION_DOWN : AMOTION_EVENT_ACTION_UP; motionEventAction = down ? AMOTION_EVENT_ACTION_DOWN : AMOTION_EVENT_ACTION_UP;
@ -2632,17 +2634,48 @@ void CursorInputMapper::sync(nsecs_t when) {
motionEventAction = AMOTION_EVENT_ACTION_HOVER_MOVE; motionEventAction = AMOTION_EVENT_ACTION_HOVER_MOVE;
} }
if (buttonsReleased) {
BitSet32 released(buttonsReleased);
while (!released.isEmpty()) {
int32_t actionButton = BitSet32::valueForBit(released.clearFirstMarkedBit());
buttonState &= ~actionButton;
NotifyMotionArgs releaseArgs(when, getDeviceId(), mSource, policyFlags,
AMOTION_EVENT_ACTION_BUTTON_RELEASE, actionButton, 0,
metaState, buttonState, AMOTION_EVENT_EDGE_FLAG_NONE,
displayId, 1, &pointerProperties, &pointerCoords,
mXPrecision, mYPrecision, downTime);
getListener()->notifyMotion(&releaseArgs);
}
}
NotifyMotionArgs args(when, getDeviceId(), mSource, policyFlags, NotifyMotionArgs args(when, getDeviceId(), mSource, policyFlags,
motionEventAction, 0, metaState, currentButtonState, 0, motionEventAction, 0, 0, metaState, currentButtonState,
AMOTION_EVENT_EDGE_FLAG_NONE,
displayId, 1, &pointerProperties, &pointerCoords, displayId, 1, &pointerProperties, &pointerCoords,
mXPrecision, mYPrecision, downTime); mXPrecision, mYPrecision, downTime);
getListener()->notifyMotion(&args); getListener()->notifyMotion(&args);
if (buttonsPressed) {
BitSet32 pressed(buttonsPressed);
while (!pressed.isEmpty()) {
int32_t actionButton = BitSet32::valueForBit(pressed.clearFirstMarkedBit());
buttonState |= actionButton;
NotifyMotionArgs pressArgs(when, getDeviceId(), mSource, policyFlags,
AMOTION_EVENT_ACTION_BUTTON_PRESS, actionButton, 0,
metaState, buttonState, AMOTION_EVENT_EDGE_FLAG_NONE,
displayId, 1, &pointerProperties, &pointerCoords,
mXPrecision, mYPrecision, downTime);
getListener()->notifyMotion(&pressArgs);
}
}
ALOG_ASSERT(buttonState == currentButtonState);
// Send hover move after UP to tell the application that the mouse is hovering now. // Send hover move after UP to tell the application that the mouse is hovering now.
if (motionEventAction == AMOTION_EVENT_ACTION_UP if (motionEventAction == AMOTION_EVENT_ACTION_UP
&& mPointerController != NULL) { && mPointerController != NULL) {
NotifyMotionArgs hoverArgs(when, getDeviceId(), mSource, policyFlags, NotifyMotionArgs hoverArgs(when, getDeviceId(), mSource, policyFlags,
AMOTION_EVENT_ACTION_HOVER_MOVE, 0, AMOTION_EVENT_ACTION_HOVER_MOVE, 0, 0,
metaState, currentButtonState, AMOTION_EVENT_EDGE_FLAG_NONE, metaState, currentButtonState, AMOTION_EVENT_EDGE_FLAG_NONE,
displayId, 1, &pointerProperties, &pointerCoords, displayId, 1, &pointerProperties, &pointerCoords,
mXPrecision, mYPrecision, downTime); mXPrecision, mYPrecision, downTime);
@ -2655,7 +2688,7 @@ void CursorInputMapper::sync(nsecs_t when) {
pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_HSCROLL, hscroll); pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_HSCROLL, hscroll);
NotifyMotionArgs scrollArgs(when, getDeviceId(), mSource, policyFlags, NotifyMotionArgs scrollArgs(when, getDeviceId(), mSource, policyFlags,
AMOTION_EVENT_ACTION_SCROLL, 0, metaState, currentButtonState, AMOTION_EVENT_ACTION_SCROLL, 0, 0, metaState, currentButtonState,
AMOTION_EVENT_EDGE_FLAG_NONE, AMOTION_EVENT_EDGE_FLAG_NONE,
displayId, 1, &pointerProperties, &pointerCoords, displayId, 1, &pointerProperties, &pointerCoords,
mXPrecision, mYPrecision, downTime); mXPrecision, mYPrecision, downTime);
@ -2787,8 +2820,7 @@ void TouchInputMapper::dump(String8& dump) {
dump.appendFormat(INDENT4 "TiltYCenter: %0.3f\n", mTiltYCenter); dump.appendFormat(INDENT4 "TiltYCenter: %0.3f\n", mTiltYCenter);
dump.appendFormat(INDENT4 "TiltYScale: %0.3f\n", mTiltYScale); dump.appendFormat(INDENT4 "TiltYScale: %0.3f\n", mTiltYScale);
dump.appendFormat(INDENT3 "Last Button State: 0x%08x\n", mLastRawState.buttonState); dump.appendFormat(INDENT3 "Last Raw Button State: 0x%08x\n", mLastRawState.buttonState);
dump.appendFormat(INDENT3 "Last Raw Touch: pointerCount=%d\n", dump.appendFormat(INDENT3 "Last Raw Touch: pointerCount=%d\n",
mLastRawState.rawPointerData.pointerCount); mLastRawState.rawPointerData.pointerCount);
for (uint32_t i = 0; i < mLastRawState.rawPointerData.pointerCount; i++) { for (uint32_t i = 0; i < mLastRawState.rawPointerData.pointerCount; i++) {
@ -2804,6 +2836,7 @@ void TouchInputMapper::dump(String8& dump) {
pointer.toolType, toString(pointer.isHovering)); pointer.toolType, toString(pointer.isHovering));
} }
dump.appendFormat(INDENT3 "Last Cooked Button State: 0x%08x\n", mLastCookedState.buttonState);
dump.appendFormat(INDENT3 "Last Cooked Touch: pointerCount=%d\n", dump.appendFormat(INDENT3 "Last Cooked Touch: pointerCount=%d\n",
mLastCookedState.cookedPointerData.pointerCount); mLastCookedState.cookedPointerData.pointerCount);
for (uint32_t i = 0; i < mLastCookedState.cookedPointerData.pointerCount; i++) { for (uint32_t i = 0; i < mLastCookedState.cookedPointerData.pointerCount; i++) {
@ -3994,7 +4027,7 @@ void TouchInputMapper::cookAndDispatch(nsecs_t when) {
// Synthesize key down from raw buttons if needed. // Synthesize key down from raw buttons if needed.
synthesizeButtonKeys(getContext(), AKEY_EVENT_ACTION_DOWN, when, getDeviceId(), mSource, synthesizeButtonKeys(getContext(), AKEY_EVENT_ACTION_DOWN, when, getDeviceId(), mSource,
policyFlags, mLastRawState.buttonState, mCurrentRawState.buttonState); policyFlags, mLastCookedState.buttonState, mCurrentCookedState.buttonState);
// Dispatch the touches either directly or by translation through a pointer on screen. // Dispatch the touches either directly or by translation through a pointer on screen.
if (mDeviceMode == DEVICE_MODE_POINTER) { if (mDeviceMode == DEVICE_MODE_POINTER) {
@ -4051,14 +4084,16 @@ void TouchInputMapper::cookAndDispatch(nsecs_t when) {
mCurrentCookedState.cookedPointerData.touchingIdBits); mCurrentCookedState.cookedPointerData.touchingIdBits);
} }
dispatchButtonRelease(when, policyFlags);
dispatchHoverExit(when, policyFlags); dispatchHoverExit(when, policyFlags);
dispatchTouches(when, policyFlags); dispatchTouches(when, policyFlags);
dispatchHoverEnterAndMove(when, policyFlags); dispatchHoverEnterAndMove(when, policyFlags);
dispatchButtonPress(when, policyFlags);
} }
// Synthesize key up from raw buttons if needed. // Synthesize key up from raw buttons if needed.
synthesizeButtonKeys(getContext(), AKEY_EVENT_ACTION_UP, when, getDeviceId(), mSource, synthesizeButtonKeys(getContext(), AKEY_EVENT_ACTION_UP, when, getDeviceId(), mSource,
policyFlags, mLastRawState.buttonState, mCurrentRawState.buttonState); policyFlags, mLastCookedState.buttonState, mCurrentCookedState.buttonState);
// Clear some transient state. // Clear some transient state.
mCurrentRawState.rawVScroll = 0; mCurrentRawState.rawVScroll = 0;
@ -4070,7 +4105,7 @@ void TouchInputMapper::cookAndDispatch(nsecs_t when) {
} }
void TouchInputMapper::applyExternalStylusButtonState(nsecs_t when) { void TouchInputMapper::applyExternalStylusButtonState(nsecs_t when) {
if (mDeviceMode == DEVICE_MODE_DIRECT && hasExternalStylus()) { if (mDeviceMode == DEVICE_MODE_DIRECT && hasExternalStylus() && mExternalStylusId != -1) {
mCurrentRawState.buttonState |= mExternalStylusState.buttons; mCurrentRawState.buttonState |= mExternalStylusState.buttons;
} }
} }
@ -4282,14 +4317,14 @@ void TouchInputMapper::dispatchTouches(nsecs_t when, uint32_t policyFlags) {
BitSet32 currentIdBits = mCurrentCookedState.cookedPointerData.touchingIdBits; BitSet32 currentIdBits = mCurrentCookedState.cookedPointerData.touchingIdBits;
BitSet32 lastIdBits = mLastCookedState.cookedPointerData.touchingIdBits; BitSet32 lastIdBits = mLastCookedState.cookedPointerData.touchingIdBits;
int32_t metaState = getContext()->getGlobalMetaState(); int32_t metaState = getContext()->getGlobalMetaState();
int32_t buttonState = mCurrentRawState.buttonState; int32_t buttonState = mCurrentCookedState.buttonState;
if (currentIdBits == lastIdBits) { if (currentIdBits == lastIdBits) {
if (!currentIdBits.isEmpty()) { if (!currentIdBits.isEmpty()) {
// No pointer id changes so this is a move event. // No pointer id changes so this is a move event.
// The listener takes care of batching moves so we don't have to deal with that here. // The listener takes care of batching moves so we don't have to deal with that here.
dispatchMotion(when, policyFlags, mSource, dispatchMotion(when, policyFlags, mSource,
AMOTION_EVENT_ACTION_MOVE, 0, metaState, buttonState, AMOTION_EVENT_ACTION_MOVE, 0, 0, metaState, buttonState,
AMOTION_EVENT_EDGE_FLAG_NONE, AMOTION_EVENT_EDGE_FLAG_NONE,
mCurrentCookedState.cookedPointerData.pointerProperties, mCurrentCookedState.cookedPointerData.pointerProperties,
mCurrentCookedState.cookedPointerData.pointerCoords, mCurrentCookedState.cookedPointerData.pointerCoords,
@ -4315,7 +4350,7 @@ void TouchInputMapper::dispatchTouches(nsecs_t when, uint32_t policyFlags) {
mLastCookedState.cookedPointerData.pointerCoords, mLastCookedState.cookedPointerData.pointerCoords,
mLastCookedState.cookedPointerData.idToIndex, mLastCookedState.cookedPointerData.idToIndex,
moveIdBits); moveIdBits);
if (buttonState != mLastRawState.buttonState) { if (buttonState != mLastCookedState.buttonState) {
moveNeeded = true; moveNeeded = true;
} }
@ -4324,12 +4359,11 @@ void TouchInputMapper::dispatchTouches(nsecs_t when, uint32_t policyFlags) {
uint32_t upId = upIdBits.clearFirstMarkedBit(); uint32_t upId = upIdBits.clearFirstMarkedBit();
dispatchMotion(when, policyFlags, mSource, dispatchMotion(when, policyFlags, mSource,
AMOTION_EVENT_ACTION_POINTER_UP, 0, metaState, buttonState, 0, AMOTION_EVENT_ACTION_POINTER_UP, 0, 0, metaState, buttonState, 0,
mLastCookedState.cookedPointerData.pointerProperties, mLastCookedState.cookedPointerData.pointerProperties,
mLastCookedState.cookedPointerData.pointerCoords, mLastCookedState.cookedPointerData.pointerCoords,
mLastCookedState.cookedPointerData.idToIndex, mLastCookedState.cookedPointerData.idToIndex,
dispatchedIdBits, upId, dispatchedIdBits, upId, mOrientedXPrecision, mOrientedYPrecision, mDownTime);
mOrientedXPrecision, mOrientedYPrecision, mDownTime);
dispatchedIdBits.clearBit(upId); dispatchedIdBits.clearBit(upId);
} }
@ -4339,12 +4373,11 @@ void TouchInputMapper::dispatchTouches(nsecs_t when, uint32_t policyFlags) {
if (moveNeeded && !moveIdBits.isEmpty()) { if (moveNeeded && !moveIdBits.isEmpty()) {
ALOG_ASSERT(moveIdBits.value == dispatchedIdBits.value); ALOG_ASSERT(moveIdBits.value == dispatchedIdBits.value);
dispatchMotion(when, policyFlags, mSource, dispatchMotion(when, policyFlags, mSource,
AMOTION_EVENT_ACTION_MOVE, 0, metaState, buttonState, 0, AMOTION_EVENT_ACTION_MOVE, 0, 0, metaState, buttonState, 0,
mCurrentCookedState.cookedPointerData.pointerProperties, mCurrentCookedState.cookedPointerData.pointerProperties,
mCurrentCookedState.cookedPointerData.pointerCoords, mCurrentCookedState.cookedPointerData.pointerCoords,
mCurrentCookedState.cookedPointerData.idToIndex, mCurrentCookedState.cookedPointerData.idToIndex,
dispatchedIdBits, -1, dispatchedIdBits, -1, mOrientedXPrecision, mOrientedYPrecision, mDownTime);
mOrientedXPrecision, mOrientedYPrecision, mDownTime);
} }
// Dispatch pointer down events using the new pointer locations. // Dispatch pointer down events using the new pointer locations.
@ -4358,12 +4391,11 @@ void TouchInputMapper::dispatchTouches(nsecs_t when, uint32_t policyFlags) {
} }
dispatchMotion(when, policyFlags, mSource, dispatchMotion(when, policyFlags, mSource,
AMOTION_EVENT_ACTION_POINTER_DOWN, 0, metaState, buttonState, 0, AMOTION_EVENT_ACTION_POINTER_DOWN, 0, 0, metaState, buttonState, 0,
mCurrentCookedState.cookedPointerData.pointerProperties, mCurrentCookedState.cookedPointerData.pointerProperties,
mCurrentCookedState.cookedPointerData.pointerCoords, mCurrentCookedState.cookedPointerData.pointerCoords,
mCurrentCookedState.cookedPointerData.idToIndex, mCurrentCookedState.cookedPointerData.idToIndex,
dispatchedIdBits, downId, dispatchedIdBits, downId, mOrientedXPrecision, mOrientedYPrecision, mDownTime);
mOrientedXPrecision, mOrientedYPrecision, mDownTime);
} }
} }
} }
@ -4374,7 +4406,7 @@ void TouchInputMapper::dispatchHoverExit(nsecs_t when, uint32_t policyFlags) {
|| !mCurrentCookedState.cookedPointerData.touchingIdBits.isEmpty())) { || !mCurrentCookedState.cookedPointerData.touchingIdBits.isEmpty())) {
int32_t metaState = getContext()->getGlobalMetaState(); int32_t metaState = getContext()->getGlobalMetaState();
dispatchMotion(when, policyFlags, mSource, dispatchMotion(when, policyFlags, mSource,
AMOTION_EVENT_ACTION_HOVER_EXIT, 0, metaState, mLastRawState.buttonState, 0, AMOTION_EVENT_ACTION_HOVER_EXIT, 0, 0, metaState, mLastCookedState.buttonState, 0,
mLastCookedState.cookedPointerData.pointerProperties, mLastCookedState.cookedPointerData.pointerProperties,
mLastCookedState.cookedPointerData.pointerCoords, mLastCookedState.cookedPointerData.pointerCoords,
mLastCookedState.cookedPointerData.idToIndex, mLastCookedState.cookedPointerData.idToIndex,
@ -4390,7 +4422,7 @@ void TouchInputMapper::dispatchHoverEnterAndMove(nsecs_t when, uint32_t policyFl
int32_t metaState = getContext()->getGlobalMetaState(); int32_t metaState = getContext()->getGlobalMetaState();
if (!mSentHoverEnter) { if (!mSentHoverEnter) {
dispatchMotion(when, policyFlags, mSource, AMOTION_EVENT_ACTION_HOVER_ENTER, dispatchMotion(when, policyFlags, mSource, AMOTION_EVENT_ACTION_HOVER_ENTER,
0, metaState, mCurrentRawState.buttonState, 0, 0, 0, metaState, mCurrentRawState.buttonState, 0,
mCurrentCookedState.cookedPointerData.pointerProperties, mCurrentCookedState.cookedPointerData.pointerProperties,
mCurrentCookedState.cookedPointerData.pointerCoords, mCurrentCookedState.cookedPointerData.pointerCoords,
mCurrentCookedState.cookedPointerData.idToIndex, mCurrentCookedState.cookedPointerData.idToIndex,
@ -4400,7 +4432,7 @@ void TouchInputMapper::dispatchHoverEnterAndMove(nsecs_t when, uint32_t policyFl
} }
dispatchMotion(when, policyFlags, mSource, dispatchMotion(when, policyFlags, mSource,
AMOTION_EVENT_ACTION_HOVER_MOVE, 0, metaState, AMOTION_EVENT_ACTION_HOVER_MOVE, 0, 0, metaState,
mCurrentRawState.buttonState, 0, mCurrentRawState.buttonState, 0,
mCurrentCookedState.cookedPointerData.pointerProperties, mCurrentCookedState.cookedPointerData.pointerProperties,
mCurrentCookedState.cookedPointerData.pointerCoords, mCurrentCookedState.cookedPointerData.pointerCoords,
@ -4410,6 +4442,48 @@ void TouchInputMapper::dispatchHoverEnterAndMove(nsecs_t when, uint32_t policyFl
} }
} }
void TouchInputMapper::dispatchButtonRelease(nsecs_t when, uint32_t policyFlags) {
BitSet32 releasedButtons(mLastCookedState.buttonState & ~mCurrentCookedState.buttonState);
const BitSet32& idBits = findActiveIdBits(mLastCookedState.cookedPointerData);
const int32_t metaState = getContext()->getGlobalMetaState();
int32_t buttonState = mLastCookedState.buttonState;
while (!releasedButtons.isEmpty()) {
int32_t actionButton = BitSet32::valueForBit(releasedButtons.clearFirstMarkedBit());
buttonState &= ~actionButton;
dispatchMotion(when, policyFlags, mSource,
AMOTION_EVENT_ACTION_BUTTON_RELEASE, actionButton,
0, metaState, buttonState, 0,
mCurrentCookedState.cookedPointerData.pointerProperties,
mCurrentCookedState.cookedPointerData.pointerCoords,
mCurrentCookedState.cookedPointerData.idToIndex, idBits, -1,
mOrientedXPrecision, mOrientedYPrecision, mDownTime);
}
}
void TouchInputMapper::dispatchButtonPress(nsecs_t when, uint32_t policyFlags) {
BitSet32 pressedButtons(mCurrentCookedState.buttonState & ~mLastCookedState.buttonState);
const BitSet32& idBits = findActiveIdBits(mCurrentCookedState.cookedPointerData);
const int32_t metaState = getContext()->getGlobalMetaState();
int32_t buttonState = mLastCookedState.buttonState;
while (!pressedButtons.isEmpty()) {
int32_t actionButton = BitSet32::valueForBit(pressedButtons.clearFirstMarkedBit());
buttonState |= actionButton;
dispatchMotion(when, policyFlags, mSource, AMOTION_EVENT_ACTION_BUTTON_PRESS, actionButton,
0, metaState, buttonState, 0,
mCurrentCookedState.cookedPointerData.pointerProperties,
mCurrentCookedState.cookedPointerData.pointerCoords,
mCurrentCookedState.cookedPointerData.idToIndex, idBits, -1,
mOrientedXPrecision, mOrientedYPrecision, mDownTime);
}
}
const BitSet32& TouchInputMapper::findActiveIdBits(const CookedPointerData& cookedPointerData) {
if (!cookedPointerData.touchingIdBits.isEmpty()) {
return cookedPointerData.touchingIdBits;
}
return cookedPointerData.hoveringIdBits;
}
void TouchInputMapper::cookPointerData() { void TouchInputMapper::cookPointerData() {
uint32_t currentPointerCount = mCurrentRawState.rawPointerData.pointerCount; uint32_t currentPointerCount = mCurrentRawState.rawPointerData.pointerCount;
@ -4420,6 +4494,12 @@ void TouchInputMapper::cookPointerData() {
mCurrentCookedState.cookedPointerData.touchingIdBits = mCurrentCookedState.cookedPointerData.touchingIdBits =
mCurrentRawState.rawPointerData.touchingIdBits; mCurrentRawState.rawPointerData.touchingIdBits;
if (mCurrentCookedState.cookedPointerData.pointerCount == 0) {
mCurrentCookedState.buttonState = 0;
} else {
mCurrentCookedState.buttonState = mCurrentRawState.buttonState;
}
// Walk through the the active pointers and map device coordinates onto // Walk through the the active pointers and map device coordinates onto
// surface coordinates and adjust for display orientation. // surface coordinates and adjust for display orientation.
for (uint32_t i = 0; i < currentPointerCount; i++) { for (uint32_t i = 0; i < currentPointerCount; i++) {
@ -4766,7 +4846,7 @@ void TouchInputMapper::dispatchPointerGestures(nsecs_t when, uint32_t policyFlag
// Send events! // Send events!
int32_t metaState = getContext()->getGlobalMetaState(); int32_t metaState = getContext()->getGlobalMetaState();
int32_t buttonState = mCurrentRawState.buttonState; int32_t buttonState = mCurrentCookedState.buttonState;
// Update last coordinates of pointers that have moved so that we observe the new // Update last coordinates of pointers that have moved so that we observe the new
// pointer positions at the same time as other pointers that have just gone up. // pointer positions at the same time as other pointers that have just gone up.
@ -4787,7 +4867,7 @@ void TouchInputMapper::dispatchPointerGestures(nsecs_t when, uint32_t policyFlag
mPointerGesture.lastGestureProperties, mPointerGesture.lastGestureProperties,
mPointerGesture.lastGestureCoords, mPointerGesture.lastGestureIdToIndex, mPointerGesture.lastGestureCoords, mPointerGesture.lastGestureIdToIndex,
movedGestureIdBits); movedGestureIdBits);
if (buttonState != mLastRawState.buttonState) { if (buttonState != mLastCookedState.buttonState) {
moveNeeded = true; moveNeeded = true;
} }
} }
@ -4797,12 +4877,12 @@ void TouchInputMapper::dispatchPointerGestures(nsecs_t when, uint32_t policyFlag
if (!dispatchedGestureIdBits.isEmpty()) { if (!dispatchedGestureIdBits.isEmpty()) {
if (cancelPreviousGesture) { if (cancelPreviousGesture) {
dispatchMotion(when, policyFlags, mSource, dispatchMotion(when, policyFlags, mSource,
AMOTION_EVENT_ACTION_CANCEL, 0, metaState, buttonState, AMOTION_EVENT_ACTION_CANCEL, 0, 0, metaState, buttonState,
AMOTION_EVENT_EDGE_FLAG_NONE, AMOTION_EVENT_EDGE_FLAG_NONE,
mPointerGesture.lastGestureProperties, mPointerGesture.lastGestureProperties,
mPointerGesture.lastGestureCoords, mPointerGesture.lastGestureIdToIndex, mPointerGesture.lastGestureCoords, mPointerGesture.lastGestureIdToIndex,
dispatchedGestureIdBits, -1, dispatchedGestureIdBits, -1, 0,
0, 0, mPointerGesture.downTime); 0, mPointerGesture.downTime);
dispatchedGestureIdBits.clear(); dispatchedGestureIdBits.clear();
} else { } else {
@ -4817,7 +4897,7 @@ void TouchInputMapper::dispatchPointerGestures(nsecs_t when, uint32_t policyFlag
uint32_t id = upGestureIdBits.clearFirstMarkedBit(); uint32_t id = upGestureIdBits.clearFirstMarkedBit();
dispatchMotion(when, policyFlags, mSource, dispatchMotion(when, policyFlags, mSource,
AMOTION_EVENT_ACTION_POINTER_UP, 0, AMOTION_EVENT_ACTION_POINTER_UP, 0, 0,
metaState, buttonState, AMOTION_EVENT_EDGE_FLAG_NONE, metaState, buttonState, AMOTION_EVENT_EDGE_FLAG_NONE,
mPointerGesture.lastGestureProperties, mPointerGesture.lastGestureProperties,
mPointerGesture.lastGestureCoords, mPointerGesture.lastGestureIdToIndex, mPointerGesture.lastGestureCoords, mPointerGesture.lastGestureIdToIndex,
@ -4832,7 +4912,8 @@ void TouchInputMapper::dispatchPointerGestures(nsecs_t when, uint32_t policyFlag
// Send motion events for all pointers that moved. // Send motion events for all pointers that moved.
if (moveNeeded) { if (moveNeeded) {
dispatchMotion(when, policyFlags, mSource, dispatchMotion(when, policyFlags, mSource,
AMOTION_EVENT_ACTION_MOVE, 0, metaState, buttonState, AMOTION_EVENT_EDGE_FLAG_NONE, AMOTION_EVENT_ACTION_MOVE, 0, 0, metaState, buttonState,
AMOTION_EVENT_EDGE_FLAG_NONE,
mPointerGesture.currentGestureProperties, mPointerGesture.currentGestureProperties,
mPointerGesture.currentGestureCoords, mPointerGesture.currentGestureIdToIndex, mPointerGesture.currentGestureCoords, mPointerGesture.currentGestureIdToIndex,
dispatchedGestureIdBits, -1, dispatchedGestureIdBits, -1,
@ -4852,7 +4933,7 @@ void TouchInputMapper::dispatchPointerGestures(nsecs_t when, uint32_t policyFlag
} }
dispatchMotion(when, policyFlags, mSource, dispatchMotion(when, policyFlags, mSource,
AMOTION_EVENT_ACTION_POINTER_DOWN, 0, metaState, buttonState, 0, AMOTION_EVENT_ACTION_POINTER_DOWN, 0, 0, metaState, buttonState, 0,
mPointerGesture.currentGestureProperties, mPointerGesture.currentGestureProperties,
mPointerGesture.currentGestureCoords, mPointerGesture.currentGestureIdToIndex, mPointerGesture.currentGestureCoords, mPointerGesture.currentGestureIdToIndex,
dispatchedGestureIdBits, id, dispatchedGestureIdBits, id,
@ -4863,7 +4944,7 @@ void TouchInputMapper::dispatchPointerGestures(nsecs_t when, uint32_t policyFlag
// Send motion events for hover. // Send motion events for hover.
if (mPointerGesture.currentGestureMode == PointerGesture::HOVER) { if (mPointerGesture.currentGestureMode == PointerGesture::HOVER) {
dispatchMotion(when, policyFlags, mSource, dispatchMotion(when, policyFlags, mSource,
AMOTION_EVENT_ACTION_HOVER_MOVE, 0, AMOTION_EVENT_ACTION_HOVER_MOVE, 0, 0,
metaState, buttonState, AMOTION_EVENT_EDGE_FLAG_NONE, metaState, buttonState, AMOTION_EVENT_EDGE_FLAG_NONE,
mPointerGesture.currentGestureProperties, mPointerGesture.currentGestureProperties,
mPointerGesture.currentGestureCoords, mPointerGesture.currentGestureIdToIndex, mPointerGesture.currentGestureCoords, mPointerGesture.currentGestureIdToIndex,
@ -4889,7 +4970,7 @@ void TouchInputMapper::dispatchPointerGestures(nsecs_t when, uint32_t policyFlag
pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_Y, y); pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_Y, y);
NotifyMotionArgs args(when, getDeviceId(), mSource, policyFlags, NotifyMotionArgs args(when, getDeviceId(), mSource, policyFlags,
AMOTION_EVENT_ACTION_HOVER_MOVE, 0, AMOTION_EVENT_ACTION_HOVER_MOVE, 0, 0,
metaState, buttonState, AMOTION_EVENT_EDGE_FLAG_NONE, metaState, buttonState, AMOTION_EVENT_EDGE_FLAG_NONE,
mViewport.displayId, 1, &pointerProperties, &pointerCoords, mViewport.displayId, 1, &pointerProperties, &pointerCoords,
0, 0, mPointerGesture.downTime); 0, 0, mPointerGesture.downTime);
@ -4920,7 +5001,7 @@ void TouchInputMapper::abortPointerGestures(nsecs_t when, uint32_t policyFlags)
int32_t metaState = getContext()->getGlobalMetaState(); int32_t metaState = getContext()->getGlobalMetaState();
int32_t buttonState = mCurrentRawState.buttonState; int32_t buttonState = mCurrentRawState.buttonState;
dispatchMotion(when, policyFlags, mSource, dispatchMotion(when, policyFlags, mSource,
AMOTION_EVENT_ACTION_CANCEL, 0, metaState, buttonState, AMOTION_EVENT_ACTION_CANCEL, 0, 0, metaState, buttonState,
AMOTION_EVENT_EDGE_FLAG_NONE, AMOTION_EVENT_EDGE_FLAG_NONE,
mPointerGesture.lastGestureProperties, mPointerGesture.lastGestureProperties,
mPointerGesture.lastGestureCoords, mPointerGesture.lastGestureIdToIndex, mPointerGesture.lastGestureCoords, mPointerGesture.lastGestureIdToIndex,
@ -5815,7 +5896,7 @@ void TouchInputMapper::dispatchPointerSimple(nsecs_t when, uint32_t policyFlags,
// Send up. // Send up.
NotifyMotionArgs args(when, getDeviceId(), mSource, policyFlags, NotifyMotionArgs args(when, getDeviceId(), mSource, policyFlags,
AMOTION_EVENT_ACTION_UP, 0, metaState, mLastRawState.buttonState, 0, AMOTION_EVENT_ACTION_UP, 0, 0, metaState, mLastRawState.buttonState, 0,
mViewport.displayId, mViewport.displayId,
1, &mPointerSimple.lastProperties, &mPointerSimple.lastCoords, 1, &mPointerSimple.lastProperties, &mPointerSimple.lastCoords,
mOrientedXPrecision, mOrientedYPrecision, mOrientedXPrecision, mOrientedYPrecision,
@ -5828,7 +5909,7 @@ void TouchInputMapper::dispatchPointerSimple(nsecs_t when, uint32_t policyFlags,
// Send hover exit. // Send hover exit.
NotifyMotionArgs args(when, getDeviceId(), mSource, policyFlags, NotifyMotionArgs args(when, getDeviceId(), mSource, policyFlags,
AMOTION_EVENT_ACTION_HOVER_EXIT, 0, metaState, mLastRawState.buttonState, 0, AMOTION_EVENT_ACTION_HOVER_EXIT, 0, 0, metaState, mLastRawState.buttonState, 0,
mViewport.displayId, mViewport.displayId,
1, &mPointerSimple.lastProperties, &mPointerSimple.lastCoords, 1, &mPointerSimple.lastProperties, &mPointerSimple.lastCoords,
mOrientedXPrecision, mOrientedYPrecision, mOrientedXPrecision, mOrientedYPrecision,
@ -5843,7 +5924,7 @@ void TouchInputMapper::dispatchPointerSimple(nsecs_t when, uint32_t policyFlags,
// Send down. // Send down.
NotifyMotionArgs args(when, getDeviceId(), mSource, policyFlags, NotifyMotionArgs args(when, getDeviceId(), mSource, policyFlags,
AMOTION_EVENT_ACTION_DOWN, 0, metaState, mCurrentRawState.buttonState, 0, AMOTION_EVENT_ACTION_DOWN, 0, 0, metaState, mCurrentRawState.buttonState, 0,
mViewport.displayId, mViewport.displayId,
1, &mPointerSimple.currentProperties, &mPointerSimple.currentCoords, 1, &mPointerSimple.currentProperties, &mPointerSimple.currentCoords,
mOrientedXPrecision, mOrientedYPrecision, mOrientedXPrecision, mOrientedYPrecision,
@ -5853,7 +5934,7 @@ void TouchInputMapper::dispatchPointerSimple(nsecs_t when, uint32_t policyFlags,
// Send move. // Send move.
NotifyMotionArgs args(when, getDeviceId(), mSource, policyFlags, NotifyMotionArgs args(when, getDeviceId(), mSource, policyFlags,
AMOTION_EVENT_ACTION_MOVE, 0, metaState, mCurrentRawState.buttonState, 0, AMOTION_EVENT_ACTION_MOVE, 0, 0, metaState, mCurrentRawState.buttonState, 0,
mViewport.displayId, mViewport.displayId,
1, &mPointerSimple.currentProperties, &mPointerSimple.currentCoords, 1, &mPointerSimple.currentProperties, &mPointerSimple.currentCoords,
mOrientedXPrecision, mOrientedYPrecision, mOrientedXPrecision, mOrientedYPrecision,
@ -5867,7 +5948,7 @@ void TouchInputMapper::dispatchPointerSimple(nsecs_t when, uint32_t policyFlags,
// Send hover enter. // Send hover enter.
NotifyMotionArgs args(when, getDeviceId(), mSource, policyFlags, NotifyMotionArgs args(when, getDeviceId(), mSource, policyFlags,
AMOTION_EVENT_ACTION_HOVER_ENTER, 0, metaState, AMOTION_EVENT_ACTION_HOVER_ENTER, 0, 0, metaState,
mCurrentRawState.buttonState, 0, mCurrentRawState.buttonState, 0,
mViewport.displayId, mViewport.displayId,
1, &mPointerSimple.currentProperties, &mPointerSimple.currentCoords, 1, &mPointerSimple.currentProperties, &mPointerSimple.currentCoords,
@ -5878,7 +5959,7 @@ void TouchInputMapper::dispatchPointerSimple(nsecs_t when, uint32_t policyFlags,
// Send hover move. // Send hover move.
NotifyMotionArgs args(when, getDeviceId(), mSource, policyFlags, NotifyMotionArgs args(when, getDeviceId(), mSource, policyFlags,
AMOTION_EVENT_ACTION_HOVER_MOVE, 0, metaState, AMOTION_EVENT_ACTION_HOVER_MOVE, 0, 0, metaState,
mCurrentRawState.buttonState, 0, mCurrentRawState.buttonState, 0,
mViewport.displayId, mViewport.displayId,
1, &mPointerSimple.currentProperties, &mPointerSimple.currentCoords, 1, &mPointerSimple.currentProperties, &mPointerSimple.currentCoords,
@ -5900,7 +5981,7 @@ void TouchInputMapper::dispatchPointerSimple(nsecs_t when, uint32_t policyFlags,
pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_HSCROLL, hscroll); pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_HSCROLL, hscroll);
NotifyMotionArgs args(when, getDeviceId(), mSource, policyFlags, NotifyMotionArgs args(when, getDeviceId(), mSource, policyFlags,
AMOTION_EVENT_ACTION_SCROLL, 0, metaState, mCurrentRawState.buttonState, 0, AMOTION_EVENT_ACTION_SCROLL, 0, 0, metaState, mCurrentRawState.buttonState, 0,
mViewport.displayId, mViewport.displayId,
1, &mPointerSimple.currentProperties, &pointerCoords, 1, &mPointerSimple.currentProperties, &pointerCoords,
mOrientedXPrecision, mOrientedYPrecision, mOrientedXPrecision, mOrientedYPrecision,
@ -5925,10 +6006,11 @@ void TouchInputMapper::abortPointerSimple(nsecs_t when, uint32_t policyFlags) {
} }
void TouchInputMapper::dispatchMotion(nsecs_t when, uint32_t policyFlags, uint32_t source, void TouchInputMapper::dispatchMotion(nsecs_t when, uint32_t policyFlags, uint32_t source,
int32_t action, int32_t flags, int32_t metaState, int32_t buttonState, int32_t edgeFlags, int32_t action, int32_t actionButton, int32_t flags,
int32_t metaState, int32_t buttonState, int32_t edgeFlags,
const PointerProperties* properties, const PointerCoords* coords, const PointerProperties* properties, const PointerCoords* coords,
const uint32_t* idToIndex, BitSet32 idBits, const uint32_t* idToIndex, BitSet32 idBits, int32_t changedId,
int32_t changedId, float xPrecision, float yPrecision, nsecs_t downTime) { float xPrecision, float yPrecision, nsecs_t downTime) {
PointerCoords pointerCoords[MAX_POINTERS]; PointerCoords pointerCoords[MAX_POINTERS];
PointerProperties pointerProperties[MAX_POINTERS]; PointerProperties pointerProperties[MAX_POINTERS];
uint32_t pointerCount = 0; uint32_t pointerCount = 0;
@ -5962,7 +6044,7 @@ void TouchInputMapper::dispatchMotion(nsecs_t when, uint32_t policyFlags, uint32
} }
NotifyMotionArgs args(when, getDeviceId(), source, policyFlags, NotifyMotionArgs args(when, getDeviceId(), source, policyFlags,
action, flags, metaState, buttonState, edgeFlags, action, actionButton, flags, metaState, buttonState, edgeFlags,
mViewport.displayId, pointerCount, pointerProperties, pointerCoords, mViewport.displayId, pointerCount, pointerProperties, pointerCoords,
xPrecision, yPrecision, downTime); xPrecision, yPrecision, downTime);
getListener()->notifyMotion(&args); getListener()->notifyMotion(&args);
@ -6879,7 +6961,7 @@ void JoystickInputMapper::sync(nsecs_t when, bool force) {
uint32_t policyFlags = 0; uint32_t policyFlags = 0;
NotifyMotionArgs args(when, getDeviceId(), AINPUT_SOURCE_JOYSTICK, policyFlags, NotifyMotionArgs args(when, getDeviceId(), AINPUT_SOURCE_JOYSTICK, policyFlags,
AMOTION_EVENT_ACTION_MOVE, 0, metaState, buttonState, AMOTION_EVENT_EDGE_FLAG_NONE, AMOTION_EVENT_ACTION_MOVE, 0, 0, metaState, buttonState, AMOTION_EVENT_EDGE_FLAG_NONE,
ADISPLAY_ID_NONE, 1, &pointerProperties, &pointerCoords, 0, 0, 0); ADISPLAY_ID_NONE, 1, &pointerProperties, &pointerCoords, 0, 0, 0);
getListener()->notifyMotion(&args); getListener()->notifyMotion(&args);
} }

View File

@ -1432,11 +1432,14 @@ protected:
BitSet32 stylusIdBits; BitSet32 stylusIdBits;
BitSet32 mouseIdBits; BitSet32 mouseIdBits;
int32_t buttonState;
void copyFrom(const CookedState& other) { void copyFrom(const CookedState& other) {
cookedPointerData.copyFrom(other.cookedPointerData); cookedPointerData.copyFrom(other.cookedPointerData);
fingerIdBits = other.fingerIdBits; fingerIdBits = other.fingerIdBits;
stylusIdBits = other.stylusIdBits; stylusIdBits = other.stylusIdBits;
mouseIdBits = other.mouseIdBits; mouseIdBits = other.mouseIdBits;
buttonState = other.buttonState;
} }
void clear() { void clear() {
@ -1444,6 +1447,7 @@ protected:
fingerIdBits.clear(); fingerIdBits.clear();
stylusIdBits.clear(); stylusIdBits.clear();
mouseIdBits.clear(); mouseIdBits.clear();
buttonState = 0;
} }
}; };
@ -1794,6 +1798,9 @@ private:
void dispatchTouches(nsecs_t when, uint32_t policyFlags); void dispatchTouches(nsecs_t when, uint32_t policyFlags);
void dispatchHoverExit(nsecs_t when, uint32_t policyFlags); void dispatchHoverExit(nsecs_t when, uint32_t policyFlags);
void dispatchHoverEnterAndMove(nsecs_t when, uint32_t policyFlags); void dispatchHoverEnterAndMove(nsecs_t when, uint32_t policyFlags);
void dispatchButtonRelease(nsecs_t when, uint32_t policyFlags);
void dispatchButtonPress(nsecs_t when, uint32_t policyFlags);
const BitSet32& findActiveIdBits(const CookedPointerData& cookedPointerData);
void cookPointerData(); void cookPointerData();
void dispatchPointerUsage(nsecs_t when, uint32_t policyFlags, PointerUsage pointerUsage); void dispatchPointerUsage(nsecs_t when, uint32_t policyFlags, PointerUsage pointerUsage);
@ -1824,8 +1831,8 @@ private:
// method will take care of setting the index and transmuting the action to DOWN or UP // method will take care of setting the index and transmuting the action to DOWN or UP
// it is the first / last pointer to go down / up. // it is the first / last pointer to go down / up.
void dispatchMotion(nsecs_t when, uint32_t policyFlags, uint32_t source, void dispatchMotion(nsecs_t when, uint32_t policyFlags, uint32_t source,
int32_t action, int32_t flags, int32_t metaState, int32_t buttonState, int32_t action, int32_t actionButton,
int32_t edgeFlags, int32_t flags, int32_t metaState, int32_t buttonState, int32_t edgeFlags,
const PointerProperties* properties, const PointerCoords* coords, const PointerProperties* properties, const PointerCoords* coords,
const uint32_t* idToIndex, BitSet32 idBits, const uint32_t* idToIndex, BitSet32 idBits,
int32_t changedId, float xPrecision, float yPrecision, nsecs_t downTime); int32_t changedId, float xPrecision, float yPrecision, nsecs_t downTime);

View File

@ -150,7 +150,7 @@ TEST_F(InputDispatcherTest, InjectInputEvent_ValidatesMotionEvents) {
// Rejects undefined motion actions. // Rejects undefined motion actions.
event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
/*action*/ -1, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, /*action*/ -1, 0, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
ARBITRARY_TIME, ARBITRARY_TIME, ARBITRARY_TIME, ARBITRARY_TIME,
/*pointerCount*/ 1, pointerProperties, pointerCoords); /*pointerCount*/ 1, pointerProperties, pointerCoords);
ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(
@ -161,7 +161,7 @@ TEST_F(InputDispatcherTest, InjectInputEvent_ValidatesMotionEvents) {
// Rejects pointer down with invalid index. // Rejects pointer down with invalid index.
event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 0, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
ARBITRARY_TIME, ARBITRARY_TIME, ARBITRARY_TIME, ARBITRARY_TIME,
/*pointerCount*/ 1, pointerProperties, pointerCoords); /*pointerCount*/ 1, pointerProperties, pointerCoords);
ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(
@ -171,7 +171,7 @@ TEST_F(InputDispatcherTest, InjectInputEvent_ValidatesMotionEvents) {
event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
AMOTION_EVENT_ACTION_POINTER_DOWN | (-1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), AMOTION_EVENT_ACTION_POINTER_DOWN | (-1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 0, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
ARBITRARY_TIME, ARBITRARY_TIME, ARBITRARY_TIME, ARBITRARY_TIME,
/*pointerCount*/ 1, pointerProperties, pointerCoords); /*pointerCount*/ 1, pointerProperties, pointerCoords);
ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(
@ -182,7 +182,7 @@ TEST_F(InputDispatcherTest, InjectInputEvent_ValidatesMotionEvents) {
// Rejects pointer up with invalid index. // Rejects pointer up with invalid index.
event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 0, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
ARBITRARY_TIME, ARBITRARY_TIME, ARBITRARY_TIME, ARBITRARY_TIME,
/*pointerCount*/ 1, pointerProperties, pointerCoords); /*pointerCount*/ 1, pointerProperties, pointerCoords);
ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(
@ -192,7 +192,7 @@ TEST_F(InputDispatcherTest, InjectInputEvent_ValidatesMotionEvents) {
event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
AMOTION_EVENT_ACTION_POINTER_UP | (-1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT), AMOTION_EVENT_ACTION_POINTER_UP | (-1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
0, 0, AMETA_NONE, 0, 0, 0, 0, 0, 0, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
ARBITRARY_TIME, ARBITRARY_TIME, ARBITRARY_TIME, ARBITRARY_TIME,
/*pointerCount*/ 1, pointerProperties, pointerCoords); /*pointerCount*/ 1, pointerProperties, pointerCoords);
ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(
@ -202,7 +202,7 @@ TEST_F(InputDispatcherTest, InjectInputEvent_ValidatesMotionEvents) {
// Rejects motion events with invalid number of pointers. // Rejects motion events with invalid number of pointers.
event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, AMOTION_EVENT_ACTION_DOWN, 0, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
ARBITRARY_TIME, ARBITRARY_TIME, ARBITRARY_TIME, ARBITRARY_TIME,
/*pointerCount*/ 0, pointerProperties, pointerCoords); /*pointerCount*/ 0, pointerProperties, pointerCoords);
ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(
@ -211,7 +211,7 @@ TEST_F(InputDispatcherTest, InjectInputEvent_ValidatesMotionEvents) {
<< "Should reject motion events with 0 pointers."; << "Should reject motion events with 0 pointers.";
event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, AMOTION_EVENT_ACTION_DOWN, 0, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
ARBITRARY_TIME, ARBITRARY_TIME, ARBITRARY_TIME, ARBITRARY_TIME,
/*pointerCount*/ MAX_POINTERS + 1, pointerProperties, pointerCoords); /*pointerCount*/ MAX_POINTERS + 1, pointerProperties, pointerCoords);
ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(
@ -222,7 +222,7 @@ TEST_F(InputDispatcherTest, InjectInputEvent_ValidatesMotionEvents) {
// Rejects motion events with invalid pointer ids. // Rejects motion events with invalid pointer ids.
pointerProperties[0].id = -1; pointerProperties[0].id = -1;
event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, AMOTION_EVENT_ACTION_DOWN, 0, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
ARBITRARY_TIME, ARBITRARY_TIME, ARBITRARY_TIME, ARBITRARY_TIME,
/*pointerCount*/ 1, pointerProperties, pointerCoords); /*pointerCount*/ 1, pointerProperties, pointerCoords);
ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(
@ -232,7 +232,7 @@ TEST_F(InputDispatcherTest, InjectInputEvent_ValidatesMotionEvents) {
pointerProperties[0].id = MAX_POINTER_ID + 1; pointerProperties[0].id = MAX_POINTER_ID + 1;
event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, AMOTION_EVENT_ACTION_DOWN, 0, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
ARBITRARY_TIME, ARBITRARY_TIME, ARBITRARY_TIME, ARBITRARY_TIME,
/*pointerCount*/ 1, pointerProperties, pointerCoords); /*pointerCount*/ 1, pointerProperties, pointerCoords);
ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(
@ -244,7 +244,7 @@ TEST_F(InputDispatcherTest, InjectInputEvent_ValidatesMotionEvents) {
pointerProperties[0].id = 1; pointerProperties[0].id = 1;
pointerProperties[1].id = 1; pointerProperties[1].id = 1;
event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN, event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0, AMOTION_EVENT_ACTION_DOWN, 0, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
ARBITRARY_TIME, ARBITRARY_TIME, ARBITRARY_TIME, ARBITRARY_TIME,
/*pointerCount*/ 2, pointerProperties, pointerCoords); /*pointerCount*/ 2, pointerProperties, pointerCoords);
ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent( ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(