blob: 13eaaf3be91cf0d5414bcb1c6cdabbc5e293f900 [file] [log] [blame]
Prabir Pradhan9205e422023-05-16 20:06:13 +00001/*
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>
Cody Heiner166a5af2023-07-07 12:25:00 -070023#include <input/InputEventBuilders.h>
Arpit Singhb65e2bd2024-06-03 09:48:16 +000024#include <input/Keyboard.h>
Cody Heiner166a5af2023-07-07 12:25:00 -070025#include <utils/Timers.h> // for nsecs_t, systemTime
26
Siarhei Vishniakou93ee5402024-10-09 00:07:23 +000027#include <cstdint>
Prabir Pradhan9205e422023-05-16 20:06:13 +000028#include <vector>
29
30namespace android {
31
Prabir Pradhan9205e422023-05-16 20:06:13 +000032class MotionArgsBuilder {
33public:
Siarhei Vishniakou93ee5402024-10-09 00:07:23 +000034 MotionArgsBuilder(int32_t action, int32_t source, int32_t eventId = InputEvent::nextId())
35 : mEventId(eventId) {
Prabir Pradhan9205e422023-05-16 20:06:13 +000036 mAction = action;
Prabir Pradhan9a9897d2024-03-21 21:52:57 +000037 if (mAction == AMOTION_EVENT_ACTION_CANCEL) {
38 addFlag(AMOTION_EVENT_FLAG_CANCELED);
39 }
Prabir Pradhan9205e422023-05-16 20:06:13 +000040 mSource = source;
41 mEventTime = systemTime(SYSTEM_TIME_MONOTONIC);
42 mDownTime = mEventTime;
43 }
44
45 MotionArgsBuilder& deviceId(int32_t deviceId) {
46 mDeviceId = deviceId;
47 return *this;
48 }
49
50 MotionArgsBuilder& downTime(nsecs_t downTime) {
51 mDownTime = downTime;
52 return *this;
53 }
54
55 MotionArgsBuilder& eventTime(nsecs_t eventTime) {
56 mEventTime = eventTime;
57 return *this;
58 }
59
Siarhei Vishniakou93ee5402024-10-09 00:07:23 +000060 MotionArgsBuilder& readTime(nsecs_t readTime) {
61 mReadTime = readTime;
62 return *this;
63 }
64
Linnan Li13bf76a2024-05-05 19:18:02 +080065 MotionArgsBuilder& displayId(ui::LogicalDisplayId displayId) {
Prabir Pradhan9205e422023-05-16 20:06:13 +000066 mDisplayId = displayId;
67 return *this;
68 }
69
70 MotionArgsBuilder& policyFlags(int32_t policyFlags) {
71 mPolicyFlags = policyFlags;
72 return *this;
73 }
74
75 MotionArgsBuilder& actionButton(int32_t actionButton) {
76 mActionButton = actionButton;
77 return *this;
78 }
79
80 MotionArgsBuilder& buttonState(int32_t buttonState) {
81 mButtonState = buttonState;
82 return *this;
83 }
84
85 MotionArgsBuilder& rawXCursorPosition(float rawXCursorPosition) {
86 mRawXCursorPosition = rawXCursorPosition;
87 return *this;
88 }
89
90 MotionArgsBuilder& rawYCursorPosition(float rawYCursorPosition) {
91 mRawYCursorPosition = rawYCursorPosition;
92 return *this;
93 }
94
95 MotionArgsBuilder& pointer(PointerBuilder pointer) {
96 mPointers.push_back(pointer);
97 return *this;
98 }
99
100 MotionArgsBuilder& addFlag(uint32_t flags) {
101 mFlags |= flags;
102 return *this;
103 }
104
105 MotionArgsBuilder& classification(MotionClassification classification) {
106 mClassification = classification;
107 return *this;
108 }
109
Prabir Pradhan9a9897d2024-03-21 21:52:57 +0000110 NotifyMotionArgs build() const {
Prabir Pradhan9205e422023-05-16 20:06:13 +0000111 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.
Prabir Pradhan9a9897d2024-03-21 21:52:57 +0000119 float resolvedCursorX = mRawXCursorPosition;
120 float resolvedCursorY = mRawYCursorPosition;
Prabir Pradhan9205e422023-05-16 20:06:13 +0000121 if (mSource == AINPUT_SOURCE_MOUSE &&
Nergi Rahardie0a4cfe2024-03-11 13:18:59 +0900122 !MotionEvent::isValidCursorPosition(mRawXCursorPosition, mRawYCursorPosition) &&
123 BitSet64::hasBit(pointerCoords[0].bits, AMOTION_EVENT_AXIS_X) &&
124 BitSet64::hasBit(pointerCoords[0].bits, AMOTION_EVENT_AXIS_Y)) {
Prabir Pradhan9a9897d2024-03-21 21:52:57 +0000125 resolvedCursorX = pointerCoords[0].getX();
126 resolvedCursorY = pointerCoords[0].getY();
Prabir Pradhan9205e422023-05-16 20:06:13 +0000127 }
128
Prabir Pradhan9a9897d2024-03-21 21:52:57 +0000129 return {mEventId,
Prabir Pradhan9205e422023-05-16 20:06:13 +0000130 mEventTime,
Siarhei Vishniakou93ee5402024-10-09 00:07:23 +0000131 mReadTime.value_or(mEventTime),
Prabir Pradhan9205e422023-05-16 20:06:13 +0000132 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,
Prabir Pradhan9a9897d2024-03-21 21:52:57 +0000148 resolvedCursorX,
149 resolvedCursorY,
Prabir Pradhan9205e422023-05-16 20:06:13 +0000150 mDownTime,
151 /*videoFrames=*/{}};
152 }
153
154private:
Prabir Pradhan9a9897d2024-03-21 21:52:57 +0000155 const int32_t mEventId;
Prabir Pradhan9205e422023-05-16 20:06:13 +0000156 int32_t mAction;
157 int32_t mDeviceId{DEFAULT_DEVICE_ID};
158 uint32_t mSource;
159 nsecs_t mDownTime;
160 nsecs_t mEventTime;
Siarhei Vishniakou93ee5402024-10-09 00:07:23 +0000161 std::optional<nsecs_t> mReadTime;
Siarhei Vishniakoucfbee532024-05-10 13:41:35 -0700162 ui::LogicalDisplayId mDisplayId{ui::LogicalDisplayId::DEFAULT};
Prabir Pradhan9205e422023-05-16 20:06:13 +0000163 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
Prabir Pradhanae10ee62023-05-12 19:44:18 +0000174class KeyArgsBuilder {
175public:
Siarhei Vishniakou93ee5402024-10-09 00:07:23 +0000176 KeyArgsBuilder(int32_t action, int32_t source, int32_t eventId = InputEvent::nextId())
177 : mEventId(eventId) {
Prabir Pradhanae10ee62023-05-12 19:44:18 +0000178 mAction = action;
179 mSource = source;
180 mEventTime = systemTime(SYSTEM_TIME_MONOTONIC);
181 mDownTime = mEventTime;
182 }
183
184 KeyArgsBuilder& deviceId(int32_t deviceId) {
185 mDeviceId = deviceId;
186 return *this;
187 }
188
189 KeyArgsBuilder& downTime(nsecs_t downTime) {
190 mDownTime = downTime;
191 return *this;
192 }
193
194 KeyArgsBuilder& eventTime(nsecs_t eventTime) {
195 mEventTime = eventTime;
196 return *this;
197 }
198
Siarhei Vishniakou93ee5402024-10-09 00:07:23 +0000199 KeyArgsBuilder& readTime(nsecs_t readTime) {
200 mReadTime = readTime;
201 return *this;
202 }
203
Linnan Li13bf76a2024-05-05 19:18:02 +0800204 KeyArgsBuilder& displayId(ui::LogicalDisplayId displayId) {
Prabir Pradhanae10ee62023-05-12 19:44:18 +0000205 mDisplayId = displayId;
206 return *this;
207 }
208
209 KeyArgsBuilder& policyFlags(int32_t policyFlags) {
210 mPolicyFlags = policyFlags;
211 return *this;
212 }
213
214 KeyArgsBuilder& addFlag(uint32_t flags) {
215 mFlags |= flags;
216 return *this;
217 }
218
219 KeyArgsBuilder& keyCode(int32_t keyCode) {
220 mKeyCode = keyCode;
221 return *this;
222 }
223
Arpit Singhb65e2bd2024-06-03 09:48:16 +0000224 KeyArgsBuilder& metaState(int32_t metaState) {
225 mMetaState |= metaState;
226 mMetaState = normalizeMetaState(/*oldMetaState=*/mMetaState);
227 return *this;
228 }
229
Prabir Pradhanae10ee62023-05-12 19:44:18 +0000230 NotifyKeyArgs build() const {
Siarhei Vishniakou93ee5402024-10-09 00:07:23 +0000231 return {mEventId, mEventTime, mReadTime.value_or(mEventTime),
232 mDeviceId, mSource, mDisplayId,
233 mPolicyFlags, mAction, mFlags,
234 mKeyCode, mScanCode, mMetaState,
Prabir Pradhanae10ee62023-05-12 19:44:18 +0000235 mDownTime};
236 }
237
238private:
Prabir Pradhan9a9897d2024-03-21 21:52:57 +0000239 const int32_t mEventId;
Prabir Pradhanae10ee62023-05-12 19:44:18 +0000240 int32_t mAction;
241 int32_t mDeviceId = DEFAULT_DEVICE_ID;
242 uint32_t mSource;
243 nsecs_t mDownTime;
244 nsecs_t mEventTime;
Siarhei Vishniakou93ee5402024-10-09 00:07:23 +0000245 std::optional<nsecs_t> mReadTime;
Siarhei Vishniakoucfbee532024-05-10 13:41:35 -0700246 ui::LogicalDisplayId mDisplayId{ui::LogicalDisplayId::DEFAULT};
Prabir Pradhanae10ee62023-05-12 19:44:18 +0000247 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
Prabir Pradhan9205e422023-05-16 20:06:13 +0000254} // namespace android