• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef _UI_INPUT_READER_H
18 #define _UI_INPUT_READER_H
19 
20 #include "EventHub.h"
21 #include "PointerControllerInterface.h"
22 #include "InputListener.h"
23 #include "InputReaderBase.h"
24 
25 #include <input/DisplayViewport.h>
26 #include <input/Input.h>
27 #include <input/VelocityControl.h>
28 #include <input/VelocityTracker.h>
29 #include <ui/DisplayInfo.h>
30 #include <utils/KeyedVector.h>
31 #include <utils/Condition.h>
32 #include <utils/Mutex.h>
33 #include <utils/Timers.h>
34 #include <utils/BitSet.h>
35 
36 #include <optional>
37 #include <stddef.h>
38 #include <unistd.h>
39 #include <vector>
40 
41 namespace android {
42 
43 class InputDevice;
44 class InputMapper;
45 
46 
47 struct StylusState {
48     /* Time the stylus event was received. */
49     nsecs_t when;
50     /* Pressure as reported by the stylus, normalized to the range [0, 1.0]. */
51     float pressure;
52     /* The state of the stylus buttons as a bitfield (e.g. AMOTION_EVENT_BUTTON_SECONDARY). */
53     uint32_t buttons;
54     /* Which tool type the stylus is currently using (e.g. AMOTION_EVENT_TOOL_TYPE_ERASER). */
55     int32_t toolType;
56 
copyFromStylusState57     void copyFrom(const StylusState& other) {
58         when = other.when;
59         pressure = other.pressure;
60         buttons = other.buttons;
61         toolType = other.toolType;
62     }
63 
clearStylusState64     void clear() {
65         when = LLONG_MAX;
66         pressure = 0.f;
67         buttons = 0;
68         toolType = AMOTION_EVENT_TOOL_TYPE_UNKNOWN;
69     }
70 };
71 
72 
73 /* Internal interface used by individual input devices to access global input device state
74  * and parameters maintained by the input reader.
75  */
76 class InputReaderContext {
77 public:
InputReaderContext()78     InputReaderContext() { }
~InputReaderContext()79     virtual ~InputReaderContext() { }
80 
81     virtual void updateGlobalMetaState() = 0;
82     virtual int32_t getGlobalMetaState() = 0;
83 
84     virtual void disableVirtualKeysUntil(nsecs_t time) = 0;
85     virtual bool shouldDropVirtualKey(nsecs_t now,
86             InputDevice* device, int32_t keyCode, int32_t scanCode) = 0;
87 
88     virtual void fadePointer() = 0;
89 
90     virtual void requestTimeoutAtTime(nsecs_t when) = 0;
91     virtual int32_t bumpGeneration() = 0;
92 
93     virtual void getExternalStylusDevices(std::vector<InputDeviceInfo>& outDevices) = 0;
94     virtual void dispatchExternalStylusState(const StylusState& outState) = 0;
95 
96     virtual InputReaderPolicyInterface* getPolicy() = 0;
97     virtual InputListenerInterface* getListener() = 0;
98     virtual EventHubInterface* getEventHub() = 0;
99 
100     virtual uint32_t getNextSequenceNum() = 0;
101 };
102 
103 
104 /* The input reader reads raw event data from the event hub and processes it into input events
105  * that it sends to the input listener.  Some functions of the input reader, such as early
106  * event filtering in low power states, are controlled by a separate policy object.
107  *
108  * The InputReader owns a collection of InputMappers.  Most of the work it does happens
109  * on the input reader thread but the InputReader can receive queries from other system
110  * components running on arbitrary threads.  To keep things manageable, the InputReader
111  * uses a single Mutex to guard its state.  The Mutex may be held while calling into the
112  * EventHub or the InputReaderPolicy but it is never held while calling into the
113  * InputListener.
114  */
115 class InputReader : public InputReaderInterface {
116 public:
117     InputReader(const sp<EventHubInterface>& eventHub,
118             const sp<InputReaderPolicyInterface>& policy,
119             const sp<InputListenerInterface>& listener);
120     virtual ~InputReader();
121 
122     virtual void dump(std::string& dump);
123     virtual void monitor();
124 
125     virtual void loopOnce();
126 
127     virtual void getInputDevices(std::vector<InputDeviceInfo>& outInputDevices);
128 
129     virtual bool isInputDeviceEnabled(int32_t deviceId);
130 
131     virtual int32_t getScanCodeState(int32_t deviceId, uint32_t sourceMask,
132             int32_t scanCode);
133     virtual int32_t getKeyCodeState(int32_t deviceId, uint32_t sourceMask,
134             int32_t keyCode);
135     virtual int32_t getSwitchState(int32_t deviceId, uint32_t sourceMask,
136             int32_t sw);
137 
138     virtual void toggleCapsLockState(int32_t deviceId);
139 
140     virtual bool hasKeys(int32_t deviceId, uint32_t sourceMask,
141             size_t numCodes, const int32_t* keyCodes, uint8_t* outFlags);
142 
143     virtual void requestRefreshConfiguration(uint32_t changes);
144 
145     virtual void vibrate(int32_t deviceId, const nsecs_t* pattern, size_t patternSize,
146             ssize_t repeat, int32_t token);
147     virtual void cancelVibrate(int32_t deviceId, int32_t token);
148 
149     virtual bool canDispatchToDisplay(int32_t deviceId, int32_t displayId);
150 protected:
151     // These members are protected so they can be instrumented by test cases.
152     virtual InputDevice* createDeviceLocked(int32_t deviceId, int32_t controllerNumber,
153             const InputDeviceIdentifier& identifier, uint32_t classes);
154 
155     class ContextImpl : public InputReaderContext {
156         InputReader* mReader;
157 
158     public:
159         explicit ContextImpl(InputReader* reader);
160 
161         virtual void updateGlobalMetaState();
162         virtual int32_t getGlobalMetaState();
163         virtual void disableVirtualKeysUntil(nsecs_t time);
164         virtual bool shouldDropVirtualKey(nsecs_t now,
165                 InputDevice* device, int32_t keyCode, int32_t scanCode);
166         virtual void fadePointer();
167         virtual void requestTimeoutAtTime(nsecs_t when);
168         virtual int32_t bumpGeneration();
169         virtual void getExternalStylusDevices(std::vector<InputDeviceInfo>& outDevices);
170         virtual void dispatchExternalStylusState(const StylusState& outState);
171         virtual InputReaderPolicyInterface* getPolicy();
172         virtual InputListenerInterface* getListener();
173         virtual EventHubInterface* getEventHub();
174         virtual uint32_t getNextSequenceNum();
175     } mContext;
176 
177     friend class ContextImpl;
178 
179 private:
180     Mutex mLock;
181 
182     Condition mReaderIsAliveCondition;
183 
184     sp<EventHubInterface> mEventHub;
185     sp<InputReaderPolicyInterface> mPolicy;
186     sp<QueuedInputListener> mQueuedListener;
187 
188     InputReaderConfiguration mConfig;
189 
190     // used by InputReaderContext::getNextSequenceNum() as a counter for event sequence numbers
191     uint32_t mNextSequenceNum;
192 
193     // The event queue.
194     static const int EVENT_BUFFER_SIZE = 256;
195     RawEvent mEventBuffer[EVENT_BUFFER_SIZE];
196 
197     KeyedVector<int32_t, InputDevice*> mDevices;
198 
199     // low-level input event decoding and device management
200     void processEventsLocked(const RawEvent* rawEvents, size_t count);
201 
202     void addDeviceLocked(nsecs_t when, int32_t deviceId);
203     void removeDeviceLocked(nsecs_t when, int32_t deviceId);
204     void processEventsForDeviceLocked(int32_t deviceId, const RawEvent* rawEvents, size_t count);
205     void timeoutExpiredLocked(nsecs_t when);
206 
207     void handleConfigurationChangedLocked(nsecs_t when);
208 
209     int32_t mGlobalMetaState;
210     void updateGlobalMetaStateLocked();
211     int32_t getGlobalMetaStateLocked();
212 
213     void notifyExternalStylusPresenceChanged();
214     void getExternalStylusDevicesLocked(std::vector<InputDeviceInfo>& outDevices);
215     void dispatchExternalStylusState(const StylusState& state);
216 
217     void fadePointerLocked();
218 
219     int32_t mGeneration;
220     int32_t bumpGenerationLocked();
221 
222     void getInputDevicesLocked(std::vector<InputDeviceInfo>& outInputDevices);
223 
224     nsecs_t mDisableVirtualKeysTimeout;
225     void disableVirtualKeysUntilLocked(nsecs_t time);
226     bool shouldDropVirtualKeyLocked(nsecs_t now,
227             InputDevice* device, int32_t keyCode, int32_t scanCode);
228 
229     nsecs_t mNextTimeout;
230     void requestTimeoutAtTimeLocked(nsecs_t when);
231 
232     uint32_t mConfigurationChangesToRefresh;
233     void refreshConfigurationLocked(uint32_t changes);
234 
235     // state queries
236     typedef int32_t (InputDevice::*GetStateFunc)(uint32_t sourceMask, int32_t code);
237     int32_t getStateLocked(int32_t deviceId, uint32_t sourceMask, int32_t code,
238             GetStateFunc getStateFunc);
239     bool markSupportedKeyCodesLocked(int32_t deviceId, uint32_t sourceMask, size_t numCodes,
240             const int32_t* keyCodes, uint8_t* outFlags);
241 };
242 
243 
244 /* Represents the state of a single input device. */
245 class InputDevice {
246 public:
247     InputDevice(InputReaderContext* context, int32_t id, int32_t generation, int32_t
248             controllerNumber, const InputDeviceIdentifier& identifier, uint32_t classes);
249     ~InputDevice();
250 
getContext()251     inline InputReaderContext* getContext() { return mContext; }
getId()252     inline int32_t getId() const { return mId; }
getControllerNumber()253     inline int32_t getControllerNumber() const { return mControllerNumber; }
getGeneration()254     inline int32_t getGeneration() const { return mGeneration; }
getName()255     inline const std::string getName() const { return mIdentifier.name; }
getDescriptor()256     inline const std::string getDescriptor() { return mIdentifier.descriptor; }
getClasses()257     inline uint32_t getClasses() const { return mClasses; }
getSources()258     inline uint32_t getSources() const { return mSources; }
259 
isExternal()260     inline bool isExternal() { return mIsExternal; }
setExternal(bool external)261     inline void setExternal(bool external) { mIsExternal = external; }
getAssociatedDisplayPort()262     inline std::optional<uint8_t> getAssociatedDisplayPort() const {
263         return mAssociatedDisplayPort;
264     }
265 
setMic(bool hasMic)266     inline void setMic(bool hasMic) { mHasMic = hasMic; }
hasMic()267     inline bool hasMic() const { return mHasMic; }
268 
isIgnored()269     inline bool isIgnored() { return mMappers.empty(); }
270 
271     bool isEnabled();
272     void setEnabled(bool enabled, nsecs_t when);
273 
274     void dump(std::string& dump);
275     void addMapper(InputMapper* mapper);
276     void configure(nsecs_t when, const InputReaderConfiguration* config, uint32_t changes);
277     void reset(nsecs_t when);
278     void process(const RawEvent* rawEvents, size_t count);
279     void timeoutExpired(nsecs_t when);
280     void updateExternalStylusState(const StylusState& state);
281 
282     void getDeviceInfo(InputDeviceInfo* outDeviceInfo);
283     int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode);
284     int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode);
285     int32_t getSwitchState(uint32_t sourceMask, int32_t switchCode);
286     bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes,
287             const int32_t* keyCodes, uint8_t* outFlags);
288     void vibrate(const nsecs_t* pattern, size_t patternSize, ssize_t repeat, int32_t token);
289     void cancelVibrate(int32_t token);
290     void cancelTouch(nsecs_t when);
291 
292     int32_t getMetaState();
293     void updateMetaState(int32_t keyCode);
294 
295     void fadePointer();
296 
297     void bumpGeneration();
298 
299     void notifyReset(nsecs_t when);
300 
getConfiguration()301     inline const PropertyMap& getConfiguration() { return mConfiguration; }
getEventHub()302     inline EventHubInterface* getEventHub() { return mContext->getEventHub(); }
303 
hasKey(int32_t code)304     bool hasKey(int32_t code) {
305         return getEventHub()->hasScanCode(mId, code);
306     }
307 
hasAbsoluteAxis(int32_t code)308     bool hasAbsoluteAxis(int32_t code) {
309         RawAbsoluteAxisInfo info;
310         getEventHub()->getAbsoluteAxisInfo(mId, code, &info);
311         return info.valid;
312     }
313 
isKeyPressed(int32_t code)314     bool isKeyPressed(int32_t code) {
315         return getEventHub()->getScanCodeState(mId, code) == AKEY_STATE_DOWN;
316     }
317 
getAbsoluteAxisValue(int32_t code)318     int32_t getAbsoluteAxisValue(int32_t code) {
319         int32_t value;
320         getEventHub()->getAbsoluteAxisValue(mId, code, &value);
321         return value;
322     }
323 
324     std::optional<int32_t> getAssociatedDisplay();
325 private:
326     InputReaderContext* mContext;
327     int32_t mId;
328     int32_t mGeneration;
329     int32_t mControllerNumber;
330     InputDeviceIdentifier mIdentifier;
331     std::string mAlias;
332     uint32_t mClasses;
333 
334     std::vector<InputMapper*> mMappers;
335 
336     uint32_t mSources;
337     bool mIsExternal;
338     std::optional<uint8_t> mAssociatedDisplayPort;
339     bool mHasMic;
340     bool mDropUntilNextSync;
341 
342     typedef int32_t (InputMapper::*GetStateFunc)(uint32_t sourceMask, int32_t code);
343     int32_t getState(uint32_t sourceMask, int32_t code, GetStateFunc getStateFunc);
344 
345     PropertyMap mConfiguration;
346 };
347 
348 
349 /* Keeps track of the state of mouse or touch pad buttons. */
350 class CursorButtonAccumulator {
351 public:
352     CursorButtonAccumulator();
353     void reset(InputDevice* device);
354 
355     void process(const RawEvent* rawEvent);
356 
357     uint32_t getButtonState() const;
358 
359 private:
360     bool mBtnLeft;
361     bool mBtnRight;
362     bool mBtnMiddle;
363     bool mBtnBack;
364     bool mBtnSide;
365     bool mBtnForward;
366     bool mBtnExtra;
367     bool mBtnTask;
368 
369     void clearButtons();
370 };
371 
372 
373 /* Keeps track of cursor movements. */
374 
375 class CursorMotionAccumulator {
376 public:
377     CursorMotionAccumulator();
378     void reset(InputDevice* device);
379 
380     void process(const RawEvent* rawEvent);
381     void finishSync();
382 
getRelativeX()383     inline int32_t getRelativeX() const { return mRelX; }
getRelativeY()384     inline int32_t getRelativeY() const { return mRelY; }
385 
386 private:
387     int32_t mRelX;
388     int32_t mRelY;
389 
390     void clearRelativeAxes();
391 };
392 
393 
394 /* Keeps track of cursor scrolling motions. */
395 
396 class CursorScrollAccumulator {
397 public:
398     CursorScrollAccumulator();
399     void configure(InputDevice* device);
400     void reset(InputDevice* device);
401 
402     void process(const RawEvent* rawEvent);
403     void finishSync();
404 
haveRelativeVWheel()405     inline bool haveRelativeVWheel() const { return mHaveRelWheel; }
haveRelativeHWheel()406     inline bool haveRelativeHWheel() const { return mHaveRelHWheel; }
407 
getRelativeX()408     inline int32_t getRelativeX() const { return mRelX; }
getRelativeY()409     inline int32_t getRelativeY() const { return mRelY; }
getRelativeVWheel()410     inline int32_t getRelativeVWheel() const { return mRelWheel; }
getRelativeHWheel()411     inline int32_t getRelativeHWheel() const { return mRelHWheel; }
412 
413 private:
414     bool mHaveRelWheel;
415     bool mHaveRelHWheel;
416 
417     int32_t mRelX;
418     int32_t mRelY;
419     int32_t mRelWheel;
420     int32_t mRelHWheel;
421 
422     void clearRelativeAxes();
423 };
424 
425 
426 /* Keeps track of the state of touch, stylus and tool buttons. */
427 class TouchButtonAccumulator {
428 public:
429     TouchButtonAccumulator();
430     void configure(InputDevice* device);
431     void reset(InputDevice* device);
432 
433     void process(const RawEvent* rawEvent);
434 
435     uint32_t getButtonState() const;
436     int32_t getToolType() const;
437     bool isToolActive() const;
438     bool isHovering() const;
439     bool hasStylus() const;
440 
441 private:
442     bool mHaveBtnTouch;
443     bool mHaveStylus;
444 
445     bool mBtnTouch;
446     bool mBtnStylus;
447     bool mBtnStylus2;
448     bool mBtnToolFinger;
449     bool mBtnToolPen;
450     bool mBtnToolRubber;
451     bool mBtnToolBrush;
452     bool mBtnToolPencil;
453     bool mBtnToolAirbrush;
454     bool mBtnToolMouse;
455     bool mBtnToolLens;
456     bool mBtnToolDoubleTap;
457     bool mBtnToolTripleTap;
458     bool mBtnToolQuadTap;
459 
460     void clearButtons();
461 };
462 
463 
464 /* Raw axis information from the driver. */
465 struct RawPointerAxes {
466     RawAbsoluteAxisInfo x;
467     RawAbsoluteAxisInfo y;
468     RawAbsoluteAxisInfo pressure;
469     RawAbsoluteAxisInfo touchMajor;
470     RawAbsoluteAxisInfo touchMinor;
471     RawAbsoluteAxisInfo toolMajor;
472     RawAbsoluteAxisInfo toolMinor;
473     RawAbsoluteAxisInfo orientation;
474     RawAbsoluteAxisInfo distance;
475     RawAbsoluteAxisInfo tiltX;
476     RawAbsoluteAxisInfo tiltY;
477     RawAbsoluteAxisInfo trackingId;
478     RawAbsoluteAxisInfo slot;
479 
480     RawPointerAxes();
getRawWidthRawPointerAxes481     inline int32_t getRawWidth() const { return x.maxValue - x.minValue + 1; }
getRawHeightRawPointerAxes482     inline int32_t getRawHeight() const { return y.maxValue - y.minValue + 1; }
483     void clear();
484 };
485 
486 
487 /* Raw data for a collection of pointers including a pointer id mapping table. */
488 struct RawPointerData {
489     struct Pointer {
490         uint32_t id;
491         int32_t x;
492         int32_t y;
493         int32_t pressure;
494         int32_t touchMajor;
495         int32_t touchMinor;
496         int32_t toolMajor;
497         int32_t toolMinor;
498         int32_t orientation;
499         int32_t distance;
500         int32_t tiltX;
501         int32_t tiltY;
502         int32_t toolType; // a fully decoded AMOTION_EVENT_TOOL_TYPE constant
503         bool isHovering;
504     };
505 
506     uint32_t pointerCount;
507     Pointer pointers[MAX_POINTERS];
508     BitSet32 hoveringIdBits, touchingIdBits;
509     uint32_t idToIndex[MAX_POINTER_ID + 1];
510 
511     RawPointerData();
512     void clear();
513     void copyFrom(const RawPointerData& other);
514     void getCentroidOfTouchingPointers(float* outX, float* outY) const;
515 
markIdBitRawPointerData516     inline void markIdBit(uint32_t id, bool isHovering) {
517         if (isHovering) {
518             hoveringIdBits.markBit(id);
519         } else {
520             touchingIdBits.markBit(id);
521         }
522     }
523 
clearIdBitsRawPointerData524     inline void clearIdBits() {
525         hoveringIdBits.clear();
526         touchingIdBits.clear();
527     }
528 
pointerForIdRawPointerData529     inline const Pointer& pointerForId(uint32_t id) const {
530         return pointers[idToIndex[id]];
531     }
532 
isHoveringRawPointerData533     inline bool isHovering(uint32_t pointerIndex) {
534         return pointers[pointerIndex].isHovering;
535     }
536 };
537 
538 
539 /* Cooked data for a collection of pointers including a pointer id mapping table. */
540 struct CookedPointerData {
541     uint32_t pointerCount;
542     PointerProperties pointerProperties[MAX_POINTERS];
543     PointerCoords pointerCoords[MAX_POINTERS];
544     BitSet32 hoveringIdBits, touchingIdBits;
545     uint32_t idToIndex[MAX_POINTER_ID + 1];
546 
547     CookedPointerData();
548     void clear();
549     void copyFrom(const CookedPointerData& other);
550 
pointerCoordsForIdCookedPointerData551     inline const PointerCoords& pointerCoordsForId(uint32_t id) const {
552         return pointerCoords[idToIndex[id]];
553     }
554 
editPointerCoordsWithIdCookedPointerData555     inline PointerCoords& editPointerCoordsWithId(uint32_t id) {
556         return pointerCoords[idToIndex[id]];
557     }
558 
editPointerPropertiesWithIdCookedPointerData559     inline PointerProperties& editPointerPropertiesWithId(uint32_t id) {
560         return pointerProperties[idToIndex[id]];
561     }
562 
isHoveringCookedPointerData563     inline bool isHovering(uint32_t pointerIndex) const {
564         return hoveringIdBits.hasBit(pointerProperties[pointerIndex].id);
565     }
566 
isTouchingCookedPointerData567     inline bool isTouching(uint32_t pointerIndex) const {
568         return touchingIdBits.hasBit(pointerProperties[pointerIndex].id);
569     }
570 };
571 
572 /**
573  * Basic statistics information.
574  * Keep track of min, max, average, and standard deviation of the received samples.
575  * Used to report latency information about input events.
576  */
577 struct LatencyStatistics {
578     float min;
579     float max;
580     // Sum of all samples
581     float sum;
582     // Sum of squares of all samples
583     float sum2;
584     // The number of samples
585     size_t count;
586     // The last time statistics were reported.
587     nsecs_t lastReportTime;
588 
LatencyStatisticsLatencyStatistics589     LatencyStatistics() {
590         reset(systemTime(SYSTEM_TIME_MONOTONIC));
591     }
592 
addValueLatencyStatistics593     inline void addValue(float x) {
594         if (x < min) {
595             min = x;
596         }
597         if (x > max) {
598             max = x;
599         }
600         sum += x;
601         sum2 += x * x;
602         count++;
603     }
604 
605     // Get the average value. Should not be called if no samples have been added.
meanLatencyStatistics606     inline float mean() {
607         if (count == 0) {
608             return 0;
609         }
610         return sum / count;
611     }
612 
613     // Get the standard deviation. Should not be called if no samples have been added.
stdevLatencyStatistics614     inline float stdev() {
615         if (count == 0) {
616             return 0;
617         }
618         float average = mean();
619         return sqrt(sum2 / count - average * average);
620     }
621 
622     /**
623      * Reset internal state. The variable 'when' is the time when the data collection started.
624      * Call this to start a new data collection window.
625      */
resetLatencyStatistics626     inline void reset(nsecs_t when) {
627         max = 0;
628         min = std::numeric_limits<float>::max();
629         sum = 0;
630         sum2 = 0;
631         count = 0;
632         lastReportTime = when;
633     }
634 };
635 
636 /* Keeps track of the state of single-touch protocol. */
637 class SingleTouchMotionAccumulator {
638 public:
639     SingleTouchMotionAccumulator();
640 
641     void process(const RawEvent* rawEvent);
642     void reset(InputDevice* device);
643 
getAbsoluteX()644     inline int32_t getAbsoluteX() const { return mAbsX; }
getAbsoluteY()645     inline int32_t getAbsoluteY() const { return mAbsY; }
getAbsolutePressure()646     inline int32_t getAbsolutePressure() const { return mAbsPressure; }
getAbsoluteToolWidth()647     inline int32_t getAbsoluteToolWidth() const { return mAbsToolWidth; }
getAbsoluteDistance()648     inline int32_t getAbsoluteDistance() const { return mAbsDistance; }
getAbsoluteTiltX()649     inline int32_t getAbsoluteTiltX() const { return mAbsTiltX; }
getAbsoluteTiltY()650     inline int32_t getAbsoluteTiltY() const { return mAbsTiltY; }
651 
652 private:
653     int32_t mAbsX;
654     int32_t mAbsY;
655     int32_t mAbsPressure;
656     int32_t mAbsToolWidth;
657     int32_t mAbsDistance;
658     int32_t mAbsTiltX;
659     int32_t mAbsTiltY;
660 
661     void clearAbsoluteAxes();
662 };
663 
664 
665 /* Keeps track of the state of multi-touch protocol. */
666 class MultiTouchMotionAccumulator {
667 public:
668     class Slot {
669     public:
isInUse()670         inline bool isInUse() const { return mInUse; }
getX()671         inline int32_t getX() const { return mAbsMTPositionX; }
getY()672         inline int32_t getY() const { return mAbsMTPositionY; }
getTouchMajor()673         inline int32_t getTouchMajor() const { return mAbsMTTouchMajor; }
getTouchMinor()674         inline int32_t getTouchMinor() const {
675             return mHaveAbsMTTouchMinor ? mAbsMTTouchMinor : mAbsMTTouchMajor; }
getToolMajor()676         inline int32_t getToolMajor() const { return mAbsMTWidthMajor; }
getToolMinor()677         inline int32_t getToolMinor() const {
678             return mHaveAbsMTWidthMinor ? mAbsMTWidthMinor : mAbsMTWidthMajor; }
getOrientation()679         inline int32_t getOrientation() const { return mAbsMTOrientation; }
getTrackingId()680         inline int32_t getTrackingId() const { return mAbsMTTrackingId; }
getPressure()681         inline int32_t getPressure() const { return mAbsMTPressure; }
getDistance()682         inline int32_t getDistance() const { return mAbsMTDistance; }
683         inline int32_t getToolType() const;
684 
685     private:
686         friend class MultiTouchMotionAccumulator;
687 
688         bool mInUse;
689         bool mHaveAbsMTTouchMinor;
690         bool mHaveAbsMTWidthMinor;
691         bool mHaveAbsMTToolType;
692 
693         int32_t mAbsMTPositionX;
694         int32_t mAbsMTPositionY;
695         int32_t mAbsMTTouchMajor;
696         int32_t mAbsMTTouchMinor;
697         int32_t mAbsMTWidthMajor;
698         int32_t mAbsMTWidthMinor;
699         int32_t mAbsMTOrientation;
700         int32_t mAbsMTTrackingId;
701         int32_t mAbsMTPressure;
702         int32_t mAbsMTDistance;
703         int32_t mAbsMTToolType;
704 
705         Slot();
706         void clear();
707     };
708 
709     MultiTouchMotionAccumulator();
710     ~MultiTouchMotionAccumulator();
711 
712     void configure(InputDevice* device, size_t slotCount, bool usingSlotsProtocol);
713     void reset(InputDevice* device);
714     void process(const RawEvent* rawEvent);
715     void finishSync();
716     bool hasStylus() const;
717 
getSlotCount()718     inline size_t getSlotCount() const { return mSlotCount; }
getSlot(size_t index)719     inline const Slot* getSlot(size_t index) const { return &mSlots[index]; }
getDeviceTimestamp()720     inline uint32_t getDeviceTimestamp() const { return mDeviceTimestamp; }
721 
722 private:
723     int32_t mCurrentSlot;
724     Slot* mSlots;
725     size_t mSlotCount;
726     bool mUsingSlotsProtocol;
727     bool mHaveStylus;
728     uint32_t mDeviceTimestamp;
729 
730     void clearSlots(int32_t initialSlot);
731 };
732 
733 
734 /* An input mapper transforms raw input events into cooked event data.
735  * A single input device can have multiple associated input mappers in order to interpret
736  * different classes of events.
737  *
738  * InputMapper lifecycle:
739  * - create
740  * - configure with 0 changes
741  * - reset
742  * - process, process, process (may occasionally reconfigure with non-zero changes or reset)
743  * - reset
744  * - destroy
745  */
746 class InputMapper {
747 public:
748     explicit InputMapper(InputDevice* device);
749     virtual ~InputMapper();
750 
getDevice()751     inline InputDevice* getDevice() { return mDevice; }
getDeviceId()752     inline int32_t getDeviceId() { return mDevice->getId(); }
getDeviceName()753     inline const std::string getDeviceName() { return mDevice->getName(); }
getContext()754     inline InputReaderContext* getContext() { return mContext; }
getPolicy()755     inline InputReaderPolicyInterface* getPolicy() { return mContext->getPolicy(); }
getListener()756     inline InputListenerInterface* getListener() { return mContext->getListener(); }
getEventHub()757     inline EventHubInterface* getEventHub() { return mContext->getEventHub(); }
758 
759     virtual uint32_t getSources() = 0;
760     virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
761     virtual void dump(std::string& dump);
762     virtual void configure(nsecs_t when, const InputReaderConfiguration* config, uint32_t changes);
763     virtual void reset(nsecs_t when);
764     virtual void process(const RawEvent* rawEvent) = 0;
765     virtual void timeoutExpired(nsecs_t when);
766 
767     virtual int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode);
768     virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode);
769     virtual int32_t getSwitchState(uint32_t sourceMask, int32_t switchCode);
770     virtual bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes,
771             const int32_t* keyCodes, uint8_t* outFlags);
772     virtual void vibrate(const nsecs_t* pattern, size_t patternSize, ssize_t repeat,
773             int32_t token);
774     virtual void cancelVibrate(int32_t token);
775     virtual void cancelTouch(nsecs_t when);
776 
777     virtual int32_t getMetaState();
778     virtual void updateMetaState(int32_t keyCode);
779 
780     virtual void updateExternalStylusState(const StylusState& state);
781 
782     virtual void fadePointer();
getAssociatedDisplay()783     virtual std::optional<int32_t> getAssociatedDisplay() {
784         return std::nullopt;
785     }
786 protected:
787     InputDevice* mDevice;
788     InputReaderContext* mContext;
789 
790     status_t getAbsoluteAxisInfo(int32_t axis, RawAbsoluteAxisInfo* axisInfo);
791     void bumpGeneration();
792 
793     static void dumpRawAbsoluteAxisInfo(std::string& dump,
794             const RawAbsoluteAxisInfo& axis, const char* name);
795     static void dumpStylusState(std::string& dump, const StylusState& state);
796 };
797 
798 
799 class SwitchInputMapper : public InputMapper {
800 public:
801     explicit SwitchInputMapper(InputDevice* device);
802     virtual ~SwitchInputMapper();
803 
804     virtual uint32_t getSources();
805     virtual void process(const RawEvent* rawEvent);
806 
807     virtual int32_t getSwitchState(uint32_t sourceMask, int32_t switchCode);
808     virtual void dump(std::string& dump);
809 
810 private:
811     uint32_t mSwitchValues;
812     uint32_t mUpdatedSwitchMask;
813 
814     void processSwitch(int32_t switchCode, int32_t switchValue);
815     void sync(nsecs_t when);
816 };
817 
818 
819 class VibratorInputMapper : public InputMapper {
820 public:
821     explicit VibratorInputMapper(InputDevice* device);
822     virtual ~VibratorInputMapper();
823 
824     virtual uint32_t getSources();
825     virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
826     virtual void process(const RawEvent* rawEvent);
827 
828     virtual void vibrate(const nsecs_t* pattern, size_t patternSize, ssize_t repeat,
829             int32_t token);
830     virtual void cancelVibrate(int32_t token);
831     virtual void timeoutExpired(nsecs_t when);
832     virtual void dump(std::string& dump);
833 
834 private:
835     bool mVibrating;
836     nsecs_t mPattern[MAX_VIBRATE_PATTERN_SIZE];
837     size_t mPatternSize;
838     ssize_t mRepeat;
839     int32_t mToken;
840     ssize_t mIndex;
841     nsecs_t mNextStepTime;
842 
843     void nextStep();
844     void stopVibrating();
845 };
846 
847 
848 class KeyboardInputMapper : public InputMapper {
849 public:
850     KeyboardInputMapper(InputDevice* device, uint32_t source, int32_t keyboardType);
851     virtual ~KeyboardInputMapper();
852 
853     virtual uint32_t getSources();
854     virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
855     virtual void dump(std::string& dump);
856     virtual void configure(nsecs_t when, const InputReaderConfiguration* config, uint32_t changes);
857     virtual void reset(nsecs_t when);
858     virtual void process(const RawEvent* rawEvent);
859 
860     virtual int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode);
861     virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode);
862     virtual bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes,
863             const int32_t* keyCodes, uint8_t* outFlags);
864 
865     virtual int32_t getMetaState();
866     virtual void updateMetaState(int32_t keyCode);
867 
868 private:
869     // The current viewport.
870     std::optional<DisplayViewport> mViewport;
871 
872     struct KeyDown {
873         int32_t keyCode;
874         int32_t scanCode;
875     };
876 
877     uint32_t mSource;
878     int32_t mKeyboardType;
879 
880     std::vector<KeyDown> mKeyDowns; // keys that are down
881     int32_t mMetaState;
882     nsecs_t mDownTime; // time of most recent key down
883 
884     int32_t mCurrentHidUsage; // most recent HID usage seen this packet, or 0 if none
885 
886     struct LedState {
887         bool avail; // led is available
888         bool on;    // we think the led is currently on
889     };
890     LedState mCapsLockLedState;
891     LedState mNumLockLedState;
892     LedState mScrollLockLedState;
893 
894     // Immutable configuration parameters.
895     struct Parameters {
896         bool orientationAware;
897         bool handlesKeyRepeat;
898     } mParameters;
899 
900     void configureParameters();
901     void dumpParameters(std::string& dump);
902 
903     int32_t getOrientation();
904     int32_t getDisplayId();
905 
906     bool isKeyboardOrGamepadKey(int32_t scanCode);
907     bool isMediaKey(int32_t keyCode);
908 
909     void processKey(nsecs_t when, bool down, int32_t scanCode, int32_t usageCode);
910 
911     bool updateMetaStateIfNeeded(int32_t keyCode, bool down);
912 
913     ssize_t findKeyDown(int32_t scanCode);
914 
915     void resetLedState();
916     void initializeLedState(LedState& ledState, int32_t led);
917     void updateLedState(bool reset);
918     void updateLedStateForModifier(LedState& ledState, int32_t led,
919             int32_t modifier, bool reset);
920 };
921 
922 
923 class CursorInputMapper : public InputMapper {
924 public:
925     explicit CursorInputMapper(InputDevice* device);
926     virtual ~CursorInputMapper();
927 
928     virtual uint32_t getSources();
929     virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
930     virtual void dump(std::string& dump);
931     virtual void configure(nsecs_t when, const InputReaderConfiguration* config, uint32_t changes);
932     virtual void reset(nsecs_t when);
933     virtual void process(const RawEvent* rawEvent);
934 
935     virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode);
936 
937     virtual void fadePointer();
938 
939     virtual std::optional<int32_t> getAssociatedDisplay();
940 private:
941     // Amount that trackball needs to move in order to generate a key event.
942     static const int32_t TRACKBALL_MOVEMENT_THRESHOLD = 6;
943 
944     // Immutable configuration parameters.
945     struct Parameters {
946         enum Mode {
947             MODE_POINTER,
948             MODE_POINTER_RELATIVE,
949             MODE_NAVIGATION,
950         };
951 
952         Mode mode;
953         bool hasAssociatedDisplay;
954         bool orientationAware;
955     } mParameters;
956 
957     CursorButtonAccumulator mCursorButtonAccumulator;
958     CursorMotionAccumulator mCursorMotionAccumulator;
959     CursorScrollAccumulator mCursorScrollAccumulator;
960 
961     int32_t mSource;
962     float mXScale;
963     float mYScale;
964     float mXPrecision;
965     float mYPrecision;
966 
967     float mVWheelScale;
968     float mHWheelScale;
969 
970     // Velocity controls for mouse pointer and wheel movements.
971     // The controls for X and Y wheel movements are separate to keep them decoupled.
972     VelocityControl mPointerVelocityControl;
973     VelocityControl mWheelXVelocityControl;
974     VelocityControl mWheelYVelocityControl;
975 
976     int32_t mOrientation;
977 
978     sp<PointerControllerInterface> mPointerController;
979 
980     int32_t mButtonState;
981     nsecs_t mDownTime;
982 
983     void configureParameters();
984     void dumpParameters(std::string& dump);
985 
986     void sync(nsecs_t when);
987 };
988 
989 
990 class RotaryEncoderInputMapper : public InputMapper {
991 public:
992     explicit RotaryEncoderInputMapper(InputDevice* device);
993     virtual ~RotaryEncoderInputMapper();
994 
995     virtual uint32_t getSources();
996     virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
997     virtual void dump(std::string& dump);
998     virtual void configure(nsecs_t when, const InputReaderConfiguration* config, uint32_t changes);
999     virtual void reset(nsecs_t when);
1000     virtual void process(const RawEvent* rawEvent);
1001 
1002 private:
1003     CursorScrollAccumulator mRotaryEncoderScrollAccumulator;
1004 
1005     int32_t mSource;
1006     float mScalingFactor;
1007     int32_t mOrientation;
1008 
1009     void sync(nsecs_t when);
1010 };
1011 
1012 class TouchInputMapper : public InputMapper {
1013 public:
1014     explicit TouchInputMapper(InputDevice* device);
1015     virtual ~TouchInputMapper();
1016 
1017     virtual uint32_t getSources();
1018     virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
1019     virtual void dump(std::string& dump);
1020     virtual void configure(nsecs_t when, const InputReaderConfiguration* config, uint32_t changes);
1021     virtual void reset(nsecs_t when);
1022     virtual void process(const RawEvent* rawEvent);
1023 
1024     virtual int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode);
1025     virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode);
1026     virtual bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes,
1027             const int32_t* keyCodes, uint8_t* outFlags);
1028 
1029     virtual void fadePointer();
1030     virtual void cancelTouch(nsecs_t when);
1031     virtual void timeoutExpired(nsecs_t when);
1032     virtual void updateExternalStylusState(const StylusState& state);
1033     virtual std::optional<int32_t> getAssociatedDisplay();
1034 protected:
1035     CursorButtonAccumulator mCursorButtonAccumulator;
1036     CursorScrollAccumulator mCursorScrollAccumulator;
1037     TouchButtonAccumulator mTouchButtonAccumulator;
1038 
1039     struct VirtualKey {
1040         int32_t keyCode;
1041         int32_t scanCode;
1042         uint32_t flags;
1043 
1044         // computed hit box, specified in touch screen coords based on known display size
1045         int32_t hitLeft;
1046         int32_t hitTop;
1047         int32_t hitRight;
1048         int32_t hitBottom;
1049 
isHitVirtualKey1050         inline bool isHit(int32_t x, int32_t y) const {
1051             return x >= hitLeft && x <= hitRight && y >= hitTop && y <= hitBottom;
1052         }
1053     };
1054 
1055     // Input sources and device mode.
1056     uint32_t mSource;
1057 
1058     enum DeviceMode {
1059         DEVICE_MODE_DISABLED, // input is disabled
1060         DEVICE_MODE_DIRECT, // direct mapping (touchscreen)
1061         DEVICE_MODE_UNSCALED, // unscaled mapping (touchpad)
1062         DEVICE_MODE_NAVIGATION, // unscaled mapping with assist gesture (touch navigation)
1063         DEVICE_MODE_POINTER, // pointer mapping (pointer)
1064     };
1065     DeviceMode mDeviceMode;
1066 
1067     // The reader's configuration.
1068     InputReaderConfiguration mConfig;
1069 
1070     // Immutable configuration parameters.
1071     struct Parameters {
1072         enum DeviceType {
1073             DEVICE_TYPE_TOUCH_SCREEN,
1074             DEVICE_TYPE_TOUCH_PAD,
1075             DEVICE_TYPE_TOUCH_NAVIGATION,
1076             DEVICE_TYPE_POINTER,
1077         };
1078 
1079         DeviceType deviceType;
1080         bool hasAssociatedDisplay;
1081         bool associatedDisplayIsExternal;
1082         bool orientationAware;
1083         bool hasButtonUnderPad;
1084         std::string uniqueDisplayId;
1085 
1086         enum GestureMode {
1087             GESTURE_MODE_SINGLE_TOUCH,
1088             GESTURE_MODE_MULTI_TOUCH,
1089         };
1090         GestureMode gestureMode;
1091 
1092         bool wake;
1093     } mParameters;
1094 
1095     // Immutable calibration parameters in parsed form.
1096     struct Calibration {
1097         // Size
1098         enum SizeCalibration {
1099             SIZE_CALIBRATION_DEFAULT,
1100             SIZE_CALIBRATION_NONE,
1101             SIZE_CALIBRATION_GEOMETRIC,
1102             SIZE_CALIBRATION_DIAMETER,
1103             SIZE_CALIBRATION_BOX,
1104             SIZE_CALIBRATION_AREA,
1105         };
1106 
1107         SizeCalibration sizeCalibration;
1108 
1109         bool haveSizeScale;
1110         float sizeScale;
1111         bool haveSizeBias;
1112         float sizeBias;
1113         bool haveSizeIsSummed;
1114         bool sizeIsSummed;
1115 
1116         // Pressure
1117         enum PressureCalibration {
1118             PRESSURE_CALIBRATION_DEFAULT,
1119             PRESSURE_CALIBRATION_NONE,
1120             PRESSURE_CALIBRATION_PHYSICAL,
1121             PRESSURE_CALIBRATION_AMPLITUDE,
1122         };
1123 
1124         PressureCalibration pressureCalibration;
1125         bool havePressureScale;
1126         float pressureScale;
1127 
1128         // Orientation
1129         enum OrientationCalibration {
1130             ORIENTATION_CALIBRATION_DEFAULT,
1131             ORIENTATION_CALIBRATION_NONE,
1132             ORIENTATION_CALIBRATION_INTERPOLATED,
1133             ORIENTATION_CALIBRATION_VECTOR,
1134         };
1135 
1136         OrientationCalibration orientationCalibration;
1137 
1138         // Distance
1139         enum DistanceCalibration {
1140             DISTANCE_CALIBRATION_DEFAULT,
1141             DISTANCE_CALIBRATION_NONE,
1142             DISTANCE_CALIBRATION_SCALED,
1143         };
1144 
1145         DistanceCalibration distanceCalibration;
1146         bool haveDistanceScale;
1147         float distanceScale;
1148 
1149         enum CoverageCalibration {
1150             COVERAGE_CALIBRATION_DEFAULT,
1151             COVERAGE_CALIBRATION_NONE,
1152             COVERAGE_CALIBRATION_BOX,
1153         };
1154 
1155         CoverageCalibration coverageCalibration;
1156 
applySizeScaleAndBiasCalibration1157         inline void applySizeScaleAndBias(float* outSize) const {
1158             if (haveSizeScale) {
1159                 *outSize *= sizeScale;
1160             }
1161             if (haveSizeBias) {
1162                 *outSize += sizeBias;
1163             }
1164             if (*outSize < 0) {
1165                 *outSize = 0;
1166             }
1167         }
1168     } mCalibration;
1169 
1170     // Affine location transformation/calibration
1171     struct TouchAffineTransformation mAffineTransform;
1172 
1173     RawPointerAxes mRawPointerAxes;
1174 
1175     struct RawState {
1176         nsecs_t when;
1177         uint32_t deviceTimestamp;
1178 
1179         // Raw pointer sample data.
1180         RawPointerData rawPointerData;
1181 
1182         int32_t buttonState;
1183 
1184         // Scroll state.
1185         int32_t rawVScroll;
1186         int32_t rawHScroll;
1187 
copyFromRawState1188         void copyFrom(const RawState& other) {
1189             when = other.when;
1190             deviceTimestamp = other.deviceTimestamp;
1191             rawPointerData.copyFrom(other.rawPointerData);
1192             buttonState = other.buttonState;
1193             rawVScroll = other.rawVScroll;
1194             rawHScroll = other.rawHScroll;
1195         }
1196 
clearRawState1197         void clear() {
1198             when = 0;
1199             deviceTimestamp = 0;
1200             rawPointerData.clear();
1201             buttonState = 0;
1202             rawVScroll = 0;
1203             rawHScroll = 0;
1204         }
1205     };
1206 
1207     struct CookedState {
1208         uint32_t deviceTimestamp;
1209         // Cooked pointer sample data.
1210         CookedPointerData cookedPointerData;
1211 
1212         // Id bits used to differentiate fingers, stylus and mouse tools.
1213         BitSet32 fingerIdBits;
1214         BitSet32 stylusIdBits;
1215         BitSet32 mouseIdBits;
1216 
1217         int32_t buttonState;
1218 
copyFromCookedState1219         void copyFrom(const CookedState& other) {
1220             deviceTimestamp = other.deviceTimestamp;
1221             cookedPointerData.copyFrom(other.cookedPointerData);
1222             fingerIdBits = other.fingerIdBits;
1223             stylusIdBits = other.stylusIdBits;
1224             mouseIdBits = other.mouseIdBits;
1225             buttonState = other.buttonState;
1226         }
1227 
clearCookedState1228         void clear() {
1229             deviceTimestamp = 0;
1230             cookedPointerData.clear();
1231             fingerIdBits.clear();
1232             stylusIdBits.clear();
1233             mouseIdBits.clear();
1234             buttonState = 0;
1235         }
1236     };
1237 
1238     std::vector<RawState> mRawStatesPending;
1239     RawState mCurrentRawState;
1240     CookedState mCurrentCookedState;
1241     RawState mLastRawState;
1242     CookedState mLastCookedState;
1243 
1244     // State provided by an external stylus
1245     StylusState mExternalStylusState;
1246     int64_t mExternalStylusId;
1247     nsecs_t mExternalStylusFusionTimeout;
1248     bool mExternalStylusDataPending;
1249 
1250     // True if we sent a HOVER_ENTER event.
1251     bool mSentHoverEnter;
1252 
1253     // Have we assigned pointer IDs for this stream
1254     bool mHavePointerIds;
1255 
1256     // Is the current stream of direct touch events aborted
1257     bool mCurrentMotionAborted;
1258 
1259     // The time the primary pointer last went down.
1260     nsecs_t mDownTime;
1261 
1262     // The pointer controller, or null if the device is not a pointer.
1263     sp<PointerControllerInterface> mPointerController;
1264 
1265     std::vector<VirtualKey> mVirtualKeys;
1266 
1267     virtual void configureParameters();
1268     virtual void dumpParameters(std::string& dump);
1269     virtual void configureRawPointerAxes();
1270     virtual void dumpRawPointerAxes(std::string& dump);
1271     virtual void configureSurface(nsecs_t when, bool* outResetNeeded);
1272     virtual void dumpSurface(std::string& dump);
1273     virtual void configureVirtualKeys();
1274     virtual void dumpVirtualKeys(std::string& dump);
1275     virtual void parseCalibration();
1276     virtual void resolveCalibration();
1277     virtual void dumpCalibration(std::string& dump);
1278     virtual void updateAffineTransformation();
1279     virtual void dumpAffineTransformation(std::string& dump);
1280     virtual void resolveExternalStylusPresence();
1281     virtual bool hasStylus() const = 0;
1282     virtual bool hasExternalStylus() const;
1283 
1284     virtual void syncTouch(nsecs_t when, RawState* outState) = 0;
1285 
1286 private:
1287     // The current viewport.
1288     // The components of the viewport are specified in the display's rotated orientation.
1289     DisplayViewport mViewport;
1290 
1291     // The surface orientation, width and height set by configureSurface().
1292     // The width and height are derived from the viewport but are specified
1293     // in the natural orientation.
1294     // The surface origin specifies how the surface coordinates should be translated
1295     // to align with the logical display coordinate space.
1296     int32_t mSurfaceWidth;
1297     int32_t mSurfaceHeight;
1298     int32_t mSurfaceLeft;
1299     int32_t mSurfaceTop;
1300 
1301     // Similar to the surface coordinates, but in the raw display coordinate space rather than in
1302     // the logical coordinate space.
1303     int32_t mPhysicalWidth;
1304     int32_t mPhysicalHeight;
1305     int32_t mPhysicalLeft;
1306     int32_t mPhysicalTop;
1307 
1308     // The orientation may be different from the viewport orientation as it specifies
1309     // the rotation of the surface coordinates required to produce the viewport's
1310     // requested orientation, so it will depend on whether the device is orientation aware.
1311     int32_t mSurfaceOrientation;
1312 
1313     // Translation and scaling factors, orientation-independent.
1314     float mXTranslate;
1315     float mXScale;
1316     float mXPrecision;
1317 
1318     float mYTranslate;
1319     float mYScale;
1320     float mYPrecision;
1321 
1322     float mGeometricScale;
1323 
1324     float mPressureScale;
1325 
1326     float mSizeScale;
1327 
1328     float mOrientationScale;
1329 
1330     float mDistanceScale;
1331 
1332     bool mHaveTilt;
1333     float mTiltXCenter;
1334     float mTiltXScale;
1335     float mTiltYCenter;
1336     float mTiltYScale;
1337 
1338     bool mExternalStylusConnected;
1339 
1340     // Oriented motion ranges for input device info.
1341     struct OrientedRanges {
1342         InputDeviceInfo::MotionRange x;
1343         InputDeviceInfo::MotionRange y;
1344         InputDeviceInfo::MotionRange pressure;
1345 
1346         bool haveSize;
1347         InputDeviceInfo::MotionRange size;
1348 
1349         bool haveTouchSize;
1350         InputDeviceInfo::MotionRange touchMajor;
1351         InputDeviceInfo::MotionRange touchMinor;
1352 
1353         bool haveToolSize;
1354         InputDeviceInfo::MotionRange toolMajor;
1355         InputDeviceInfo::MotionRange toolMinor;
1356 
1357         bool haveOrientation;
1358         InputDeviceInfo::MotionRange orientation;
1359 
1360         bool haveDistance;
1361         InputDeviceInfo::MotionRange distance;
1362 
1363         bool haveTilt;
1364         InputDeviceInfo::MotionRange tilt;
1365 
OrientedRangesOrientedRanges1366         OrientedRanges() {
1367             clear();
1368         }
1369 
clearOrientedRanges1370         void clear() {
1371             haveSize = false;
1372             haveTouchSize = false;
1373             haveToolSize = false;
1374             haveOrientation = false;
1375             haveDistance = false;
1376             haveTilt = false;
1377         }
1378     } mOrientedRanges;
1379 
1380     // Oriented dimensions and precision.
1381     float mOrientedXPrecision;
1382     float mOrientedYPrecision;
1383 
1384     struct CurrentVirtualKeyState {
1385         bool down;
1386         bool ignored;
1387         nsecs_t downTime;
1388         int32_t keyCode;
1389         int32_t scanCode;
1390     } mCurrentVirtualKey;
1391 
1392     // Scale factor for gesture or mouse based pointer movements.
1393     float mPointerXMovementScale;
1394     float mPointerYMovementScale;
1395 
1396     // Scale factor for gesture based zooming and other freeform motions.
1397     float mPointerXZoomScale;
1398     float mPointerYZoomScale;
1399 
1400     // The maximum swipe width.
1401     float mPointerGestureMaxSwipeWidth;
1402 
1403     struct PointerDistanceHeapElement {
1404         uint32_t currentPointerIndex : 8;
1405         uint32_t lastPointerIndex : 8;
1406         uint64_t distance : 48; // squared distance
1407     };
1408 
1409     enum PointerUsage {
1410         POINTER_USAGE_NONE,
1411         POINTER_USAGE_GESTURES,
1412         POINTER_USAGE_STYLUS,
1413         POINTER_USAGE_MOUSE,
1414     };
1415     PointerUsage mPointerUsage;
1416 
1417     struct PointerGesture {
1418         enum Mode {
1419             // No fingers, button is not pressed.
1420             // Nothing happening.
1421             NEUTRAL,
1422 
1423             // No fingers, button is not pressed.
1424             // Tap detected.
1425             // Emits DOWN and UP events at the pointer location.
1426             TAP,
1427 
1428             // Exactly one finger dragging following a tap.
1429             // Pointer follows the active finger.
1430             // Emits DOWN, MOVE and UP events at the pointer location.
1431             //
1432             // Detect double-taps when the finger goes up while in TAP_DRAG mode.
1433             TAP_DRAG,
1434 
1435             // Button is pressed.
1436             // Pointer follows the active finger if there is one.  Other fingers are ignored.
1437             // Emits DOWN, MOVE and UP events at the pointer location.
1438             BUTTON_CLICK_OR_DRAG,
1439 
1440             // Exactly one finger, button is not pressed.
1441             // Pointer follows the active finger.
1442             // Emits HOVER_MOVE events at the pointer location.
1443             //
1444             // Detect taps when the finger goes up while in HOVER mode.
1445             HOVER,
1446 
1447             // Exactly two fingers but neither have moved enough to clearly indicate
1448             // whether a swipe or freeform gesture was intended.  We consider the
1449             // pointer to be pressed so this enables clicking or long-pressing on buttons.
1450             // Pointer does not move.
1451             // Emits DOWN, MOVE and UP events with a single stationary pointer coordinate.
1452             PRESS,
1453 
1454             // Exactly two fingers moving in the same direction, button is not pressed.
1455             // Pointer does not move.
1456             // Emits DOWN, MOVE and UP events with a single pointer coordinate that
1457             // follows the midpoint between both fingers.
1458             SWIPE,
1459 
1460             // Two or more fingers moving in arbitrary directions, button is not pressed.
1461             // Pointer does not move.
1462             // Emits DOWN, POINTER_DOWN, MOVE, POINTER_UP and UP events that follow
1463             // each finger individually relative to the initial centroid of the finger.
1464             FREEFORM,
1465 
1466             // Waiting for quiet time to end before starting the next gesture.
1467             QUIET,
1468         };
1469 
1470         // Time the first finger went down.
1471         nsecs_t firstTouchTime;
1472 
1473         // The active pointer id from the raw touch data.
1474         int32_t activeTouchId; // -1 if none
1475 
1476         // The active pointer id from the gesture last delivered to the application.
1477         int32_t activeGestureId; // -1 if none
1478 
1479         // Pointer coords and ids for the current and previous pointer gesture.
1480         Mode currentGestureMode;
1481         BitSet32 currentGestureIdBits;
1482         uint32_t currentGestureIdToIndex[MAX_POINTER_ID + 1];
1483         PointerProperties currentGestureProperties[MAX_POINTERS];
1484         PointerCoords currentGestureCoords[MAX_POINTERS];
1485 
1486         Mode lastGestureMode;
1487         BitSet32 lastGestureIdBits;
1488         uint32_t lastGestureIdToIndex[MAX_POINTER_ID + 1];
1489         PointerProperties lastGestureProperties[MAX_POINTERS];
1490         PointerCoords lastGestureCoords[MAX_POINTERS];
1491 
1492         // Time the pointer gesture last went down.
1493         nsecs_t downTime;
1494 
1495         // Time when the pointer went down for a TAP.
1496         nsecs_t tapDownTime;
1497 
1498         // Time when the pointer went up for a TAP.
1499         nsecs_t tapUpTime;
1500 
1501         // Location of initial tap.
1502         float tapX, tapY;
1503 
1504         // Time we started waiting for quiescence.
1505         nsecs_t quietTime;
1506 
1507         // Reference points for multitouch gestures.
1508         float referenceTouchX;    // reference touch X/Y coordinates in surface units
1509         float referenceTouchY;
1510         float referenceGestureX;  // reference gesture X/Y coordinates in pixels
1511         float referenceGestureY;
1512 
1513         // Distance that each pointer has traveled which has not yet been
1514         // subsumed into the reference gesture position.
1515         BitSet32 referenceIdBits;
1516         struct Delta {
1517             float dx, dy;
1518         };
1519         Delta referenceDeltas[MAX_POINTER_ID + 1];
1520 
1521         // Describes how touch ids are mapped to gesture ids for freeform gestures.
1522         uint32_t freeformTouchToGestureIdMap[MAX_POINTER_ID + 1];
1523 
1524         // A velocity tracker for determining whether to switch active pointers during drags.
1525         VelocityTracker velocityTracker;
1526 
resetPointerGesture1527         void reset() {
1528             firstTouchTime = LLONG_MIN;
1529             activeTouchId = -1;
1530             activeGestureId = -1;
1531             currentGestureMode = NEUTRAL;
1532             currentGestureIdBits.clear();
1533             lastGestureMode = NEUTRAL;
1534             lastGestureIdBits.clear();
1535             downTime = 0;
1536             velocityTracker.clear();
1537             resetTap();
1538             resetQuietTime();
1539         }
1540 
resetTapPointerGesture1541         void resetTap() {
1542             tapDownTime = LLONG_MIN;
1543             tapUpTime = LLONG_MIN;
1544         }
1545 
resetQuietTimePointerGesture1546         void resetQuietTime() {
1547             quietTime = LLONG_MIN;
1548         }
1549     } mPointerGesture;
1550 
1551     struct PointerSimple {
1552         PointerCoords currentCoords;
1553         PointerProperties currentProperties;
1554         PointerCoords lastCoords;
1555         PointerProperties lastProperties;
1556 
1557         // True if the pointer is down.
1558         bool down;
1559 
1560         // True if the pointer is hovering.
1561         bool hovering;
1562 
1563         // Time the pointer last went down.
1564         nsecs_t downTime;
1565 
resetPointerSimple1566         void reset() {
1567             currentCoords.clear();
1568             currentProperties.clear();
1569             lastCoords.clear();
1570             lastProperties.clear();
1571             down = false;
1572             hovering = false;
1573             downTime = 0;
1574         }
1575     } mPointerSimple;
1576 
1577     // The pointer and scroll velocity controls.
1578     VelocityControl mPointerVelocityControl;
1579     VelocityControl mWheelXVelocityControl;
1580     VelocityControl mWheelYVelocityControl;
1581 
1582     // Latency statistics for touch events
1583     struct LatencyStatistics mStatistics;
1584 
1585     std::optional<DisplayViewport> findViewport();
1586 
1587     void resetExternalStylus();
1588     void clearStylusDataPendingFlags();
1589 
1590     void sync(nsecs_t when);
1591 
1592     bool consumeRawTouches(nsecs_t when, uint32_t policyFlags);
1593     void processRawTouches(bool timeout);
1594     void cookAndDispatch(nsecs_t when);
1595     void dispatchVirtualKey(nsecs_t when, uint32_t policyFlags,
1596             int32_t keyEventAction, int32_t keyEventFlags);
1597 
1598     void dispatchTouches(nsecs_t when, uint32_t policyFlags);
1599     void dispatchHoverExit(nsecs_t when, uint32_t policyFlags);
1600     void dispatchHoverEnterAndMove(nsecs_t when, uint32_t policyFlags);
1601     void dispatchButtonRelease(nsecs_t when, uint32_t policyFlags);
1602     void dispatchButtonPress(nsecs_t when, uint32_t policyFlags);
1603     const BitSet32& findActiveIdBits(const CookedPointerData& cookedPointerData);
1604     void cookPointerData();
1605     void abortTouches(nsecs_t when, uint32_t policyFlags);
1606 
1607     void dispatchPointerUsage(nsecs_t when, uint32_t policyFlags, PointerUsage pointerUsage);
1608     void abortPointerUsage(nsecs_t when, uint32_t policyFlags);
1609 
1610     void dispatchPointerGestures(nsecs_t when, uint32_t policyFlags, bool isTimeout);
1611     void abortPointerGestures(nsecs_t when, uint32_t policyFlags);
1612     bool preparePointerGestures(nsecs_t when,
1613             bool* outCancelPreviousGesture, bool* outFinishPreviousGesture,
1614             bool isTimeout);
1615 
1616     void dispatchPointerStylus(nsecs_t when, uint32_t policyFlags);
1617     void abortPointerStylus(nsecs_t when, uint32_t policyFlags);
1618 
1619     void dispatchPointerMouse(nsecs_t when, uint32_t policyFlags);
1620     void abortPointerMouse(nsecs_t when, uint32_t policyFlags);
1621 
1622     void dispatchPointerSimple(nsecs_t when, uint32_t policyFlags,
1623             bool down, bool hovering);
1624     void abortPointerSimple(nsecs_t when, uint32_t policyFlags);
1625 
1626     bool assignExternalStylusId(const RawState& state, bool timeout);
1627     void applyExternalStylusButtonState(nsecs_t when);
1628     void applyExternalStylusTouchState(nsecs_t when);
1629 
1630     // Dispatches a motion event.
1631     // If the changedId is >= 0 and the action is POINTER_DOWN or POINTER_UP, the
1632     // method will take care of setting the index and transmuting the action to DOWN or UP
1633     // it is the first / last pointer to go down / up.
1634     void dispatchMotion(nsecs_t when, uint32_t policyFlags, uint32_t source,
1635             int32_t action, int32_t actionButton,
1636             int32_t flags, int32_t metaState, int32_t buttonState, int32_t edgeFlags,
1637             uint32_t deviceTimestamp,
1638             const PointerProperties* properties, const PointerCoords* coords,
1639             const uint32_t* idToIndex, BitSet32 idBits,
1640             int32_t changedId, float xPrecision, float yPrecision, nsecs_t downTime);
1641 
1642     // Updates pointer coords and properties for pointers with specified ids that have moved.
1643     // Returns true if any of them changed.
1644     bool updateMovedPointers(const PointerProperties* inProperties,
1645             const PointerCoords* inCoords, const uint32_t* inIdToIndex,
1646             PointerProperties* outProperties, PointerCoords* outCoords,
1647             const uint32_t* outIdToIndex, BitSet32 idBits) const;
1648 
1649     bool isPointInsideSurface(int32_t x, int32_t y);
1650     const VirtualKey* findVirtualKeyHit(int32_t x, int32_t y);
1651 
1652     static void assignPointerIds(const RawState* last, RawState* current);
1653 
1654     void reportEventForStatistics(nsecs_t evdevTime);
1655 
1656     const char* modeToString(DeviceMode deviceMode);
1657 };
1658 
1659 
1660 class SingleTouchInputMapper : public TouchInputMapper {
1661 public:
1662     explicit SingleTouchInputMapper(InputDevice* device);
1663     virtual ~SingleTouchInputMapper();
1664 
1665     virtual void reset(nsecs_t when);
1666     virtual void process(const RawEvent* rawEvent);
1667 
1668 protected:
1669     virtual void syncTouch(nsecs_t when, RawState* outState);
1670     virtual void configureRawPointerAxes();
1671     virtual bool hasStylus() const;
1672 
1673 private:
1674     SingleTouchMotionAccumulator mSingleTouchMotionAccumulator;
1675 };
1676 
1677 
1678 class MultiTouchInputMapper : public TouchInputMapper {
1679 public:
1680     explicit MultiTouchInputMapper(InputDevice* device);
1681     virtual ~MultiTouchInputMapper();
1682 
1683     virtual void reset(nsecs_t when);
1684     virtual void process(const RawEvent* rawEvent);
1685 
1686 protected:
1687     virtual void syncTouch(nsecs_t when, RawState* outState);
1688     virtual void configureRawPointerAxes();
1689     virtual bool hasStylus() const;
1690 
1691 private:
1692     MultiTouchMotionAccumulator mMultiTouchMotionAccumulator;
1693 
1694     // Specifies the pointer id bits that are in use, and their associated tracking id.
1695     BitSet32 mPointerIdBits;
1696     int32_t mPointerTrackingIdMap[MAX_POINTER_ID + 1];
1697 };
1698 
1699 class ExternalStylusInputMapper : public InputMapper {
1700 public:
1701     explicit ExternalStylusInputMapper(InputDevice* device);
1702     virtual ~ExternalStylusInputMapper() = default;
1703 
1704     virtual uint32_t getSources();
1705     virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
1706     virtual void dump(std::string& dump);
1707     virtual void configure(nsecs_t when, const InputReaderConfiguration* config, uint32_t changes);
1708     virtual void reset(nsecs_t when);
1709     virtual void process(const RawEvent* rawEvent);
1710     virtual void sync(nsecs_t when);
1711 
1712 private:
1713     SingleTouchMotionAccumulator mSingleTouchMotionAccumulator;
1714     RawAbsoluteAxisInfo mRawPressureAxis;
1715     TouchButtonAccumulator mTouchButtonAccumulator;
1716 
1717     StylusState mStylusState;
1718 };
1719 
1720 
1721 class JoystickInputMapper : public InputMapper {
1722 public:
1723     explicit JoystickInputMapper(InputDevice* device);
1724     virtual ~JoystickInputMapper();
1725 
1726     virtual uint32_t getSources();
1727     virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
1728     virtual void dump(std::string& dump);
1729     virtual void configure(nsecs_t when, const InputReaderConfiguration* config, uint32_t changes);
1730     virtual void reset(nsecs_t when);
1731     virtual void process(const RawEvent* rawEvent);
1732 
1733 private:
1734     struct Axis {
1735         RawAbsoluteAxisInfo rawAxisInfo;
1736         AxisInfo axisInfo;
1737 
1738         bool explicitlyMapped; // true if the axis was explicitly assigned an axis id
1739 
1740         float scale;   // scale factor from raw to normalized values
1741         float offset;  // offset to add after scaling for normalization
1742         float highScale;  // scale factor from raw to normalized values of high split
1743         float highOffset; // offset to add after scaling for normalization of high split
1744 
1745         float min;        // normalized inclusive minimum
1746         float max;        // normalized inclusive maximum
1747         float flat;       // normalized flat region size
1748         float fuzz;       // normalized error tolerance
1749         float resolution; // normalized resolution in units/mm
1750 
1751         float filter;  // filter out small variations of this size
1752         float currentValue; // current value
1753         float newValue; // most recent value
1754         float highCurrentValue; // current value of high split
1755         float highNewValue; // most recent value of high split
1756 
initializeAxis1757         void initialize(const RawAbsoluteAxisInfo& rawAxisInfo, const AxisInfo& axisInfo,
1758                 bool explicitlyMapped, float scale, float offset,
1759                 float highScale, float highOffset,
1760                 float min, float max, float flat, float fuzz, float resolution) {
1761             this->rawAxisInfo = rawAxisInfo;
1762             this->axisInfo = axisInfo;
1763             this->explicitlyMapped = explicitlyMapped;
1764             this->scale = scale;
1765             this->offset = offset;
1766             this->highScale = highScale;
1767             this->highOffset = highOffset;
1768             this->min = min;
1769             this->max = max;
1770             this->flat = flat;
1771             this->fuzz = fuzz;
1772             this->resolution = resolution;
1773             this->filter = 0;
1774             resetValue();
1775         }
1776 
resetValueAxis1777         void resetValue() {
1778             this->currentValue = 0;
1779             this->newValue = 0;
1780             this->highCurrentValue = 0;
1781             this->highNewValue = 0;
1782         }
1783     };
1784 
1785     // Axes indexed by raw ABS_* axis index.
1786     KeyedVector<int32_t, Axis> mAxes;
1787 
1788     void sync(nsecs_t when, bool force);
1789 
1790     bool haveAxis(int32_t axisId);
1791     void pruneAxes(bool ignoreExplicitlyMappedAxes);
1792     bool filterAxes(bool force);
1793 
1794     static bool hasValueChangedSignificantly(float filter,
1795             float newValue, float currentValue, float min, float max);
1796     static bool hasMovedNearerToValueWithinFilteredRange(float filter,
1797             float newValue, float currentValue, float thresholdValue);
1798 
1799     static bool isCenteredAxis(int32_t axis);
1800     static int32_t getCompatAxis(int32_t axis);
1801 
1802     static void addMotionRange(int32_t axisId, const Axis& axis, InputDeviceInfo* info);
1803     static void setPointerCoordsAxisValue(PointerCoords* pointerCoords, int32_t axis,
1804             float value);
1805 };
1806 
1807 } // namespace android
1808 
1809 #endif // _UI_INPUT_READER_H
1810