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 <NotifyArgs.h> 20*38e8c45fSAndroid Build Coastguard Worker #include <android/input.h> 21*38e8c45fSAndroid Build Coastguard Worker #include <attestation/HmacKeyManager.h> 22*38e8c45fSAndroid Build Coastguard Worker #include <input/Input.h> 23*38e8c45fSAndroid Build Coastguard Worker #include <input/InputEventBuilders.h> 24*38e8c45fSAndroid Build Coastguard Worker #include <input/Keyboard.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 <cstdint> 28*38e8c45fSAndroid Build Coastguard Worker #include <vector> 29*38e8c45fSAndroid Build Coastguard Worker 30*38e8c45fSAndroid Build Coastguard Worker namespace android { 31*38e8c45fSAndroid Build Coastguard Worker 32*38e8c45fSAndroid Build Coastguard Worker class MotionArgsBuilder { 33*38e8c45fSAndroid Build Coastguard Worker public: 34*38e8c45fSAndroid Build Coastguard Worker MotionArgsBuilder(int32_t action, int32_t source, int32_t eventId = InputEvent::nextId()) mEventId(eventId)35*38e8c45fSAndroid Build Coastguard Worker : mEventId(eventId) { 36*38e8c45fSAndroid Build Coastguard Worker mAction = action; 37*38e8c45fSAndroid Build Coastguard Worker if (mAction == AMOTION_EVENT_ACTION_CANCEL) { 38*38e8c45fSAndroid Build Coastguard Worker addFlag(AMOTION_EVENT_FLAG_CANCELED); 39*38e8c45fSAndroid Build Coastguard Worker } 40*38e8c45fSAndroid Build Coastguard Worker mSource = source; 41*38e8c45fSAndroid Build Coastguard Worker mEventTime = systemTime(SYSTEM_TIME_MONOTONIC); 42*38e8c45fSAndroid Build Coastguard Worker mDownTime = mEventTime; 43*38e8c45fSAndroid Build Coastguard Worker } 44*38e8c45fSAndroid Build Coastguard Worker deviceId(int32_t deviceId)45*38e8c45fSAndroid Build Coastguard Worker MotionArgsBuilder& deviceId(int32_t deviceId) { 46*38e8c45fSAndroid Build Coastguard Worker mDeviceId = deviceId; 47*38e8c45fSAndroid Build Coastguard Worker return *this; 48*38e8c45fSAndroid Build Coastguard Worker } 49*38e8c45fSAndroid Build Coastguard Worker downTime(nsecs_t downTime)50*38e8c45fSAndroid Build Coastguard Worker MotionArgsBuilder& downTime(nsecs_t downTime) { 51*38e8c45fSAndroid Build Coastguard Worker mDownTime = downTime; 52*38e8c45fSAndroid Build Coastguard Worker return *this; 53*38e8c45fSAndroid Build Coastguard Worker } 54*38e8c45fSAndroid Build Coastguard Worker eventTime(nsecs_t eventTime)55*38e8c45fSAndroid Build Coastguard Worker MotionArgsBuilder& eventTime(nsecs_t eventTime) { 56*38e8c45fSAndroid Build Coastguard Worker mEventTime = eventTime; 57*38e8c45fSAndroid Build Coastguard Worker return *this; 58*38e8c45fSAndroid Build Coastguard Worker } 59*38e8c45fSAndroid Build Coastguard Worker readTime(nsecs_t readTime)60*38e8c45fSAndroid Build Coastguard Worker MotionArgsBuilder& readTime(nsecs_t readTime) { 61*38e8c45fSAndroid Build Coastguard Worker mReadTime = readTime; 62*38e8c45fSAndroid Build Coastguard Worker return *this; 63*38e8c45fSAndroid Build Coastguard Worker } 64*38e8c45fSAndroid Build Coastguard Worker displayId(ui::LogicalDisplayId displayId)65*38e8c45fSAndroid Build Coastguard Worker MotionArgsBuilder& displayId(ui::LogicalDisplayId displayId) { 66*38e8c45fSAndroid Build Coastguard Worker mDisplayId = displayId; 67*38e8c45fSAndroid Build Coastguard Worker return *this; 68*38e8c45fSAndroid Build Coastguard Worker } 69*38e8c45fSAndroid Build Coastguard Worker policyFlags(int32_t policyFlags)70*38e8c45fSAndroid Build Coastguard Worker MotionArgsBuilder& policyFlags(int32_t policyFlags) { 71*38e8c45fSAndroid Build Coastguard Worker mPolicyFlags = policyFlags; 72*38e8c45fSAndroid Build Coastguard Worker return *this; 73*38e8c45fSAndroid Build Coastguard Worker } 74*38e8c45fSAndroid Build Coastguard Worker actionButton(int32_t actionButton)75*38e8c45fSAndroid Build Coastguard Worker MotionArgsBuilder& actionButton(int32_t actionButton) { 76*38e8c45fSAndroid Build Coastguard Worker mActionButton = actionButton; 77*38e8c45fSAndroid Build Coastguard Worker return *this; 78*38e8c45fSAndroid Build Coastguard Worker } 79*38e8c45fSAndroid Build Coastguard Worker buttonState(int32_t buttonState)80*38e8c45fSAndroid Build Coastguard Worker MotionArgsBuilder& buttonState(int32_t buttonState) { 81*38e8c45fSAndroid Build Coastguard Worker mButtonState = buttonState; 82*38e8c45fSAndroid Build Coastguard Worker return *this; 83*38e8c45fSAndroid Build Coastguard Worker } 84*38e8c45fSAndroid Build Coastguard Worker rawXCursorPosition(float rawXCursorPosition)85*38e8c45fSAndroid Build Coastguard Worker MotionArgsBuilder& rawXCursorPosition(float rawXCursorPosition) { 86*38e8c45fSAndroid Build Coastguard Worker mRawXCursorPosition = rawXCursorPosition; 87*38e8c45fSAndroid Build Coastguard Worker return *this; 88*38e8c45fSAndroid Build Coastguard Worker } 89*38e8c45fSAndroid Build Coastguard Worker rawYCursorPosition(float rawYCursorPosition)90*38e8c45fSAndroid Build Coastguard Worker MotionArgsBuilder& rawYCursorPosition(float rawYCursorPosition) { 91*38e8c45fSAndroid Build Coastguard Worker mRawYCursorPosition = rawYCursorPosition; 92*38e8c45fSAndroid Build Coastguard Worker return *this; 93*38e8c45fSAndroid Build Coastguard Worker } 94*38e8c45fSAndroid Build Coastguard Worker pointer(PointerBuilder pointer)95*38e8c45fSAndroid Build Coastguard Worker MotionArgsBuilder& pointer(PointerBuilder pointer) { 96*38e8c45fSAndroid Build Coastguard Worker mPointers.push_back(pointer); 97*38e8c45fSAndroid Build Coastguard Worker return *this; 98*38e8c45fSAndroid Build Coastguard Worker } 99*38e8c45fSAndroid Build Coastguard Worker addFlag(uint32_t flags)100*38e8c45fSAndroid Build Coastguard Worker MotionArgsBuilder& addFlag(uint32_t flags) { 101*38e8c45fSAndroid Build Coastguard Worker mFlags |= flags; 102*38e8c45fSAndroid Build Coastguard Worker return *this; 103*38e8c45fSAndroid Build Coastguard Worker } 104*38e8c45fSAndroid Build Coastguard Worker classification(MotionClassification classification)105*38e8c45fSAndroid Build Coastguard Worker MotionArgsBuilder& classification(MotionClassification classification) { 106*38e8c45fSAndroid Build Coastguard Worker mClassification = classification; 107*38e8c45fSAndroid Build Coastguard Worker return *this; 108*38e8c45fSAndroid Build Coastguard Worker } 109*38e8c45fSAndroid Build Coastguard Worker build()110*38e8c45fSAndroid Build Coastguard Worker NotifyMotionArgs build() const { 111*38e8c45fSAndroid Build Coastguard Worker std::vector<PointerProperties> pointerProperties; 112*38e8c45fSAndroid Build Coastguard Worker std::vector<PointerCoords> pointerCoords; 113*38e8c45fSAndroid Build Coastguard Worker for (const PointerBuilder& pointer : mPointers) { 114*38e8c45fSAndroid Build Coastguard Worker pointerProperties.push_back(pointer.buildProperties()); 115*38e8c45fSAndroid Build Coastguard Worker pointerCoords.push_back(pointer.buildCoords()); 116*38e8c45fSAndroid Build Coastguard Worker } 117*38e8c45fSAndroid Build Coastguard Worker 118*38e8c45fSAndroid Build Coastguard Worker // Set mouse cursor position for the most common cases to avoid boilerplate. 119*38e8c45fSAndroid Build Coastguard Worker float resolvedCursorX = mRawXCursorPosition; 120*38e8c45fSAndroid Build Coastguard Worker float resolvedCursorY = mRawYCursorPosition; 121*38e8c45fSAndroid Build Coastguard Worker if (mSource == AINPUT_SOURCE_MOUSE && 122*38e8c45fSAndroid Build Coastguard Worker !MotionEvent::isValidCursorPosition(mRawXCursorPosition, mRawYCursorPosition) && 123*38e8c45fSAndroid Build Coastguard Worker BitSet64::hasBit(pointerCoords[0].bits, AMOTION_EVENT_AXIS_X) && 124*38e8c45fSAndroid Build Coastguard Worker BitSet64::hasBit(pointerCoords[0].bits, AMOTION_EVENT_AXIS_Y)) { 125*38e8c45fSAndroid Build Coastguard Worker resolvedCursorX = pointerCoords[0].getX(); 126*38e8c45fSAndroid Build Coastguard Worker resolvedCursorY = pointerCoords[0].getY(); 127*38e8c45fSAndroid Build Coastguard Worker } 128*38e8c45fSAndroid Build Coastguard Worker 129*38e8c45fSAndroid Build Coastguard Worker return {mEventId, 130*38e8c45fSAndroid Build Coastguard Worker mEventTime, 131*38e8c45fSAndroid Build Coastguard Worker mReadTime.value_or(mEventTime), 132*38e8c45fSAndroid Build Coastguard Worker mDeviceId, 133*38e8c45fSAndroid Build Coastguard Worker mSource, 134*38e8c45fSAndroid Build Coastguard Worker mDisplayId, 135*38e8c45fSAndroid Build Coastguard Worker mPolicyFlags, 136*38e8c45fSAndroid Build Coastguard Worker mAction, 137*38e8c45fSAndroid Build Coastguard Worker mActionButton, 138*38e8c45fSAndroid Build Coastguard Worker mFlags, 139*38e8c45fSAndroid Build Coastguard Worker AMETA_NONE, 140*38e8c45fSAndroid Build Coastguard Worker mButtonState, 141*38e8c45fSAndroid Build Coastguard Worker mClassification, 142*38e8c45fSAndroid Build Coastguard Worker /*edgeFlags=*/0, 143*38e8c45fSAndroid Build Coastguard Worker static_cast<uint32_t>(mPointers.size()), 144*38e8c45fSAndroid Build Coastguard Worker pointerProperties.data(), 145*38e8c45fSAndroid Build Coastguard Worker pointerCoords.data(), 146*38e8c45fSAndroid Build Coastguard Worker /*xPrecision=*/0, 147*38e8c45fSAndroid Build Coastguard Worker /*yPrecision=*/0, 148*38e8c45fSAndroid Build Coastguard Worker resolvedCursorX, 149*38e8c45fSAndroid Build Coastguard Worker resolvedCursorY, 150*38e8c45fSAndroid Build Coastguard Worker mDownTime, 151*38e8c45fSAndroid Build Coastguard Worker /*videoFrames=*/{}}; 152*38e8c45fSAndroid Build Coastguard Worker } 153*38e8c45fSAndroid Build Coastguard Worker 154*38e8c45fSAndroid Build Coastguard Worker private: 155*38e8c45fSAndroid Build Coastguard Worker const int32_t mEventId; 156*38e8c45fSAndroid Build Coastguard Worker int32_t mAction; 157*38e8c45fSAndroid Build Coastguard Worker int32_t mDeviceId{DEFAULT_DEVICE_ID}; 158*38e8c45fSAndroid Build Coastguard Worker uint32_t mSource; 159*38e8c45fSAndroid Build Coastguard Worker nsecs_t mDownTime; 160*38e8c45fSAndroid Build Coastguard Worker nsecs_t mEventTime; 161*38e8c45fSAndroid Build Coastguard Worker std::optional<nsecs_t> mReadTime; 162*38e8c45fSAndroid Build Coastguard Worker ui::LogicalDisplayId mDisplayId{ui::LogicalDisplayId::DEFAULT}; 163*38e8c45fSAndroid Build Coastguard Worker uint32_t mPolicyFlags = DEFAULT_POLICY_FLAGS; 164*38e8c45fSAndroid Build Coastguard Worker int32_t mActionButton{0}; 165*38e8c45fSAndroid Build Coastguard Worker int32_t mButtonState{0}; 166*38e8c45fSAndroid Build Coastguard Worker int32_t mFlags{0}; 167*38e8c45fSAndroid Build Coastguard Worker MotionClassification mClassification{MotionClassification::NONE}; 168*38e8c45fSAndroid Build Coastguard Worker float mRawXCursorPosition{AMOTION_EVENT_INVALID_CURSOR_POSITION}; 169*38e8c45fSAndroid Build Coastguard Worker float mRawYCursorPosition{AMOTION_EVENT_INVALID_CURSOR_POSITION}; 170*38e8c45fSAndroid Build Coastguard Worker 171*38e8c45fSAndroid Build Coastguard Worker std::vector<PointerBuilder> mPointers; 172*38e8c45fSAndroid Build Coastguard Worker }; 173*38e8c45fSAndroid Build Coastguard Worker 174*38e8c45fSAndroid Build Coastguard Worker class KeyArgsBuilder { 175*38e8c45fSAndroid Build Coastguard Worker public: 176*38e8c45fSAndroid Build Coastguard Worker KeyArgsBuilder(int32_t action, int32_t source, int32_t eventId = InputEvent::nextId()) mEventId(eventId)177*38e8c45fSAndroid Build Coastguard Worker : mEventId(eventId) { 178*38e8c45fSAndroid Build Coastguard Worker mAction = action; 179*38e8c45fSAndroid Build Coastguard Worker mSource = source; 180*38e8c45fSAndroid Build Coastguard Worker mEventTime = systemTime(SYSTEM_TIME_MONOTONIC); 181*38e8c45fSAndroid Build Coastguard Worker mDownTime = mEventTime; 182*38e8c45fSAndroid Build Coastguard Worker } 183*38e8c45fSAndroid Build Coastguard Worker deviceId(int32_t deviceId)184*38e8c45fSAndroid Build Coastguard Worker KeyArgsBuilder& deviceId(int32_t deviceId) { 185*38e8c45fSAndroid Build Coastguard Worker mDeviceId = deviceId; 186*38e8c45fSAndroid Build Coastguard Worker return *this; 187*38e8c45fSAndroid Build Coastguard Worker } 188*38e8c45fSAndroid Build Coastguard Worker downTime(nsecs_t downTime)189*38e8c45fSAndroid Build Coastguard Worker KeyArgsBuilder& downTime(nsecs_t downTime) { 190*38e8c45fSAndroid Build Coastguard Worker mDownTime = downTime; 191*38e8c45fSAndroid Build Coastguard Worker return *this; 192*38e8c45fSAndroid Build Coastguard Worker } 193*38e8c45fSAndroid Build Coastguard Worker eventTime(nsecs_t eventTime)194*38e8c45fSAndroid Build Coastguard Worker KeyArgsBuilder& eventTime(nsecs_t eventTime) { 195*38e8c45fSAndroid Build Coastguard Worker mEventTime = eventTime; 196*38e8c45fSAndroid Build Coastguard Worker return *this; 197*38e8c45fSAndroid Build Coastguard Worker } 198*38e8c45fSAndroid Build Coastguard Worker readTime(nsecs_t readTime)199*38e8c45fSAndroid Build Coastguard Worker KeyArgsBuilder& readTime(nsecs_t readTime) { 200*38e8c45fSAndroid Build Coastguard Worker mReadTime = readTime; 201*38e8c45fSAndroid Build Coastguard Worker return *this; 202*38e8c45fSAndroid Build Coastguard Worker } 203*38e8c45fSAndroid Build Coastguard Worker displayId(ui::LogicalDisplayId displayId)204*38e8c45fSAndroid Build Coastguard Worker KeyArgsBuilder& displayId(ui::LogicalDisplayId displayId) { 205*38e8c45fSAndroid Build Coastguard Worker mDisplayId = displayId; 206*38e8c45fSAndroid Build Coastguard Worker return *this; 207*38e8c45fSAndroid Build Coastguard Worker } 208*38e8c45fSAndroid Build Coastguard Worker policyFlags(int32_t policyFlags)209*38e8c45fSAndroid Build Coastguard Worker KeyArgsBuilder& policyFlags(int32_t policyFlags) { 210*38e8c45fSAndroid Build Coastguard Worker mPolicyFlags = policyFlags; 211*38e8c45fSAndroid Build Coastguard Worker return *this; 212*38e8c45fSAndroid Build Coastguard Worker } 213*38e8c45fSAndroid Build Coastguard Worker addFlag(uint32_t flags)214*38e8c45fSAndroid Build Coastguard Worker KeyArgsBuilder& addFlag(uint32_t flags) { 215*38e8c45fSAndroid Build Coastguard Worker mFlags |= flags; 216*38e8c45fSAndroid Build Coastguard Worker return *this; 217*38e8c45fSAndroid Build Coastguard Worker } 218*38e8c45fSAndroid Build Coastguard Worker keyCode(int32_t keyCode)219*38e8c45fSAndroid Build Coastguard Worker KeyArgsBuilder& keyCode(int32_t keyCode) { 220*38e8c45fSAndroid Build Coastguard Worker mKeyCode = keyCode; 221*38e8c45fSAndroid Build Coastguard Worker return *this; 222*38e8c45fSAndroid Build Coastguard Worker } 223*38e8c45fSAndroid Build Coastguard Worker metaState(int32_t metaState)224*38e8c45fSAndroid Build Coastguard Worker KeyArgsBuilder& metaState(int32_t metaState) { 225*38e8c45fSAndroid Build Coastguard Worker mMetaState |= metaState; 226*38e8c45fSAndroid Build Coastguard Worker mMetaState = normalizeMetaState(/*oldMetaState=*/mMetaState); 227*38e8c45fSAndroid Build Coastguard Worker return *this; 228*38e8c45fSAndroid Build Coastguard Worker } 229*38e8c45fSAndroid Build Coastguard Worker build()230*38e8c45fSAndroid Build Coastguard Worker NotifyKeyArgs build() const { 231*38e8c45fSAndroid Build Coastguard Worker return {mEventId, mEventTime, mReadTime.value_or(mEventTime), 232*38e8c45fSAndroid Build Coastguard Worker mDeviceId, mSource, mDisplayId, 233*38e8c45fSAndroid Build Coastguard Worker mPolicyFlags, mAction, mFlags, 234*38e8c45fSAndroid Build Coastguard Worker mKeyCode, mScanCode, mMetaState, 235*38e8c45fSAndroid Build Coastguard Worker mDownTime}; 236*38e8c45fSAndroid Build Coastguard Worker } 237*38e8c45fSAndroid Build Coastguard Worker 238*38e8c45fSAndroid Build Coastguard Worker private: 239*38e8c45fSAndroid Build Coastguard Worker const int32_t mEventId; 240*38e8c45fSAndroid Build Coastguard Worker int32_t mAction; 241*38e8c45fSAndroid Build Coastguard Worker int32_t mDeviceId = DEFAULT_DEVICE_ID; 242*38e8c45fSAndroid Build Coastguard Worker uint32_t mSource; 243*38e8c45fSAndroid Build Coastguard Worker nsecs_t mDownTime; 244*38e8c45fSAndroid Build Coastguard Worker nsecs_t mEventTime; 245*38e8c45fSAndroid Build Coastguard Worker std::optional<nsecs_t> mReadTime; 246*38e8c45fSAndroid Build Coastguard Worker ui::LogicalDisplayId mDisplayId{ui::LogicalDisplayId::DEFAULT}; 247*38e8c45fSAndroid Build Coastguard Worker uint32_t mPolicyFlags = DEFAULT_POLICY_FLAGS; 248*38e8c45fSAndroid Build Coastguard Worker int32_t mFlags{0}; 249*38e8c45fSAndroid Build Coastguard Worker int32_t mKeyCode{AKEYCODE_UNKNOWN}; 250*38e8c45fSAndroid Build Coastguard Worker int32_t mScanCode{0}; 251*38e8c45fSAndroid Build Coastguard Worker int32_t mMetaState{AMETA_NONE}; 252*38e8c45fSAndroid Build Coastguard Worker }; 253*38e8c45fSAndroid Build Coastguard Worker 254*38e8c45fSAndroid Build Coastguard Worker } // namespace android 255