blob: fba5514625ba330f62145b021cc3dbf1093e5bcb [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#ifndef _UI_INPUT_INPUTDISPATCHER_ENTRY_H
18#define _UI_INPUT_INPUTDISPATCHER_ENTRY_H
19
20#include "InjectionState.h"
21#include "InputTarget.h"
22
23#include <input/Input.h>
24#include <input/InputApplication.h>
25#include <stdint.h>
26#include <utils/Timers.h>
27#include <functional>
28#include <string>
29
30namespace android::inputdispatcher {
31
32struct EventEntry {
Siarhei Vishniakouf1035d42019-09-20 16:32:01 +010033 enum class Type {
34 CONFIGURATION_CHANGED,
35 DEVICE_RESET,
36 FOCUS,
37 KEY,
38 MOTION,
Prabir Pradhan99987712020-11-10 18:43:05 -080039 POINTER_CAPTURE_CHANGED,
Siarhei Vishniakouf1035d42019-09-20 16:32:01 +010040 };
Siarhei Vishniakou49483272019-10-22 13:13:47 -070041
42 static const char* typeToString(Type type) {
43 switch (type) {
44 case Type::CONFIGURATION_CHANGED:
45 return "CONFIGURATION_CHANGED";
46 case Type::DEVICE_RESET:
47 return "DEVICE_RESET";
Siarhei Vishniakouf1035d42019-09-20 16:32:01 +010048 case Type::FOCUS:
49 return "FOCUS";
Siarhei Vishniakou49483272019-10-22 13:13:47 -070050 case Type::KEY:
51 return "KEY";
52 case Type::MOTION:
53 return "MOTION";
Prabir Pradhan99987712020-11-10 18:43:05 -080054 case Type::POINTER_CAPTURE_CHANGED:
55 return "POINTER_CAPTURE_CHANGED";
Siarhei Vishniakou49483272019-10-22 13:13:47 -070056 }
57 }
Garfield Tane84e6f92019-08-29 17:28:41 -070058
Garfield Tan6a5a14e2020-01-28 13:24:04 -080059 int32_t id;
Siarhei Vishniakou49483272019-10-22 13:13:47 -070060 Type type;
Garfield Tane84e6f92019-08-29 17:28:41 -070061 nsecs_t eventTime;
62 uint32_t policyFlags;
63 InjectionState* injectionState;
64
65 bool dispatchInProgress; // initially false, set to true while dispatching
66
Siarhei Vishniakoude4bf152019-08-16 11:12:52 -050067 /**
68 * Injected keys are events from an external (probably untrusted) application
69 * and are not related to real hardware state. They come in via
70 * InputDispatcher::injectInputEvent, which sets policy flag POLICY_FLAG_INJECTED.
71 */
Garfield Tane84e6f92019-08-29 17:28:41 -070072 inline bool isInjected() const { return injectionState != nullptr; }
73
Siarhei Vishniakoude4bf152019-08-16 11:12:52 -050074 /**
75 * Synthesized events are either injected events, or events that come
76 * from real hardware, but aren't directly attributable to a specific hardware event.
77 * Key repeat is a synthesized event, because it is related to an actual hardware state
78 * (a key is currently pressed), but the repeat itself is generated by the framework.
79 */
Garfield Tanff1f1bb2020-01-28 13:24:04 -080080 inline bool isSynthesized() const {
81 return isInjected() || IdGenerator::getSource(id) != IdGenerator::Source::INPUT_READER;
82 }
Siarhei Vishniakoude4bf152019-08-16 11:12:52 -050083
Siarhei Vishniakou14411c92020-09-18 21:15:05 -050084 virtual std::string getDescription() const = 0;
Siarhei Vishniakou4cb50ca2020-05-26 21:43:02 -070085
Garfield Tan6a5a14e2020-01-28 13:24:04 -080086 EventEntry(int32_t id, Type type, nsecs_t eventTime, uint32_t policyFlags);
Garfield Tane84e6f92019-08-29 17:28:41 -070087 virtual ~EventEntry();
Siarhei Vishniakoua9a7ee82019-10-14 16:28:19 -070088
89protected:
Garfield Tane84e6f92019-08-29 17:28:41 -070090 void releaseInjectionState();
91};
92
93struct ConfigurationChangedEntry : EventEntry {
Garfield Tan6a5a14e2020-01-28 13:24:04 -080094 explicit ConfigurationChangedEntry(int32_t id, nsecs_t eventTime);
Siarhei Vishniakou14411c92020-09-18 21:15:05 -050095 std::string getDescription() const override;
Garfield Tane84e6f92019-08-29 17:28:41 -070096
Garfield Tane84e6f92019-08-29 17:28:41 -070097 virtual ~ConfigurationChangedEntry();
98};
99
100struct DeviceResetEntry : EventEntry {
101 int32_t deviceId;
102
Garfield Tan6a5a14e2020-01-28 13:24:04 -0800103 DeviceResetEntry(int32_t id, nsecs_t eventTime, int32_t deviceId);
Siarhei Vishniakou14411c92020-09-18 21:15:05 -0500104 std::string getDescription() const override;
Garfield Tane84e6f92019-08-29 17:28:41 -0700105
Garfield Tane84e6f92019-08-29 17:28:41 -0700106 virtual ~DeviceResetEntry();
107};
108
Siarhei Vishniakouf1035d42019-09-20 16:32:01 +0100109struct FocusEntry : EventEntry {
110 sp<IBinder> connectionToken;
111 bool hasFocus;
Vishnu Nair7d3d00d2020-08-03 11:20:42 -0700112 std::string_view reason;
Siarhei Vishniakouf1035d42019-09-20 16:32:01 +0100113
Vishnu Nair7d3d00d2020-08-03 11:20:42 -0700114 FocusEntry(int32_t id, nsecs_t eventTime, sp<IBinder> connectionToken, bool hasFocus,
115 std::string_view reason);
Siarhei Vishniakou14411c92020-09-18 21:15:05 -0500116 std::string getDescription() const override;
Siarhei Vishniakouf1035d42019-09-20 16:32:01 +0100117
Siarhei Vishniakouf1035d42019-09-20 16:32:01 +0100118 virtual ~FocusEntry();
119};
120
Prabir Pradhan99987712020-11-10 18:43:05 -0800121struct PointerCaptureChangedEntry : EventEntry {
122 bool pointerCaptureEnabled;
123
124 PointerCaptureChangedEntry(int32_t id, nsecs_t eventTime, bool hasPointerCapture);
125 std::string getDescription() const override;
126
127 virtual ~PointerCaptureChangedEntry();
128};
129
Garfield Tane84e6f92019-08-29 17:28:41 -0700130struct KeyEntry : EventEntry {
131 int32_t deviceId;
132 uint32_t source;
133 int32_t displayId;
134 int32_t action;
135 int32_t flags;
136 int32_t keyCode;
137 int32_t scanCode;
138 int32_t metaState;
139 int32_t repeatCount;
140 nsecs_t downTime;
141
142 bool syntheticRepeat; // set to true for synthetic key repeats
143
144 enum InterceptKeyResult {
145 INTERCEPT_KEY_RESULT_UNKNOWN,
146 INTERCEPT_KEY_RESULT_SKIP,
147 INTERCEPT_KEY_RESULT_CONTINUE,
148 INTERCEPT_KEY_RESULT_TRY_AGAIN_LATER,
149 };
150 InterceptKeyResult interceptKeyResult; // set based on the interception result
151 nsecs_t interceptKeyWakeupTime; // used with INTERCEPT_KEY_RESULT_TRY_AGAIN_LATER
152
Garfield Tan6a5a14e2020-01-28 13:24:04 -0800153 KeyEntry(int32_t id, nsecs_t eventTime, int32_t deviceId, uint32_t source, int32_t displayId,
154 uint32_t policyFlags, int32_t action, int32_t flags, int32_t keyCode, int32_t scanCode,
155 int32_t metaState, int32_t repeatCount, nsecs_t downTime);
Siarhei Vishniakou14411c92020-09-18 21:15:05 -0500156 std::string getDescription() const override;
Garfield Tane84e6f92019-08-29 17:28:41 -0700157 void recycle();
158
Garfield Tane84e6f92019-08-29 17:28:41 -0700159 virtual ~KeyEntry();
160};
161
162struct MotionEntry : EventEntry {
Garfield Tane84e6f92019-08-29 17:28:41 -0700163 int32_t deviceId;
164 uint32_t source;
165 int32_t displayId;
166 int32_t action;
167 int32_t actionButton;
168 int32_t flags;
169 int32_t metaState;
170 int32_t buttonState;
171 MotionClassification classification;
172 int32_t edgeFlags;
173 float xPrecision;
174 float yPrecision;
175 float xCursorPosition;
176 float yCursorPosition;
177 nsecs_t downTime;
178 uint32_t pointerCount;
179 PointerProperties pointerProperties[MAX_POINTERS];
180 PointerCoords pointerCoords[MAX_POINTERS];
181
Garfield Tan6a5a14e2020-01-28 13:24:04 -0800182 MotionEntry(int32_t id, nsecs_t eventTime, int32_t deviceId, uint32_t source, int32_t displayId,
183 uint32_t policyFlags, int32_t action, int32_t actionButton, int32_t flags,
184 int32_t metaState, int32_t buttonState, MotionClassification classification,
185 int32_t edgeFlags, float xPrecision, float yPrecision, float xCursorPosition,
186 float yCursorPosition, nsecs_t downTime, uint32_t pointerCount,
187 const PointerProperties* pointerProperties, const PointerCoords* pointerCoords,
188 float xOffset, float yOffset);
Siarhei Vishniakou14411c92020-09-18 21:15:05 -0500189 std::string getDescription() const override;
Garfield Tane84e6f92019-08-29 17:28:41 -0700190
Garfield Tane84e6f92019-08-29 17:28:41 -0700191 virtual ~MotionEntry();
192};
193
194// Tracks the progress of dispatching a particular event to a particular connection.
195struct DispatchEntry {
196 const uint32_t seq; // unique sequence number, never 0
197
Siarhei Vishniakoua9a7ee82019-10-14 16:28:19 -0700198 std::shared_ptr<EventEntry> eventEntry; // the event to dispatch
Garfield Tane84e6f92019-08-29 17:28:41 -0700199 int32_t targetFlags;
chaviw1ff3d1e2020-07-01 15:53:47 -0700200 ui::Transform transform;
Garfield Tane84e6f92019-08-29 17:28:41 -0700201 float globalScaleFactor;
Siarhei Vishniakoud44dddf2020-03-25 16:16:40 -0700202 // Both deliveryTime and timeoutTime are only populated when the entry is sent to the app,
203 // and will be undefined before that.
Garfield Tane84e6f92019-08-29 17:28:41 -0700204 nsecs_t deliveryTime; // time when the event was actually delivered
Siarhei Vishniakoud44dddf2020-03-25 16:16:40 -0700205 // An ANR will be triggered if a response for this entry is not received by timeoutTime
206 nsecs_t timeoutTime;
Garfield Tane84e6f92019-08-29 17:28:41 -0700207
Garfield Tanff1f1bb2020-01-28 13:24:04 -0800208 // Set to the resolved ID, action and flags when the event is enqueued.
209 int32_t resolvedEventId;
Garfield Tane84e6f92019-08-29 17:28:41 -0700210 int32_t resolvedAction;
211 int32_t resolvedFlags;
212
Siarhei Vishniakoua9a7ee82019-10-14 16:28:19 -0700213 DispatchEntry(std::shared_ptr<EventEntry> eventEntry, int32_t targetFlags,
214 ui::Transform transform, float globalScaleFactor);
Garfield Tane84e6f92019-08-29 17:28:41 -0700215
216 inline bool hasForegroundTarget() const { return targetFlags & InputTarget::FLAG_FOREGROUND; }
217
218 inline bool isSplit() const { return targetFlags & InputTarget::FLAG_SPLIT; }
219
220private:
221 static volatile int32_t sNextSeqAtomic;
222
223 static uint32_t nextSeq();
224};
225
Gang Wange9087892020-01-07 12:17:14 -0500226VerifiedKeyEvent verifiedKeyEventFromKeyEntry(const KeyEntry& entry);
227VerifiedMotionEvent verifiedMotionEventFromMotionEntry(const MotionEntry& entry);
228
Garfield Tane84e6f92019-08-29 17:28:41 -0700229class InputDispatcher;
230// A command entry captures state and behavior for an action to be performed in the
231// dispatch loop after the initial processing has taken place. It is essentially
232// a kind of continuation used to postpone sensitive policy interactions to a point
233// in the dispatch loop where it is safe to release the lock (generally after finishing
234// the critical parts of the dispatch cycle).
235//
236// The special thing about commands is that they can voluntarily release and reacquire
237// the dispatcher lock at will. Initially when the command starts running, the
238// dispatcher lock is held. However, if the command needs to call into the policy to
239// do some work, it can release the lock, do the work, then reacquire the lock again
240// before returning.
241//
242// This mechanism is a bit clunky but it helps to preserve the invariant that the dispatch
243// never calls into the policy while holding its lock.
244//
245// Commands are implicitly 'LockedInterruptible'.
246struct CommandEntry;
247typedef std::function<void(InputDispatcher&, CommandEntry*)> Command;
248
249class Connection;
250struct CommandEntry {
251 explicit CommandEntry(Command command);
252 ~CommandEntry();
253
254 Command command;
255
256 // parameters for the command (usage varies by command)
257 sp<Connection> connection;
258 nsecs_t eventTime;
Siarhei Vishniakoua9a7ee82019-10-14 16:28:19 -0700259 std::shared_ptr<KeyEntry> keyEntry;
Chris Yea209fde2020-07-22 13:54:51 -0700260 std::shared_ptr<InputApplicationHandle> inputApplicationHandle;
Garfield Tane84e6f92019-08-29 17:28:41 -0700261 std::string reason;
262 int32_t userActivityEventType;
263 uint32_t seq;
264 bool handled;
Siarhei Vishniakou2b4782c2020-11-07 01:51:18 -0600265 sp<IBinder> connectionToken;
Garfield Tane84e6f92019-08-29 17:28:41 -0700266 sp<IBinder> oldToken;
267 sp<IBinder> newToken;
Bernardo Rufino2e1f6512020-10-08 13:42:07 +0000268 std::string obscuringPackage;
Prabir Pradhan99987712020-11-10 18:43:05 -0800269 bool enabled;
Garfield Tane84e6f92019-08-29 17:28:41 -0700270};
271
272} // namespace android::inputdispatcher
273
274#endif // _UI_INPUT_INPUTDISPATCHER_ENTRY_H