blob: 288068f5848adf86962ff4f9d993e55a4fa4833b [file] [log] [blame]
Garfield Tane84e6f92019-08-29 17:28:41 -07001/*
2 * Copyright (C) 2019 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#include "Entry.h"
18
19#include "Connection.h"
20
Ashwini Orugantid399a522019-10-10 11:16:45 -070021#include <android-base/properties.h>
Garfield Tane84e6f92019-08-29 17:28:41 -070022#include <android-base/stringprintf.h>
23#include <cutils/atomic.h>
24#include <inttypes.h>
25
Ashwini Orugantid399a522019-10-10 11:16:45 -070026using android::base::GetBoolProperty;
Garfield Tane84e6f92019-08-29 17:28:41 -070027using android::base::StringPrintf;
28
29namespace android::inputdispatcher {
30
Gang Wange9087892020-01-07 12:17:14 -050031VerifiedKeyEvent verifiedKeyEventFromKeyEntry(const KeyEntry& entry) {
32 return {{VerifiedInputEvent::Type::KEY, entry.deviceId, entry.eventTime, entry.source,
33 entry.displayId},
34 entry.action,
35 entry.downTime,
36 entry.flags & VERIFIED_KEY_EVENT_FLAGS,
37 entry.keyCode,
38 entry.scanCode,
39 entry.metaState,
40 entry.repeatCount};
41}
42
43VerifiedMotionEvent verifiedMotionEventFromMotionEntry(const MotionEntry& entry) {
44 const float rawX = entry.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_X);
45 const float rawY = entry.pointerCoords[0].getAxisValue(AMOTION_EVENT_AXIS_Y);
46 const int actionMasked = entry.action & AMOTION_EVENT_ACTION_MASK;
47 return {{VerifiedInputEvent::Type::MOTION, entry.deviceId, entry.eventTime, entry.source,
48 entry.displayId},
49 rawX,
50 rawY,
51 actionMasked,
52 entry.downTime,
53 entry.flags & VERIFIED_MOTION_EVENT_FLAGS,
54 entry.metaState,
55 entry.buttonState};
56}
Garfield Tane84e6f92019-08-29 17:28:41 -070057
58// --- EventEntry ---
59
Garfield Tanc51d1ba2020-01-28 13:24:04 -080060EventEntry::EventEntry(int32_t id, Type type, nsecs_t eventTime, uint32_t policyFlags)
61 : id(id),
Garfield Tane84e6f92019-08-29 17:28:41 -070062 type(type),
63 eventTime(eventTime),
64 policyFlags(policyFlags),
65 injectionState(nullptr),
66 dispatchInProgress(false) {}
67
68EventEntry::~EventEntry() {
69 releaseInjectionState();
70}
71
Garfield Tane84e6f92019-08-29 17:28:41 -070072void EventEntry::releaseInjectionState() {
73 if (injectionState) {
74 injectionState->release();
75 injectionState = nullptr;
76 }
77}
78
79// --- ConfigurationChangedEntry ---
80
Garfield Tanc51d1ba2020-01-28 13:24:04 -080081ConfigurationChangedEntry::ConfigurationChangedEntry(int32_t id, nsecs_t eventTime)
82 : EventEntry(id, Type::CONFIGURATION_CHANGED, eventTime, 0) {}
Garfield Tane84e6f92019-08-29 17:28:41 -070083
84ConfigurationChangedEntry::~ConfigurationChangedEntry() {}
85
Siarhei Vishniakou14411c92020-09-18 21:15:05 -050086std::string ConfigurationChangedEntry::getDescription() const {
87 return StringPrintf("ConfigurationChangedEvent(), policyFlags=0x%08x", policyFlags);
Garfield Tane84e6f92019-08-29 17:28:41 -070088}
89
90// --- DeviceResetEntry ---
91
Garfield Tanc51d1ba2020-01-28 13:24:04 -080092DeviceResetEntry::DeviceResetEntry(int32_t id, nsecs_t eventTime, int32_t deviceId)
93 : EventEntry(id, Type::DEVICE_RESET, eventTime, 0), deviceId(deviceId) {}
Garfield Tane84e6f92019-08-29 17:28:41 -070094
95DeviceResetEntry::~DeviceResetEntry() {}
96
Siarhei Vishniakou14411c92020-09-18 21:15:05 -050097std::string DeviceResetEntry::getDescription() const {
98 return StringPrintf("DeviceResetEvent(deviceId=%d), policyFlags=0x%08x", deviceId, policyFlags);
Garfield Tane84e6f92019-08-29 17:28:41 -070099}
100
Siarhei Vishniakouf1035d42019-09-20 16:32:01 +0100101// --- FocusEntry ---
102
103// Focus notifications always go to apps, so set the flag POLICY_FLAG_PASS_TO_USER for all entries
Vishnu Nair7d3d00d2020-08-03 11:20:42 -0700104FocusEntry::FocusEntry(int32_t id, nsecs_t eventTime, sp<IBinder> connectionToken, bool hasFocus,
Vishnu Nairc519ff72021-01-21 08:23:08 -0800105 const std::string& reason)
Garfield Tanc51d1ba2020-01-28 13:24:04 -0800106 : EventEntry(id, Type::FOCUS, eventTime, POLICY_FLAG_PASS_TO_USER),
Siarhei Vishniakouf1035d42019-09-20 16:32:01 +0100107 connectionToken(connectionToken),
Vishnu Nair7d3d00d2020-08-03 11:20:42 -0700108 hasFocus(hasFocus),
109 reason(reason) {}
Siarhei Vishniakouf1035d42019-09-20 16:32:01 +0100110
111FocusEntry::~FocusEntry() {}
112
Siarhei Vishniakou14411c92020-09-18 21:15:05 -0500113std::string FocusEntry::getDescription() const {
114 return StringPrintf("FocusEvent(hasFocus=%s)", hasFocus ? "true" : "false");
Siarhei Vishniakouf1035d42019-09-20 16:32:01 +0100115}
116
Prabir Pradhan99987712020-11-10 18:43:05 -0800117// --- PointerCaptureChangedEntry ---
118
119// PointerCaptureChanged notifications always go to apps, so set the flag POLICY_FLAG_PASS_TO_USER
120// for all entries.
121PointerCaptureChangedEntry::PointerCaptureChangedEntry(int32_t id, nsecs_t eventTime,
122 bool hasPointerCapture)
123 : EventEntry(id, Type::POINTER_CAPTURE_CHANGED, eventTime, POLICY_FLAG_PASS_TO_USER),
124 pointerCaptureEnabled(hasPointerCapture) {}
125
126PointerCaptureChangedEntry::~PointerCaptureChangedEntry() {}
127
128std::string PointerCaptureChangedEntry::getDescription() const {
129 return StringPrintf("PointerCaptureChangedEvent(pointerCaptureEnabled=%s)",
130 pointerCaptureEnabled ? "true" : "false");
131}
132
arthurhungb89ccb02020-12-30 16:19:01 +0800133// --- DragEntry ---
134
135// Drag notifications always go to apps, so set the flag POLICY_FLAG_PASS_TO_USER for all entries
136DragEntry::DragEntry(int32_t id, nsecs_t eventTime, sp<IBinder> connectionToken, bool isExiting,
137 float x, float y)
138 : EventEntry(id, Type::DRAG, eventTime, POLICY_FLAG_PASS_TO_USER),
139 connectionToken(connectionToken),
140 isExiting(isExiting),
141 x(x),
142 y(y) {}
143
144DragEntry::~DragEntry() {}
145
146std::string DragEntry::getDescription() const {
147 return StringPrintf("DragEntry(isExiting=%s, x=%f, y=%f)", isExiting ? "true" : "false", x, y);
148}
149
Garfield Tane84e6f92019-08-29 17:28:41 -0700150// --- KeyEntry ---
151
Garfield Tanc51d1ba2020-01-28 13:24:04 -0800152KeyEntry::KeyEntry(int32_t id, nsecs_t eventTime, int32_t deviceId, uint32_t source,
Garfield Tane84e6f92019-08-29 17:28:41 -0700153 int32_t displayId, uint32_t policyFlags, int32_t action, int32_t flags,
154 int32_t keyCode, int32_t scanCode, int32_t metaState, int32_t repeatCount,
155 nsecs_t downTime)
Garfield Tanc51d1ba2020-01-28 13:24:04 -0800156 : EventEntry(id, Type::KEY, eventTime, policyFlags),
Garfield Tane84e6f92019-08-29 17:28:41 -0700157 deviceId(deviceId),
158 source(source),
159 displayId(displayId),
160 action(action),
161 flags(flags),
162 keyCode(keyCode),
163 scanCode(scanCode),
164 metaState(metaState),
165 repeatCount(repeatCount),
166 downTime(downTime),
167 syntheticRepeat(false),
168 interceptKeyResult(KeyEntry::INTERCEPT_KEY_RESULT_UNKNOWN),
169 interceptKeyWakeupTime(0) {}
170
171KeyEntry::~KeyEntry() {}
172
Siarhei Vishniakou14411c92020-09-18 21:15:05 -0500173std::string KeyEntry::getDescription() const {
Ashwini Orugantid399a522019-10-10 11:16:45 -0700174 if (!GetBoolProperty("ro.debuggable", false)) {
Siarhei Vishniakou14411c92020-09-18 21:15:05 -0500175 return "KeyEvent";
Ashwini Orugantid399a522019-10-10 11:16:45 -0700176 }
Siarhei Vishniakoua1188f52020-10-20 20:14:52 -0500177 return StringPrintf("KeyEvent(deviceId=%d, eventTime=%" PRIu64
178 ", source=0x%08x, displayId=%" PRId32 ", action=%s, "
Siarhei Vishniakou5b6c96f2021-02-25 00:21:51 -1000179 "flags=0x%08x, keyCode=%s(%d), scanCode=%d, metaState=0x%08x, "
Garfield Tane84e6f92019-08-29 17:28:41 -0700180 "repeatCount=%d), policyFlags=0x%08x",
Siarhei Vishniakoua1188f52020-10-20 20:14:52 -0500181 deviceId, eventTime, source, displayId, KeyEvent::actionToString(action),
Siarhei Vishniakou5b6c96f2021-02-25 00:21:51 -1000182 flags, KeyEvent::getLabel(keyCode), keyCode, scanCode, metaState,
183 repeatCount, policyFlags);
Garfield Tane84e6f92019-08-29 17:28:41 -0700184}
185
186void KeyEntry::recycle() {
187 releaseInjectionState();
188
189 dispatchInProgress = false;
190 syntheticRepeat = false;
191 interceptKeyResult = KeyEntry::INTERCEPT_KEY_RESULT_UNKNOWN;
192 interceptKeyWakeupTime = 0;
193}
194
195// --- MotionEntry ---
196
Garfield Tanc51d1ba2020-01-28 13:24:04 -0800197MotionEntry::MotionEntry(int32_t id, nsecs_t eventTime, int32_t deviceId, uint32_t source,
Garfield Tane84e6f92019-08-29 17:28:41 -0700198 int32_t displayId, uint32_t policyFlags, int32_t action,
199 int32_t actionButton, int32_t flags, int32_t metaState,
200 int32_t buttonState, MotionClassification classification,
201 int32_t edgeFlags, float xPrecision, float yPrecision,
202 float xCursorPosition, float yCursorPosition, nsecs_t downTime,
203 uint32_t pointerCount, const PointerProperties* pointerProperties,
204 const PointerCoords* pointerCoords, float xOffset, float yOffset)
Garfield Tanc51d1ba2020-01-28 13:24:04 -0800205 : EventEntry(id, Type::MOTION, eventTime, policyFlags),
Garfield Tane84e6f92019-08-29 17:28:41 -0700206 deviceId(deviceId),
207 source(source),
208 displayId(displayId),
209 action(action),
210 actionButton(actionButton),
211 flags(flags),
212 metaState(metaState),
213 buttonState(buttonState),
214 classification(classification),
215 edgeFlags(edgeFlags),
216 xPrecision(xPrecision),
217 yPrecision(yPrecision),
218 xCursorPosition(xCursorPosition),
219 yCursorPosition(yCursorPosition),
220 downTime(downTime),
221 pointerCount(pointerCount) {
222 for (uint32_t i = 0; i < pointerCount; i++) {
223 this->pointerProperties[i].copyFrom(pointerProperties[i]);
224 this->pointerCoords[i].copyFrom(pointerCoords[i]);
225 if (xOffset || yOffset) {
226 this->pointerCoords[i].applyOffset(xOffset, yOffset);
227 }
228 }
229}
230
231MotionEntry::~MotionEntry() {}
232
Siarhei Vishniakou14411c92020-09-18 21:15:05 -0500233std::string MotionEntry::getDescription() const {
Ashwini Orugantid399a522019-10-10 11:16:45 -0700234 if (!GetBoolProperty("ro.debuggable", false)) {
Siarhei Vishniakou14411c92020-09-18 21:15:05 -0500235 return "MotionEvent";
Ashwini Orugantid399a522019-10-10 11:16:45 -0700236 }
Siarhei Vishniakou14411c92020-09-18 21:15:05 -0500237 std::string msg;
Siarhei Vishniakoua1188f52020-10-20 20:14:52 -0500238 msg += StringPrintf("MotionEvent(deviceId=%d, eventTime=%" PRIu64
239 ", source=0x%08x, displayId=%" PRId32
Garfield Tane84e6f92019-08-29 17:28:41 -0700240 ", action=%s, actionButton=0x%08x, flags=0x%08x, metaState=0x%08x, "
241 "buttonState=0x%08x, "
242 "classification=%s, edgeFlags=0x%08x, xPrecision=%.1f, yPrecision=%.1f, "
243 "xCursorPosition=%0.1f, yCursorPosition=%0.1f, pointers=[",
Siarhei Vishniakouc68fdec2020-10-22 14:58:14 -0500244 deviceId, eventTime, source, displayId,
245 MotionEvent::actionToString(action).c_str(), actionButton, flags, metaState,
246 buttonState, motionClassificationToString(classification), edgeFlags,
247 xPrecision, yPrecision, xCursorPosition, yCursorPosition);
Garfield Tane84e6f92019-08-29 17:28:41 -0700248
249 for (uint32_t i = 0; i < pointerCount; i++) {
250 if (i) {
251 msg += ", ";
252 }
253 msg += StringPrintf("%d: (%.1f, %.1f)", pointerProperties[i].id, pointerCoords[i].getX(),
254 pointerCoords[i].getY());
255 }
256 msg += StringPrintf("]), policyFlags=0x%08x", policyFlags);
Siarhei Vishniakou14411c92020-09-18 21:15:05 -0500257 return msg;
Garfield Tane84e6f92019-08-29 17:28:41 -0700258}
259
Chris Yef59a2f42020-10-16 12:55:26 -0700260// --- SensorEntry ---
261
262SensorEntry::SensorEntry(int32_t id, nsecs_t eventTime, int32_t deviceId, uint32_t source,
263 uint32_t policyFlags, nsecs_t hwTimestamp,
264 InputDeviceSensorType sensorType, InputDeviceSensorAccuracy accuracy,
265 bool accuracyChanged, std::vector<float> values)
266 : EventEntry(id, Type::SENSOR, eventTime, policyFlags),
267 deviceId(deviceId),
268 source(source),
269 sensorType(sensorType),
270 accuracy(accuracy),
271 accuracyChanged(accuracyChanged),
272 hwTimestamp(hwTimestamp),
273 values(std::move(values)) {}
274
275SensorEntry::~SensorEntry() {}
276
277std::string SensorEntry::getDescription() const {
278 std::string msg;
279 msg += StringPrintf("SensorEntry(deviceId=%d, source=0x%08x, sensorType=0x%08x, "
280 "accuracy=0x%08x, hwTimestamp=%" PRId64,
281 deviceId, source, sensorType, accuracy, hwTimestamp);
282
283 if (!GetBoolProperty("ro.debuggable", false)) {
284 for (size_t i = 0; i < values.size(); i++) {
285 if (i > 0) {
286 msg += ", ";
287 }
288 msg += StringPrintf("(%.3f)", values[i]);
289 }
290 }
291 msg += StringPrintf(", policyFlags=0x%08x", policyFlags);
292 return msg;
293}
294
Garfield Tane84e6f92019-08-29 17:28:41 -0700295// --- DispatchEntry ---
296
297volatile int32_t DispatchEntry::sNextSeqAtomic;
298
Siarhei Vishniakoua9a7ee82019-10-14 16:28:19 -0700299DispatchEntry::DispatchEntry(std::shared_ptr<EventEntry> eventEntry, int32_t targetFlags,
Evan Rosky09576692021-07-01 12:22:09 -0700300 ui::Transform transform, float globalScaleFactor,
301 uint32_t displayOrientation, int2 displaySize)
Garfield Tane84e6f92019-08-29 17:28:41 -0700302 : seq(nextSeq()),
Siarhei Vishniakoua9a7ee82019-10-14 16:28:19 -0700303 eventEntry(std::move(eventEntry)),
Garfield Tane84e6f92019-08-29 17:28:41 -0700304 targetFlags(targetFlags),
chaviw1ff3d1e2020-07-01 15:53:47 -0700305 transform(transform),
Garfield Tane84e6f92019-08-29 17:28:41 -0700306 globalScaleFactor(globalScaleFactor),
Evan Rosky09576692021-07-01 12:22:09 -0700307 displayOrientation(displayOrientation),
Evan Rosky84f07f02021-04-16 10:42:42 -0700308 displaySize(displaySize),
Garfield Tane84e6f92019-08-29 17:28:41 -0700309 deliveryTime(0),
310 resolvedAction(0),
Siarhei Vishniakoua9a7ee82019-10-14 16:28:19 -0700311 resolvedFlags(0) {}
Garfield Tane84e6f92019-08-29 17:28:41 -0700312
313uint32_t DispatchEntry::nextSeq() {
314 // Sequence number 0 is reserved and will never be returned.
315 uint32_t seq;
316 do {
317 seq = android_atomic_inc(&sNextSeqAtomic);
318 } while (!seq);
319 return seq;
320}
321
Garfield Tane84e6f92019-08-29 17:28:41 -0700322} // namespace android::inputdispatcher