| Prabir Pradhan | 186d5b5 | 2019-08-30 15:27:05 -0700 | [diff] [blame] | 1 | /* | 
 | 2 |  * Copyright (C) 2019 The Android Open Source Project | 
 | 3 |  * | 
 | 4 |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
 | 5 |  * you may not use this file except in compliance with the License. | 
 | 6 |  * You may obtain a copy of the License at | 
 | 7 |  * | 
 | 8 |  *      http://www.apache.org/licenses/LICENSE-2.0 | 
 | 9 |  * | 
 | 10 |  * Unless required by applicable law or agreed to in writing, software | 
 | 11 |  * distributed under the License is distributed on an "AS IS" BASIS, | 
 | 12 |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | 13 |  * See the License for the specific language governing permissions and | 
 | 14 |  * limitations under the License. | 
 | 15 |  */ | 
 | 16 |  | 
 | 17 | #ifndef _UI_INPUTREADER_TOUCH_INPUT_MAPPER_H | 
 | 18 | #define _UI_INPUTREADER_TOUCH_INPUT_MAPPER_H | 
 | 19 |  | 
 | 20 | #include "CursorButtonAccumulator.h" | 
 | 21 | #include "CursorScrollAccumulator.h" | 
 | 22 | #include "EventHub.h" | 
 | 23 | #include "InputMapper.h" | 
 | 24 | #include "InputReaderBase.h" | 
 | 25 | #include "TouchButtonAccumulator.h" | 
 | 26 |  | 
 | 27 | #include <stdint.h> | 
 | 28 |  | 
 | 29 | namespace android { | 
 | 30 |  | 
 | 31 | /** | 
 | 32 |  * Basic statistics information. | 
 | 33 |  * Keep track of min, max, average, and standard deviation of the received samples. | 
 | 34 |  * Used to report latency information about input events. | 
 | 35 |  */ | 
 | 36 | struct LatencyStatistics { | 
 | 37 |     float min; | 
 | 38 |     float max; | 
 | 39 |     // Sum of all samples | 
 | 40 |     float sum; | 
 | 41 |     // Sum of squares of all samples | 
 | 42 |     float sum2; | 
 | 43 |     // The number of samples | 
 | 44 |     size_t count; | 
 | 45 |     // The last time statistics were reported. | 
 | 46 |     nsecs_t lastReportTime; | 
 | 47 |  | 
 | 48 |     LatencyStatistics() { reset(systemTime(SYSTEM_TIME_MONOTONIC)); } | 
 | 49 |  | 
 | 50 |     inline void addValue(float x) { | 
 | 51 |         if (x < min) { | 
 | 52 |             min = x; | 
 | 53 |         } | 
 | 54 |         if (x > max) { | 
 | 55 |             max = x; | 
 | 56 |         } | 
 | 57 |         sum += x; | 
 | 58 |         sum2 += x * x; | 
 | 59 |         count++; | 
 | 60 |     } | 
 | 61 |  | 
 | 62 |     // Get the average value. Should not be called if no samples have been added. | 
 | 63 |     inline float mean() { | 
 | 64 |         if (count == 0) { | 
 | 65 |             return 0; | 
 | 66 |         } | 
 | 67 |         return sum / count; | 
 | 68 |     } | 
 | 69 |  | 
 | 70 |     // Get the standard deviation. Should not be called if no samples have been added. | 
 | 71 |     inline float stdev() { | 
 | 72 |         if (count == 0) { | 
 | 73 |             return 0; | 
 | 74 |         } | 
 | 75 |         float average = mean(); | 
 | 76 |         return sqrt(sum2 / count - average * average); | 
 | 77 |     } | 
 | 78 |  | 
 | 79 |     /** | 
 | 80 |      * Reset internal state. The variable 'when' is the time when the data collection started. | 
 | 81 |      * Call this to start a new data collection window. | 
 | 82 |      */ | 
 | 83 |     inline void reset(nsecs_t when) { | 
 | 84 |         max = 0; | 
 | 85 |         min = std::numeric_limits<float>::max(); | 
 | 86 |         sum = 0; | 
 | 87 |         sum2 = 0; | 
 | 88 |         count = 0; | 
 | 89 |         lastReportTime = when; | 
 | 90 |     } | 
 | 91 | }; | 
 | 92 |  | 
 | 93 | /* Raw axis information from the driver. */ | 
 | 94 | struct RawPointerAxes { | 
 | 95 |     RawAbsoluteAxisInfo x; | 
 | 96 |     RawAbsoluteAxisInfo y; | 
 | 97 |     RawAbsoluteAxisInfo pressure; | 
 | 98 |     RawAbsoluteAxisInfo touchMajor; | 
 | 99 |     RawAbsoluteAxisInfo touchMinor; | 
 | 100 |     RawAbsoluteAxisInfo toolMajor; | 
 | 101 |     RawAbsoluteAxisInfo toolMinor; | 
 | 102 |     RawAbsoluteAxisInfo orientation; | 
 | 103 |     RawAbsoluteAxisInfo distance; | 
 | 104 |     RawAbsoluteAxisInfo tiltX; | 
 | 105 |     RawAbsoluteAxisInfo tiltY; | 
 | 106 |     RawAbsoluteAxisInfo trackingId; | 
 | 107 |     RawAbsoluteAxisInfo slot; | 
 | 108 |  | 
 | 109 |     RawPointerAxes(); | 
 | 110 |     inline int32_t getRawWidth() const { return x.maxValue - x.minValue + 1; } | 
 | 111 |     inline int32_t getRawHeight() const { return y.maxValue - y.minValue + 1; } | 
 | 112 |     void clear(); | 
 | 113 | }; | 
 | 114 |  | 
 | 115 | /* Raw data for a collection of pointers including a pointer id mapping table. */ | 
 | 116 | struct RawPointerData { | 
 | 117 |     struct Pointer { | 
 | 118 |         uint32_t id; | 
 | 119 |         int32_t x; | 
 | 120 |         int32_t y; | 
 | 121 |         int32_t pressure; | 
 | 122 |         int32_t touchMajor; | 
 | 123 |         int32_t touchMinor; | 
 | 124 |         int32_t toolMajor; | 
 | 125 |         int32_t toolMinor; | 
 | 126 |         int32_t orientation; | 
 | 127 |         int32_t distance; | 
 | 128 |         int32_t tiltX; | 
 | 129 |         int32_t tiltY; | 
 | 130 |         int32_t toolType; // a fully decoded AMOTION_EVENT_TOOL_TYPE constant | 
 | 131 |         bool isHovering; | 
 | 132 |     }; | 
 | 133 |  | 
 | 134 |     uint32_t pointerCount; | 
 | 135 |     Pointer pointers[MAX_POINTERS]; | 
 | 136 |     BitSet32 hoveringIdBits, touchingIdBits; | 
 | 137 |     uint32_t idToIndex[MAX_POINTER_ID + 1]; | 
 | 138 |  | 
 | 139 |     RawPointerData(); | 
 | 140 |     void clear(); | 
 | 141 |     void copyFrom(const RawPointerData& other); | 
 | 142 |     void getCentroidOfTouchingPointers(float* outX, float* outY) const; | 
 | 143 |  | 
 | 144 |     inline void markIdBit(uint32_t id, bool isHovering) { | 
 | 145 |         if (isHovering) { | 
 | 146 |             hoveringIdBits.markBit(id); | 
 | 147 |         } else { | 
 | 148 |             touchingIdBits.markBit(id); | 
 | 149 |         } | 
 | 150 |     } | 
 | 151 |  | 
 | 152 |     inline void clearIdBits() { | 
 | 153 |         hoveringIdBits.clear(); | 
 | 154 |         touchingIdBits.clear(); | 
 | 155 |     } | 
 | 156 |  | 
 | 157 |     inline const Pointer& pointerForId(uint32_t id) const { return pointers[idToIndex[id]]; } | 
 | 158 |  | 
 | 159 |     inline bool isHovering(uint32_t pointerIndex) { return pointers[pointerIndex].isHovering; } | 
 | 160 | }; | 
 | 161 |  | 
 | 162 | /* Cooked data for a collection of pointers including a pointer id mapping table. */ | 
 | 163 | struct CookedPointerData { | 
 | 164 |     uint32_t pointerCount; | 
 | 165 |     PointerProperties pointerProperties[MAX_POINTERS]; | 
 | 166 |     PointerCoords pointerCoords[MAX_POINTERS]; | 
 | 167 |     BitSet32 hoveringIdBits, touchingIdBits; | 
 | 168 |     uint32_t idToIndex[MAX_POINTER_ID + 1]; | 
 | 169 |  | 
 | 170 |     CookedPointerData(); | 
 | 171 |     void clear(); | 
 | 172 |     void copyFrom(const CookedPointerData& other); | 
 | 173 |  | 
 | 174 |     inline const PointerCoords& pointerCoordsForId(uint32_t id) const { | 
 | 175 |         return pointerCoords[idToIndex[id]]; | 
 | 176 |     } | 
 | 177 |  | 
 | 178 |     inline PointerCoords& editPointerCoordsWithId(uint32_t id) { | 
 | 179 |         return pointerCoords[idToIndex[id]]; | 
 | 180 |     } | 
 | 181 |  | 
 | 182 |     inline PointerProperties& editPointerPropertiesWithId(uint32_t id) { | 
 | 183 |         return pointerProperties[idToIndex[id]]; | 
 | 184 |     } | 
 | 185 |  | 
 | 186 |     inline bool isHovering(uint32_t pointerIndex) const { | 
 | 187 |         return hoveringIdBits.hasBit(pointerProperties[pointerIndex].id); | 
 | 188 |     } | 
 | 189 |  | 
 | 190 |     inline bool isTouching(uint32_t pointerIndex) const { | 
 | 191 |         return touchingIdBits.hasBit(pointerProperties[pointerIndex].id); | 
 | 192 |     } | 
 | 193 | }; | 
 | 194 |  | 
 | 195 | class TouchInputMapper : public InputMapper { | 
 | 196 | public: | 
 | 197 |     explicit TouchInputMapper(InputDevice* device); | 
 | 198 |     virtual ~TouchInputMapper(); | 
 | 199 |  | 
 | 200 |     virtual uint32_t getSources(); | 
 | 201 |     virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo); | 
 | 202 |     virtual void dump(std::string& dump); | 
 | 203 |     virtual void configure(nsecs_t when, const InputReaderConfiguration* config, uint32_t changes); | 
 | 204 |     virtual void reset(nsecs_t when); | 
 | 205 |     virtual void process(const RawEvent* rawEvent); | 
 | 206 |  | 
 | 207 |     virtual int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode); | 
 | 208 |     virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode); | 
 | 209 |     virtual bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes, | 
 | 210 |                                        const int32_t* keyCodes, uint8_t* outFlags); | 
 | 211 |  | 
 | 212 |     virtual void fadePointer(); | 
 | 213 |     virtual void cancelTouch(nsecs_t when); | 
 | 214 |     virtual void timeoutExpired(nsecs_t when); | 
 | 215 |     virtual void updateExternalStylusState(const StylusState& state); | 
 | 216 |     virtual std::optional<int32_t> getAssociatedDisplay(); | 
 | 217 |  | 
 | 218 | protected: | 
 | 219 |     CursorButtonAccumulator mCursorButtonAccumulator; | 
 | 220 |     CursorScrollAccumulator mCursorScrollAccumulator; | 
 | 221 |     TouchButtonAccumulator mTouchButtonAccumulator; | 
 | 222 |  | 
 | 223 |     struct VirtualKey { | 
 | 224 |         int32_t keyCode; | 
 | 225 |         int32_t scanCode; | 
 | 226 |         uint32_t flags; | 
 | 227 |  | 
 | 228 |         // computed hit box, specified in touch screen coords based on known display size | 
 | 229 |         int32_t hitLeft; | 
 | 230 |         int32_t hitTop; | 
 | 231 |         int32_t hitRight; | 
 | 232 |         int32_t hitBottom; | 
 | 233 |  | 
 | 234 |         inline bool isHit(int32_t x, int32_t y) const { | 
 | 235 |             return x >= hitLeft && x <= hitRight && y >= hitTop && y <= hitBottom; | 
 | 236 |         } | 
 | 237 |     }; | 
 | 238 |  | 
 | 239 |     // Input sources and device mode. | 
 | 240 |     uint32_t mSource; | 
 | 241 |  | 
 | 242 |     enum DeviceMode { | 
 | 243 |         DEVICE_MODE_DISABLED,   // input is disabled | 
 | 244 |         DEVICE_MODE_DIRECT,     // direct mapping (touchscreen) | 
 | 245 |         DEVICE_MODE_UNSCALED,   // unscaled mapping (touchpad) | 
 | 246 |         DEVICE_MODE_NAVIGATION, // unscaled mapping with assist gesture (touch navigation) | 
 | 247 |         DEVICE_MODE_POINTER,    // pointer mapping (pointer) | 
 | 248 |     }; | 
 | 249 |     DeviceMode mDeviceMode; | 
 | 250 |  | 
 | 251 |     // The reader's configuration. | 
 | 252 |     InputReaderConfiguration mConfig; | 
 | 253 |  | 
 | 254 |     // Immutable configuration parameters. | 
 | 255 |     struct Parameters { | 
 | 256 |         enum DeviceType { | 
 | 257 |             DEVICE_TYPE_TOUCH_SCREEN, | 
 | 258 |             DEVICE_TYPE_TOUCH_PAD, | 
 | 259 |             DEVICE_TYPE_TOUCH_NAVIGATION, | 
 | 260 |             DEVICE_TYPE_POINTER, | 
 | 261 |         }; | 
 | 262 |  | 
 | 263 |         DeviceType deviceType; | 
 | 264 |         bool hasAssociatedDisplay; | 
 | 265 |         bool associatedDisplayIsExternal; | 
 | 266 |         bool orientationAware; | 
 | 267 |         bool hasButtonUnderPad; | 
 | 268 |         std::string uniqueDisplayId; | 
 | 269 |  | 
 | 270 |         enum GestureMode { | 
 | 271 |             GESTURE_MODE_SINGLE_TOUCH, | 
 | 272 |             GESTURE_MODE_MULTI_TOUCH, | 
 | 273 |         }; | 
 | 274 |         GestureMode gestureMode; | 
 | 275 |  | 
 | 276 |         bool wake; | 
 | 277 |     } mParameters; | 
 | 278 |  | 
 | 279 |     // Immutable calibration parameters in parsed form. | 
 | 280 |     struct Calibration { | 
 | 281 |         // Size | 
 | 282 |         enum SizeCalibration { | 
 | 283 |             SIZE_CALIBRATION_DEFAULT, | 
 | 284 |             SIZE_CALIBRATION_NONE, | 
 | 285 |             SIZE_CALIBRATION_GEOMETRIC, | 
 | 286 |             SIZE_CALIBRATION_DIAMETER, | 
 | 287 |             SIZE_CALIBRATION_BOX, | 
 | 288 |             SIZE_CALIBRATION_AREA, | 
 | 289 |         }; | 
 | 290 |  | 
 | 291 |         SizeCalibration sizeCalibration; | 
 | 292 |  | 
 | 293 |         bool haveSizeScale; | 
 | 294 |         float sizeScale; | 
 | 295 |         bool haveSizeBias; | 
 | 296 |         float sizeBias; | 
 | 297 |         bool haveSizeIsSummed; | 
 | 298 |         bool sizeIsSummed; | 
 | 299 |  | 
 | 300 |         // Pressure | 
 | 301 |         enum PressureCalibration { | 
 | 302 |             PRESSURE_CALIBRATION_DEFAULT, | 
 | 303 |             PRESSURE_CALIBRATION_NONE, | 
 | 304 |             PRESSURE_CALIBRATION_PHYSICAL, | 
 | 305 |             PRESSURE_CALIBRATION_AMPLITUDE, | 
 | 306 |         }; | 
 | 307 |  | 
 | 308 |         PressureCalibration pressureCalibration; | 
 | 309 |         bool havePressureScale; | 
 | 310 |         float pressureScale; | 
 | 311 |  | 
 | 312 |         // Orientation | 
 | 313 |         enum OrientationCalibration { | 
 | 314 |             ORIENTATION_CALIBRATION_DEFAULT, | 
 | 315 |             ORIENTATION_CALIBRATION_NONE, | 
 | 316 |             ORIENTATION_CALIBRATION_INTERPOLATED, | 
 | 317 |             ORIENTATION_CALIBRATION_VECTOR, | 
 | 318 |         }; | 
 | 319 |  | 
 | 320 |         OrientationCalibration orientationCalibration; | 
 | 321 |  | 
 | 322 |         // Distance | 
 | 323 |         enum DistanceCalibration { | 
 | 324 |             DISTANCE_CALIBRATION_DEFAULT, | 
 | 325 |             DISTANCE_CALIBRATION_NONE, | 
 | 326 |             DISTANCE_CALIBRATION_SCALED, | 
 | 327 |         }; | 
 | 328 |  | 
 | 329 |         DistanceCalibration distanceCalibration; | 
 | 330 |         bool haveDistanceScale; | 
 | 331 |         float distanceScale; | 
 | 332 |  | 
 | 333 |         enum CoverageCalibration { | 
 | 334 |             COVERAGE_CALIBRATION_DEFAULT, | 
 | 335 |             COVERAGE_CALIBRATION_NONE, | 
 | 336 |             COVERAGE_CALIBRATION_BOX, | 
 | 337 |         }; | 
 | 338 |  | 
 | 339 |         CoverageCalibration coverageCalibration; | 
 | 340 |  | 
 | 341 |         inline void applySizeScaleAndBias(float* outSize) const { | 
 | 342 |             if (haveSizeScale) { | 
 | 343 |                 *outSize *= sizeScale; | 
 | 344 |             } | 
 | 345 |             if (haveSizeBias) { | 
 | 346 |                 *outSize += sizeBias; | 
 | 347 |             } | 
 | 348 |             if (*outSize < 0) { | 
 | 349 |                 *outSize = 0; | 
 | 350 |             } | 
 | 351 |         } | 
 | 352 |     } mCalibration; | 
 | 353 |  | 
 | 354 |     // Affine location transformation/calibration | 
 | 355 |     struct TouchAffineTransformation mAffineTransform; | 
 | 356 |  | 
 | 357 |     RawPointerAxes mRawPointerAxes; | 
 | 358 |  | 
 | 359 |     struct RawState { | 
 | 360 |         nsecs_t when; | 
 | 361 |         uint32_t deviceTimestamp; | 
 | 362 |  | 
 | 363 |         // Raw pointer sample data. | 
 | 364 |         RawPointerData rawPointerData; | 
 | 365 |  | 
 | 366 |         int32_t buttonState; | 
 | 367 |  | 
 | 368 |         // Scroll state. | 
 | 369 |         int32_t rawVScroll; | 
 | 370 |         int32_t rawHScroll; | 
 | 371 |  | 
 | 372 |         void copyFrom(const RawState& other) { | 
 | 373 |             when = other.when; | 
 | 374 |             deviceTimestamp = other.deviceTimestamp; | 
 | 375 |             rawPointerData.copyFrom(other.rawPointerData); | 
 | 376 |             buttonState = other.buttonState; | 
 | 377 |             rawVScroll = other.rawVScroll; | 
 | 378 |             rawHScroll = other.rawHScroll; | 
 | 379 |         } | 
 | 380 |  | 
 | 381 |         void clear() { | 
 | 382 |             when = 0; | 
 | 383 |             deviceTimestamp = 0; | 
 | 384 |             rawPointerData.clear(); | 
 | 385 |             buttonState = 0; | 
 | 386 |             rawVScroll = 0; | 
 | 387 |             rawHScroll = 0; | 
 | 388 |         } | 
 | 389 |     }; | 
 | 390 |  | 
 | 391 |     struct CookedState { | 
 | 392 |         uint32_t deviceTimestamp; | 
 | 393 |         // Cooked pointer sample data. | 
 | 394 |         CookedPointerData cookedPointerData; | 
 | 395 |  | 
 | 396 |         // Id bits used to differentiate fingers, stylus and mouse tools. | 
 | 397 |         BitSet32 fingerIdBits; | 
 | 398 |         BitSet32 stylusIdBits; | 
 | 399 |         BitSet32 mouseIdBits; | 
 | 400 |  | 
 | 401 |         int32_t buttonState; | 
 | 402 |  | 
 | 403 |         void copyFrom(const CookedState& other) { | 
 | 404 |             deviceTimestamp = other.deviceTimestamp; | 
 | 405 |             cookedPointerData.copyFrom(other.cookedPointerData); | 
 | 406 |             fingerIdBits = other.fingerIdBits; | 
 | 407 |             stylusIdBits = other.stylusIdBits; | 
 | 408 |             mouseIdBits = other.mouseIdBits; | 
 | 409 |             buttonState = other.buttonState; | 
 | 410 |         } | 
 | 411 |  | 
 | 412 |         void clear() { | 
 | 413 |             deviceTimestamp = 0; | 
 | 414 |             cookedPointerData.clear(); | 
 | 415 |             fingerIdBits.clear(); | 
 | 416 |             stylusIdBits.clear(); | 
 | 417 |             mouseIdBits.clear(); | 
 | 418 |             buttonState = 0; | 
 | 419 |         } | 
 | 420 |     }; | 
 | 421 |  | 
 | 422 |     std::vector<RawState> mRawStatesPending; | 
 | 423 |     RawState mCurrentRawState; | 
 | 424 |     CookedState mCurrentCookedState; | 
 | 425 |     RawState mLastRawState; | 
 | 426 |     CookedState mLastCookedState; | 
 | 427 |  | 
 | 428 |     // State provided by an external stylus | 
 | 429 |     StylusState mExternalStylusState; | 
 | 430 |     int64_t mExternalStylusId; | 
 | 431 |     nsecs_t mExternalStylusFusionTimeout; | 
 | 432 |     bool mExternalStylusDataPending; | 
 | 433 |  | 
 | 434 |     // True if we sent a HOVER_ENTER event. | 
 | 435 |     bool mSentHoverEnter; | 
 | 436 |  | 
 | 437 |     // Have we assigned pointer IDs for this stream | 
 | 438 |     bool mHavePointerIds; | 
 | 439 |  | 
 | 440 |     // Is the current stream of direct touch events aborted | 
 | 441 |     bool mCurrentMotionAborted; | 
 | 442 |  | 
 | 443 |     // The time the primary pointer last went down. | 
 | 444 |     nsecs_t mDownTime; | 
 | 445 |  | 
 | 446 |     // The pointer controller, or null if the device is not a pointer. | 
