1 /* 2 * Copyright 2023 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #pragma once 18 19 #include <NotifyArgs.h> 20 #include <android/input.h> 21 #include <attestation/HmacKeyManager.h> 22 #include <input/Input.h> 23 #include <input/InputEventBuilders.h> 24 #include <input/Keyboard.h> 25 #include <utils/Timers.h> // for nsecs_t, systemTime 26 27 #include <cstdint> 28 #include <vector> 29 30 namespace android { 31 32 class MotionArgsBuilder { 33 public: 34 MotionArgsBuilder(int32_t action, int32_t source, int32_t eventId = InputEvent::nextId()) mEventId(eventId)35 : mEventId(eventId) { 36 mAction = action; 37 if (mAction == AMOTION_EVENT_ACTION_CANCEL) { 38 addFlag(AMOTION_EVENT_FLAG_CANCELED); 39 } 40 mSource = source; 41 mEventTime = systemTime(SYSTEM_TIME_MONOTONIC); 42 mDownTime = mEventTime; 43 } 44 deviceId(int32_t deviceId)45 MotionArgsBuilder& deviceId(int32_t deviceId) { 46 mDeviceId = deviceId; 47 return *this; 48 } 49 downTime(nsecs_t downTime)50 MotionArgsBuilder& downTime(nsecs_t downTime) { 51 mDownTime = downTime; 52 return *this; 53 } 54 eventTime(nsecs_t eventTime)55 MotionArgsBuilder& eventTime(nsecs_t eventTime) { 56 mEventTime = eventTime; 57 return *this; 58 } 59 readTime(nsecs_t readTime)60 MotionArgsBuilder& readTime(nsecs_t readTime) { 61 mReadTime = readTime; 62 return *this; 63 } 64 displayId(ui::LogicalDisplayId displayId)65 MotionArgsBuilder& displayId(ui::LogicalDisplayId displayId) { 66 mDisplayId = displayId; 67 return *this; 68 } 69 policyFlags(int32_t policyFlags)70 MotionArgsBuilder& policyFlags(int32_t policyFlags) { 71 mPolicyFlags = policyFlags; 72 return *this; 73 } 74 actionButton(int32_t actionButton)75 MotionArgsBuilder& actionButton(int32_t actionButton) { 76 mActionButton = actionButton; 77 return *this; 78 } 79 buttonState(int32_t buttonState)80 MotionArgsBuilder& buttonState(int32_t buttonState) { 81 mButtonState = buttonState; 82 return *this; 83 } 84 rawXCursorPosition(float rawXCursorPosition)85 MotionArgsBuilder& rawXCursorPosition(float rawXCursorPosition) { 86 mRawXCursorPosition = rawXCursorPosition; 87 return *this; 88 } 89 rawYCursorPosition(float rawYCursorPosition)90 MotionArgsBuilder& rawYCursorPosition(float rawYCursorPosition) { 91 mRawYCursorPosition = rawYCursorPosition; 92 return *this; 93 } 94 pointer(PointerBuilder pointer)95 MotionArgsBuilder& pointer(PointerBuilder pointer) { 96 mPointers.push_back(pointer); 97 return *this; 98 } 99 addFlag(uint32_t flags)100 MotionArgsBuilder& addFlag(uint32_t flags) { 101 mFlags |= flags; 102 return *this; 103 } 104 classification(MotionClassification classification)105 MotionArgsBuilder& classification(MotionClassification classification) { 106 mClassification = classification; 107 return *this; 108 } 109 build()110 NotifyMotionArgs build() const { 111 std::vector<PointerProperties> pointerProperties; 112 std::vector<PointerCoords> pointerCoords; 113 for (const PointerBuilder& pointer : mPointers) { 114 pointerProperties.push_back(pointer.buildProperties()); 115 pointerCoords.push_back(pointer.buildCoords()); 116 } 117 118 // Set mouse cursor position for the most common cases to avoid boilerplate. 119 float resolvedCursorX = mRawXCursorPosition; 120 float resolvedCursorY = mRawYCursorPosition; 121 if (mSource == AINPUT_SOURCE_MOUSE && 122 !MotionEvent::isValidCursorPosition(mRawXCursorPosition, mRawYCursorPosition) && 123 BitSet64::hasBit(pointerCoords[0].bits, AMOTION_EVENT_AXIS_X) && 124 BitSet64::hasBit(pointerCoords[0].bits, AMOTION_EVENT_AXIS_Y)) { 125 resolvedCursorX = pointerCoords[0].getX(); 126 resolvedCursorY = pointerCoords[0].getY(); 127 } 128 129 return {mEventId, 130 mEventTime, 131 mReadTime.value_or(mEventTime), 132 mDeviceId, 133 mSource, 134 mDisplayId, 135 mPolicyFlags, 136 mAction, 137 mActionButton, 138 mFlags, 139 AMETA_NONE, 140 mButtonState, 141 mClassification, 142 /*edgeFlags=*/0, 143 static_cast<uint32_t>(mPointers.size()), 144 pointerProperties.data(), 145 pointerCoords.data(), 146 /*xPrecision=*/0, 147 /*yPrecision=*/0, 148 resolvedCursorX, 149 resolvedCursorY, 150 mDownTime, 151 /*videoFrames=*/{}}; 152 } 153 154 private: 155 const int32_t mEventId; 156 int32_t mAction; 157 int32_t mDeviceId{DEFAULT_DEVICE_ID}; 158 uint32_t mSource; 159 nsecs_t mDownTime; 160 nsecs_t mEventTime; 161 std::optional<nsecs_t> mReadTime; 162 ui::LogicalDisplayId mDisplayId{ui::LogicalDisplayId::DEFAULT}; 163 uint32_t mPolicyFlags = DEFAULT_POLICY_FLAGS; 164 int32_t mActionButton{0}; 165 int32_t mButtonState{0}; 166 int32_t mFlags{0}; 167 MotionClassification mClassification{MotionClassification::NONE}; 168 float mRawXCursorPosition{AMOTION_EVENT_INVALID_CURSOR_POSITION}; 169 float mRawYCursorPosition{AMOTION_EVENT_INVALID_CURSOR_POSITION}; 170 171 std::vector<PointerBuilder> mPointers; 172 }; 173 174 class KeyArgsBuilder { 175 public: 176 KeyArgsBuilder(int32_t action, int32_t source, int32_t eventId = InputEvent::nextId()) mEventId(eventId)177 : mEventId(eventId) { 178 mAction = action; 179 mSource = source; 180 mEventTime = systemTime(SYSTEM_TIME_MONOTONIC); 181 mDownTime = mEventTime; 182 } 183 deviceId(int32_t deviceId)184 KeyArgsBuilder& deviceId(int32_t deviceId) { 185 mDeviceId = deviceId; 186 return *this; 187 } 188 downTime(nsecs_t downTime)189 KeyArgsBuilder& downTime(nsecs_t downTime) { 190 mDownTime = downTime; 191 return *this; 192 } 193 eventTime(nsecs_t eventTime)194 KeyArgsBuilder& eventTime(nsecs_t eventTime) { 195 mEventTime = eventTime; 196 return *this; 197 } 198 readTime(nsecs_t readTime)199 KeyArgsBuilder& readTime(nsecs_t readTime) { 200 mReadTime = readTime; 201 return *this; 202 } 203 displayId(ui::LogicalDisplayId displayId)204 KeyArgsBuilder& displayId(ui::LogicalDisplayId displayId) { 205 mDisplayId = displayId; 206 return *this; 207 } 208 policyFlags(int32_t policyFlags)209 KeyArgsBuilder& policyFlags(int32_t policyFlags) { 210 mPolicyFlags = policyFlags; 211 return *this; 212 } 213 addFlag(uint32_t flags)214 KeyArgsBuilder& addFlag(uint32_t flags) { 215 mFlags |= flags; 216 return *this; 217 } 218 keyCode(int32_t keyCode)219 KeyArgsBuilder& keyCode(int32_t keyCode) { 220 mKeyCode = keyCode; 221 return *this; 222 } 223 metaState(int32_t metaState)224 KeyArgsBuilder& metaState(int32_t metaState) { 225 mMetaState |= metaState; 226 mMetaState = normalizeMetaState(/*oldMetaState=*/mMetaState); 227 return *this; 228 } 229 build()230 NotifyKeyArgs build() const { 231 return {mEventId, mEventTime, mReadTime.value_or(mEventTime), 232 mDeviceId, mSource, mDisplayId, 233 mPolicyFlags, mAction, mFlags, 234 mKeyCode, mScanCode, mMetaState, 235 mDownTime}; 236 } 237 238 private: 239 const int32_t mEventId; 240 int32_t mAction; 241 int32_t mDeviceId = DEFAULT_DEVICE_ID; 242 uint32_t mSource; 243 nsecs_t mDownTime; 244 nsecs_t mEventTime; 245 std::optional<nsecs_t> mReadTime; 246 ui::LogicalDisplayId mDisplayId{ui::LogicalDisplayId::DEFAULT}; 247 uint32_t mPolicyFlags = DEFAULT_POLICY_FLAGS; 248 int32_t mFlags{0}; 249 int32_t mKeyCode{AKEYCODE_UNKNOWN}; 250 int32_t mScanCode{0}; 251 int32_t mMetaState{AMETA_NONE}; 252 }; 253 254 } // namespace android 255