xref: /aosp_15_r20/frameworks/native/services/inputflinger/dispatcher/Entry.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright (C) 2019 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 #define LOG_TAG "InputDispatcher"
18*38e8c45fSAndroid Build Coastguard Worker 
19*38e8c45fSAndroid Build Coastguard Worker #include "Entry.h"
20*38e8c45fSAndroid Build Coastguard Worker 
21*38e8c45fSAndroid Build Coastguard Worker #include "Connection.h"
22*38e8c45fSAndroid Build Coastguard Worker #include "DebugConfig.h"
23*38e8c45fSAndroid Build Coastguard Worker 
24*38e8c45fSAndroid Build Coastguard Worker #include <android-base/stringprintf.h>
25*38e8c45fSAndroid Build Coastguard Worker #include <cutils/atomic.h>
26*38e8c45fSAndroid Build Coastguard Worker #include <ftl/enum.h>
27*38e8c45fSAndroid Build Coastguard Worker #include <inttypes.h>
28*38e8c45fSAndroid Build Coastguard Worker 
29*38e8c45fSAndroid Build Coastguard Worker using android::base::StringPrintf;
30*38e8c45fSAndroid Build Coastguard Worker 
31*38e8c45fSAndroid Build Coastguard Worker namespace android::inputdispatcher {
32*38e8c45fSAndroid Build Coastguard Worker 
verifiedKeyEventFromKeyEntry(const KeyEntry & entry)33*38e8c45fSAndroid Build Coastguard Worker VerifiedKeyEvent verifiedKeyEventFromKeyEntry(const KeyEntry& entry) {
34*38e8c45fSAndroid Build Coastguard Worker     return {{VerifiedInputEvent::Type::KEY, entry.deviceId, entry.eventTime, entry.source,
35*38e8c45fSAndroid Build Coastguard Worker              entry.displayId},
36*38e8c45fSAndroid Build Coastguard Worker             entry.action,
37*38e8c45fSAndroid Build Coastguard Worker             entry.flags & VERIFIED_KEY_EVENT_FLAGS,
38*38e8c45fSAndroid Build Coastguard Worker             entry.downTime,
39*38e8c45fSAndroid Build Coastguard Worker             entry.keyCode,
40*38e8c45fSAndroid Build Coastguard Worker             entry.scanCode,
41*38e8c45fSAndroid Build Coastguard Worker             entry.metaState,
42*38e8c45fSAndroid Build Coastguard Worker             entry.repeatCount};
43*38e8c45fSAndroid Build Coastguard Worker }
44*38e8c45fSAndroid Build Coastguard Worker 
verifiedMotionEventFromMotionEntry(const MotionEntry & entry,const ui::Transform & rawTransform)45*38e8c45fSAndroid Build Coastguard Worker VerifiedMotionEvent verifiedMotionEventFromMotionEntry(const MotionEntry& entry,
46*38e8c45fSAndroid Build Coastguard Worker                                                        const ui::Transform& rawTransform) {
47*38e8c45fSAndroid Build Coastguard Worker     const vec2 rawXY = MotionEvent::calculateTransformedXY(entry.source, rawTransform,
48*38e8c45fSAndroid Build Coastguard Worker                                                            entry.pointerCoords[0].getXYValue());
49*38e8c45fSAndroid Build Coastguard Worker     const int actionMasked = entry.action & AMOTION_EVENT_ACTION_MASK;
50*38e8c45fSAndroid Build Coastguard Worker     return {{VerifiedInputEvent::Type::MOTION, entry.deviceId, entry.eventTime, entry.source,
51*38e8c45fSAndroid Build Coastguard Worker              entry.displayId},
52*38e8c45fSAndroid Build Coastguard Worker             rawXY.x,
53*38e8c45fSAndroid Build Coastguard Worker             rawXY.y,
54*38e8c45fSAndroid Build Coastguard Worker             actionMasked,
55*38e8c45fSAndroid Build Coastguard Worker             entry.flags & VERIFIED_MOTION_EVENT_FLAGS,
56*38e8c45fSAndroid Build Coastguard Worker             entry.downTime,
57*38e8c45fSAndroid Build Coastguard Worker             entry.metaState,
58*38e8c45fSAndroid Build Coastguard Worker             entry.buttonState};
59*38e8c45fSAndroid Build Coastguard Worker }
60*38e8c45fSAndroid Build Coastguard Worker 
61*38e8c45fSAndroid Build Coastguard Worker // --- EventEntry ---
62*38e8c45fSAndroid Build Coastguard Worker 
EventEntry(int32_t id,Type type,nsecs_t eventTime,uint32_t policyFlags)63*38e8c45fSAndroid Build Coastguard Worker EventEntry::EventEntry(int32_t id, Type type, nsecs_t eventTime, uint32_t policyFlags)
64*38e8c45fSAndroid Build Coastguard Worker       : id(id),
65*38e8c45fSAndroid Build Coastguard Worker         type(type),
66*38e8c45fSAndroid Build Coastguard Worker         eventTime(eventTime),
67*38e8c45fSAndroid Build Coastguard Worker         policyFlags(policyFlags),
68*38e8c45fSAndroid Build Coastguard Worker         injectionState(nullptr),
69*38e8c45fSAndroid Build Coastguard Worker         dispatchInProgress(false) {}
70*38e8c45fSAndroid Build Coastguard Worker 
71*38e8c45fSAndroid Build Coastguard Worker // --- DeviceResetEntry ---
72*38e8c45fSAndroid Build Coastguard Worker 
DeviceResetEntry(int32_t id,nsecs_t eventTime,int32_t deviceId)73*38e8c45fSAndroid Build Coastguard Worker DeviceResetEntry::DeviceResetEntry(int32_t id, nsecs_t eventTime, int32_t deviceId)
74*38e8c45fSAndroid Build Coastguard Worker       : EventEntry(id, Type::DEVICE_RESET, eventTime, 0), deviceId(deviceId) {}
75*38e8c45fSAndroid Build Coastguard Worker 
getDescription() const76*38e8c45fSAndroid Build Coastguard Worker std::string DeviceResetEntry::getDescription() const {
77*38e8c45fSAndroid Build Coastguard Worker     return StringPrintf("DeviceResetEvent(deviceId=%d), policyFlags=0x%08x", deviceId, policyFlags);
78*38e8c45fSAndroid Build Coastguard Worker }
79*38e8c45fSAndroid Build Coastguard Worker 
80*38e8c45fSAndroid Build Coastguard Worker // --- FocusEntry ---
81*38e8c45fSAndroid Build Coastguard Worker 
82*38e8c45fSAndroid Build Coastguard Worker // Focus notifications always go to apps, so set the flag POLICY_FLAG_PASS_TO_USER for all entries
FocusEntry(int32_t id,nsecs_t eventTime,sp<IBinder> connectionToken,bool hasFocus,const std::string & reason)83*38e8c45fSAndroid Build Coastguard Worker FocusEntry::FocusEntry(int32_t id, nsecs_t eventTime, sp<IBinder> connectionToken, bool hasFocus,
84*38e8c45fSAndroid Build Coastguard Worker                        const std::string& reason)
85*38e8c45fSAndroid Build Coastguard Worker       : EventEntry(id, Type::FOCUS, eventTime, POLICY_FLAG_PASS_TO_USER),
86*38e8c45fSAndroid Build Coastguard Worker         connectionToken(connectionToken),
87*38e8c45fSAndroid Build Coastguard Worker         hasFocus(hasFocus),
88*38e8c45fSAndroid Build Coastguard Worker         reason(reason) {}
89*38e8c45fSAndroid Build Coastguard Worker 
getDescription() const90*38e8c45fSAndroid Build Coastguard Worker std::string FocusEntry::getDescription() const {
91*38e8c45fSAndroid Build Coastguard Worker     return StringPrintf("FocusEvent(hasFocus=%s)", hasFocus ? "true" : "false");
92*38e8c45fSAndroid Build Coastguard Worker }
93*38e8c45fSAndroid Build Coastguard Worker 
94*38e8c45fSAndroid Build Coastguard Worker // --- PointerCaptureChangedEntry ---
95*38e8c45fSAndroid Build Coastguard Worker 
96*38e8c45fSAndroid Build Coastguard Worker // PointerCaptureChanged notifications always go to apps, so set the flag POLICY_FLAG_PASS_TO_USER
97*38e8c45fSAndroid Build Coastguard Worker // for all entries.
PointerCaptureChangedEntry(int32_t id,nsecs_t eventTime,const PointerCaptureRequest & request)98*38e8c45fSAndroid Build Coastguard Worker PointerCaptureChangedEntry::PointerCaptureChangedEntry(int32_t id, nsecs_t eventTime,
99*38e8c45fSAndroid Build Coastguard Worker                                                        const PointerCaptureRequest& request)
100*38e8c45fSAndroid Build Coastguard Worker       : EventEntry(id, Type::POINTER_CAPTURE_CHANGED, eventTime, POLICY_FLAG_PASS_TO_USER),
101*38e8c45fSAndroid Build Coastguard Worker         pointerCaptureRequest(request) {}
102*38e8c45fSAndroid Build Coastguard Worker 
getDescription() const103*38e8c45fSAndroid Build Coastguard Worker std::string PointerCaptureChangedEntry::getDescription() const {
104*38e8c45fSAndroid Build Coastguard Worker     return StringPrintf("PointerCaptureChangedEvent(pointerCaptureEnabled=%s)",
105*38e8c45fSAndroid Build Coastguard Worker                         pointerCaptureRequest.isEnable() ? "true" : "false");
106*38e8c45fSAndroid Build Coastguard Worker }
107*38e8c45fSAndroid Build Coastguard Worker 
108*38e8c45fSAndroid Build Coastguard Worker // --- DragEntry ---
109*38e8c45fSAndroid Build Coastguard Worker 
110*38e8c45fSAndroid Build Coastguard Worker // Drag notifications always go to apps, so set the flag POLICY_FLAG_PASS_TO_USER for all entries
DragEntry(int32_t id,nsecs_t eventTime,sp<IBinder> connectionToken,bool isExiting,float x,float y)111*38e8c45fSAndroid Build Coastguard Worker DragEntry::DragEntry(int32_t id, nsecs_t eventTime, sp<IBinder> connectionToken, bool isExiting,
112*38e8c45fSAndroid Build Coastguard Worker                      float x, float y)
113*38e8c45fSAndroid Build Coastguard Worker       : EventEntry(id, Type::DRAG, eventTime, POLICY_FLAG_PASS_TO_USER),
114*38e8c45fSAndroid Build Coastguard Worker         connectionToken(connectionToken),
115*38e8c45fSAndroid Build Coastguard Worker         isExiting(isExiting),
116*38e8c45fSAndroid Build Coastguard Worker         x(x),
117*38e8c45fSAndroid Build Coastguard Worker         y(y) {}
118*38e8c45fSAndroid Build Coastguard Worker 
getDescription() const119*38e8c45fSAndroid Build Coastguard Worker std::string DragEntry::getDescription() const {
120*38e8c45fSAndroid Build Coastguard Worker     return StringPrintf("DragEntry(isExiting=%s, x=%f, y=%f)", isExiting ? "true" : "false", x, y);
121*38e8c45fSAndroid Build Coastguard Worker }
122*38e8c45fSAndroid Build Coastguard Worker 
123*38e8c45fSAndroid Build Coastguard Worker // --- KeyEntry ---
124*38e8c45fSAndroid Build Coastguard Worker 
KeyEntry(int32_t id,std::shared_ptr<InjectionState> injectionState,nsecs_t eventTime,int32_t deviceId,uint32_t source,ui::LogicalDisplayId displayId,uint32_t policyFlags,int32_t action,int32_t flags,int32_t keyCode,int32_t scanCode,int32_t metaState,int32_t repeatCount,nsecs_t downTime)125*38e8c45fSAndroid Build Coastguard Worker KeyEntry::KeyEntry(int32_t id, std::shared_ptr<InjectionState> injectionState, nsecs_t eventTime,
126*38e8c45fSAndroid Build Coastguard Worker                    int32_t deviceId, uint32_t source, ui::LogicalDisplayId displayId,
127*38e8c45fSAndroid Build Coastguard Worker                    uint32_t policyFlags, int32_t action, int32_t flags, int32_t keyCode,
128*38e8c45fSAndroid Build Coastguard Worker                    int32_t scanCode, int32_t metaState, int32_t repeatCount, nsecs_t downTime)
129*38e8c45fSAndroid Build Coastguard Worker       : EventEntry(id, Type::KEY, eventTime, policyFlags),
130*38e8c45fSAndroid Build Coastguard Worker         deviceId(deviceId),
131*38e8c45fSAndroid Build Coastguard Worker         source(source),
132*38e8c45fSAndroid Build Coastguard Worker         displayId(displayId),
133*38e8c45fSAndroid Build Coastguard Worker         action(action),
134*38e8c45fSAndroid Build Coastguard Worker         keyCode(keyCode),
135*38e8c45fSAndroid Build Coastguard Worker         scanCode(scanCode),
136*38e8c45fSAndroid Build Coastguard Worker         metaState(metaState),
137*38e8c45fSAndroid Build Coastguard Worker         downTime(downTime),
138*38e8c45fSAndroid Build Coastguard Worker         syntheticRepeat(false),
139*38e8c45fSAndroid Build Coastguard Worker         interceptKeyResult(KeyEntry::InterceptKeyResult::UNKNOWN),
140*38e8c45fSAndroid Build Coastguard Worker         interceptKeyWakeupTime(0),
141*38e8c45fSAndroid Build Coastguard Worker         flags(flags),
142*38e8c45fSAndroid Build Coastguard Worker         repeatCount(repeatCount) {
143*38e8c45fSAndroid Build Coastguard Worker     EventEntry::injectionState = std::move(injectionState);
144*38e8c45fSAndroid Build Coastguard Worker }
145*38e8c45fSAndroid Build Coastguard Worker 
getDescription() const146*38e8c45fSAndroid Build Coastguard Worker std::string KeyEntry::getDescription() const {
147*38e8c45fSAndroid Build Coastguard Worker     if (!IS_DEBUGGABLE_BUILD) {
148*38e8c45fSAndroid Build Coastguard Worker         return "KeyEvent";
149*38e8c45fSAndroid Build Coastguard Worker     }
150*38e8c45fSAndroid Build Coastguard Worker     return StringPrintf("KeyEvent(deviceId=%d, eventTime=%" PRIu64 ", source=%s, displayId=%s, "
151*38e8c45fSAndroid Build Coastguard Worker                         "action=%s, "
152*38e8c45fSAndroid Build Coastguard Worker                         "flags=0x%08x, keyCode=%s(%d), scanCode=%d, metaState=0x%08x, "
153*38e8c45fSAndroid Build Coastguard Worker                         "repeatCount=%d), policyFlags=0x%08x",
154*38e8c45fSAndroid Build Coastguard Worker                         deviceId, eventTime, inputEventSourceToString(source).c_str(),
155*38e8c45fSAndroid Build Coastguard Worker                         displayId.toString().c_str(), KeyEvent::actionToString(action), flags,
156*38e8c45fSAndroid Build Coastguard Worker                         KeyEvent::getLabel(keyCode), keyCode, scanCode, metaState, repeatCount,
157*38e8c45fSAndroid Build Coastguard Worker                         policyFlags);
158*38e8c45fSAndroid Build Coastguard Worker }
159*38e8c45fSAndroid Build Coastguard Worker 
operator <<(std::ostream & out,const KeyEntry & keyEntry)160*38e8c45fSAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& out, const KeyEntry& keyEntry) {
161*38e8c45fSAndroid Build Coastguard Worker     out << keyEntry.getDescription();
162*38e8c45fSAndroid Build Coastguard Worker     return out;
163*38e8c45fSAndroid Build Coastguard Worker }
164*38e8c45fSAndroid Build Coastguard Worker 
165*38e8c45fSAndroid Build Coastguard Worker // --- TouchModeEntry ---
166*38e8c45fSAndroid Build Coastguard Worker 
TouchModeEntry(int32_t id,nsecs_t eventTime,bool inTouchMode,ui::LogicalDisplayId displayId)167*38e8c45fSAndroid Build Coastguard Worker TouchModeEntry::TouchModeEntry(int32_t id, nsecs_t eventTime, bool inTouchMode,
168*38e8c45fSAndroid Build Coastguard Worker                                ui::LogicalDisplayId displayId)
169*38e8c45fSAndroid Build Coastguard Worker       : EventEntry(id, Type::TOUCH_MODE_CHANGED, eventTime, POLICY_FLAG_PASS_TO_USER),
170*38e8c45fSAndroid Build Coastguard Worker         inTouchMode(inTouchMode),
171*38e8c45fSAndroid Build Coastguard Worker         displayId(displayId) {}
172*38e8c45fSAndroid Build Coastguard Worker 
getDescription() const173*38e8c45fSAndroid Build Coastguard Worker std::string TouchModeEntry::getDescription() const {
174*38e8c45fSAndroid Build Coastguard Worker     return StringPrintf("TouchModeEvent(inTouchMode=%s)", inTouchMode ? "true" : "false");
175*38e8c45fSAndroid Build Coastguard Worker }
176*38e8c45fSAndroid Build Coastguard Worker 
177*38e8c45fSAndroid Build Coastguard Worker // --- MotionEntry ---
178*38e8c45fSAndroid Build Coastguard Worker 
MotionEntry(int32_t id,std::shared_ptr<InjectionState> injectionState,nsecs_t eventTime,int32_t deviceId,uint32_t source,ui::LogicalDisplayId displayId,uint32_t policyFlags,int32_t action,int32_t actionButton,int32_t flags,int32_t metaState,int32_t buttonState,MotionClassification classification,int32_t edgeFlags,float xPrecision,float yPrecision,float xCursorPosition,float yCursorPosition,nsecs_t downTime,const std::vector<PointerProperties> & pointerProperties,const std::vector<PointerCoords> & pointerCoords)179*38e8c45fSAndroid Build Coastguard Worker MotionEntry::MotionEntry(int32_t id, std::shared_ptr<InjectionState> injectionState,
180*38e8c45fSAndroid Build Coastguard Worker                          nsecs_t eventTime, int32_t deviceId, uint32_t source,
181*38e8c45fSAndroid Build Coastguard Worker                          ui::LogicalDisplayId displayId, uint32_t policyFlags, int32_t action,
182*38e8c45fSAndroid Build Coastguard Worker                          int32_t actionButton, int32_t flags, int32_t metaState,
183*38e8c45fSAndroid Build Coastguard Worker                          int32_t buttonState, MotionClassification classification,
184*38e8c45fSAndroid Build Coastguard Worker                          int32_t edgeFlags, float xPrecision, float yPrecision,
185*38e8c45fSAndroid Build Coastguard Worker                          float xCursorPosition, float yCursorPosition, nsecs_t downTime,
186*38e8c45fSAndroid Build Coastguard Worker                          const std::vector<PointerProperties>& pointerProperties,
187*38e8c45fSAndroid Build Coastguard Worker                          const std::vector<PointerCoords>& pointerCoords)
188*38e8c45fSAndroid Build Coastguard Worker       : EventEntry(id, Type::MOTION, eventTime, policyFlags),
189*38e8c45fSAndroid Build Coastguard Worker         deviceId(deviceId),
190*38e8c45fSAndroid Build Coastguard Worker         source(source),
191*38e8c45fSAndroid Build Coastguard Worker         displayId(displayId),
192*38e8c45fSAndroid Build Coastguard Worker         action(action),
193*38e8c45fSAndroid Build Coastguard Worker         actionButton(actionButton),
194*38e8c45fSAndroid Build Coastguard Worker         flags(flags),
195*38e8c45fSAndroid Build Coastguard Worker         metaState(metaState),
196*38e8c45fSAndroid Build Coastguard Worker         buttonState(buttonState),
197*38e8c45fSAndroid Build Coastguard Worker         classification(classification),
198*38e8c45fSAndroid Build Coastguard Worker         edgeFlags(edgeFlags),
199*38e8c45fSAndroid Build Coastguard Worker         xPrecision(xPrecision),
200*38e8c45fSAndroid Build Coastguard Worker         yPrecision(yPrecision),
201*38e8c45fSAndroid Build Coastguard Worker         xCursorPosition(xCursorPosition),
202*38e8c45fSAndroid Build Coastguard Worker         yCursorPosition(yCursorPosition),
203*38e8c45fSAndroid Build Coastguard Worker         downTime(downTime),
204*38e8c45fSAndroid Build Coastguard Worker         pointerProperties(pointerProperties),
205*38e8c45fSAndroid Build Coastguard Worker         pointerCoords(pointerCoords) {
206*38e8c45fSAndroid Build Coastguard Worker     EventEntry::injectionState = std::move(injectionState);
207*38e8c45fSAndroid Build Coastguard Worker }
208*38e8c45fSAndroid Build Coastguard Worker 
getDescription() const209*38e8c45fSAndroid Build Coastguard Worker std::string MotionEntry::getDescription() const {
210*38e8c45fSAndroid Build Coastguard Worker     if (!IS_DEBUGGABLE_BUILD) {
211*38e8c45fSAndroid Build Coastguard Worker         return "MotionEvent";
212*38e8c45fSAndroid Build Coastguard Worker     }
213*38e8c45fSAndroid Build Coastguard Worker     std::string msg;
214*38e8c45fSAndroid Build Coastguard Worker     msg += StringPrintf("MotionEvent(deviceId=%d, eventTime=%" PRIu64
215*38e8c45fSAndroid Build Coastguard Worker                         ", source=%s, displayId=%s, action=%s, actionButton=0x%08x, flags=0x%08x,"
216*38e8c45fSAndroid Build Coastguard Worker                         " metaState=0x%08x, "
217*38e8c45fSAndroid Build Coastguard Worker                         "buttonState=0x%08x, "
218*38e8c45fSAndroid Build Coastguard Worker                         "classification=%s, edgeFlags=0x%08x, xPrecision=%.1f, yPrecision=%.1f, "
219*38e8c45fSAndroid Build Coastguard Worker                         "xCursorPosition=%0.1f, yCursorPosition=%0.1f, pointers=[",
220*38e8c45fSAndroid Build Coastguard Worker                         deviceId, eventTime, inputEventSourceToString(source).c_str(),
221*38e8c45fSAndroid Build Coastguard Worker                         displayId.toString().c_str(), MotionEvent::actionToString(action).c_str(),
222*38e8c45fSAndroid Build Coastguard Worker                         actionButton, flags, metaState, buttonState,
223*38e8c45fSAndroid Build Coastguard Worker                         motionClassificationToString(classification), edgeFlags, xPrecision,
224*38e8c45fSAndroid Build Coastguard Worker                         yPrecision, xCursorPosition, yCursorPosition);
225*38e8c45fSAndroid Build Coastguard Worker 
226*38e8c45fSAndroid Build Coastguard Worker     for (uint32_t i = 0; i < getPointerCount(); i++) {
227*38e8c45fSAndroid Build Coastguard Worker         if (i) {
228*38e8c45fSAndroid Build Coastguard Worker             msg += ", ";
229*38e8c45fSAndroid Build Coastguard Worker         }
230*38e8c45fSAndroid Build Coastguard Worker         msg += StringPrintf("%d: (%.1f, %.1f)", pointerProperties[i].id, pointerCoords[i].getX(),
231*38e8c45fSAndroid Build Coastguard Worker                             pointerCoords[i].getY());
232*38e8c45fSAndroid Build Coastguard Worker     }
233*38e8c45fSAndroid Build Coastguard Worker     msg += StringPrintf("]), policyFlags=0x%08x", policyFlags);
234*38e8c45fSAndroid Build Coastguard Worker     return msg;
235*38e8c45fSAndroid Build Coastguard Worker }
236*38e8c45fSAndroid Build Coastguard Worker 
operator <<(std::ostream & out,const MotionEntry & motionEntry)237*38e8c45fSAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& out, const MotionEntry& motionEntry) {
238*38e8c45fSAndroid Build Coastguard Worker     out << motionEntry.getDescription();
239*38e8c45fSAndroid Build Coastguard Worker     return out;
240*38e8c45fSAndroid Build Coastguard Worker }
241*38e8c45fSAndroid Build Coastguard Worker 
242*38e8c45fSAndroid Build Coastguard Worker // --- SensorEntry ---
243*38e8c45fSAndroid Build Coastguard Worker 
SensorEntry(int32_t id,nsecs_t eventTime,int32_t deviceId,uint32_t source,uint32_t policyFlags,nsecs_t hwTimestamp,InputDeviceSensorType sensorType,InputDeviceSensorAccuracy accuracy,bool accuracyChanged,std::vector<float> values)244*38e8c45fSAndroid Build Coastguard Worker SensorEntry::SensorEntry(int32_t id, nsecs_t eventTime, int32_t deviceId, uint32_t source,
245*38e8c45fSAndroid Build Coastguard Worker                          uint32_t policyFlags, nsecs_t hwTimestamp,
246*38e8c45fSAndroid Build Coastguard Worker                          InputDeviceSensorType sensorType, InputDeviceSensorAccuracy accuracy,
247*38e8c45fSAndroid Build Coastguard Worker                          bool accuracyChanged, std::vector<float> values)
248*38e8c45fSAndroid Build Coastguard Worker       : EventEntry(id, Type::SENSOR, eventTime, policyFlags),
249*38e8c45fSAndroid Build Coastguard Worker         deviceId(deviceId),
250*38e8c45fSAndroid Build Coastguard Worker         source(source),
251*38e8c45fSAndroid Build Coastguard Worker         sensorType(sensorType),
252*38e8c45fSAndroid Build Coastguard Worker         accuracy(accuracy),
253*38e8c45fSAndroid Build Coastguard Worker         accuracyChanged(accuracyChanged),
254*38e8c45fSAndroid Build Coastguard Worker         hwTimestamp(hwTimestamp),
255*38e8c45fSAndroid Build Coastguard Worker         values(std::move(values)) {}
256*38e8c45fSAndroid Build Coastguard Worker 
getDescription() const257*38e8c45fSAndroid Build Coastguard Worker std::string SensorEntry::getDescription() const {
258*38e8c45fSAndroid Build Coastguard Worker     std::string msg;
259*38e8c45fSAndroid Build Coastguard Worker     msg += StringPrintf("SensorEntry(deviceId=%d, source=%s, sensorType=%s, "
260*38e8c45fSAndroid Build Coastguard Worker                         "accuracy=%s, hwTimestamp=%" PRId64,
261*38e8c45fSAndroid Build Coastguard Worker                         deviceId, inputEventSourceToString(source).c_str(),
262*38e8c45fSAndroid Build Coastguard Worker                         ftl::enum_string(sensorType).c_str(), ftl::enum_string(accuracy).c_str(),
263*38e8c45fSAndroid Build Coastguard Worker                         hwTimestamp);
264*38e8c45fSAndroid Build Coastguard Worker 
265*38e8c45fSAndroid Build Coastguard Worker     if (IS_DEBUGGABLE_BUILD) {
266*38e8c45fSAndroid Build Coastguard Worker         for (size_t i = 0; i < values.size(); i++) {
267*38e8c45fSAndroid Build Coastguard Worker             if (i > 0) {
268*38e8c45fSAndroid Build Coastguard Worker                 msg += ", ";
269*38e8c45fSAndroid Build Coastguard Worker             }
270*38e8c45fSAndroid Build Coastguard Worker             msg += StringPrintf("(%.3f)", values[i]);
271*38e8c45fSAndroid Build Coastguard Worker         }
272*38e8c45fSAndroid Build Coastguard Worker     }
273*38e8c45fSAndroid Build Coastguard Worker     msg += StringPrintf(", policyFlags=0x%08x", policyFlags);
274*38e8c45fSAndroid Build Coastguard Worker     return msg;
275*38e8c45fSAndroid Build Coastguard Worker }
276*38e8c45fSAndroid Build Coastguard Worker 
277*38e8c45fSAndroid Build Coastguard Worker // --- DispatchEntry ---
278*38e8c45fSAndroid Build Coastguard Worker 
279*38e8c45fSAndroid Build Coastguard Worker volatile int32_t DispatchEntry::sNextSeqAtomic;
280*38e8c45fSAndroid Build Coastguard Worker 
DispatchEntry(std::shared_ptr<const EventEntry> eventEntry,ftl::Flags<InputTargetFlags> targetFlags,const ui::Transform & transform,const ui::Transform & rawTransform,float globalScaleFactor,gui::Uid targetUid,int64_t vsyncId,std::optional<int32_t> windowId)281*38e8c45fSAndroid Build Coastguard Worker DispatchEntry::DispatchEntry(std::shared_ptr<const EventEntry> eventEntry,
282*38e8c45fSAndroid Build Coastguard Worker                              ftl::Flags<InputTargetFlags> targetFlags,
283*38e8c45fSAndroid Build Coastguard Worker                              const ui::Transform& transform, const ui::Transform& rawTransform,
284*38e8c45fSAndroid Build Coastguard Worker                              float globalScaleFactor, gui::Uid targetUid, int64_t vsyncId,
285*38e8c45fSAndroid Build Coastguard Worker                              std::optional<int32_t> windowId)
286*38e8c45fSAndroid Build Coastguard Worker       : seq(nextSeq()),
287*38e8c45fSAndroid Build Coastguard Worker         eventEntry(std::move(eventEntry)),
288*38e8c45fSAndroid Build Coastguard Worker         targetFlags(targetFlags),
289*38e8c45fSAndroid Build Coastguard Worker         transform(transform),
290*38e8c45fSAndroid Build Coastguard Worker         rawTransform(rawTransform),
291*38e8c45fSAndroid Build Coastguard Worker         globalScaleFactor(globalScaleFactor),
292*38e8c45fSAndroid Build Coastguard Worker         deliveryTime(0),
293*38e8c45fSAndroid Build Coastguard Worker         resolvedFlags(0),
294*38e8c45fSAndroid Build Coastguard Worker         targetUid(targetUid),
295*38e8c45fSAndroid Build Coastguard Worker         vsyncId(vsyncId),
296*38e8c45fSAndroid Build Coastguard Worker         windowId(windowId) {
297*38e8c45fSAndroid Build Coastguard Worker     switch (this->eventEntry->type) {
298*38e8c45fSAndroid Build Coastguard Worker         case EventEntry::Type::KEY: {
299*38e8c45fSAndroid Build Coastguard Worker             const KeyEntry& keyEntry = static_cast<const KeyEntry&>(*this->eventEntry);
300*38e8c45fSAndroid Build Coastguard Worker             resolvedFlags = keyEntry.flags;
301*38e8c45fSAndroid Build Coastguard Worker             break;
302*38e8c45fSAndroid Build Coastguard Worker         }
303*38e8c45fSAndroid Build Coastguard Worker         case EventEntry::Type::MOTION: {
304*38e8c45fSAndroid Build Coastguard Worker             const MotionEntry& motionEntry = static_cast<const MotionEntry&>(*this->eventEntry);
305*38e8c45fSAndroid Build Coastguard Worker             resolvedFlags = motionEntry.flags;
306*38e8c45fSAndroid Build Coastguard Worker             break;
307*38e8c45fSAndroid Build Coastguard Worker         }
308*38e8c45fSAndroid Build Coastguard Worker         default: {
309*38e8c45fSAndroid Build Coastguard Worker             break;
310*38e8c45fSAndroid Build Coastguard Worker         }
311*38e8c45fSAndroid Build Coastguard Worker     }
312*38e8c45fSAndroid Build Coastguard Worker }
313*38e8c45fSAndroid Build Coastguard Worker 
nextSeq()314*38e8c45fSAndroid Build Coastguard Worker uint32_t DispatchEntry::nextSeq() {
315*38e8c45fSAndroid Build Coastguard Worker     // Sequence number 0 is reserved and will never be returned.
316*38e8c45fSAndroid Build Coastguard Worker     uint32_t seq;
317*38e8c45fSAndroid Build Coastguard Worker     do {
318*38e8c45fSAndroid Build Coastguard Worker         seq = android_atomic_inc(&sNextSeqAtomic);
319*38e8c45fSAndroid Build Coastguard Worker     } while (!seq);
320*38e8c45fSAndroid Build Coastguard Worker     return seq;
321*38e8c45fSAndroid Build Coastguard Worker }
322*38e8c45fSAndroid Build Coastguard Worker 
operator <<(std::ostream & out,const DispatchEntry & entry)323*38e8c45fSAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& out, const DispatchEntry& entry) {
324*38e8c45fSAndroid Build Coastguard Worker     std::string transform;
325*38e8c45fSAndroid Build Coastguard Worker     entry.transform.dump(transform, "transform");
326*38e8c45fSAndroid Build Coastguard Worker     out << "DispatchEntry{resolvedFlags=" << entry.resolvedFlags
327*38e8c45fSAndroid Build Coastguard Worker         << ", targetFlags=" << entry.targetFlags.string() << ", transform=" << transform
328*38e8c45fSAndroid Build Coastguard Worker         << "} original: " << entry.eventEntry->getDescription();
329*38e8c45fSAndroid Build Coastguard Worker     return out;
330*38e8c45fSAndroid Build Coastguard Worker }
331*38e8c45fSAndroid Build Coastguard Worker 
332*38e8c45fSAndroid Build Coastguard Worker } // namespace android::inputdispatcher
333