blob: 29df00b1b9a0df0473ee4162713a1a8397d62c01 [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,
105 std::string_view 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
Garfield Tane84e6f92019-08-29 17:28:41 -0700117// --- KeyEntry ---
118
Garfield Tanc51d1ba2020-01-28 13:24:04 -0800119KeyEntry::KeyEntry(int32_t id, nsecs_t eventTime, int32_t deviceId, uint32_t source,
Garfield Tane84e6f92019-08-29 17:28:41 -0700120 int32_t displayId, uint32_t policyFlags, int32_t action, int32_t flags,
121 int32_t keyCode, int32_t scanCode, int32_t metaState, int32_t repeatCount,
122 nsecs_t downTime)
Garfield Tanc51d1ba2020-01-28 13:24:04 -0800123 : EventEntry(id, Type::KEY, eventTime, policyFlags),
Garfield Tane84e6f92019-08-29 17:28:41 -0700124 deviceId(deviceId),
125 source(source),
126 displayId(displayId),
127 action(action),
128 flags(flags),
129 keyCode(keyCode),
130 scanCode(scanCode),
131 metaState(metaState),
132 repeatCount(repeatCount),
133 downTime(downTime),
134 syntheticRepeat(false),
135 interceptKeyResult(KeyEntry::INTERCEPT_KEY_RESULT_UNKNOWN),
136 interceptKeyWakeupTime(0) {}
137
138KeyEntry::~KeyEntry() {}
139
Siarhei Vishniakou14411c92020-09-18 21:15:05 -0500140std::string KeyEntry::getDescription() const {
Ashwini Orugantid399a522019-10-10 11:16:45 -0700141 if (!GetBoolProperty("ro.debuggable", false)) {
Siarhei Vishniakou14411c92020-09-18 21:15:05 -0500142 return "KeyEvent";
Ashwini Orugantid399a522019-10-10 11:16:45 -0700143 }
Siarhei Vishniakoua1188f52020-10-20 20:14:52 -0500144 return StringPrintf("KeyEvent(deviceId=%d, eventTime=%" PRIu64
145 ", source=0x%08x, displayId=%" PRId32 ", action=%s, "
Garfield Tane84e6f92019-08-29 17:28:41 -0700146 "flags=0x%08x, keyCode=%d, scanCode=%d, metaState=0x%08x, "
147 "repeatCount=%d), policyFlags=0x%08x",
Siarhei Vishniakoua1188f52020-10-20 20:14:52 -0500148 deviceId, eventTime, source, displayId, KeyEvent::actionToString(action),
149 flags, keyCode, scanCode, metaState, repeatCount, policyFlags);
Garfield Tane84e6f92019-08-29 17:28:41 -0700150}
151
152void KeyEntry::recycle() {
153 releaseInjectionState();
154
155 dispatchInProgress = false;
156 syntheticRepeat = false;
157 interceptKeyResult = KeyEntry::INTERCEPT_KEY_RESULT_UNKNOWN;
158 interceptKeyWakeupTime = 0;
159}
160
161// --- MotionEntry ---
162
Garfield Tanc51d1ba2020-01-28 13:24:04 -0800163MotionEntry::MotionEntry(int32_t id, nsecs_t eventTime, int32_t deviceId, uint32_t source,
Garfield Tane84e6f92019-08-29 17:28:41 -0700164 int32_t displayId, uint32_t policyFlags, int32_t action,
165 int32_t actionButton, int32_t flags, int32_t metaState,
166 int32_t buttonState, MotionClassification classification,
167 int32_t edgeFlags, float xPrecision, float yPrecision,
168 float xCursorPosition, float yCursorPosition, nsecs_t downTime,
169 uint32_t pointerCount, const PointerProperties* pointerProperties,
170 const PointerCoords* pointerCoords, float xOffset, float yOffset)
Garfield Tanc51d1ba2020-01-28 13:24:04 -0800171 : EventEntry(id, Type::MOTION, eventTime, policyFlags),
Garfield Tane84e6f92019-08-29 17:28:41 -0700172 deviceId(deviceId),
173 source(source),
174 displayId(displayId),
175 action(action),
176 actionButton(actionButton),
177 flags(flags),
178 metaState(metaState),
179 buttonState(buttonState),
180 classification(classification),
181 edgeFlags(edgeFlags),
182 xPrecision(xPrecision),
183 yPrecision(yPrecision),
184 xCursorPosition(xCursorPosition),
185 yCursorPosition(yCursorPosition),
186 downTime(downTime),
187 pointerCount(pointerCount) {
188 for (uint32_t i = 0; i < pointerCount; i++) {
189 this->pointerProperties[i].copyFrom(pointerProperties[i]);
190 this->pointerCoords[i].copyFrom(pointerCoords[i]);
191 if (xOffset || yOffset) {
192 this->pointerCoords[i].applyOffset(xOffset, yOffset);
193 }
194 }
195}
196
197MotionEntry::~MotionEntry() {}
198
Siarhei Vishniakou14411c92020-09-18 21:15:05 -0500199std::string MotionEntry::getDescription() const {
Ashwini Orugantid399a522019-10-10 11:16:45 -0700200 if (!GetBoolProperty("ro.debuggable", false)) {
Siarhei Vishniakou14411c92020-09-18 21:15:05 -0500201 return "MotionEvent";
Ashwini Orugantid399a522019-10-10 11:16:45 -0700202 }
Siarhei Vishniakou14411c92020-09-18 21:15:05 -0500203 std::string msg;
Siarhei Vishniakoua1188f52020-10-20 20:14:52 -0500204 msg += StringPrintf("MotionEvent(deviceId=%d, eventTime=%" PRIu64
205 ", source=0x%08x, displayId=%" PRId32
Garfield Tane84e6f92019-08-29 17:28:41 -0700206 ", action=%s, actionButton=0x%08x, flags=0x%08x, metaState=0x%08x, "
207 "buttonState=0x%08x, "
208 "classification=%s, edgeFlags=0x%08x, xPrecision=%.1f, yPrecision=%.1f, "
209 "xCursorPosition=%0.1f, yCursorPosition=%0.1f, pointers=[",
Siarhei Vishniakouc68fdec2020-10-22 14:58:14 -0500210 deviceId, eventTime, source, displayId,
211 MotionEvent::actionToString(action).c_str(), actionButton, flags, metaState,
212 buttonState, motionClassificationToString(classification), edgeFlags,
213 xPrecision, yPrecision, xCursorPosition, yCursorPosition);
Garfield Tane84e6f92019-08-29 17:28:41 -0700214
215 for (uint32_t i = 0; i < pointerCount; i++) {
216 if (i) {
217 msg += ", ";
218 }
219 msg += StringPrintf("%d: (%.1f, %.1f)", pointerProperties[i].id, pointerCoords[i].getX(),
220 pointerCoords[i].getY());
221 }
222 msg += StringPrintf("]), policyFlags=0x%08x", policyFlags);
Siarhei Vishniakou14411c92020-09-18 21:15:05 -0500223 return msg;
Garfield Tane84e6f92019-08-29 17:28:41 -0700224}
225
226// --- DispatchEntry ---
227
228volatile int32_t DispatchEntry::sNextSeqAtomic;
229
Siarhei Vishniakoua9a7ee82019-10-14 16:28:19 -0700230DispatchEntry::DispatchEntry(std::shared_ptr<EventEntry> eventEntry, int32_t targetFlags,
231 ui::Transform transform, float globalScaleFactor)
Garfield Tane84e6f92019-08-29 17:28:41 -0700232 : seq(nextSeq()),
Siarhei Vishniakoua9a7ee82019-10-14 16:28:19 -0700233 eventEntry(std::move(eventEntry)),
Garfield Tane84e6f92019-08-29 17:28:41 -0700234 targetFlags(targetFlags),
chaviw1ff3d1e2020-07-01 15:53:47 -0700235 transform(transform),
Garfield Tane84e6f92019-08-29 17:28:41 -0700236 globalScaleFactor(globalScaleFactor),
Garfield Tane84e6f92019-08-29 17:28:41 -0700237 deliveryTime(0),
238 resolvedAction(0),
Siarhei Vishniakoua9a7ee82019-10-14 16:28:19 -0700239 resolvedFlags(0) {}
Garfield Tane84e6f92019-08-29 17:28:41 -0700240
241uint32_t DispatchEntry::nextSeq() {
242 // Sequence number 0 is reserved and will never be returned.
243 uint32_t seq;
244 do {
245 seq = android_atomic_inc(&sNextSeqAtomic);
246 } while (!seq);
247 return seq;
248}
249
250// --- CommandEntry ---
251
252CommandEntry::CommandEntry(Command command)
253 : command(command),
254 eventTime(0),
255 keyEntry(nullptr),
256 userActivityEventType(0),
257 seq(0),
258 handled(false) {}
259
260CommandEntry::~CommandEntry() {}
261
262} // namespace android::inputdispatcher