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_READER_H
1846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define _UI_INPUT_READER_H
1946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
20b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include "EventHub.h"
21b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include "PointerController.h"
22be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown#include "InputListener.h"
23b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
249d3b1a424c5c61e24e9659d15fb353026a00d925Jeff Brown#include <input/Input.h>
259d3b1a424c5c61e24e9659d15fb353026a00d925Jeff Brown#include <input/VelocityControl.h>
269d3b1a424c5c61e24e9659d15fb353026a00d925Jeff Brown#include <input/VelocityTracker.h>
2746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <utils/KeyedVector.h>
2846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <utils/threads.h>
2946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <utils/Timers.h>
3046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <utils/RefBase.h>
3146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <utils/String8.h>
3246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <utils/BitSet.h>
3346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <stddef.h>
3546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <unistd.h>
3646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
37a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown// Maximum supported size of a vibration pattern.
38a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown// Must be at least 2.
39a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown#define MAX_VIBRATE_PATTERN_SIZE 100
40a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown
41a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown// Maximum allowable delay value in a vibration pattern before
42a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown// which the delay will be truncated.
43a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown#define MAX_VIBRATE_PATTERN_DELAY_NSECS (1000000 * 1000000000LL)
44a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown
4546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownnamespace android {
4646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
476d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownclass InputDevice;
486d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownclass InputMapper;
496d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
50d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown/*
51d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown * Describes how coordinates are mapped on a physical display.
52d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown * See com.android.server.display.DisplayViewport.
53d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown */
54d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brownstruct DisplayViewport {
55d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    int32_t displayId; // -1 if invalid
56d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    int32_t orientation;
57d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    int32_t logicalLeft;
58d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    int32_t logicalTop;
59d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    int32_t logicalRight;
60d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    int32_t logicalBottom;
61d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    int32_t physicalLeft;
62d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    int32_t physicalTop;
63d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    int32_t physicalRight;
64d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    int32_t physicalBottom;
6583d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    int32_t deviceWidth;
6683d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    int32_t deviceHeight;
67d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown
68d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    DisplayViewport() :
6983d616a9c7b9505153d258511eb5c16b552e268dJeff Brown            displayId(ADISPLAY_ID_NONE), orientation(DISPLAY_ORIENTATION_0),
70d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown            logicalLeft(0), logicalTop(0), logicalRight(0), logicalBottom(0),
7183d616a9c7b9505153d258511eb5c16b552e268dJeff Brown            physicalLeft(0), physicalTop(0), physicalRight(0), physicalBottom(0),
7283d616a9c7b9505153d258511eb5c16b552e268dJeff Brown            deviceWidth(0), deviceHeight(0) {
73d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    }
74d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown
75d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    bool operator==(const DisplayViewport& other) const {
76d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown        return displayId == other.displayId
77d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown                && orientation == other.orientation
78d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown                && logicalLeft == other.logicalLeft
79d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown                && logicalTop == other.logicalTop
80d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown                && logicalRight == other.logicalRight
81d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown                && logicalBottom == other.logicalBottom
82d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown                && physicalLeft == other.physicalLeft
83d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown                && physicalTop == other.physicalTop
84d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown                && physicalRight == other.physicalRight
8583d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                && physicalBottom == other.physicalBottom
8683d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                && deviceWidth == other.deviceWidth
8783d616a9c7b9505153d258511eb5c16b552e268dJeff Brown                && deviceHeight == other.deviceHeight;
88d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    }
89d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown
90d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    bool operator!=(const DisplayViewport& other) const {
91d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown        return !(*this == other);
92d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    }
9383d616a9c7b9505153d258511eb5c16b552e268dJeff Brown
9483d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    inline bool isValid() const {
9583d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        return displayId >= 0;
9683d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    }
9783d616a9c7b9505153d258511eb5c16b552e268dJeff Brown
9883d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    void setNonDisplayViewport(int32_t width, int32_t height) {
9983d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        displayId = ADISPLAY_ID_NONE;
10083d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        orientation = DISPLAY_ORIENTATION_0;
10183d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        logicalLeft = 0;
10283d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        logicalTop = 0;
10383d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        logicalRight = width;
10483d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        logicalBottom = height;
10583d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        physicalLeft = 0;
10683d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        physicalTop = 0;
10783d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        physicalRight = width;
10883d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        physicalBottom = height;
10983d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        deviceWidth = width;
11083d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        deviceHeight = height;
11183d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    }
112d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown};
1138d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
1149c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown/*
115214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown * Input reader configuration.
116214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown *
117214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown * Specifies various options that modify the behavior of the input reader.
118214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown */
119214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brownstruct InputReaderConfiguration {
120474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown    // Describes changes that have occurred.
121474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown    enum {
122474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown        // The pointer speed changed.
123474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown        CHANGE_POINTER_SPEED = 1 << 0,
124474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown
125474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown        // The pointer gesture control changed.
126474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown        CHANGE_POINTER_GESTURE_ENABLEMENT = 1 << 1,
127474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown
12865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        // The display size or orientation changed.
12965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        CHANGE_DISPLAY_INFO = 1 << 2,
13065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
131daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown        // The visible touches option changed.
132daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown        CHANGE_SHOW_TOUCHES = 1 << 3,
133daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown
1346ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown        // The keyboard layouts must be reloaded.
1356ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown        CHANGE_KEYBOARD_LAYOUTS = 1 << 4,
1366ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown
1375bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown        // The device name alias supplied by the may have changed for some devices.
1385bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown        CHANGE_DEVICE_ALIAS = 1 << 5,
1395bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown
140474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown        // All devices must be reopened.
141474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown        CHANGE_MUST_REOPEN = 1 << 31,
142474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown    };
143474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown
144214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // Gets the amount of time to disable virtual keys after the screen is touched
145214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // in order to filter out accidental virtual key presses due to swiping gestures
146214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // or taps near the edge of the display.  May be 0 to disable the feature.
147214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    nsecs_t virtualKeyQuietTime;
148214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown
149214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // The excluded device names for the platform.
150214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // Devices with these names will be ignored.
151214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    Vector<String8> excludedDeviceNames;
152214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown
15319c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    // Velocity control parameters for mouse pointer movements.
15419c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    VelocityControlParameters pointerVelocityControlParameters;
15519c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown
15619c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    // Velocity control parameters for mouse wheel movements.
15719c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    VelocityControlParameters wheelVelocityControlParameters;
15819c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown
159474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown    // True if pointer gestures are enabled.
160474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown    bool pointerGesturesEnabled;
161474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown
162214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // Quiet time between certain pointer gesture transitions.
163214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // Time to allow for all fingers or buttons to settle into a stable state before
164214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // starting a new gesture.
165214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    nsecs_t pointerGestureQuietInterval;
166214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown
167214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // The minimum speed that a pointer must travel for us to consider switching the active
168214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // touch pointer to it during a drag.  This threshold is set to avoid switching due
169214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // to noise from a finger resting on the touch pad (perhaps just pressing it down).
170214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    float pointerGestureDragMinSwitchSpeed; // in pixels per second
171214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown
172214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // Tap gesture delay time.
173214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // The time between down and up must be less than this to be considered a tap.
174214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    nsecs_t pointerGestureTapInterval;
175214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown
176214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // Tap drag gesture delay time.
177214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // The time between the previous tap's up and the next down must be less than
178214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // this to be considered a drag.  Otherwise, the previous tap is finished and a
179214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // new tap begins.
180214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    //
181214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // Note that the previous tap will be held down for this entire duration so this
182214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // interval must be shorter than the long press timeout.
183214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    nsecs_t pointerGestureTapDragInterval;
184214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown
185214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // The distance in pixels that the pointer is allowed to move from initial down
186214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // to up and still be called a tap.
187214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    float pointerGestureTapSlop; // in pixels
188214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown
189214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // Time after the first touch points go down to settle on an initial centroid.
190214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // This is intended to be enough time to handle cases where the user puts down two
191214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // fingers at almost but not quite exactly the same time.
192214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    nsecs_t pointerGestureMultitouchSettleInterval;
193214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown
194214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // The transition from PRESS to SWIPE or FREEFORM gesture mode is made when
195bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown    // at least two pointers have moved at least this far from their starting place.
196bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown    float pointerGestureMultitouchMinDistance; // in pixels
197214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown
198214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // The transition from PRESS to SWIPE gesture mode can only occur when the
199214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // cosine of the angle between the two vectors is greater than or equal to than this value
200214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // which indicates that the vectors are oriented in the same direction.
201214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // When the vectors are oriented in the exactly same direction, the cosine is 1.0.
202214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // (In exactly opposite directions, the cosine is -1.0.)
203214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    float pointerGestureSwipeTransitionAngleCosine;
204214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown
205214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // The transition from PRESS to SWIPE gesture mode can only occur when the
206214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // fingers are no more than this far apart relative to the diagonal size of
207214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // the touch pad.  For example, a ratio of 0.5 means that the fingers must be
208214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // no more than half the diagonal size of the touch pad apart.
209214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    float pointerGestureSwipeMaxWidthRatio;
210214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown
211214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // The gesture movement speed factor relative to the size of the display.
212214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // Movement speed applies when the fingers are moving in the same direction.
213214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // Without acceleration, a full swipe of the touch pad diagonal in movement mode
214214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // will cover this portion of the display diagonal.
215214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    float pointerGestureMovementSpeedRatio;
216214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown
217214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // The gesture zoom speed factor relative to the size of the display.
218214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // Zoom speed applies when the fingers are mostly moving relative to each other
219214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // to execute a scale gesture or similar.
220214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // Without acceleration, a full swipe of the touch pad diagonal in zoom mode
221214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // will cover this portion of the display diagonal.
222214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    float pointerGestureZoomSpeedRatio;
223214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown
224daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown    // True to show the location of touches on the touch screen as spots.
225daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown    bool showTouches;
226daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown
227214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    InputReaderConfiguration() :
228214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown            virtualKeyQuietTime(0),
229bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown            pointerVelocityControlParameters(1.0f, 500.0f, 3000.0f, 3.0f),
23019c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown            wheelVelocityControlParameters(1.0f, 15.0f, 50.0f, 4.0f),
231474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown            pointerGesturesEnabled(true),
232214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown            pointerGestureQuietInterval(100 * 1000000LL), // 100 ms
233214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown            pointerGestureDragMinSwitchSpeed(50), // 50 pixels per second
234214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown            pointerGestureTapInterval(150 * 1000000LL), // 150 ms
235214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown            pointerGestureTapDragInterval(150 * 1000000LL), // 150 ms
236214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown            pointerGestureTapSlop(10.0f), // 10 pixels
237214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown            pointerGestureMultitouchSettleInterval(100 * 1000000LL), // 100 ms
238bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown            pointerGestureMultitouchMinDistance(15), // 15 pixels
2396674d9bf0a53387df0cf8482458cf5f9ab274ec0Jeff Brown            pointerGestureSwipeTransitionAngleCosine(0.2588f), // cosine of 75 degrees
240bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown            pointerGestureSwipeMaxWidthRatio(0.25f),
241bb3fcba0caf697f1d238a2cbefdf1efe06eded99Jeff Brown            pointerGestureMovementSpeedRatio(0.8f),
242daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown            pointerGestureZoomSpeedRatio(0.3f),
243daf4a127ba2af82a3fb477044b872719a0ab1827Jeff Brown            showTouches(false) { }
24465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
245d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    bool getDisplayInfo(bool external, DisplayViewport* outViewport) const;
246d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    void setDisplayInfo(bool external, const DisplayViewport& viewport);
24765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
24865fd251c3913fc921468a3dad190810db19eb9dfJeff Brownprivate:
249d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    DisplayViewport mInternalDisplay;
250d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown    DisplayViewport mExternalDisplay;
251214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown};
252214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown
253214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown
254214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown/*
2559c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown * Input reader policy interface.
2569c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown *
2579c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown * The input reader policy is used by the input reader to interact with the Window Manager
2589c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown * and other system components.
2599c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown *
2609c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown * The actual implementation is partially supported by callbacks into the DVM
2619c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown * via JNI.  This interface is also mocked in the unit tests.
262be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown *
263be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown * These methods must NOT re-enter the input reader since they may be called while
264be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown * holding the input reader lock.
2659c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown */
2669c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownclass InputReaderPolicyInterface : public virtual RefBase {
2679c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownprotected:
2689c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    InputReaderPolicyInterface() { }
2699c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    virtual ~InputReaderPolicyInterface() { }
2709c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
2719c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownpublic:
272214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    /* Gets the input reader configuration. */
273214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    virtual void getReaderConfiguration(InputReaderConfiguration* outConfig) = 0;
27483c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
27583c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    /* Gets a pointer controller associated with the specified cursor device (ie. a mouse). */
27683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    virtual sp<PointerControllerInterface> obtainPointerController(int32_t deviceId) = 0;
277af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown
278af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    /* Notifies the input reader policy that some input devices have changed
279af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     * and provides information about all current input devices.
280af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     */
281af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    virtual void notifyInputDevicesChanged(const Vector<InputDeviceInfo>& inputDevices) = 0;
2826ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown
2836ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown    /* Gets the keyboard layout for a particular input device. */
2846ec6f79e1ac1714e3b837796e99f07ff88f66601Jeff Brown    virtual sp<KeyCharacterMap> getKeyboardLayoutOverlay(const String8& inputDeviceDescriptor) = 0;
2855bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown
2865bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown    /* Gets a user-supplied alias for a particular input device, or an empty string if none. */
2875bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown    virtual String8 getDeviceAlias(const InputDeviceIdentifier& identifier) = 0;
2889c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown};
2899c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
2909c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
291be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown/* Processes raw input events and sends cooked event data to an input listener. */
29246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownclass InputReaderInterface : public virtual RefBase {
29346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownprotected:
29446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    InputReaderInterface() { }
29546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual ~InputReaderInterface() { }
29646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
29746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownpublic:
298b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    /* Dumps the state of the input reader.
299b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown     *
300b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown     * This method may be called on any thread (usually by the input manager). */
301b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    virtual void dump(String8& dump) = 0;
302b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
30389ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown    /* Called by the heatbeat to ensures that the reader has not deadlocked. */
30489ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown    virtual void monitor() = 0;
30589ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown
30646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    /* Runs a single iteration of the processing loop.
30746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown     * Nominally reads and processes one incoming message from the EventHub.
30846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown     *
30946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown     * This method should be called on the input reader thread.
31046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown     */
31146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual void loopOnce() = 0;
31246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
313af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    /* Gets information about all input devices.
3149c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown     *
3159c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown     * This method may be called on any thread (usually by the input manager).
3169c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown     */
317af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    virtual void getInputDevices(Vector<InputDeviceInfo>& outInputDevices) = 0;
3186d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
3196d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /* Query current input state. */
3206d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual int32_t getScanCodeState(int32_t deviceId, uint32_t sourceMask,
3216d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown            int32_t scanCode) = 0;
3226d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual int32_t getKeyCodeState(int32_t deviceId, uint32_t sourceMask,
3236d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown            int32_t keyCode) = 0;
3246d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual int32_t getSwitchState(int32_t deviceId, uint32_t sourceMask,
3256d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown            int32_t sw) = 0;
3269c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
3279c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    /* Determine whether physical keys exist for the given framework-domain key codes. */
3286d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual bool hasKeys(int32_t deviceId, uint32_t sourceMask,
3296d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown            size_t numCodes, const int32_t* keyCodes, uint8_t* outFlags) = 0;
3301a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown
331474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown    /* Requests that a reconfiguration of all input devices.
332474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown     * The changes flag is a bitfield that indicates what has changed and whether
333474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown     * the input devices must all be reopened. */
334474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown    virtual void requestRefreshConfiguration(uint32_t changes) = 0;
335a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown
336a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    /* Controls the vibrator of a particular input device. */
337a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    virtual void vibrate(int32_t deviceId, const nsecs_t* pattern, size_t patternSize,
338a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown            ssize_t repeat, int32_t token) = 0;
339a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    virtual void cancelVibrate(int32_t deviceId, int32_t token) = 0;
3406d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown};
3416d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
3426d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
3436d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown/* Internal interface used by individual input devices to access global input device state
3446d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * and parameters maintained by the input reader.
3456d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown */
3466d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownclass InputReaderContext {
347c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownpublic:
3486d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    InputReaderContext() { }
3496d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual ~InputReaderContext() { }
3506d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
3516d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual void updateGlobalMetaState() = 0;
3526d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual int32_t getGlobalMetaState() = 0;
3536d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
354fe50892af3b365806a767298dfd8e86447682581Jeff Brown    virtual void disableVirtualKeysUntil(nsecs_t time) = 0;
355fe50892af3b365806a767298dfd8e86447682581Jeff Brown    virtual bool shouldDropVirtualKey(nsecs_t now,
356fe50892af3b365806a767298dfd8e86447682581Jeff Brown            InputDevice* device, int32_t keyCode, int32_t scanCode) = 0;
357fe50892af3b365806a767298dfd8e86447682581Jeff Brown
35805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    virtual void fadePointer() = 0;
35905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
360aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown    virtual void requestTimeoutAtTime(nsecs_t when) = 0;
361af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    virtual int32_t bumpGeneration() = 0;
362aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown
3636d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual InputReaderPolicyInterface* getPolicy() = 0;
364be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    virtual InputListenerInterface* getListener() = 0;
3656d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual EventHubInterface* getEventHub() = 0;
36646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown};
36746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3689c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
36946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown/* The input reader reads raw event data from the event hub and processes it into input events
370be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown * that it sends to the input listener.  Some functions of the input reader, such as early
3719c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown * event filtering in low power states, are controlled by a separate policy object.
3729c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown *
373be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown * The InputReader owns a collection of InputMappers.  Most of the work it does happens
374be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown * on the input reader thread but the InputReader can receive queries from other system
375be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown * components running on arbitrary threads.  To keep things manageable, the InputReader
376be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown * uses a single Mutex to guard its state.  The Mutex may be held while calling into the
377be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown * EventHub or the InputReaderPolicy but it is never held while calling into the
378be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown * InputListener.
37946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */
380be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownclass InputReader : public InputReaderInterface {
38146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownpublic:
38246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    InputReader(const sp<EventHubInterface>& eventHub,
3839c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown            const sp<InputReaderPolicyInterface>& policy,
384be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            const sp<InputListenerInterface>& listener);
38546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual ~InputReader();
38646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
387b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    virtual void dump(String8& dump);
38889ef0720ee8e0ac6ae1758faa917e4d6c9606fb4Jeff Brown    virtual void monitor();
389b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
39046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual void loopOnce();
39146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
392af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    virtual void getInputDevices(Vector<InputDeviceInfo>& outInputDevices);
3939c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
3946d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual int32_t getScanCodeState(int32_t deviceId, uint32_t sourceMask,
3956d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown            int32_t scanCode);
3966d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual int32_t getKeyCodeState(int32_t deviceId, uint32_t sourceMask,
3976d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown            int32_t keyCode);
3986d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual int32_t getSwitchState(int32_t deviceId, uint32_t sourceMask,
3996d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown            int32_t sw);
4009c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
4016d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual bool hasKeys(int32_t deviceId, uint32_t sourceMask,
4026d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown            size_t numCodes, const int32_t* keyCodes, uint8_t* outFlags);
4039c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
404474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown    virtual void requestRefreshConfiguration(uint32_t changes);
4051a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown
406a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    virtual void vibrate(int32_t deviceId, const nsecs_t* pattern, size_t patternSize,
407a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown            ssize_t repeat, int32_t token);
408a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    virtual void cancelVibrate(int32_t deviceId, int32_t token);
409a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown
410c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected:
411be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // These members are protected so they can be instrumented by test cases.
412ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright    virtual InputDevice* createDeviceLocked(int32_t deviceId, int32_t controllerNumber,
413e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown            const InputDeviceIdentifier& identifier, uint32_t classes);
414be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
415be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    class ContextImpl : public InputReaderContext {
416be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        InputReader* mReader;
417be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
418be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    public:
419be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        ContextImpl(InputReader* reader);
420be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
421be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        virtual void updateGlobalMetaState();
422be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        virtual int32_t getGlobalMetaState();
423be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        virtual void disableVirtualKeysUntil(nsecs_t time);
424be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        virtual bool shouldDropVirtualKey(nsecs_t now,
425be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown                InputDevice* device, int32_t keyCode, int32_t scanCode);
426be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        virtual void fadePointer();
427be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        virtual void requestTimeoutAtTime(nsecs_t when);
428af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        virtual int32_t bumpGeneration();
429be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        virtual InputReaderPolicyInterface* getPolicy();
430be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        virtual InputListenerInterface* getListener();
431be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        virtual EventHubInterface* getEventHub();
432be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    } mContext;
433be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
434be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    friend class ContextImpl;
435c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
43646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownprivate:
437be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    Mutex mLock;
438be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
439112b5f52c5a4b6743eeb7b26a8896c7636c74455Jeff Brown    Condition mReaderIsAliveCondition;
440112b5f52c5a4b6743eeb7b26a8896c7636c74455Jeff Brown
44146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    sp<EventHubInterface> mEventHub;
4429c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    sp<InputReaderPolicyInterface> mPolicy;
443be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    sp<QueuedInputListener> mQueuedListener;
44446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
445214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    InputReaderConfiguration mConfig;
446214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown
447b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown    // The event queue.
448b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown    static const int EVENT_BUFFER_SIZE = 256;
449b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown    RawEvent mEventBuffer[EVENT_BUFFER_SIZE];
450b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown
45146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    KeyedVector<int32_t, InputDevice*> mDevices;
45246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
4536d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    // low-level input event decoding and device management
454be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void processEventsLocked(const RawEvent* rawEvents, size_t count);
4556d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
45665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void addDeviceLocked(nsecs_t when, int32_t deviceId);
45765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void removeDeviceLocked(nsecs_t when, int32_t deviceId);
458be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void processEventsForDeviceLocked(int32_t deviceId, const RawEvent* rawEvents, size_t count);
459be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void timeoutExpiredLocked(nsecs_t when);
4606d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
461be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void handleConfigurationChangedLocked(nsecs_t when);
46246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
463be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    int32_t mGlobalMetaState;
464be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void updateGlobalMetaStateLocked();
465be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    int32_t getGlobalMetaStateLocked();
4669c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
467be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void fadePointerLocked();
4686d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
469af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    int32_t mGeneration;
470af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    int32_t bumpGenerationLocked();
471af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown
472af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    void getInputDevicesLocked(Vector<InputDeviceInfo>& outInputDevices);
473af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown
474be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    nsecs_t mDisableVirtualKeysTimeout;
475be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void disableVirtualKeysUntilLocked(nsecs_t time);
476be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    bool shouldDropVirtualKeyLocked(nsecs_t now,
477fe50892af3b365806a767298dfd8e86447682581Jeff Brown            InputDevice* device, int32_t keyCode, int32_t scanCode);
478fe50892af3b365806a767298dfd8e86447682581Jeff Brown
479be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    nsecs_t mNextTimeout;
480be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void requestTimeoutAtTimeLocked(nsecs_t when);
481aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown
482be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    uint32_t mConfigurationChangesToRefresh;
483be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void refreshConfigurationLocked(uint32_t changes);
4841a84fd1fb7a51f3fe4f8865e1cdd09f3490f696cJeff Brown
4856d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    // state queries
4866d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    typedef int32_t (InputDevice::*GetStateFunc)(uint32_t sourceMask, int32_t code);
487be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    int32_t getStateLocked(int32_t deviceId, uint32_t sourceMask, int32_t code,
4886d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown            GetStateFunc getStateFunc);
489be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    bool markSupportedKeyCodesLocked(int32_t deviceId, uint32_t sourceMask, size_t numCodes,
4906d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown            const int32_t* keyCodes, uint8_t* outFlags);
49146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown};
49246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
49346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
49446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown/* Reads raw events from the event hub and processes them, endlessly. */
49546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownclass InputReaderThread : public Thread {
49646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownpublic:
49746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    InputReaderThread(const sp<InputReaderInterface>& reader);
49846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual ~InputReaderThread();
49946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
50046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownprivate:
50146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    sp<InputReaderInterface> mReader;
50246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
50346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual bool threadLoop();
50446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown};
50546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
5066d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
5076d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown/* Represents the state of a single input device. */
5086d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownclass InputDevice {
5096d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownpublic:
510ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright    InputDevice(InputReaderContext* context, int32_t id, int32_t generation, int32_t
511ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright            controllerNumber, const InputDeviceIdentifier& identifier, uint32_t classes);
5126d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    ~InputDevice();
5136d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
5146d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    inline InputReaderContext* getContext() { return mContext; }
515ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright    inline int32_t getId() const { return mId; }
516ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright    inline int32_t getControllerNumber() const { return mControllerNumber; }
517ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright    inline int32_t getGeneration() const { return mGeneration; }
518ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright    inline const String8& getName() const { return mIdentifier.name; }
519ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright    inline uint32_t getClasses() const { return mClasses; }
520ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright    inline uint32_t getSources() const { return mSources; }
5216d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
52256194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    inline bool isExternal() { return mIsExternal; }
52356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    inline void setExternal(bool external) { mIsExternal = external; }
52456194ebec6212e229f4ccdaa4b187166d20013efJeff Brown
5256d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    inline bool isIgnored() { return mMappers.isEmpty(); }
5266d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
527ef3d7e861154c1ce1b8f86292138fc36c30232a3Jeff Brown    void dump(String8& dump);
5286d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    void addMapper(InputMapper* mapper);
52965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void configure(nsecs_t when, const InputReaderConfiguration* config, uint32_t changes);
53065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void reset(nsecs_t when);
531b7198743ab3976b30d4655c1e065ca33e372b6afJeff Brown    void process(const RawEvent* rawEvents, size_t count);
532aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown    void timeoutExpired(nsecs_t when);
5336d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
5346d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    void getDeviceInfo(InputDeviceInfo* outDeviceInfo);
5356d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode);
5366d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode);
5376d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    int32_t getSwitchState(uint32_t sourceMask, int32_t switchCode);
5386d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes,
5396d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown            const int32_t* keyCodes, uint8_t* outFlags);
540a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    void vibrate(const nsecs_t* pattern, size_t patternSize, ssize_t repeat, int32_t token);
541a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    void cancelVibrate(int32_t token);
5426d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
5436d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    int32_t getMetaState();
5446d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
54505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    void fadePointer();
54605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
547af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    void bumpGeneration();
548af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown
54965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void notifyReset(nsecs_t when);
55065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
55149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    inline const PropertyMap& getConfiguration() { return mConfiguration; }
55249754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    inline EventHubInterface* getEventHub() { return mContext->getEventHub(); }
5538d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
55465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    bool hasKey(int32_t code) {
55565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        return getEventHub()->hasScanCode(mId, code);
55665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    }
55765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
55800710e906bdafd58386ee7f81fa84addd218122fJeff Brown    bool hasAbsoluteAxis(int32_t code) {
55900710e906bdafd58386ee7f81fa84addd218122fJeff Brown        RawAbsoluteAxisInfo info;
56000710e906bdafd58386ee7f81fa84addd218122fJeff Brown        getEventHub()->getAbsoluteAxisInfo(mId, code, &info);
56100710e906bdafd58386ee7f81fa84addd218122fJeff Brown        return info.valid;
56200710e906bdafd58386ee7f81fa84addd218122fJeff Brown    }
56300710e906bdafd58386ee7f81fa84addd218122fJeff Brown
56465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    bool isKeyPressed(int32_t code) {
56565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        return getEventHub()->getScanCodeState(mId, code) == AKEY_STATE_DOWN;
56665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    }
56765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
56865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    int32_t getAbsoluteAxisValue(int32_t code) {
56965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        int32_t value;
57065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        getEventHub()->getAbsoluteAxisValue(mId, code, &value);
57165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        return value;
57265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    }
57365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
5746d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownprivate:
5756d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    InputReaderContext* mContext;
5766d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    int32_t mId;
577ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright    int32_t mControllerNumber;
578af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    int32_t mGeneration;
579e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown    InputDeviceIdentifier mIdentifier;
5805bbd4b4f5fc19302fa017ad6afee6eb2d489d91aJeff Brown    String8 mAlias;
5819ee285afe740ff13d176c9d8430979dfd9575a23Jeff Brown    uint32_t mClasses;
5826d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
5836d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    Vector<InputMapper*> mMappers;
5846d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
5856d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    uint32_t mSources;
58656194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    bool mIsExternal;
58780fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown    bool mDropUntilNextSync;
5886d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
5896d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    typedef int32_t (InputMapper::*GetStateFunc)(uint32_t sourceMask, int32_t code);
5906d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    int32_t getState(uint32_t sourceMask, int32_t code, GetStateFunc getStateFunc);
5918d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
59247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    PropertyMap mConfiguration;
5936d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown};
5946d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
5956d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
59649754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown/* Keeps track of the state of mouse or touch pad buttons. */
59749754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brownclass CursorButtonAccumulator {
59849754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brownpublic:
59949754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    CursorButtonAccumulator();
60065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void reset(InputDevice* device);
60149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
60249754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    void process(const RawEvent* rawEvent);
60349754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
60449754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    uint32_t getButtonState() const;
60549754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
60649754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brownprivate:
60749754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    bool mBtnLeft;
60849754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    bool mBtnRight;
60949754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    bool mBtnMiddle;
61049754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    bool mBtnBack;
61149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    bool mBtnSide;
61249754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    bool mBtnForward;
61349754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    bool mBtnExtra;
61449754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    bool mBtnTask;
61565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
61665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void clearButtons();
61749754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown};
61849754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
61949754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
62049754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown/* Keeps track of cursor movements. */
62149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
62249754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brownclass CursorMotionAccumulator {
62349754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brownpublic:
62449754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    CursorMotionAccumulator();
62565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void reset(InputDevice* device);
62665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
62765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void process(const RawEvent* rawEvent);
62865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void finishSync();
62965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
63065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    inline int32_t getRelativeX() const { return mRelX; }
63165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    inline int32_t getRelativeY() const { return mRelY; }
63265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
63365fd251c3913fc921468a3dad190810db19eb9dfJeff Brownprivate:
63465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    int32_t mRelX;
63565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    int32_t mRelY;
63649754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
63749754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    void clearRelativeAxes();
63865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown};
63965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
64065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
64165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown/* Keeps track of cursor scrolling motions. */
64265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
64365fd251c3913fc921468a3dad190810db19eb9dfJeff Brownclass CursorScrollAccumulator {
64465fd251c3913fc921468a3dad190810db19eb9dfJeff Brownpublic:
64565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    CursorScrollAccumulator();
64665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void configure(InputDevice* device);
64765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void reset(InputDevice* device);
64865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
64949754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    void process(const RawEvent* rawEvent);
65065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void finishSync();
65149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
65249754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    inline bool haveRelativeVWheel() const { return mHaveRelWheel; }
65349754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    inline bool haveRelativeHWheel() const { return mHaveRelHWheel; }
65449754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
65549754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    inline int32_t getRelativeX() const { return mRelX; }
65649754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    inline int32_t getRelativeY() const { return mRelY; }
65749754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    inline int32_t getRelativeVWheel() const { return mRelWheel; }
65849754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    inline int32_t getRelativeHWheel() const { return mRelHWheel; }
65949754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
66049754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brownprivate:
66149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    bool mHaveRelWheel;
66249754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    bool mHaveRelHWheel;
66349754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
66449754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    int32_t mRelX;
66549754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    int32_t mRelY;
66649754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    int32_t mRelWheel;
66749754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    int32_t mRelHWheel;
66865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
66965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void clearRelativeAxes();
67049754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown};
67149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
67249754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
67349754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown/* Keeps track of the state of touch, stylus and tool buttons. */
67449754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brownclass TouchButtonAccumulator {
67549754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brownpublic:
67649754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    TouchButtonAccumulator();
67749754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    void configure(InputDevice* device);
67865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void reset(InputDevice* device);
67949754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
68049754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    void process(const RawEvent* rawEvent);
68149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
68249754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    uint32_t getButtonState() const;
68349754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    int32_t getToolType() const;
684d87c6d5fd5e620ecb1a7a401d2b31c6cf2e1a851Jeff Brown    bool isToolActive() const;
68549754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    bool isHovering() const;
68600710e906bdafd58386ee7f81fa84addd218122fJeff Brown    bool hasStylus() const;
68749754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
68849754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brownprivate:
68949754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    bool mHaveBtnTouch;
69000710e906bdafd58386ee7f81fa84addd218122fJeff Brown    bool mHaveStylus;
69149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
69249754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    bool mBtnTouch;
69349754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    bool mBtnStylus;
69449754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    bool mBtnStylus2;
69549754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    bool mBtnToolFinger;
69649754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    bool mBtnToolPen;
69749754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    bool mBtnToolRubber;
69865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    bool mBtnToolBrush;
69965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    bool mBtnToolPencil;
70065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    bool mBtnToolAirbrush;
70165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    bool mBtnToolMouse;
70265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    bool mBtnToolLens;
703ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    bool mBtnToolDoubleTap;
704ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    bool mBtnToolTripleTap;
705ea6892e02e10a57673a42f0922ad28694595dcaaJeff Brown    bool mBtnToolQuadTap;
70665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
70765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void clearButtons();
70849754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown};
70949754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
71049754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
711be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown/* Raw axis information from the driver. */
712be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownstruct RawPointerAxes {
713be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    RawAbsoluteAxisInfo x;
714be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    RawAbsoluteAxisInfo y;
715be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    RawAbsoluteAxisInfo pressure;
716be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    RawAbsoluteAxisInfo touchMajor;
717be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    RawAbsoluteAxisInfo touchMinor;
718be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    RawAbsoluteAxisInfo toolMajor;
719be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    RawAbsoluteAxisInfo toolMinor;
720be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    RawAbsoluteAxisInfo orientation;
721be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    RawAbsoluteAxisInfo distance;
72265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    RawAbsoluteAxisInfo tiltX;
72365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    RawAbsoluteAxisInfo tiltY;
724be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    RawAbsoluteAxisInfo trackingId;
725be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    RawAbsoluteAxisInfo slot;
726be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
727be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    RawPointerAxes();
728be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void clear();
729be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown};
730be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
731be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
732be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown/* Raw data for a collection of pointers including a pointer id mapping table. */
733be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownstruct RawPointerData {
734be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    struct Pointer {
735be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        uint32_t id;
736be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        int32_t x;
737be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        int32_t y;
738be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        int32_t pressure;
739be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        int32_t touchMajor;
740be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        int32_t touchMinor;
741be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        int32_t toolMajor;
742be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        int32_t toolMinor;
743be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        int32_t orientation;
744be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        int32_t distance;
74565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        int32_t tiltX;
74665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        int32_t tiltY;
747be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        int32_t toolType; // a fully decoded AMOTION_EVENT_TOOL_TYPE constant
748be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        bool isHovering;
749be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    };
750be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
751be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    uint32_t pointerCount;
752be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    Pointer pointers[MAX_POINTERS];
753be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    BitSet32 hoveringIdBits, touchingIdBits;
754be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    uint32_t idToIndex[MAX_POINTER_ID + 1];
755be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
756be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    RawPointerData();
757be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void clear();
758be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void copyFrom(const RawPointerData& other);
759be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void getCentroidOfTouchingPointers(float* outX, float* outY) const;
760be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
761be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    inline void markIdBit(uint32_t id, bool isHovering) {
762be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        if (isHovering) {
763be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            hoveringIdBits.markBit(id);
764be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        } else {
765be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            touchingIdBits.markBit(id);
766be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        }
767be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    }
768be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
769be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    inline void clearIdBits() {
770be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        hoveringIdBits.clear();
771be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        touchingIdBits.clear();
772be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    }
773be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
774be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    inline const Pointer& pointerForId(uint32_t id) const {
775be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        return pointers[idToIndex[id]];
776be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    }
777be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
778be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    inline bool isHovering(uint32_t pointerIndex) {
779be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        return pointers[pointerIndex].isHovering;
780be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    }
781be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown};
782be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
783be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
784be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown/* Cooked data for a collection of pointers including a pointer id mapping table. */
785be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownstruct CookedPointerData {
786be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    uint32_t pointerCount;
787be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    PointerProperties pointerProperties[MAX_POINTERS];
788be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    PointerCoords pointerCoords[MAX_POINTERS];
789be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    BitSet32 hoveringIdBits, touchingIdBits;
790be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    uint32_t idToIndex[MAX_POINTER_ID + 1];
791be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
792be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    CookedPointerData();
793be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void clear();
794be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void copyFrom(const CookedPointerData& other);
795be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
7964dac901f011e7c15882e260441225633a6435e49Jeff Brown    inline const PointerCoords& pointerCoordsForId(uint32_t id) const {
7974dac901f011e7c15882e260441225633a6435e49Jeff Brown        return pointerCoords[idToIndex[id]];
7984dac901f011e7c15882e260441225633a6435e49Jeff Brown    }
7994dac901f011e7c15882e260441225633a6435e49Jeff Brown
800be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    inline bool isHovering(uint32_t pointerIndex) {
801be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        return hoveringIdBits.hasBit(pointerProperties[pointerIndex].id);
802be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    }
803be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown};
804be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
805be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
80649754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown/* Keeps track of the state of single-touch protocol. */
80749754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brownclass SingleTouchMotionAccumulator {
80849754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brownpublic:
80949754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    SingleTouchMotionAccumulator();
81049754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
81149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    void process(const RawEvent* rawEvent);
81265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void reset(InputDevice* device);
81349754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
81449754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    inline int32_t getAbsoluteX() const { return mAbsX; }
81549754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    inline int32_t getAbsoluteY() const { return mAbsY; }
81649754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    inline int32_t getAbsolutePressure() const { return mAbsPressure; }
81749754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    inline int32_t getAbsoluteToolWidth() const { return mAbsToolWidth; }
81849754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    inline int32_t getAbsoluteDistance() const { return mAbsDistance; }
81965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    inline int32_t getAbsoluteTiltX() const { return mAbsTiltX; }
82065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    inline int32_t getAbsoluteTiltY() const { return mAbsTiltY; }
82149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
82249754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brownprivate:
82349754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    int32_t mAbsX;
82449754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    int32_t mAbsY;
82549754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    int32_t mAbsPressure;
82649754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    int32_t mAbsToolWidth;
82749754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    int32_t mAbsDistance;
82865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    int32_t mAbsTiltX;
82965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    int32_t mAbsTiltY;
83065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
83165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void clearAbsoluteAxes();
83249754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown};
83349754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
83449754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
83549754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown/* Keeps track of the state of multi-touch protocol. */
83649754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brownclass MultiTouchMotionAccumulator {
83749754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brownpublic:
83849754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    class Slot {
83949754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    public:
84049754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        inline bool isInUse() const { return mInUse; }
84149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        inline int32_t getX() const { return mAbsMTPositionX; }
84249754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        inline int32_t getY() const { return mAbsMTPositionY; }
84349754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        inline int32_t getTouchMajor() const { return mAbsMTTouchMajor; }
84449754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        inline int32_t getTouchMinor() const {
84549754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown            return mHaveAbsMTTouchMinor ? mAbsMTTouchMinor : mAbsMTTouchMajor; }
84649754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        inline int32_t getToolMajor() const { return mAbsMTWidthMajor; }
84749754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        inline int32_t getToolMinor() const {
84849754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown            return mHaveAbsMTWidthMinor ? mAbsMTWidthMinor : mAbsMTWidthMajor; }
84949754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        inline int32_t getOrientation() const { return mAbsMTOrientation; }
85049754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        inline int32_t getTrackingId() const { return mAbsMTTrackingId; }
85149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        inline int32_t getPressure() const { return mAbsMTPressure; }
85249754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        inline int32_t getDistance() const { return mAbsMTDistance; }
85349754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        inline int32_t getToolType() const;
85449754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
85549754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    private:
85649754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        friend class MultiTouchMotionAccumulator;
85749754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
85849754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        bool mInUse;
85949754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        bool mHaveAbsMTTouchMinor;
86049754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        bool mHaveAbsMTWidthMinor;
86149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        bool mHaveAbsMTToolType;
86249754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
86349754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        int32_t mAbsMTPositionX;
86449754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        int32_t mAbsMTPositionY;
86549754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        int32_t mAbsMTTouchMajor;
86649754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        int32_t mAbsMTTouchMinor;
86749754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        int32_t mAbsMTWidthMajor;
86849754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        int32_t mAbsMTWidthMinor;
86949754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        int32_t mAbsMTOrientation;
87049754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        int32_t mAbsMTTrackingId;
87149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        int32_t mAbsMTPressure;
87249754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        int32_t mAbsMTDistance;
873be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        int32_t mAbsMTToolType;
87449754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
87549754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        Slot();
87649754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown        void clear();
87749754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    };
87849754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
87949754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    MultiTouchMotionAccumulator();
88049754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    ~MultiTouchMotionAccumulator();
88149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
88200710e906bdafd58386ee7f81fa84addd218122fJeff Brown    void configure(InputDevice* device, size_t slotCount, bool usingSlotsProtocol);
88365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void reset(InputDevice* device);
88449754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    void process(const RawEvent* rawEvent);
88565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void finishSync();
88600710e906bdafd58386ee7f81fa84addd218122fJeff Brown    bool hasStylus() const;
88749754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
88849754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    inline size_t getSlotCount() const { return mSlotCount; }
88949754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    inline const Slot* getSlot(size_t index) const { return &mSlots[index]; }
89049754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
89149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brownprivate:
89249754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    int32_t mCurrentSlot;
89349754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    Slot* mSlots;
89449754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    size_t mSlotCount;
89549754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    bool mUsingSlotsProtocol;
89600710e906bdafd58386ee7f81fa84addd218122fJeff Brown    bool mHaveStylus;
89765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
89865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void clearSlots(int32_t initialSlot);
89949754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown};
90049754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
90149754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown
9026d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown/* An input mapper transforms raw input events into cooked event data.
9036d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * A single input device can have multiple associated input mappers in order to interpret
9046d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * different classes of events.
90565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown *
90665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown * InputMapper lifecycle:
90765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown * - create
90865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown * - configure with 0 changes
90965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown * - reset
91065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown * - process, process, process (may occasionally reconfigure with non-zero changes or reset)
91165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown * - reset
91265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown * - destroy
9136d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown */
9146d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownclass InputMapper {
9156d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownpublic:
9166d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    InputMapper(InputDevice* device);
9176d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual ~InputMapper();
9186d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
9196d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    inline InputDevice* getDevice() { return mDevice; }
9206d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    inline int32_t getDeviceId() { return mDevice->getId(); }
9216d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    inline const String8 getDeviceName() { return mDevice->getName(); }
9226d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    inline InputReaderContext* getContext() { return mContext; }
9236d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    inline InputReaderPolicyInterface* getPolicy() { return mContext->getPolicy(); }
924be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    inline InputListenerInterface* getListener() { return mContext->getListener(); }
9256d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    inline EventHubInterface* getEventHub() { return mContext->getEventHub(); }
9266d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
9276d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual uint32_t getSources() = 0;
9286d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
929ef3d7e861154c1ce1b8f86292138fc36c30232a3Jeff Brown    virtual void dump(String8& dump);
93065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    virtual void configure(nsecs_t when, const InputReaderConfiguration* config, uint32_t changes);
93165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    virtual void reset(nsecs_t when);
9326d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual void process(const RawEvent* rawEvent) = 0;
933aa3855d5836d2a2d83baafdf6e40caf90d3dad1cJeff Brown    virtual void timeoutExpired(nsecs_t when);
9346d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
9356d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode);
9366d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode);
9376d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual int32_t getSwitchState(uint32_t sourceMask, int32_t switchCode);
9386d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes,
9396d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown            const int32_t* keyCodes, uint8_t* outFlags);
940a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    virtual void vibrate(const nsecs_t* pattern, size_t patternSize, ssize_t repeat,
941a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown            int32_t token);
942a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    virtual void cancelVibrate(int32_t token);
9436d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
9446d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual int32_t getMetaState();
9456d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
94605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    virtual void fadePointer();
94705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
9486d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownprotected:
9496d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    InputDevice* mDevice;
9506d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    InputReaderContext* mContext;
951cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
952be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    status_t getAbsoluteAxisInfo(int32_t axis, RawAbsoluteAxisInfo* axisInfo);
953af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    void bumpGeneration();
954be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
955cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    static void dumpRawAbsoluteAxisInfo(String8& dump,
956cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown            const RawAbsoluteAxisInfo& axis, const char* name);
9576d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown};
9586d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
9596d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
9606d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownclass SwitchInputMapper : public InputMapper {
9616d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownpublic:
9626d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    SwitchInputMapper(InputDevice* device);
9636d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual ~SwitchInputMapper();
9646d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
9656d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual uint32_t getSources();
9666d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual void process(const RawEvent* rawEvent);
9676d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
9686d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual int32_t getSwitchState(uint32_t sourceMask, int32_t switchCode);
9696d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
9706d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownprivate:
971bcc046af4ef171aa3aa3c6b64efb5cafc1e46cd3Jeff Brown    uint32_t mUpdatedSwitchValues;
972bcc046af4ef171aa3aa3c6b64efb5cafc1e46cd3Jeff Brown    uint32_t mUpdatedSwitchMask;
973bcc046af4ef171aa3aa3c6b64efb5cafc1e46cd3Jeff Brown
974bcc046af4ef171aa3aa3c6b64efb5cafc1e46cd3Jeff Brown    void processSwitch(int32_t switchCode, int32_t switchValue);
975bcc046af4ef171aa3aa3c6b64efb5cafc1e46cd3Jeff Brown    void sync(nsecs_t when);
9766d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown};
9776d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
9786d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
979a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brownclass VibratorInputMapper : public InputMapper {
980a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brownpublic:
981a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    VibratorInputMapper(InputDevice* device);
982a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    virtual ~VibratorInputMapper();
983a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown
984a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    virtual uint32_t getSources();
985a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
986a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    virtual void process(const RawEvent* rawEvent);
987a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown
988a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    virtual void vibrate(const nsecs_t* pattern, size_t patternSize, ssize_t repeat,
989a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown            int32_t token);
990a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    virtual void cancelVibrate(int32_t token);
991a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    virtual void timeoutExpired(nsecs_t when);
992a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    virtual void dump(String8& dump);
993a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown
994a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brownprivate:
995a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    bool mVibrating;
996a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    nsecs_t mPattern[MAX_VIBRATE_PATTERN_SIZE];
997a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    size_t mPatternSize;
998a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    ssize_t mRepeat;
999a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    int32_t mToken;
1000a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    ssize_t mIndex;
1001a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    nsecs_t mNextStepTime;
1002a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown
1003a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    void nextStep();
1004a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    void stopVibrating();
1005a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown};
1006a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown
1007a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown
10086d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownclass KeyboardInputMapper : public InputMapper {
10096d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownpublic:
1010efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    KeyboardInputMapper(InputDevice* device, uint32_t source, int32_t keyboardType);
10116d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual ~KeyboardInputMapper();
10126d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
10136d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual uint32_t getSources();
10146d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
1015ef3d7e861154c1ce1b8f86292138fc36c30232a3Jeff Brown    virtual void dump(String8& dump);
101665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    virtual void configure(nsecs_t when, const InputReaderConfiguration* config, uint32_t changes);
101765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    virtual void reset(nsecs_t when);
10186d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual void process(const RawEvent* rawEvent);
10196d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
10206d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode);
10216d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode);
10226d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes,
10236d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown            const int32_t* keyCodes, uint8_t* outFlags);
10246d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
10256d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual int32_t getMetaState();
10266d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
10276d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownprivate:
10286d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    struct KeyDown {
10296d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        int32_t keyCode;
10306d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        int32_t scanCode;
10316d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    };
10326d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
1033efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    uint32_t mSource;
10346d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    int32_t mKeyboardType;
10356d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
103665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    int32_t mOrientation; // orientation for dpad keys
103765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
1038be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    Vector<KeyDown> mKeyDowns; // keys that are down
1039be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    int32_t mMetaState;
1040be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    nsecs_t mDownTime; // time of most recent key down
1041be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
104249ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown    int32_t mCurrentHidUsage; // most recent HID usage seen this packet, or 0 if none
104349ccac530b5a798e3c4a79b66b51b8546a0deed1Jeff Brown
1044be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    struct LedState {
1045be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        bool avail; // led is available
1046be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        bool on;    // we think the led is currently on
1047be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    };
1048be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    LedState mCapsLockLedState;
1049be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    LedState mNumLockLedState;
1050be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    LedState mScrollLockLedState;
1051be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
105247e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    // Immutable configuration parameters.
105347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    struct Parameters {
1054d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown        bool hasAssociatedDisplay;
105547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown        bool orientationAware;
105647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    } mParameters;
105747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown
105847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    void configureParameters();
105947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    void dumpParameters(String8& dump);
106047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown
10616d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    bool isKeyboardOrGamepadKey(int32_t scanCode);
10626328cdc89e099806a1893b89e4c724d596272d9eJeff Brown
10636d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    void processKey(nsecs_t when, bool down, int32_t keyCode, int32_t scanCode,
10646d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown            uint32_t policyFlags);
10656d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
1066be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    ssize_t findKeyDown(int32_t scanCode);
1067497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
1068be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void resetLedState();
1069be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void initializeLedState(LedState& ledState, int32_t led);
1070be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void updateLedState(bool reset);
1071be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void updateLedStateForModifier(LedState& ledState, int32_t led,
1072497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            int32_t modifier, bool reset);
10736d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown};
10746d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
10756d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
107683c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brownclass CursorInputMapper : public InputMapper {
10776d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownpublic:
107883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    CursorInputMapper(InputDevice* device);
107983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    virtual ~CursorInputMapper();
10806d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
10816d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual uint32_t getSources();
10826d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
1083ef3d7e861154c1ce1b8f86292138fc36c30232a3Jeff Brown    virtual void dump(String8& dump);
108465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    virtual void configure(nsecs_t when, const InputReaderConfiguration* config, uint32_t changes);
108565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    virtual void reset(nsecs_t when);
10866d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual void process(const RawEvent* rawEvent);
10876d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
1088c3fc2d03d58a258c53c9265a70143d4af076b764Jeff Brown    virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode);
1089c3fc2d03d58a258c53c9265a70143d4af076b764Jeff Brown
109005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    virtual void fadePointer();
109105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
10926d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownprivate:
10936d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    // Amount that trackball needs to move in order to generate a key event.
10946d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    static const int32_t TRACKBALL_MOVEMENT_THRESHOLD = 6;
10956d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
109647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    // Immutable configuration parameters.
109747e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    struct Parameters {
109883c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        enum Mode {
109983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown            MODE_POINTER,
110083c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown            MODE_NAVIGATION,
110183c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        };
110283c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
110383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown        Mode mode;
1104d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown        bool hasAssociatedDisplay;
110547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown        bool orientationAware;
110647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    } mParameters;
11076d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
110849754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    CursorButtonAccumulator mCursorButtonAccumulator;
110949754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    CursorMotionAccumulator mCursorMotionAccumulator;
111065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    CursorScrollAccumulator mCursorScrollAccumulator;
11116d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
1112efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    int32_t mSource;
11136d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    float mXScale;
11146d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    float mYScale;
11156d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    float mXPrecision;
11166d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    float mYPrecision;
11176f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown
11186f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    float mVWheelScale;
11196f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    float mHWheelScale;
11206f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown
112119c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    // Velocity controls for mouse pointer and wheel movements.
112219c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    // The controls for X and Y wheel movements are separate to keep them decoupled.
112319c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    VelocityControl mPointerVelocityControl;
112419c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    VelocityControl mWheelXVelocityControl;
112519c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown    VelocityControl mWheelYVelocityControl;
112619c97d46fb57f87ff45d9e6ea7122b4eb21ede8cJeff Brown
112765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    int32_t mOrientation;
112865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
112983c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown    sp<PointerControllerInterface> mPointerController;
11306d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
1131be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    int32_t mButtonState;
1132be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    nsecs_t mDownTime;
11336328cdc89e099806a1893b89e4c724d596272d9eJeff Brown
113447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    void configureParameters();
113547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    void dumpParameters(String8& dump);
113647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown
11376d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    void sync(nsecs_t when);
11386d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown};
11396d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
11406d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
11416d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownclass TouchInputMapper : public InputMapper {
11426d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownpublic:
114347e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    TouchInputMapper(InputDevice* device);
11446d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual ~TouchInputMapper();
11456d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
11466d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual uint32_t getSources();
11476d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
1148ef3d7e861154c1ce1b8f86292138fc36c30232a3Jeff Brown    virtual void dump(String8& dump);
114965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    virtual void configure(nsecs_t when, const InputReaderConfiguration* config, uint32_t changes);
115065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    virtual void reset(nsecs_t when);
115165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    virtual void process(const RawEvent* rawEvent);
11526d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
11536d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode);
11546d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode);
11556d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes,
11566d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown            const int32_t* keyCodes, uint8_t* outFlags);
11576d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
1158ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    virtual void fadePointer();
115979ac969d7a84b7198f9ed814cc0b2f0b7e11a662Jeff Brown    virtual void timeoutExpired(nsecs_t when);
1160ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
11616d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownprotected:
116265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    CursorButtonAccumulator mCursorButtonAccumulator;
116365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    CursorScrollAccumulator mCursorScrollAccumulator;
116465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    TouchButtonAccumulator mTouchButtonAccumulator;
116565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
11666d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    struct VirtualKey {
11676d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        int32_t keyCode;
11686d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        int32_t scanCode;
11696d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        uint32_t flags;
11706d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
11716d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        // computed hit box, specified in touch screen coords based on known display size
11726d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        int32_t hitLeft;
11736d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        int32_t hitTop;
11746d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        int32_t hitRight;
11756d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        int32_t hitBottom;
11766d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
11776d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        inline bool isHit(int32_t x, int32_t y) const {
11786d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown            return x >= hitLeft && x <= hitRight && y >= hitTop && y <= hitBottom;
11796d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        }
11806d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    };
11816d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
118265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    // Input sources and device mode.
118365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    uint32_t mSource;
118465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
118565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    enum DeviceMode {
118665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        DEVICE_MODE_DISABLED, // input is disabled
118765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        DEVICE_MODE_DIRECT, // direct mapping (touchscreen)
118865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        DEVICE_MODE_UNSCALED, // unscaled mapping (touchpad)
11894dac901f011e7c15882e260441225633a6435e49Jeff Brown        DEVICE_MODE_NAVIGATION, // unscaled mapping with assist gesture (touch navigation)
119065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        DEVICE_MODE_POINTER, // pointer mapping (pointer)
119165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    };
119265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    DeviceMode mDeviceMode;
119383c09685f2e62bc3cf7e71bc61d903f4b9ccaeb4Jeff Brown
1194214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    // The reader's configuration.
1195474dcb5c3ddff737c4ac9fc44a1f7be569605e5fJeff Brown    InputReaderConfiguration mConfig;
1196214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown
11976d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    // Immutable configuration parameters.
11986d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    struct Parameters {
119947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown        enum DeviceType {
120047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown            DEVICE_TYPE_TOUCH_SCREEN,
120147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown            DEVICE_TYPE_TOUCH_PAD,
1202e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright            DEVICE_TYPE_TOUCH_NAVIGATION,
1203ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            DEVICE_TYPE_POINTER,
120447e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown        };
120547e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown
120647e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown        DeviceType deviceType;
1207d728bf514f257670fcb9aa22c6eaf97626072c93Jeff Brown        bool hasAssociatedDisplay;
1208bc68a59c024bdb745dac8e2ec7408a9f30595f1aJeff Brown        bool associatedDisplayIsExternal;
120947e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown        bool orientationAware;
12107ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright        bool hasButtonUnderPad;
121147e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown
12122352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        enum GestureMode {
12132352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown            GESTURE_MODE_POINTER,
12142352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown            GESTURE_MODE_SPOTS,
12152352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        };
12162352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        GestureMode gestureMode;
12176d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    } mParameters;
12186d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
12198d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    // Immutable calibration parameters in parsed form.
12208d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    struct Calibration {
1221a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown        // Size
1222a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown        enum SizeCalibration {
1223a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown            SIZE_CALIBRATION_DEFAULT,
1224a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown            SIZE_CALIBRATION_NONE,
1225a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown            SIZE_CALIBRATION_GEOMETRIC,
1226a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown            SIZE_CALIBRATION_DIAMETER,
1227037f727f49ddf4f5575f6440799261bd1289eb6eJeff Brown            SIZE_CALIBRATION_BOX,
1228a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown            SIZE_CALIBRATION_AREA,
12298d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        };
12308d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
1231a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown        SizeCalibration sizeCalibration;
12328d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
1233a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown        bool haveSizeScale;
1234a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown        float sizeScale;
1235a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown        bool haveSizeBias;
1236a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown        float sizeBias;
1237a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown        bool haveSizeIsSummed;
1238a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown        bool sizeIsSummed;
12398d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
12408d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        // Pressure
12418d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        enum PressureCalibration {
12428d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            PRESSURE_CALIBRATION_DEFAULT,
12438d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            PRESSURE_CALIBRATION_NONE,
12448d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            PRESSURE_CALIBRATION_PHYSICAL,
12458d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            PRESSURE_CALIBRATION_AMPLITUDE,
12468d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        };
12478d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
12488d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        PressureCalibration pressureCalibration;
12498d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        bool havePressureScale;
12508d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        float pressureScale;
12518d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
12528d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        // Orientation
12538d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        enum OrientationCalibration {
12548d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            ORIENTATION_CALIBRATION_DEFAULT,
12558d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            ORIENTATION_CALIBRATION_NONE,
12568d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            ORIENTATION_CALIBRATION_INTERPOLATED,
1257517bb4c859a2bb8d30316204f39bf5b6c89c3e4dJeff Brown            ORIENTATION_CALIBRATION_VECTOR,
12588d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        };
12598d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
12608d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        OrientationCalibration orientationCalibration;
126180fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown
126280fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown        // Distance
126380fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown        enum DistanceCalibration {
126480fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown            DISTANCE_CALIBRATION_DEFAULT,
126580fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown            DISTANCE_CALIBRATION_NONE,
126680fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown            DISTANCE_CALIBRATION_SCALED,
126780fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown        };
126880fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown
126980fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown        DistanceCalibration distanceCalibration;
127080fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown        bool haveDistanceScale;
127180fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown        float distanceScale;
1272a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown
127386172f6252fe2ed49a1cdea5cafd0ba2e049255dMichael Wright        enum CoverageCalibration {
127486172f6252fe2ed49a1cdea5cafd0ba2e049255dMichael Wright            COVERAGE_CALIBRATION_DEFAULT,
127586172f6252fe2ed49a1cdea5cafd0ba2e049255dMichael Wright            COVERAGE_CALIBRATION_NONE,
127686172f6252fe2ed49a1cdea5cafd0ba2e049255dMichael Wright            COVERAGE_CALIBRATION_BOX,
127786172f6252fe2ed49a1cdea5cafd0ba2e049255dMichael Wright        };
127886172f6252fe2ed49a1cdea5cafd0ba2e049255dMichael Wright
127986172f6252fe2ed49a1cdea5cafd0ba2e049255dMichael Wright        CoverageCalibration coverageCalibration;
128086172f6252fe2ed49a1cdea5cafd0ba2e049255dMichael Wright
1281a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown        inline void applySizeScaleAndBias(float* outSize) const {
1282a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown            if (haveSizeScale) {
1283a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown                *outSize *= sizeScale;
1284a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown            }
1285a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown            if (haveSizeBias) {
1286a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown                *outSize += sizeBias;
1287a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown            }
1288eeadb32488852d8fa6b44c8ce2b6c0a1c8a5346aMichael Wright            if (*outSize < 0) {
1289eeadb32488852d8fa6b44c8ce2b6c0a1c8a5346aMichael Wright                *outSize = 0;
1290eeadb32488852d8fa6b44c8ce2b6c0a1c8a5346aMichael Wright            }
1291a1f89ceec076392da409e9f389b33e62e1d92da6Jeff Brown        }
12928d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    } mCalibration;
12938d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
1294be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // Raw pointer axis information from the driver.
1295be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    RawPointerAxes mRawPointerAxes;
1296be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
1297be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // Raw pointer sample data.
1298be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    RawPointerData mCurrentRawPointerData;
1299be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    RawPointerData mLastRawPointerData;
1300be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
1301be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // Cooked pointer sample data.
1302be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    CookedPointerData mCurrentCookedPointerData;
1303be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    CookedPointerData mLastCookedPointerData;
1304be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
1305be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // Button state.
1306be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    int32_t mCurrentButtonState;
1307be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    int32_t mLastButtonState;
1308be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
130965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    // Scroll state.
131065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    int32_t mCurrentRawVScroll;
131165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    int32_t mCurrentRawHScroll;
131265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
131365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    // Id bits used to differentiate fingers, stylus and mouse tools.
131465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    BitSet32 mCurrentFingerIdBits; // finger or unknown
131565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    BitSet32 mLastFingerIdBits;
131665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    BitSet32 mCurrentStylusIdBits; // stylus or eraser
131765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    BitSet32 mLastStylusIdBits;
131865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    BitSet32 mCurrentMouseIdBits; // mouse or lens
131965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    BitSet32 mLastMouseIdBits;
132065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
1321be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // True if we sent a HOVER_ENTER event.
1322be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    bool mSentHoverEnter;
13236d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
13246d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    // The time the primary pointer last went down.
13256d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    nsecs_t mDownTime;
13266d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
1327ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    // The pointer controller, or null if the device is not a pointer.
1328ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    sp<PointerControllerInterface> mPointerController;
1329ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
1330be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    Vector<VirtualKey> mVirtualKeys;
13316328cdc89e099806a1893b89e4c724d596272d9eJeff Brown
1332be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    virtual void configureParameters();
1333be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    virtual void dumpParameters(String8& dump);
1334be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    virtual void configureRawPointerAxes();
1335be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    virtual void dumpRawPointerAxes(String8& dump);
133665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    virtual void configureSurface(nsecs_t when, bool* outResetNeeded);
1337be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    virtual void dumpSurface(String8& dump);
1338be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    virtual void configureVirtualKeys();
1339be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    virtual void dumpVirtualKeys(String8& dump);
1340be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    virtual void parseCalibration();
1341be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    virtual void resolveCalibration();
1342be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    virtual void dumpCalibration(String8& dump);
134300710e906bdafd58386ee7f81fa84addd218122fJeff Brown    virtual bool hasStylus() const = 0;
1344efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown
134565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    virtual void syncTouch(nsecs_t when, bool* outHavePointerIds) = 0;
13466328cdc89e099806a1893b89e4c724d596272d9eJeff Brown
1347be1aa8250cee7819c49741e819e81659d1d03823Jeff Brownprivate:
134883d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    // The current viewport.
134983d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    // The components of the viewport are specified in the display's rotated orientation.
135083d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    DisplayViewport mViewport;
135183d616a9c7b9505153d258511eb5c16b552e268dJeff Brown
135283d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    // The surface orientation, width and height set by configureSurface().
135383d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    // The width and height are derived from the viewport but are specified
135483d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    // in the natural orientation.
135583d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    // The surface origin specifies how the surface coordinates should be translated
135683d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    // to align with the logical display coordinate space.
135783d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    // The orientation may be different from the viewport orientation as it specifies
135883d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    // the rotation of the surface coordinates required to produce the viewport's
135983d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    // requested orientation, so it will depend on whether the device is orientation aware.
1360be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    int32_t mSurfaceWidth;
1361be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    int32_t mSurfaceHeight;
136283d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    int32_t mSurfaceLeft;
136383d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    int32_t mSurfaceTop;
136483d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    int32_t mSurfaceOrientation;
13658d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
1366be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // Translation and scaling factors, orientation-independent.
136783d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    float mXTranslate;
1368be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    float mXScale;
1369be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    float mXPrecision;
13708d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
137183d616a9c7b9505153d258511eb5c16b552e268dJeff Brown    float mYTranslate;
1372be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    float mYScale;
1373be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    float mYPrecision;
13746328cdc89e099806a1893b89e4c724d596272d9eJeff Brown
1375be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    float mGeometricScale;
13766328cdc89e099806a1893b89e4c724d596272d9eJeff Brown
1377be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    float mPressureScale;
137880fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown
1379be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    float mSizeScale;
13808d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
1381be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    float mOrientationScale;
13828d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
1383be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    float mDistanceScale;
13848d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
138565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    bool mHaveTilt;
138665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    float mTiltXCenter;
138765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    float mTiltXScale;
138865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    float mTiltYCenter;
138965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    float mTiltYScale;
139065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
1391be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // Oriented motion ranges for input device info.
1392be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    struct OrientedRanges {
1393be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        InputDeviceInfo::MotionRange x;
1394be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        InputDeviceInfo::MotionRange y;
1395be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        InputDeviceInfo::MotionRange pressure;
13968d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
1397be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        bool haveSize;
1398be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        InputDeviceInfo::MotionRange size;
139980fd47ce75253dcdc2cfa85d7a3f42634b923a47Jeff Brown
1400be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        bool haveTouchSize;
1401be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        InputDeviceInfo::MotionRange touchMajor;
1402be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        InputDeviceInfo::MotionRange touchMinor;
14036328cdc89e099806a1893b89e4c724d596272d9eJeff Brown
1404be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        bool haveToolSize;
1405be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        InputDeviceInfo::MotionRange toolMajor;
1406be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        InputDeviceInfo::MotionRange toolMinor;
14076328cdc89e099806a1893b89e4c724d596272d9eJeff Brown
1408be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        bool haveOrientation;
1409be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        InputDeviceInfo::MotionRange orientation;
1410ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
1411be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        bool haveDistance;
1412be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        InputDeviceInfo::MotionRange distance;
141365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
141465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        bool haveTilt;
141565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        InputDeviceInfo::MotionRange tilt;
141665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
141765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        OrientedRanges() {
141865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            clear();
141965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        }
142065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
142165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        void clear() {
142265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            haveSize = false;
142365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            haveTouchSize = false;
142465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            haveToolSize = false;
142565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            haveOrientation = false;
142665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            haveDistance = false;
142765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            haveTilt = false;
142865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        }
1429be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    } mOrientedRanges;
1430ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
1431be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // Oriented dimensions and precision.
1432be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    float mOrientedXPrecision;
1433be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    float mOrientedYPrecision;
1434ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
1435be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    struct CurrentVirtualKeyState {
1436be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        bool down;
1437be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        bool ignored;
1438be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        nsecs_t downTime;
1439be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        int32_t keyCode;
1440be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown        int32_t scanCode;
1441be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    } mCurrentVirtualKey;
14426d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
144365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    // Scale factor for gesture or mouse based pointer movements.
144465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    float mPointerXMovementScale;
144565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    float mPointerYMovementScale;
14466d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
1447be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // Scale factor for gesture based zooming and other freeform motions.
144865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    float mPointerXZoomScale;
144965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    float mPointerYZoomScale;
14506d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
1451be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    // The maximum swipe width.
1452be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    float mPointerGestureMaxSwipeWidth;
14536d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
14546d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    struct PointerDistanceHeapElement {
14556d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        uint32_t currentPointerIndex : 8;
14566d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        uint32_t lastPointerIndex : 8;
14576d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        uint64_t distance : 48; // squared distance
14586d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    };
14596d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
146065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    enum PointerUsage {
146165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        POINTER_USAGE_NONE,
146265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        POINTER_USAGE_GESTURES,
146365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        POINTER_USAGE_STYLUS,
146465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        POINTER_USAGE_MOUSE,
146565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    };
146665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    PointerUsage mPointerUsage;
146765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
1468ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    struct PointerGesture {
1469ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        enum Mode {
1470ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            // No fingers, button is not pressed.
1471ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            // Nothing happening.
1472ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            NEUTRAL,
1473ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
1474ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            // No fingers, button is not pressed.
1475ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            // Tap detected.
1476ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            // Emits DOWN and UP events at the pointer location.
1477ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            TAP,
1478ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
147979ac969d7a84b7198f9ed814cc0b2f0b7e11a662Jeff Brown            // Exactly one finger dragging following a tap.
148079ac969d7a84b7198f9ed814cc0b2f0b7e11a662Jeff Brown            // Pointer follows the active finger.
148179ac969d7a84b7198f9ed814cc0b2f0b7e11a662Jeff Brown            // Emits DOWN, MOVE and UP events at the pointer location.
1482214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown            //
1483214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown            // Detect double-taps when the finger goes up while in TAP_DRAG mode.
148479ac969d7a84b7198f9ed814cc0b2f0b7e11a662Jeff Brown            TAP_DRAG,
148579ac969d7a84b7198f9ed814cc0b2f0b7e11a662Jeff Brown
1486ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            // Button is pressed.
1487ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            // Pointer follows the active finger if there is one.  Other fingers are ignored.
1488ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            // Emits DOWN, MOVE and UP events at the pointer location.
148979ac969d7a84b7198f9ed814cc0b2f0b7e11a662Jeff Brown            BUTTON_CLICK_OR_DRAG,
1490ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
1491ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            // Exactly one finger, button is not pressed.
1492ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            // Pointer follows the active finger.
1493ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            // Emits HOVER_MOVE events at the pointer location.
1494214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown            //
1495214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown            // Detect taps when the finger goes up while in HOVER mode.
1496ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            HOVER,
1497ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
14982352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown            // Exactly two fingers but neither have moved enough to clearly indicate
14992352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown            // whether a swipe or freeform gesture was intended.  We consider the
15002352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown            // pointer to be pressed so this enables clicking or long-pressing on buttons.
15012352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown            // Pointer does not move.
15022352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown            // Emits DOWN, MOVE and UP events with a single stationary pointer coordinate.
15032352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown            PRESS,
1504ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
1505ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            // Exactly two fingers moving in the same direction, button is not pressed.
1506ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            // Pointer does not move.
1507ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            // Emits DOWN, MOVE and UP events with a single pointer coordinate that
1508ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            // follows the midpoint between both fingers.
1509ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            SWIPE,
1510ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
1511ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            // Two or more fingers moving in arbitrary directions, button is not pressed.
1512ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            // Pointer does not move.
1513ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            // Emits DOWN, POINTER_DOWN, MOVE, POINTER_UP and UP events that follow
1514ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            // each finger individually relative to the initial centroid of the finger.
1515ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            FREEFORM,
1516ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
1517ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            // Waiting for quiet time to end before starting the next gesture.
1518ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            QUIET,
1519ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        };
1520ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
15212352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        // Time the first finger went down.
15222352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        nsecs_t firstTouchTime;
15232352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
1524ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        // The active pointer id from the raw touch data.
1525ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        int32_t activeTouchId; // -1 if none
1526ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
1527ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        // The active pointer id from the gesture last delivered to the application.
1528ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        int32_t activeGestureId; // -1 if none
1529ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
1530ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        // Pointer coords and ids for the current and previous pointer gesture.
1531ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        Mode currentGestureMode;
1532ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        BitSet32 currentGestureIdBits;
1533ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        uint32_t currentGestureIdToIndex[MAX_POINTER_ID + 1];
1534fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        PointerProperties currentGestureProperties[MAX_POINTERS];
1535ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        PointerCoords currentGestureCoords[MAX_POINTERS];
1536ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
1537ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        Mode lastGestureMode;
1538ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        BitSet32 lastGestureIdBits;
1539ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        uint32_t lastGestureIdToIndex[MAX_POINTER_ID + 1];
1540fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        PointerProperties lastGestureProperties[MAX_POINTERS];
1541ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        PointerCoords lastGestureCoords[MAX_POINTERS];
1542ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
1543ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        // Time the pointer gesture last went down.
1544ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        nsecs_t downTime;
1545ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
154679ac969d7a84b7198f9ed814cc0b2f0b7e11a662Jeff Brown        // Time when the pointer went down for a TAP.
154779ac969d7a84b7198f9ed814cc0b2f0b7e11a662Jeff Brown        nsecs_t tapDownTime;
154879ac969d7a84b7198f9ed814cc0b2f0b7e11a662Jeff Brown
154979ac969d7a84b7198f9ed814cc0b2f0b7e11a662Jeff Brown        // Time when the pointer went up for a TAP.
155079ac969d7a84b7198f9ed814cc0b2f0b7e11a662Jeff Brown        nsecs_t tapUpTime;
1551ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
15522352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        // Location of initial tap.
15532352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        float tapX, tapY;
15542352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
1555ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        // Time we started waiting for quiescence.
1556ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        nsecs_t quietTime;
1557ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
15582352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        // Reference points for multitouch gestures.
15592352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        float referenceTouchX;    // reference touch X/Y coordinates in surface units
15602352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        float referenceTouchY;
15612352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        float referenceGestureX;  // reference gesture X/Y coordinates in pixels
15622352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        float referenceGestureY;
15632352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
1564538881e18323a0c983bd8809f8c3b1cdeeeab8a6Jeff Brown        // Distance that each pointer has traveled which has not yet been
1565538881e18323a0c983bd8809f8c3b1cdeeeab8a6Jeff Brown        // subsumed into the reference gesture position.
1566538881e18323a0c983bd8809f8c3b1cdeeeab8a6Jeff Brown        BitSet32 referenceIdBits;
1567538881e18323a0c983bd8809f8c3b1cdeeeab8a6Jeff Brown        struct Delta {
1568538881e18323a0c983bd8809f8c3b1cdeeeab8a6Jeff Brown            float dx, dy;
1569538881e18323a0c983bd8809f8c3b1cdeeeab8a6Jeff Brown        };
1570538881e18323a0c983bd8809f8c3b1cdeeeab8a6Jeff Brown        Delta referenceDeltas[MAX_POINTER_ID + 1];
1571538881e18323a0c983bd8809f8c3b1cdeeeab8a6Jeff Brown
15722352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        // Describes how touch ids are mapped to gesture ids for freeform gestures.
15732352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown        uint32_t freeformTouchToGestureIdMap[MAX_POINTER_ID + 1];
15742352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown
1575ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        // A velocity tracker for determining whether to switch active pointers during drags.
1576ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        VelocityTracker velocityTracker;
1577ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
1578ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        void reset() {
15792352b978a3c94cd88f41d0d908f961333fdac1e9Jeff Brown            firstTouchTime = LLONG_MIN;
1580ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            activeTouchId = -1;
1581ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            activeGestureId = -1;
1582ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            currentGestureMode = NEUTRAL;
1583ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            currentGestureIdBits.clear();
1584ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            lastGestureMode = NEUTRAL;
1585ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            lastGestureIdBits.clear();
1586ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            downTime = 0;
1587ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            velocityTracker.clear();
158879ac969d7a84b7198f9ed814cc0b2f0b7e11a662Jeff Brown            resetTap();
1589ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            resetQuietTime();
1590ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        }
1591ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
159279ac969d7a84b7198f9ed814cc0b2f0b7e11a662Jeff Brown        void resetTap() {
159379ac969d7a84b7198f9ed814cc0b2f0b7e11a662Jeff Brown            tapDownTime = LLONG_MIN;
159479ac969d7a84b7198f9ed814cc0b2f0b7e11a662Jeff Brown            tapUpTime = LLONG_MIN;
1595ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        }
1596ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
1597ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        void resetQuietTime() {
1598ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            quietTime = LLONG_MIN;
1599ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown        }
1600ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    } mPointerGesture;
1601ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
160265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    struct PointerSimple {
160365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        PointerCoords currentCoords;
160465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        PointerProperties currentProperties;
160565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        PointerCoords lastCoords;
160665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        PointerProperties lastProperties;
160765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
160865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        // True if the pointer is down.
160965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        bool down;
161065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
161165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        // True if the pointer is hovering.
161265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        bool hovering;
161365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
161465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        // Time the pointer last went down.
161565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        nsecs_t downTime;
161665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
161765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        void reset() {
161865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            currentCoords.clear();
161965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            currentProperties.clear();
162065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            lastCoords.clear();
162165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            lastProperties.clear();
162265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            down = false;
162365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            hovering = false;
162465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            downTime = 0;
162565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown        }
162665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    } mPointerSimple;
162765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
162865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    // The pointer and scroll velocity controls.
162965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    VelocityControl mPointerVelocityControl;
163065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    VelocityControl mWheelXVelocityControl;
163165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    VelocityControl mWheelYVelocityControl;
163265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
163365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void sync(nsecs_t when);
1634be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
1635be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    bool consumeRawTouches(nsecs_t when, uint32_t policyFlags);
1636be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void dispatchVirtualKey(nsecs_t when, uint32_t policyFlags,
1637be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown            int32_t keyEventAction, int32_t keyEventFlags);
16386d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
16396d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    void dispatchTouches(nsecs_t when, uint32_t policyFlags);
1640be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void dispatchHoverExit(nsecs_t when, uint32_t policyFlags);
1641be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void dispatchHoverEnterAndMove(nsecs_t when, uint32_t policyFlags);
1642be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void cookPointerData();
1643be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown
164465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void dispatchPointerUsage(nsecs_t when, uint32_t policyFlags, PointerUsage pointerUsage);
164565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void abortPointerUsage(nsecs_t when, uint32_t policyFlags);
164665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
164779ac969d7a84b7198f9ed814cc0b2f0b7e11a662Jeff Brown    void dispatchPointerGestures(nsecs_t when, uint32_t policyFlags, bool isTimeout);
164865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void abortPointerGestures(nsecs_t when, uint32_t policyFlags);
164979ac969d7a84b7198f9ed814cc0b2f0b7e11a662Jeff Brown    bool preparePointerGestures(nsecs_t when,
165065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            bool* outCancelPreviousGesture, bool* outFinishPreviousGesture,
165165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            bool isTimeout);
165265fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
165365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void dispatchPointerStylus(nsecs_t when, uint32_t policyFlags);
165465fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void abortPointerStylus(nsecs_t when, uint32_t policyFlags);
165565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
165665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void dispatchPointerMouse(nsecs_t when, uint32_t policyFlags);
165765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void abortPointerMouse(nsecs_t when, uint32_t policyFlags);
165865fd251c3913fc921468a3dad190810db19eb9dfJeff Brown
165965fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void dispatchPointerSimple(nsecs_t when, uint32_t policyFlags,
166065fd251c3913fc921468a3dad190810db19eb9dfJeff Brown            bool down, bool hovering);
166165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    void abortPointerSimple(nsecs_t when, uint32_t policyFlags);
1662ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
1663ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    // Dispatches a motion event.
1664ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    // If the changedId is >= 0 and the action is POINTER_DOWN or POINTER_UP, the
1665ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    // method will take care of setting the index and transmuting the action to DOWN or UP
1666ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    // it is the first / last pointer to go down / up.
1667ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    void dispatchMotion(nsecs_t when, uint32_t policyFlags, uint32_t source,
1668fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            int32_t action, int32_t flags, int32_t metaState, int32_t buttonState,
1669fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            int32_t edgeFlags,
1670fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            const PointerProperties* properties, const PointerCoords* coords,
1671fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            const uint32_t* idToIndex, BitSet32 idBits,
1672ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown            int32_t changedId, float xPrecision, float yPrecision, nsecs_t downTime);
1673ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
1674fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    // Updates pointer coords and properties for pointers with specified ids that have moved.
1675ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown    // Returns true if any of them changed.
1676fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    bool updateMovedPointers(const PointerProperties* inProperties,
1677fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            const PointerCoords* inCoords, const uint32_t* inIdToIndex,
1678fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            PointerProperties* outProperties, PointerCoords* outCoords,
1679fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            const uint32_t* outIdToIndex, BitSet32 idBits) const;
1680ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
1681be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    bool isPointInsideSurface(int32_t x, int32_t y);
1682be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    const VirtualKey* findVirtualKeyHit(int32_t x, int32_t y);
16836d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
1684be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    void assignPointerIds();
16856d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown};
16866d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
16876d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
16886d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownclass SingleTouchInputMapper : public TouchInputMapper {
16896d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownpublic:
169047e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    SingleTouchInputMapper(InputDevice* device);
16916d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual ~SingleTouchInputMapper();
16926d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
169365fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    virtual void reset(nsecs_t when);
16946d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual void process(const RawEvent* rawEvent);
16956d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
16966d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownprotected:
169765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    virtual void syncTouch(nsecs_t when, bool* outHavePointerIds);
1698be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    virtual void configureRawPointerAxes();
169900710e906bdafd58386ee7f81fa84addd218122fJeff Brown    virtual bool hasStylus() const;
17006d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
17016d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownprivate:
170249754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    SingleTouchMotionAccumulator mSingleTouchMotionAccumulator;
17036d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown};
17046d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
17056d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
17066d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownclass MultiTouchInputMapper : public TouchInputMapper {
17076d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownpublic:
170847e6b1b5eef8ee99872f278f66bc498c4fcca0d8Jeff Brown    MultiTouchInputMapper(InputDevice* device);
17096d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual ~MultiTouchInputMapper();
17106d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
171165fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    virtual void reset(nsecs_t when);
17126d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    virtual void process(const RawEvent* rawEvent);
17136d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
17146d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownprotected:
171565fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    virtual void syncTouch(nsecs_t when, bool* outHavePointerIds);
1716be1aa8250cee7819c49741e819e81659d1d03823Jeff Brown    virtual void configureRawPointerAxes();
171700710e906bdafd58386ee7f81fa84addd218122fJeff Brown    virtual bool hasStylus() const;
17186d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
17196d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brownprivate:
172049754db5a304d995c1cc108ff6f19e4ba4265572Jeff Brown    MultiTouchMotionAccumulator mMultiTouchMotionAccumulator;
1721ace13b17866dc9136aeecf6dfaf7077f37434469Jeff Brown
17226894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown    // Specifies the pointer id bits that are in use, and their associated tracking id.
17236894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown    BitSet32 mPointerIdBits;
17246894a2947eb1f9d499fd7f1a1ec4e7098e07d25dJeff Brown    int32_t mPointerTrackingIdMap[MAX_POINTER_ID + 1];
17256d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown};
17266d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
1727cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
1728cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brownclass JoystickInputMapper : public InputMapper {
1729cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brownpublic:
1730cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    JoystickInputMapper(InputDevice* device);
1731cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    virtual ~JoystickInputMapper();
1732cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
1733cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    virtual uint32_t getSources();
1734cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
1735cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    virtual void dump(String8& dump);
173665fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    virtual void configure(nsecs_t when, const InputReaderConfiguration* config, uint32_t changes);
173765fd251c3913fc921468a3dad190810db19eb9dfJeff Brown    virtual void reset(nsecs_t when);
1738cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    virtual void process(const RawEvent* rawEvent);
1739cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
1740cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brownprivate:
17416f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    struct Axis {
17426f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        RawAbsoluteAxisInfo rawAxisInfo;
17438529745b27877d98a0c76692295a3fcac238b1e6Jeff Brown        AxisInfo axisInfo;
17446f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown
17456f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        bool explicitlyMapped; // true if the axis was explicitly assigned an axis id
17466f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown
17476f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        float scale;   // scale factor from raw to normalized values
17486f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        float offset;  // offset to add after scaling for normalization
17498529745b27877d98a0c76692295a3fcac238b1e6Jeff Brown        float highScale;  // scale factor from raw to normalized values of high split
17508529745b27877d98a0c76692295a3fcac238b1e6Jeff Brown        float highOffset; // offset to add after scaling for normalization of high split
17516f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown
1752c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright        float min;        // normalized inclusive minimum
1753c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright        float max;        // normalized inclusive maximum
1754c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright        float flat;       // normalized flat region size
1755c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright        float fuzz;       // normalized error tolerance
1756c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright        float resolution; // normalized resolution in units/mm
17576f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown
17586f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        float filter;  // filter out small variations of this size
17598529745b27877d98a0c76692295a3fcac238b1e6Jeff Brown        float currentValue; // current value
17608529745b27877d98a0c76692295a3fcac238b1e6Jeff Brown        float newValue; // most recent value
17618529745b27877d98a0c76692295a3fcac238b1e6Jeff Brown        float highCurrentValue; // current value of high split
17628529745b27877d98a0c76692295a3fcac238b1e6Jeff Brown        float highNewValue; // most recent value of high split
17636f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown
17648529745b27877d98a0c76692295a3fcac238b1e6Jeff Brown        void initialize(const RawAbsoluteAxisInfo& rawAxisInfo, const AxisInfo& axisInfo,
17658529745b27877d98a0c76692295a3fcac238b1e6Jeff Brown                bool explicitlyMapped, float scale, float offset,
17668529745b27877d98a0c76692295a3fcac238b1e6Jeff Brown                float highScale, float highOffset,
1767c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright                float min, float max, float flat, float fuzz, float resolution) {
17686f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            this->rawAxisInfo = rawAxisInfo;
17698529745b27877d98a0c76692295a3fcac238b1e6Jeff Brown            this->axisInfo = axisInfo;
17706f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            this->explicitlyMapped = explicitlyMapped;
17716f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            this->scale = scale;
17726f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            this->offset = offset;
17738529745b27877d98a0c76692295a3fcac238b1e6Jeff Brown            this->highScale = highScale;
17748529745b27877d98a0c76692295a3fcac238b1e6Jeff Brown            this->highOffset = highOffset;
17756f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            this->min = min;
17766f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            this->max = max;
17776f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            this->flat = flat;
17786f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            this->fuzz = fuzz;
1779c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright            this->resolution = resolution;
17806f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            this->filter = 0;
17818529745b27877d98a0c76692295a3fcac238b1e6Jeff Brown            resetValue();
17828529745b27877d98a0c76692295a3fcac238b1e6Jeff Brown        }
17838529745b27877d98a0c76692295a3fcac238b1e6Jeff Brown
17848529745b27877d98a0c76692295a3fcac238b1e6Jeff Brown        void resetValue() {
17858529745b27877d98a0c76692295a3fcac238b1e6Jeff Brown            this->currentValue = 0;
17866f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            this->newValue = 0;
17878529745b27877d98a0c76692295a3fcac238b1e6Jeff Brown            this->highCurrentValue = 0;
17888529745b27877d98a0c76692295a3fcac238b1e6Jeff Brown            this->highNewValue = 0;
1789cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown        }
1790cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    };
1791cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
17926f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    // Axes indexed by raw ABS_* axis index.
17936f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    KeyedVector<int32_t, Axis> mAxes;
1794cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
17956f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    void sync(nsecs_t when, bool force);
1796cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
17978529745b27877d98a0c76692295a3fcac238b1e6Jeff Brown    bool haveAxis(int32_t axisId);
17986f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    void pruneAxes(bool ignoreExplicitlyMappedAxes);
17998529745b27877d98a0c76692295a3fcac238b1e6Jeff Brown    bool filterAxes(bool force);
18008529745b27877d98a0c76692295a3fcac238b1e6Jeff Brown
18018529745b27877d98a0c76692295a3fcac238b1e6Jeff Brown    static bool hasValueChangedSignificantly(float filter,
18028529745b27877d98a0c76692295a3fcac238b1e6Jeff Brown            float newValue, float currentValue, float min, float max);
18038529745b27877d98a0c76692295a3fcac238b1e6Jeff Brown    static bool hasMovedNearerToValueWithinFilteredRange(float filter,
18048529745b27877d98a0c76692295a3fcac238b1e6Jeff Brown            float newValue, float currentValue, float thresholdValue);
1805cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
18066f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    static bool isCenteredAxis(int32_t axis);
18072b08c611c88bcb17cfb0861fed67cec6d009e83bMichael Wright    static int32_t getCompatAxis(int32_t axis);
18082b08c611c88bcb17cfb0861fed67cec6d009e83bMichael Wright
18092b08c611c88bcb17cfb0861fed67cec6d009e83bMichael Wright    static void addMotionRange(int32_t axisId, const Axis& axis, InputDeviceInfo* info);
18102b08c611c88bcb17cfb0861fed67cec6d009e83bMichael Wright    static void setPointerCoordsAxisValue(PointerCoords* pointerCoords, int32_t axis,
18112b08c611c88bcb17cfb0861fed67cec6d009e83bMichael Wright            float value);
1812cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown};
1813cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
181446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} // namespace android
181546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
181646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#endif // _UI_INPUT_READER_H
1817