InputReader.h revision 8a90e6e3174083f274538567d851f98478fc83e9
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 "PointerController.h"
22#include "InputListener.h"
23
24#include <androidfw/Input.h>
25#include <androidfw/VelocityControl.h>
26#include <androidfw/VelocityTracker.h>
27#include <ui/DisplayInfo.h>
28#include <utils/KeyedVector.h>
29#include <utils/threads.h>
30#include <utils/Timers.h>
31#include <utils/RefBase.h>
32#include <utils/String8.h>
33#include <utils/BitSet.h>
34
35#include <stddef.h>
36#include <unistd.h>
37
38// Maximum supported size of a vibration pattern.
39// Must be at least 2.
40#define MAX_VIBRATE_PATTERN_SIZE 100
41
42// Maximum allowable delay value in a vibration pattern before
43// which the delay will be truncated.
44#define MAX_VIBRATE_PATTERN_DELAY_NSECS (1000000 * 1000000000LL)
45
46namespace android {
47
48class InputDevice;
49class InputMapper;
50
51
52/*
53 * Input reader configuration.
54 *
55 * Specifies various options that modify the behavior of the input reader.
56 */
57struct InputReaderConfiguration {
58    // Describes changes that have occurred.
59    enum {
60        // The pointer speed changed.
61        CHANGE_POINTER_SPEED = 1 << 0,
62
63        // The pointer gesture control changed.
64        CHANGE_POINTER_GESTURE_ENABLEMENT = 1 << 1,
65
66        // The display size or orientation changed.
67        CHANGE_DISPLAY_INFO = 1 << 2,
68
69        // The visible touches option changed.
70        CHANGE_SHOW_TOUCHES = 1 << 3,
71
72        // The keyboard layouts must be reloaded.
73        CHANGE_KEYBOARD_LAYOUTS = 1 << 4,
74
75        // The device name alias supplied by the may have changed for some devices.
76        CHANGE_DEVICE_ALIAS = 1 << 5,
77
78        // All devices must be reopened.
79        CHANGE_MUST_REOPEN = 1 << 31,
80    };
81
82    // Gets the amount of time to disable virtual keys after the screen is touched
83    // in order to filter out accidental virtual key presses due to swiping gestures
84    // or taps near the edge of the display.  May be 0 to disable the feature.
85    nsecs_t virtualKeyQuietTime;
86
87    // The excluded device names for the platform.
88    // Devices with these names will be ignored.
89    Vector<String8> excludedDeviceNames;
90
91    // Velocity control parameters for mouse pointer movements.
92    VelocityControlParameters pointerVelocityControlParameters;
93
94    // Velocity control parameters for mouse wheel movements.
95    VelocityControlParameters wheelVelocityControlParameters;
96
97    // True if pointer gestures are enabled.
98    bool pointerGesturesEnabled;
99
100    // Quiet time between certain pointer gesture transitions.
101    // Time to allow for all fingers or buttons to settle into a stable state before
102    // starting a new gesture.
103    nsecs_t pointerGestureQuietInterval;
104
105    // The minimum speed that a pointer must travel for us to consider switching the active
106    // touch pointer to it during a drag.  This threshold is set to avoid switching due
107    // to noise from a finger resting on the touch pad (perhaps just pressing it down).
108    float pointerGestureDragMinSwitchSpeed; // in pixels per second
109
110    // Tap gesture delay time.
111    // The time between down and up must be less than this to be considered a tap.
112    nsecs_t pointerGestureTapInterval;
113
114    // Tap drag gesture delay time.
115    // The time between the previous tap's up and the next down must be less than
116    // this to be considered a drag.  Otherwise, the previous tap is finished and a
117    // new tap begins.
118    //
119    // Note that the previous tap will be held down for this entire duration so this
120    // interval must be shorter than the long press timeout.
121    nsecs_t pointerGestureTapDragInterval;
122
123    // The distance in pixels that the pointer is allowed to move from initial down
124    // to up and still be called a tap.
125    float pointerGestureTapSlop; // in pixels
126
127    // Time after the first touch points go down to settle on an initial centroid.
128    // This is intended to be enough time to handle cases where the user puts down two
129    // fingers at almost but not quite exactly the same time.
130    nsecs_t pointerGestureMultitouchSettleInterval;
131
132    // The transition from PRESS to SWIPE or FREEFORM gesture mode is made when
133    // at least two pointers have moved at least this far from their starting place.
134    float pointerGestureMultitouchMinDistance; // in pixels
135
136    // The transition from PRESS to SWIPE gesture mode can only occur when the
137    // cosine of the angle between the two vectors is greater than or equal to than this value
138    // which indicates that the vectors are oriented in the same direction.
139    // When the vectors are oriented in the exactly same direction, the cosine is 1.0.
140    // (In exactly opposite directions, the cosine is -1.0.)
141    float pointerGestureSwipeTransitionAngleCosine;
142
143    // The transition from PRESS to SWIPE gesture mode can only occur when the
144    // fingers are no more than this far apart relative to the diagonal size of
145    // the touch pad.  For example, a ratio of 0.5 means that the fingers must be
146    // no more than half the diagonal size of the touch pad apart.
147    float pointerGestureSwipeMaxWidthRatio;
148
149    // The gesture movement speed factor relative to the size of the display.
150    // Movement speed applies when the fingers are moving in the same direction.
151    // Without acceleration, a full swipe of the touch pad diagonal in movement mode
152    // will cover this portion of the display diagonal.
153    float pointerGestureMovementSpeedRatio;
154
155    // The gesture zoom speed factor relative to the size of the display.
156    // Zoom speed applies when the fingers are mostly moving relative to each other
157    // to execute a scale gesture or similar.
158    // Without acceleration, a full swipe of the touch pad diagonal in zoom mode
159    // will cover this portion of the display diagonal.
160    float pointerGestureZoomSpeedRatio;
161
162    // True to show the location of touches on the touch screen as spots.
163    bool showTouches;
164
165    InputReaderConfiguration() :
166            virtualKeyQuietTime(0),
167            pointerVelocityControlParameters(1.0f, 500.0f, 3000.0f, 3.0f),
168            wheelVelocityControlParameters(1.0f, 15.0f, 50.0f, 4.0f),
169            pointerGesturesEnabled(true),
170            pointerGestureQuietInterval(100 * 1000000LL), // 100 ms
171            pointerGestureDragMinSwitchSpeed(50), // 50 pixels per second
172            pointerGestureTapInterval(150 * 1000000LL), // 150 ms
173            pointerGestureTapDragInterval(150 * 1000000LL), // 150 ms
174            pointerGestureTapSlop(10.0f), // 10 pixels
175            pointerGestureMultitouchSettleInterval(100 * 1000000LL), // 100 ms
176            pointerGestureMultitouchMinDistance(15), // 15 pixels
177            pointerGestureSwipeTransitionAngleCosine(0.2588f), // cosine of 75 degrees
178            pointerGestureSwipeMaxWidthRatio(0.25f),
179            pointerGestureMovementSpeedRatio(0.8f),
180            pointerGestureZoomSpeedRatio(0.3f),
181            showTouches(false) { }
182
183    bool getDisplayInfo(int32_t displayId, bool external,
184            int32_t* width, int32_t* height, int32_t* orientation) const;
185
186    void setDisplayInfo(int32_t displayId, bool external,
187            int32_t width, int32_t height, int32_t orientation);
188
189private:
190    struct DisplayInfo {
191        int32_t width;
192        int32_t height;
193        int32_t orientation;
194
195        DisplayInfo() :
196            width(-1), height(-1), orientation(DISPLAY_ORIENTATION_0) {
197        }
198    };
199
200    DisplayInfo mInternalDisplay;
201    DisplayInfo mExternalDisplay;
202};
203
204
205/*
206 * Input reader policy interface.
207 *
208 * The input reader policy is used by the input reader to interact with the Window Manager
209 * and other system components.
210 *
211 * The actual implementation is partially supported by callbacks into the DVM
212 * via JNI.  This interface is also mocked in the unit tests.
213 *
214 * These methods must NOT re-enter the input reader since they may be called while
215 * holding the input reader lock.
216 */
217class InputReaderPolicyInterface : public virtual RefBase {
218protected:
219    InputReaderPolicyInterface() { }
220    virtual ~InputReaderPolicyInterface() { }
221
222public:
223    /* Gets the input reader configuration. */
224    virtual void getReaderConfiguration(InputReaderConfiguration* outConfig) = 0;
225
226    /* Gets a pointer controller associated with the specified cursor device (ie. a mouse). */
227    virtual sp<PointerControllerInterface> obtainPointerController(int32_t deviceId) = 0;
228
229    /* Notifies the input reader policy that some input devices have changed
230     * and provides information about all current input devices.
231     */
232    virtual void notifyInputDevicesChanged(const Vector<InputDeviceInfo>& inputDevices) = 0;
233
234    /* Gets the keyboard layout for a particular input device. */
235    virtual sp<KeyCharacterMap> getKeyboardLayoutOverlay(const String8& inputDeviceDescriptor) = 0;
236
237    /* Gets a user-supplied alias for a particular input device, or an empty string if none. */
238    virtual String8 getDeviceAlias(const InputDeviceIdentifier& identifier) = 0;
239};
240
241
242/* Processes raw input events and sends cooked event data to an input listener. */
243class InputReaderInterface : public virtual RefBase {
244protected:
245    InputReaderInterface() { }
246    virtual ~InputReaderInterface() { }
247
248public:
249    /* Dumps the state of the input reader.
250     *
251     * This method may be called on any thread (usually by the input manager). */
252    virtual void dump(String8& dump) = 0;
253
254    /* Called by the heatbeat to ensures that the reader has not deadlocked. */
255    virtual void monitor() = 0;
256
257    /* Runs a single iteration of the processing loop.
258     * Nominally reads and processes one incoming message from the EventHub.
259     *
260     * This method should be called on the input reader thread.
261     */
262    virtual void loopOnce() = 0;
263
264    /* Gets information about all input devices.
265     *
266     * This method may be called on any thread (usually by the input manager).
267     */
268    virtual void getInputDevices(Vector<InputDeviceInfo>& outInputDevices) = 0;
269
270    /* Query current input state. */
271    virtual int32_t getScanCodeState(int32_t deviceId, uint32_t sourceMask,
272            int32_t scanCode) = 0;
273    virtual int32_t getKeyCodeState(int32_t deviceId, uint32_t sourceMask,
274            int32_t keyCode) = 0;
275    virtual int32_t getSwitchState(int32_t deviceId, uint32_t sourceMask,
276            int32_t sw) = 0;
277
278    /* Determine whether physical keys exist for the given framework-domain key codes. */
279    virtual bool hasKeys(int32_t deviceId, uint32_t sourceMask,
280            size_t numCodes, const int32_t* keyCodes, uint8_t* outFlags) = 0;
281
282    /* Requests that a reconfiguration of all input devices.
283     * The changes flag is a bitfield that indicates what has changed and whether
284     * the input devices must all be reopened. */
285    virtual void requestRefreshConfiguration(uint32_t changes) = 0;
286
287    /* Controls the vibrator of a particular input device. */
288    virtual void vibrate(int32_t deviceId, const nsecs_t* pattern, size_t patternSize,
289            ssize_t repeat, int32_t token) = 0;
290    virtual void cancelVibrate(int32_t deviceId, int32_t token) = 0;
291};
292
293
294/* Internal interface used by individual input devices to access global input device state
295 * and parameters maintained by the input reader.
296 */
297class InputReaderContext {
298public:
299    InputReaderContext() { }
300    virtual ~InputReaderContext() { }
301
302    virtual void updateGlobalMetaState() = 0;
303    virtual int32_t getGlobalMetaState() = 0;
304
305    virtual void disableVirtualKeysUntil(nsecs_t time) = 0;
306    virtual bool shouldDropVirtualKey(nsecs_t now,
307            InputDevice* device, int32_t keyCode, int32_t scanCode) = 0;
308
309    virtual void fadePointer() = 0;
310
311    virtual void requestTimeoutAtTime(nsecs_t when) = 0;
312    virtual int32_t bumpGeneration() = 0;
313
314    virtual InputReaderPolicyInterface* getPolicy() = 0;
315    virtual InputListenerInterface* getListener() = 0;
316    virtual EventHubInterface* getEventHub() = 0;
317};
318
319
320/* The input reader reads raw event data from the event hub and processes it into input events
321 * that it sends to the input listener.  Some functions of the input reader, such as early
322 * event filtering in low power states, are controlled by a separate policy object.
323 *
324 * The InputReader owns a collection of InputMappers.  Most of the work it does happens
325 * on the input reader thread but the InputReader can receive queries from other system
326 * components running on arbitrary threads.  To keep things manageable, the InputReader
327 * uses a single Mutex to guard its state.  The Mutex may be held while calling into the
328 * EventHub or the InputReaderPolicy but it is never held while calling into the
329 * InputListener.
330 */
331class InputReader : public InputReaderInterface {
332public:
333    InputReader(const sp<EventHubInterface>& eventHub,
334            const sp<InputReaderPolicyInterface>& policy,
335            const sp<InputListenerInterface>& listener);
336    virtual ~InputReader();
337
338    virtual void dump(String8& dump);
339    virtual void monitor();
340
341    virtual void loopOnce();
342
343    virtual void getInputDevices(Vector<InputDeviceInfo>& outInputDevices);
344
345    virtual int32_t getScanCodeState(int32_t deviceId, uint32_t sourceMask,
346            int32_t scanCode);
347    virtual int32_t getKeyCodeState(int32_t deviceId, uint32_t sourceMask,
348            int32_t keyCode);
349    virtual int32_t getSwitchState(int32_t deviceId, uint32_t sourceMask,
350            int32_t sw);
351
352    virtual bool hasKeys(int32_t deviceId, uint32_t sourceMask,
353            size_t numCodes, const int32_t* keyCodes, uint8_t* outFlags);
354
355    virtual void requestRefreshConfiguration(uint32_t changes);
356
357    virtual void vibrate(int32_t deviceId, const nsecs_t* pattern, size_t patternSize,
358            ssize_t repeat, int32_t token);
359    virtual void cancelVibrate(int32_t deviceId, int32_t token);
360
361protected:
362    // These members are protected so they can be instrumented by test cases.
363    virtual InputDevice* createDeviceLocked(int32_t deviceId,
364            const InputDeviceIdentifier& identifier, uint32_t classes);
365
366    class ContextImpl : public InputReaderContext {
367        InputReader* mReader;
368
369    public:
370        ContextImpl(InputReader* reader);
371
372        virtual void updateGlobalMetaState();
373        virtual int32_t getGlobalMetaState();
374        virtual void disableVirtualKeysUntil(nsecs_t time);
375        virtual bool shouldDropVirtualKey(nsecs_t now,
376                InputDevice* device, int32_t keyCode, int32_t scanCode);
377        virtual void fadePointer();
378        virtual void requestTimeoutAtTime(nsecs_t when);
379        virtual int32_t bumpGeneration();
380        virtual InputReaderPolicyInterface* getPolicy();
381        virtual InputListenerInterface* getListener();
382        virtual EventHubInterface* getEventHub();
383    } mContext;
384
385    friend class ContextImpl;
386
387private:
388    Mutex mLock;
389
390    Condition mReaderIsAliveCondition;
391
392    sp<EventHubInterface> mEventHub;
393    sp<InputReaderPolicyInterface> mPolicy;
394    sp<QueuedInputListener> mQueuedListener;
395
396    InputReaderConfiguration mConfig;
397
398    // The event queue.
399    static const int EVENT_BUFFER_SIZE = 256;
400    RawEvent mEventBuffer[EVENT_BUFFER_SIZE];
401
402    KeyedVector<int32_t, InputDevice*> mDevices;
403
404    // low-level input event decoding and device management
405    void processEventsLocked(const RawEvent* rawEvents, size_t count);
406
407    void addDeviceLocked(nsecs_t when, int32_t deviceId);
408    void removeDeviceLocked(nsecs_t when, int32_t deviceId);
409    void processEventsForDeviceLocked(int32_t deviceId, const RawEvent* rawEvents, size_t count);
410    void timeoutExpiredLocked(nsecs_t when);
411
412    void handleConfigurationChangedLocked(nsecs_t when);
413
414    int32_t mGlobalMetaState;
415    void updateGlobalMetaStateLocked();
416    int32_t getGlobalMetaStateLocked();
417
418    void fadePointerLocked();
419
420    int32_t mGeneration;
421    int32_t bumpGenerationLocked();
422
423    void getInputDevicesLocked(Vector<InputDeviceInfo>& outInputDevices);
424
425    nsecs_t mDisableVirtualKeysTimeout;
426    void disableVirtualKeysUntilLocked(nsecs_t time);
427    bool shouldDropVirtualKeyLocked(nsecs_t now,
428            InputDevice* device, int32_t keyCode, int32_t scanCode);
429
430    nsecs_t mNextTimeout;
431    void requestTimeoutAtTimeLocked(nsecs_t when);
432
433    uint32_t mConfigurationChangesToRefresh;
434    void refreshConfigurationLocked(uint32_t changes);
435
436    // state queries
437    typedef int32_t (InputDevice::*GetStateFunc)(uint32_t sourceMask, int32_t code);
438    int32_t getStateLocked(int32_t deviceId, uint32_t sourceMask, int32_t code,
439            GetStateFunc getStateFunc);
440    bool markSupportedKeyCodesLocked(int32_t deviceId, uint32_t sourceMask, size_t numCodes,
441            const int32_t* keyCodes, uint8_t* outFlags);
442};
443
444
445/* Reads raw events from the event hub and processes them, endlessly. */
446class InputReaderThread : public Thread {
447public:
448    InputReaderThread(const sp<InputReaderInterface>& reader);
449    virtual ~InputReaderThread();
450
451private:
452    sp<InputReaderInterface> mReader;
453
454    virtual bool threadLoop();
455};
456
457
458/* Represents the state of a single input device. */
459class InputDevice {
460public:
461    InputDevice(InputReaderContext* context, int32_t id, int32_t generation,
462            const InputDeviceIdentifier& identifier, uint32_t classes);
463    ~InputDevice();
464
465    inline InputReaderContext* getContext() { return mContext; }
466    inline int32_t getId() { return mId; }
467    inline int32_t getGeneration() { return mGeneration; }
468    inline const String8& getName() { return mIdentifier.name; }
469    inline uint32_t getClasses() { return mClasses; }
470    inline uint32_t getSources() { return mSources; }
471
472    inline bool isExternal() { return mIsExternal; }
473    inline void setExternal(bool external) { mIsExternal = external; }
474
475    inline bool isIgnored() { return mMappers.isEmpty(); }
476
477    void dump(String8& dump);
478    void addMapper(InputMapper* mapper);
479    void configure(nsecs_t when, const InputReaderConfiguration* config, uint32_t changes);
480    void reset(nsecs_t when);
481    void process(const RawEvent* rawEvents, size_t count);
482    void timeoutExpired(nsecs_t when);
483
484    void getDeviceInfo(InputDeviceInfo* outDeviceInfo);
485    int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode);
486    int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode);
487    int32_t getSwitchState(uint32_t sourceMask, int32_t switchCode);
488    bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes,
489            const int32_t* keyCodes, uint8_t* outFlags);
490    void vibrate(const nsecs_t* pattern, size_t patternSize, ssize_t repeat, int32_t token);
491    void cancelVibrate(int32_t token);
492
493    int32_t getMetaState();
494
495    void fadePointer();
496
497    void bumpGeneration();
498
499    void notifyReset(nsecs_t when);
500
501    inline const PropertyMap& getConfiguration() { return mConfiguration; }
502    inline EventHubInterface* getEventHub() { return mContext->getEventHub(); }
503
504    bool hasKey(int32_t code) {
505        return getEventHub()->hasScanCode(mId, code);
506    }
507
508    bool hasAbsoluteAxis(int32_t code) {
509        RawAbsoluteAxisInfo info;
510        getEventHub()->getAbsoluteAxisInfo(mId, code, &info);
511        return info.valid;
512    }
513
514    bool isKeyPressed(int32_t code) {
515        return getEventHub()->getScanCodeState(mId, code) == AKEY_STATE_DOWN;
516    }
517
518    int32_t getAbsoluteAxisValue(int32_t code) {
519        int32_t value;
520        getEventHub()->getAbsoluteAxisValue(mId, code, &value);
521        return value;
522    }
523
524private:
525    InputReaderContext* mContext;
526    int32_t mId;
527    int32_t mGeneration;
528    InputDeviceIdentifier mIdentifier;
529    String8 mAlias;
530    uint32_t mClasses;
531
532    Vector<InputMapper*> mMappers;
533
534    uint32_t mSources;
535    bool mIsExternal;
536    bool mDropUntilNextSync;
537
538    typedef int32_t (InputMapper::*GetStateFunc)(uint32_t sourceMask, int32_t code);
539    int32_t getState(uint32_t sourceMask, int32_t code, GetStateFunc getStateFunc);
540
541    PropertyMap mConfiguration;
542};
543
544
545/* Keeps track of the state of mouse or touch pad buttons. */
546class CursorButtonAccumulator {
547public:
548    CursorButtonAccumulator();
549    void reset(InputDevice* device);
550
551    void process(const RawEvent* rawEvent);
552
553    uint32_t getButtonState() const;
554
555private:
556    bool mBtnLeft;
557    bool mBtnRight;
558    bool mBtnMiddle;
559    bool mBtnBack;
560    bool mBtnSide;
561    bool mBtnForward;
562    bool mBtnExtra;
563    bool mBtnTask;
564
565    void clearButtons();
566};
567
568
569/* Keeps track of cursor movements. */
570
571class CursorMotionAccumulator {
572public:
573    CursorMotionAccumulator();
574    void reset(InputDevice* device);
575
576    void process(const RawEvent* rawEvent);
577    void finishSync();
578
579    inline int32_t getRelativeX() const { return mRelX; }
580    inline int32_t getRelativeY() const { return mRelY; }
581
582private:
583    int32_t mRelX;
584    int32_t mRelY;
585
586    void clearRelativeAxes();
587};
588
589
590/* Keeps track of cursor scrolling motions. */
591
592class CursorScrollAccumulator {
593public:
594    CursorScrollAccumulator();
595    void configure(InputDevice* device);
596    void reset(InputDevice* device);
597
598    void process(const RawEvent* rawEvent);
599    void finishSync();
600
601    inline bool haveRelativeVWheel() const { return mHaveRelWheel; }
602    inline bool haveRelativeHWheel() const { return mHaveRelHWheel; }
603
604    inline int32_t getRelativeX() const { return mRelX; }
605    inline int32_t getRelativeY() const { return mRelY; }
606    inline int32_t getRelativeVWheel() const { return mRelWheel; }
607    inline int32_t getRelativeHWheel() const { return mRelHWheel; }
608
609private:
610    bool mHaveRelWheel;
611    bool mHaveRelHWheel;
612
613    int32_t mRelX;
614    int32_t mRelY;
615    int32_t mRelWheel;
616    int32_t mRelHWheel;
617
618    void clearRelativeAxes();
619};
620
621
622/* Keeps track of the state of touch, stylus and tool buttons. */
623class TouchButtonAccumulator {
624public:
625    TouchButtonAccumulator();
626    void configure(InputDevice* device);
627    void reset(InputDevice* device);
628
629    void process(const RawEvent* rawEvent);
630
631    uint32_t getButtonState() const;
632    int32_t getToolType() const;
633    bool isToolActive() const;
634    bool isHovering() const;
635    bool hasStylus() const;
636
637private:
638    bool mHaveBtnTouch;
639    bool mHaveStylus;
640
641    bool mBtnTouch;
642    bool mBtnStylus;
643    bool mBtnStylus2;
644    bool mBtnToolFinger;
645    bool mBtnToolPen;
646    bool mBtnToolRubber;
647    bool mBtnToolBrush;
648    bool mBtnToolPencil;
649    bool mBtnToolAirbrush;
650    bool mBtnToolMouse;
651    bool mBtnToolLens;
652    bool mBtnToolDoubleTap;
653    bool mBtnToolTripleTap;
654    bool mBtnToolQuadTap;
655
656    void clearButtons();
657};
658
659
660/* Raw axis information from the driver. */
661struct RawPointerAxes {
662    RawAbsoluteAxisInfo x;
663    RawAbsoluteAxisInfo y;
664    RawAbsoluteAxisInfo pressure;
665    RawAbsoluteAxisInfo touchMajor;
666    RawAbsoluteAxisInfo touchMinor;
667    RawAbsoluteAxisInfo toolMajor;
668    RawAbsoluteAxisInfo toolMinor;
669    RawAbsoluteAxisInfo orientation;
670    RawAbsoluteAxisInfo distance;
671    RawAbsoluteAxisInfo tiltX;
672    RawAbsoluteAxisInfo tiltY;
673    RawAbsoluteAxisInfo trackingId;
674    RawAbsoluteAxisInfo slot;
675
676    RawPointerAxes();
677    void clear();
678};
679
680
681/* Raw data for a collection of pointers including a pointer id mapping table. */
682struct RawPointerData {
683    struct Pointer {
684        uint32_t id;
685        int32_t x;
686        int32_t y;
687        int32_t pressure;
688        int32_t touchMajor;
689        int32_t touchMinor;
690        int32_t toolMajor;
691        int32_t toolMinor;
692        int32_t orientation;
693        int32_t distance;
694        int32_t tiltX;
695        int32_t tiltY;
696        int32_t toolType; // a fully decoded AMOTION_EVENT_TOOL_TYPE constant
697        bool isHovering;
698    };
699
700    uint32_t pointerCount;
701    Pointer pointers[MAX_POINTERS];
702    BitSet32 hoveringIdBits, touchingIdBits;
703    uint32_t idToIndex[MAX_POINTER_ID + 1];
704
705    RawPointerData();
706    void clear();
707    void copyFrom(const RawPointerData& other);
708    void getCentroidOfTouchingPointers(float* outX, float* outY) const;
709
710    inline void markIdBit(uint32_t id, bool isHovering) {
711        if (isHovering) {
712            hoveringIdBits.markBit(id);
713        } else {
714            touchingIdBits.markBit(id);
715        }
716    }
717
718    inline void clearIdBits() {
719        hoveringIdBits.clear();
720        touchingIdBits.clear();
721    }
722
723    inline const Pointer& pointerForId(uint32_t id) const {
724        return pointers[idToIndex[id]];
725    }
726
727    inline bool isHovering(uint32_t pointerIndex) {
728        return pointers[pointerIndex].isHovering;
729    }
730};
731
732
733/* Cooked data for a collection of pointers including a pointer id mapping table. */
734struct CookedPointerData {
735    uint32_t pointerCount;
736    PointerProperties pointerProperties[MAX_POINTERS];
737    PointerCoords pointerCoords[MAX_POINTERS];
738    BitSet32 hoveringIdBits, touchingIdBits;
739    uint32_t idToIndex[MAX_POINTER_ID + 1];
740
741    CookedPointerData();
742    void clear();
743    void copyFrom(const CookedPointerData& other);
744
745    inline bool isHovering(uint32_t pointerIndex) {
746        return hoveringIdBits.hasBit(pointerProperties[pointerIndex].id);
747    }
748};
749
750
751/* Keeps track of the state of single-touch protocol. */
752class SingleTouchMotionAccumulator {
753public:
754    SingleTouchMotionAccumulator();
755
756    void process(const RawEvent* rawEvent);
757    void reset(InputDevice* device);
758
759    inline int32_t getAbsoluteX() const { return mAbsX; }
760    inline int32_t getAbsoluteY() const { return mAbsY; }
761    inline int32_t getAbsolutePressure() const { return mAbsPressure; }
762    inline int32_t getAbsoluteToolWidth() const { return mAbsToolWidth; }
763    inline int32_t getAbsoluteDistance() const { return mAbsDistance; }
764    inline int32_t getAbsoluteTiltX() const { return mAbsTiltX; }
765    inline int32_t getAbsoluteTiltY() const { return mAbsTiltY; }
766
767private:
768    int32_t mAbsX;
769    int32_t mAbsY;
770    int32_t mAbsPressure;
771    int32_t mAbsToolWidth;
772    int32_t mAbsDistance;
773    int32_t mAbsTiltX;
774    int32_t mAbsTiltY;
775
776    void clearAbsoluteAxes();
777};
778
779
780/* Keeps track of the state of multi-touch protocol. */
781class MultiTouchMotionAccumulator {
782public:
783    class Slot {
784    public:
785        inline bool isInUse() const { return mInUse; }
786        inline int32_t getX() const { return mAbsMTPositionX; }
787        inline int32_t getY() const { return mAbsMTPositionY; }
788        inline int32_t getTouchMajor() const { return mAbsMTTouchMajor; }
789        inline int32_t getTouchMinor() const {
790            return mHaveAbsMTTouchMinor ? mAbsMTTouchMinor : mAbsMTTouchMajor; }
791        inline int32_t getToolMajor() const { return mAbsMTWidthMajor; }
792        inline int32_t getToolMinor() const {
793            return mHaveAbsMTWidthMinor ? mAbsMTWidthMinor : mAbsMTWidthMajor; }
794        inline int32_t getOrientation() const { return mAbsMTOrientation; }
795        inline int32_t getTrackingId() const { return mAbsMTTrackingId; }
796        inline int32_t getPressure() const { return mAbsMTPressure; }
797        inline int32_t getDistance() const { return mAbsMTDistance; }
798        inline int32_t getToolType() const;
799
800    private:
801        friend class MultiTouchMotionAccumulator;
802
803        bool mInUse;
804        bool mHaveAbsMTTouchMinor;
805        bool mHaveAbsMTWidthMinor;
806        bool mHaveAbsMTToolType;
807
808        int32_t mAbsMTPositionX;
809        int32_t mAbsMTPositionY;
810        int32_t mAbsMTTouchMajor;
811        int32_t mAbsMTTouchMinor;
812        int32_t mAbsMTWidthMajor;
813        int32_t mAbsMTWidthMinor;
814        int32_t mAbsMTOrientation;
815        int32_t mAbsMTTrackingId;
816        int32_t mAbsMTPressure;
817        int32_t mAbsMTDistance;
818        int32_t mAbsMTToolType;
819
820        Slot();
821        void clear();
822    };
823
824    MultiTouchMotionAccumulator();
825    ~MultiTouchMotionAccumulator();
826
827    void configure(InputDevice* device, size_t slotCount, bool usingSlotsProtocol);
828    void reset(InputDevice* device);
829    void process(const RawEvent* rawEvent);
830    void finishSync();
831    bool hasStylus() const;
832
833    inline size_t getSlotCount() const { return mSlotCount; }
834    inline const Slot* getSlot(size_t index) const { return &mSlots[index]; }
835
836private:
837    int32_t mCurrentSlot;
838    Slot* mSlots;
839    size_t mSlotCount;
840    bool mUsingSlotsProtocol;
841    bool mHaveStylus;
842
843    void clearSlots(int32_t initialSlot);
844};
845
846
847/* An input mapper transforms raw input events into cooked event data.
848 * A single input device can have multiple associated input mappers in order to interpret
849 * different classes of events.
850 *
851 * InputMapper lifecycle:
852 * - create
853 * - configure with 0 changes
854 * - reset
855 * - process, process, process (may occasionally reconfigure with non-zero changes or reset)
856 * - reset
857 * - destroy
858 */
859class InputMapper {
860public:
861    InputMapper(InputDevice* device);
862    virtual ~InputMapper();
863
864    inline InputDevice* getDevice() { return mDevice; }
865    inline int32_t getDeviceId() { return mDevice->getId(); }
866    inline const String8 getDeviceName() { return mDevice->getName(); }
867    inline InputReaderContext* getContext() { return mContext; }
868    inline InputReaderPolicyInterface* getPolicy() { return mContext->getPolicy(); }
869    inline InputListenerInterface* getListener() { return mContext->getListener(); }
870    inline EventHubInterface* getEventHub() { return mContext->getEventHub(); }
871
872    virtual uint32_t getSources() = 0;
873    virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
874    virtual void dump(String8& dump);
875    virtual void configure(nsecs_t when, const InputReaderConfiguration* config, uint32_t changes);
876    virtual void reset(nsecs_t when);
877    virtual void process(const RawEvent* rawEvent) = 0;
878    virtual void timeoutExpired(nsecs_t when);
879
880    virtual int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode);
881    virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode);
882    virtual int32_t getSwitchState(uint32_t sourceMask, int32_t switchCode);
883    virtual bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes,
884            const int32_t* keyCodes, uint8_t* outFlags);
885    virtual void vibrate(const nsecs_t* pattern, size_t patternSize, ssize_t repeat,
886            int32_t token);
887    virtual void cancelVibrate(int32_t token);
888
889    virtual int32_t getMetaState();
890
891    virtual void fadePointer();
892
893protected:
894    InputDevice* mDevice;
895    InputReaderContext* mContext;
896
897    status_t getAbsoluteAxisInfo(int32_t axis, RawAbsoluteAxisInfo* axisInfo);
898    void bumpGeneration();
899
900    static void dumpRawAbsoluteAxisInfo(String8& dump,
901            const RawAbsoluteAxisInfo& axis, const char* name);
902};
903
904
905class SwitchInputMapper : public InputMapper {
906public:
907    SwitchInputMapper(InputDevice* device);
908    virtual ~SwitchInputMapper();
909
910    virtual uint32_t getSources();
911    virtual void process(const RawEvent* rawEvent);
912
913    virtual int32_t getSwitchState(uint32_t sourceMask, int32_t switchCode);
914
915private:
916    void processSwitch(nsecs_t when, int32_t switchCode, int32_t switchValue);
917};
918
919
920class VibratorInputMapper : public InputMapper {
921public:
922    VibratorInputMapper(InputDevice* device);
923    virtual ~VibratorInputMapper();
924
925    virtual uint32_t getSources();
926    virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
927    virtual void process(const RawEvent* rawEvent);
928
929    virtual void vibrate(const nsecs_t* pattern, size_t patternSize, ssize_t repeat,
930            int32_t token);
931    virtual void cancelVibrate(int32_t token);
932    virtual void timeoutExpired(nsecs_t when);
933    virtual void dump(String8& dump);
934
935private:
936    bool mVibrating;
937    nsecs_t mPattern[MAX_VIBRATE_PATTERN_SIZE];
938    size_t mPatternSize;
939    ssize_t mRepeat;
940    int32_t mToken;
941    ssize_t mIndex;
942    nsecs_t mNextStepTime;
943
944    void nextStep();
945    void stopVibrating();
946};
947
948
949class KeyboardInputMapper : public InputMapper {
950public:
951    KeyboardInputMapper(InputDevice* device, uint32_t source, int32_t keyboardType);
952    virtual ~KeyboardInputMapper();
953
954    virtual uint32_t getSources();
955    virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
956    virtual void dump(String8& dump);
957    virtual void configure(nsecs_t when, const InputReaderConfiguration* config, uint32_t changes);
958    virtual void reset(nsecs_t when);
959    virtual void process(const RawEvent* rawEvent);
960
961    virtual int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode);
962    virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode);
963    virtual bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes,
964            const int32_t* keyCodes, uint8_t* outFlags);
965
966    virtual int32_t getMetaState();
967
968private:
969    struct KeyDown {
970        int32_t keyCode;
971        int32_t scanCode;
972    };
973
974    uint32_t mSource;
975    int32_t mKeyboardType;
976
977    int32_t mOrientation; // orientation for dpad keys
978
979    Vector<KeyDown> mKeyDowns; // keys that are down
980    int32_t mMetaState;
981    nsecs_t mDownTime; // time of most recent key down
982
983    int32_t mCurrentHidUsage; // most recent HID usage seen this packet, or 0 if none
984
985    struct LedState {
986        bool avail; // led is available
987        bool on;    // we think the led is currently on
988    };
989    LedState mCapsLockLedState;
990    LedState mNumLockLedState;
991    LedState mScrollLockLedState;
992
993    // Immutable configuration parameters.
994    struct Parameters {
995        int32_t associatedDisplayId;
996        bool orientationAware;
997    } mParameters;
998
999    void configureParameters();
1000    void dumpParameters(String8& dump);
1001
1002    bool isKeyboardOrGamepadKey(int32_t scanCode);
1003
1004    void processKey(nsecs_t when, bool down, int32_t keyCode, int32_t scanCode,
1005            uint32_t policyFlags);
1006
1007    ssize_t findKeyDown(int32_t scanCode);
1008
1009    void resetLedState();
1010    void initializeLedState(LedState& ledState, int32_t led);
1011    void updateLedState(bool reset);
1012    void updateLedStateForModifier(LedState& ledState, int32_t led,
1013            int32_t modifier, bool reset);
1014};
1015
1016
1017class CursorInputMapper : public InputMapper {
1018public:
1019    CursorInputMapper(InputDevice* device);
1020    virtual ~CursorInputMapper();
1021
1022    virtual uint32_t getSources();
1023    virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
1024    virtual void dump(String8& dump);
1025    virtual void configure(nsecs_t when, const InputReaderConfiguration* config, uint32_t changes);
1026    virtual void reset(nsecs_t when);
1027    virtual void process(const RawEvent* rawEvent);
1028
1029    virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode);
1030
1031    virtual void fadePointer();
1032
1033private:
1034    // Amount that trackball needs to move in order to generate a key event.
1035    static const int32_t TRACKBALL_MOVEMENT_THRESHOLD = 6;
1036
1037    // Immutable configuration parameters.
1038    struct Parameters {
1039        enum Mode {
1040            MODE_POINTER,
1041            MODE_NAVIGATION,
1042        };
1043
1044        Mode mode;
1045        int32_t associatedDisplayId;
1046        bool orientationAware;
1047    } mParameters;
1048
1049    CursorButtonAccumulator mCursorButtonAccumulator;
1050    CursorMotionAccumulator mCursorMotionAccumulator;
1051    CursorScrollAccumulator mCursorScrollAccumulator;
1052
1053    int32_t mSource;
1054    float mXScale;
1055    float mYScale;
1056    float mXPrecision;
1057    float mYPrecision;
1058
1059    float mVWheelScale;
1060    float mHWheelScale;
1061
1062    // Velocity controls for mouse pointer and wheel movements.
1063    // The controls for X and Y wheel movements are separate to keep them decoupled.
1064    VelocityControl mPointerVelocityControl;
1065    VelocityControl mWheelXVelocityControl;
1066    VelocityControl mWheelYVelocityControl;
1067
1068    int32_t mOrientation;
1069
1070    sp<PointerControllerInterface> mPointerController;
1071
1072    int32_t mButtonState;
1073    nsecs_t mDownTime;
1074
1075    void configureParameters();
1076    void dumpParameters(String8& dump);
1077
1078    void sync(nsecs_t when);
1079};
1080
1081
1082class TouchInputMapper : public InputMapper {
1083public:
1084    TouchInputMapper(InputDevice* device);
1085    virtual ~TouchInputMapper();
1086
1087    virtual uint32_t getSources();
1088    virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
1089    virtual void dump(String8& dump);
1090    virtual void configure(nsecs_t when, const InputReaderConfiguration* config, uint32_t changes);
1091    virtual void reset(nsecs_t when);
1092    virtual void process(const RawEvent* rawEvent);
1093
1094    virtual int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode);
1095    virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode);
1096    virtual bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes,
1097            const int32_t* keyCodes, uint8_t* outFlags);
1098
1099    virtual void fadePointer();
1100    virtual void timeoutExpired(nsecs_t when);
1101
1102protected:
1103    CursorButtonAccumulator mCursorButtonAccumulator;
1104    CursorScrollAccumulator mCursorScrollAccumulator;
1105    TouchButtonAccumulator mTouchButtonAccumulator;
1106
1107    struct VirtualKey {
1108        int32_t keyCode;
1109        int32_t scanCode;
1110        uint32_t flags;
1111
1112        // computed hit box, specified in touch screen coords based on known display size
1113        int32_t hitLeft;
1114        int32_t hitTop;
1115        int32_t hitRight;
1116        int32_t hitBottom;
1117
1118        inline bool isHit(int32_t x, int32_t y) const {
1119            return x >= hitLeft && x <= hitRight && y >= hitTop && y <= hitBottom;
1120        }
1121    };
1122
1123    // Input sources and device mode.
1124    uint32_t mSource;
1125
1126    enum DeviceMode {
1127        DEVICE_MODE_DISABLED, // input is disabled
1128        DEVICE_MODE_DIRECT, // direct mapping (touchscreen)
1129        DEVICE_MODE_UNSCALED, // unscaled mapping (touchpad)
1130        DEVICE_MODE_POINTER, // pointer mapping (pointer)
1131    };
1132    DeviceMode mDeviceMode;
1133
1134    // The reader's configuration.
1135    InputReaderConfiguration mConfig;
1136
1137    // Immutable configuration parameters.
1138    struct Parameters {
1139        enum DeviceType {
1140            DEVICE_TYPE_TOUCH_SCREEN,
1141            DEVICE_TYPE_TOUCH_PAD,
1142            DEVICE_TYPE_POINTER,
1143        };
1144
1145        DeviceType deviceType;
1146        int32_t associatedDisplayId;
1147        bool associatedDisplayIsExternal;
1148        bool orientationAware;
1149
1150        enum GestureMode {
1151            GESTURE_MODE_POINTER,
1152            GESTURE_MODE_SPOTS,
1153        };
1154        GestureMode gestureMode;
1155    } mParameters;
1156
1157    // Immutable calibration parameters in parsed form.
1158    struct Calibration {
1159        // Size
1160        enum SizeCalibration {
1161            SIZE_CALIBRATION_DEFAULT,
1162            SIZE_CALIBRATION_NONE,
1163            SIZE_CALIBRATION_GEOMETRIC,
1164            SIZE_CALIBRATION_DIAMETER,
1165            SIZE_CALIBRATION_AREA,
1166        };
1167
1168        SizeCalibration sizeCalibration;
1169
1170        bool haveSizeScale;
1171        float sizeScale;
1172        bool haveSizeBias;
1173        float sizeBias;
1174        bool haveSizeIsSummed;
1175        bool sizeIsSummed;
1176
1177        // Pressure
1178        enum PressureCalibration {
1179            PRESSURE_CALIBRATION_DEFAULT,
1180            PRESSURE_CALIBRATION_NONE,
1181            PRESSURE_CALIBRATION_PHYSICAL,
1182            PRESSURE_CALIBRATION_AMPLITUDE,
1183        };
1184
1185        PressureCalibration pressureCalibration;
1186        bool havePressureScale;
1187        float pressureScale;
1188
1189        // Orientation
1190        enum OrientationCalibration {
1191            ORIENTATION_CALIBRATION_DEFAULT,
1192            ORIENTATION_CALIBRATION_NONE,
1193            ORIENTATION_CALIBRATION_INTERPOLATED,
1194            ORIENTATION_CALIBRATION_VECTOR,
1195        };
1196
1197        OrientationCalibration orientationCalibration;
1198
1199        // Distance
1200        enum DistanceCalibration {
1201            DISTANCE_CALIBRATION_DEFAULT,
1202            DISTANCE_CALIBRATION_NONE,
1203            DISTANCE_CALIBRATION_SCALED,
1204        };
1205
1206        DistanceCalibration distanceCalibration;
1207        bool haveDistanceScale;
1208        float distanceScale;
1209
1210        inline void applySizeScaleAndBias(float* outSize) const {
1211            if (haveSizeScale) {
1212                *outSize *= sizeScale;
1213            }
1214            if (haveSizeBias) {
1215                *outSize += sizeBias;
1216            }
1217        }
1218    } mCalibration;
1219
1220    // Raw pointer axis information from the driver.
1221    RawPointerAxes mRawPointerAxes;
1222
1223    // Raw pointer sample data.
1224    RawPointerData mCurrentRawPointerData;
1225    RawPointerData mLastRawPointerData;
1226
1227    // Cooked pointer sample data.
1228    CookedPointerData mCurrentCookedPointerData;
1229    CookedPointerData mLastCookedPointerData;
1230
1231    // Button state.
1232    int32_t mCurrentButtonState;
1233    int32_t mLastButtonState;
1234
1235    // Scroll state.
1236    int32_t mCurrentRawVScroll;
1237    int32_t mCurrentRawHScroll;
1238
1239    // Id bits used to differentiate fingers, stylus and mouse tools.
1240    BitSet32 mCurrentFingerIdBits; // finger or unknown
1241    BitSet32 mLastFingerIdBits;
1242    BitSet32 mCurrentStylusIdBits; // stylus or eraser
1243    BitSet32 mLastStylusIdBits;
1244    BitSet32 mCurrentMouseIdBits; // mouse or lens
1245    BitSet32 mLastMouseIdBits;
1246
1247    // True if we sent a HOVER_ENTER event.
1248    bool mSentHoverEnter;
1249
1250    // The time the primary pointer last went down.
1251    nsecs_t mDownTime;
1252
1253    // The pointer controller, or null if the device is not a pointer.
1254    sp<PointerControllerInterface> mPointerController;
1255
1256    Vector<VirtualKey> mVirtualKeys;
1257
1258    virtual void configureParameters();
1259    virtual void dumpParameters(String8& dump);
1260    virtual void configureRawPointerAxes();
1261    virtual void dumpRawPointerAxes(String8& dump);
1262    virtual void configureSurface(nsecs_t when, bool* outResetNeeded);
1263    virtual void dumpSurface(String8& dump);
1264    virtual void configureVirtualKeys();
1265    virtual void dumpVirtualKeys(String8& dump);
1266    virtual void parseCalibration();
1267    virtual void resolveCalibration();
1268    virtual void dumpCalibration(String8& dump);
1269    virtual bool hasStylus() const = 0;
1270
1271    virtual void syncTouch(nsecs_t when, bool* outHavePointerIds) = 0;
1272
1273private:
1274    // The surface orientation and width and height set by configureSurface().
1275    int32_t mSurfaceOrientation;
1276    int32_t mSurfaceWidth;
1277    int32_t mSurfaceHeight;
1278
1279    // The associated display orientation and width and height set by configureSurface().
1280    int32_t mAssociatedDisplayOrientation;
1281    int32_t mAssociatedDisplayWidth;
1282    int32_t mAssociatedDisplayHeight;
1283
1284    // Translation and scaling factors, orientation-independent.
1285    float mXScale;
1286    float mXPrecision;
1287
1288    float mYScale;
1289    float mYPrecision;
1290
1291    float mGeometricScale;
1292
1293    float mPressureScale;
1294
1295    float mSizeScale;
1296
1297    float mOrientationCenter;
1298    float mOrientationScale;
1299
1300    float mDistanceScale;
1301
1302    bool mHaveTilt;
1303    float mTiltXCenter;
1304    float mTiltXScale;
1305    float mTiltYCenter;
1306    float mTiltYScale;
1307
1308    // Oriented motion ranges for input device info.
1309    struct OrientedRanges {
1310        InputDeviceInfo::MotionRange x;
1311        InputDeviceInfo::MotionRange y;
1312        InputDeviceInfo::MotionRange pressure;
1313
1314        bool haveSize;
1315        InputDeviceInfo::MotionRange size;
1316
1317        bool haveTouchSize;
1318        InputDeviceInfo::MotionRange touchMajor;
1319        InputDeviceInfo::MotionRange touchMinor;
1320
1321        bool haveToolSize;
1322        InputDeviceInfo::MotionRange toolMajor;
1323        InputDeviceInfo::MotionRange toolMinor;
1324
1325        bool haveOrientation;
1326        InputDeviceInfo::MotionRange orientation;
1327
1328        bool haveDistance;
1329        InputDeviceInfo::MotionRange distance;
1330
1331        bool haveTilt;
1332        InputDeviceInfo::MotionRange tilt;
1333
1334        OrientedRanges() {
1335            clear();
1336        }
1337
1338        void clear() {
1339            haveSize = false;
1340            haveTouchSize = false;
1341            haveToolSize = false;
1342            haveOrientation = false;
1343            haveDistance = false;
1344            haveTilt = false;
1345        }
1346    } mOrientedRanges;
1347
1348    // Oriented dimensions and precision.
1349    float mOrientedSurfaceWidth;
1350    float mOrientedSurfaceHeight;
1351    float mOrientedXPrecision;
1352    float mOrientedYPrecision;
1353
1354    struct CurrentVirtualKeyState {
1355        bool down;
1356        bool ignored;
1357        nsecs_t downTime;
1358        int32_t keyCode;
1359        int32_t scanCode;
1360    } mCurrentVirtualKey;
1361
1362    // Scale factor for gesture or mouse based pointer movements.
1363    float mPointerXMovementScale;
1364    float mPointerYMovementScale;
1365
1366    // Scale factor for gesture based zooming and other freeform motions.
1367    float mPointerXZoomScale;
1368    float mPointerYZoomScale;
1369
1370    // The maximum swipe width.
1371    float mPointerGestureMaxSwipeWidth;
1372
1373    struct PointerDistanceHeapElement {
1374        uint32_t currentPointerIndex : 8;
1375        uint32_t lastPointerIndex : 8;
1376        uint64_t distance : 48; // squared distance
1377    };
1378
1379    enum PointerUsage {
1380        POINTER_USAGE_NONE,
1381        POINTER_USAGE_GESTURES,
1382        POINTER_USAGE_STYLUS,
1383        POINTER_USAGE_MOUSE,
1384    };
1385    PointerUsage mPointerUsage;
1386
1387    struct PointerGesture {
1388        enum Mode {
1389            // No fingers, button is not pressed.
1390            // Nothing happening.
1391            NEUTRAL,
1392
1393            // No fingers, button is not pressed.
1394            // Tap detected.
1395            // Emits DOWN and UP events at the pointer location.
1396            TAP,
1397
1398            // Exactly one finger dragging following a tap.
1399            // Pointer follows the active finger.
1400            // Emits DOWN, MOVE and UP events at the pointer location.
1401            //
1402            // Detect double-taps when the finger goes up while in TAP_DRAG mode.
1403            TAP_DRAG,
1404
1405            // Button is pressed.
1406            // Pointer follows the active finger if there is one.  Other fingers are ignored.
1407            // Emits DOWN, MOVE and UP events at the pointer location.
1408            BUTTON_CLICK_OR_DRAG,
1409
1410            // Exactly one finger, button is not pressed.
1411            // Pointer follows the active finger.
1412            // Emits HOVER_MOVE events at the pointer location.
1413            //
1414            // Detect taps when the finger goes up while in HOVER mode.
1415            HOVER,
1416
1417            // Exactly two fingers but neither have moved enough to clearly indicate
1418            // whether a swipe or freeform gesture was intended.  We consider the
1419            // pointer to be pressed so this enables clicking or long-pressing on buttons.
1420            // Pointer does not move.
1421            // Emits DOWN, MOVE and UP events with a single stationary pointer coordinate.
1422            PRESS,
1423
1424            // Exactly two fingers moving in the same direction, button is not pressed.
1425            // Pointer does not move.
1426            // Emits DOWN, MOVE and UP events with a single pointer coordinate that
1427            // follows the midpoint between both fingers.
1428            SWIPE,
1429
1430            // Two or more fingers moving in arbitrary directions, button is not pressed.
1431            // Pointer does not move.
1432            // Emits DOWN, POINTER_DOWN, MOVE, POINTER_UP and UP events that follow
1433            // each finger individually relative to the initial centroid of the finger.
1434            FREEFORM,
1435
1436            // Waiting for quiet time to end before starting the next gesture.
1437            QUIET,
1438        };
1439
1440        // Time the first finger went down.
1441        nsecs_t firstTouchTime;
1442
1443        // The active pointer id from the raw touch data.
1444        int32_t activeTouchId; // -1 if none
1445
1446        // The active pointer id from the gesture last delivered to the application.
1447        int32_t activeGestureId; // -1 if none
1448
1449        // Pointer coords and ids for the current and previous pointer gesture.
1450        Mode currentGestureMode;
1451        BitSet32 currentGestureIdBits;
1452        uint32_t currentGestureIdToIndex[MAX_POINTER_ID + 1];
1453        PointerProperties currentGestureProperties[MAX_POINTERS];
1454        PointerCoords currentGestureCoords[MAX_POINTERS];
1455
1456        Mode lastGestureMode;
1457        BitSet32 lastGestureIdBits;
1458        uint32_t lastGestureIdToIndex[MAX_POINTER_ID + 1];
1459        PointerProperties lastGestureProperties[MAX_POINTERS];
1460        PointerCoords lastGestureCoords[MAX_POINTERS];
1461
1462        // Time the pointer gesture last went down.
1463        nsecs_t downTime;
1464
1465        // Time when the pointer went down for a TAP.
1466        nsecs_t tapDownTime;
1467
1468        // Time when the pointer went up for a TAP.
1469        nsecs_t tapUpTime;
1470
1471        // Location of initial tap.
1472        float tapX, tapY;
1473
1474        // Time we started waiting for quiescence.
1475        nsecs_t quietTime;
1476
1477        // Reference points for multitouch gestures.
1478        float referenceTouchX;    // reference touch X/Y coordinates in surface units
1479        float referenceTouchY;
1480        float referenceGestureX;  // reference gesture X/Y coordinates in pixels
1481        float referenceGestureY;
1482
1483        // Distance that each pointer has traveled which has not yet been
1484        // subsumed into the reference gesture position.
1485        BitSet32 referenceIdBits;
1486        struct Delta {
1487            float dx, dy;
1488        };
1489        Delta referenceDeltas[MAX_POINTER_ID + 1];
1490
1491        // Describes how touch ids are mapped to gesture ids for freeform gestures.
1492        uint32_t freeformTouchToGestureIdMap[MAX_POINTER_ID + 1];
1493
1494        // A velocity tracker for determining whether to switch active pointers during drags.
1495        VelocityTracker velocityTracker;
1496
1497        void reset() {
1498            firstTouchTime = LLONG_MIN;
1499            activeTouchId = -1;
1500            activeGestureId = -1;
1501            currentGestureMode = NEUTRAL;
1502            currentGestureIdBits.clear();
1503            lastGestureMode = NEUTRAL;
1504            lastGestureIdBits.clear();
1505            downTime = 0;
1506            velocityTracker.clear();
1507            resetTap();
1508            resetQuietTime();
1509        }
1510
1511        void resetTap() {
1512            tapDownTime = LLONG_MIN;
1513            tapUpTime = LLONG_MIN;
1514        }
1515
1516        void resetQuietTime() {
1517            quietTime = LLONG_MIN;
1518        }
1519    } mPointerGesture;
1520
1521    struct PointerSimple {
1522        PointerCoords currentCoords;
1523        PointerProperties currentProperties;
1524        PointerCoords lastCoords;
1525        PointerProperties lastProperties;
1526
1527        // True if the pointer is down.
1528        bool down;
1529
1530        // True if the pointer is hovering.
1531        bool hovering;
1532
1533        // Time the pointer last went down.
1534        nsecs_t downTime;
1535
1536        void reset() {
1537            currentCoords.clear();
1538            currentProperties.clear();
1539            lastCoords.clear();
1540            lastProperties.clear();
1541            down = false;
1542            hovering = false;
1543            downTime = 0;
1544        }
1545    } mPointerSimple;
1546
1547    // The pointer and scroll velocity controls.
1548    VelocityControl mPointerVelocityControl;
1549    VelocityControl mWheelXVelocityControl;
1550    VelocityControl mWheelYVelocityControl;
1551
1552    void sync(nsecs_t when);
1553
1554    bool consumeRawTouches(nsecs_t when, uint32_t policyFlags);
1555    void dispatchVirtualKey(nsecs_t when, uint32_t policyFlags,
1556            int32_t keyEventAction, int32_t keyEventFlags);
1557
1558    void dispatchTouches(nsecs_t when, uint32_t policyFlags);
1559    void dispatchHoverExit(nsecs_t when, uint32_t policyFlags);
1560    void dispatchHoverEnterAndMove(nsecs_t when, uint32_t policyFlags);
1561    void cookPointerData();
1562
1563    void dispatchPointerUsage(nsecs_t when, uint32_t policyFlags, PointerUsage pointerUsage);
1564    void abortPointerUsage(nsecs_t when, uint32_t policyFlags);
1565
1566    void dispatchPointerGestures(nsecs_t when, uint32_t policyFlags, bool isTimeout);
1567    void abortPointerGestures(nsecs_t when, uint32_t policyFlags);
1568    bool preparePointerGestures(nsecs_t when,
1569            bool* outCancelPreviousGesture, bool* outFinishPreviousGesture,
1570            bool isTimeout);
1571
1572    void dispatchPointerStylus(nsecs_t when, uint32_t policyFlags);
1573    void abortPointerStylus(nsecs_t when, uint32_t policyFlags);
1574
1575    void dispatchPointerMouse(nsecs_t when, uint32_t policyFlags);
1576    void abortPointerMouse(nsecs_t when, uint32_t policyFlags);
1577
1578    void dispatchPointerSimple(nsecs_t when, uint32_t policyFlags,
1579            bool down, bool hovering);
1580    void abortPointerSimple(nsecs_t when, uint32_t policyFlags);
1581
1582    // Dispatches a motion event.
1583    // If the changedId is >= 0 and the action is POINTER_DOWN or POINTER_UP, the
1584    // method will take care of setting the index and transmuting the action to DOWN or UP
1585    // it is the first / last pointer to go down / up.
1586    void dispatchMotion(nsecs_t when, uint32_t policyFlags, uint32_t source,
1587            int32_t action, int32_t flags, int32_t metaState, int32_t buttonState,
1588            int32_t edgeFlags,
1589            const PointerProperties* properties, const PointerCoords* coords,
1590            const uint32_t* idToIndex, BitSet32 idBits,
1591            int32_t changedId, float xPrecision, float yPrecision, nsecs_t downTime);
1592
1593    // Updates pointer coords and properties for pointers with specified ids that have moved.
1594    // Returns true if any of them changed.
1595    bool updateMovedPointers(const PointerProperties* inProperties,
1596            const PointerCoords* inCoords, const uint32_t* inIdToIndex,
1597            PointerProperties* outProperties, PointerCoords* outCoords,
1598            const uint32_t* outIdToIndex, BitSet32 idBits) const;
1599
1600    bool isPointInsideSurface(int32_t x, int32_t y);
1601    const VirtualKey* findVirtualKeyHit(int32_t x, int32_t y);
1602
1603    void assignPointerIds();
1604};
1605
1606
1607class SingleTouchInputMapper : public TouchInputMapper {
1608public:
1609    SingleTouchInputMapper(InputDevice* device);
1610    virtual ~SingleTouchInputMapper();
1611
1612    virtual void reset(nsecs_t when);
1613    virtual void process(const RawEvent* rawEvent);
1614
1615protected:
1616    virtual void syncTouch(nsecs_t when, bool* outHavePointerIds);
1617    virtual void configureRawPointerAxes();
1618    virtual bool hasStylus() const;
1619
1620private:
1621    SingleTouchMotionAccumulator mSingleTouchMotionAccumulator;
1622};
1623
1624
1625class MultiTouchInputMapper : public TouchInputMapper {
1626public:
1627    MultiTouchInputMapper(InputDevice* device);
1628    virtual ~MultiTouchInputMapper();
1629
1630    virtual void reset(nsecs_t when);
1631    virtual void process(const RawEvent* rawEvent);
1632
1633protected:
1634    virtual void syncTouch(nsecs_t when, bool* outHavePointerIds);
1635    virtual void configureRawPointerAxes();
1636    virtual bool hasStylus() const;
1637
1638private:
1639    MultiTouchMotionAccumulator mMultiTouchMotionAccumulator;
1640
1641    // Specifies the pointer id bits that are in use, and their associated tracking id.
1642    BitSet32 mPointerIdBits;
1643    int32_t mPointerTrackingIdMap[MAX_POINTER_ID + 1];
1644};
1645
1646
1647class JoystickInputMapper : public InputMapper {
1648public:
1649    JoystickInputMapper(InputDevice* device);
1650    virtual ~JoystickInputMapper();
1651
1652    virtual uint32_t getSources();
1653    virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
1654    virtual void dump(String8& dump);
1655    virtual void configure(nsecs_t when, const InputReaderConfiguration* config, uint32_t changes);
1656    virtual void reset(nsecs_t when);
1657    virtual void process(const RawEvent* rawEvent);
1658
1659private:
1660    struct Axis {
1661        RawAbsoluteAxisInfo rawAxisInfo;
1662        AxisInfo axisInfo;
1663
1664        bool explicitlyMapped; // true if the axis was explicitly assigned an axis id
1665
1666        float scale;   // scale factor from raw to normalized values
1667        float offset;  // offset to add after scaling for normalization
1668        float highScale;  // scale factor from raw to normalized values of high split
1669        float highOffset; // offset to add after scaling for normalization of high split
1670
1671        float min;     // normalized inclusive minimum
1672        float max;     // normalized inclusive maximum
1673        float flat;    // normalized flat region size
1674        float fuzz;    // normalized error tolerance
1675
1676        float filter;  // filter out small variations of this size
1677        float currentValue; // current value
1678        float newValue; // most recent value
1679        float highCurrentValue; // current value of high split
1680        float highNewValue; // most recent value of high split
1681
1682        void initialize(const RawAbsoluteAxisInfo& rawAxisInfo, const AxisInfo& axisInfo,
1683                bool explicitlyMapped, float scale, float offset,
1684                float highScale, float highOffset,
1685                float min, float max, float flat, float fuzz) {
1686            this->rawAxisInfo = rawAxisInfo;
1687            this->axisInfo = axisInfo;
1688            this->explicitlyMapped = explicitlyMapped;
1689            this->scale = scale;
1690            this->offset = offset;
1691            this->highScale = highScale;
1692            this->highOffset = highOffset;
1693            this->min = min;
1694            this->max = max;
1695            this->flat = flat;
1696            this->fuzz = fuzz;
1697            this->filter = 0;
1698            resetValue();
1699        }
1700
1701        void resetValue() {
1702            this->currentValue = 0;
1703            this->newValue = 0;
1704            this->highCurrentValue = 0;
1705            this->highNewValue = 0;
1706        }
1707    };
1708
1709    // Axes indexed by raw ABS_* axis index.
1710    KeyedVector<int32_t, Axis> mAxes;
1711
1712    void sync(nsecs_t when, bool force);
1713
1714    bool haveAxis(int32_t axisId);
1715    void pruneAxes(bool ignoreExplicitlyMappedAxes);
1716    bool filterAxes(bool force);
1717
1718    static bool hasValueChangedSignificantly(float filter,
1719            float newValue, float currentValue, float min, float max);
1720    static bool hasMovedNearerToValueWithinFilteredRange(float filter,
1721            float newValue, float currentValue, float thresholdValue);
1722
1723    static bool isCenteredAxis(int32_t axis);
1724};
1725
1726} // namespace android
1727
1728#endif // _UI_INPUT_READER_H
1729