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