xref: /aosp_15_r20/frameworks/native/include/input/InputEventBuilders.h (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright 2023 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker #pragma once
18*38e8c45fSAndroid Build Coastguard Worker 
19*38e8c45fSAndroid Build Coastguard Worker #include <android/input.h>
20*38e8c45fSAndroid Build Coastguard Worker #include <attestation/HmacKeyManager.h>
21*38e8c45fSAndroid Build Coastguard Worker #include <input/Input.h>
22*38e8c45fSAndroid Build Coastguard Worker #include <input/InputTransport.h>
23*38e8c45fSAndroid Build Coastguard Worker #include <ui/LogicalDisplayId.h>
24*38e8c45fSAndroid Build Coastguard Worker #include <ui/Transform.h>
25*38e8c45fSAndroid Build Coastguard Worker #include <utils/Timers.h> // for nsecs_t, systemTime
26*38e8c45fSAndroid Build Coastguard Worker 
27*38e8c45fSAndroid Build Coastguard Worker #include <vector>
28*38e8c45fSAndroid Build Coastguard Worker 
29*38e8c45fSAndroid Build Coastguard Worker namespace android {
30*38e8c45fSAndroid Build Coastguard Worker 
31*38e8c45fSAndroid Build Coastguard Worker // An arbitrary device id.
32*38e8c45fSAndroid Build Coastguard Worker static constexpr uint32_t DEFAULT_DEVICE_ID = 1;
33*38e8c45fSAndroid Build Coastguard Worker 
34*38e8c45fSAndroid Build Coastguard Worker // The default policy flags to use for event injection by tests.
35*38e8c45fSAndroid Build Coastguard Worker static constexpr uint32_t DEFAULT_POLICY_FLAGS = POLICY_FLAG_FILTERED | POLICY_FLAG_PASS_TO_USER;
36*38e8c45fSAndroid Build Coastguard Worker 
37*38e8c45fSAndroid Build Coastguard Worker class PointerBuilder {
38*38e8c45fSAndroid Build Coastguard Worker public:
PointerBuilder(int32_t id,ToolType toolType)39*38e8c45fSAndroid Build Coastguard Worker     PointerBuilder(int32_t id, ToolType toolType) {
40*38e8c45fSAndroid Build Coastguard Worker         mProperties.clear();
41*38e8c45fSAndroid Build Coastguard Worker         mProperties.id = id;
42*38e8c45fSAndroid Build Coastguard Worker         mProperties.toolType = toolType;
43*38e8c45fSAndroid Build Coastguard Worker         mCoords.clear();
44*38e8c45fSAndroid Build Coastguard Worker     }
45*38e8c45fSAndroid Build Coastguard Worker 
x(float x)46*38e8c45fSAndroid Build Coastguard Worker     PointerBuilder& x(float x) { return axis(AMOTION_EVENT_AXIS_X, x); }
47*38e8c45fSAndroid Build Coastguard Worker 
y(float y)48*38e8c45fSAndroid Build Coastguard Worker     PointerBuilder& y(float y) { return axis(AMOTION_EVENT_AXIS_Y, y); }
49*38e8c45fSAndroid Build Coastguard Worker 
isResampled(bool isResampled)50*38e8c45fSAndroid Build Coastguard Worker     PointerBuilder& isResampled(bool isResampled) {
51*38e8c45fSAndroid Build Coastguard Worker         mCoords.isResampled = isResampled;
52*38e8c45fSAndroid Build Coastguard Worker         return *this;
53*38e8c45fSAndroid Build Coastguard Worker     }
54*38e8c45fSAndroid Build Coastguard Worker 
axis(int32_t axis,float value)55*38e8c45fSAndroid Build Coastguard Worker     PointerBuilder& axis(int32_t axis, float value) {
56*38e8c45fSAndroid Build Coastguard Worker         mCoords.setAxisValue(axis, value);
57*38e8c45fSAndroid Build Coastguard Worker         return *this;
58*38e8c45fSAndroid Build Coastguard Worker     }
59*38e8c45fSAndroid Build Coastguard Worker 
buildProperties()60*38e8c45fSAndroid Build Coastguard Worker     PointerProperties buildProperties() const { return mProperties; }
61*38e8c45fSAndroid Build Coastguard Worker 
buildCoords()62*38e8c45fSAndroid Build Coastguard Worker     PointerCoords buildCoords() const { return mCoords; }
63*38e8c45fSAndroid Build Coastguard Worker 
64*38e8c45fSAndroid Build Coastguard Worker private:
65*38e8c45fSAndroid Build Coastguard Worker     PointerProperties mProperties;
66*38e8c45fSAndroid Build Coastguard Worker     PointerCoords mCoords;
67*38e8c45fSAndroid Build Coastguard Worker };
68*38e8c45fSAndroid Build Coastguard Worker 
69*38e8c45fSAndroid Build Coastguard Worker class InputMessageBuilder {
70*38e8c45fSAndroid Build Coastguard Worker public:
InputMessageBuilder(InputMessage::Type type,uint32_t seq)71*38e8c45fSAndroid Build Coastguard Worker     InputMessageBuilder(InputMessage::Type type, uint32_t seq) : mType{type}, mSeq{seq} {}
72*38e8c45fSAndroid Build Coastguard Worker 
eventId(int32_t eventId)73*38e8c45fSAndroid Build Coastguard Worker     InputMessageBuilder& eventId(int32_t eventId) {
74*38e8c45fSAndroid Build Coastguard Worker         mEventId = eventId;
75*38e8c45fSAndroid Build Coastguard Worker         return *this;
76*38e8c45fSAndroid Build Coastguard Worker     }
77*38e8c45fSAndroid Build Coastguard Worker 
eventTime(nsecs_t eventTime)78*38e8c45fSAndroid Build Coastguard Worker     InputMessageBuilder& eventTime(nsecs_t eventTime) {
79*38e8c45fSAndroid Build Coastguard Worker         mEventTime = eventTime;
80*38e8c45fSAndroid Build Coastguard Worker         return *this;
81*38e8c45fSAndroid Build Coastguard Worker     }
82*38e8c45fSAndroid Build Coastguard Worker 
deviceId(DeviceId deviceId)83*38e8c45fSAndroid Build Coastguard Worker     InputMessageBuilder& deviceId(DeviceId deviceId) {
84*38e8c45fSAndroid Build Coastguard Worker         mDeviceId = deviceId;
85*38e8c45fSAndroid Build Coastguard Worker         return *this;
86*38e8c45fSAndroid Build Coastguard Worker     }
87*38e8c45fSAndroid Build Coastguard Worker 
source(int32_t source)88*38e8c45fSAndroid Build Coastguard Worker     InputMessageBuilder& source(int32_t source) {
89*38e8c45fSAndroid Build Coastguard Worker         mSource = source;
90*38e8c45fSAndroid Build Coastguard Worker         return *this;
91*38e8c45fSAndroid Build Coastguard Worker     }
92*38e8c45fSAndroid Build Coastguard Worker 
displayId(ui::LogicalDisplayId displayId)93*38e8c45fSAndroid Build Coastguard Worker     InputMessageBuilder& displayId(ui::LogicalDisplayId displayId) {
94*38e8c45fSAndroid Build Coastguard Worker         mDisplayId = displayId;
95*38e8c45fSAndroid Build Coastguard Worker         return *this;
96*38e8c45fSAndroid Build Coastguard Worker     }
97*38e8c45fSAndroid Build Coastguard Worker 
hmac(const std::array<uint8_t,32> & hmac)98*38e8c45fSAndroid Build Coastguard Worker     InputMessageBuilder& hmac(const std::array<uint8_t, 32>& hmac) {
99*38e8c45fSAndroid Build Coastguard Worker         mHmac = hmac;
100*38e8c45fSAndroid Build Coastguard Worker         return *this;
101*38e8c45fSAndroid Build Coastguard Worker     }
102*38e8c45fSAndroid Build Coastguard Worker 
action(int32_t action)103*38e8c45fSAndroid Build Coastguard Worker     InputMessageBuilder& action(int32_t action) {
104*38e8c45fSAndroid Build Coastguard Worker         mAction = action;
105*38e8c45fSAndroid Build Coastguard Worker         return *this;
106*38e8c45fSAndroid Build Coastguard Worker     }
107*38e8c45fSAndroid Build Coastguard Worker 
actionButton(int32_t actionButton)108*38e8c45fSAndroid Build Coastguard Worker     InputMessageBuilder& actionButton(int32_t actionButton) {
109*38e8c45fSAndroid Build Coastguard Worker         mActionButton = actionButton;
110*38e8c45fSAndroid Build Coastguard Worker         return *this;
111*38e8c45fSAndroid Build Coastguard Worker     }
112*38e8c45fSAndroid Build Coastguard Worker 
flags(int32_t flags)113*38e8c45fSAndroid Build Coastguard Worker     InputMessageBuilder& flags(int32_t flags) {
114*38e8c45fSAndroid Build Coastguard Worker         mFlags = flags;
115*38e8c45fSAndroid Build Coastguard Worker         return *this;
116*38e8c45fSAndroid Build Coastguard Worker     }
117*38e8c45fSAndroid Build Coastguard Worker 
metaState(int32_t metaState)118*38e8c45fSAndroid Build Coastguard Worker     InputMessageBuilder& metaState(int32_t metaState) {
119*38e8c45fSAndroid Build Coastguard Worker         mMetaState = metaState;
120*38e8c45fSAndroid Build Coastguard Worker         return *this;
121*38e8c45fSAndroid Build Coastguard Worker     }
122*38e8c45fSAndroid Build Coastguard Worker 
buttonState(int32_t buttonState)123*38e8c45fSAndroid Build Coastguard Worker     InputMessageBuilder& buttonState(int32_t buttonState) {
124*38e8c45fSAndroid Build Coastguard Worker         mButtonState = buttonState;
125*38e8c45fSAndroid Build Coastguard Worker         return *this;
126*38e8c45fSAndroid Build Coastguard Worker     }
127*38e8c45fSAndroid Build Coastguard Worker 
classification(MotionClassification classification)128*38e8c45fSAndroid Build Coastguard Worker     InputMessageBuilder& classification(MotionClassification classification) {
129*38e8c45fSAndroid Build Coastguard Worker         mClassification = classification;
130*38e8c45fSAndroid Build Coastguard Worker         return *this;
131*38e8c45fSAndroid Build Coastguard Worker     }
132*38e8c45fSAndroid Build Coastguard Worker 
edgeFlags(int32_t edgeFlags)133*38e8c45fSAndroid Build Coastguard Worker     InputMessageBuilder& edgeFlags(int32_t edgeFlags) {
134*38e8c45fSAndroid Build Coastguard Worker         mEdgeFlags = edgeFlags;
135*38e8c45fSAndroid Build Coastguard Worker         return *this;
136*38e8c45fSAndroid Build Coastguard Worker     }
137*38e8c45fSAndroid Build Coastguard Worker 
downTime(nsecs_t downTime)138*38e8c45fSAndroid Build Coastguard Worker     InputMessageBuilder& downTime(nsecs_t downTime) {
139*38e8c45fSAndroid Build Coastguard Worker         mDownTime = downTime;
140*38e8c45fSAndroid Build Coastguard Worker         return *this;
141*38e8c45fSAndroid Build Coastguard Worker     }
142*38e8c45fSAndroid Build Coastguard Worker 
transform(const ui::Transform & transform)143*38e8c45fSAndroid Build Coastguard Worker     InputMessageBuilder& transform(const ui::Transform& transform) {
144*38e8c45fSAndroid Build Coastguard Worker         mTransform = transform;
145*38e8c45fSAndroid Build Coastguard Worker         return *this;
146*38e8c45fSAndroid Build Coastguard Worker     }
147*38e8c45fSAndroid Build Coastguard Worker 
xPrecision(float xPrecision)148*38e8c45fSAndroid Build Coastguard Worker     InputMessageBuilder& xPrecision(float xPrecision) {
149*38e8c45fSAndroid Build Coastguard Worker         mXPrecision = xPrecision;
150*38e8c45fSAndroid Build Coastguard Worker         return *this;
151*38e8c45fSAndroid Build Coastguard Worker     }
152*38e8c45fSAndroid Build Coastguard Worker 
yPrecision(float yPrecision)153*38e8c45fSAndroid Build Coastguard Worker     InputMessageBuilder& yPrecision(float yPrecision) {
154*38e8c45fSAndroid Build Coastguard Worker         mYPrecision = yPrecision;
155*38e8c45fSAndroid Build Coastguard Worker         return *this;
156*38e8c45fSAndroid Build Coastguard Worker     }
157*38e8c45fSAndroid Build Coastguard Worker 
xCursorPosition(float xCursorPosition)158*38e8c45fSAndroid Build Coastguard Worker     InputMessageBuilder& xCursorPosition(float xCursorPosition) {
159*38e8c45fSAndroid Build Coastguard Worker         mXCursorPosition = xCursorPosition;
160*38e8c45fSAndroid Build Coastguard Worker         return *this;
161*38e8c45fSAndroid Build Coastguard Worker     }
162*38e8c45fSAndroid Build Coastguard Worker 
yCursorPosition(float yCursorPosition)163*38e8c45fSAndroid Build Coastguard Worker     InputMessageBuilder& yCursorPosition(float yCursorPosition) {
164*38e8c45fSAndroid Build Coastguard Worker         mYCursorPosition = yCursorPosition;
165*38e8c45fSAndroid Build Coastguard Worker         return *this;
166*38e8c45fSAndroid Build Coastguard Worker     }
167*38e8c45fSAndroid Build Coastguard Worker 
rawTransform(const ui::Transform & rawTransform)168*38e8c45fSAndroid Build Coastguard Worker     InputMessageBuilder& rawTransform(const ui::Transform& rawTransform) {
169*38e8c45fSAndroid Build Coastguard Worker         mRawTransform = rawTransform;
170*38e8c45fSAndroid Build Coastguard Worker         return *this;
171*38e8c45fSAndroid Build Coastguard Worker     }
172*38e8c45fSAndroid Build Coastguard Worker 
pointer(PointerBuilder pointerBuilder)173*38e8c45fSAndroid Build Coastguard Worker     InputMessageBuilder& pointer(PointerBuilder pointerBuilder) {
174*38e8c45fSAndroid Build Coastguard Worker         mPointers.push_back(pointerBuilder);
175*38e8c45fSAndroid Build Coastguard Worker         return *this;
176*38e8c45fSAndroid Build Coastguard Worker     }
177*38e8c45fSAndroid Build Coastguard Worker 
build()178*38e8c45fSAndroid Build Coastguard Worker     InputMessage build() const {
179*38e8c45fSAndroid Build Coastguard Worker         InputMessage message{};
180*38e8c45fSAndroid Build Coastguard Worker         // Header
181*38e8c45fSAndroid Build Coastguard Worker         message.header.type = mType;
182*38e8c45fSAndroid Build Coastguard Worker         message.header.seq = mSeq;
183*38e8c45fSAndroid Build Coastguard Worker         // Body
184*38e8c45fSAndroid Build Coastguard Worker         message.body.motion.eventId = mEventId;
185*38e8c45fSAndroid Build Coastguard Worker         message.body.motion.pointerCount = mPointers.size();
186*38e8c45fSAndroid Build Coastguard Worker         message.body.motion.eventTime = mEventTime;
187*38e8c45fSAndroid Build Coastguard Worker         message.body.motion.deviceId = mDeviceId;
188*38e8c45fSAndroid Build Coastguard Worker         message.body.motion.source = mSource;
189*38e8c45fSAndroid Build Coastguard Worker         message.body.motion.displayId = mDisplayId.val();
190*38e8c45fSAndroid Build Coastguard Worker         message.body.motion.hmac = std::move(mHmac);
191*38e8c45fSAndroid Build Coastguard Worker         message.body.motion.action = mAction;
192*38e8c45fSAndroid Build Coastguard Worker         message.body.motion.actionButton = mActionButton;
193*38e8c45fSAndroid Build Coastguard Worker         message.body.motion.flags = mFlags;
194*38e8c45fSAndroid Build Coastguard Worker         message.body.motion.metaState = mMetaState;
195*38e8c45fSAndroid Build Coastguard Worker         message.body.motion.buttonState = mButtonState;
196*38e8c45fSAndroid Build Coastguard Worker         message.body.motion.edgeFlags = mEdgeFlags;
197*38e8c45fSAndroid Build Coastguard Worker         message.body.motion.downTime = mDownTime;
198*38e8c45fSAndroid Build Coastguard Worker         message.body.motion.dsdx = mTransform.dsdx();
199*38e8c45fSAndroid Build Coastguard Worker         message.body.motion.dtdx = mTransform.dtdx();
200*38e8c45fSAndroid Build Coastguard Worker         message.body.motion.dtdy = mTransform.dtdy();
201*38e8c45fSAndroid Build Coastguard Worker         message.body.motion.dsdy = mTransform.dsdy();
202*38e8c45fSAndroid Build Coastguard Worker         message.body.motion.tx = mTransform.ty();
203*38e8c45fSAndroid Build Coastguard Worker         message.body.motion.ty = mTransform.tx();
204*38e8c45fSAndroid Build Coastguard Worker         message.body.motion.xPrecision = mXPrecision;
205*38e8c45fSAndroid Build Coastguard Worker         message.body.motion.yPrecision = mYPrecision;
206*38e8c45fSAndroid Build Coastguard Worker         message.body.motion.xCursorPosition = mXCursorPosition;
207*38e8c45fSAndroid Build Coastguard Worker         message.body.motion.yCursorPosition = mYCursorPosition;
208*38e8c45fSAndroid Build Coastguard Worker         message.body.motion.dsdxRaw = mRawTransform.dsdx();
209*38e8c45fSAndroid Build Coastguard Worker         message.body.motion.dtdxRaw = mRawTransform.dtdx();
210*38e8c45fSAndroid Build Coastguard Worker         message.body.motion.dtdyRaw = mRawTransform.dtdy();
211*38e8c45fSAndroid Build Coastguard Worker         message.body.motion.dsdyRaw = mRawTransform.dsdy();
212*38e8c45fSAndroid Build Coastguard Worker         message.body.motion.txRaw = mRawTransform.ty();
213*38e8c45fSAndroid Build Coastguard Worker         message.body.motion.tyRaw = mRawTransform.tx();
214*38e8c45fSAndroid Build Coastguard Worker 
215*38e8c45fSAndroid Build Coastguard Worker         for (size_t i = 0; i < mPointers.size(); ++i) {
216*38e8c45fSAndroid Build Coastguard Worker             message.body.motion.pointers[i].properties = mPointers[i].buildProperties();
217*38e8c45fSAndroid Build Coastguard Worker             message.body.motion.pointers[i].coords = mPointers[i].buildCoords();
218*38e8c45fSAndroid Build Coastguard Worker         }
219*38e8c45fSAndroid Build Coastguard Worker         return message;
220*38e8c45fSAndroid Build Coastguard Worker     }
221*38e8c45fSAndroid Build Coastguard Worker 
222*38e8c45fSAndroid Build Coastguard Worker private:
223*38e8c45fSAndroid Build Coastguard Worker     const InputMessage::Type mType;
224*38e8c45fSAndroid Build Coastguard Worker     const uint32_t mSeq;
225*38e8c45fSAndroid Build Coastguard Worker 
226*38e8c45fSAndroid Build Coastguard Worker     int32_t mEventId{InputEvent::nextId()};
227*38e8c45fSAndroid Build Coastguard Worker     nsecs_t mEventTime{systemTime(SYSTEM_TIME_MONOTONIC)};
228*38e8c45fSAndroid Build Coastguard Worker     DeviceId mDeviceId{DEFAULT_DEVICE_ID};
229*38e8c45fSAndroid Build Coastguard Worker     int32_t mSource{AINPUT_SOURCE_TOUCHSCREEN};
230*38e8c45fSAndroid Build Coastguard Worker     ui::LogicalDisplayId mDisplayId{ui::LogicalDisplayId::DEFAULT};
231*38e8c45fSAndroid Build Coastguard Worker     std::array<uint8_t, 32> mHmac{INVALID_HMAC};
232*38e8c45fSAndroid Build Coastguard Worker     int32_t mAction{AMOTION_EVENT_ACTION_MOVE};
233*38e8c45fSAndroid Build Coastguard Worker     int32_t mActionButton{0};
234*38e8c45fSAndroid Build Coastguard Worker     int32_t mFlags{0};
235*38e8c45fSAndroid Build Coastguard Worker     int32_t mMetaState{AMETA_NONE};
236*38e8c45fSAndroid Build Coastguard Worker     int32_t mButtonState{0};
237*38e8c45fSAndroid Build Coastguard Worker     MotionClassification mClassification{MotionClassification::NONE};
238*38e8c45fSAndroid Build Coastguard Worker     int32_t mEdgeFlags{0};
239*38e8c45fSAndroid Build Coastguard Worker     nsecs_t mDownTime{mEventTime};
240*38e8c45fSAndroid Build Coastguard Worker     ui::Transform mTransform{};
241*38e8c45fSAndroid Build Coastguard Worker     float mXPrecision{1.0f};
242*38e8c45fSAndroid Build Coastguard Worker     float mYPrecision{1.0f};
243*38e8c45fSAndroid Build Coastguard Worker     float mXCursorPosition{AMOTION_EVENT_INVALID_CURSOR_POSITION};
244*38e8c45fSAndroid Build Coastguard Worker     float mYCursorPosition{AMOTION_EVENT_INVALID_CURSOR_POSITION};
245*38e8c45fSAndroid Build Coastguard Worker     ui::Transform mRawTransform{};
246*38e8c45fSAndroid Build Coastguard Worker     std::vector<PointerBuilder> mPointers;
247*38e8c45fSAndroid Build Coastguard Worker };
248*38e8c45fSAndroid Build Coastguard Worker 
249*38e8c45fSAndroid Build Coastguard Worker class MotionEventBuilder {
250*38e8c45fSAndroid Build Coastguard Worker public:
MotionEventBuilder(int32_t action,int32_t source)251*38e8c45fSAndroid Build Coastguard Worker     MotionEventBuilder(int32_t action, int32_t source) {
252*38e8c45fSAndroid Build Coastguard Worker         mAction = action;
253*38e8c45fSAndroid Build Coastguard Worker         if (mAction == AMOTION_EVENT_ACTION_CANCEL) {
254*38e8c45fSAndroid Build Coastguard Worker             mFlags |= AMOTION_EVENT_FLAG_CANCELED;
255*38e8c45fSAndroid Build Coastguard Worker         }
256*38e8c45fSAndroid Build Coastguard Worker         mSource = source;
257*38e8c45fSAndroid Build Coastguard Worker         mEventTime = systemTime(SYSTEM_TIME_MONOTONIC);
258*38e8c45fSAndroid Build Coastguard Worker         mDownTime = mEventTime;
259*38e8c45fSAndroid Build Coastguard Worker     }
260*38e8c45fSAndroid Build Coastguard Worker 
deviceId(int32_t deviceId)261*38e8c45fSAndroid Build Coastguard Worker     MotionEventBuilder& deviceId(int32_t deviceId) {
262*38e8c45fSAndroid Build Coastguard Worker         mDeviceId = deviceId;
263*38e8c45fSAndroid Build Coastguard Worker         return *this;
264*38e8c45fSAndroid Build Coastguard Worker     }
265*38e8c45fSAndroid Build Coastguard Worker 
downTime(nsecs_t downTime)266*38e8c45fSAndroid Build Coastguard Worker     MotionEventBuilder& downTime(nsecs_t downTime) {
267*38e8c45fSAndroid Build Coastguard Worker         mDownTime = downTime;
268*38e8c45fSAndroid Build Coastguard Worker         return *this;
269*38e8c45fSAndroid Build Coastguard Worker     }
270*38e8c45fSAndroid Build Coastguard Worker 
eventTime(nsecs_t eventTime)271*38e8c45fSAndroid Build Coastguard Worker     MotionEventBuilder& eventTime(nsecs_t eventTime) {
272*38e8c45fSAndroid Build Coastguard Worker         mEventTime = eventTime;
273*38e8c45fSAndroid Build Coastguard Worker         return *this;
274*38e8c45fSAndroid Build Coastguard Worker     }
275*38e8c45fSAndroid Build Coastguard Worker 
displayId(ui::LogicalDisplayId displayId)276*38e8c45fSAndroid Build Coastguard Worker     MotionEventBuilder& displayId(ui::LogicalDisplayId displayId) {
277*38e8c45fSAndroid Build Coastguard Worker         mDisplayId = displayId;
278*38e8c45fSAndroid Build Coastguard Worker         return *this;
279*38e8c45fSAndroid Build Coastguard Worker     }
280*38e8c45fSAndroid Build Coastguard Worker 
actionButton(int32_t actionButton)281*38e8c45fSAndroid Build Coastguard Worker     MotionEventBuilder& actionButton(int32_t actionButton) {
282*38e8c45fSAndroid Build Coastguard Worker         mActionButton = actionButton;
283*38e8c45fSAndroid Build Coastguard Worker         return *this;
284*38e8c45fSAndroid Build Coastguard Worker     }
285*38e8c45fSAndroid Build Coastguard Worker 
buttonState(int32_t buttonState)286*38e8c45fSAndroid Build Coastguard Worker     MotionEventBuilder& buttonState(int32_t buttonState) {
287*38e8c45fSAndroid Build Coastguard Worker         mButtonState = buttonState;
288*38e8c45fSAndroid Build Coastguard Worker         return *this;
289*38e8c45fSAndroid Build Coastguard Worker     }
290*38e8c45fSAndroid Build Coastguard Worker 
rawXCursorPosition(float rawXCursorPosition)291*38e8c45fSAndroid Build Coastguard Worker     MotionEventBuilder& rawXCursorPosition(float rawXCursorPosition) {
292*38e8c45fSAndroid Build Coastguard Worker         mRawXCursorPosition = rawXCursorPosition;
293*38e8c45fSAndroid Build Coastguard Worker         return *this;
294*38e8c45fSAndroid Build Coastguard Worker     }
295*38e8c45fSAndroid Build Coastguard Worker 
rawYCursorPosition(float rawYCursorPosition)296*38e8c45fSAndroid Build Coastguard Worker     MotionEventBuilder& rawYCursorPosition(float rawYCursorPosition) {
297*38e8c45fSAndroid Build Coastguard Worker         mRawYCursorPosition = rawYCursorPosition;
298*38e8c45fSAndroid Build Coastguard Worker         return *this;
299*38e8c45fSAndroid Build Coastguard Worker     }
300*38e8c45fSAndroid Build Coastguard Worker 
pointer(PointerBuilder pointer)301*38e8c45fSAndroid Build Coastguard Worker     MotionEventBuilder& pointer(PointerBuilder pointer) {
302*38e8c45fSAndroid Build Coastguard Worker         mPointers.push_back(pointer);
303*38e8c45fSAndroid Build Coastguard Worker         return *this;
304*38e8c45fSAndroid Build Coastguard Worker     }
305*38e8c45fSAndroid Build Coastguard Worker 
addFlag(uint32_t flags)306*38e8c45fSAndroid Build Coastguard Worker     MotionEventBuilder& addFlag(uint32_t flags) {
307*38e8c45fSAndroid Build Coastguard Worker         mFlags |= flags;
308*38e8c45fSAndroid Build Coastguard Worker         return *this;
309*38e8c45fSAndroid Build Coastguard Worker     }
310*38e8c45fSAndroid Build Coastguard Worker 
transform(ui::Transform t)311*38e8c45fSAndroid Build Coastguard Worker     MotionEventBuilder& transform(ui::Transform t) {
312*38e8c45fSAndroid Build Coastguard Worker         mTransform = t;
313*38e8c45fSAndroid Build Coastguard Worker         return *this;
314*38e8c45fSAndroid Build Coastguard Worker     }
315*38e8c45fSAndroid Build Coastguard Worker 
rawTransform(ui::Transform t)316*38e8c45fSAndroid Build Coastguard Worker     MotionEventBuilder& rawTransform(ui::Transform t) {
317*38e8c45fSAndroid Build Coastguard Worker         mRawTransform = t;
318*38e8c45fSAndroid Build Coastguard Worker         return *this;
319*38e8c45fSAndroid Build Coastguard Worker     }
320*38e8c45fSAndroid Build Coastguard Worker 
build()321*38e8c45fSAndroid Build Coastguard Worker     MotionEvent build() const {
322*38e8c45fSAndroid Build Coastguard Worker         std::vector<PointerProperties> pointerProperties;
323*38e8c45fSAndroid Build Coastguard Worker         std::vector<PointerCoords> pointerCoords;
324*38e8c45fSAndroid Build Coastguard Worker         for (const PointerBuilder& pointer : mPointers) {
325*38e8c45fSAndroid Build Coastguard Worker             pointerProperties.push_back(pointer.buildProperties());
326*38e8c45fSAndroid Build Coastguard Worker             pointerCoords.push_back(pointer.buildCoords());
327*38e8c45fSAndroid Build Coastguard Worker         }
328*38e8c45fSAndroid Build Coastguard Worker 
329*38e8c45fSAndroid Build Coastguard Worker         auto [xCursorPosition, yCursorPosition] =
330*38e8c45fSAndroid Build Coastguard Worker                 std::make_pair(mRawXCursorPosition, mRawYCursorPosition);
331*38e8c45fSAndroid Build Coastguard Worker         // Set mouse cursor position for the most common cases to avoid boilerplate.
332*38e8c45fSAndroid Build Coastguard Worker         if (mSource == AINPUT_SOURCE_MOUSE &&
333*38e8c45fSAndroid Build Coastguard Worker             !MotionEvent::isValidCursorPosition(xCursorPosition, yCursorPosition)) {
334*38e8c45fSAndroid Build Coastguard Worker             xCursorPosition = pointerCoords[0].getX();
335*38e8c45fSAndroid Build Coastguard Worker             yCursorPosition = pointerCoords[0].getY();
336*38e8c45fSAndroid Build Coastguard Worker         }
337*38e8c45fSAndroid Build Coastguard Worker 
338*38e8c45fSAndroid Build Coastguard Worker         MotionEvent event;
339*38e8c45fSAndroid Build Coastguard Worker         event.initialize(InputEvent::nextId(), mDeviceId, mSource, mDisplayId, INVALID_HMAC,
340*38e8c45fSAndroid Build Coastguard Worker                          mAction, mActionButton, mFlags, /*edgeFlags=*/0, AMETA_NONE, mButtonState,
341*38e8c45fSAndroid Build Coastguard Worker                          MotionClassification::NONE, mTransform,
342*38e8c45fSAndroid Build Coastguard Worker                          /*xPrecision=*/0, /*yPrecision=*/0, xCursorPosition, yCursorPosition,
343*38e8c45fSAndroid Build Coastguard Worker                          mRawTransform, mDownTime, mEventTime, mPointers.size(),
344*38e8c45fSAndroid Build Coastguard Worker                          pointerProperties.data(), pointerCoords.data());
345*38e8c45fSAndroid Build Coastguard Worker         return event;
346*38e8c45fSAndroid Build Coastguard Worker     }
347*38e8c45fSAndroid Build Coastguard Worker 
348*38e8c45fSAndroid Build Coastguard Worker private:
349*38e8c45fSAndroid Build Coastguard Worker     int32_t mAction;
350*38e8c45fSAndroid Build Coastguard Worker     int32_t mDeviceId{DEFAULT_DEVICE_ID};
351*38e8c45fSAndroid Build Coastguard Worker     int32_t mSource;
352*38e8c45fSAndroid Build Coastguard Worker     nsecs_t mDownTime;
353*38e8c45fSAndroid Build Coastguard Worker     nsecs_t mEventTime;
354*38e8c45fSAndroid Build Coastguard Worker     ui::LogicalDisplayId mDisplayId{ui::LogicalDisplayId::DEFAULT};
355*38e8c45fSAndroid Build Coastguard Worker     int32_t mActionButton{0};
356*38e8c45fSAndroid Build Coastguard Worker     int32_t mButtonState{0};
357*38e8c45fSAndroid Build Coastguard Worker     int32_t mFlags{0};
358*38e8c45fSAndroid Build Coastguard Worker     float mRawXCursorPosition{AMOTION_EVENT_INVALID_CURSOR_POSITION};
359*38e8c45fSAndroid Build Coastguard Worker     float mRawYCursorPosition{AMOTION_EVENT_INVALID_CURSOR_POSITION};
360*38e8c45fSAndroid Build Coastguard Worker     ui::Transform mTransform;
361*38e8c45fSAndroid Build Coastguard Worker     ui::Transform mRawTransform;
362*38e8c45fSAndroid Build Coastguard Worker 
363*38e8c45fSAndroid Build Coastguard Worker     std::vector<PointerBuilder> mPointers;
364*38e8c45fSAndroid Build Coastguard Worker };
365*38e8c45fSAndroid Build Coastguard Worker 
366*38e8c45fSAndroid Build Coastguard Worker class KeyEventBuilder {
367*38e8c45fSAndroid Build Coastguard Worker public:
KeyEventBuilder(int32_t action,int32_t source)368*38e8c45fSAndroid Build Coastguard Worker     KeyEventBuilder(int32_t action, int32_t source) {
369*38e8c45fSAndroid Build Coastguard Worker         mAction = action;
370*38e8c45fSAndroid Build Coastguard Worker         mSource = source;
371*38e8c45fSAndroid Build Coastguard Worker         mEventTime = systemTime(SYSTEM_TIME_MONOTONIC);
372*38e8c45fSAndroid Build Coastguard Worker         mDownTime = mEventTime;
373*38e8c45fSAndroid Build Coastguard Worker     }
374*38e8c45fSAndroid Build Coastguard Worker 
KeyEventBuilder(const KeyEvent & event)375*38e8c45fSAndroid Build Coastguard Worker     KeyEventBuilder(const KeyEvent& event) {
376*38e8c45fSAndroid Build Coastguard Worker         mAction = event.getAction();
377*38e8c45fSAndroid Build Coastguard Worker         mDeviceId = event.getDeviceId();
378*38e8c45fSAndroid Build Coastguard Worker         mSource = event.getSource();
379*38e8c45fSAndroid Build Coastguard Worker         mDownTime = event.getDownTime();
380*38e8c45fSAndroid Build Coastguard Worker         mEventTime = event.getEventTime();
381*38e8c45fSAndroid Build Coastguard Worker         mDisplayId = event.getDisplayId();
382*38e8c45fSAndroid Build Coastguard Worker         mFlags = event.getFlags();
383*38e8c45fSAndroid Build Coastguard Worker         mKeyCode = event.getKeyCode();
384*38e8c45fSAndroid Build Coastguard Worker         mScanCode = event.getScanCode();
385*38e8c45fSAndroid Build Coastguard Worker         mMetaState = event.getMetaState();
386*38e8c45fSAndroid Build Coastguard Worker         mRepeatCount = event.getRepeatCount();
387*38e8c45fSAndroid Build Coastguard Worker     }
388*38e8c45fSAndroid Build Coastguard Worker 
deviceId(int32_t deviceId)389*38e8c45fSAndroid Build Coastguard Worker     KeyEventBuilder& deviceId(int32_t deviceId) {
390*38e8c45fSAndroid Build Coastguard Worker         mDeviceId = deviceId;
391*38e8c45fSAndroid Build Coastguard Worker         return *this;
392*38e8c45fSAndroid Build Coastguard Worker     }
393*38e8c45fSAndroid Build Coastguard Worker 
downTime(nsecs_t downTime)394*38e8c45fSAndroid Build Coastguard Worker     KeyEventBuilder& downTime(nsecs_t downTime) {
395*38e8c45fSAndroid Build Coastguard Worker         mDownTime = downTime;
396*38e8c45fSAndroid Build Coastguard Worker         return *this;
397*38e8c45fSAndroid Build Coastguard Worker     }
398*38e8c45fSAndroid Build Coastguard Worker 
eventTime(nsecs_t eventTime)399*38e8c45fSAndroid Build Coastguard Worker     KeyEventBuilder& eventTime(nsecs_t eventTime) {
400*38e8c45fSAndroid Build Coastguard Worker         mEventTime = eventTime;
401*38e8c45fSAndroid Build Coastguard Worker         return *this;
402*38e8c45fSAndroid Build Coastguard Worker     }
403*38e8c45fSAndroid Build Coastguard Worker 
displayId(ui::LogicalDisplayId displayId)404*38e8c45fSAndroid Build Coastguard Worker     KeyEventBuilder& displayId(ui::LogicalDisplayId displayId) {
405*38e8c45fSAndroid Build Coastguard Worker         mDisplayId = displayId;
406*38e8c45fSAndroid Build Coastguard Worker         return *this;
407*38e8c45fSAndroid Build Coastguard Worker     }
408*38e8c45fSAndroid Build Coastguard Worker 
policyFlags(int32_t policyFlags)409*38e8c45fSAndroid Build Coastguard Worker     KeyEventBuilder& policyFlags(int32_t policyFlags) {
410*38e8c45fSAndroid Build Coastguard Worker         mPolicyFlags = policyFlags;
411*38e8c45fSAndroid Build Coastguard Worker         return *this;
412*38e8c45fSAndroid Build Coastguard Worker     }
413*38e8c45fSAndroid Build Coastguard Worker 
addFlag(uint32_t flags)414*38e8c45fSAndroid Build Coastguard Worker     KeyEventBuilder& addFlag(uint32_t flags) {
415*38e8c45fSAndroid Build Coastguard Worker         mFlags |= flags;
416*38e8c45fSAndroid Build Coastguard Worker         return *this;
417*38e8c45fSAndroid Build Coastguard Worker     }
418*38e8c45fSAndroid Build Coastguard Worker 
keyCode(int32_t keyCode)419*38e8c45fSAndroid Build Coastguard Worker     KeyEventBuilder& keyCode(int32_t keyCode) {
420*38e8c45fSAndroid Build Coastguard Worker         mKeyCode = keyCode;
421*38e8c45fSAndroid Build Coastguard Worker         return *this;
422*38e8c45fSAndroid Build Coastguard Worker     }
423*38e8c45fSAndroid Build Coastguard Worker 
repeatCount(int32_t repeatCount)424*38e8c45fSAndroid Build Coastguard Worker     KeyEventBuilder& repeatCount(int32_t repeatCount) {
425*38e8c45fSAndroid Build Coastguard Worker         mRepeatCount = repeatCount;
426*38e8c45fSAndroid Build Coastguard Worker         return *this;
427*38e8c45fSAndroid Build Coastguard Worker     }
428*38e8c45fSAndroid Build Coastguard Worker 
build()429*38e8c45fSAndroid Build Coastguard Worker     KeyEvent build() const {
430*38e8c45fSAndroid Build Coastguard Worker         KeyEvent event{};
431*38e8c45fSAndroid Build Coastguard Worker         event.initialize(InputEvent::nextId(), mDeviceId, mSource, mDisplayId, INVALID_HMAC,
432*38e8c45fSAndroid Build Coastguard Worker                          mAction, mFlags, mKeyCode, mScanCode, mMetaState, mRepeatCount, mDownTime,
433*38e8c45fSAndroid Build Coastguard Worker                          mEventTime);
434*38e8c45fSAndroid Build Coastguard Worker         return event;
435*38e8c45fSAndroid Build Coastguard Worker     }
436*38e8c45fSAndroid Build Coastguard Worker 
437*38e8c45fSAndroid Build Coastguard Worker private:
438*38e8c45fSAndroid Build Coastguard Worker     int32_t mAction;
439*38e8c45fSAndroid Build Coastguard Worker     int32_t mDeviceId = DEFAULT_DEVICE_ID;
440*38e8c45fSAndroid Build Coastguard Worker     uint32_t mSource;
441*38e8c45fSAndroid Build Coastguard Worker     nsecs_t mDownTime;
442*38e8c45fSAndroid Build Coastguard Worker     nsecs_t mEventTime;
443*38e8c45fSAndroid Build Coastguard Worker     ui::LogicalDisplayId mDisplayId{ui::LogicalDisplayId::DEFAULT};
444*38e8c45fSAndroid Build Coastguard Worker     uint32_t mPolicyFlags = DEFAULT_POLICY_FLAGS;
445*38e8c45fSAndroid Build Coastguard Worker     int32_t mFlags{0};
446*38e8c45fSAndroid Build Coastguard Worker     int32_t mKeyCode{AKEYCODE_UNKNOWN};
447*38e8c45fSAndroid Build Coastguard Worker     int32_t mScanCode{0};
448*38e8c45fSAndroid Build Coastguard Worker     int32_t mMetaState{AMETA_NONE};
449*38e8c45fSAndroid Build Coastguard Worker     int32_t mRepeatCount{0};
450*38e8c45fSAndroid Build Coastguard Worker };
451*38e8c45fSAndroid Build Coastguard Worker 
452*38e8c45fSAndroid Build Coastguard Worker } // namespace android
453