• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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