blob: 264dc03e702f2bf8f300efe9e1adfbfe84f80a42 [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>
26#include <inttypes.h>
27
28using android::base::StringPrintf;
29
30namespace android::inputdispatcher {
31
Gang Wange9087892020-01-07 12:17:14 -050032VerifiedKeyEvent verifiedKeyEventFromKeyEntry(const KeyEntry& entry) {
33 return {{VerifiedInputEvent::Type::KEY, entry.deviceId, entry.eventTime, entry.source,
34 entry.displayId},
35 entry.action,
Gang Wange9087892020-01-07 12:17:14 -050036 entry.flags & VERIFIED_KEY_EVENT_FLAGS,
Siarhei Vishniakouf355bf92021-12-09 10:43:21 -080037 entry.downTime,
Gang Wange9087892020-01-07 12:17:14 -050038 entry.keyCode,
39 entry.scanCode,
40 entry.metaState,
41 entry.repeatCount};
42}
43
Prabir Pradhanb5cb9572021-09-24 06:35:16 -070044VerifiedMotionEvent verifiedMotionEventFromMotionEntry(const MotionEntry& entry,
45 const ui::Transform& rawTransform) {
46 const vec2 rawXY = MotionEvent::calculateTransformedXY(entry.source, rawTransform,
47 entry.pointerCoords[0].getXYValue());
Gang Wange9087892020-01-07 12:17:14 -050048 const int actionMasked = entry.action & AMOTION_EVENT_ACTION_MASK;
49 return {{VerifiedInputEvent::Type::MOTION, entry.deviceId, entry.eventTime, entry.source,
50 entry.displayId},
Prabir Pradhanb5cb9572021-09-24 06:35:16 -070051 rawXY.x,
52 rawXY.y,
Gang Wange9087892020-01-07 12:17:14 -050053 actionMasked,
Gang Wange9087892020-01-07 12:17:14 -050054 entry.flags & VERIFIED_MOTION_EVENT_FLAGS,
Siarhei Vishniakouf355bf92021-12-09 10:43:21 -080055 entry.downTime,
Gang Wange9087892020-01-07 12:17:14 -050056 entry.metaState,
57 entry.buttonState};
58}
Garfield Tane84e6f92019-08-29 17:28:41 -070059
60// --- EventEntry ---
61
Garfield Tanc51d1ba2020-01-28 13:24:04 -080062EventEntry::EventEntry(int32_t id, Type type, nsecs_t eventTime, uint32_t policyFlags)
63 : id(id),
Garfield Tane84e6f92019-08-29 17:28:41 -070064 type(type),
65 eventTime(eventTime),
66 policyFlags(policyFlags),
67 injectionState(nullptr),
68 dispatchInProgress(false) {}
69
Garfield Tane84e6f92019-08-29 17:28:41 -070070// --- ConfigurationChangedEntry ---
71
Garfield Tanc51d1ba2020-01-28 13:24:04 -080072ConfigurationChangedEntry::ConfigurationChangedEntry(int32_t id, nsecs_t eventTime)
73 : EventEntry(id, Type::CONFIGURATION_CHANGED, eventTime, 0) {}
Garfield Tane84e6f92019-08-29 17:28:41 -070074
Siarhei Vishniakou14411c92020-09-18 21:15:05 -050075std::string ConfigurationChangedEntry::getDescription() const {
76 return StringPrintf("ConfigurationChangedEvent(), policyFlags=0x%08x", policyFlags);
Garfield Tane84e6f92019-08-29 17:28:41 -070077}
78
79// --- DeviceResetEntry ---
80
Garfield Tanc51d1ba2020-01-28 13:24:04 -080081DeviceResetEntry::DeviceResetEntry(int32_t id, nsecs_t eventTime, int32_t deviceId)
82 : EventEntry(id, Type::DEVICE_RESET, eventTime, 0), deviceId(deviceId) {}
Garfield Tane84e6f92019-08-29 17:28:41 -070083
Siarhei Vishniakou14411c92020-09-18 21:15:05 -050084std::string DeviceResetEntry::getDescription() const {
85 return StringPrintf("DeviceResetEvent(deviceId=%d), policyFlags=0x%08x", deviceId, policyFlags);
Garfield Tane84e6f92019-08-29 17:28:41 -070086}
87
Siarhei Vishniakouf1035d42019-09-20 16:32:01 +010088// --- FocusEntry ---
89
90// 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 -070091FocusEntry::FocusEntry(int32_t id, nsecs_t eventTime, sp<IBinder> connectionToken, bool hasFocus,
Vishnu Nairc519ff72021-01-21 08:23:08 -080092 const std::string& reason)
Garfield Tanc51d1ba2020-01-28 13:24:04 -080093 : EventEntry(id, Type::FOCUS, eventTime, POLICY_FLAG_PASS_TO_USER),
Siarhei Vishniakouf1035d42019-09-20 16:32:01 +010094 connectionToken(connectionToken),
Vishnu Nair7d3d00d2020-08-03 11:20:42 -070095 hasFocus(hasFocus),
96 reason(reason) {}
Siarhei Vishniakouf1035d42019-09-20 16:32:01 +010097
Siarhei Vishniakou14411c92020-09-18 21:15:05 -050098std::string FocusEntry::getDescription() const {
99 return StringPrintf("FocusEvent(hasFocus=%s)", hasFocus ? "true" : "false");
Siarhei Vishniakouf1035d42019-09-20 16:32:01 +0100100}
101
Prabir Pradhan99987712020-11-10 18:43:05 -0800102// --- PointerCaptureChangedEntry ---
103
104// PointerCaptureChanged notifications always go to apps, so set the flag POLICY_FLAG_PASS_TO_USER
105// for all entries.
106PointerCaptureChangedEntry::PointerCaptureChangedEntry(int32_t id, nsecs_t eventTime,
Prabir Pradhan5cc1a692021-08-06 14:01:18 +0000107 const PointerCaptureRequest& request)
Prabir Pradhan99987712020-11-10 18:43:05 -0800108 : EventEntry(id, Type::POINTER_CAPTURE_CHANGED, eventTime, POLICY_FLAG_PASS_TO_USER),
Prabir Pradhan5cc1a692021-08-06 14:01:18 +0000109 pointerCaptureRequest(request) {}
Prabir Pradhan99987712020-11-10 18:43:05 -0800110
Prabir Pradhan99987712020-11-10 18:43:05 -0800111std::string PointerCaptureChangedEntry::getDescription() const {
112 return StringPrintf("PointerCaptureChangedEvent(pointerCaptureEnabled=%s)",
Prabir Pradhan5cc1a692021-08-06 14:01:18 +0000113 pointerCaptureRequest.enable ? "true" : "false");
Prabir Pradhan99987712020-11-10 18:43:05 -0800114}
115
arthurhungb89ccb02020-12-30 16:19:01 +0800116// --- DragEntry ---
117
118// Drag notifications always go to apps, so set the flag POLICY_FLAG_PASS_TO_USER for all entries
119DragEntry::DragEntry(int32_t id, nsecs_t eventTime, sp<IBinder> connectionToken, bool isExiting,
120 float x, float y)
121 : EventEntry(id, Type::DRAG, eventTime, POLICY_FLAG_PASS_TO_USER),
122 connectionToken(connectionToken),
123 isExiting(isExiting),
124 x(x),
125 y(y) {}
126
arthurhungb89ccb02020-12-30 16:19:01 +0800127std::string DragEntry::getDescription() const {
128 return StringPrintf("DragEntry(isExiting=%s, x=%f, y=%f)", isExiting ? "true" : "false", x, y);
129}
130
Garfield Tane84e6f92019-08-29 17:28:41 -0700131// --- KeyEntry ---
132
Prabir Pradhana8cdbe12023-11-01 21:30:02 +0000133KeyEntry::KeyEntry(int32_t id, std::shared_ptr<InjectionState> injectionState, nsecs_t eventTime,
134 int32_t deviceId, uint32_t source, int32_t displayId, uint32_t policyFlags,
135 int32_t action, int32_t flags, int32_t keyCode, int32_t scanCode,
136 int32_t metaState, int32_t repeatCount, nsecs_t downTime)
Garfield Tanc51d1ba2020-01-28 13:24:04 -0800137 : EventEntry(id, Type::KEY, eventTime, policyFlags),
Garfield Tane84e6f92019-08-29 17:28:41 -0700138 deviceId(deviceId),
139 source(source),
140 displayId(displayId),
141 action(action),
Garfield Tane84e6f92019-08-29 17:28:41 -0700142 keyCode(keyCode),
143 scanCode(scanCode),
144 metaState(metaState),
Garfield Tane84e6f92019-08-29 17:28:41 -0700145 downTime(downTime),
146 syntheticRepeat(false),
Michael Wright5caf55a2022-11-24 22:31:42 +0000147 interceptKeyResult(KeyEntry::InterceptKeyResult::UNKNOWN),
Prabir Pradhan24047542023-11-02 17:14:59 +0000148 interceptKeyWakeupTime(0),
149 flags(flags),
150 repeatCount(repeatCount) {
Prabir Pradhana8cdbe12023-11-01 21:30:02 +0000151 EventEntry::injectionState = std::move(injectionState);
152}
Garfield Tane84e6f92019-08-29 17:28:41 -0700153
Siarhei Vishniakou14411c92020-09-18 21:15:05 -0500154std::string KeyEntry::getDescription() const {
Prabir Pradhan65613802023-02-22 23:36:58 +0000155 if (!IS_DEBUGGABLE_BUILD) {
Siarhei Vishniakou14411c92020-09-18 21:15:05 -0500156 return "KeyEvent";
Ashwini Orugantid399a522019-10-10 11:16:45 -0700157 }
Siarhei Vishniakoud9489572021-11-12 20:08:38 -0800158 return StringPrintf("KeyEvent(deviceId=%d, eventTime=%" PRIu64 ", source=%s, displayId=%" PRId32
159 ", action=%s, "
Siarhei Vishniakou5b6c96f2021-02-25 00:21:51 -1000160 "flags=0x%08x, keyCode=%s(%d), scanCode=%d, metaState=0x%08x, "
Garfield Tane84e6f92019-08-29 17:28:41 -0700161 "repeatCount=%d), policyFlags=0x%08x",
Siarhei Vishniakoud9489572021-11-12 20:08:38 -0800162 deviceId, eventTime, inputEventSourceToString(source).c_str(), displayId,
163 KeyEvent::actionToString(action), flags, KeyEvent::getLabel(keyCode),
164 keyCode, scanCode, metaState, repeatCount, policyFlags);
Garfield Tane84e6f92019-08-29 17:28:41 -0700165}
166
Prabir Pradhanabcdf5c2023-12-15 07:30:22 +0000167std::ostream& operator<<(std::ostream& out, const KeyEntry& keyEntry) {
168 out << keyEntry.getDescription();
169 return out;
170}
171
Antonio Kantek7242d8b2021-08-05 16:07:20 -0700172// --- TouchModeEntry ---
173
Antonio Kantek15beb512022-06-13 22:35:41 +0000174TouchModeEntry::TouchModeEntry(int32_t id, nsecs_t eventTime, bool inTouchMode, int displayId)
Antonio Kantek7242d8b2021-08-05 16:07:20 -0700175 : EventEntry(id, Type::TOUCH_MODE_CHANGED, eventTime, POLICY_FLAG_PASS_TO_USER),
Antonio Kantek15beb512022-06-13 22:35:41 +0000176 inTouchMode(inTouchMode),
177 displayId(displayId) {}
Antonio Kantek7242d8b2021-08-05 16:07:20 -0700178
Antonio Kantek7242d8b2021-08-05 16:07:20 -0700179std::string TouchModeEntry::getDescription() const {
180 return StringPrintf("TouchModeEvent(inTouchMode=%s)", inTouchMode ? "true" : "false");
181}
182
Garfield Tane84e6f92019-08-29 17:28:41 -0700183// --- MotionEntry ---
184
Prabir Pradhana8cdbe12023-11-01 21:30:02 +0000185MotionEntry::MotionEntry(int32_t id, std::shared_ptr<InjectionState> injectionState,
186 nsecs_t eventTime, int32_t deviceId, uint32_t source, int32_t displayId,
187 uint32_t policyFlags, int32_t action, int32_t actionButton, int32_t flags,
188 int32_t metaState, int32_t buttonState,
189 MotionClassification classification, int32_t edgeFlags, float xPrecision,
190 float yPrecision, float xCursorPosition, float yCursorPosition,
191 nsecs_t downTime, const std::vector<PointerProperties>& pointerProperties,
Siarhei Vishniakouedd61202023-10-18 11:22:40 -0700192 const std::vector<PointerCoords>& pointerCoords)
Garfield Tanc51d1ba2020-01-28 13:24:04 -0800193 : EventEntry(id, Type::MOTION, eventTime, policyFlags),
Garfield Tane84e6f92019-08-29 17:28:41 -0700194 deviceId(deviceId),
195 source(source),
196 displayId(displayId),
197 action(action),
198 actionButton(actionButton),
199 flags(flags),
200 metaState(metaState),
201 buttonState(buttonState),
202 classification(classification),
203 edgeFlags(edgeFlags),
204 xPrecision(xPrecision),
205 yPrecision(yPrecision),
206 xCursorPosition(xCursorPosition),
207 yCursorPosition(yCursorPosition),
208 downTime(downTime),
Siarhei Vishniakouedd61202023-10-18 11:22:40 -0700209 pointerProperties(pointerProperties),
Prabir Pradhana8cdbe12023-11-01 21:30:02 +0000210 pointerCoords(pointerCoords) {
211 EventEntry::injectionState = std::move(injectionState);
212}
Garfield Tane84e6f92019-08-29 17:28:41 -0700213
Siarhei Vishniakou14411c92020-09-18 21:15:05 -0500214std::string MotionEntry::getDescription() const {
Prabir Pradhan65613802023-02-22 23:36:58 +0000215 if (!IS_DEBUGGABLE_BUILD) {
Siarhei Vishniakou14411c92020-09-18 21:15:05 -0500216 return "MotionEvent";
Ashwini Orugantid399a522019-10-10 11:16:45 -0700217 }
Siarhei Vishniakou14411c92020-09-18 21:15:05 -0500218 std::string msg;
Siarhei Vishniakoua1188f52020-10-20 20:14:52 -0500219 msg += StringPrintf("MotionEvent(deviceId=%d, eventTime=%" PRIu64
Siarhei Vishniakoud9489572021-11-12 20:08:38 -0800220 ", source=%s, displayId=%" PRId32
Garfield Tane84e6f92019-08-29 17:28:41 -0700221 ", action=%s, actionButton=0x%08x, flags=0x%08x, metaState=0x%08x, "
222 "buttonState=0x%08x, "
223 "classification=%s, edgeFlags=0x%08x, xPrecision=%.1f, yPrecision=%.1f, "
224 "xCursorPosition=%0.1f, yCursorPosition=%0.1f, pointers=[",
Siarhei Vishniakoud9489572021-11-12 20:08:38 -0800225 deviceId, eventTime, inputEventSourceToString(source).c_str(), displayId,
Siarhei Vishniakouc68fdec2020-10-22 14:58:14 -0500226 MotionEvent::actionToString(action).c_str(), actionButton, flags, metaState,
227 buttonState, motionClassificationToString(classification), edgeFlags,
228 xPrecision, yPrecision, xCursorPosition, yCursorPosition);
Garfield Tane84e6f92019-08-29 17:28:41 -0700229
Siarhei Vishniakouedd61202023-10-18 11:22:40 -0700230 for (uint32_t i = 0; i < getPointerCount(); i++) {
Garfield Tane84e6f92019-08-29 17:28:41 -0700231 if (i) {
232 msg += ", ";
233 }
234 msg += StringPrintf("%d: (%.1f, %.1f)", pointerProperties[i].id, pointerCoords[i].getX(),
235 pointerCoords[i].getY());
236 }
237 msg += StringPrintf("]), policyFlags=0x%08x", policyFlags);
Siarhei Vishniakou14411c92020-09-18 21:15:05 -0500238 return msg;
Garfield Tane84e6f92019-08-29 17:28:41 -0700239}
240
Siarhei Vishniakou72945a02023-09-18 18:30:25 -0700241std::ostream& operator<<(std::ostream& out, const MotionEntry& motionEntry) {
242 out << motionEntry.getDescription();
243 return out;
244}
245
Chris Yef59a2f42020-10-16 12:55:26 -0700246// --- SensorEntry ---
247
248SensorEntry::SensorEntry(int32_t id, nsecs_t eventTime, int32_t deviceId, uint32_t source,
249 uint32_t policyFlags, nsecs_t hwTimestamp,
250 InputDeviceSensorType sensorType, InputDeviceSensorAccuracy accuracy,
251 bool accuracyChanged, std::vector<float> values)
252 : EventEntry(id, Type::SENSOR, eventTime, policyFlags),
253 deviceId(deviceId),
254 source(source),
255 sensorType(sensorType),
256 accuracy(accuracy),
257 accuracyChanged(accuracyChanged),
258 hwTimestamp(hwTimestamp),
259 values(std::move(values)) {}
260
Chris Yef59a2f42020-10-16 12:55:26 -0700261std::string SensorEntry::getDescription() const {
262 std::string msg;
Siarhei Vishniakoud9489572021-11-12 20:08:38 -0800263 msg += StringPrintf("SensorEntry(deviceId=%d, source=%s, sensorType=%s, "
Chris Yef59a2f42020-10-16 12:55:26 -0700264 "accuracy=0x%08x, hwTimestamp=%" PRId64,
Siarhei Vishniakouf12f2f72021-11-17 17:49:45 -0800265 deviceId, inputEventSourceToString(source).c_str(),
266 ftl::enum_string(sensorType).c_str(), accuracy, hwTimestamp);
Chris Yef59a2f42020-10-16 12:55:26 -0700267
Prabir Pradhan65613802023-02-22 23:36:58 +0000268 if (IS_DEBUGGABLE_BUILD) {
Chris Yef59a2f42020-10-16 12:55:26 -0700269 for (size_t i = 0; i < values.size(); i++) {
270 if (i > 0) {
271 msg += ", ";
272 }
273 msg += StringPrintf("(%.3f)", values[i]);
274 }
275 }
276 msg += StringPrintf(", policyFlags=0x%08x", policyFlags);
277 return msg;
278}
279
Garfield Tane84e6f92019-08-29 17:28:41 -0700280// --- DispatchEntry ---
281
282volatile int32_t DispatchEntry::sNextSeqAtomic;
283
Prabir Pradhan24047542023-11-02 17:14:59 +0000284DispatchEntry::DispatchEntry(std::shared_ptr<const EventEntry> eventEntry,
Siarhei Vishniakou18cbdb82024-01-31 17:58:13 -0800285 ftl::Flags<InputTargetFlags> targetFlags,
Prabir Pradhanb9b18502021-08-26 12:30:32 -0700286 const ui::Transform& transform, const ui::Transform& rawTransform,
Prabir Pradhanadc59b42023-12-15 05:34:11 +0000287 float globalScaleFactor, gui::Uid targetUid, int64_t vsyncId,
288 std::optional<int32_t> windowId)
Garfield Tane84e6f92019-08-29 17:28:41 -0700289 : seq(nextSeq()),
Siarhei Vishniakoua9a7ee82019-10-14 16:28:19 -0700290 eventEntry(std::move(eventEntry)),
Garfield Tane84e6f92019-08-29 17:28:41 -0700291 targetFlags(targetFlags),
chaviw1ff3d1e2020-07-01 15:53:47 -0700292 transform(transform),
Prabir Pradhanb9b18502021-08-26 12:30:32 -0700293 rawTransform(rawTransform),
Garfield Tane84e6f92019-08-29 17:28:41 -0700294 globalScaleFactor(globalScaleFactor),
Garfield Tane84e6f92019-08-29 17:28:41 -0700295 deliveryTime(0),
Prabir Pradhanadc59b42023-12-15 05:34:11 +0000296 resolvedFlags(0),
297 targetUid(targetUid),
298 vsyncId(vsyncId),
299 windowId(windowId) {
Siarhei Vishniakou2af5b032023-07-10 18:52:17 -0700300 switch (this->eventEntry->type) {
301 case EventEntry::Type::KEY: {
Prabir Pradhan24047542023-11-02 17:14:59 +0000302 const KeyEntry& keyEntry = static_cast<const KeyEntry&>(*this->eventEntry);
Siarhei Vishniakou2af5b032023-07-10 18:52:17 -0700303 resolvedFlags = keyEntry.flags;
Siarhei Vishniakou2af5b032023-07-10 18:52:17 -0700304 break;
305 }
306 case EventEntry::Type::MOTION: {
Prabir Pradhan24047542023-11-02 17:14:59 +0000307 const MotionEntry& motionEntry = static_cast<const MotionEntry&>(*this->eventEntry);
Siarhei Vishniakou2af5b032023-07-10 18:52:17 -0700308 resolvedFlags = motionEntry.flags;
309 break;
310 }
311 default: {
312 break;
313 }
314 }
315}
Garfield Tane84e6f92019-08-29 17:28:41 -0700316
317uint32_t DispatchEntry::nextSeq() {
318 // Sequence number 0 is reserved and will never be returned.
319 uint32_t seq;
320 do {
321 seq = android_atomic_inc(&sNextSeqAtomic);
322 } while (!seq);
323 return seq;
324}
325
Siarhei Vishniakoud010b012023-01-18 15:00:53 -0800326std::ostream& operator<<(std::ostream& out, const DispatchEntry& entry) {
Siarhei Vishniakoud010b012023-01-18 15:00:53 -0800327 std::string transform;
328 entry.transform.dump(transform, "transform");
Prabir Pradhan2a2da1d2023-11-03 02:16:20 +0000329 out << "DispatchEntry{resolvedFlags=" << entry.resolvedFlags
Siarhei Vishniakoud010b012023-01-18 15:00:53 -0800330 << ", targetFlags=" << entry.targetFlags.string() << ", transform=" << transform
Siarhei Vishniakouadb9fc92023-05-26 10:46:09 -0700331 << "} original: " << entry.eventEntry->getDescription();
Siarhei Vishniakoud010b012023-01-18 15:00:53 -0800332 return out;
333}
334
Garfield Tane84e6f92019-08-29 17:28:41 -0700335} // namespace android::inputdispatcher