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 <gui/InputApplication.h>
24 #include <input/Input.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     const PointerCaptureRequest pointerCaptureRequest;
108 
109     PointerCaptureChangedEntry(int32_t id, nsecs_t eventTime, const PointerCaptureRequest&);
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     uint32_t displayOrientation;
219     int2 displaySize;
220     // Both deliveryTime and timeoutTime are only populated when the entry is sent to the app,
221     // and will be undefined before that.
222     nsecs_t deliveryTime; // time when the event was actually delivered
223     // An ANR will be triggered if a response for this entry is not received by timeoutTime
224     nsecs_t timeoutTime;
225 
226     // Set to the resolved ID, action and flags when the event is enqueued.
227     int32_t resolvedEventId;
228     int32_t resolvedAction;
229     int32_t resolvedFlags;
230 
231     DispatchEntry(std::shared_ptr<EventEntry> eventEntry, int32_t targetFlags,
232                   ui::Transform transform, float globalScaleFactor, uint32_t displayOrientation,
233                   int2 displaySize);
234 
hasForegroundTargetDispatchEntry235     inline bool hasForegroundTarget() const { return targetFlags & InputTarget::FLAG_FOREGROUND; }
236 
isSplitDispatchEntry237     inline bool isSplit() const { return targetFlags & InputTarget::FLAG_SPLIT; }
238 
239 private:
240     static volatile int32_t sNextSeqAtomic;
241 
242     static uint32_t nextSeq();
243 };
244 
245 VerifiedKeyEvent verifiedKeyEventFromKeyEntry(const KeyEntry& entry);
246 VerifiedMotionEvent verifiedMotionEventFromMotionEntry(const MotionEntry& entry);
247 
248 class InputDispatcher;
249 // A command entry captures state and behavior for an action to be performed in the
250 // dispatch loop after the initial processing has taken place.  It is essentially
251 // a kind of continuation used to postpone sensitive policy interactions to a point
252 // in the dispatch loop where it is safe to release the lock (generally after finishing
253 // the critical parts of the dispatch cycle).
254 //
255 // The special thing about commands is that they can voluntarily release and reacquire
256 // the dispatcher lock at will.  Initially when the command starts running, the
257 // dispatcher lock is held.  However, if the command needs to call into the policy to
258 // do some work, it can release the lock, do the work, then reacquire the lock again
259 // before returning.
260 //
261 // This mechanism is a bit clunky but it helps to preserve the invariant that the dispatch
262 // never calls into the policy while holding its lock.
263 //
264 // Commands are implicitly 'LockedInterruptible'.
265 struct CommandEntry;
266 typedef std::function<void(InputDispatcher&, CommandEntry*)> Command;
267 
268 class Connection;
269 struct CommandEntry {
270     explicit CommandEntry(Command command);
271     ~CommandEntry();
272 
273     Command command;
274 
275     // parameters for the command (usage varies by command)
276     sp<Connection> connection;
277     nsecs_t eventTime;
278     std::shared_ptr<KeyEntry> keyEntry;
279     std::shared_ptr<SensorEntry> sensorEntry;
280     std::shared_ptr<InputApplicationHandle> inputApplicationHandle;
281     std::string reason;
282     int32_t userActivityEventType;
283     uint32_t seq;
284     bool handled;
285     sp<IBinder> connectionToken;
286     sp<IBinder> oldToken;
287     sp<IBinder> newToken;
288     std::string obscuringPackage;
289     PointerCaptureRequest pointerCaptureRequest;
290     int32_t pid;
291     nsecs_t consumeTime; // time when the event was consumed by InputConsumer
292     int32_t displayId;
293     float x;
294     float y;
295 };
296 
297 } // namespace android::inputdispatcher
298 
299 #endif // _UI_INPUT_INPUTDISPATCHER_ENTRY_H
300