• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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 
30 namespace android::inputdispatcher {
31 
32 struct EventEntry {
33     enum class Type {
34         CONFIGURATION_CHANGED,
35         DEVICE_RESET,
36         FOCUS,
37         KEY,
38         MOTION,
39         SENSOR,
40         POINTER_CAPTURE_CHANGED,
41         DRAG,
42     };
43 
44     int32_t id;
45     Type type;
46     nsecs_t eventTime;
47     uint32_t policyFlags;
48     InjectionState* injectionState;
49 
50     bool dispatchInProgress; // initially false, set to true while dispatching
51 
52     /**
53      * Injected keys are events from an external (probably untrusted) application
54      * and are not related to real hardware state. They come in via
55      * InputDispatcher::injectInputEvent, which sets policy flag POLICY_FLAG_INJECTED.
56      */
isInjectedEventEntry57     inline bool isInjected() const { return injectionState != nullptr; }
58 
59     /**
60      * Synthesized events are either injected events, or events that come
61      * from real hardware, but aren't directly attributable to a specific hardware event.
62      * Key repeat is a synthesized event, because it is related to an actual hardware state
63      * (a key is currently pressed), but the repeat itself is generated by the framework.
64      */
isSynthesizedEventEntry65     inline bool isSynthesized() const {
66         return isInjected() || IdGenerator::getSource(id) != IdGenerator::Source::INPUT_READER;
67     }
68 
69     virtual std::string getDescription() const = 0;
70 
71     EventEntry(int32_t id, Type type, nsecs_t eventTime, uint32_t policyFlags);
72     virtual ~EventEntry();
73 
74 protected:
75     void releaseInjectionState();
76 };
77 
78 struct ConfigurationChangedEntry : EventEntry {
79     explicit ConfigurationChangedEntry(int32_t id, nsecs_t eventTime);
80     std::string getDescription() const override;
81 
82     ~ConfigurationChangedEntry() override;
83 };
84 
85 struct DeviceResetEntry : EventEntry {
86     int32_t deviceId;
87 
88     DeviceResetEntry(int32_t id, nsecs_t eventTime, int32_t deviceId);
89     std::string getDescription() const override;
90 
91     ~DeviceResetEntry() override;
92 };
93 
94 struct FocusEntry : EventEntry {
95     sp<IBinder> connectionToken;
96     bool hasFocus;
97     std::string reason;
98 
99     FocusEntry(int32_t id, nsecs_t eventTime, sp<IBinder> connectionToken, bool hasFocus,
100                const std::string& reason);
101     std::string getDescription() const override;
102 
103     ~FocusEntry() override;
104 };
105 
106 struct PointerCaptureChangedEntry : EventEntry {
107     bool pointerCaptureEnabled;
108 
109     PointerCaptureChangedEntry(int32_t id, nsecs_t eventTime, bool hasPointerCapture);
110     std::string getDescription() const override;
111 
112     ~PointerCaptureChangedEntry() override;
113 };
114 
115 struct DragEntry : EventEntry {
116     sp<IBinder> connectionToken;
117     bool isExiting;
118     float x, y;
119 
120     DragEntry(int32_t id, nsecs_t eventTime, sp<IBinder> connectionToken, bool isExiting, float x,
121               float y);
122     std::string getDescription() const override;
123 
124     ~DragEntry() override;
125 };
126 
127 struct KeyEntry : EventEntry {
128     int32_t deviceId;
129     uint32_t source;
130     int32_t displayId;
131     int32_t action;
132     int32_t flags;
133     int32_t keyCode;
134     int32_t scanCode;
135     int32_t metaState;
136     int32_t repeatCount;
137     nsecs_t downTime;
138 
139     bool syntheticRepeat; // set to true for synthetic key repeats
140 
141     enum InterceptKeyResult {
142         INTERCEPT_KEY_RESULT_UNKNOWN,
143         INTERCEPT_KEY_RESULT_SKIP,
144         INTERCEPT_KEY_RESULT_CONTINUE,
145         INTERCEPT_KEY_RESULT_TRY_AGAIN_LATER,
146     };
147     InterceptKeyResult interceptKeyResult; // set based on the interception result
148     nsecs_t interceptKeyWakeupTime;        // used with INTERCEPT_KEY_RESULT_TRY_AGAIN_LATER
149 
150     KeyEntry(int32_t id, nsecs_t eventTime, int32_t deviceId, uint32_t source, int32_t displayId,
151              uint32_t policyFlags, int32_t action, int32_t flags, int32_t keyCode, int32_t scanCode,
152              int32_t metaState, int32_t repeatCount, nsecs_t downTime);
153     std::string getDescription() const override;
154     void recycle();
155 
156     ~KeyEntry() override;
157 };
158 
159 struct MotionEntry : EventEntry {
160     int32_t deviceId;
161     uint32_t source;
162     int32_t displayId;
163     int32_t action;
164     int32_t actionButton;
165     int32_t flags;
166     int32_t metaState;
167     int32_t buttonState;
168     MotionClassification classification;
169     int32_t edgeFlags;
170     float xPrecision;
171     float yPrecision;
172     float xCursorPosition;
173     float yCursorPosition;
174     nsecs_t downTime;
175     uint32_t pointerCount;
176     PointerProperties pointerProperties[MAX_POINTERS];
177     PointerCoords pointerCoords[MAX_POINTERS];
178 
179     MotionEntry(int32_t id, nsecs_t eventTime, int32_t deviceId, uint32_t source, int32_t displayId,
180                 uint32_t policyFlags, int32_t action, int32_t actionButton, int32_t flags,
181                 int32_t metaState, int32_t buttonState, MotionClassification classification,
182                 int32_t edgeFlags, float xPrecision, float yPrecision, float xCursorPosition,
183                 float yCursorPosition, nsecs_t downTime, uint32_t pointerCount,
184                 const PointerProperties* pointerProperties, const PointerCoords* pointerCoords,
185                 float xOffset, float yOffset);
186     std::string getDescription() const override;
187 
188     virtual ~MotionEntry();
189 };
190 
191 struct SensorEntry : EventEntry {
192     int32_t deviceId;
193     uint32_t source;
194     InputDeviceSensorType sensorType;
195     InputDeviceSensorAccuracy accuracy;
196     bool accuracyChanged;
197     nsecs_t hwTimestamp;
198 
199     std::vector<float> values;
200 
201     SensorEntry(int32_t id, nsecs_t eventTime, int32_t deviceId, uint32_t source,
202                 uint32_t policyFlags, nsecs_t hwTimestamp, InputDeviceSensorType sensorType,
203                 InputDeviceSensorAccuracy accuracy, bool accuracyChanged,
204                 std::vector<float> values);
205     std::string getDescription() const override;
206 
207     ~SensorEntry() override;
208 };
209 
210 // Tracks the progress of dispatching a particular event to a particular connection.
211 struct DispatchEntry {
212     const uint32_t seq; // unique sequence number, never 0
213 
214     std::shared_ptr<EventEntry> eventEntry; // the event to dispatch
215     int32_t targetFlags;
216     ui::Transform transform;
217     float globalScaleFactor;
218     int2 displaySize;
219     // Both deliveryTime and timeoutTime are only populated when the entry is sent to the app,
220     // and will be undefined before that.
221     nsecs_t deliveryTime; // time when the event was actually delivered
222     // An ANR will be triggered if a response for this entry is not received by timeoutTime
223     nsecs_t timeoutTime;
224 
225     // Set to the resolved ID, action and flags when the event is enqueued.
226     int32_t resolvedEventId;
227     int32_t resolvedAction;
228     int32_t resolvedFlags;
229 
230     DispatchEntry(std::shared_ptr<EventEntry> eventEntry, int32_t targetFlags,
231                   ui::Transform transform, float globalScaleFactor, int2 displaySize);
232 
hasForegroundTargetDispatchEntry233     inline bool hasForegroundTarget() const { return targetFlags & InputTarget::FLAG_FOREGROUND; }
234 
isSplitDispatchEntry235     inline bool isSplit() const { return targetFlags & InputTarget::FLAG_SPLIT; }
236 
237 private:
238     static volatile int32_t sNextSeqAtomic;
239 
240     static uint32_t nextSeq();
241 };
242 
243 VerifiedKeyEvent verifiedKeyEventFromKeyEntry(const KeyEntry& entry);
244 VerifiedMotionEvent verifiedMotionEventFromMotionEntry(const MotionEntry& entry);
245 
246 class InputDispatcher;
247 // A command entry captures state and behavior for an action to be performed in the
248 // dispatch loop after the initial processing has taken place.  It is essentially
249 // a kind of continuation used to postpone sensitive policy interactions to a point
250 // in the dispatch loop where it is safe to release the lock (generally after finishing
251 // the critical parts of the dispatch cycle).
252 //
253 // The special thing about commands is that they can voluntarily release and reacquire
254 // the dispatcher lock at will.  Initially when the command starts running, the
255 // dispatcher lock is held.  However, if the command needs to call into the policy to
256 // do some work, it can release the lock, do the work, then reacquire the lock again
257 // before returning.
258 //
259 // This mechanism is a bit clunky but it helps to preserve the invariant that the dispatch
260 // never calls into the policy while holding its lock.
261 //
262 // Commands are implicitly 'LockedInterruptible'.
263 struct CommandEntry;
264 typedef std::function<void(InputDispatcher&, CommandEntry*)> Command;
265 
266 class Connection;
267 struct CommandEntry {
268     explicit CommandEntry(Command command);
269     ~CommandEntry();
270 
271     Command command;
272 
273     // parameters for the command (usage varies by command)
274     sp<Connection> connection;
275     nsecs_t eventTime;
276     std::shared_ptr<KeyEntry> keyEntry;
277     std::shared_ptr<SensorEntry> sensorEntry;
278     std::shared_ptr<InputApplicationHandle> inputApplicationHandle;
279     std::string reason;
280     int32_t userActivityEventType;
281     uint32_t seq;
282     bool handled;
283     sp<IBinder> connectionToken;
284     sp<IBinder> oldToken;
285     sp<IBinder> newToken;
286     std::string obscuringPackage;
287     bool enabled;
288     int32_t pid;
289     nsecs_t consumeTime; // time when the event was consumed by InputConsumer
290     int32_t displayId;
291     float x;
292     float y;
293 };
294 
295 } // namespace android::inputdispatcher
296 
297 #endif // _UI_INPUT_INPUTDISPATCHER_ENTRY_H
298