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