146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown/*
246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Copyright (C) 2010 The Android Open Source Project
346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown *
446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * you may not use this file except in compliance with the License.
646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * You may obtain a copy of the License at
746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown *
846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown *
1046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Unless required by applicable law or agreed to in writing, software
1146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
1246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * See the License for the specific language governing permissions and
1446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * limitations under the License.
1546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */
1646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#ifndef _UI_INPUT_H
1846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define _UI_INPUT_H
1946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown/**
2146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Native input event structures.
2246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */
2346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <android/input.h>
2546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <utils/Vector.h>
266d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown#include <utils/KeyedVector.h>
2746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <utils/Timers.h>
286d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown#include <utils/RefBase.h>
296d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown#include <utils/String8.h>
30ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown#include <utils/BitSet.h>
3146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown#ifdef HAVE_ANDROID_OS
3391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownclass SkMatrix;
3491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown#endif
3591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
3646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown/*
3746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Additional private constants not defined in ndk/ui/input.h.
3846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */
3946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownenum {
4021bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    /* Private control to determine when an app is tracking a key sequence. */
4121bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    AKEY_EVENT_FLAG_START_TRACKING = 0x40000000,
4221bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
4321bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    /* Key event is inconsistent with previously sent key events. */
4421bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    AKEY_EVENT_FLAG_TAINTED = 0x80000000,
4521bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown};
4621bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
4721bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brownenum {
4821bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    /* Motion event is inconsistent with previously sent motion events. */
4921bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    AMOTION_EVENT_FLAG_TAINTED = 0x80000000,
5046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown};
5146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
5289de57a8d252a25ef2412a11a66089a9ff6ffe29Jeff Brownenum {
5389de57a8d252a25ef2412a11a66089a9ff6ffe29Jeff Brown    /*
5489de57a8d252a25ef2412a11a66089a9ff6ffe29Jeff Brown     * Indicates that an input device has switches.
5589de57a8d252a25ef2412a11a66089a9ff6ffe29Jeff Brown     * This input source flag is hidden from the API because switches are only used by the system
5689de57a8d252a25ef2412a11a66089a9ff6ffe29Jeff Brown     * and applications have no way to interact with them.
5789de57a8d252a25ef2412a11a66089a9ff6ffe29Jeff Brown     */
5889de57a8d252a25ef2412a11a66089a9ff6ffe29Jeff Brown    AINPUT_SOURCE_SWITCH = 0x80000000,
5989de57a8d252a25ef2412a11a66089a9ff6ffe29Jeff Brown};
6089de57a8d252a25ef2412a11a66089a9ff6ffe29Jeff Brown
6146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown/*
6205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown * SystemUiVisibility constants from View.
6305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown */
6405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brownenum {
6505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    ASYSTEM_UI_VISIBILITY_STATUS_BAR_VISIBLE = 0,
6605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    ASYSTEM_UI_VISIBILITY_STATUS_BAR_HIDDEN = 0x00000001,
6705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown};
6805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
6905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown/*
7046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Maximum number of pointers supported per motion event.
7101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown * Smallest number of pointers is 1.
7258a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown * (We want at least 10 but some touch controllers obstensibly configured for 10 pointers
7358a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown * will occasionally emit 11.  There is not much harm making this constant bigger.)
7446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */
7558a2da843f2f22f406df8df1f011738eb8b7fcb1Jeff Brown#define MAX_POINTERS 16
7646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
77a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn/*
7801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown * Maximum pointer id value supported in a motion event.
7901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown * Smallest pointer id is 0.
8001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown * (This is limited by our use of BitSet32 to track pointer assignments.)
8101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown */
8201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown#define MAX_POINTER_ID 31
8301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown
8401ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown/*
85a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn * Declare a concrete type for the NDK's input event forward declaration.
86a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn */
87d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackbornstruct AInputEvent {
88d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn    virtual ~AInputEvent() { }
89d76b67c340d1564abf8d14d976fdaf83bf2b3320Dianne Hackborn};
90a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
9146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown/*
926d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * Declare a concrete type for the NDK's input device forward declaration.
9346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */
946d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownstruct AInputDevice {
956d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual ~AInputDevice() { }
9646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown};
9746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
986d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
996d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownnamespace android {
1006d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
10191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown#ifdef HAVE_ANDROID_OS
10291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownclass Parcel;
10391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown#endif
10491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
10546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown/*
10646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Flags that flow alongside events in the input dispatch system to help with certain
10746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * policy decisions such as waking from device sleep.
108b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown *
109b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown * These flags are also defined in frameworks/base/core/java/android/view/WindowManagerPolicy.java.
11046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */
11146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownenum {
1120eaf3931a31c29f3a3883aab426b595c231c2a58Jeff Brown    /* These flags originate in RawEvents and are generally set in the key map.
113497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * NOTE: If you edit these flags, also edit labels in KeycodeLabels.h. */
11446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
11546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    POLICY_FLAG_WAKE = 0x00000001,
11646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    POLICY_FLAG_WAKE_DROPPED = 0x00000002,
11746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    POLICY_FLAG_SHIFT = 0x00000004,
11846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    POLICY_FLAG_CAPS_LOCK = 0x00000008,
11946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    POLICY_FLAG_ALT = 0x00000010,
12046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    POLICY_FLAG_ALT_GR = 0x00000020,
12146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    POLICY_FLAG_MENU = 0x00000040,
12246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    POLICY_FLAG_LAUNCHER = 0x00000080,
1230eaf3931a31c29f3a3883aab426b595c231c2a58Jeff Brown    POLICY_FLAG_VIRTUAL = 0x00000100,
124497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    POLICY_FLAG_FUNCTION = 0x00000200,
12546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1267fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown    POLICY_FLAG_RAW_MASK = 0x0000ffff,
1277fbdc84e87dd3a0e196b9803bb04495d11e9cb8aJeff Brown
12885a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown    /* These flags are set by the input dispatcher. */
12985a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown
13085a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown    // Indicates that the input event was injected.
13185a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown    POLICY_FLAG_INJECTED = 0x01000000,
13285a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown
133e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown    // Indicates that the input event is from a trusted source such as a directly attached
134e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown    // input device or an application with system-wide event injection permission.
135e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown    POLICY_FLAG_TRUSTED = 0x02000000,
136e20c9e0264190f94324197a8271cf03811a4ca58Jeff Brown
1370029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    // Indicates that the input event has passed through an input filter.
1380029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    POLICY_FLAG_FILTERED = 0x04000000,
1390029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
1400029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    // Disables automatic key repeating behavior.
1410029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    POLICY_FLAG_DISABLE_KEY_REPEAT = 0x08000000,
1420029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
1439c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    /* These flags are set by the input reader policy as it intercepts each event. */
14446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
14546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    // Indicates that the screen was off when the event was received and the event
14646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    // should wake the device.
14746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    POLICY_FLAG_WOKE_HERE = 0x10000000,
14846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
14946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    // Indicates that the screen was dim when the event was received and the event
15046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    // should brighten the device.
15146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    POLICY_FLAG_BRIGHT_HERE = 0x20000000,
152b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown
153b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    // Indicates that the event should be dispatched to applications.
154b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    // The input event should still be sent to the InputDispatcher so that it can see all
155b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    // input events received include those that it will not deliver.
156b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown    POLICY_FLAG_PASS_TO_USER = 0x40000000,
15746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown};
15846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
15946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown/*
1609c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown * Describes the basic configuration of input devices that are present.
1619c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown */
1629c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownstruct InputConfiguration {
1639c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    enum {
1649c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        TOUCHSCREEN_UNDEFINED = 0,
1659c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        TOUCHSCREEN_NOTOUCH = 1,
1669c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        TOUCHSCREEN_STYLUS = 2,
1679c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        TOUCHSCREEN_FINGER = 3
1689c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    };
1699c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
1709c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    enum {
1719c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        KEYBOARD_UNDEFINED = 0,
1729c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        KEYBOARD_NOKEYS = 1,
1739c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        KEYBOARD_QWERTY = 2,
1749c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        KEYBOARD_12KEY = 3
1759c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    };
1769c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
1779c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    enum {
1789c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        NAVIGATION_UNDEFINED = 0,
1799c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        NAVIGATION_NONAV = 1,
1809c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        NAVIGATION_DPAD = 2,
1819c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        NAVIGATION_TRACKBALL = 3,
1829c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        NAVIGATION_WHEEL = 4
1839c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    };
1849c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
1859c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    int32_t touchScreen;
1869c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    int32_t keyboard;
1879c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    int32_t navigation;
1889c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown};
1899c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
1909c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown/*
19146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Pointer coordinate data.
19246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */
19346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownstruct PointerCoords {
1946f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    enum { MAX_AXES = 14 }; // 14 so that sizeof(PointerCoords) == 64
19591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
19691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    // Bitfield of axes that are present in this structure.
1976f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    uint64_t bits;
19891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
19991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    // Values of axes that are stored in this structure packed in order by axis id
20091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    // for each axis that is present in the structure according to 'bits'.
20191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    float values[MAX_AXES];
20291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
20391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    inline void clear() {
20491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        bits = 0;
20591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
20691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
2076f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    float getAxisValue(int32_t axis) const;
2086f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    status_t setAxisValue(int32_t axis, float value);
20991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
210e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn    void scale(float scale);
211e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackborn
212be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    inline float getX() const {
213be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        return getAxisValue(AMOTION_EVENT_AXIS_X);
214be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    }
215be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
216be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    inline float getY() const {
217be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        return getAxisValue(AMOTION_EVENT_AXIS_Y);
218be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    }
219be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
22091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown#ifdef HAVE_ANDROID_OS
22191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    status_t readFromParcel(Parcel* parcel);
22291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    status_t writeToParcel(Parcel* parcel) const;
22391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown#endif
22491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
225ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    bool operator==(const PointerCoords& other) const;
226ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    inline bool operator!=(const PointerCoords& other) const {
227ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        return !(*this == other);
228ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    }
229ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
230ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    void copyFrom(const PointerCoords& other);
231ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
23291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownprivate:
23391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    void tooManyAxes(int axis);
23446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown};
23546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
23646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown/*
237fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown * Pointer property data.
238fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown */
239fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brownstruct PointerProperties {
240fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    // The id of the pointer.
241fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    int32_t id;
242fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown
243fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    // The pointer tool type.
244fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    int32_t toolType;
245fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown
246fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    inline void clear() {
247fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        id = -1;
248fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        toolType = 0;
249fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    }
250fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown
251fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    bool operator==(const PointerProperties& other) const;
252fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    inline bool operator!=(const PointerProperties& other) const {
253fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        return !(*this == other);
254fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    }
255fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown
256fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    void copyFrom(const PointerProperties& other);
257fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown};
258fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown
259fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown/*
26046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Input events.
26146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */
2622e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornclass InputEvent : public AInputEvent {
26346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownpublic:
26446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual ~InputEvent() { }
26546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
26646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual int32_t getType() const = 0;
26746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
26846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    inline int32_t getDeviceId() const { return mDeviceId; }
26946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
270c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    inline int32_t getSource() const { return mSource; }
27191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
27291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    inline void setSource(int32_t source) { mSource = source; }
27391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
27446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownprotected:
275c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    void initialize(int32_t deviceId, int32_t source);
2762c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    void initialize(const InputEvent& from);
27746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
27846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    int32_t mDeviceId;
279c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    int32_t mSource;
28046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown};
28146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2825c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown/*
2835c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown * Key events.
2845c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown */
28546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownclass KeyEvent : public InputEvent {
28646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownpublic:
28746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual ~KeyEvent() { }
28846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
289c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    virtual int32_t getType() const { return AINPUT_EVENT_TYPE_KEY; }
29046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
29146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    inline int32_t getAction() const { return mAction; }
29246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
29346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    inline int32_t getFlags() const { return mFlags; }
29446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
29546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    inline int32_t getKeyCode() const { return mKeyCode; }
29646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
29746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    inline int32_t getScanCode() const { return mScanCode; }
29846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
29946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    inline int32_t getMetaState() const { return mMetaState; }
30046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
30146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    inline int32_t getRepeatCount() const { return mRepeatCount; }
30246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
30346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    inline nsecs_t getDownTime() const { return mDownTime; }
30446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
30546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    inline nsecs_t getEventTime() const { return mEventTime; }
30646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3073c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    // Return true if this event may have a default action implementation.
3083c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    static bool hasDefaultAction(int32_t keyCode);
3093c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    bool hasDefaultAction() const;
3103c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
3113c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    // Return true if this event represents a system key.
3123c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    static bool isSystemKey(int32_t keyCode);
3133c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    bool isSystemKey() const;
3143c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
31546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    void initialize(
31646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            int32_t deviceId,
317c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            int32_t source,
31846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            int32_t action,
31946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            int32_t flags,
32046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            int32_t keyCode,
32146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            int32_t scanCode,
32246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            int32_t metaState,
32346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            int32_t repeatCount,
32446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            nsecs_t downTime,
32546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            nsecs_t eventTime);
3262c6081ce3593712f30dacd990a97209c791d6cedDianne Hackborn    void initialize(const KeyEvent& from);
32746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
32891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownprotected:
32946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    int32_t mAction;
33046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    int32_t mFlags;
33146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    int32_t mKeyCode;
33246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    int32_t mScanCode;
33346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    int32_t mMetaState;
33446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    int32_t mRepeatCount;
33546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    nsecs_t mDownTime;
33646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    nsecs_t mEventTime;
33746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown};
33846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3395c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown/*
3405c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown * Motion events.
3415c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown */
34246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownclass MotionEvent : public InputEvent {
34346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownpublic:
34446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual ~MotionEvent() { }
34546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
346c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    virtual int32_t getType() const { return AINPUT_EVENT_TYPE_MOTION; }
34746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
34846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    inline int32_t getAction() const { return mAction; }
34946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3502ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown    inline int32_t getActionMasked() const { return mAction & AMOTION_EVENT_ACTION_MASK; }
3512ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown
3522ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown    inline int32_t getActionIndex() const {
3532ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown        return (mAction & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK)
3542ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown                >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
3552ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown    }
3562ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown
35791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    inline void setAction(int32_t action) { mAction = action; }
35891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
35985a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown    inline int32_t getFlags() const { return mFlags; }
36085a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown
36121bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    inline void setFlags(int32_t flags) { mFlags = flags; }
36221bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
36346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    inline int32_t getEdgeFlags() const { return mEdgeFlags; }
36446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
36591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    inline void setEdgeFlags(int32_t edgeFlags) { mEdgeFlags = edgeFlags; }
36691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
36746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    inline int32_t getMetaState() const { return mMetaState; }
36846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
36991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    inline void setMetaState(int32_t metaState) { mMetaState = metaState; }
37091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
371fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    inline int32_t getButtonState() const { return mButtonState; }
372fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown
3735c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    inline float getXOffset() const { return mXOffset; }
3745c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
3755c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    inline float getYOffset() const { return mYOffset; }
3765c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
37746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    inline float getXPrecision() const { return mXPrecision; }
37846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
37946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    inline float getYPrecision() const { return mYPrecision; }
38046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
38146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    inline nsecs_t getDownTime() const { return mDownTime; }
38246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
383fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    inline void setDownTime(nsecs_t downTime) { mDownTime = downTime; }
384fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown
385fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    inline size_t getPointerCount() const { return mPointerProperties.size(); }
38646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
387fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    inline const PointerProperties* getPointerProperties(size_t pointerIndex) const {
388fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        return &mPointerProperties[pointerIndex];
389fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    }
390fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown
391fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    inline int32_t getPointerId(size_t pointerIndex) const {
392fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        return mPointerProperties[pointerIndex].id;
393fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    }
394fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown
395fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    inline int32_t getToolType(size_t pointerIndex) const {
396fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        return mPointerProperties[pointerIndex].toolType;
397fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    }
39846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
39946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    inline nsecs_t getEventTime() const { return mSampleEventTimes[getHistorySize()]; }
40046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
40191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    const PointerCoords* getRawPointerCoords(size_t pointerIndex) const;
40291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
40391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    float getRawAxisValue(int32_t axis, size_t pointerIndex) const;
40491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
4055c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    inline float getRawX(size_t pointerIndex) const {
406ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown        return getRawAxisValue(AMOTION_EVENT_AXIS_X, pointerIndex);
4075c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    }
40846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
4095c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    inline float getRawY(size_t pointerIndex) const {
410ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown        return getRawAxisValue(AMOTION_EVENT_AXIS_Y, pointerIndex);
4115c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    }
41246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
41391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    float getAxisValue(int32_t axis, size_t pointerIndex) const;
41491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
41546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    inline float getX(size_t pointerIndex) const {
416ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown        return getAxisValue(AMOTION_EVENT_AXIS_X, pointerIndex);
41746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
41846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
41946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    inline float getY(size_t pointerIndex) const {
420ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown        return getAxisValue(AMOTION_EVENT_AXIS_Y, pointerIndex);
42146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
42246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
42346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    inline float getPressure(size_t pointerIndex) const {
424ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown        return getAxisValue(AMOTION_EVENT_AXIS_PRESSURE, pointerIndex);
42546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
42646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
42746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    inline float getSize(size_t pointerIndex) const {
428ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown        return getAxisValue(AMOTION_EVENT_AXIS_SIZE, pointerIndex);
42946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
43046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
431c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    inline float getTouchMajor(size_t pointerIndex) const {
432ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown        return getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, pointerIndex);
433c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
434c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
435c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    inline float getTouchMinor(size_t pointerIndex) const {
436ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown        return getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, pointerIndex);
437c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
438c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
439c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    inline float getToolMajor(size_t pointerIndex) const {
440ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown        return getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, pointerIndex);
441c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
442c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
443c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    inline float getToolMinor(size_t pointerIndex) const {
444ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown        return getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR, pointerIndex);
445c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
446c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
447c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    inline float getOrientation(size_t pointerIndex) const {
448ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown        return getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, pointerIndex);
449c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
450c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
45146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    inline size_t getHistorySize() const { return mSampleEventTimes.size() - 1; }
45246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
45346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    inline nsecs_t getHistoricalEventTime(size_t historicalIndex) const {
45446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        return mSampleEventTimes[historicalIndex];
45546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
45646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
45791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    const PointerCoords* getHistoricalRawPointerCoords(
45891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            size_t pointerIndex, size_t historicalIndex) const;
45991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
46091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    float getHistoricalRawAxisValue(int32_t axis, size_t pointerIndex,
46191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            size_t historicalIndex) const;
46291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
4635c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    inline float getHistoricalRawX(size_t pointerIndex, size_t historicalIndex) const {
46491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return getHistoricalRawAxisValue(
465ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown                AMOTION_EVENT_AXIS_X, pointerIndex, historicalIndex);
46646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
46746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
4685c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    inline float getHistoricalRawY(size_t pointerIndex, size_t historicalIndex) const {
46991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return getHistoricalRawAxisValue(
470ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown                AMOTION_EVENT_AXIS_Y, pointerIndex, historicalIndex);
47146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
47246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
47391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    float getHistoricalAxisValue(int32_t axis, size_t pointerIndex, size_t historicalIndex) const;
47491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
4755c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    inline float getHistoricalX(size_t pointerIndex, size_t historicalIndex) const {
47691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return getHistoricalAxisValue(
477ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown                AMOTION_EVENT_AXIS_X, pointerIndex, historicalIndex);
4785c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    }
4795c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
4805c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    inline float getHistoricalY(size_t pointerIndex, size_t historicalIndex) const {
48191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return getHistoricalAxisValue(
482ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown                AMOTION_EVENT_AXIS_Y, pointerIndex, historicalIndex);
4835c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    }
4845c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
48546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    inline float getHistoricalPressure(size_t pointerIndex, size_t historicalIndex) const {
48691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return getHistoricalAxisValue(
487ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown                AMOTION_EVENT_AXIS_PRESSURE, pointerIndex, historicalIndex);
48846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
48946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
49046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    inline float getHistoricalSize(size_t pointerIndex, size_t historicalIndex) const {
49191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return getHistoricalAxisValue(
492ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown                AMOTION_EVENT_AXIS_SIZE, pointerIndex, historicalIndex);
49346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
49446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
495c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    inline float getHistoricalTouchMajor(size_t pointerIndex, size_t historicalIndex) const {
49691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return getHistoricalAxisValue(
497ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown                AMOTION_EVENT_AXIS_TOUCH_MAJOR, pointerIndex, historicalIndex);
498c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
499c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
500c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    inline float getHistoricalTouchMinor(size_t pointerIndex, size_t historicalIndex) const {
50191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return getHistoricalAxisValue(
502ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown                AMOTION_EVENT_AXIS_TOUCH_MINOR, pointerIndex, historicalIndex);
503c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
504c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
505c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    inline float getHistoricalToolMajor(size_t pointerIndex, size_t historicalIndex) const {
50691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return getHistoricalAxisValue(
507ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown                AMOTION_EVENT_AXIS_TOOL_MAJOR, pointerIndex, historicalIndex);
508c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
509c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
510c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    inline float getHistoricalToolMinor(size_t pointerIndex, size_t historicalIndex) const {
51191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return getHistoricalAxisValue(
512ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown                AMOTION_EVENT_AXIS_TOOL_MINOR, pointerIndex, historicalIndex);
513c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
514c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
515c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    inline float getHistoricalOrientation(size_t pointerIndex, size_t historicalIndex) const {
51691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return getHistoricalAxisValue(
517ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown                AMOTION_EVENT_AXIS_ORIENTATION, pointerIndex, historicalIndex);
518c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
519c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
5202ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown    ssize_t findPointerIndex(int32_t pointerId) const;
5212ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown
52246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    void initialize(
52346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            int32_t deviceId,
524c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            int32_t source,
52546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            int32_t action,
52685a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown            int32_t flags,
52746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            int32_t edgeFlags,
52846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            int32_t metaState,
529fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            int32_t buttonState,
5305c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            float xOffset,
5315c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            float yOffset,
53246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            float xPrecision,
53346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            float yPrecision,
53446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            nsecs_t downTime,
53546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            nsecs_t eventTime,
53646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            size_t pointerCount,
537fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            const PointerProperties* pointerProperties,
53846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            const PointerCoords* pointerCoords);
53946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
54091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    void copyFrom(const MotionEvent* other, bool keepHistory);
54191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
54246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    void addSample(
54346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            nsecs_t eventTime,
54446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            const PointerCoords* pointerCoords);
54546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
54646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    void offsetLocation(float xOffset, float yOffset);
54746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
54891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    void scale(float scaleFactor);
54991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
55091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown#ifdef HAVE_ANDROID_OS
55191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    void transform(const SkMatrix* matrix);
55291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
55391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    status_t readFromParcel(Parcel* parcel);
55491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    status_t writeToParcel(Parcel* parcel) const;
55591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown#endif
55691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
55756194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    static bool isTouchEvent(int32_t source, int32_t action);
55856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    inline bool isTouchEvent() const {
55956194ebec6212e229f4ccdaa4b187166d20013efJeff Brown        return isTouchEvent(mSource, mAction);
56056194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    }
56156194ebec6212e229f4ccdaa4b187166d20013efJeff Brown
5625c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    // Low-level accessors.
563fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    inline const PointerProperties* getPointerProperties() const {
564fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        return mPointerProperties.array();
565fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    }
5665c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    inline const nsecs_t* getSampleEventTimes() const { return mSampleEventTimes.array(); }
5675c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    inline const PointerCoords* getSamplePointerCoords() const {
5685c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            return mSamplePointerCoords.array();
5695c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    }
5705c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
57191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brownprotected:
57246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    int32_t mAction;
57385a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown    int32_t mFlags;
57446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    int32_t mEdgeFlags;
57546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    int32_t mMetaState;
576fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    int32_t mButtonState;
5775c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    float mXOffset;
5785c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    float mYOffset;
57946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    float mXPrecision;
58046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    float mYPrecision;
58146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    nsecs_t mDownTime;
582fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    Vector<PointerProperties> mPointerProperties;
58346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    Vector<nsecs_t> mSampleEventTimes;
58446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    Vector<PointerCoords> mSamplePointerCoords;
58546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown};
58646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
58746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown/*
58846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Input event factory.
58946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */
59046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownclass InputEventFactoryInterface {
59146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownprotected:
59246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual ~InputEventFactoryInterface() { }
59346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
59446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownpublic:
59546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    InputEventFactoryInterface() { }
59646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
59746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual KeyEvent* createKeyEvent() = 0;
59846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual MotionEvent* createMotionEvent() = 0;
59946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown};
60046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
60146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown/*
60246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * A simple input event factory implementation that uses a single preallocated instance
60346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * of each type of input event that are reused for each request.
60446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */
60546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownclass PreallocatedInputEventFactory : public InputEventFactoryInterface {
60646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownpublic:
60746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    PreallocatedInputEventFactory() { }
60846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual ~PreallocatedInputEventFactory() { }
60946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
61046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual KeyEvent* createKeyEvent() { return & mKeyEvent; }
61146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual MotionEvent* createMotionEvent() { return & mMotionEvent; }
61246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
61346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownprivate:
61446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    KeyEvent mKeyEvent;
61546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    MotionEvent mMotionEvent;
61646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown};
61746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
6186d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown/*
6192ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown * Calculates the velocity of pointer movements over time.
620ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown */
621ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brownclass VelocityTracker {
622ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brownpublic:
623b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown    // Default polynomial degree.  (used by getVelocity)
624b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown    static const uint32_t DEFAULT_DEGREE = 2;
625b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown
626b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown    // Default sample horizon.  (used by getVelocity)
627b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown    // We don't use too much history by default since we want to react to quick
628b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown    // changes in direction.
629b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown    static const nsecs_t DEFAULT_HORIZON = 100 * 1000000; // 100 ms
630b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown
631ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    struct Position {
632ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        float x, y;
633ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    };
634ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
635b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown    struct Estimator {
636b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown        static const size_t MAX_DEGREE = 2;
637b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown
638b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown        // Polynomial coefficients describing motion in X and Y.
639b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown        float xCoeff[MAX_DEGREE + 1], yCoeff[MAX_DEGREE + 1];
640b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown
641b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown        // Polynomial degree (number of coefficients), or zero if no information is
642b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown        // available.
643b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown        uint32_t degree;
644b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown
645b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown        // Confidence (coefficient of determination), between 0 (no fit) and 1 (perfect fit).
646b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown        float confidence;
647b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown
648b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown        inline void clear() {
649b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown            degree = 0;
650b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown            confidence = 0;
651b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown            for (size_t i = 0; i <= MAX_DEGREE; i++) {
652b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown                xCoeff[i] = 0;
653b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown                yCoeff[i] = 0;
654b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown            }
655b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown        }
656b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown    };
657b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown
658ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    VelocityTracker();
659ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
660ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    // Resets the velocity tracker state.
661ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    void clear();
662ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
6632ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown    // Resets the velocity tracker state for specific pointers.
6642ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown    // Call this method when some pointers have changed and may be reusing
6652ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown    // an id that was assigned to a different pointer earlier.
6662ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown    void clearPointers(BitSet32 idBits);
6672ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown
668ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    // Adds movement information for a set of pointers.
669ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    // The idBits bitfield specifies the pointer ids of the pointers whose positions
670ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    // are included in the movement.
671ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    // The positions array contains position information for each pointer in order by
672ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    // increasing id.  Its size should be equal to the number of one bits in idBits.
673ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    void addMovement(nsecs_t eventTime, BitSet32 idBits, const Position* positions);
674ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
6752ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown    // Adds movement information for all pointers in a MotionEvent, including historical samples.
6762ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown    void addMovement(const MotionEvent* event);
6772ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown
678ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    // Gets the velocity of the specified pointer id in position units per second.
679b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown    // Returns false and sets the velocity components to zero if there is
680b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown    // insufficient movement information for the pointer.
681ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    bool getVelocity(uint32_t id, float* outVx, float* outVy) const;
682ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
683b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown    // Gets a quadratic estimator for the movements of the specified pointer id.
684b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown    // Returns false and clears the estimator if there is no information available
685b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown    // about the pointer.
686b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown    bool getEstimator(uint32_t id, uint32_t degree, nsecs_t horizon,
687b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown            Estimator* outEstimator) const;
688b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown
6892ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown    // Gets the active pointer id, or -1 if none.
6902ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown    inline int32_t getActivePointerId() const { return mActivePointerId; }
6912ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown
6922ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown    // Gets a bitset containing all pointer ids from the most recent movement.
6932ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown    inline BitSet32 getCurrentPointerIdBits() const { return mMovements[mIndex].idBits; }
6942ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown
695ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brownprivate:
696ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    // Number of samples to keep.
697b59ab9f41faafb358afb4f951de96f34a656e0b4Jeff Brown    static const uint32_t HISTORY_SIZE = 20;
698ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
699ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    struct Movement {
700ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        nsecs_t eventTime;
701ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        BitSet32 idBits;
702ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        Position positions[MAX_POINTERS];
703581761d4aa0133fe7354cc9e4a5dd3d9d7258c5fJeff Brown
704581761d4aa0133fe7354cc9e4a5dd3d9d7258c5fJeff Brown        inline const Position& getPosition(uint32_t id) const {
705581761d4aa0133fe7354cc9e4a5dd3d9d7258c5fJeff Brown            return positions[idBits.getIndexOfBit(id)];
706581761d4aa0133fe7354cc9e4a5dd3d9d7258c5fJeff Brown        }
707ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    };
708ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
709ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    uint32_t mIndex;
710ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    Movement mMovements[HISTORY_SIZE];
7112ed2462aa29c564f5231f317c27b3188da875e52Jeff Brown    int32_t mActivePointerId;
712ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown};
713ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
71419c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown
71519c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown/*
71619c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown * Specifies parameters that govern pointer or wheel acceleration.
71719c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown */
71819c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brownstruct VelocityControlParameters {
71919c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    // A scale factor that is multiplied with the raw velocity deltas
72019c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    // prior to applying any other velocity control factors.  The scale
72119c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    // factor should be used to adapt the input device resolution
72219c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    // (eg. counts per inch) to the output device resolution (eg. pixels per inch).
72319c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    //
72419c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    // Must be a positive value.
72519c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    // Default is 1.0 (no scaling).
72619c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    float scale;
72719c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown
72819c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    // The scaled speed at which acceleration begins to be applied.
72919c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    // This value establishes the upper bound of a low speed regime for
73019c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    // small precise motions that are performed without any acceleration.
73119c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    //
73219c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    // Must be a non-negative value.
73319c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    // Default is 0.0 (no low threshold).
73419c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    float lowThreshold;
73519c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown
73619c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    // The scaled speed at which maximum acceleration is applied.
73719c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    // The difference between highThreshold and lowThreshold controls
73819c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    // the range of speeds over which the acceleration factor is interpolated.
73919c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    // The wider the range, the smoother the acceleration.
74019c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    //
74119c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    // Must be a non-negative value greater than or equal to lowThreshold.
74219c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    // Default is 0.0 (no high threshold).
74319c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    float highThreshold;
74419c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown
74519c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    // The acceleration factor.
74619c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    // When the speed is above the low speed threshold, the velocity will scaled
74719c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    // by an interpolated value between 1.0 and this amount.
74819c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    //
74919c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    // Must be a positive greater than or equal to 1.0.
75019c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    // Default is 1.0 (no acceleration).
75119c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    float acceleration;
75219c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown
75319c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    VelocityControlParameters() :
75419c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown            scale(1.0f), lowThreshold(0.0f), highThreshold(0.0f), acceleration(1.0f) {
75519c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    }
75619c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown
75719c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    VelocityControlParameters(float scale, float lowThreshold,
75819c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown            float highThreshold, float acceleration) :
75919c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown            scale(scale), lowThreshold(lowThreshold),
76019c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown            highThreshold(highThreshold), acceleration(acceleration) {
76119c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    }
76219c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown};
76319c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown
76419c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown/*
76519c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown * Implements mouse pointer and wheel speed control and acceleration.
76619c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown */
76719c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brownclass VelocityControl {
76819c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brownpublic:
76919c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    VelocityControl();
77019c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown
77119c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    /* Sets the various parameters. */
77219c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    void setParameters(const VelocityControlParameters& parameters);
77319c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown
77419c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    /* Resets the current movement counters to zero.
77519c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown     * This has the effect of nullifying any acceleration. */
77619c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    void reset();
77719c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown
77819c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    /* Translates a raw movement delta into an appropriately
77919c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown     * scaled / accelerated delta based on the current velocity. */
78019c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    void move(nsecs_t eventTime, float* deltaX, float* deltaY);
78119c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown
78219c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brownprivate:
78319c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    // If no movements are received within this amount of time,
78419c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    // we assume the movement has stopped and reset the movement counters.
78519c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    static const nsecs_t STOP_TIME = 500 * 1000000; // 500 ms
78619c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown
78719c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    VelocityControlParameters mParameters;
78819c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown
78919c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    nsecs_t mLastMovementTime;
79019c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    VelocityTracker::Position mRawPosition;
79119c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    VelocityTracker mVelocityTracker;
79219c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown};
79319c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown
79419c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown
795ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown/*
7966d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * Describes the characteristics and capabilities of an input device.
7976d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown */
7986d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownclass InputDeviceInfo {
7996d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownpublic:
8006d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    InputDeviceInfo();
8016d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    InputDeviceInfo(const InputDeviceInfo& other);
8026d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    ~InputDeviceInfo();
8036d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
8046d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    struct MotionRange {
805efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        int32_t axis;
806efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        uint32_t source;
8076d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        float min;
8086d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        float max;
8096d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        float flat;
8106d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        float fuzz;
8116d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    };
8126d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
8136d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    void initialize(int32_t id, const String8& name);
8146d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
8156d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    inline int32_t getId() const { return mId; }
8166d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    inline const String8 getName() const { return mName; }
8176d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    inline uint32_t getSources() const { return mSources; }
8186d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
819efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    const MotionRange* getMotionRange(int32_t axis, uint32_t source) const;
8206d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
8216d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    void addSource(uint32_t source);
822efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    void addMotionRange(int32_t axis, uint32_t source,
823efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            float min, float max, float flat, float fuzz);
824efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    void addMotionRange(const MotionRange& range);
8256d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
8266d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    inline void setKeyboardType(int32_t keyboardType) { mKeyboardType = keyboardType; }
8276d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    inline int32_t getKeyboardType() const { return mKeyboardType; }
8286d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
8291e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown    inline void setKeyCharacterMapFile(const String8& value) { mKeyCharacterMapFile = value; }
8301e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown    inline const String8& getKeyCharacterMapFile() const { return mKeyCharacterMapFile; }
8311e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown
832efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    inline const Vector<MotionRange>& getMotionRanges() const {
8338d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return mMotionRanges;
8348d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
8358d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
8366d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownprivate:
8376d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    int32_t mId;
8386d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    String8 mName;
8396d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    uint32_t mSources;
8406d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    int32_t mKeyboardType;
8411e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown    String8 mKeyCharacterMapFile;
8426d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
843efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    Vector<MotionRange> mMotionRanges;
8446d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown};
8456d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
8469065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown/*
8479065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown * Identifies a device.
8489065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown */
8499065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brownstruct InputDeviceIdentifier {
8509065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    inline InputDeviceIdentifier() :
8519065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown            bus(0), vendor(0), product(0), version(0) {
8529065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    }
8539065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown
8549065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    String8 name;
8559065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    String8 location;
8569065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    String8 uniqueId;
8579065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    uint16_t bus;
8589065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    uint16_t vendor;
8599065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    uint16_t product;
8609065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown    uint16_t version;
8619065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown};
8629065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown
86347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown/* Types of input device configuration files. */
86447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brownenum InputDeviceConfigurationFileType {
86547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    INPUT_DEVICE_CONFIGURATION_FILE_TYPE_CONFIGURATION = 0,     /* .idc file */
86647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    INPUT_DEVICE_CONFIGURATION_FILE_TYPE_KEY_LAYOUT = 1,        /* .kl file */
86747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    INPUT_DEVICE_CONFIGURATION_FILE_TYPE_KEY_CHARACTER_MAP = 2, /* .kcm file */
86847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown};
86947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown
87047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown/*
8719065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown * Gets the path of an input device configuration file, if one is available.
8729065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown * Considers both system provided and user installed configuration files.
8739065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown *
8749065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown * The device identifier is used to construct several default configuration file
8759065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown * names to try based on the device name, vendor, product, and version.
8769065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown *
8779065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown * Returns an empty string if not found.
8789065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown */
8799065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brownextern String8 getInputDeviceConfigurationFilePathByDeviceIdentifier(
8809065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        const InputDeviceIdentifier& deviceIdentifier,
8819065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown        InputDeviceConfigurationFileType type);
8829065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown
8839065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown/*
8849065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown * Gets the path of an input device configuration file, if one is available.
8851f2451007c660091b7b090c1ea332f9044515d2dJeff Brown * Considers both system provided and user installed configuration files.
88647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown *
8879065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown * The name is case-sensitive and is used to construct the filename to resolve.
8889065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown * All characters except 'a'-'z', 'A'-'Z', '0'-'9', '-', and '_' are replaced by underscores.
8899065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brown *
89047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown * Returns an empty string if not found.
89147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown */
8929065504a63d6bf37bf621191fda1d1fe4da76ee3Jeff Brownextern String8 getInputDeviceConfigurationFilePathByName(
89347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown        const String8& name, InputDeviceConfigurationFileType type);
89446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
89546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} // namespace android
89646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
89746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#endif // _UI_INPUT_H
898