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