Loading services/inputflinger/dispatcher/InputDispatcher.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -4531,7 +4531,7 @@ InputEventInjectionResult InputDispatcher::injectInputEvent(const InputEvent* ev // the injected event, it is responsible for setting POLICY_FLAG_INJECTED_FROM_ACCESSIBILITY. // For those events, we will set FLAG_IS_ACCESSIBILITY_EVENT to allow apps to distinguish them // from events that originate from actual hardware. int32_t resolvedDeviceId = VIRTUAL_KEYBOARD_ID; DeviceId resolvedDeviceId = VIRTUAL_KEYBOARD_ID; if (policyFlags & POLICY_FLAG_FILTERED) { resolvedDeviceId = event->getDeviceId(); } Loading services/inputflinger/dispatcher/InputState.cpp +7 −2 Original line number Diff line number Diff line Loading @@ -83,6 +83,11 @@ bool InputState::trackKey(const KeyEntry& entry, int32_t action, int32_t flags) } } /** * Return: * true if the incoming event was correctly tracked, * false if the incoming event should be dropped. */ bool InputState::trackMotion(const MotionEntry& entry, int32_t action, int32_t flags) { int32_t actionMasked = action & AMOTION_EVENT_ACTION_MASK; switch (actionMasked) { Loading Loading @@ -310,7 +315,7 @@ std::vector<std::unique_ptr<EventEntry>> InputState::synthesizePointerDownEvents nsecs_t currentTime) { std::vector<std::unique_ptr<EventEntry>> events; for (MotionMemento& memento : mMotionMementos) { if (!(memento.source & AINPUT_SOURCE_CLASS_POINTER)) { if (!isFromSource(memento.source, AINPUT_SOURCE_CLASS_POINTER)) { continue; } Loading Loading @@ -443,7 +448,7 @@ void InputState::mergePointerStateTo(InputState& other) { MotionMemento& memento = mMotionMementos[i]; // Since we support split pointers we need to merge touch events // from the same source + device + screen. if (memento.source & AINPUT_SOURCE_CLASS_POINTER) { if (isFromSource(memento.source, AINPUT_SOURCE_CLASS_POINTER)) { bool merged = false; for (size_t j = 0; j < other.mMotionMementos.size(); j++) { MotionMemento& otherMemento = other.mMotionMementos[j]; Loading services/inputflinger/dispatcher/InputTarget.cpp +6 −1 Original line number Diff line number Diff line Loading @@ -16,7 +16,9 @@ #include "InputTarget.h" #include <android-base/logging.h> #include <android-base/stringprintf.h> #include <input/PrintTools.h> #include <inttypes.h> #include <string> Loading @@ -34,7 +36,10 @@ void InputTarget::addPointers(std::bitset<MAX_POINTER_ID + 1> newPointerIds, } // Ensure that the new set of pointers doesn't overlap with the current set of pointers. LOG_ALWAYS_FATAL_IF((pointerIds & newPointerIds).any()); if ((pointerIds & newPointerIds).any()) { LOG(FATAL) << __func__ << " - overlap with incoming pointers " << bitsetToString(newPointerIds) << " in " << *this; } pointerIds |= newPointerIds; for (size_t i = 0; i < newPointerIds.size(); i++) { Loading services/inputflinger/tests/InputDispatcher_test.cpp +22 −11 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ #include <gmock/gmock.h> #include <gtest/gtest.h> #include <input/Input.h> #include <input/PrintTools.h> #include <linux/input.h> #include <sys/epoll.h> Loading @@ -50,6 +51,8 @@ namespace android::inputdispatcher { using namespace ftl::flag_operators; using testing::AllOf; namespace { // An arbitrary time value. static constexpr nsecs_t ARBITRARY_TIME = 1234; Loading Loading @@ -136,6 +139,10 @@ struct PointF { auto operator<=>(const PointF&) const = default; }; inline std::string pointFToString(const PointF& p) { return std::string("(") + std::to_string(p.x) + ", " + std::to_string(p.y) + ")"; } /** * Return a DOWN key event with KEYCODE_A. */ Loading @@ -148,13 +155,8 @@ static KeyEvent getTestKeyEvent() { return event; } static void assertMotionAction(int32_t expectedAction, int32_t receivedAction) { ASSERT_EQ(expectedAction, receivedAction) << "expected " << MotionEvent::actionToString(expectedAction) << ", got " << MotionEvent::actionToString(receivedAction); } MATCHER_P(WithDownTime, downTime, "InputEvent with specified downTime") { *result_listener << "expected downTime " << downTime << ", but got " << arg.getDownTime(); return arg.getDownTime() == downTime; } Loading @@ -165,6 +167,7 @@ MATCHER_P(WithSource, source, "InputEvent with specified source") { } MATCHER_P(WithFlags, flags, "InputEvent with specified flags") { *result_listener << "expected flags " << std::hex << flags << ", but got " << arg.getFlags(); return arg.getFlags() == flags; } Loading @@ -173,10 +176,16 @@ MATCHER_P2(WithCoords, x, y, "MotionEvent with specified coordinates") { *result_listener << "Expected 1 pointer, got " << arg.getPointerCount(); return false; } return arg.getX(/*pointerIndex=*/0) == x && arg.getY(/*pointerIndex=*/0) == y; const float receivedX = arg.getX(/*pointerIndex=*/0); const float receivedY = arg.getY(/*pointerIndex=*/0); *result_listener << "expected coords (" << x << ", " << y << "), but got (" << receivedX << ", " << receivedY << ")"; return receivedX == x && receivedY == y; } MATCHER_P(WithPointerCount, pointerCount, "MotionEvent with specified number of pointers") { *result_listener << "expected pointerCount " << pointerCount << ", but got " << arg.getPointerCount(); return arg.getPointerCount() == pointerCount; } Loading @@ -187,6 +196,8 @@ MATCHER_P(WithPointers, pointers, "MotionEvent with specified pointers") { const int32_t pointerId = arg.getPointerId(pointerIndex); actualPointers[pointerId] = {arg.getX(pointerIndex), arg.getY(pointerIndex)}; } *result_listener << "expected pointers " << dumpMap(pointers, constToString, pointFToString) << ", but got " << dumpMap(actualPointers, constToString, pointFToString); return pointers == actualPointers; } Loading Loading @@ -617,6 +628,7 @@ private: mFilteredEvent = nullptr; } }; } // namespace // --- InputDispatcherTest --- Loading Loading @@ -959,7 +971,7 @@ public: switch (expectedEventType) { case InputEventType::KEY: { const KeyEvent& keyEvent = static_cast<const KeyEvent&>(*event); EXPECT_EQ(expectedAction, keyEvent.getAction()); ASSERT_THAT(keyEvent, WithKeyAction(expectedAction)); if (expectedFlags.has_value()) { EXPECT_EQ(expectedFlags.value(), keyEvent.getFlags()); } Loading @@ -967,8 +979,7 @@ public: } case InputEventType::MOTION: { const MotionEvent& motionEvent = static_cast<const MotionEvent&>(*event); assertMotionAction(expectedAction, motionEvent.getAction()); ASSERT_THAT(motionEvent, WithMotionAction(expectedAction)); if (expectedFlags.has_value()) { EXPECT_EQ(expectedFlags.value(), motionEvent.getFlags()); } Loading Loading @@ -6467,7 +6478,7 @@ protected: ASSERT_NE(nullptr, motionEvent) << name.c_str() << ": consumer should have returned non-NULL event."; assertMotionAction(expectedAction, motionEvent->getAction()); ASSERT_THAT(*motionEvent, WithMotionAction(expectedAction)); ASSERT_EQ(points.size(), motionEvent->getPointerCount()); for (size_t i = 0; i < points.size(); i++) { Loading Loading
services/inputflinger/dispatcher/InputDispatcher.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -4531,7 +4531,7 @@ InputEventInjectionResult InputDispatcher::injectInputEvent(const InputEvent* ev // the injected event, it is responsible for setting POLICY_FLAG_INJECTED_FROM_ACCESSIBILITY. // For those events, we will set FLAG_IS_ACCESSIBILITY_EVENT to allow apps to distinguish them // from events that originate from actual hardware. int32_t resolvedDeviceId = VIRTUAL_KEYBOARD_ID; DeviceId resolvedDeviceId = VIRTUAL_KEYBOARD_ID; if (policyFlags & POLICY_FLAG_FILTERED) { resolvedDeviceId = event->getDeviceId(); } Loading
services/inputflinger/dispatcher/InputState.cpp +7 −2 Original line number Diff line number Diff line Loading @@ -83,6 +83,11 @@ bool InputState::trackKey(const KeyEntry& entry, int32_t action, int32_t flags) } } /** * Return: * true if the incoming event was correctly tracked, * false if the incoming event should be dropped. */ bool InputState::trackMotion(const MotionEntry& entry, int32_t action, int32_t flags) { int32_t actionMasked = action & AMOTION_EVENT_ACTION_MASK; switch (actionMasked) { Loading Loading @@ -310,7 +315,7 @@ std::vector<std::unique_ptr<EventEntry>> InputState::synthesizePointerDownEvents nsecs_t currentTime) { std::vector<std::unique_ptr<EventEntry>> events; for (MotionMemento& memento : mMotionMementos) { if (!(memento.source & AINPUT_SOURCE_CLASS_POINTER)) { if (!isFromSource(memento.source, AINPUT_SOURCE_CLASS_POINTER)) { continue; } Loading Loading @@ -443,7 +448,7 @@ void InputState::mergePointerStateTo(InputState& other) { MotionMemento& memento = mMotionMementos[i]; // Since we support split pointers we need to merge touch events // from the same source + device + screen. if (memento.source & AINPUT_SOURCE_CLASS_POINTER) { if (isFromSource(memento.source, AINPUT_SOURCE_CLASS_POINTER)) { bool merged = false; for (size_t j = 0; j < other.mMotionMementos.size(); j++) { MotionMemento& otherMemento = other.mMotionMementos[j]; Loading
services/inputflinger/dispatcher/InputTarget.cpp +6 −1 Original line number Diff line number Diff line Loading @@ -16,7 +16,9 @@ #include "InputTarget.h" #include <android-base/logging.h> #include <android-base/stringprintf.h> #include <input/PrintTools.h> #include <inttypes.h> #include <string> Loading @@ -34,7 +36,10 @@ void InputTarget::addPointers(std::bitset<MAX_POINTER_ID + 1> newPointerIds, } // Ensure that the new set of pointers doesn't overlap with the current set of pointers. LOG_ALWAYS_FATAL_IF((pointerIds & newPointerIds).any()); if ((pointerIds & newPointerIds).any()) { LOG(FATAL) << __func__ << " - overlap with incoming pointers " << bitsetToString(newPointerIds) << " in " << *this; } pointerIds |= newPointerIds; for (size_t i = 0; i < newPointerIds.size(); i++) { Loading
services/inputflinger/tests/InputDispatcher_test.cpp +22 −11 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ #include <gmock/gmock.h> #include <gtest/gtest.h> #include <input/Input.h> #include <input/PrintTools.h> #include <linux/input.h> #include <sys/epoll.h> Loading @@ -50,6 +51,8 @@ namespace android::inputdispatcher { using namespace ftl::flag_operators; using testing::AllOf; namespace { // An arbitrary time value. static constexpr nsecs_t ARBITRARY_TIME = 1234; Loading Loading @@ -136,6 +139,10 @@ struct PointF { auto operator<=>(const PointF&) const = default; }; inline std::string pointFToString(const PointF& p) { return std::string("(") + std::to_string(p.x) + ", " + std::to_string(p.y) + ")"; } /** * Return a DOWN key event with KEYCODE_A. */ Loading @@ -148,13 +155,8 @@ static KeyEvent getTestKeyEvent() { return event; } static void assertMotionAction(int32_t expectedAction, int32_t receivedAction) { ASSERT_EQ(expectedAction, receivedAction) << "expected " << MotionEvent::actionToString(expectedAction) << ", got " << MotionEvent::actionToString(receivedAction); } MATCHER_P(WithDownTime, downTime, "InputEvent with specified downTime") { *result_listener << "expected downTime " << downTime << ", but got " << arg.getDownTime(); return arg.getDownTime() == downTime; } Loading @@ -165,6 +167,7 @@ MATCHER_P(WithSource, source, "InputEvent with specified source") { } MATCHER_P(WithFlags, flags, "InputEvent with specified flags") { *result_listener << "expected flags " << std::hex << flags << ", but got " << arg.getFlags(); return arg.getFlags() == flags; } Loading @@ -173,10 +176,16 @@ MATCHER_P2(WithCoords, x, y, "MotionEvent with specified coordinates") { *result_listener << "Expected 1 pointer, got " << arg.getPointerCount(); return false; } return arg.getX(/*pointerIndex=*/0) == x && arg.getY(/*pointerIndex=*/0) == y; const float receivedX = arg.getX(/*pointerIndex=*/0); const float receivedY = arg.getY(/*pointerIndex=*/0); *result_listener << "expected coords (" << x << ", " << y << "), but got (" << receivedX << ", " << receivedY << ")"; return receivedX == x && receivedY == y; } MATCHER_P(WithPointerCount, pointerCount, "MotionEvent with specified number of pointers") { *result_listener << "expected pointerCount " << pointerCount << ", but got " << arg.getPointerCount(); return arg.getPointerCount() == pointerCount; } Loading @@ -187,6 +196,8 @@ MATCHER_P(WithPointers, pointers, "MotionEvent with specified pointers") { const int32_t pointerId = arg.getPointerId(pointerIndex); actualPointers[pointerId] = {arg.getX(pointerIndex), arg.getY(pointerIndex)}; } *result_listener << "expected pointers " << dumpMap(pointers, constToString, pointFToString) << ", but got " << dumpMap(actualPointers, constToString, pointFToString); return pointers == actualPointers; } Loading Loading @@ -617,6 +628,7 @@ private: mFilteredEvent = nullptr; } }; } // namespace // --- InputDispatcherTest --- Loading Loading @@ -959,7 +971,7 @@ public: switch (expectedEventType) { case InputEventType::KEY: { const KeyEvent& keyEvent = static_cast<const KeyEvent&>(*event); EXPECT_EQ(expectedAction, keyEvent.getAction()); ASSERT_THAT(keyEvent, WithKeyAction(expectedAction)); if (expectedFlags.has_value()) { EXPECT_EQ(expectedFlags.value(), keyEvent.getFlags()); } Loading @@ -967,8 +979,7 @@ public: } case InputEventType::MOTION: { const MotionEvent& motionEvent = static_cast<const MotionEvent&>(*event); assertMotionAction(expectedAction, motionEvent.getAction()); ASSERT_THAT(motionEvent, WithMotionAction(expectedAction)); if (expectedFlags.has_value()) { EXPECT_EQ(expectedFlags.value(), motionEvent.getFlags()); } Loading Loading @@ -6467,7 +6478,7 @@ protected: ASSERT_NE(nullptr, motionEvent) << name.c_str() << ": consumer should have returned non-NULL event."; assertMotionAction(expectedAction, motionEvent->getAction()); ASSERT_THAT(*motionEvent, WithMotionAction(expectedAction)); ASSERT_EQ(points.size(), motionEvent->getPointerCount()); for (size_t i = 0; i < points.size(); i++) { Loading