Loading include/input/InputEventBuilders.h +88 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ #include <android/input.h> #include <attestation/HmacKeyManager.h> #include <input/Input.h> #include <input/InputTransport.h> #include <ui/LogicalDisplayId.h> #include <utils/Timers.h> // for nsecs_t, systemTime #include <vector> Loading @@ -44,6 +46,11 @@ public: PointerBuilder& y(float y) { return axis(AMOTION_EVENT_AXIS_Y, y); } PointerBuilder& isResampled(bool isResampled) { mCoords.isResampled = isResampled; return *this; } PointerBuilder& axis(int32_t axis, float value) { mCoords.setAxisValue(axis, value); return *this; Loading @@ -58,6 +65,87 @@ private: PointerCoords mCoords; }; class InputMessageBuilder { public: InputMessageBuilder(InputMessage::Type type, uint32_t seq) : mType{type}, mSeq{seq} {} InputMessageBuilder& eventId(int32_t eventId) { mEventId = eventId; return *this; } InputMessageBuilder& eventTime(nsecs_t eventTime) { mEventTime = eventTime; return *this; } InputMessageBuilder& deviceId(DeviceId deviceId) { mDeviceId = deviceId; return *this; } InputMessageBuilder& source(int32_t source) { mSource = source; return *this; } InputMessageBuilder& displayId(ui::LogicalDisplayId displayId) { mDisplayId = displayId; return *this; } InputMessageBuilder& action(int32_t action) { mAction = action; return *this; } InputMessageBuilder& downTime(nsecs_t downTime) { mDownTime = downTime; return *this; } InputMessageBuilder& pointer(PointerBuilder pointerBuilder) { mPointers.push_back(pointerBuilder); return *this; } InputMessage build() const { InputMessage message{}; // Header message.header.type = mType; message.header.seq = mSeq; // Body message.body.motion.eventId = mEventId; message.body.motion.pointerCount = mPointers.size(); message.body.motion.eventTime = mEventTime; message.body.motion.deviceId = mDeviceId; message.body.motion.source = mSource; message.body.motion.displayId = mDisplayId.val(); message.body.motion.action = mAction; message.body.motion.downTime = mDownTime; for (size_t i = 0; i < mPointers.size(); ++i) { message.body.motion.pointers[i].properties = mPointers[i].buildProperties(); message.body.motion.pointers[i].coords = mPointers[i].buildCoords(); } return message; } private: const InputMessage::Type mType; const uint32_t mSeq; int32_t mEventId{InputEvent::nextId()}; nsecs_t mEventTime{systemTime(SYSTEM_TIME_MONOTONIC)}; DeviceId mDeviceId{DEFAULT_DEVICE_ID}; int32_t mSource{AINPUT_SOURCE_TOUCHSCREEN}; ui::LogicalDisplayId mDisplayId{ui::LogicalDisplayId::DEFAULT}; int32_t mAction{AMOTION_EVENT_ACTION_MOVE}; nsecs_t mDownTime{mEventTime}; std::vector<PointerBuilder> mPointers; }; class MotionEventBuilder { public: MotionEventBuilder(int32_t action, int32_t source) { Loading libs/input/tests/Resampler_test.cpp +11 −15 Original line number Diff line number Diff line Loading @@ -70,22 +70,18 @@ struct InputSample { }; InputSample::operator InputMessage() const { InputMessage message; message.header.type = InputMessage::Type::MOTION; message.body.motion.pointerCount = pointers.size(); message.body.motion.eventTime = static_cast<std::chrono::nanoseconds>(eventTime).count(); message.body.motion.source = AINPUT_SOURCE_CLASS_POINTER; message.body.motion.downTime = 0; const uint32_t pointerCount = message.body.motion.pointerCount; for (uint32_t i = 0; i < pointerCount; ++i) { message.body.motion.pointers[i].properties.id = pointers[i].id; message.body.motion.pointers[i].properties.toolType = pointers[i].toolType; message.body.motion.pointers[i].coords.setAxisValue(AMOTION_EVENT_AXIS_X, pointers[i].x); message.body.motion.pointers[i].coords.setAxisValue(AMOTION_EVENT_AXIS_Y, pointers[i].y); message.body.motion.pointers[i].coords.isResampled = pointers[i].isResampled; } return message; InputMessageBuilder messageBuilder = InputMessageBuilder{InputMessage::Type::MOTION, /*seq=*/0} .eventTime(std::chrono::nanoseconds{eventTime}.count()) .source(AINPUT_SOURCE_TOUCHSCREEN) .downTime(0); for (const Pointer& pointer : pointers) { messageBuilder.pointer( PointerBuilder{pointer.id, pointer.toolType}.x(pointer.x).y(pointer.y).isResampled( pointer.isResampled)); } return messageBuilder.build(); } struct InputStream { Loading Loading
include/input/InputEventBuilders.h +88 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ #include <android/input.h> #include <attestation/HmacKeyManager.h> #include <input/Input.h> #include <input/InputTransport.h> #include <ui/LogicalDisplayId.h> #include <utils/Timers.h> // for nsecs_t, systemTime #include <vector> Loading @@ -44,6 +46,11 @@ public: PointerBuilder& y(float y) { return axis(AMOTION_EVENT_AXIS_Y, y); } PointerBuilder& isResampled(bool isResampled) { mCoords.isResampled = isResampled; return *this; } PointerBuilder& axis(int32_t axis, float value) { mCoords.setAxisValue(axis, value); return *this; Loading @@ -58,6 +65,87 @@ private: PointerCoords mCoords; }; class InputMessageBuilder { public: InputMessageBuilder(InputMessage::Type type, uint32_t seq) : mType{type}, mSeq{seq} {} InputMessageBuilder& eventId(int32_t eventId) { mEventId = eventId; return *this; } InputMessageBuilder& eventTime(nsecs_t eventTime) { mEventTime = eventTime; return *this; } InputMessageBuilder& deviceId(DeviceId deviceId) { mDeviceId = deviceId; return *this; } InputMessageBuilder& source(int32_t source) { mSource = source; return *this; } InputMessageBuilder& displayId(ui::LogicalDisplayId displayId) { mDisplayId = displayId; return *this; } InputMessageBuilder& action(int32_t action) { mAction = action; return *this; } InputMessageBuilder& downTime(nsecs_t downTime) { mDownTime = downTime; return *this; } InputMessageBuilder& pointer(PointerBuilder pointerBuilder) { mPointers.push_back(pointerBuilder); return *this; } InputMessage build() const { InputMessage message{}; // Header message.header.type = mType; message.header.seq = mSeq; // Body message.body.motion.eventId = mEventId; message.body.motion.pointerCount = mPointers.size(); message.body.motion.eventTime = mEventTime; message.body.motion.deviceId = mDeviceId; message.body.motion.source = mSource; message.body.motion.displayId = mDisplayId.val(); message.body.motion.action = mAction; message.body.motion.downTime = mDownTime; for (size_t i = 0; i < mPointers.size(); ++i) { message.body.motion.pointers[i].properties = mPointers[i].buildProperties(); message.body.motion.pointers[i].coords = mPointers[i].buildCoords(); } return message; } private: const InputMessage::Type mType; const uint32_t mSeq; int32_t mEventId{InputEvent::nextId()}; nsecs_t mEventTime{systemTime(SYSTEM_TIME_MONOTONIC)}; DeviceId mDeviceId{DEFAULT_DEVICE_ID}; int32_t mSource{AINPUT_SOURCE_TOUCHSCREEN}; ui::LogicalDisplayId mDisplayId{ui::LogicalDisplayId::DEFAULT}; int32_t mAction{AMOTION_EVENT_ACTION_MOVE}; nsecs_t mDownTime{mEventTime}; std::vector<PointerBuilder> mPointers; }; class MotionEventBuilder { public: MotionEventBuilder(int32_t action, int32_t source) { Loading
libs/input/tests/Resampler_test.cpp +11 −15 Original line number Diff line number Diff line Loading @@ -70,22 +70,18 @@ struct InputSample { }; InputSample::operator InputMessage() const { InputMessage message; message.header.type = InputMessage::Type::MOTION; message.body.motion.pointerCount = pointers.size(); message.body.motion.eventTime = static_cast<std::chrono::nanoseconds>(eventTime).count(); message.body.motion.source = AINPUT_SOURCE_CLASS_POINTER; message.body.motion.downTime = 0; const uint32_t pointerCount = message.body.motion.pointerCount; for (uint32_t i = 0; i < pointerCount; ++i) { message.body.motion.pointers[i].properties.id = pointers[i].id; message.body.motion.pointers[i].properties.toolType = pointers[i].toolType; message.body.motion.pointers[i].coords.setAxisValue(AMOTION_EVENT_AXIS_X, pointers[i].x); message.body.motion.pointers[i].coords.setAxisValue(AMOTION_EVENT_AXIS_Y, pointers[i].y); message.body.motion.pointers[i].coords.isResampled = pointers[i].isResampled; } return message; InputMessageBuilder messageBuilder = InputMessageBuilder{InputMessage::Type::MOTION, /*seq=*/0} .eventTime(std::chrono::nanoseconds{eventTime}.count()) .source(AINPUT_SOURCE_TOUCHSCREEN) .downTime(0); for (const Pointer& pointer : pointers) { messageBuilder.pointer( PointerBuilder{pointer.id, pointer.toolType}.x(pointer.x).y(pointer.y).isResampled( pointer.isResampled)); } return messageBuilder.build(); } struct InputStream { Loading