Home | History | Annotate | Download | only in ui
      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 
     31 /*
     32  * Additional private constants not defined in ndk/ui/input.h.
     33  */
     34 enum {
     35     /*
     36      * Private control to determine when an app is tracking a key sequence.
     37      */
     38     AKEY_EVENT_FLAG_START_TRACKING = 0x40000000
     39 };
     40 
     41 /*
     42  * Maximum number of pointers supported per motion event.
     43  * Smallest number of pointers is 1.
     44  */
     45 #define MAX_POINTERS 10
     46 
     47 /*
     48  * Maximum pointer id value supported in a motion event.
     49  * Smallest pointer id is 0.
     50  * (This is limited by our use of BitSet32 to track pointer assignments.)
     51  */
     52 #define MAX_POINTER_ID 31
     53 
     54 /*
     55  * Declare a concrete type for the NDK's input event forward declaration.
     56  */
     57 struct AInputEvent {
     58     virtual ~AInputEvent() { }
     59 };
     60 
     61 /*
     62  * Declare a concrete type for the NDK's input device forward declaration.
     63  */
     64 struct AInputDevice {
     65     virtual ~AInputDevice() { }
     66 };
     67 
     68 
     69 namespace android {
     70 
     71 /*
     72  * Flags that flow alongside events in the input dispatch system to help with certain
     73  * policy decisions such as waking from device sleep.
     74  *
     75  * These flags are also defined in frameworks/base/core/java/android/view/WindowManagerPolicy.java.
     76  */
     77 enum {
     78     /* These flags originate in RawEvents and are generally set in the key map.
     79      * See also labels for policy flags in KeycodeLabels.h. */
     80 
     81     POLICY_FLAG_WAKE = 0x00000001,
     82     POLICY_FLAG_WAKE_DROPPED = 0x00000002,
     83     POLICY_FLAG_SHIFT = 0x00000004,
     84     POLICY_FLAG_CAPS_LOCK = 0x00000008,
     85     POLICY_FLAG_ALT = 0x00000010,
     86     POLICY_FLAG_ALT_GR = 0x00000020,
     87     POLICY_FLAG_MENU = 0x00000040,
     88     POLICY_FLAG_LAUNCHER = 0x00000080,
     89     POLICY_FLAG_VIRTUAL = 0x00000100,
     90 
     91     POLICY_FLAG_RAW_MASK = 0x0000ffff,
     92 
     93     /* These flags are set by the input dispatcher. */
     94 
     95     // Indicates that the input event was injected.
     96     POLICY_FLAG_INJECTED = 0x01000000,
     97 
     98     // Indicates that the input event is from a trusted source such as a directly attached
     99     // input device or an application with system-wide event injection permission.
    100     POLICY_FLAG_TRUSTED = 0x02000000,
    101 
    102     /* These flags are set by the input reader policy as it intercepts each event. */
    103 
    104     // Indicates that the screen was off when the event was received and the event
    105     // should wake the device.
    106     POLICY_FLAG_WOKE_HERE = 0x10000000,
    107 
    108     // Indicates that the screen was dim when the event was received and the event
    109     // should brighten the device.
    110     POLICY_FLAG_BRIGHT_HERE = 0x20000000,
    111 
    112     // Indicates that the event should be dispatched to applications.
    113     // The input event should still be sent to the InputDispatcher so that it can see all
    114     // input events received include those that it will not deliver.
    115     POLICY_FLAG_PASS_TO_USER = 0x40000000,
    116 };
    117 
    118 /*
    119  * Describes the basic configuration of input devices that are present.
    120  */
    121 struct InputConfiguration {
    122     enum {
    123         TOUCHSCREEN_UNDEFINED = 0,
    124         TOUCHSCREEN_NOTOUCH = 1,
    125         TOUCHSCREEN_STYLUS = 2,
    126         TOUCHSCREEN_FINGER = 3
    127     };
    128 
    129     enum {
    130         KEYBOARD_UNDEFINED = 0,
    131         KEYBOARD_NOKEYS = 1,
    132         KEYBOARD_QWERTY = 2,
    133         KEYBOARD_12KEY = 3
    134     };
    135 
    136     enum {
    137         NAVIGATION_UNDEFINED = 0,
    138         NAVIGATION_NONAV = 1,
    139         NAVIGATION_DPAD = 2,
    140         NAVIGATION_TRACKBALL = 3,
    141         NAVIGATION_WHEEL = 4
    142     };
    143 
    144     int32_t touchScreen;
    145     int32_t keyboard;
    146     int32_t navigation;
    147 };
    148 
    149 /*
    150  * Pointer coordinate data.
    151  */
    152 struct PointerCoords {
    153     float x;
    154     float y;
    155     float pressure;
    156     float size;
    157     float touchMajor;
    158     float touchMinor;
    159     float toolMajor;
    160     float toolMinor;
    161     float orientation;
    162 };
    163 
    164 /*
    165  * Input events.
    166  */
    167 class InputEvent : public AInputEvent {
    168 public:
    169     virtual ~InputEvent() { }
    170 
    171     virtual int32_t getType() const = 0;
    172 
    173     inline int32_t getDeviceId() const { return mDeviceId; }
    174 
    175     inline int32_t getSource() const { return mSource; }
    176 
    177 protected:
    178     void initialize(int32_t deviceId, int32_t source);
    179     void initialize(const InputEvent& from);
    180 
    181 private:
    182     int32_t mDeviceId;
    183     int32_t mSource;
    184 };
    185 
    186 /*
    187  * Key events.
    188  */
    189 class KeyEvent : public InputEvent {
    190 public:
    191     virtual ~KeyEvent() { }
    192 
    193     virtual int32_t getType() const { return AINPUT_EVENT_TYPE_KEY; }
    194 
    195     inline int32_t getAction() const { return mAction; }
    196 
    197     inline int32_t getFlags() const { return mFlags; }
    198 
    199     inline int32_t getKeyCode() const { return mKeyCode; }
    200 
    201     inline int32_t getScanCode() const { return mScanCode; }
    202 
    203     inline int32_t getMetaState() const { return mMetaState; }
    204 
    205     inline int32_t getRepeatCount() const { return mRepeatCount; }
    206 
    207     inline nsecs_t getDownTime() const { return mDownTime; }
    208 
    209     inline nsecs_t getEventTime() const { return mEventTime; }
    210 
    211     // Return true if this event may have a default action implementation.
    212     static bool hasDefaultAction(int32_t keyCode);
    213     bool hasDefaultAction() const;
    214 
    215     // Return true if this event represents a system key.
    216     static bool isSystemKey(int32_t keyCode);
    217     bool isSystemKey() const;
    218 
    219     void initialize(
    220             int32_t deviceId,
    221             int32_t source,
    222             int32_t action,
    223             int32_t flags,
    224             int32_t keyCode,
    225             int32_t scanCode,
    226             int32_t metaState,
    227             int32_t repeatCount,
    228             nsecs_t downTime,
    229             nsecs_t eventTime);
    230     void initialize(const KeyEvent& from);
    231 
    232 private:
    233     int32_t mAction;
    234     int32_t mFlags;
    235     int32_t mKeyCode;
    236     int32_t mScanCode;
    237     int32_t mMetaState;
    238     int32_t mRepeatCount;
    239     nsecs_t mDownTime;
    240     nsecs_t mEventTime;
    241 };
    242 
    243 /*
    244  * Motion events.
    245  */
    246 class MotionEvent : public InputEvent {
    247 public:
    248     virtual ~MotionEvent() { }
    249 
    250     virtual int32_t getType() const { return AINPUT_EVENT_TYPE_MOTION; }
    251 
    252     inline int32_t getAction() const { return mAction; }
    253 
    254     inline int32_t getFlags() const { return mFlags; }
    255 
    256     inline int32_t getEdgeFlags() const { return mEdgeFlags; }
    257 
    258     inline int32_t getMetaState() const { return mMetaState; }
    259 
    260     inline float getXOffset() const { return mXOffset; }
    261 
    262     inline float getYOffset() const { return mYOffset; }
    263 
    264     inline float getXPrecision() const { return mXPrecision; }
    265 
    266     inline float getYPrecision() const { return mYPrecision; }
    267 
    268     inline nsecs_t getDownTime() const { return mDownTime; }
    269 
    270     inline size_t getPointerCount() const { return mPointerIds.size(); }
    271 
    272     inline int32_t getPointerId(size_t pointerIndex) const { return mPointerIds[pointerIndex]; }
    273 
    274     inline nsecs_t getEventTime() const { return mSampleEventTimes[getHistorySize()]; }
    275 
    276     inline float getRawX(size_t pointerIndex) const {
    277         return getCurrentPointerCoords(pointerIndex).x;
    278     }
    279 
    280     inline float getRawY(size_t pointerIndex) const {
    281         return getCurrentPointerCoords(pointerIndex).y;
    282     }
    283 
    284     inline float getX(size_t pointerIndex) const {
    285         return getRawX(pointerIndex) + mXOffset;
    286     }
    287 
    288     inline float getY(size_t pointerIndex) const {
    289         return getRawY(pointerIndex) + mYOffset;
    290     }
    291 
    292     inline float getPressure(size_t pointerIndex) const {
    293         return getCurrentPointerCoords(pointerIndex).pressure;
    294     }
    295 
    296     inline float getSize(size_t pointerIndex) const {
    297         return getCurrentPointerCoords(pointerIndex).size;
    298     }
    299 
    300     inline float getTouchMajor(size_t pointerIndex) const {
    301         return getCurrentPointerCoords(pointerIndex).touchMajor;
    302     }
    303 
    304     inline float getTouchMinor(size_t pointerIndex) const {
    305         return getCurrentPointerCoords(pointerIndex).touchMinor;
    306     }
    307 
    308     inline float getToolMajor(size_t pointerIndex) const {
    309         return getCurrentPointerCoords(pointerIndex).toolMajor;
    310     }
    311 
    312     inline float getToolMinor(size_t pointerIndex) const {
    313         return getCurrentPointerCoords(pointerIndex).toolMinor;
    314     }
    315 
    316     inline float getOrientation(size_t pointerIndex) const {
    317         return getCurrentPointerCoords(pointerIndex).orientation;
    318     }
    319 
    320     inline size_t getHistorySize() const { return mSampleEventTimes.size() - 1; }
    321 
    322     inline nsecs_t getHistoricalEventTime(size_t historicalIndex) const {
    323         return mSampleEventTimes[historicalIndex];
    324     }
    325 
    326     inline float getHistoricalRawX(size_t pointerIndex, size_t historicalIndex) const {
    327         return getHistoricalPointerCoords(pointerIndex, historicalIndex).x;
    328     }
    329 
    330     inline float getHistoricalRawY(size_t pointerIndex, size_t historicalIndex) const {
    331         return getHistoricalPointerCoords(pointerIndex, historicalIndex).y;
    332     }
    333 
    334     inline float getHistoricalX(size_t pointerIndex, size_t historicalIndex) const {
    335         return getHistoricalRawX(pointerIndex, historicalIndex) + mXOffset;
    336     }
    337 
    338     inline float getHistoricalY(size_t pointerIndex, size_t historicalIndex) const {
    339         return getHistoricalRawY(pointerIndex, historicalIndex) + mYOffset;
    340     }
    341 
    342     inline float getHistoricalPressure(size_t pointerIndex, size_t historicalIndex) const {
    343         return getHistoricalPointerCoords(pointerIndex, historicalIndex).pressure;
    344     }
    345 
    346     inline float getHistoricalSize(size_t pointerIndex, size_t historicalIndex) const {
    347         return getHistoricalPointerCoords(pointerIndex, historicalIndex).size;
    348     }
    349 
    350     inline float getHistoricalTouchMajor(size_t pointerIndex, size_t historicalIndex) const {
    351         return getHistoricalPointerCoords(pointerIndex, historicalIndex).touchMajor;
    352     }
    353 
    354     inline float getHistoricalTouchMinor(size_t pointerIndex, size_t historicalIndex) const {
    355         return getHistoricalPointerCoords(pointerIndex, historicalIndex).touchMinor;
    356     }
    357 
    358     inline float getHistoricalToolMajor(size_t pointerIndex, size_t historicalIndex) const {
    359         return getHistoricalPointerCoords(pointerIndex, historicalIndex).toolMajor;
    360     }
    361 
    362     inline float getHistoricalToolMinor(size_t pointerIndex, size_t historicalIndex) const {
    363         return getHistoricalPointerCoords(pointerIndex, historicalIndex).toolMinor;
    364     }
    365 
    366     inline float getHistoricalOrientation(size_t pointerIndex, size_t historicalIndex) const {
    367         return getHistoricalPointerCoords(pointerIndex, historicalIndex).orientation;
    368     }
    369 
    370     void initialize(
    371             int32_t deviceId,
    372             int32_t source,
    373             int32_t action,
    374             int32_t flags,
    375             int32_t edgeFlags,
    376             int32_t metaState,
    377             float xOffset,
    378             float yOffset,
    379             float xPrecision,
    380             float yPrecision,
    381             nsecs_t downTime,
    382             nsecs_t eventTime,
    383             size_t pointerCount,
    384             const int32_t* pointerIds,
    385             const PointerCoords* pointerCoords);
    386 
    387     void addSample(
    388             nsecs_t eventTime,
    389             const PointerCoords* pointerCoords);
    390 
    391     void offsetLocation(float xOffset, float yOffset);
    392 
    393     // Low-level accessors.
    394     inline const int32_t* getPointerIds() const { return mPointerIds.array(); }
    395     inline const nsecs_t* getSampleEventTimes() const { return mSampleEventTimes.array(); }
    396     inline const PointerCoords* getSamplePointerCoords() const {
    397             return mSamplePointerCoords.array();
    398     }
    399 
    400 private:
    401     int32_t mAction;
    402     int32_t mFlags;
    403     int32_t mEdgeFlags;
    404     int32_t mMetaState;
    405     float mXOffset;
    406     float mYOffset;
    407     float mXPrecision;
    408     float mYPrecision;
    409     nsecs_t mDownTime;
    410     Vector<int32_t> mPointerIds;
    411     Vector<nsecs_t> mSampleEventTimes;
    412     Vector<PointerCoords> mSamplePointerCoords;
    413 
    414     inline const PointerCoords& getCurrentPointerCoords(size_t pointerIndex) const {
    415         return mSamplePointerCoords[getHistorySize() * getPointerCount() + pointerIndex];
    416     }
    417 
    418     inline const PointerCoords& getHistoricalPointerCoords(
    419             size_t pointerIndex, size_t historicalIndex) const {
    420         return mSamplePointerCoords[historicalIndex * getPointerCount() + pointerIndex];
    421     }
    422 };
    423 
    424 /*
    425  * Input event factory.
    426  */
    427 class InputEventFactoryInterface {
    428 protected:
    429     virtual ~InputEventFactoryInterface() { }
    430 
    431 public:
    432     InputEventFactoryInterface() { }
    433 
    434     virtual KeyEvent* createKeyEvent() = 0;
    435     virtual MotionEvent* createMotionEvent() = 0;
    436 };
    437 
    438 /*
    439  * A simple input event factory implementation that uses a single preallocated instance
    440  * of each type of input event that are reused for each request.
    441  */
    442 class PreallocatedInputEventFactory : public InputEventFactoryInterface {
    443 public:
    444     PreallocatedInputEventFactory() { }
    445     virtual ~PreallocatedInputEventFactory() { }
    446 
    447     virtual KeyEvent* createKeyEvent() { return & mKeyEvent; }
    448     virtual MotionEvent* createMotionEvent() { return & mMotionEvent; }
    449 
    450 private:
    451     KeyEvent mKeyEvent;
    452     MotionEvent mMotionEvent;
    453 };
    454 
    455 /*
    456  * Describes the characteristics and capabilities of an input device.
    457  */
    458 class InputDeviceInfo {
    459 public:
    460     InputDeviceInfo();
    461     InputDeviceInfo(const InputDeviceInfo& other);
    462     ~InputDeviceInfo();
    463 
    464     struct MotionRange {
    465         float min;
    466         float max;
    467         float flat;
    468         float fuzz;
    469     };
    470 
    471     void initialize(int32_t id, const String8& name);
    472 
    473     inline int32_t getId() const { return mId; }
    474     inline const String8 getName() const { return mName; }
    475     inline uint32_t getSources() const { return mSources; }
    476 
    477     const MotionRange* getMotionRange(int32_t rangeType) const;
    478 
    479     void addSource(uint32_t source);
    480     void addMotionRange(int32_t rangeType, float min, float max, float flat, float fuzz);
    481     void addMotionRange(int32_t rangeType, const MotionRange& range);
    482 
    483     inline void setKeyboardType(int32_t keyboardType) { mKeyboardType = keyboardType; }
    484     inline int32_t getKeyboardType() const { return mKeyboardType; }
    485 
    486     inline const KeyedVector<int32_t, MotionRange> getMotionRanges() const {
    487         return mMotionRanges;
    488     }
    489 
    490 private:
    491     int32_t mId;
    492     String8 mName;
    493     uint32_t mSources;
    494     int32_t mKeyboardType;
    495 
    496     KeyedVector<int32_t, MotionRange> mMotionRanges;
    497 };
    498 
    499 
    500 } // namespace android
    501 
    502 #endif // _UI_INPUT_H
    503