• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef _UI_INPUT_H
18 #define _UI_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
33 class SkMatrix;
34 #endif
35 
36 /*
37  * Additional private constants not defined in ndk/ui/input.h.
38  */
39 enum {
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 
47 enum {
48     /* Motion event is inconsistent with previously sent motion events. */
49     AMOTION_EVENT_FLAG_TAINTED = 0x80000000,
50 };
51 
52 enum {
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  */
64 enum {
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  */
87 struct AInputEvent {
~AInputEventAInputEvent88     virtual ~AInputEvent() { }
89 };
90 
91 /*
92  * Declare a concrete type for the NDK's input device forward declaration.
93  */
94 struct AInputDevice {
~AInputDeviceAInputDevice95     virtual ~AInputDevice() { }
96 };
97 
98 
99 namespace android {
100 
101 #ifdef HAVE_ANDROID_OS
102 class 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  */
111 enum {
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  */
162 struct 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  */
193 struct 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 
clearPointerCoords203     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 
getXPointerCoords212     inline float getX() const {
213         return getAxisValue(AMOTION_EVENT_AXIS_X);
214     }
215 
getYPointerCoords216     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 
232 private:
233     void tooManyAxes(int axis);
234 };
235 
236 /*
237  * Pointer property data.
238  */
239 struct PointerProperties {
240     // The id of the pointer.
241     int32_t id;
242 
243     // The pointer tool type.
244     int32_t toolType;
245 
clearPointerProperties246     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  */
262 class InputEvent : public AInputEvent {
263 public:
~InputEvent()264     virtual ~InputEvent() { }
265 
266     virtual int32_t getType() const = 0;
267 
getDeviceId()268     inline int32_t getDeviceId() const { return mDeviceId; }
269 
getSource()270     inline int32_t getSource() const { return mSource; }
271 
setSource(int32_t source)272     inline void setSource(int32_t source) { mSource = source; }
273 
274 protected:
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  */
285 class KeyEvent : public InputEvent {
286 public:
~KeyEvent()287     virtual ~KeyEvent() { }
288 
getType()289     virtual int32_t getType() const { return AINPUT_EVENT_TYPE_KEY; }
290 
getAction()291     inline int32_t getAction() const { return mAction; }
292 
getFlags()293     inline int32_t getFlags() const { return mFlags; }
294 
getKeyCode()295     inline int32_t getKeyCode() const { return mKeyCode; }
296 
getScanCode()297     inline int32_t getScanCode() const { return mScanCode; }
298 
getMetaState()299     inline int32_t getMetaState() const { return mMetaState; }
300 
getRepeatCount()301     inline int32_t getRepeatCount() const { return mRepeatCount; }
302 
getDownTime()303     inline nsecs_t getDownTime() const { return mDownTime; }
304 
getEventTime()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 
328 protected:
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  */
342 class MotionEvent : public InputEvent {
343 public:
~MotionEvent()344     virtual ~MotionEvent() { }
345 
getType()346     virtual int32_t getType() const { return AINPUT_EVENT_TYPE_MOTION; }
347 
getAction()348     inline int32_t getAction() const { return mAction; }
349 
getActionMasked()350     inline int32_t getActionMasked() const { return mAction & AMOTION_EVENT_ACTION_MASK; }
351 
getActionIndex()352     inline int32_t getActionIndex() const {
353         return (mAction & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK)
354                 >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
355     }
356 
setAction(int32_t action)357     inline void setAction(int32_t action) { mAction = action; }
358 
getFlags()359     inline int32_t getFlags() const { return mFlags; }
360 
setFlags(int32_t flags)361     inline void setFlags(int32_t flags) { mFlags = flags; }
362 
getEdgeFlags()363     inline int32_t getEdgeFlags() const { return mEdgeFlags; }
364 
setEdgeFlags(int32_t edgeFlags)365     inline void setEdgeFlags(int32_t edgeFlags) { mEdgeFlags = edgeFlags; }
366 
getMetaState()367     inline int32_t getMetaState() const { return mMetaState; }
368 
setMetaState(int32_t metaState)369     inline void setMetaState(int32_t metaState) { mMetaState = metaState; }
370 
getButtonState()371     inline int32_t getButtonState() const { return mButtonState; }
372 
getXOffset()373     inline float getXOffset() const { return mXOffset; }
374 
getYOffset()375     inline float getYOffset() const { return mYOffset; }
376 
getXPrecision()377     inline float getXPrecision() const { return mXPrecision; }
378 
getYPrecision()379     inline float getYPrecision() const { return mYPrecision; }
380 
getDownTime()381     inline nsecs_t getDownTime() const { return mDownTime; }
382 
setDownTime(nsecs_t downTime)383     inline void setDownTime(nsecs_t downTime) { mDownTime = downTime; }
384 
getPointerCount()385     inline size_t getPointerCount() const { return mPointerProperties.size(); }
386 
getPointerProperties(size_t pointerIndex)387     inline const PointerProperties* getPointerProperties(size_t pointerIndex) const {
388         return &mPointerProperties[pointerIndex];
389     }
390 
getPointerId(size_t pointerIndex)391     inline int32_t getPointerId(size_t pointerIndex) const {
392         return mPointerProperties[pointerIndex].id;
393     }
394 
getToolType(size_t pointerIndex)395     inline int32_t getToolType(size_t pointerIndex) const {
396         return mPointerProperties[pointerIndex].toolType;
397     }
398 
getEventTime()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 
getRawX(size_t pointerIndex)405     inline float getRawX(size_t pointerIndex) const {
406         return getRawAxisValue(AMOTION_EVENT_AXIS_X, pointerIndex);
407     }
408 
getRawY(size_t pointerIndex)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 
getX(size_t pointerIndex)415     inline float getX(size_t pointerIndex) const {
416         return getAxisValue(AMOTION_EVENT_AXIS_X, pointerIndex);
417     }
418 
getY(size_t pointerIndex)419     inline float getY(size_t pointerIndex) const {
420         return getAxisValue(AMOTION_EVENT_AXIS_Y, pointerIndex);
421     }
422 
getPressure(size_t pointerIndex)423     inline float getPressure(size_t pointerIndex) const {
424         return getAxisValue(AMOTION_EVENT_AXIS_PRESSURE, pointerIndex);
425     }
426 
getSize(size_t pointerIndex)427     inline float getSize(size_t pointerIndex) const {
428         return getAxisValue(AMOTION_EVENT_AXIS_SIZE, pointerIndex);
429     }
430 
getTouchMajor(size_t pointerIndex)431     inline float getTouchMajor(size_t pointerIndex) const {
432         return getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, pointerIndex);
433     }
434 
getTouchMinor(size_t pointerIndex)435     inline float getTouchMinor(size_t pointerIndex) const {
436         return getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, pointerIndex);
437     }
438 
getToolMajor(size_t pointerIndex)439     inline float getToolMajor(size_t pointerIndex) const {
440         return getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, pointerIndex);
441     }
442 
getToolMinor(size_t pointerIndex)443     inline float getToolMinor(size_t pointerIndex) const {
444         return getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR, pointerIndex);
445     }
446 
getOrientation(size_t pointerIndex)447     inline float getOrientation(size_t pointerIndex) const {
448         return getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, pointerIndex);
449     }
450 
getHistorySize()451     inline size_t getHistorySize() const { return mSampleEventTimes.size() - 1; }
452 
getHistoricalEventTime(size_t historicalIndex)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 
getHistoricalRawX(size_t pointerIndex,size_t historicalIndex)463     inline float getHistoricalRawX(size_t pointerIndex, size_t historicalIndex) const {
464         return getHistoricalRawAxisValue(
465                 AMOTION_EVENT_AXIS_X, pointerIndex, historicalIndex);
466     }
467 
getHistoricalRawY(size_t pointerIndex,size_t historicalIndex)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 
getHistoricalX(size_t pointerIndex,size_t historicalIndex)475     inline float getHistoricalX(size_t pointerIndex, size_t historicalIndex) const {
476         return getHistoricalAxisValue(
477                 AMOTION_EVENT_AXIS_X, pointerIndex, historicalIndex);
478     }
479 
getHistoricalY(size_t pointerIndex,size_t historicalIndex)480     inline float getHistoricalY(size_t pointerIndex, size_t historicalIndex) const {
481         return getHistoricalAxisValue(
482                 AMOTION_EVENT_AXIS_Y, pointerIndex, historicalIndex);
483     }
484 
getHistoricalPressure(size_t pointerIndex,size_t historicalIndex)485     inline float getHistoricalPressure(size_t pointerIndex, size_t historicalIndex) const {
486         return getHistoricalAxisValue(
487                 AMOTION_EVENT_AXIS_PRESSURE, pointerIndex, historicalIndex);
488     }
489 
getHistoricalSize(size_t pointerIndex,size_t historicalIndex)490     inline float getHistoricalSize(size_t pointerIndex, size_t historicalIndex) const {
491         return getHistoricalAxisValue(
492                 AMOTION_EVENT_AXIS_SIZE, pointerIndex, historicalIndex);
493     }
494 
getHistoricalTouchMajor(size_t pointerIndex,size_t historicalIndex)495     inline float getHistoricalTouchMajor(size_t pointerIndex, size_t historicalIndex) const {
496         return getHistoricalAxisValue(
497                 AMOTION_EVENT_AXIS_TOUCH_MAJOR, pointerIndex, historicalIndex);
498     }
499 
getHistoricalTouchMinor(size_t pointerIndex,size_t historicalIndex)500     inline float getHistoricalTouchMinor(size_t pointerIndex, size_t historicalIndex) const {
501         return getHistoricalAxisValue(
502                 AMOTION_EVENT_AXIS_TOUCH_MINOR, pointerIndex, historicalIndex);
503     }
504 
getHistoricalToolMajor(size_t pointerIndex,size_t historicalIndex)505     inline float getHistoricalToolMajor(size_t pointerIndex, size_t historicalIndex) const {
506         return getHistoricalAxisValue(
507                 AMOTION_EVENT_AXIS_TOOL_MAJOR, pointerIndex, historicalIndex);
508     }
509 
getHistoricalToolMinor(size_t pointerIndex,size_t historicalIndex)510     inline float getHistoricalToolMinor(size_t pointerIndex, size_t historicalIndex) const {
511         return getHistoricalAxisValue(
512                 AMOTION_EVENT_AXIS_TOOL_MINOR, pointerIndex, historicalIndex);
513     }
514 
getHistoricalOrientation(size_t pointerIndex,size_t historicalIndex)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);
isTouchEvent()558     inline bool isTouchEvent() const {
559         return isTouchEvent(mSource, mAction);
560     }
561 
562     // Low-level accessors.
getPointerProperties()563     inline const PointerProperties* getPointerProperties() const {
564         return mPointerProperties.array();
565     }
getSampleEventTimes()566     inline const nsecs_t* getSampleEventTimes() const { return mSampleEventTimes.array(); }
getSamplePointerCoords()567     inline const PointerCoords* getSamplePointerCoords() const {
568             return mSamplePointerCoords.array();
569     }
570 
571 protected:
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  */
590 class InputEventFactoryInterface {
591 protected:
~InputEventFactoryInterface()592     virtual ~InputEventFactoryInterface() { }
593 
594 public:
InputEventFactoryInterface()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  */
605 class PreallocatedInputEventFactory : public InputEventFactoryInterface {
606 public:
PreallocatedInputEventFactory()607     PreallocatedInputEventFactory() { }
~PreallocatedInputEventFactory()608     virtual ~PreallocatedInputEventFactory() { }
609 
createKeyEvent()610     virtual KeyEvent* createKeyEvent() { return & mKeyEvent; }
createMotionEvent()611     virtual MotionEvent* createMotionEvent() { return & mMotionEvent; }
612 
613 private:
614     KeyEvent mKeyEvent;
615     MotionEvent mMotionEvent;
616 };
617 
618 /*
619  * Calculates the velocity of pointer movements over time.
620  */
621 class VelocityTracker {
622 public:
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 
clearEstimator648         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.
getActivePointerId()690     inline int32_t getActivePointerId() const { return mActivePointerId; }
691 
692     // Gets a bitset containing all pointer ids from the most recent movement.
getCurrentPointerIdBits()693     inline BitSet32 getCurrentPointerIdBits() const { return mMovements[mIndex].idBits; }
694 
695 private:
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 
getPositionMovement704         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  */
718 struct 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 
VelocityControlParametersVelocityControlParameters753     VelocityControlParameters() :
754             scale(1.0f), lowThreshold(0.0f), highThreshold(0.0f), acceleration(1.0f) {
755     }
756 
VelocityControlParametersVelocityControlParameters757     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  */
767 class VelocityControl {
768 public:
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 
782 private:
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  */
798 class InputDeviceInfo {
799 public:
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 
getId()815     inline int32_t getId() const { return mId; }
getName()816     inline const String8 getName() const { return mName; }
getSources()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 
setKeyboardType(int32_t keyboardType)826     inline void setKeyboardType(int32_t keyboardType) { mKeyboardType = keyboardType; }
getKeyboardType()827     inline int32_t getKeyboardType() const { return mKeyboardType; }
828 
getMotionRanges()829     inline const Vector<MotionRange>& getMotionRanges() const {
830         return mMotionRanges;
831     }
832 
833 private:
834     int32_t mId;
835     String8 mName;
836     uint32_t mSources;
837     int32_t mKeyboardType;
838 
839     Vector<MotionRange> mMotionRanges;
840 };
841 
842 /*
843  * Identifies a device.
844  */
845 struct InputDeviceIdentifier {
InputDeviceIdentifierInputDeviceIdentifier846     inline InputDeviceIdentifier() :
847             bus(0), vendor(0), product(0), version(0) {
848     }
849 
850     String8 name;
851     String8 location;
852     String8 uniqueId;
853     uint16_t bus;
854     uint16_t vendor;
855     uint16_t product;
856     uint16_t version;
857 };
858 
859 /* Types of input device configuration files. */
860 enum InputDeviceConfigurationFileType {
861     INPUT_DEVICE_CONFIGURATION_FILE_TYPE_CONFIGURATION = 0,     /* .idc file */
862     INPUT_DEVICE_CONFIGURATION_FILE_TYPE_KEY_LAYOUT = 1,        /* .kl file */
863     INPUT_DEVICE_CONFIGURATION_FILE_TYPE_KEY_CHARACTER_MAP = 2, /* .kcm file */
864 };
865 
866 /*
867  * Gets the path of an input device configuration file, if one is available.
868  * Considers both system provided and user installed configuration files.
869  *
870  * The device identifier is used to construct several default configuration file
871  * names to try based on the device name, vendor, product, and version.
872  *
873  * Returns an empty string if not found.
874  */
875 extern String8 getInputDeviceConfigurationFilePathByDeviceIdentifier(
876         const InputDeviceIdentifier& deviceIdentifier,
877         InputDeviceConfigurationFileType type);
878 
879 /*
880  * Gets the path of an input device configuration file, if one is available.
881  * Considers both system provided and user installed configuration files.
882  *
883  * The name is case-sensitive and is used to construct the filename to resolve.
884  * All characters except 'a'-'z', 'A'-'Z', '0'-'9', '-', and '_' are replaced by underscores.
885  *
886  * Returns an empty string if not found.
887  */
888 extern String8 getInputDeviceConfigurationFilePathByName(
889         const String8& name, InputDeviceConfigurationFileType type);
890 
891 } // namespace android
892 
893 #endif // _UI_INPUT_H
894