1 /* 2 * Copyright (C) 2010 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 #pragma once 18 19 #pragma GCC system_header 20 21 /** 22 * Native input event structures. 23 */ 24 25 #include <android/input.h> 26 #ifdef __linux__ 27 #include <android/os/IInputConstants.h> 28 #endif 29 #include <math.h> 30 #include <stdint.h> 31 #include <ui/Transform.h> 32 #include <utils/BitSet.h> 33 #include <utils/Timers.h> 34 #include <array> 35 #include <limits> 36 #include <queue> 37 38 /* 39 * Additional private constants not defined in ndk/ui/input.h. 40 */ 41 enum { 42 #ifdef __linux__ 43 /* This event was generated or modified by accessibility service. */ 44 AKEY_EVENT_FLAG_IS_ACCESSIBILITY_EVENT = 45 android::os::IInputConstants::INPUT_EVENT_FLAG_IS_ACCESSIBILITY_EVENT, // 0x800, 46 #else 47 AKEY_EVENT_FLAG_IS_ACCESSIBILITY_EVENT = 0x800, 48 #endif 49 /* Signifies that the key is being predispatched */ 50 AKEY_EVENT_FLAG_PREDISPATCH = 0x20000000, 51 52 /* Private control to determine when an app is tracking a key sequence. */ 53 AKEY_EVENT_FLAG_START_TRACKING = 0x40000000, 54 55 /* Key event is inconsistent with previously sent key events. */ 56 AKEY_EVENT_FLAG_TAINTED = 0x80000000, 57 }; 58 59 enum { 60 61 /** 62 * This flag indicates that the window that received this motion event is partly 63 * or wholly obscured by another visible window above it. This flag is set to true 64 * even if the event did not directly pass through the obscured area. 65 * A security sensitive application can check this flag to identify situations in which 66 * a malicious application may have covered up part of its content for the purpose 67 * of misleading the user or hijacking touches. An appropriate response might be 68 * to drop the suspect touches or to take additional precautions to confirm the user's 69 * actual intent. 70 */ 71 AMOTION_EVENT_FLAG_WINDOW_IS_PARTIALLY_OBSCURED = 0x2, 72 73 /** 74 * This flag indicates that the event has been generated by a gesture generator. It 75 * provides a hint to the GestureDetector to not apply any touch slop. 76 */ 77 AMOTION_EVENT_FLAG_IS_GENERATED_GESTURE = 0x8, 78 79 /** 80 * This flag indicates that the event will not cause a focus change if it is directed to an 81 * unfocused window, even if it an ACTION_DOWN. This is typically used with pointer 82 * gestures to allow the user to direct gestures to an unfocused window without bringing it 83 * into focus. 84 */ 85 AMOTION_EVENT_FLAG_NO_FOCUS_CHANGE = 0x40, 86 87 #if defined(__linux__) 88 /** 89 * This event was generated or modified by accessibility service. 90 */ 91 AMOTION_EVENT_FLAG_IS_ACCESSIBILITY_EVENT = 92 android::os::IInputConstants::INPUT_EVENT_FLAG_IS_ACCESSIBILITY_EVENT, // 0x800, 93 #else 94 AMOTION_EVENT_FLAG_IS_ACCESSIBILITY_EVENT = 0x800, 95 #endif 96 97 /* Motion event is inconsistent with previously sent motion events. */ 98 AMOTION_EVENT_FLAG_TAINTED = 0x80000000, 99 }; 100 101 /** 102 * Allowed VerifiedKeyEvent flags. All other flags from KeyEvent do not get verified. 103 * These values must be kept in sync with VerifiedKeyEvent.java 104 */ 105 constexpr int32_t VERIFIED_KEY_EVENT_FLAGS = 106 AKEY_EVENT_FLAG_CANCELED | AKEY_EVENT_FLAG_IS_ACCESSIBILITY_EVENT; 107 108 /** 109 * Allowed VerifiedMotionEventFlags. All other flags from MotionEvent do not get verified. 110 * These values must be kept in sync with VerifiedMotionEvent.java 111 */ 112 constexpr int32_t VERIFIED_MOTION_EVENT_FLAGS = AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED | 113 AMOTION_EVENT_FLAG_WINDOW_IS_PARTIALLY_OBSCURED | AMOTION_EVENT_FLAG_IS_ACCESSIBILITY_EVENT; 114 115 /** 116 * This flag indicates that the point up event has been canceled. 117 * Typically this is used for palm event when the user has accidental touches. 118 * TODO: Adjust flag to public api 119 */ 120 constexpr int32_t AMOTION_EVENT_FLAG_CANCELED = 0x20; 121 122 enum { 123 /* 124 * Indicates that an input device has switches. 125 * This input source flag is hidden from the API because switches are only used by the system 126 * and applications have no way to interact with them. 127 */ 128 AINPUT_SOURCE_SWITCH = 0x80000000, 129 }; 130 131 enum { 132 /** 133 * Constants for LEDs. Hidden from the API since we don't actually expose a way to interact 134 * with LEDs to developers 135 * 136 * NOTE: If you add LEDs here, you must also add them to InputEventLabels.h 137 */ 138 139 ALED_NUM_LOCK = 0x00, 140 ALED_CAPS_LOCK = 0x01, 141 ALED_SCROLL_LOCK = 0x02, 142 ALED_COMPOSE = 0x03, 143 ALED_KANA = 0x04, 144 ALED_SLEEP = 0x05, 145 ALED_SUSPEND = 0x06, 146 ALED_MUTE = 0x07, 147 ALED_MISC = 0x08, 148 ALED_MAIL = 0x09, 149 ALED_CHARGING = 0x0a, 150 ALED_CONTROLLER_1 = 0x10, 151 ALED_CONTROLLER_2 = 0x11, 152 ALED_CONTROLLER_3 = 0x12, 153 ALED_CONTROLLER_4 = 0x13, 154 }; 155 156 /* Maximum number of controller LEDs we support */ 157 #define MAX_CONTROLLER_LEDS 4 158 159 /* 160 * Maximum number of pointers supported per motion event. 161 * Smallest number of pointers is 1. 162 * (We want at least 10 but some touch controllers obstensibly configured for 10 pointers 163 * will occasionally emit 11. There is not much harm making this constant bigger.) 164 */ 165 static constexpr size_t MAX_POINTERS = 16; 166 167 /* 168 * Maximum number of samples supported per motion event. 169 */ 170 #define MAX_SAMPLES UINT16_MAX 171 172 /* 173 * Maximum pointer id value supported in a motion event. 174 * Smallest pointer id is 0. 175 * (This is limited by our use of BitSet32 to track pointer assignments.) 176 */ 177 #define MAX_POINTER_ID 31 178 179 /* 180 * Declare a concrete type for the NDK's input event forward declaration. 181 */ 182 struct AInputEvent { ~AInputEventAInputEvent183 virtual ~AInputEvent() { } 184 }; 185 186 /* 187 * Declare a concrete type for the NDK's input device forward declaration. 188 */ 189 struct AInputDevice { ~AInputDeviceAInputDevice190 virtual ~AInputDevice() { } 191 }; 192 193 194 namespace android { 195 196 #ifdef __linux__ 197 class Parcel; 198 #endif 199 200 /* 201 * Apply the given transform to the point without applying any translation/offset. 202 */ 203 vec2 transformWithoutTranslation(const ui::Transform& transform, const vec2& xy); 204 205 /* 206 * Transform an angle on the x-y plane. An angle of 0 radians corresponds to "north" or 207 * pointing upwards in the negative Y direction, a positive angle points towards the right, and a 208 * negative angle points towards the left. 209 */ 210 float transformAngle(const ui::Transform& transform, float angleRadians); 211 212 /** 213 * The type of the InputEvent. 214 * This should have 1:1 correspondence with the values of anonymous enum defined in input.h. 215 */ 216 enum class InputEventType { 217 KEY = AINPUT_EVENT_TYPE_KEY, 218 MOTION = AINPUT_EVENT_TYPE_MOTION, 219 FOCUS = AINPUT_EVENT_TYPE_FOCUS, 220 CAPTURE = AINPUT_EVENT_TYPE_CAPTURE, 221 DRAG = AINPUT_EVENT_TYPE_DRAG, 222 TOUCH_MODE = AINPUT_EVENT_TYPE_TOUCH_MODE, 223 ftl_first = KEY, 224 ftl_last = TOUCH_MODE, 225 }; 226 227 std::string inputEventSourceToString(int32_t source); 228 229 bool isFromSource(uint32_t source, uint32_t test); 230 231 /** 232 * The pointer tool type. 233 */ 234 enum class ToolType { 235 UNKNOWN = AMOTION_EVENT_TOOL_TYPE_UNKNOWN, 236 FINGER = AMOTION_EVENT_TOOL_TYPE_FINGER, 237 STYLUS = AMOTION_EVENT_TOOL_TYPE_STYLUS, 238 MOUSE = AMOTION_EVENT_TOOL_TYPE_MOUSE, 239 ERASER = AMOTION_EVENT_TOOL_TYPE_ERASER, 240 PALM = AMOTION_EVENT_TOOL_TYPE_PALM, 241 ftl_first = UNKNOWN, 242 ftl_last = PALM, 243 }; 244 245 /** 246 * The state of the key. This should have 1:1 correspondence with the values of anonymous enum 247 * defined in input.h 248 */ 249 enum class KeyState { 250 UNKNOWN = AKEY_STATE_UNKNOWN, 251 UP = AKEY_STATE_UP, 252 DOWN = AKEY_STATE_DOWN, 253 VIRTUAL = AKEY_STATE_VIRTUAL, 254 ftl_first = UNKNOWN, 255 ftl_last = VIRTUAL, 256 }; 257 258 bool isStylusToolType(ToolType toolType); 259 260 /* 261 * Flags that flow alongside events in the input dispatch system to help with certain 262 * policy decisions such as waking from device sleep. 263 * 264 * These flags are also defined in frameworks/base/core/java/android/view/WindowManagerPolicy.java. 265 */ 266 enum { 267 /* These flags originate in RawEvents and are generally set in the key map. 268 * NOTE: If you want a flag to be able to set in a keylayout file, then you must add it to 269 * InputEventLabels.h as well. */ 270 271 // Indicates that the event should wake the device. 272 POLICY_FLAG_WAKE = 0x00000001, 273 274 // Indicates that the key is virtual, such as a capacitive button, and should 275 // generate haptic feedback. Virtual keys may be suppressed for some time 276 // after a recent touch to prevent accidental activation of virtual keys adjacent 277 // to the touch screen during an edge swipe. 278 POLICY_FLAG_VIRTUAL = 0x00000002, 279 280 // Indicates that the key is the special function modifier. 281 POLICY_FLAG_FUNCTION = 0x00000004, 282 283 // Indicates that the key represents a special gesture that has been detected by 284 // the touch firmware or driver. Causes touch events from the same device to be canceled. 285 POLICY_FLAG_GESTURE = 0x00000008, 286 287 POLICY_FLAG_RAW_MASK = 0x0000ffff, 288 289 #ifdef __linux__ 290 POLICY_FLAG_INJECTED_FROM_ACCESSIBILITY = 291 android::os::IInputConstants::POLICY_FLAG_INJECTED_FROM_ACCESSIBILITY, 292 #else 293 POLICY_FLAG_INJECTED_FROM_ACCESSIBILITY = 0x20000, 294 #endif 295 296 /* These flags are set by the input dispatcher. */ 297 298 // Indicates that the input event was injected. 299 POLICY_FLAG_INJECTED = 0x01000000, 300 301 // Indicates that the input event is from a trusted source such as a directly attached 302 // input device or an application with system-wide event injection permission. 303 POLICY_FLAG_TRUSTED = 0x02000000, 304 305 // Indicates that the input event has passed through an input filter. 306 POLICY_FLAG_FILTERED = 0x04000000, 307 308 // Disables automatic key repeating behavior. 309 POLICY_FLAG_DISABLE_KEY_REPEAT = 0x08000000, 310 311 /* These flags are set by the input reader policy as it intercepts each event. */ 312 313 // Indicates that the device was in an interactive state when the 314 // event was intercepted. 315 POLICY_FLAG_INTERACTIVE = 0x20000000, 316 317 // Indicates that the event should be dispatched to applications. 318 // The input event should still be sent to the InputDispatcher so that it can see all 319 // input events received include those that it will not deliver. 320 POLICY_FLAG_PASS_TO_USER = 0x40000000, 321 }; 322 323 /** 324 * Classifications of the current gesture, if available. 325 */ 326 enum class MotionClassification : uint8_t { 327 /** 328 * No classification is available. 329 */ 330 NONE = AMOTION_EVENT_CLASSIFICATION_NONE, 331 /** 332 * Too early to classify the current gesture. Need more events. Look for changes in the 333 * upcoming motion events. 334 */ 335 AMBIGUOUS_GESTURE = AMOTION_EVENT_CLASSIFICATION_AMBIGUOUS_GESTURE, 336 /** 337 * The current gesture likely represents a user intentionally exerting force on the touchscreen. 338 */ 339 DEEP_PRESS = AMOTION_EVENT_CLASSIFICATION_DEEP_PRESS, 340 /** 341 * The current gesture represents the user swiping with two fingers on a touchpad. 342 */ 343 TWO_FINGER_SWIPE = AMOTION_EVENT_CLASSIFICATION_TWO_FINGER_SWIPE, 344 /** 345 * The current gesture represents the user swiping with three or more fingers on a touchpad. 346 * Unlike two-finger swipes, these are only to be handled by the system UI, which is why they 347 * have a separate constant from two-finger swipes. 348 */ 349 MULTI_FINGER_SWIPE = AMOTION_EVENT_CLASSIFICATION_MULTI_FINGER_SWIPE, 350 /** 351 * The current gesture represents the user pinching with two fingers on a touchpad. The gesture 352 * is centered around the current cursor position. 353 */ 354 PINCH = AMOTION_EVENT_CLASSIFICATION_PINCH, 355 }; 356 357 /** 358 * String representation of MotionClassification 359 */ 360 const char* motionClassificationToString(MotionClassification classification); 361 362 /** 363 * Portion of FrameMetrics timeline of interest to input code. 364 */ 365 enum GraphicsTimeline : size_t { 366 /** Time when the app sent the buffer to SurfaceFlinger. */ 367 GPU_COMPLETED_TIME = 0, 368 369 /** Time when the frame was presented on the display */ 370 PRESENT_TIME = 1, 371 372 /** Total size of the 'GraphicsTimeline' array. Must always be last. */ 373 SIZE = 2 374 }; 375 376 /** 377 * Generator of unique numbers used to identify input events. 378 * 379 * Layout of ID: 380 * |--------------------------|---------------------------| 381 * | 2 bits for source | 30 bits for random number | 382 * |--------------------------|---------------------------| 383 */ 384 class IdGenerator { 385 private: 386 static constexpr uint32_t SOURCE_SHIFT = 30; 387 388 public: 389 // Used to divide integer space to ensure no conflict among these sources./ 390 enum class Source : int32_t { 391 INPUT_READER = static_cast<int32_t>(0x0u << SOURCE_SHIFT), 392 INPUT_DISPATCHER = static_cast<int32_t>(0x1u << SOURCE_SHIFT), 393 OTHER = static_cast<int32_t>(0x3u << SOURCE_SHIFT), // E.g. app injected events 394 }; 395 IdGenerator(Source source); 396 397 int32_t nextId() const; 398 399 // Extract source from given id. getSource(int32_t id)400 static inline Source getSource(int32_t id) { return static_cast<Source>(SOURCE_MASK & id); } 401 402 private: 403 const Source mSource; 404 405 static constexpr int32_t SOURCE_MASK = static_cast<int32_t>(0x3u << SOURCE_SHIFT); 406 }; 407 408 /** 409 * Invalid value for cursor position. Used for non-mouse events, tests and injected events. Don't 410 * use it for direct comparison with any other value, because NaN isn't equal to itself according to 411 * IEEE 754. Use isnan() instead to check if a cursor position is valid. 412 */ 413 constexpr float AMOTION_EVENT_INVALID_CURSOR_POSITION = std::numeric_limits<float>::quiet_NaN(); 414 415 /* 416 * Pointer coordinate data. 417 */ 418 struct PointerCoords { 419 enum { MAX_AXES = 30 }; // 30 so that sizeof(PointerCoords) == 136 420 421 // Bitfield of axes that are present in this structure. 422 uint64_t bits __attribute__((aligned(8))); 423 424 // Values of axes that are stored in this structure packed in order by axis id 425 // for each axis that is present in the structure according to 'bits'. 426 std::array<float, MAX_AXES> values; 427 428 // Whether these coordinate data were generated by resampling. 429 bool isResampled; 430 431 static_assert(sizeof(bool) == 1); // Ensure padding is correctly sized. 432 uint8_t empty[7]; 433 clearPointerCoords434 inline void clear() { 435 BitSet64::clear(bits); 436 isResampled = false; 437 } 438 isEmptyPointerCoords439 bool isEmpty() const { 440 return BitSet64::isEmpty(bits); 441 } 442 443 float getAxisValue(int32_t axis) const; 444 status_t setAxisValue(int32_t axis, float value); 445 446 // Scale the pointer coordinates according to a global scale and a 447 // window scale. The global scale will be applied to TOUCH/TOOL_MAJOR/MINOR 448 // axes, however the window scaling will not. 449 void scale(float globalScale, float windowXScale, float windowYScale); 450 451 void transform(const ui::Transform& transform); 452 getXPointerCoords453 inline float getX() const { 454 return getAxisValue(AMOTION_EVENT_AXIS_X); 455 } 456 getYPointerCoords457 inline float getY() const { 458 return getAxisValue(AMOTION_EVENT_AXIS_Y); 459 } 460 getXYValuePointerCoords461 vec2 getXYValue() const { return vec2(getX(), getY()); } 462 463 #ifdef __linux__ 464 status_t readFromParcel(Parcel* parcel); 465 status_t writeToParcel(Parcel* parcel) const; 466 #endif 467 468 bool operator==(const PointerCoords& other) const; 469 inline bool operator!=(const PointerCoords& other) const { 470 return !(*this == other); 471 } 472 copyFromPointerCoords473 inline void copyFrom(const PointerCoords& other) { *this = other; } 474 PointerCoords& operator=(const PointerCoords&) = default; 475 476 private: 477 void tooManyAxes(int axis); 478 }; 479 480 /* 481 * Pointer property data. 482 */ 483 struct PointerProperties { 484 // The id of the pointer. 485 int32_t id; 486 487 // The pointer tool type. 488 ToolType toolType; 489 clearPointerProperties490 inline void clear() { 491 id = -1; 492 toolType = ToolType::UNKNOWN; 493 } 494 495 bool operator==(const PointerProperties& other) const; 496 inline bool operator!=(const PointerProperties& other) const { 497 return !(*this == other); 498 } 499 500 void copyFrom(const PointerProperties& other); 501 }; 502 503 /* 504 * Input events. 505 */ 506 class InputEvent : public AInputEvent { 507 public: ~InputEvent()508 virtual ~InputEvent() { } 509 510 virtual InputEventType getType() const = 0; 511 getId()512 inline int32_t getId() const { return mId; } 513 getDeviceId()514 inline int32_t getDeviceId() const { return mDeviceId; } 515 getSource()516 inline uint32_t getSource() const { return mSource; } 517 setSource(uint32_t source)518 inline void setSource(uint32_t source) { mSource = source; } 519 getDisplayId()520 inline int32_t getDisplayId() const { return mDisplayId; } 521 setDisplayId(int32_t displayId)522 inline void setDisplayId(int32_t displayId) { mDisplayId = displayId; } 523 getHmac()524 inline std::array<uint8_t, 32> getHmac() const { return mHmac; } 525 526 static int32_t nextId(); 527 528 protected: 529 void initialize(int32_t id, int32_t deviceId, uint32_t source, int32_t displayId, 530 std::array<uint8_t, 32> hmac); 531 532 void initialize(const InputEvent& from); 533 534 int32_t mId; 535 int32_t mDeviceId; 536 uint32_t mSource; 537 int32_t mDisplayId; 538 std::array<uint8_t, 32> mHmac; 539 }; 540 541 std::ostream& operator<<(std::ostream& out, const InputEvent& event); 542 543 /* 544 * Key events. 545 */ 546 class KeyEvent : public InputEvent { 547 public: ~KeyEvent()548 virtual ~KeyEvent() { } 549 getType()550 virtual InputEventType getType() const { return InputEventType::KEY; } 551 getAction()552 inline int32_t getAction() const { return mAction; } 553 getFlags()554 inline int32_t getFlags() const { return mFlags; } 555 setFlags(int32_t flags)556 inline void setFlags(int32_t flags) { mFlags = flags; } 557 getKeyCode()558 inline int32_t getKeyCode() const { return mKeyCode; } 559 getScanCode()560 inline int32_t getScanCode() const { return mScanCode; } 561 getMetaState()562 inline int32_t getMetaState() const { return mMetaState; } 563 getRepeatCount()564 inline int32_t getRepeatCount() const { return mRepeatCount; } 565 getDownTime()566 inline nsecs_t getDownTime() const { return mDownTime; } 567 getEventTime()568 inline nsecs_t getEventTime() const { return mEventTime; } 569 570 static const char* getLabel(int32_t keyCode); 571 static std::optional<int> getKeyCodeFromLabel(const char* label); 572 573 void initialize(int32_t id, int32_t deviceId, uint32_t source, int32_t displayId, 574 std::array<uint8_t, 32> hmac, int32_t action, int32_t flags, int32_t keyCode, 575 int32_t scanCode, int32_t metaState, int32_t repeatCount, nsecs_t downTime, 576 nsecs_t eventTime); 577 void initialize(const KeyEvent& from); 578 579 static const char* actionToString(int32_t action); 580 581 protected: 582 int32_t mAction; 583 int32_t mFlags; 584 int32_t mKeyCode; 585 int32_t mScanCode; 586 int32_t mMetaState; 587 int32_t mRepeatCount; 588 nsecs_t mDownTime; 589 nsecs_t mEventTime; 590 }; 591 592 std::ostream& operator<<(std::ostream& out, const KeyEvent& event); 593 594 /* 595 * Motion events. 596 */ 597 class MotionEvent : public InputEvent { 598 public: ~MotionEvent()599 virtual ~MotionEvent() { } 600 getType()601 virtual InputEventType getType() const { return InputEventType::MOTION; } 602 getAction()603 inline int32_t getAction() const { return mAction; } 604 getActionMasked(int32_t action)605 static int32_t getActionMasked(int32_t action) { return action & AMOTION_EVENT_ACTION_MASK; } 606 getActionMasked()607 inline int32_t getActionMasked() const { return getActionMasked(mAction); } 608 getActionIndex(int32_t action)609 static uint8_t getActionIndex(int32_t action) { 610 return (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >> 611 AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT; 612 } 613 getActionIndex()614 inline int32_t getActionIndex() const { return getActionIndex(mAction); } 615 setAction(int32_t action)616 inline void setAction(int32_t action) { mAction = action; } 617 getFlags()618 inline int32_t getFlags() const { return mFlags; } 619 setFlags(int32_t flags)620 inline void setFlags(int32_t flags) { mFlags = flags; } 621 getEdgeFlags()622 inline int32_t getEdgeFlags() const { return mEdgeFlags; } 623 setEdgeFlags(int32_t edgeFlags)624 inline void setEdgeFlags(int32_t edgeFlags) { mEdgeFlags = edgeFlags; } 625 getMetaState()626 inline int32_t getMetaState() const { return mMetaState; } 627 setMetaState(int32_t metaState)628 inline void setMetaState(int32_t metaState) { mMetaState = metaState; } 629 getButtonState()630 inline int32_t getButtonState() const { return mButtonState; } 631 setButtonState(int32_t buttonState)632 inline void setButtonState(int32_t buttonState) { mButtonState = buttonState; } 633 getClassification()634 inline MotionClassification getClassification() const { return mClassification; } 635 getActionButton()636 inline int32_t getActionButton() const { return mActionButton; } 637 setActionButton(int32_t button)638 inline void setActionButton(int32_t button) { mActionButton = button; } 639 getXOffset()640 inline float getXOffset() const { return mTransform.tx(); } 641 getYOffset()642 inline float getYOffset() const { return mTransform.ty(); } 643 getTransform()644 inline const ui::Transform& getTransform() const { return mTransform; } 645 646 std::optional<ui::Rotation> getSurfaceRotation() const; 647 getXPrecision()648 inline float getXPrecision() const { return mXPrecision; } 649 getYPrecision()650 inline float getYPrecision() const { return mYPrecision; } 651 getRawXCursorPosition()652 inline float getRawXCursorPosition() const { return mRawXCursorPosition; } 653 654 float getXCursorPosition() const; 655 getRawYCursorPosition()656 inline float getRawYCursorPosition() const { return mRawYCursorPosition; } 657 658 float getYCursorPosition() const; 659 660 void setCursorPosition(float x, float y); 661 getRawTransform()662 inline const ui::Transform& getRawTransform() const { return mRawTransform; } 663 isValidCursorPosition(float x,float y)664 static inline bool isValidCursorPosition(float x, float y) { return !isnan(x) && !isnan(y); } 665 getDownTime()666 inline nsecs_t getDownTime() const { return mDownTime; } 667 setDownTime(nsecs_t downTime)668 inline void setDownTime(nsecs_t downTime) { mDownTime = downTime; } 669 getPointerCount()670 inline size_t getPointerCount() const { return mPointerProperties.size(); } 671 getPointerProperties(size_t pointerIndex)672 inline const PointerProperties* getPointerProperties(size_t pointerIndex) const { 673 return &mPointerProperties[pointerIndex]; 674 } 675 getPointerId(size_t pointerIndex)676 inline int32_t getPointerId(size_t pointerIndex) const { 677 return mPointerProperties[pointerIndex].id; 678 } 679 getToolType(size_t pointerIndex)680 inline ToolType getToolType(size_t pointerIndex) const { 681 return mPointerProperties[pointerIndex].toolType; 682 } 683 getEventTime()684 inline nsecs_t getEventTime() const { return mSampleEventTimes[getHistorySize()]; } 685 686 /** 687 * The actual raw pointer coords: whatever comes from the input device without any external 688 * transforms applied. 689 */ 690 const PointerCoords* getRawPointerCoords(size_t pointerIndex) const; 691 692 /** 693 * This is the raw axis value. However, for X/Y axes, this currently applies a "compat-raw" 694 * transform because many apps (incorrectly) assumed that raw == oriented-screen-space. 695 * "compat raw" is raw coordinates with screen rotation applied. 696 */ 697 float getRawAxisValue(int32_t axis, size_t pointerIndex) const; 698 getRawX(size_t pointerIndex)699 inline float getRawX(size_t pointerIndex) const { 700 return getRawAxisValue(AMOTION_EVENT_AXIS_X, pointerIndex); 701 } 702 getRawY(size_t pointerIndex)703 inline float getRawY(size_t pointerIndex) const { 704 return getRawAxisValue(AMOTION_EVENT_AXIS_Y, pointerIndex); 705 } 706 707 float getAxisValue(int32_t axis, size_t pointerIndex) const; 708 709 /** 710 * Get the X coordinate of the latest sample in this MotionEvent for pointer 'pointerIndex'. 711 * Identical to calling getHistoricalX(pointerIndex, getHistorySize()). 712 */ getX(size_t pointerIndex)713 inline float getX(size_t pointerIndex) const { 714 return getAxisValue(AMOTION_EVENT_AXIS_X, pointerIndex); 715 } 716 717 /** 718 * Get the Y coordinate of the latest sample in this MotionEvent for pointer 'pointerIndex'. 719 * Identical to calling getHistoricalX(pointerIndex, getHistorySize()). 720 */ getY(size_t pointerIndex)721 inline float getY(size_t pointerIndex) const { 722 return getAxisValue(AMOTION_EVENT_AXIS_Y, pointerIndex); 723 } 724 getPressure(size_t pointerIndex)725 inline float getPressure(size_t pointerIndex) const { 726 return getAxisValue(AMOTION_EVENT_AXIS_PRESSURE, pointerIndex); 727 } 728 getSize(size_t pointerIndex)729 inline float getSize(size_t pointerIndex) const { 730 return getAxisValue(AMOTION_EVENT_AXIS_SIZE, pointerIndex); 731 } 732 getTouchMajor(size_t pointerIndex)733 inline float getTouchMajor(size_t pointerIndex) const { 734 return getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, pointerIndex); 735 } 736 getTouchMinor(size_t pointerIndex)737 inline float getTouchMinor(size_t pointerIndex) const { 738 return getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, pointerIndex); 739 } 740 getToolMajor(size_t pointerIndex)741 inline float getToolMajor(size_t pointerIndex) const { 742 return getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, pointerIndex); 743 } 744 getToolMinor(size_t pointerIndex)745 inline float getToolMinor(size_t pointerIndex) const { 746 return getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR, pointerIndex); 747 } 748 getOrientation(size_t pointerIndex)749 inline float getOrientation(size_t pointerIndex) const { 750 return getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, pointerIndex); 751 } 752 getHistorySize()753 inline size_t getHistorySize() const { return mSampleEventTimes.size() - 1; } 754 getHistoricalEventTime(size_t historicalIndex)755 inline nsecs_t getHistoricalEventTime(size_t historicalIndex) const { 756 return mSampleEventTimes[historicalIndex]; 757 } 758 759 /** 760 * The actual raw pointer coords: whatever comes from the input device without any external 761 * transforms applied. 762 */ 763 const PointerCoords* getHistoricalRawPointerCoords( 764 size_t pointerIndex, size_t historicalIndex) const; 765 766 /** 767 * This is the raw axis value. However, for X/Y axes, this currently applies a "compat-raw" 768 * transform because many apps (incorrectly) assumed that raw == oriented-screen-space. 769 * "compat raw" is raw coordinates with screen rotation applied. 770 */ 771 float getHistoricalRawAxisValue(int32_t axis, size_t pointerIndex, 772 size_t historicalIndex) const; 773 getHistoricalRawX(size_t pointerIndex,size_t historicalIndex)774 inline float getHistoricalRawX(size_t pointerIndex, size_t historicalIndex) const { 775 return getHistoricalRawAxisValue( 776 AMOTION_EVENT_AXIS_X, pointerIndex, historicalIndex); 777 } 778 getHistoricalRawY(size_t pointerIndex,size_t historicalIndex)779 inline float getHistoricalRawY(size_t pointerIndex, size_t historicalIndex) const { 780 return getHistoricalRawAxisValue( 781 AMOTION_EVENT_AXIS_Y, pointerIndex, historicalIndex); 782 } 783 784 float getHistoricalAxisValue(int32_t axis, size_t pointerIndex, size_t historicalIndex) const; 785 getHistoricalX(size_t pointerIndex,size_t historicalIndex)786 inline float getHistoricalX(size_t pointerIndex, size_t historicalIndex) const { 787 return getHistoricalAxisValue( 788 AMOTION_EVENT_AXIS_X, pointerIndex, historicalIndex); 789 } 790 getHistoricalY(size_t pointerIndex,size_t historicalIndex)791 inline float getHistoricalY(size_t pointerIndex, size_t historicalIndex) const { 792 return getHistoricalAxisValue( 793 AMOTION_EVENT_AXIS_Y, pointerIndex, historicalIndex); 794 } 795 getHistoricalPressure(size_t pointerIndex,size_t historicalIndex)796 inline float getHistoricalPressure(size_t pointerIndex, size_t historicalIndex) const { 797 return getHistoricalAxisValue( 798 AMOTION_EVENT_AXIS_PRESSURE, pointerIndex, historicalIndex); 799 } 800 getHistoricalSize(size_t pointerIndex,size_t historicalIndex)801 inline float getHistoricalSize(size_t pointerIndex, size_t historicalIndex) const { 802 return getHistoricalAxisValue( 803 AMOTION_EVENT_AXIS_SIZE, pointerIndex, historicalIndex); 804 } 805 getHistoricalTouchMajor(size_t pointerIndex,size_t historicalIndex)806 inline float getHistoricalTouchMajor(size_t pointerIndex, size_t historicalIndex) const { 807 return getHistoricalAxisValue( 808 AMOTION_EVENT_AXIS_TOUCH_MAJOR, pointerIndex, historicalIndex); 809 } 810 getHistoricalTouchMinor(size_t pointerIndex,size_t historicalIndex)811 inline float getHistoricalTouchMinor(size_t pointerIndex, size_t historicalIndex) const { 812 return getHistoricalAxisValue( 813 AMOTION_EVENT_AXIS_TOUCH_MINOR, pointerIndex, historicalIndex); 814 } 815 getHistoricalToolMajor(size_t pointerIndex,size_t historicalIndex)816 inline float getHistoricalToolMajor(size_t pointerIndex, size_t historicalIndex) const { 817 return getHistoricalAxisValue( 818 AMOTION_EVENT_AXIS_TOOL_MAJOR, pointerIndex, historicalIndex); 819 } 820 getHistoricalToolMinor(size_t pointerIndex,size_t historicalIndex)821 inline float getHistoricalToolMinor(size_t pointerIndex, size_t historicalIndex) const { 822 return getHistoricalAxisValue( 823 AMOTION_EVENT_AXIS_TOOL_MINOR, pointerIndex, historicalIndex); 824 } 825 getHistoricalOrientation(size_t pointerIndex,size_t historicalIndex)826 inline float getHistoricalOrientation(size_t pointerIndex, size_t historicalIndex) const { 827 return getHistoricalAxisValue( 828 AMOTION_EVENT_AXIS_ORIENTATION, pointerIndex, historicalIndex); 829 } 830 isResampled(size_t pointerIndex,size_t historicalIndex)831 inline bool isResampled(size_t pointerIndex, size_t historicalIndex) const { 832 return getHistoricalRawPointerCoords(pointerIndex, historicalIndex)->isResampled; 833 } 834 835 ssize_t findPointerIndex(int32_t pointerId) const; 836 837 void initialize(int32_t id, int32_t deviceId, uint32_t source, int32_t displayId, 838 std::array<uint8_t, 32> hmac, int32_t action, int32_t actionButton, 839 int32_t flags, int32_t edgeFlags, int32_t metaState, int32_t buttonState, 840 MotionClassification classification, const ui::Transform& transform, 841 float xPrecision, float yPrecision, float rawXCursorPosition, 842 float rawYCursorPosition, const ui::Transform& rawTransform, nsecs_t downTime, 843 nsecs_t eventTime, size_t pointerCount, 844 const PointerProperties* pointerProperties, const PointerCoords* pointerCoords); 845 846 void copyFrom(const MotionEvent* other, bool keepHistory); 847 848 void addSample( 849 nsecs_t eventTime, 850 const PointerCoords* pointerCoords); 851 852 void offsetLocation(float xOffset, float yOffset); 853 854 void scale(float globalScaleFactor); 855 856 // Set 3x3 perspective matrix transformation. 857 // Matrix is in row-major form and compatible with SkMatrix. 858 void transform(const std::array<float, 9>& matrix); 859 860 // Apply 3x3 perspective matrix transformation only to content (do not modify mTransform). 861 // Matrix is in row-major form and compatible with SkMatrix. 862 void applyTransform(const std::array<float, 9>& matrix); 863 864 #ifdef __linux__ 865 status_t readFromParcel(Parcel* parcel); 866 status_t writeToParcel(Parcel* parcel) const; 867 #endif 868 869 static bool isTouchEvent(uint32_t source, int32_t action); isTouchEvent()870 inline bool isTouchEvent() const { 871 return isTouchEvent(mSource, mAction); 872 } 873 874 // Low-level accessors. getPointerProperties()875 inline const PointerProperties* getPointerProperties() const { 876 return mPointerProperties.data(); 877 } getSampleEventTimes()878 inline const nsecs_t* getSampleEventTimes() const { return mSampleEventTimes.data(); } getSamplePointerCoords()879 inline const PointerCoords* getSamplePointerCoords() const { 880 return mSamplePointerCoords.data(); 881 } 882 883 static const char* getLabel(int32_t axis); 884 static std::optional<int> getAxisFromLabel(const char* label); 885 886 static std::string actionToString(int32_t action); 887 888 // MotionEvent will transform various axes in different ways, based on the source. For 889 // example, the x and y axes will not have any offsets/translations applied if it comes from a 890 // relative mouse device (since SOURCE_RELATIVE_MOUSE is a non-pointer source). These methods 891 // are used to apply these transformations for different axes. 892 static vec2 calculateTransformedXY(uint32_t source, const ui::Transform&, const vec2& xy); 893 static float calculateTransformedAxisValue(int32_t axis, uint32_t source, const ui::Transform&, 894 const PointerCoords&); 895 static PointerCoords calculateTransformedCoords(uint32_t source, const ui::Transform&, 896 const PointerCoords&); 897 // The rounding precision for transformed motion events. 898 static constexpr float ROUNDING_PRECISION = 0.001f; 899 900 protected: 901 int32_t mAction; 902 int32_t mActionButton; 903 int32_t mFlags; 904 int32_t mEdgeFlags; 905 int32_t mMetaState; 906 int32_t mButtonState; 907 MotionClassification mClassification; 908 ui::Transform mTransform; 909 float mXPrecision; 910 float mYPrecision; 911 float mRawXCursorPosition; 912 float mRawYCursorPosition; 913 ui::Transform mRawTransform; 914 nsecs_t mDownTime; 915 std::vector<PointerProperties> mPointerProperties; 916 std::vector<nsecs_t> mSampleEventTimes; 917 std::vector<PointerCoords> mSamplePointerCoords; 918 }; 919 920 std::ostream& operator<<(std::ostream& out, const MotionEvent& event); 921 922 /* 923 * Focus events. 924 */ 925 class FocusEvent : public InputEvent { 926 public: ~FocusEvent()927 virtual ~FocusEvent() {} 928 getType()929 virtual InputEventType getType() const override { return InputEventType::FOCUS; } 930 getHasFocus()931 inline bool getHasFocus() const { return mHasFocus; } 932 933 void initialize(int32_t id, bool hasFocus); 934 935 void initialize(const FocusEvent& from); 936 937 protected: 938 bool mHasFocus; 939 }; 940 941 /* 942 * Capture events. 943 */ 944 class CaptureEvent : public InputEvent { 945 public: ~CaptureEvent()946 virtual ~CaptureEvent() {} 947 getType()948 virtual InputEventType getType() const override { return InputEventType::CAPTURE; } 949 getPointerCaptureEnabled()950 inline bool getPointerCaptureEnabled() const { return mPointerCaptureEnabled; } 951 952 void initialize(int32_t id, bool pointerCaptureEnabled); 953 954 void initialize(const CaptureEvent& from); 955 956 protected: 957 bool mPointerCaptureEnabled; 958 }; 959 960 /* 961 * Drag events. 962 */ 963 class DragEvent : public InputEvent { 964 public: ~DragEvent()965 virtual ~DragEvent() {} 966 getType()967 virtual InputEventType getType() const override { return InputEventType::DRAG; } 968 isExiting()969 inline bool isExiting() const { return mIsExiting; } 970 getX()971 inline float getX() const { return mX; } 972 getY()973 inline float getY() const { return mY; } 974 975 void initialize(int32_t id, float x, float y, bool isExiting); 976 977 void initialize(const DragEvent& from); 978 979 protected: 980 bool mIsExiting; 981 float mX, mY; 982 }; 983 984 /* 985 * Touch mode events. 986 */ 987 class TouchModeEvent : public InputEvent { 988 public: ~TouchModeEvent()989 virtual ~TouchModeEvent() {} 990 getType()991 virtual InputEventType getType() const override { return InputEventType::TOUCH_MODE; } 992 isInTouchMode()993 inline bool isInTouchMode() const { return mIsInTouchMode; } 994 995 void initialize(int32_t id, bool isInTouchMode); 996 997 void initialize(const TouchModeEvent& from); 998 999 protected: 1000 bool mIsInTouchMode; 1001 }; 1002 1003 /** 1004 * Base class for verified events. 1005 * Do not create a VerifiedInputEvent explicitly. 1006 * Use helper functions to create them from InputEvents. 1007 */ 1008 struct __attribute__((__packed__)) VerifiedInputEvent { 1009 enum class Type : int32_t { 1010 KEY = AINPUT_EVENT_TYPE_KEY, 1011 MOTION = AINPUT_EVENT_TYPE_MOTION, 1012 }; 1013 1014 Type type; 1015 int32_t deviceId; 1016 nsecs_t eventTimeNanos; 1017 uint32_t source; 1018 int32_t displayId; 1019 }; 1020 1021 /** 1022 * Same as KeyEvent, but only contains the data that can be verified. 1023 * If you update this class, you must also update VerifiedKeyEvent.java 1024 */ 1025 struct __attribute__((__packed__)) VerifiedKeyEvent : public VerifiedInputEvent { 1026 int32_t action; 1027 int32_t flags; 1028 nsecs_t downTimeNanos; 1029 int32_t keyCode; 1030 int32_t scanCode; 1031 int32_t metaState; 1032 int32_t repeatCount; 1033 }; 1034 1035 /** 1036 * Same as MotionEvent, but only contains the data that can be verified. 1037 * If you update this class, you must also update VerifiedMotionEvent.java 1038 */ 1039 struct __attribute__((__packed__)) VerifiedMotionEvent : public VerifiedInputEvent { 1040 float rawX; 1041 float rawY; 1042 int32_t actionMasked; 1043 int32_t flags; 1044 nsecs_t downTimeNanos; 1045 int32_t metaState; 1046 int32_t buttonState; 1047 }; 1048 1049 VerifiedKeyEvent verifiedKeyEventFromKeyEvent(const KeyEvent& event); 1050 VerifiedMotionEvent verifiedMotionEventFromMotionEvent(const MotionEvent& event); 1051 1052 /* 1053 * Input event factory. 1054 */ 1055 class InputEventFactoryInterface { 1056 protected: ~InputEventFactoryInterface()1057 virtual ~InputEventFactoryInterface() { } 1058 1059 public: InputEventFactoryInterface()1060 InputEventFactoryInterface() { } 1061 1062 virtual KeyEvent* createKeyEvent() = 0; 1063 virtual MotionEvent* createMotionEvent() = 0; 1064 virtual FocusEvent* createFocusEvent() = 0; 1065 virtual CaptureEvent* createCaptureEvent() = 0; 1066 virtual DragEvent* createDragEvent() = 0; 1067 virtual TouchModeEvent* createTouchModeEvent() = 0; 1068 }; 1069 1070 /* 1071 * A simple input event factory implementation that uses a single preallocated instance 1072 * of each type of input event that are reused for each request. 1073 */ 1074 class PreallocatedInputEventFactory : public InputEventFactoryInterface { 1075 public: PreallocatedInputEventFactory()1076 PreallocatedInputEventFactory() { } ~PreallocatedInputEventFactory()1077 virtual ~PreallocatedInputEventFactory() { } 1078 createKeyEvent()1079 virtual KeyEvent* createKeyEvent() override { return &mKeyEvent; } createMotionEvent()1080 virtual MotionEvent* createMotionEvent() override { return &mMotionEvent; } createFocusEvent()1081 virtual FocusEvent* createFocusEvent() override { return &mFocusEvent; } createCaptureEvent()1082 virtual CaptureEvent* createCaptureEvent() override { return &mCaptureEvent; } createDragEvent()1083 virtual DragEvent* createDragEvent() override { return &mDragEvent; } createTouchModeEvent()1084 virtual TouchModeEvent* createTouchModeEvent() override { return &mTouchModeEvent; } 1085 1086 private: 1087 KeyEvent mKeyEvent; 1088 MotionEvent mMotionEvent; 1089 FocusEvent mFocusEvent; 1090 CaptureEvent mCaptureEvent; 1091 DragEvent mDragEvent; 1092 TouchModeEvent mTouchModeEvent; 1093 }; 1094 1095 /* 1096 * An input event factory implementation that maintains a pool of input events. 1097 */ 1098 class PooledInputEventFactory : public InputEventFactoryInterface { 1099 public: 1100 explicit PooledInputEventFactory(size_t maxPoolSize = 20); 1101 virtual ~PooledInputEventFactory(); 1102 1103 virtual KeyEvent* createKeyEvent() override; 1104 virtual MotionEvent* createMotionEvent() override; 1105 virtual FocusEvent* createFocusEvent() override; 1106 virtual CaptureEvent* createCaptureEvent() override; 1107 virtual DragEvent* createDragEvent() override; 1108 virtual TouchModeEvent* createTouchModeEvent() override; 1109 1110 void recycle(InputEvent* event); 1111 1112 private: 1113 const size_t mMaxPoolSize; 1114 1115 std::queue<std::unique_ptr<KeyEvent>> mKeyEventPool; 1116 std::queue<std::unique_ptr<MotionEvent>> mMotionEventPool; 1117 std::queue<std::unique_ptr<FocusEvent>> mFocusEventPool; 1118 std::queue<std::unique_ptr<CaptureEvent>> mCaptureEventPool; 1119 std::queue<std::unique_ptr<DragEvent>> mDragEventPool; 1120 std::queue<std::unique_ptr<TouchModeEvent>> mTouchModeEventPool; 1121 }; 1122 1123 /* 1124 * Describes a unique request to enable or disable Pointer Capture. 1125 */ 1126 struct PointerCaptureRequest { 1127 public: PointerCaptureRequestPointerCaptureRequest1128 inline PointerCaptureRequest() : enable(false), seq(0) {} PointerCaptureRequestPointerCaptureRequest1129 inline PointerCaptureRequest(bool enable, uint32_t seq) : enable(enable), seq(seq) {} 1130 inline bool operator==(const PointerCaptureRequest& other) const { 1131 return enable == other.enable && seq == other.seq; 1132 } 1133 explicit inline operator bool() const { return enable; } 1134 1135 // True iff this is a request to enable Pointer Capture. 1136 bool enable; 1137 1138 // The sequence number for the request. 1139 uint32_t seq; 1140 }; 1141 1142 /* Pointer icon styles. 1143 * Must match the definition in android.view.PointerIcon. 1144 * 1145 * Due to backwards compatibility and public api constraints, this is a duplicate (but type safe) 1146 * definition of PointerIcon.java. 1147 * 1148 * TODO(b/235023317) move this definition to an aidl and statically assign to the below java public 1149 * api values. 1150 * 1151 * WARNING: Keep these definitions in sync with 1152 * frameworks/base/core/java/android/view/PointerIcon.java 1153 */ 1154 enum class PointerIconStyle : int32_t { 1155 TYPE_CUSTOM = -1, 1156 TYPE_NULL = 0, 1157 TYPE_NOT_SPECIFIED = 1, 1158 TYPE_ARROW = 1000, 1159 TYPE_CONTEXT_MENU = 1001, 1160 TYPE_HAND = 1002, 1161 TYPE_HELP = 1003, 1162 TYPE_WAIT = 1004, 1163 TYPE_CELL = 1006, 1164 TYPE_CROSSHAIR = 1007, 1165 TYPE_TEXT = 1008, 1166 TYPE_VERTICAL_TEXT = 1009, 1167 TYPE_ALIAS = 1010, 1168 TYPE_COPY = 1011, 1169 TYPE_NO_DROP = 1012, 1170 TYPE_ALL_SCROLL = 1013, 1171 TYPE_HORIZONTAL_DOUBLE_ARROW = 1014, 1172 TYPE_VERTICAL_DOUBLE_ARROW = 1015, 1173 TYPE_TOP_RIGHT_DOUBLE_ARROW = 1016, 1174 TYPE_TOP_LEFT_DOUBLE_ARROW = 1017, 1175 TYPE_ZOOM_IN = 1018, 1176 TYPE_ZOOM_OUT = 1019, 1177 TYPE_GRAB = 1020, 1178 TYPE_GRABBING = 1021, 1179 TYPE_HANDWRITING = 1022, 1180 1181 TYPE_SPOT_HOVER = 2000, 1182 TYPE_SPOT_TOUCH = 2001, 1183 TYPE_SPOT_ANCHOR = 2002, 1184 }; 1185 1186 } // namespace android 1187