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