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