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