| Michael Wright | a512bfd | 2020-06-26 20:51:44 +0100 | [diff] [blame] | 447 |     std::shared_ptr<PointerControllerInterface> mPointerController; | 
| Prabir Pradhan | 186d5b5 | 2019-08-30 15:27:05 -0700 | [diff] [blame] | 448 |  | 
 | 449 |     std::vector<VirtualKey> mVirtualKeys; | 
 | 450 |  | 
 | 451 |     virtual void configureParameters(); | 
 | 452 |     virtual void dumpParameters(std::string& dump); | 
 | 453 |     virtual void configureRawPointerAxes(); | 
 | 454 |     virtual void dumpRawPointerAxes(std::string& dump); | 
 | 455 |     virtual void configureSurface(nsecs_t when, bool* outResetNeeded); | 
 | 456 |     virtual void dumpSurface(std::string& dump); | 
 | 457 |     virtual void configureVirtualKeys(); | 
 | 458 |     virtual void dumpVirtualKeys(std::string& dump); | 
 | 459 |     virtual void parseCalibration(); | 
 | 460 |     virtual void resolveCalibration(); | 
 | 461 |     virtual void dumpCalibration(std::string& dump); | 
 | 462 |     virtual void updateAffineTransformation(); | 
 | 463 |     virtual void dumpAffineTransformation(std::string& dump); | 
 | 464 |     virtual void resolveExternalStylusPresence(); | 
 | 465 |     virtual bool hasStylus() const = 0; | 
 | 466 |     virtual bool hasExternalStylus() const; | 
 | 467 |  | 
 | 468 |     virtual void syncTouch(nsecs_t when, RawState* outState) = 0; | 
 | 469 |  | 
 | 470 | private: | 
 | 471 |     // The current viewport. | 
 | 472 |     // The components of the viewport are specified in the display's rotated orientation. | 
 | 473 |     DisplayViewport mViewport; | 
 | 474 |  | 
 | 475 |     // The surface orientation, width and height set by configureSurface(). | 
 | 476 |     // The width and height are derived from the viewport but are specified | 
 | 477 |     // in the natural orientation. | 
 | 478 |     // The surface origin specifies how the surface coordinates should be translated | 
 | 479 |     // to align with the logical display coordinate space. | 
 | 480 |     int32_t mSurfaceWidth; | 
 | 481 |     int32_t mSurfaceHeight; | 
 | 482 |     int32_t mSurfaceLeft; | 
 | 483 |     int32_t mSurfaceTop; | 
 | 484 |  | 
 | 485 |     // Similar to the surface coordinates, but in the raw display coordinate space rather than in | 
 | 486 |     // the logical coordinate space. | 
 | 487 |     int32_t mPhysicalWidth; | 
 | 488 |     int32_t mPhysicalHeight; | 
 | 489 |     int32_t mPhysicalLeft; | 
 | 490 |     int32_t mPhysicalTop; | 
 | 491 |  | 
 | 492 |     // The orientation may be different from the viewport orientation as it specifies | 
 | 493 |     // the rotation of the surface coordinates required to produce the viewport's | 
 | 494 |     // requested orientation, so it will depend on whether the device is orientation aware. | 
 | 495 |     int32_t mSurfaceOrientation; | 
 | 496 |  | 
 | 497 |     // Translation and scaling factors, orientation-independent. | 
 | 498 |     float mXTranslate; | 
 | 499 |     float mXScale; | 
 | 500 |     float mXPrecision; | 
 | 501 |  | 
 | 502 |     float mYTranslate; | 
 | 503 |     float mYScale; | 
 | 504 |     float mYPrecision; | 
 | 505 |  | 
 | 506 |     float mGeometricScale; | 
 | 507 |  | 
 | 508 |     float mPressureScale; | 
 | 509 |  | 
 | 510 |     float mSizeScale; | 
 | 511 |  | 
 | 512 |     float mOrientationScale; | 
 | 513 |  | 
 | 514 |     float mDistanceScale; | 
 | 515 |  | 
 | 516 |     bool mHaveTilt; | 
 | 517 |     float mTiltXCenter; | 
 | 518 |     float mTiltXScale; | 
 | 519 |     float mTiltYCenter; | 
 | 520 |     float mTiltYScale; | 
 | 521 |  | 
 | 522 |     bool mExternalStylusConnected; | 
 | 523 |  | 
 | 524 |     // Oriented motion ranges for input device info. | 
 | 525 |     struct OrientedRanges { | 
 | 526 |         InputDeviceInfo::MotionRange x; | 
 | 527 |         InputDeviceInfo::MotionRange y; | 
 | 528 |         InputDeviceInfo::MotionRange pressure; | 
 | 529 |  | 
 | 530 |         bool haveSize; | 
 | 531 |         InputDeviceInfo::MotionRange size; | 
 | 532 |  | 
 | 533 |         bool haveTouchSize; | 
 | 534 |         InputDeviceInfo::MotionRange touchMajor; | 
 | 535 |         InputDeviceInfo::MotionRange touchMinor; | 
 | 536 |  | 
 | 537 |         bool haveToolSize; | 
 | 538 |         InputDeviceInfo::MotionRange toolMajor; | 
 | 539 |         InputDeviceInfo::MotionRange toolMinor; | 
 | 540 |  | 
 | 541 |         bool haveOrientation; | 
 | 542 |         InputDeviceInfo::MotionRange orientation; | 
 | 543 |  | 
 | 544 |         bool haveDistance; | 
 | 545 |         InputDeviceInfo::MotionRange distance; | 
 | 546 |  | 
 | 547 |         bool haveTilt; | 
 | 548 |         InputDeviceInfo::MotionRange tilt; | 
 | 549 |  | 
 | 550 |         OrientedRanges() { clear(); } | 
 | 551 |  | 
 | 552 |         void clear() { | 
 | 553 |             haveSize = false; | 
 | 554 |             haveTouchSize = false; | 
 | 555 |             haveToolSize = false; | 
 | 556 |             haveOrientation = false; | 
 | 557 |             haveDistance = false; | 
 | 558 |             haveTilt = false; | 
 | 559 |         } | 
 | 560 |     } mOrientedRanges; | 
 | 561 |  | 
 | 562 |     // Oriented dimensions and precision. | 
 | 563 |     float mOrientedXPrecision; | 
 | 564 |     float mOrientedYPrecision; | 
 | 565 |  | 
 | 566 |     struct CurrentVirtualKeyState { | 
 | 567 |         bool down; | 
 | 568 |         bool ignored; | 
 | 569 |         nsecs_t downTime; | 
 | 570 |         int32_t keyCode; | 
 | 571 |         int32_t scanCode; | 
 | 572 |     } mCurrentVirtualKey; | 
 | 573 |  | 
 | 574 |     // Scale factor for gesture or mouse based pointer movements. | 
 | 575 |     float mPointerXMovementScale; | 
 | 576 |     float mPointerYMovementScale; | 
 | 577 |  | 
 | 578 |     // Scale factor for gesture based zooming and other freeform motions. | 
 | 579 |     float mPointerXZoomScale; | 
 | 580 |     float mPointerYZoomScale; | 
 | 581 |  | 
 | 582 |     // The maximum swipe width. | 
 | 583 |     float mPointerGestureMaxSwipeWidth; | 
 | 584 |  | 
 | 585 |     struct PointerDistanceHeapElement { | 
 | 586 |         uint32_t currentPointerIndex : 8; | 
 | 587 |         uint32_t lastPointerIndex : 8; | 
 | 588 |         uint64_t distance : 48; // squared distance | 
 | 589 |     }; | 
 | 590 |  | 
 | 591 |     enum PointerUsage { | 
 | 592 |         POINTER_USAGE_NONE, | 
 | 593 |         POINTER_USAGE_GESTURES, | 
 | 594 |         POINTER_USAGE_STYLUS, | 
 | 595 |         POINTER_USAGE_MOUSE, | 
 | 596 |     }; | 
 | 597 |     PointerUsage mPointerUsage; | 
 | 598 |  | 
 | 599 |     struct PointerGesture { | 
 | 600 |         enum Mode { | 
 | 601 |             // No fingers, button is not pressed. | 
 | 602 |             // Nothing happening. | 
 | 603 |             NEUTRAL, | 
 | 604 |  | 
 | 605 |             // No fingers, button is not pressed. | 
 | 606 |             // Tap detected. | 
 | 607 |             // Emits DOWN and UP events at the pointer location. | 
 | 608 |             TAP, | 
 | 609 |  | 
 | 610 |             // Exactly one finger dragging following a tap. | 
 | 611 |             // Pointer follows the active finger. | 
 | 612 |             // Emits DOWN, MOVE and UP events at the pointer location. | 
 | 613 |             // | 
 | 614 |             // Detect double-taps when the finger goes up while in TAP_DRAG mode. | 
 | 615 |             TAP_DRAG, | 
 | 616 |  | 
 | 617 |             // Button is pressed. | 
 | 618 |             // Pointer follows the active finger if there is one.  Other fingers are ignored. | 
 | 619 |             // Emits DOWN, MOVE and UP events at the pointer location. | 
 | 620 |             BUTTON_CLICK_OR_DRAG, | 
 | 621 |  | 
 | 622 |             // Exactly one finger, button is not pressed. | 
 | 623 |             // Pointer follows the active finger. | 
 | 624 |             // Emits HOVER_MOVE events at the pointer location. | 
 | 625 |             // | 
 | 626 |             // Detect taps when the finger goes up while in HOVER mode. | 
 | 627 |             HOVER, | 
 | 628 |  | 
 | 629 |             // Exactly two fingers but neither have moved enough to clearly indicate | 
 | 630 |             // whether a swipe or freeform gesture was intended.  We consider the | 
 | 631 |             // pointer to be pressed so this enables clicking or long-pressing on buttons. | 
 | 632 |             // Pointer does not move. | 
 | 633 |             // Emits DOWN, MOVE and UP events with a single stationary pointer coordinate. | 
 | 634 |             PRESS, | 
 | 635 |  | 
 | 636 |             // Exactly two fingers moving in the same direction, button is not pressed. | 
 | 637 |             // Pointer does not move. | 
 | 638 |             // Emits DOWN, MOVE and UP events with a single pointer coordinate that | 
 | 639 |             // follows the midpoint between both fingers. | 
 | 640 |             SWIPE, | 
 | 641 |  | 
 | 642 |             // Two or more fingers moving in arbitrary directions, button is not pressed. | 
 | 643 |             // Pointer does not move. | 
 | 644 |             // Emits DOWN, POINTER_DOWN, MOVE, POINTER_UP and UP events that follow | 
 | 645 |             // each finger individually relative to the initial centroid of the finger. | 
 | 646 |             FREEFORM, | 
 | 647 |  | 
 | 648 |             // Waiting for quiet time to end before starting the next gesture. | 
 | 649 |             QUIET, | 
 | 650 |         }; | 
 | 651 |  | 
 | 652 |         // Time the first finger went down. | 
 | 653 |         nsecs_t firstTouchTime; | 
 | 654 |  | 
 | 655 |         // The active pointer id from the raw touch data. | 
 | 656 |         int32_t activeTouchId; // -1 if none | 
 | 657 |  | 
 | 658 |         // The active pointer id from the gesture last delivered to the application. | 
 | 659 |         int32_t activeGestureId; // -1 if none | 
 | 660 |  | 
 | 661 |         // Pointer coords and ids for the current and previous pointer gesture. | 
 | 662 |         Mode currentGestureMode; | 
 | 663 |         BitSet32 currentGestureIdBits; | 
 | 664 |         uint32_t currentGestureIdToIndex[MAX_POINTER_ID + 1]; | 
 | 665 |         PointerProperties currentGestureProperties[MAX_POINTERS]; | 
 | 666 |         PointerCoords currentGestureCoords[MAX_POINTERS]; | 
 | 667 |  | 
 | 668 |         Mode lastGestureMode; | 
 | 669 |         BitSet32 lastGestureIdBits; | 
 | 670 |         uint32_t lastGestureIdToIndex[MAX_POINTER_ID + 1]; | 
 | 671 |         PointerProperties lastGestureProperties[MAX_POINTERS]; | 
 | 672 |         PointerCoords lastGestureCoords[MAX_POINTERS]; | 
 | 673 |  | 
 | 674 |         // Time the pointer gesture last went down. | 
 | 675 |         nsecs_t downTime; | 
 | 676 |  | 
 | 677 |         // Time when the pointer went down for a TAP. | 
 | 678 |         nsecs_t tapDownTime; | 
 | 679 |  | 
 | 680 |         // Time when the pointer went up for a TAP. | 
 | 681 |         nsecs_t tapUpTime; | 
 | 682 |  | 
 | 683 |         // Location of initial tap. | 
 | 684 |         float tapX, tapY; | 
 | 685 |  | 
 | 686 |         // Time we started waiting for quiescence. | 
 | 687 |         nsecs_t quietTime; | 
 | 688 |  | 
 | 689 |         // Reference points for multitouch gestures. | 
 | 690 |         float referenceTouchX; // reference touch X/Y coordinates in surface units | 
 | 691 |         float referenceTouchY; | 
 | 692 |         float referenceGestureX; // reference gesture X/Y coordinates in pixels | 
 | 693 |         float referenceGestureY; | 
 | 694 |  | 
 | 695 |         // Distance that each pointer has traveled which has not yet been | 
 | 696 |         // subsumed into the reference gesture position. | 
 | 697 |         BitSet32 referenceIdBits; | 
 | 698 |         struct Delta { | 
 | 699 |             float dx, dy; | 
 | 700 |         }; | 
 | 701 |         Delta referenceDeltas[MAX_POINTER_ID + 1]; | 
 | 702 |  | 
 | 703 |         // Describes how touch ids are mapped to gesture ids for freeform gestures. | 
 | 704 |         uint32_t freeformTouchToGestureIdMap[MAX_POINTER_ID + 1]; | 
 | 705 |  | 
 | 706 |         // A velocity tracker for determining whether to switch active pointers during drags. | 
 | 707 |         VelocityTracker velocityTracker; | 
 | 708 |  | 
 | 709 |         void reset() { | 
 | 710 |             firstTouchTime = LLONG_MIN; | 
 | 711 |             activeTouchId = -1; | 
 | 712 |             activeGestureId = -1; | 
 | 713 |             currentGestureMode = NEUTRAL; | 
 | 714 |             currentGestureIdBits.clear(); | 
 | 715 |             lastGestureMode = NEUTRAL; | 
 | 716 |             lastGestureIdBits.clear(); | 
 | 717 |             downTime = 0; | 
 | 718 |             velocityTracker.clear(); | 
 | 719 |             resetTap(); | 
 | 720 |             resetQuietTime(); | 
 | 721 |         } | 
 | 722 |  | 
 | 723 |         void resetTap() { | 
 | 724 |             tapDownTime = LLONG_MIN; | 
 | 725 |             tapUpTime = LLONG_MIN; | 
 | 726 |         } | 
 | 727 |  | 
 | 728 |         void resetQuietTime() { quietTime = LLONG_MIN; } | 
 | 729 |     } mPointerGesture; | 
 | 730 |  | 
 | 731 |     struct PointerSimple { | 
 | 732 |         PointerCoords currentCoords; | 
 | 733 |         PointerProperties currentProperties; | 
 | 734 |         PointerCoords lastCoords; | 
 | 735 |         PointerProperties lastProperties; | 
 | 736 |  | 
 | 737 |         // True if the pointer is down. | 
 | 738 |         bool down; | 
 | 739 |  | 
 | 740 |         // True if the pointer is hovering. | 
 | 741 |         bool hovering; | 
 | 742 |  | 
 | 743 |         // Time the pointer last went down. | 
 | 744 |         nsecs_t downTime; | 
 | 745 |  | 
 | 746 |         void reset() { | 
 | 747 |             currentCoords.clear(); | 
 | 748 |             currentProperties.clear(); | 
 | 749 |             lastCoords.clear(); | 
 | 750 |             lastProperties.clear(); | 
 | 751 |             down = false; | 
 | 752 |             hovering = false; | 
 | 753 |             downTime = 0; | 
 | 754 |         } | 
 | 755 |     } mPointerSimple; | 
 | 756 |  | 
 | 757 |     // The pointer and scroll velocity controls. | 
 | 758 |     VelocityControl mPointerVelocityControl; | 
 | 759 |     VelocityControl mWheelXVelocityControl; | 
 | 760 |     VelocityControl mWheelYVelocityControl; | 
 | 761 |  | 
 | 762 |     // Latency statistics for touch events | 
 | 763 |     struct LatencyStatistics mStatistics; | 
 | 764 |  | 
 | 765 |     std::optional<DisplayViewport> findViewport(); | 
 | 766 |  | 
 | 767 |     void resetExternalStylus(); | 
 | 768 |     void clearStylusDataPendingFlags(); | 
 | 769 |  | 
 | 770 |     void sync(nsecs_t when); | 
 | 771 |  | 
 | 772 |     bool consumeRawTouches(nsecs_t when, uint32_t policyFlags); | 
 | 773 |     void processRawTouches(bool timeout); | 
 | 774 |     void cookAndDispatch(nsecs_t when); | 
 | 775 |     void dispatchVirtualKey(nsecs_t when, uint32_t policyFlags, int32_t keyEventAction, | 
 | 776 |                             int32_t keyEventFlags); | 
 | 777 |  | 
 | 778 |     void dispatchTouches(nsecs_t when, uint32_t policyFlags); | 
 | 779 |     void dispatchHoverExit(nsecs_t when, uint32_t policyFlags); | 
 | 780 |     void dispatchHoverEnterAndMove(nsecs_t when, uint32_t policyFlags); | 
 | 781 |     void dispatchButtonRelease(nsecs_t when, uint32_t policyFlags); | 
 | 782 |     void dispatchButtonPress(nsecs_t when, uint32_t policyFlags); | 
 | 783 |     const BitSet32& findActiveIdBits(const CookedPointerData& cookedPointerData); | 
 | 784 |     void cookPointerData(); | 
 | 785 |     void abortTouches(nsecs_t when, uint32_t policyFlags); | 
 | 786 |  | 
 | 787 |     void dispatchPointerUsage(nsecs_t when, uint32_t policyFlags, PointerUsage pointerUsage); | 
 | 788 |     void abortPointerUsage(nsecs_t when, uint32_t policyFlags); | 
 | 789 |  | 
 | 790 |     void dispatchPointerGestures(nsecs_t when, uint32_t policyFlags, bool isTimeout); | 
 | 791 |     void abortPointerGestures(nsecs_t when, uint32_t policyFlags); | 
 | 792 |     bool preparePointerGestures(nsecs_t when, bool* outCancelPreviousGesture, | 
 | 793 |                                 bool* outFinishPreviousGesture, bool isTimeout); | 
 | 794 |  | 
 | 795 |     void dispatchPointerStylus(nsecs_t when, uint32_t policyFlags); | 
 | 796 |     void abortPointerStylus(nsecs_t when, uint32_t policyFlags); | 
 | 797 |  | 
 | 798 |     void dispatchPointerMouse(nsecs_t when, uint32_t policyFlags); | 
 | 799 |     void abortPointerMouse(nsecs_t when, uint32_t policyFlags); | 
 | 800 |  | 
 | 801 |     void dispatchPointerSimple(nsecs_t when, uint32_t policyFlags, bool down, bool hovering); | 
 | 802 |     void abortPointerSimple(nsecs_t when, uint32_t policyFlags); | 
 | 803 |  | 
 | 804 |     bool assignExternalStylusId(const RawState& state, bool timeout); | 
 | 805 |     void applyExternalStylusButtonState(nsecs_t when); | 
 | 806 |     void applyExternalStylusTouchState(nsecs_t when); | 
 | 807 |  | 
 | 808 |     // Dispatches a motion event. | 
 | 809 |     // If the changedId is >= 0 and the action is POINTER_DOWN or POINTER_UP, the | 
 | 810 |     // method will take care of setting the index and transmuting the action to DOWN or UP | 
 | 811 |     // it is the first / last pointer to go down / up. | 
 | 812 |     void dispatchMotion(nsecs_t when, uint32_t policyFlags, uint32_t source, int32_t action, | 
 | 813 |                         int32_t actionButton, int32_t flags, int32_t metaState, int32_t buttonState, | 
 | 814 |                         int32_t edgeFlags, uint32_t deviceTimestamp, | 
 | 815 |                         const PointerProperties* properties, const PointerCoords* coords, | 
 | 816 |                         const uint32_t* idToIndex, BitSet32 idBits, int32_t changedId, | 
 | 817 |                         float xPrecision, float yPrecision, nsecs_t downTime); | 
 | 818 |  | 
 | 819 |     // Updates pointer coords and properties for pointers with specified ids that have moved. | 
 | 820 |     // Returns true if any of them changed. | 
 | 821 |     bool updateMovedPointers(const PointerProperties* inProperties, const PointerCoords* inCoords, | 
 | 822 |                              const uint32_t* inIdToIndex, PointerProperties* outProperties, | 
 | 823 |                              PointerCoords* outCoords, const uint32_t* outIdToIndex, | 
 | 824 |                              BitSet32 idBits) const; | 
 | 825 |  | 
 | 826 |     bool isPointInsideSurface(int32_t x, int32_t y); | 
 | 827 |     const VirtualKey* findVirtualKeyHit(int32_t x, int32_t y); | 
 | 828 |  | 
 | 829 |     static void assignPointerIds(const RawState* last, RawState* current); | 
 | 830 |  | 
 | 831 |     void reportEventForStatistics(nsecs_t evdevTime); | 
 | 832 |  | 
 | 833 |     const char* modeToString(DeviceMode deviceMode); | 
 | 834 | }; | 
 | 835 |  | 
 | 836 | } // namespace android | 
 | 837 |  | 
 | 838 | #endif // _UI_INPUTREADER_TOUCH_INPUT_MAPPER_H |