blob: d14812aecdc434b61666e398b519979ba4be3e33 [file] [log] [blame]
Prabir Pradhan186d5b52019-08-30 15:27:05 -07001/*
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
29namespace 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 */
36struct 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. */
94struct 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. */
116struct 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. */
163struct 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
195class TouchInputMapper : public InputMapper {
196public:
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
218protected:
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.
447 sp<PointerControllerInterface> mPointerController;
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
470private:
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