blob: ded74baff47a359b8fdfa119dea7fe402d864bdd [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 refCount(1),
63 type(type),
64 eventTime(eventTime),
65 policyFlags(policyFlags),
66 injectionState(nullptr),
67 dispatchInProgress(false) {}
68
69EventEntry::~EventEntry() {
70 releaseInjectionState();
71}
72
Siarhei Vishniakou4cb50ca2020-05-26 21:43:02 -070073std::string EventEntry::getDescription() const {
74 std::string result;
75 appendDescription(result);
76 return result;
77}
78
Garfield Tane84e6f92019-08-29 17:28:41 -070079void EventEntry::release() {
80 refCount -= 1;
81 if (refCount == 0) {
82 delete this;
83 } else {
84 ALOG_ASSERT(refCount > 0);
85 }
86}
87
88void EventEntry::releaseInjectionState() {
89 if (injectionState) {
90 injectionState->release();
91 injectionState = nullptr;
92 }
93}
94
95// --- ConfigurationChangedEntry ---
96
Garfield Tanc51d1ba2020-01-28 13:24:04 -080097ConfigurationChangedEntry::ConfigurationChangedEntry(int32_t id, nsecs_t eventTime)
98 : EventEntry(id, Type::CONFIGURATION_CHANGED, eventTime, 0) {}
Garfield Tane84e6f92019-08-29 17:28:41 -070099
100ConfigurationChangedEntry::~ConfigurationChangedEntry() {}
101
102void ConfigurationChangedEntry::appendDescription(std::string& msg) const {
103 msg += StringPrintf("ConfigurationChangedEvent(), policyFlags=0x%08x", policyFlags);
104}
105
106// --- DeviceResetEntry ---
107
Garfield Tanc51d1ba2020-01-28 13:24:04 -0800108DeviceResetEntry::DeviceResetEntry(int32_t id, nsecs_t eventTime, int32_t deviceId)
109 : EventEntry(id, Type::DEVICE_RESET, eventTime, 0), deviceId(deviceId) {}
Garfield Tane84e6f92019-08-29 17:28:41 -0700110
111DeviceResetEntry::~DeviceResetEntry() {}
112
113void DeviceResetEntry::appendDescription(std::string& msg) const {
114 msg += StringPrintf("DeviceResetEvent(deviceId=%d), policyFlags=0x%08x", deviceId, policyFlags);
115}
116
Siarhei Vishniakouf1035d42019-09-20 16:32:01 +0100117// --- FocusEntry ---
118
119// 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 -0700120FocusEntry::FocusEntry(int32_t id, nsecs_t eventTime, sp<IBinder> connectionToken, bool hasFocus,
121 std::string_view reason)
Garfield Tanc51d1ba2020-01-28 13:24:04 -0800122 : EventEntry(id, Type::FOCUS, eventTime, POLICY_FLAG_PASS_TO_USER),
Siarhei Vishniakouf1035d42019-09-20 16:32:01 +0100123 connectionToken(connectionToken),
Vishnu Nair7d3d00d2020-08-03 11:20:42 -0700124 hasFocus(hasFocus),
125 reason(reason) {}
Siarhei Vishniakouf1035d42019-09-20 16:32:01 +0100126
127FocusEntry::~FocusEntry() {}
128
129void FocusEntry::appendDescription(std::string& msg) const {
130 msg += StringPrintf("FocusEvent(hasFocus=%s)", hasFocus ? "true" : "false");
131}
132
Garfield Tane84e6f92019-08-29 17:28:41 -0700133// --- KeyEntry ---
134
Garfield Tanc51d1ba2020-01-28 13:24:04 -0800135KeyEntry::KeyEntry(int32_t id, nsecs_t eventTime, int32_t deviceId, uint32_t source,
Garfield Tane84e6f92019-08-29 17:28:41 -0700136 int32_t displayId, uint32_t policyFlags, int32_t action, int32_t flags,
137 int32_t keyCode, int32_t scanCode, int32_t metaState, int32_t repeatCount,
138 nsecs_t downTime)
Garfield Tanc51d1ba2020-01-28 13:24:04 -0800139 : EventEntry(id, Type::KEY, eventTime, policyFlags),
Garfield Tane84e6f92019-08-29 17:28:41 -0700140 deviceId(deviceId),
141 source(source),
142 displayId(displayId),
143 action(action),
144 flags(flags),
145 keyCode(keyCode),
146 scanCode(scanCode),
147 metaState(metaState),
148 repeatCount(repeatCount),
149 downTime(downTime),
150 syntheticRepeat(false),
151 interceptKeyResult(KeyEntry::INTERCEPT_KEY_RESULT_UNKNOWN),
152 interceptKeyWakeupTime(0) {}
153
154KeyEntry::~KeyEntry() {}
155
156void KeyEntry::appendDescription(std::string& msg) const {
Ashwini Orugantid399a522019-10-10 11:16:45 -0700157 msg += StringPrintf("KeyEvent");
158 if (!GetBoolProperty("ro.debuggable", false)) {
159 return;
160 }
161 msg += StringPrintf("(deviceId=%d, source=0x%08x, displayId=%" PRId32 ", action=%s, "
Garfield Tane84e6f92019-08-29 17:28:41 -0700162 "flags=0x%08x, keyCode=%d, scanCode=%d, metaState=0x%08x, "
163 "repeatCount=%d), policyFlags=0x%08x",
Siarhei Vishniakoud44dddf2020-03-25 16:16:40 -0700164 deviceId, source, displayId, KeyEvent::actionToString(action), flags,
Garfield Tane84e6f92019-08-29 17:28:41 -0700165 keyCode, scanCode, metaState, repeatCount, policyFlags);
166}
167
168void KeyEntry::recycle() {
169 releaseInjectionState();
170
171 dispatchInProgress = false;
172 syntheticRepeat = false;
173 interceptKeyResult = KeyEntry::INTERCEPT_KEY_RESULT_UNKNOWN;
174 interceptKeyWakeupTime = 0;
175}
176
177// --- MotionEntry ---
178
Garfield Tanc51d1ba2020-01-28 13:24:04 -0800179MotionEntry::MotionEntry(int32_t id, nsecs_t eventTime, int32_t deviceId, uint32_t source,
Garfield Tane84e6f92019-08-29 17:28:41 -0700180 int32_t displayId, uint32_t policyFlags, int32_t action,
181 int32_t actionButton, int32_t flags, int32_t metaState,
182 int32_t buttonState, MotionClassification classification,
183 int32_t edgeFlags, float xPrecision, float yPrecision,
184 float xCursorPosition, float yCursorPosition, nsecs_t downTime,
185 uint32_t pointerCount, const PointerProperties* pointerProperties,
186 const PointerCoords* pointerCoords, float xOffset, float yOffset)
Garfield Tanc51d1ba2020-01-28 13:24:04 -0800187 : EventEntry(id, Type::MOTION, eventTime, policyFlags),
Garfield Tane84e6f92019-08-29 17:28:41 -0700188 eventTime(eventTime),
189 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),
204 pointerCount(pointerCount) {
205 for (uint32_t i = 0; i < pointerCount; i++) {
206 this->pointerProperties[i].copyFrom(pointerProperties[i]);
207 this->pointerCoords[i].copyFrom(pointerCoords[i]);
208 if (xOffset || yOffset) {
209 this->pointerCoords[i].applyOffset(xOffset, yOffset);
210 }
211 }
212}
213
214MotionEntry::~MotionEntry() {}
215
216void MotionEntry::appendDescription(std::string& msg) const {
Ashwini Orugantid399a522019-10-10 11:16:45 -0700217 msg += StringPrintf("MotionEvent");
218 if (!GetBoolProperty("ro.debuggable", false)) {
219 return;
220 }
221 msg += StringPrintf("(deviceId=%d, source=0x%08x, displayId=%" PRId32
Garfield Tane84e6f92019-08-29 17:28:41 -0700222 ", action=%s, actionButton=0x%08x, flags=0x%08x, metaState=0x%08x, "
223 "buttonState=0x%08x, "
224 "classification=%s, edgeFlags=0x%08x, xPrecision=%.1f, yPrecision=%.1f, "
225 "xCursorPosition=%0.1f, yCursorPosition=%0.1f, pointers=[",
Siarhei Vishniakoud44dddf2020-03-25 16:16:40 -0700226 deviceId, source, displayId, MotionEvent::actionToString(action),
Garfield Tane84e6f92019-08-29 17:28:41 -0700227 actionButton, flags, metaState, buttonState,
228 motionClassificationToString(classification), edgeFlags, xPrecision,
229 yPrecision, xCursorPosition, yCursorPosition);
230
231 for (uint32_t i = 0; i < pointerCount; i++) {
232 if (i) {
233 msg += ", ";
234 }
235 msg += StringPrintf("%d: (%.1f, %.1f)", pointerProperties[i].id, pointerCoords[i].getX(),
236 pointerCoords[i].getY());
237 }
238 msg += StringPrintf("]), policyFlags=0x%08x", policyFlags);
239}
240
241// --- DispatchEntry ---
242
243volatile int32_t DispatchEntry::sNextSeqAtomic;
244
chaviw1ff3d1e2020-07-01 15:53:47 -0700245DispatchEntry::DispatchEntry(EventEntry* eventEntry, int32_t targetFlags, ui::Transform transform,
246 float globalScaleFactor)
Garfield Tane84e6f92019-08-29 17:28:41 -0700247 : seq(nextSeq()),
248 eventEntry(eventEntry),
249 targetFlags(targetFlags),
chaviw1ff3d1e2020-07-01 15:53:47 -0700250 transform(transform),
Garfield Tane84e6f92019-08-29 17:28:41 -0700251 globalScaleFactor(globalScaleFactor),
Garfield Tane84e6f92019-08-29 17:28:41 -0700252 deliveryTime(0),
253 resolvedAction(0),
254 resolvedFlags(0) {
255 eventEntry->refCount += 1;
256}
257
258DispatchEntry::~DispatchEntry() {
259 eventEntry->release();
260}
261
262uint32_t DispatchEntry::nextSeq() {
263 // Sequence number 0 is reserved and will never be returned.
264 uint32_t seq;
265 do {
266 seq = android_atomic_inc(&sNextSeqAtomic);
267 } while (!seq);
268 return seq;
269}
270
271// --- CommandEntry ---
272
273CommandEntry::CommandEntry(Command command)
274 : command(command),
275 eventTime(0),
276 keyEntry(nullptr),
277 userActivityEventType(0),
278 seq(0),
279 handled(false) {}
280
281CommandEntry::~CommandEntry() {}
282
283} // namespace android::inputdispatcher