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