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