Input.h revision b93a03f841d93498bfea6cc92a22faa34bce1337
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 _ANDROIDFW_INPUT_H
18#define _ANDROIDFW_INPUT_H
19
20/**
21 * Native input event structures.
22 */
23
24#include <android/input.h>
25#include <utils/Vector.h>
26#include <utils/KeyedVector.h>
27#include <utils/Timers.h>
28#include <utils/RefBase.h>
29#include <utils/String8.h>
30#include <utils/BitSet.h>
31
32#ifdef HAVE_ANDROID_OS
33class SkMatrix;
34#endif
35
36/*
37 * Additional private constants not defined in ndk/ui/input.h.
38 */
39enum {
40    /* Private control to determine when an app is tracking a key sequence. */
41    AKEY_EVENT_FLAG_START_TRACKING = 0x40000000,
42
43    /* Key event is inconsistent with previously sent key events. */
44    AKEY_EVENT_FLAG_TAINTED = 0x80000000,
45};
46
47enum {
48    /* Motion event is inconsistent with previously sent motion events. */
49    AMOTION_EVENT_FLAG_TAINTED = 0x80000000,
50};
51
52enum {
53    /*
54     * Indicates that an input device has switches.
55     * This input source flag is hidden from the API because switches are only used by the system
56     * and applications have no way to interact with them.
57     */
58    AINPUT_SOURCE_SWITCH = 0x80000000,
59};
60
61/*
62 * SystemUiVisibility constants from View.
63 */
64enum {
65    ASYSTEM_UI_VISIBILITY_STATUS_BAR_VISIBLE = 0,
66    ASYSTEM_UI_VISIBILITY_STATUS_BAR_HIDDEN = 0x00000001,
67};
68
69/*
70 * Maximum number of pointers supported per motion event.
71 * Smallest number of pointers is 1.
72 * (We want at least 10 but some touch controllers obstensibly configured for 10 pointers
73 * will occasionally emit 11.  There is not much harm making this constant bigger.)
74 */
75#define MAX_POINTERS 16
76
77/*
78 * Maximum pointer id value supported in a motion event.
79 * Smallest pointer id is 0.
80 * (This is limited by our use of BitSet32 to track pointer assignments.)
81 */
82#define MAX_POINTER_ID 31
83
84/*
85 * Declare a concrete type for the NDK's input event forward declaration.
86 */
87struct AInputEvent {
88    virtual ~AInputEvent() { }
89};
90
91/*
92 * Declare a concrete type for the NDK's input device forward declaration.
93 */
94struct AInputDevice {
95    virtual ~AInputDevice() { }
96};
97
98
99namespace android {
100
101#ifdef HAVE_ANDROID_OS
102class Parcel;
103#endif
104
105/*
106 * Flags that flow alongside events in the input dispatch system to help with certain
107 * policy decisions such as waking from device sleep.
108 *
109 * These flags are also defined in frameworks/base/core/java/android/view/WindowManagerPolicy.java.
110 */
111enum {
112    /* These flags originate in RawEvents and are generally set in the key map.
113     * NOTE: If you edit these flags, also edit labels in KeycodeLabels.h. */
114
115    POLICY_FLAG_WAKE = 0x00000001,
116    POLICY_FLAG_WAKE_DROPPED = 0x00000002,
117    POLICY_FLAG_SHIFT = 0x00000004,
118    POLICY_FLAG_CAPS_LOCK = 0x00000008,
119    POLICY_FLAG_ALT = 0x00000010,
120    POLICY_FLAG_ALT_GR = 0x00000020,
121    POLICY_FLAG_MENU = 0x00000040,
122    POLICY_FLAG_LAUNCHER = 0x00000080,
123    POLICY_FLAG_VIRTUAL = 0x00000100,
124    POLICY_FLAG_FUNCTION = 0x00000200,
125
126    POLICY_FLAG_RAW_MASK = 0x0000ffff,
127
128    /* These flags are set by the input dispatcher. */
129
130    // Indicates that the input event was injected.
131    POLICY_FLAG_INJECTED = 0x01000000,
132
133    // Indicates that the input event is from a trusted source such as a directly attached
134    // input device or an application with system-wide event injection permission.
135    POLICY_FLAG_TRUSTED = 0x02000000,
136
137    // Indicates that the input event has passed through an input filter.
138    POLICY_FLAG_FILTERED = 0x04000000,
139
140    // Disables automatic key repeating behavior.
141    POLICY_FLAG_DISABLE_KEY_REPEAT = 0x08000000,
142
143    /* These flags are set by the input reader policy as it intercepts each event. */
144
145    // Indicates that the screen was off when the event was received and the event
146    // should wake the device.
147    POLICY_FLAG_WOKE_HERE = 0x10000000,
148
149    // Indicates that the screen was dim when the event was received and the event
150    // should brighten the device.
151    POLICY_FLAG_BRIGHT_HERE = 0x20000000,
152
153    // Indicates that the event should be dispatched to applications.
154    // The input event should still be sent to the InputDispatcher so that it can see all
155    // input events received include those that it will not deliver.
156    POLICY_FLAG_PASS_TO_USER = 0x40000000,
157};
158
159/*
160 * Describes the basic configuration of input devices that are present.
161 */
162struct InputConfiguration {
163    enum {
164        TOUCHSCREEN_UNDEFINED = 0,
165        TOUCHSCREEN_NOTOUCH = 1,
166        TOUCHSCREEN_STYLUS = 2,
167        TOUCHSCREEN_FINGER = 3
168    };
169
170    enum {
171        KEYBOARD_UNDEFINED = 0,
172        KEYBOARD_NOKEYS = 1,
173        KEYBOARD_QWERTY = 2,
174        KEYBOARD_12KEY = 3
175    };
176
177    enum {
178        NAVIGATION_UNDEFINED = 0,
179        NAVIGATION_NONAV = 1,
180        NAVIGATION_DPAD = 2,
181        NAVIGATION_TRACKBALL = 3,
182        NAVIGATION_WHEEL = 4
183    };
184
185    int32_t touchScreen;
186    int32_t keyboard;
187    int32_t navigation;
188};
189
190/*
191 * Pointer coordinate data.
192 */
193struct PointerCoords {
194    enum { MAX_AXES = 14 }; // 14 so that sizeof(PointerCoords) == 64
195
196    // Bitfield of axes that are present in this structure.
197    uint64_t bits;
198
199    // Values of axes that are stored in this structure packed in order by axis id
200    // for each axis that is present in the structure according to 'bits'.
201    float values[MAX_AXES];
202
203    inline void clear() {
204        bits = 0;
205    }
206
207    float getAxisValue(int32_t axis) const;
208    status_t setAxisValue(int32_t axis, float value);
209
210    void scale(float scale);
211
212    inline float getX() const {
213        return getAxisValue(AMOTION_EVENT_AXIS_X);
214    }
215
216    inline float getY() const {
217        return getAxisValue(AMOTION_EVENT_AXIS_Y);
218    }
219
220#ifdef HAVE_ANDROID_OS
221    status_t readFromParcel(Parcel* parcel);
222    status_t writeToParcel(Parcel* parcel) const;
223#endif
224
225    bool operator==(const PointerCoords& other) const;
226    inline bool operator!=(const PointerCoords& other) const {
227        return !(*this == other);
228    }
229
230    void copyFrom(const PointerCoords& other);
231
232private:
233    void tooManyAxes(int axis);
234};
235
236/*
237 * Pointer property data.
238 */
239struct PointerProperties {
240    // The id of the pointer.
241    int32_t id;
242
243    // The pointer tool type.
244    int32_t toolType;
245
246    inline void clear() {
247        id = -1;
248        toolType = 0;
249    }
250
251    bool operator==(const PointerProperties& other) const;
252    inline bool operator!=(const PointerProperties& other) const {
253        return !(*this == other);
254    }
255
256    void copyFrom(const PointerProperties& other);
257};
258
259/*
260 * Input events.
261 */
262class InputEvent : public AInputEvent {
263public:
264    virtual ~InputEvent() { }
265
266    virtual int32_t getType() const = 0;
267
268    inline int32_t getDeviceId() const { return mDeviceId; }
269
270    inline int32_t getSource() const { return mSource; }
271
272    inline void setSource(int32_t source) { mSource = source; }
273
274protected:
275    void initialize(int32_t deviceId, int32_t source);
276    void initialize(const InputEvent& from);
277
278    int32_t mDeviceId;
279    int32_t mSource;
280};
281
282/*
283 * Key events.
284 */
285class KeyEvent : public InputEvent {
286public:
287    virtual ~KeyEvent() { }
288
289    virtual int32_t getType() const { return AINPUT_EVENT_TYPE_KEY; }
290
291    inline int32_t getAction() const { return mAction; }
292
293    inline int32_t getFlags() const { return mFlags; }
294
295    inline int32_t getKeyCode() const { return mKeyCode; }
296
297    inline int32_t getScanCode() const { return mScanCode; }
298
299    inline int32_t getMetaState() const { return mMetaState; }
300
301    inline int32_t getRepeatCount() const { return mRepeatCount; }
302
303    inline nsecs_t getDownTime() const { return mDownTime; }
304
305    inline nsecs_t getEventTime() const { return mEventTime; }
306
307    // Return true if this event may have a default action implementation.
308    static bool hasDefaultAction(int32_t keyCode);
309    bool hasDefaultAction() const;
310
311    // Return true if this event represents a system key.
312    static bool isSystemKey(int32_t keyCode);
313    bool isSystemKey() const;
314
315    void initialize(
316            int32_t deviceId,
317            int32_t source,
318            int32_t action,
319            int32_t flags,
320            int32_t keyCode,
321            int32_t scanCode,
322            int32_t metaState,
323            int32_t repeatCount,
324            nsecs_t downTime,
325            nsecs_t eventTime);
326    void initialize(const KeyEvent& from);
327
328protected:
329    int32_t mAction;
330    int32_t mFlags;
331    int32_t mKeyCode;
332    int32_t mScanCode;
333    int32_t mMetaState;
334    int32_t mRepeatCount;
335    nsecs_t mDownTime;
336    nsecs_t mEventTime;
337};
338
339/*
340 * Motion events.
341 */
342class MotionEvent : public InputEvent {
343public:
344    virtual ~MotionEvent() { }
345
346    virtual int32_t getType() const { return AINPUT_EVENT_TYPE_MOTION; }
347
348    inline int32_t getAction() const { return mAction; }
349
350    inline int32_t getActionMasked() const { return mAction & AMOTION_EVENT_ACTION_MASK; }
351
352    inline int32_t getActionIndex() const {
353        return (mAction & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK)
354                >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
355    }
356
357    inline void setAction(int32_t action) { mAction = action; }
358
359    inline int32_t getFlags() const { return mFlags; }
360
361    inline void setFlags(int32_t flags) { mFlags = flags; }
362
363    inline int32_t getEdgeFlags() const { return mEdgeFlags; }
364
365    inline void setEdgeFlags(int32_t edgeFlags) { mEdgeFlags = edgeFlags; }
366
367    inline int32_t getMetaState() const { return mMetaState; }
368
369    inline void setMetaState(int32_t metaState) { mMetaState = metaState; }
370
371    inline int32_t getButtonState() const { return mButtonState; }
372
373    inline float getXOffset() const { return mXOffset; }
374
375    inline float getYOffset() const { return mYOffset; }
376
377    inline float getXPrecision() const { return mXPrecision; }
378
379    inline float getYPrecision() const { return mYPrecision; }
380
381    inline nsecs_t getDownTime() const { return mDownTime; }
382
383    inline void setDownTime(nsecs_t downTime) { mDownTime = downTime; }
384
385    inline size_t getPointerCount() const { return mPointerProperties.size(); }
386
387    inline const PointerProperties* getPointerProperties(size_t pointerIndex) const {
388        return &mPointerProperties[pointerIndex];
389    }
390
391    inline int32_t getPointerId(size_t pointerIndex) const {
392        return mPointerProperties[pointerIndex].id;
393    }
394
395    inline int32_t getToolType(size_t pointerIndex) const {
396        return mPointerProperties[pointerIndex].toolType;
397    }
398
399    inline nsecs_t getEventTime() const { return mSampleEventTimes[getHistorySize()]; }
400
401    const PointerCoords* getRawPointerCoords(size_t pointerIndex) const;
402
403    float getRawAxisValue(int32_t axis, size_t pointerIndex) const;
404
405    inline float getRawX(size_t pointerIndex) const {
406        return getRawAxisValue(AMOTION_EVENT_AXIS_X, pointerIndex);
407    }
408
409    inline float getRawY(size_t pointerIndex) const {
410        return getRawAxisValue(AMOTION_EVENT_AXIS_Y, pointerIndex);
411    }
412
413    float getAxisValue(int32_t axis, size_t pointerIndex) const;
414
415    inline float getX(size_t pointerIndex) const {
416        return getAxisValue(AMOTION_EVENT_AXIS_X, pointerIndex);
417    }
418
419    inline float getY(size_t pointerIndex) const {
420        return getAxisValue(AMOTION_EVENT_AXIS_Y, pointerIndex);
421    }
422
423    inline float getPressure(size_t pointerIndex) const {
424        return getAxisValue(AMOTION_EVENT_AXIS_PRESSURE, pointerIndex);
425    }
426
427    inline float getSize(size_t pointerIndex) const {
428        return getAxisValue(AMOTION_EVENT_AXIS_SIZE, pointerIndex);
429    }
430
431    inline float getTouchMajor(size_t pointerIndex) const {
432        return getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, pointerIndex);
433    }
434
435    inline float getTouchMinor(size_t pointerIndex) const {
436        return getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, pointerIndex);
437    }
438
439    inline float getToolMajor(size_t pointerIndex) const {
440        return getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, pointerIndex);
441    }
442
443    inline float getToolMinor(size_t pointerIndex) const {
444        return getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR, pointerIndex);
445    }
446
447    inline float getOrientation(size_t pointerIndex) const {
448        return getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, pointerIndex);
449    }
450
451    inline size_t getHistorySize() const { return mSampleEventTimes.size() - 1; }
452
453    inline nsecs_t getHistoricalEventTime(size_t historicalIndex) const {
454        return mSampleEventTimes[historicalIndex];
455    }
456
457    const PointerCoords* getHistoricalRawPointerCoords(
458            size_t pointerIndex, size_t historicalIndex) const;
459
460    float getHistoricalRawAxisValue(int32_t axis, size_t pointerIndex,
461            size_t historicalIndex) const;
462
463    inline float getHistoricalRawX(size_t pointerIndex, size_t historicalIndex) const {
464        return getHistoricalRawAxisValue(
465                AMOTION_EVENT_AXIS_X, pointerIndex, historicalIndex);
466    }
467
468    inline float getHistoricalRawY(size_t pointerIndex, size_t historicalIndex) const {
469        return getHistoricalRawAxisValue(
470                AMOTION_EVENT_AXIS_Y, pointerIndex, historicalIndex);
471    }
472
473    float getHistoricalAxisValue(int32_t axis, size_t pointerIndex, size_t historicalIndex) const;
474
475    inline float getHistoricalX(size_t pointerIndex, size_t historicalIndex) const {
476        return getHistoricalAxisValue(
477                AMOTION_EVENT_AXIS_X, pointerIndex, historicalIndex);
478    }
479
480    inline float getHistoricalY(size_t pointerIndex, size_t historicalIndex) const {
481        return getHistoricalAxisValue(
482                AMOTION_EVENT_AXIS_Y, pointerIndex, historicalIndex);
483    }
484
485    inline float getHistoricalPressure(size_t pointerIndex, size_t historicalIndex) const {
486        return getHistoricalAxisValue(
487                AMOTION_EVENT_AXIS_PRESSURE, pointerIndex, historicalIndex);
488    }
489
490    inline float getHistoricalSize(size_t pointerIndex, size_t historicalIndex) const {
491        return getHistoricalAxisValue(
492                AMOTION_EVENT_AXIS_SIZE, pointerIndex, historicalIndex);
493    }
494
495    inline float getHistoricalTouchMajor(size_t pointerIndex, size_t historicalIndex) const {
496        return getHistoricalAxisValue(
497                AMOTION_EVENT_AXIS_TOUCH_MAJOR, pointerIndex, historicalIndex);
498    }
499
500    inline float getHistoricalTouchMinor(size_t pointerIndex, size_t historicalIndex) const {
501        return getHistoricalAxisValue(
502                AMOTION_EVENT_AXIS_TOUCH_MINOR, pointerIndex, historicalIndex);
503    }
504
505    inline float getHistoricalToolMajor(size_t pointerIndex, size_t historicalIndex) const {
506        return getHistoricalAxisValue(
507                AMOTION_EVENT_AXIS_TOOL_MAJOR, pointerIndex, historicalIndex);
508    }
509
510    inline float getHistoricalToolMinor(size_t pointerIndex, size_t historicalIndex) const {
511        return getHistoricalAxisValue(
512                AMOTION_EVENT_AXIS_TOOL_MINOR, pointerIndex, historicalIndex);
513    }
514
515    inline float getHistoricalOrientation(size_t pointerIndex, size_t historicalIndex) const {
516        return getHistoricalAxisValue(
517                AMOTION_EVENT_AXIS_ORIENTATION, pointerIndex, historicalIndex);
518    }
519
520    ssize_t findPointerIndex(int32_t pointerId) const;
521
522    void initialize(
523            int32_t deviceId,
524            int32_t source,
525            int32_t action,
526            int32_t flags,
527            int32_t edgeFlags,
528            int32_t metaState,
529            int32_t buttonState,
530            float xOffset,
531            float yOffset,
532            float xPrecision,
533            float yPrecision,
534            nsecs_t downTime,
535            nsecs_t eventTime,
536            size_t pointerCount,
537            const PointerProperties* pointerProperties,
538            const PointerCoords* pointerCoords);
539
540    void copyFrom(const MotionEvent* other, bool keepHistory);
541
542    void addSample(
543            nsecs_t eventTime,
544            const PointerCoords* pointerCoords);
545
546    void offsetLocation(float xOffset, float yOffset);
547
548    void scale(float scaleFactor);
549
550#ifdef HAVE_ANDROID_OS
551    void transform(const SkMatrix* matrix);
552
553    status_t readFromParcel(Parcel* parcel);
554    status_t writeToParcel(Parcel* parcel) const;
555#endif
556
557    static bool isTouchEvent(int32_t source, int32_t action);
558    inline bool isTouchEvent() const {
559        return isTouchEvent(mSource, mAction);
560    }
561
562    // Low-level accessors.
563    inline const PointerProperties* getPointerProperties() const {
564        return mPointerProperties.array();
565    }
566    inline const nsecs_t* getSampleEventTimes() const { return mSampleEventTimes.array(); }
567    inline const PointerCoords* getSamplePointerCoords() const {
568            return mSamplePointerCoords.array();
569    }
570
571protected:
572    int32_t mAction;
573    int32_t mFlags;
574    int32_t mEdgeFlags;
575    int32_t mMetaState;
576    int32_t mButtonState;
577    float mXOffset;
578    float mYOffset;
579    float mXPrecision;
580    float mYPrecision;
581    nsecs_t mDownTime;
582    Vector<PointerProperties> mPointerProperties;
583    Vector<nsecs_t> mSampleEventTimes;
584    Vector<PointerCoords> mSamplePointerCoords;
585};
586
587/*
588 * Input event factory.
589 */
590class InputEventFactoryInterface {
591protected:
592    virtual ~InputEventFactoryInterface() { }
593
594public:
595    InputEventFactoryInterface() { }
596
597    virtual KeyEvent* createKeyEvent() = 0;
598    virtual MotionEvent* createMotionEvent() = 0;
599};
600
601/*
602 * A simple input event factory implementation that uses a single preallocated instance
603 * of each type of input event that are reused for each request.
604 */
605class PreallocatedInputEventFactory : public InputEventFactoryInterface {
606public:
607    PreallocatedInputEventFactory() { }
608    virtual ~PreallocatedInputEventFactory() { }
609
610    virtual KeyEvent* createKeyEvent() { return & mKeyEvent; }
611    virtual MotionEvent* createMotionEvent() { return & mMotionEvent; }
612
613private:
614    KeyEvent mKeyEvent;
615    MotionEvent mMotionEvent;
616};
617
618/*
619 * Calculates the velocity of pointer movements over time.
620 */
621class VelocityTracker {
622public:
623    // Default polynomial degree.  (used by getVelocity)
624    static const uint32_t DEFAULT_DEGREE = 2;
625
626    // Default sample horizon.  (used by getVelocity)
627    // We don't use too much history by default since we want to react to quick
628    // changes in direction.
629    static const nsecs_t DEFAULT_HORIZON = 100 * 1000000; // 100 ms
630
631    struct Position {
632        float x, y;
633    };
634
635    struct Estimator {
636        static const size_t MAX_DEGREE = 2;
637
638        // Polynomial coefficients describing motion in X and Y.
639        float xCoeff[MAX_DEGREE + 1], yCoeff[MAX_DEGREE + 1];
640
641        // Polynomial degree (number of coefficients), or zero if no information is
642        // available.
643        uint32_t degree;
644
645        // Confidence (coefficient of determination), between 0 (no fit) and 1 (perfect fit).
646        float confidence;
647
648        inline void clear() {
649            degree = 0;
650            confidence = 0;
651            for (size_t i = 0; i <= MAX_DEGREE; i++) {
652                xCoeff[i] = 0;
653                yCoeff[i] = 0;
654            }
655        }
656    };
657
658    VelocityTracker();
659
660    // Resets the velocity tracker state.
661    void clear();
662
663    // Resets the velocity tracker state for specific pointers.
664    // Call this method when some pointers have changed and may be reusing
665    // an id that was assigned to a different pointer earlier.
666    void clearPointers(BitSet32 idBits);
667
668    // Adds movement information for a set of pointers.
669    // The idBits bitfield specifies the pointer ids of the pointers whose positions
670    // are included in the movement.
671    // The positions array contains position information for each pointer in order by
672    // increasing id.  Its size should be equal to the number of one bits in idBits.
673    void addMovement(nsecs_t eventTime, BitSet32 idBits, const Position* positions);
674
675    // Adds movement information for all pointers in a MotionEvent, including historical samples.
676    void addMovement(const MotionEvent* event);
677
678    // Gets the velocity of the specified pointer id in position units per second.
679    // Returns false and sets the velocity components to zero if there is
680    // insufficient movement information for the pointer.
681    bool getVelocity(uint32_t id, float* outVx, float* outVy) const;
682
683    // Gets a quadratic estimator for the movements of the specified pointer id.
684    // Returns false and clears the estimator if there is no information available
685    // about the pointer.
686    bool getEstimator(uint32_t id, uint32_t degree, nsecs_t horizon,
687            Estimator* outEstimator) const;
688
689    // Gets the active pointer id, or -1 if none.
690    inline int32_t getActivePointerId() const { return mActivePointerId; }
691
692    // Gets a bitset containing all pointer ids from the most recent movement.
693    inline BitSet32 getCurrentPointerIdBits() const { return mMovements[mIndex].idBits; }
694
695private:
696    // Number of samples to keep.
697    static const uint32_t HISTORY_SIZE = 20;
698
699    struct Movement {
700        nsecs_t eventTime;
701        BitSet32 idBits;
702        Position positions[MAX_POINTERS];
703
704        inline const Position& getPosition(uint32_t id) const {
705            return positions[idBits.getIndexOfBit(id)];
706        }
707    };
708
709    uint32_t mIndex;
710    Movement mMovements[HISTORY_SIZE];
711    int32_t mActivePointerId;
712};
713
714
715/*
716 * Specifies parameters that govern pointer or wheel acceleration.
717 */
718struct VelocityControlParameters {
719    // A scale factor that is multiplied with the raw velocity deltas
720    // prior to applying any other velocity control factors.  The scale
721    // factor should be used to adapt the input device resolution
722    // (eg. counts per inch) to the output device resolution (eg. pixels per inch).
723    //
724    // Must be a positive value.
725    // Default is 1.0 (no scaling).
726    float scale;
727
728    // The scaled speed at which acceleration begins to be applied.
729    // This value establishes the upper bound of a low speed regime for
730    // small precise motions that are performed without any acceleration.
731    //
732    // Must be a non-negative value.
733    // Default is 0.0 (no low threshold).
734    float lowThreshold;
735
736    // The scaled speed at which maximum acceleration is applied.
737    // The difference between highThreshold and lowThreshold controls
738    // the range of speeds over which the acceleration factor is interpolated.
739    // The wider the range, the smoother the acceleration.
740    //
741    // Must be a non-negative value greater than or equal to lowThreshold.
742    // Default is 0.0 (no high threshold).
743    float highThreshold;
744
745    // The acceleration factor.
746    // When the speed is above the low speed threshold, the velocity will scaled
747    // by an interpolated value between 1.0 and this amount.
748    //
749    // Must be a positive greater than or equal to 1.0.
750    // Default is 1.0 (no acceleration).
751    float acceleration;
752
753    VelocityControlParameters() :
754            scale(1.0f), lowThreshold(0.0f), highThreshold(0.0f), acceleration(1.0f) {
755    }
756
757    VelocityControlParameters(float scale, float lowThreshold,
758            float highThreshold, float acceleration) :
759            scale(scale), lowThreshold(lowThreshold),
760            highThreshold(highThreshold), acceleration(acceleration) {
761    }
762};
763
764/*
765 * Implements mouse pointer and wheel speed control and acceleration.
766 */
767class VelocityControl {
768public:
769    VelocityControl();
770
771    /* Sets the various parameters. */
772    void setParameters(const VelocityControlParameters& parameters);
773
774    /* Resets the current movement counters to zero.
775     * This has the effect of nullifying any acceleration. */
776    void reset();
777
778    /* Translates a raw movement delta into an appropriately
779     * scaled / accelerated delta based on the current velocity. */
780    void move(nsecs_t eventTime, float* deltaX, float* deltaY);
781
782private:
783    // If no movements are received within this amount of time,
784    // we assume the movement has stopped and reset the movement counters.
785    static const nsecs_t STOP_TIME = 500 * 1000000; // 500 ms
786
787    VelocityControlParameters mParameters;
788
789    nsecs_t mLastMovementTime;
790    VelocityTracker::Position mRawPosition;
791    VelocityTracker mVelocityTracker;
792};
793
794
795/*
796 * Describes the characteristics and capabilities of an input device.
797 */
798class InputDeviceInfo {
799public:
800    InputDeviceInfo();
801    InputDeviceInfo(const InputDeviceInfo& other);
802    ~InputDeviceInfo();
803
804    struct MotionRange {
805        int32_t axis;
806        uint32_t source;
807        float min;
808        float max;
809        float flat;
810        float fuzz;
811    };
812
813    void initialize(int32_t id, const String8& name);
814
815    inline int32_t getId() const { return mId; }
816    inline const String8 getName() const { return mName; }
817    inline uint32_t getSources() const { return mSources; }
818
819    const MotionRange* getMotionRange(int32_t axis, uint32_t source) const;
820
821    void addSource(uint32_t source);
822    void addMotionRange(int32_t axis, uint32_t source,
823            float min, float max, float flat, float fuzz);
824    void addMotionRange(const MotionRange& range);
825
826    inline void setKeyboardType(int32_t keyboardType) { mKeyboardType = keyboardType; }
827    inline int32_t getKeyboardType() const { return mKeyboardType; }
828
829    inline void setKeyCharacterMapFile(const String8& value) { mKeyCharacterMapFile = value; }
830    inline const String8& getKeyCharacterMapFile() const { return mKeyCharacterMapFile; }
831
832    inline const Vector<MotionRange>& getMotionRanges() const {
833        return mMotionRanges;
834    }
835
836private:
837    int32_t mId;
838    String8 mName;
839    uint32_t mSources;
840    int32_t mKeyboardType;
841    String8 mKeyCharacterMapFile;
842
843    Vector<MotionRange> mMotionRanges;
844};
845
846/*
847 * Identifies a device.
848 */
849struct InputDeviceIdentifier {
850    inline InputDeviceIdentifier() :
851            bus(0), vendor(0), product(0), version(0) {
852    }
853
854    String8 name;
855    String8 location;
856    String8 uniqueId;
857    uint16_t bus;
858    uint16_t vendor;
859    uint16_t product;
860    uint16_t version;
861};
862
863/* Types of input device configuration files. */
864enum InputDeviceConfigurationFileType {
865    INPUT_DEVICE_CONFIGURATION_FILE_TYPE_CONFIGURATION = 0,     /* .idc file */
866    INPUT_DEVICE_CONFIGURATION_FILE_TYPE_KEY_LAYOUT = 1,        /* .kl file */
867    INPUT_DEVICE_CONFIGURATION_FILE_TYPE_KEY_CHARACTER_MAP = 2, /* .kcm file */
868};
869
870/*
871 * Gets the path of an input device configuration file, if one is available.
872 * Considers both system provided and user installed configuration files.
873 *
874 * The device identifier is used to construct several default configuration file
875 * names to try based on the device name, vendor, product, and version.
876 *
877 * Returns an empty string if not found.
878 */
879extern String8 getInputDeviceConfigurationFilePathByDeviceIdentifier(
880        const InputDeviceIdentifier& deviceIdentifier,
881        InputDeviceConfigurationFileType type);
882
883/*
884 * Gets the path of an input device configuration file, if one is available.
885 * Considers both system provided and user installed configuration files.
886 *
887 * The name is case-sensitive and is used to construct the filename to resolve.
888 * All characters except 'a'-'z', 'A'-'Z', '0'-'9', '-', and '_' are replaced by underscores.
889 *
890 * Returns an empty string if not found.
891 */
892extern String8 getInputDeviceConfigurationFilePathByName(
893        const String8& name, InputDeviceConfigurationFileType type);
894
895} // namespace android
896
897#endif // _ANDROIDFW_INPUT_H
898