Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 381aea59 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add InputMessageBuilder to InputEventBuilders.h" into main

parents d822d11f 7dfaa32f
Loading
Loading
Loading
Loading
+88 −0
Original line number Diff line number Diff line
@@ -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>
@@ -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;
@@ -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) {
+11 −15
Original line number Diff line number Diff line
@@ -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 {