blob: ff407af8e1c7e1baad134e24a0a138769bb72e76 [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
Prabir Pradhan65613802023-02-22 23:36:58 +000017#define LOG_TAG "InputDispatcher"
18
Garfield Tane84e6f92019-08-29 17:28:41 -070019#include "Entry.h"
20
21#include "Connection.h"
Prabir Pradhan65613802023-02-22 23:36:58 +000022#include "DebugConfig.h"
Garfield Tane84e6f92019-08-29 17:28:41 -070023
24#include <android-base/stringprintf.h>
25#include <cutils/atomic.h>
Harry Cuttsc57cd3c2024-04-24 13:52:55 +000026#include <ftl/enum.h>
Garfield Tane84e6f92019-08-29 17:28:41 -070027#include <inttypes.h>
28
29using android::base::StringPrintf;
30
31namespace android::inputdispatcher {
32
Gang Wange9087892020-01-07 12:17:14 -050033VerifiedKeyEvent verifiedKeyEventFromKeyEntry(const KeyEntry& entry) {
34 return {{VerifiedInputEvent::Type::KEY, entry.deviceId, entry.eventTime, entry.source,
35 entry.displayId},
36 entry.action,
Gang Wange9087892020-01-07 12:17:14 -050037 entry.flags & VERIFIED_KEY_EVENT_FLAGS,
Siarhei Vishniakouf355bf92021-12-09 10:43:21 -080038 entry.downTime,
Gang Wange9087892020-01-07 12:17:14 -050039 entry.keyCode,
40 entry.scanCode,
41 entry.metaState,
42 entry.repeatCount};
43}
44
Prabir Pradhanb5cb9572021-09-24 06:35:16 -070045VerifiedMotionEvent verifiedMotionEventFromMotionEntry(const MotionEntry& entry,
46 const ui::Transform& rawTransform) {
47 const vec2 rawXY = MotionEvent::calculateTransformedXY(entry.source, rawTransform,
48 entry.pointerCoords[0].getXYValue());
Gang Wange9087892020-01-07 12:17:14 -050049 const int actionMasked = entry.action & AMOTION_EVENT_ACTION_MASK;
50 return {{VerifiedInputEvent::Type::MOTION, entry.deviceId, entry.eventTime, entry.source,
51 entry.displayId},
Prabir Pradhanb5cb9572021-09-24 06:35:16 -070052 rawXY.x,
53 rawXY.y,
Gang Wange9087892020-01-07 12:17:14 -050054 actionMasked,
Gang Wange9087892020-01-07 12:17:14 -050055 entry.flags & VERIFIED_MOTION_EVENT_FLAGS,
Siarhei Vishniakouf355bf92021-12-09 10:43:21 -080056 entry.downTime,
Gang Wange9087892020-01-07 12:17:14 -050057 entry.metaState,
58 entry.buttonState};
59}
Garfield Tane84e6f92019-08-29 17:28:41 -070060
61// --- EventEntry ---
62
Garfield Tanc51d1ba2020-01-28 13:24:04 -080063EventEntry::EventEntry(int32_t id, Type type, nsecs_t eventTime, uint32_t policyFlags)
64 : id(id),
Garfield Tane84e6f92019-08-29 17:28:41 -070065 type(type),
66 eventTime(eventTime),
67 policyFlags(policyFlags),
68 injectionState(nullptr),
69 dispatchInProgress(false) {}
70
Garfield Tane84e6f92019-08-29 17:28:41 -070071// --- DeviceResetEntry ---
72
Garfield Tanc51d1ba2020-01-28 13:24:04 -080073DeviceResetEntry::DeviceResetEntry(int32_t id, nsecs_t eventTime, int32_t deviceId)
74 : EventEntry(id, Type::DEVICE_RESET, eventTime, 0), deviceId(deviceId) {}
Garfield Tane84e6f92019-08-29 17:28:41 -070075
Siarhei Vishniakou14411c92020-09-18 21:15:05 -050076std::string DeviceResetEntry::getDescription() const {
77 return StringPrintf("DeviceResetEvent(deviceId=%d), policyFlags=0x%08x", deviceId, policyFlags);
Garfield Tane84e6f92019-08-29 17:28:41 -070078}
79
Siarhei Vishniakouf1035d42019-09-20 16:32:01 +010080// --- FocusEntry ---
81
82// 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 -070083FocusEntry::FocusEntry(int32_t id, nsecs_t eventTime, sp<IBinder> connectionToken, bool hasFocus,
Vishnu Nairc519ff72021-01-21 08:23:08 -080084 const std::string& reason)
Garfield Tanc51d1ba2020-01-28 13:24:04 -080085 : EventEntry(id, Type::FOCUS, eventTime, POLICY_FLAG_PASS_TO_USER),
Siarhei Vishniakouf1035d42019-09-20 16:32:01 +010086 connectionToken(connectionToken),
Vishnu Nair7d3d00d2020-08-03 11:20:42 -070087 hasFocus(hasFocus),
88 reason(reason) {}
Siarhei Vishniakouf1035d42019-09-20 16:32:01 +010089
Siarhei Vishniakou14411c92020-09-18 21:15:05 -050090std::string FocusEntry::getDescription() const {
91 return StringPrintf("FocusEvent(hasFocus=%s)", hasFocus ? "true" : "false");
Siarhei Vishniakouf1035d42019-09-20 16:32:01 +010092}
93
Prabir Pradhan99987712020-11-10 18:43:05 -080094// --- PointerCaptureChangedEntry ---
95
96// PointerCaptureChanged notifications always go to apps, so set the flag POLICY_FLAG_PASS_TO_USER
97// for all entries.
98PointerCaptureChangedEntry::PointerCaptureChangedEntry(int32_t id, nsecs_t eventTime,
Prabir Pradhan5cc1a692021-08-06 14:01:18 +000099 const PointerCaptureRequest& request)
Prabir Pradhan99987712020-11-10 18:43:05 -0800100 : EventEntry(id, Type::POINTER_CAPTURE_CHANGED, eventTime, POLICY_FLAG_PASS_TO_USER),
Prabir Pradhan5cc1a692021-08-06 14:01:18 +0000101 pointerCaptureRequest(request) {}
Prabir Pradhan99987712020-11-10 18:43:05 -0800102
Prabir Pradhan99987712020-11-10 18:43:05 -0800103std::string PointerCaptureChangedEntry::getDescription() const {
104 return StringPrintf("PointerCaptureChangedEvent(pointerCaptureEnabled=%s)",
Hiroki Sato25040232024-02-22 17:21:22 +0900105 pointerCaptureRequest.isEnable() ? "true" : "false");
Prabir Pradhan99987712020-11-10 18:43:05 -0800106}
107
arthurhungb89ccb02020-12-30 16:19:01 +0800108// --- DragEntry ---
109
110// Drag notifications always go to apps, so set the flag POLICY_FLAG_PASS_TO_USER for all entries
111DragEntry::DragEntry(int32_t id, nsecs_t eventTime, sp<IBinder> connectionToken, bool isExiting,
112 float x, float y)
113 : EventEntry(id, Type::DRAG, eventTime, POLICY_FLAG_PASS_TO_USER),
114 connectionToken(connectionToken),
115 isExiting(isExiting),
116 x(x),
117 y(y) {}
118
arthurhungb89ccb02020-12-30 16:19:01 +0800119std::string DragEntry::getDescription() const {
120 return StringPrintf("DragEntry(isExiting=%s, x=%f, y=%f)", isExiting ? "true" : "false", x, y);
121}
122
Garfield Tane84e6f92019-08-29 17:28:41 -0700123// --- KeyEntry ---
124
Prabir Pradhana8cdbe12023-11-01 21:30:02 +0000125KeyEntry::KeyEntry(int32_t id, std::shared_ptr<InjectionState> injectionState, nsecs_t eventTime,
Linnan Li13bf76a2024-05-05 19:18:02 +0800126 int32_t deviceId, uint32_t source, ui::LogicalDisplayId displayId,
127 uint32_t policyFlags, int32_t action, int32_t flags, int32_t keyCode,
128 int32_t scanCode, int32_t metaState, int32_t repeatCount, nsecs_t downTime)
Garfield Tanc51d1ba2020-01-28 13:24:04 -0800129 : EventEntry(id, Type::KEY, eventTime, policyFlags),
Garfield Tane84e6f92019-08-29 17:28:41 -0700130 deviceId(deviceId),
131 source(source),
132 displayId(displayId),
133 action(action),
Garfield Tane84e6f92019-08-29 17:28:41 -0700134 keyCode(keyCode),
135 scanCode(scanCode),
136 metaState(metaState),
Garfield Tane84e6f92019-08-29 17:28:41 -0700137 downTime(downTime),
138 syntheticRepeat(false),
Michael Wright5caf55a2022-11-24 22:31:42 +0000139 interceptKeyResult(KeyEntry::InterceptKeyResult::UNKNOWN),
Prabir Pradhan24047542023-11-02 17:14:59 +0000140 interceptKeyWakeupTime(0),
141 flags(flags),
142 repeatCount(repeatCount) {
Prabir Pradhana8cdbe12023-11-01 21:30:02 +0000143 EventEntry::injectionState = std::move(injectionState);
144}
Garfield Tane84e6f92019-08-29 17:28:41 -0700145
Siarhei Vishniakou14411c92020-09-18 21:15:05 -0500146std::string KeyEntry::getDescription() const {
Prabir Pradhan65613802023-02-22 23:36:58 +0000147 if (!IS_DEBUGGABLE_BUILD) {
Siarhei Vishniakou14411c92020-09-18 21:15:05 -0500148 return "KeyEvent";
Ashwini Orugantid399a522019-10-10 11:16:45 -0700149 }
Linnan Li13bf76a2024-05-05 19:18:02 +0800150 return StringPrintf("KeyEvent(deviceId=%d, eventTime=%" PRIu64 ", source=%s, displayId=%s, "
151 "action=%s, "
Siarhei Vishniakou5b6c96f2021-02-25 00:21:51 -1000152 "flags=0x%08x, keyCode=%s(%d), scanCode=%d, metaState=0x%08x, "
Garfield Tane84e6f92019-08-29 17:28:41 -0700153 "repeatCount=%d), policyFlags=0x%08x",
Linnan Li13bf76a2024-05-05 19:18:02 +0800154 deviceId, eventTime, inputEventSourceToString(source).c_str(),
155 displayId.toString().c_str(), KeyEvent::actionToString(action), flags,
156 KeyEvent::getLabel(keyCode), keyCode, scanCode, metaState, repeatCount,
157 policyFlags);
Garfield Tane84e6f92019-08-29 17:28:41 -0700158}
159
Prabir Pradhanabcdf5c2023-12-15 07:30:22 +0000160std::ostream& operator<<(std::ostream& out, const KeyEntry& keyEntry) {
161 out << keyEntry.getDescription();
162 return out;
163}
164
Antonio Kantek7242d8b2021-08-05 16:07:20 -0700165// --- TouchModeEntry ---
166
Linnan Li13bf76a2024-05-05 19:18:02 +0800167TouchModeEntry::TouchModeEntry(int32_t id, nsecs_t eventTime, bool inTouchMode,
168 ui::LogicalDisplayId displayId)
Antonio Kantek7242d8b2021-08-05 16:07:20 -0700169 : EventEntry(id, Type::TOUCH_MODE_CHANGED, eventTime, POLICY_FLAG_PASS_TO_USER),
Antonio Kantek15beb512022-06-13 22:35:41 +0000170 inTouchMode(inTouchMode),
171 displayId(displayId) {}
Antonio Kantek7242d8b2021-08-05 16:07:20 -0700172
Antonio Kantek7242d8b2021-08-05 16:07:20 -0700173std::string TouchModeEntry::getDescription() const {
174 return StringPrintf("TouchModeEvent(inTouchMode=%s)", inTouchMode ? "true" : "false");
175}
176
Garfield Tane84e6f92019-08-29 17:28:41 -0700177// --- MotionEntry ---
178
Prabir Pradhana8cdbe12023-11-01 21:30:02 +0000179MotionEntry::MotionEntry(int32_t id, std::shared_ptr<InjectionState> injectionState,
Linnan Li13bf76a2024-05-05 19:18:02 +0800180 nsecs_t eventTime, int32_t deviceId, uint32_t source,
181 ui::LogicalDisplayId displayId, uint32_t policyFlags, int32_t action,
182 int32_t actionButton, int32_t flags, int32_t metaState,
183 int32_t buttonState, MotionClassification classification,
184 int32_t edgeFlags, float xPrecision, float yPrecision,
185 float xCursorPosition, float yCursorPosition, nsecs_t downTime,
186 const std::vector<PointerProperties>& pointerProperties,
Siarhei Vishniakouedd61202023-10-18 11:22:40 -0700187 const std::vector<PointerCoords>& pointerCoords)
Garfield Tanc51d1ba2020-01-28 13:24:04 -0800188 : EventEntry(id, Type::MOTION, eventTime, policyFlags),
Garfield Tane84e6f92019-08-29 17:28:41 -0700189 deviceId(deviceId),
190 source(source),
191 displayId(displayId),
192 action(action),
193 actionButton(actionButton),
194 flags(flags),
195 metaState(metaState),
196 buttonState(buttonState),
197 classification(classification),
198 edgeFlags(edgeFlags),
199 xPrecision(xPrecision),
200 yPrecision(yPrecision),
201 xCursorPosition(xCursorPosition),
202 yCursorPosition(yCursorPosition),
203 downTime(downTime),
Siarhei Vishniakouedd61202023-10-18 11:22:40 -0700204 pointerProperties(pointerProperties),
Prabir Pradhana8cdbe12023-11-01 21:30:02 +0000205 pointerCoords(pointerCoords) {
206 EventEntry::injectionState = std::move(injectionState);
207}
Garfield Tane84e6f92019-08-29 17:28:41 -0700208
Siarhei Vishniakou14411c92020-09-18 21:15:05 -0500209std::string MotionEntry::getDescription() const {
Prabir Pradhan65613802023-02-22 23:36:58 +0000210 if (!IS_DEBUGGABLE_BUILD) {
Siarhei Vishniakou14411c92020-09-18 21:15:05 -0500211 return "MotionEvent";
Ashwini Orugantid399a522019-10-10 11:16:45 -0700212 }
Siarhei Vishniakou14411c92020-09-18 21:15:05 -0500213 std::string msg;
Siarhei Vishniakoua1188f52020-10-20 20:14:52 -0500214 msg += StringPrintf("MotionEvent(deviceId=%d, eventTime=%" PRIu64
Linnan Li13bf76a2024-05-05 19:18:02 +0800215 ", source=%s, displayId=%s, action=%s, actionButton=0x%08x, flags=0x%08x,"
216 " metaState=0x%08x, "
Garfield Tane84e6f92019-08-29 17:28:41 -0700217 "buttonState=0x%08x, "
218 "classification=%s, edgeFlags=0x%08x, xPrecision=%.1f, yPrecision=%.1f, "
219 "xCursorPosition=%0.1f, yCursorPosition=%0.1f, pointers=[",
Linnan Li13bf76a2024-05-05 19:18:02 +0800220 deviceId, eventTime, inputEventSourceToString(source).c_str(),
221 displayId.toString().c_str(), MotionEvent::actionToString(action).c_str(),
222 actionButton, flags, metaState, buttonState,
223 motionClassificationToString(classification), edgeFlags, xPrecision,
224 yPrecision, xCursorPosition, yCursorPosition);
Garfield Tane84e6f92019-08-29 17:28:41 -0700225
Siarhei Vishniakouedd61202023-10-18 11:22:40 -0700226 for (uint32_t i = 0; i < getPointerCount(); i++) {
Garfield Tane84e6f92019-08-29 17:28:41 -0700227 if (i) {
228 msg += ", ";
229 }
230 msg += StringPrintf("%d: (%.1f, %.1f)", pointerProperties[i].id, pointerCoords[i].getX(),
231 pointerCoords[i].getY());
232 }
233 msg += StringPrintf("]), policyFlags=0x%08x", policyFlags);
Siarhei Vishniakou14411c92020-09-18 21:15:05 -0500234 return msg;
Garfield Tane84e6f92019-08-29 17:28:41 -0700235}
236
Siarhei Vishniakou72945a02023-09-18 18:30:25 -0700237std::ostream& operator<<(std::ostream& out, const MotionEntry& motionEntry) {
238 out << motionEntry.getDescription();
239 return out;
240}
241
Chris Yef59a2f42020-10-16 12:55:26 -0700242// --- SensorEntry ---
243
244SensorEntry::SensorEntry(int32_t id, nsecs_t eventTime, int32_t deviceId, uint32_t source,
245 uint32_t policyFlags, nsecs_t hwTimestamp,
246 InputDeviceSensorType sensorType, InputDeviceSensorAccuracy accuracy,
247 bool accuracyChanged, std::vector<float> values)
248 : EventEntry(id, Type::SENSOR, eventTime, policyFlags),
249 deviceId(deviceId),
250 source(source),
251 sensorType(sensorType),
252 accuracy(accuracy),
253 accuracyChanged(accuracyChanged),
254 hwTimestamp(hwTimestamp),
255 values(std::move(values)) {}
256
Chris Yef59a2f42020-10-16 12:55:26 -0700257std::string SensorEntry::getDescription() const {
258 std::string msg;
Siarhei Vishniakoud9489572021-11-12 20:08:38 -0800259 msg += StringPrintf("SensorEntry(deviceId=%d, source=%s, sensorType=%s, "
Harry Cuttsc57cd3c2024-04-24 13:52:55 +0000260 "accuracy=%s, hwTimestamp=%" PRId64,
Siarhei Vishniakouf12f2f72021-11-17 17:49:45 -0800261 deviceId, inputEventSourceToString(source).c_str(),
Harry Cuttsc57cd3c2024-04-24 13:52:55 +0000262 ftl::enum_string(sensorType).c_str(), ftl::enum_string(accuracy).c_str(),
263 hwTimestamp);
Chris Yef59a2f42020-10-16 12:55:26 -0700264
Prabir Pradhan65613802023-02-22 23:36:58 +0000265 if (IS_DEBUGGABLE_BUILD) {
Chris Yef59a2f42020-10-16 12:55:26 -0700266 for (size_t i = 0; i < values.size(); i++) {
267 if (i > 0) {
268 msg += ", ";
269 }
270 msg += StringPrintf("(%.3f)", values[i]);
271 }
272 }
273 msg += StringPrintf(", policyFlags=0x%08x", policyFlags);
274 return msg;
275}
276
Garfield Tane84e6f92019-08-29 17:28:41 -0700277// --- DispatchEntry ---
278
279volatile int32_t DispatchEntry::sNextSeqAtomic;
280
Prabir Pradhan24047542023-11-02 17:14:59 +0000281DispatchEntry::DispatchEntry(std::shared_ptr<const EventEntry> eventEntry,
Siarhei Vishniakou18cbdb82024-01-31 17:58:13 -0800282 ftl::Flags<InputTargetFlags> targetFlags,
Prabir Pradhanb9b18502021-08-26 12:30:32 -0700283 const ui::Transform& transform, const ui::Transform& rawTransform,
Prabir Pradhanadc59b42023-12-15 05:34:11 +0000284 float globalScaleFactor, gui::Uid targetUid, int64_t vsyncId,
285 std::optional<int32_t> windowId)
Garfield Tane84e6f92019-08-29 17:28:41 -0700286 : seq(nextSeq()),
Siarhei Vishniakoua9a7ee82019-10-14 16:28:19 -0700287 eventEntry(std::move(eventEntry)),
Garfield Tane84e6f92019-08-29 17:28:41 -0700288 targetFlags(targetFlags),
chaviw1ff3d1e2020-07-01 15:53:47 -0700289 transform(transform),
Prabir Pradhanb9b18502021-08-26 12:30:32 -0700290 rawTransform(rawTransform),
Garfield Tane84e6f92019-08-29 17:28:41 -0700291 globalScaleFactor(globalScaleFactor),
Garfield Tane84e6f92019-08-29 17:28:41 -0700292 deliveryTime(0),
Prabir Pradhanadc59b42023-12-15 05:34:11 +0000293 resolvedFlags(0),
294 targetUid(targetUid),
295 vsyncId(vsyncId),
296 windowId(windowId) {
Siarhei Vishniakou2af5b032023-07-10 18:52:17 -0700297 switch (this->eventEntry->type) {
298 case EventEntry::Type::KEY: {
Prabir Pradhan24047542023-11-02 17:14:59 +0000299 const KeyEntry& keyEntry = static_cast<const KeyEntry&>(*this->eventEntry);
Siarhei Vishniakou2af5b032023-07-10 18:52:17 -0700300 resolvedFlags = keyEntry.flags;
Siarhei Vishniakou2af5b032023-07-10 18:52:17 -0700301 break;
302 }
303 case EventEntry::Type::MOTION: {
Prabir Pradhan24047542023-11-02 17:14:59 +0000304 const MotionEntry& motionEntry = static_cast<const MotionEntry&>(*this->eventEntry);
Siarhei Vishniakou2af5b032023-07-10 18:52:17 -0700305 resolvedFlags = motionEntry.flags;
306 break;
307 }
308 default: {
309 break;
310 }
311 }
312}
Garfield Tane84e6f92019-08-29 17:28:41 -0700313
314uint32_t DispatchEntry::nextSeq() {
315 // Sequence number 0 is reserved and will never be returned.
316 uint32_t seq;
317 do {
318 seq = android_atomic_inc(&sNextSeqAtomic);
319 } while (!seq);
320 return seq;
321}
322
Siarhei Vishniakoud010b012023-01-18 15:00:53 -0800323std::ostream& operator<<(std::ostream& out, const DispatchEntry& entry) {
Siarhei Vishniakoud010b012023-01-18 15:00:53 -0800324 std::string transform;
325 entry.transform.dump(transform, "transform");
Prabir Pradhan2a2da1d2023-11-03 02:16:20 +0000326 out << "DispatchEntry{resolvedFlags=" << entry.resolvedFlags
Siarhei Vishniakoud010b012023-01-18 15:00:53 -0800327 << ", targetFlags=" << entry.targetFlags.string() << ", transform=" << transform
Siarhei Vishniakouadb9fc92023-05-26 10:46:09 -0700328 << "} original: " << entry.eventEntry->getDescription();
Siarhei Vishniakoud010b012023-01-18 15:00:53 -0800329 return out;
330}
331
Garfield Tane84e6f92019-08-29 17:28:41 -0700332} // namespace android::inputdispatcher