xref: /aosp_15_r20/frameworks/native/services/inputflinger/include/NotifyArgsBuilders.h (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
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