blob: 55ab479ad32eef68782865894ef4ec228e2c2b15 [file] [log] [blame]
Jeff Brown46b9ac02010-04-22 18:58:52 -07001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef _UI_INPUT_READER_H
18#define _UI_INPUT_READER_H
19
Jeff Brownb4ff35d2011-01-02 16:37:43 -080020#include "EventHub.h"
21#include "InputDispatcher.h"
22#include "PointerController.h"
23
Jeff Brown46b9ac02010-04-22 18:58:52 -070024#include <ui/Input.h>
Jeff Brownb4ff35d2011-01-02 16:37:43 -080025#include <ui/DisplayInfo.h>
Jeff Brown46b9ac02010-04-22 18:58:52 -070026#include <utils/KeyedVector.h>
27#include <utils/threads.h>
28#include <utils/Timers.h>
29#include <utils/RefBase.h>
30#include <utils/String8.h>
31#include <utils/BitSet.h>
32
33#include <stddef.h>
34#include <unistd.h>
35
Jeff Brown46b9ac02010-04-22 18:58:52 -070036namespace android {
37
Jeff Brown6d0fec22010-07-23 21:28:06 -070038class InputDevice;
39class InputMapper;
40
Jeff Brown8d608662010-08-30 03:02:23 -070041
Jeff Brown9c3cda02010-06-15 01:31:58 -070042/*
43 * Input reader policy interface.
44 *
45 * The input reader policy is used by the input reader to interact with the Window Manager
46 * and other system components.
47 *
48 * The actual implementation is partially supported by callbacks into the DVM
49 * via JNI. This interface is also mocked in the unit tests.
50 */
51class InputReaderPolicyInterface : public virtual RefBase {
52protected:
53 InputReaderPolicyInterface() { }
54 virtual ~InputReaderPolicyInterface() { }
55
56public:
57 /* Display orientations. */
58 enum {
59 ROTATION_0 = 0,
60 ROTATION_90 = 1,
61 ROTATION_180 = 2,
62 ROTATION_270 = 3
63 };
64
Jeff Brown9c3cda02010-06-15 01:31:58 -070065 /* Gets information about the display with the specified id.
66 * Returns true if the display info is available, false otherwise.
67 */
68 virtual bool getDisplayInfo(int32_t displayId,
69 int32_t* width, int32_t* height, int32_t* orientation) = 0;
70
Jeff Brown9c3cda02010-06-15 01:31:58 -070071 /* Determines whether to turn on some hacks we have to improve the touch interaction with a
72 * certain device whose screen currently is not all that good.
73 */
74 virtual bool filterTouchEvents() = 0;
75
76 /* Determines whether to turn on some hacks to improve touch interaction with another device
77 * where touch coordinate data can get corrupted.
78 */
79 virtual bool filterJumpyTouchEvents() = 0;
80
Jeff Brownfe508922011-01-18 15:10:10 -080081 /* Gets the amount of time to disable virtual keys after the screen is touched
82 * in order to filter out accidental virtual key presses due to swiping gestures
83 * or taps near the edge of the display. May be 0 to disable the feature.
84 */
85 virtual nsecs_t getVirtualKeyQuietTime() = 0;
86
Jeff Brown9c3cda02010-06-15 01:31:58 -070087 /* Gets the excluded device names for the platform. */
88 virtual void getExcludedDeviceNames(Vector<String8>& outExcludedDeviceNames) = 0;
Jeff Brown83c09682010-12-23 17:50:18 -080089
90 /* Gets a pointer controller associated with the specified cursor device (ie. a mouse). */
91 virtual sp<PointerControllerInterface> obtainPointerController(int32_t deviceId) = 0;
Jeff Brown9c3cda02010-06-15 01:31:58 -070092};
93
94
95/* Processes raw input events and sends cooked event data to an input dispatcher. */
Jeff Brown46b9ac02010-04-22 18:58:52 -070096class InputReaderInterface : public virtual RefBase {
97protected:
98 InputReaderInterface() { }
99 virtual ~InputReaderInterface() { }
100
101public:
Jeff Brownb88102f2010-09-08 11:49:43 -0700102 /* Dumps the state of the input reader.
103 *
104 * This method may be called on any thread (usually by the input manager). */
105 virtual void dump(String8& dump) = 0;
106
Jeff Brown46b9ac02010-04-22 18:58:52 -0700107 /* Runs a single iteration of the processing loop.
108 * Nominally reads and processes one incoming message from the EventHub.
109 *
110 * This method should be called on the input reader thread.
111 */
112 virtual void loopOnce() = 0;
113
Jeff Brown9c3cda02010-06-15 01:31:58 -0700114 /* Gets the current input device configuration.
115 *
116 * This method may be called on any thread (usually by the input manager).
117 */
Jeff Brown6d0fec22010-07-23 21:28:06 -0700118 virtual void getInputConfiguration(InputConfiguration* outConfiguration) = 0;
Jeff Brown9c3cda02010-06-15 01:31:58 -0700119
Jeff Brown6d0fec22010-07-23 21:28:06 -0700120 /* Gets information about the specified input device.
121 * Returns OK if the device information was obtained or NAME_NOT_FOUND if there
122 * was no such device.
123 *
124 * This method may be called on any thread (usually by the input manager).
Jeff Brown9c3cda02010-06-15 01:31:58 -0700125 */
Jeff Brown6d0fec22010-07-23 21:28:06 -0700126 virtual status_t getInputDeviceInfo(int32_t deviceId, InputDeviceInfo* outDeviceInfo) = 0;
127
128 /* Gets the list of all registered device ids. */
129 virtual void getInputDeviceIds(Vector<int32_t>& outDeviceIds) = 0;
130
131 /* Query current input state. */
132 virtual int32_t getScanCodeState(int32_t deviceId, uint32_t sourceMask,
133 int32_t scanCode) = 0;
134 virtual int32_t getKeyCodeState(int32_t deviceId, uint32_t sourceMask,
135 int32_t keyCode) = 0;
136 virtual int32_t getSwitchState(int32_t deviceId, uint32_t sourceMask,
137 int32_t sw) = 0;
Jeff Brown9c3cda02010-06-15 01:31:58 -0700138
139 /* Determine whether physical keys exist for the given framework-domain key codes. */
Jeff Brown6d0fec22010-07-23 21:28:06 -0700140 virtual bool hasKeys(int32_t deviceId, uint32_t sourceMask,
141 size_t numCodes, const int32_t* keyCodes, uint8_t* outFlags) = 0;
142};
143
144
145/* Internal interface used by individual input devices to access global input device state
146 * and parameters maintained by the input reader.
147 */
148class InputReaderContext {
Jeff Brownc3db8582010-10-20 15:33:38 -0700149public:
Jeff Brown6d0fec22010-07-23 21:28:06 -0700150 InputReaderContext() { }
151 virtual ~InputReaderContext() { }
152
Jeff Brown6d0fec22010-07-23 21:28:06 -0700153 virtual void updateGlobalMetaState() = 0;
154 virtual int32_t getGlobalMetaState() = 0;
155
Jeff Brownfe508922011-01-18 15:10:10 -0800156 virtual void disableVirtualKeysUntil(nsecs_t time) = 0;
157 virtual bool shouldDropVirtualKey(nsecs_t now,
158 InputDevice* device, int32_t keyCode, int32_t scanCode) = 0;
159
Jeff Brown05dc66a2011-03-02 14:41:58 -0800160 virtual void fadePointer() = 0;
161
Jeff Brown6d0fec22010-07-23 21:28:06 -0700162 virtual InputReaderPolicyInterface* getPolicy() = 0;
163 virtual InputDispatcherInterface* getDispatcher() = 0;
164 virtual EventHubInterface* getEventHub() = 0;
Jeff Brown46b9ac02010-04-22 18:58:52 -0700165};
166
Jeff Brown9c3cda02010-06-15 01:31:58 -0700167
Jeff Brown46b9ac02010-04-22 18:58:52 -0700168/* The input reader reads raw event data from the event hub and processes it into input events
Jeff Brown9c3cda02010-06-15 01:31:58 -0700169 * that it sends to the input dispatcher. Some functions of the input reader, such as early
170 * event filtering in low power states, are controlled by a separate policy object.
171 *
172 * IMPORTANT INVARIANT:
Jeff Brown6d0fec22010-07-23 21:28:06 -0700173 * Because the policy and dispatcher can potentially block or cause re-entrance into
174 * the input reader, the input reader never calls into other components while holding
Jeff Brown6328cdc2010-07-29 18:18:33 -0700175 * an exclusive internal lock whenever re-entrance can happen.
Jeff Brown46b9ac02010-04-22 18:58:52 -0700176 */
Jeff Brownc3db8582010-10-20 15:33:38 -0700177class InputReader : public InputReaderInterface, protected InputReaderContext {
Jeff Brown46b9ac02010-04-22 18:58:52 -0700178public:
179 InputReader(const sp<EventHubInterface>& eventHub,
Jeff Brown9c3cda02010-06-15 01:31:58 -0700180 const sp<InputReaderPolicyInterface>& policy,
Jeff Brown46b9ac02010-04-22 18:58:52 -0700181 const sp<InputDispatcherInterface>& dispatcher);
182 virtual ~InputReader();
183
Jeff Brownb88102f2010-09-08 11:49:43 -0700184 virtual void dump(String8& dump);
185
Jeff Brown46b9ac02010-04-22 18:58:52 -0700186 virtual void loopOnce();
187
Jeff Brown6d0fec22010-07-23 21:28:06 -0700188 virtual void getInputConfiguration(InputConfiguration* outConfiguration);
Jeff Brown46b9ac02010-04-22 18:58:52 -0700189
Jeff Brown6d0fec22010-07-23 21:28:06 -0700190 virtual status_t getInputDeviceInfo(int32_t deviceId, InputDeviceInfo* outDeviceInfo);
191 virtual void getInputDeviceIds(Vector<int32_t>& outDeviceIds);
Jeff Brown9c3cda02010-06-15 01:31:58 -0700192
Jeff Brown6d0fec22010-07-23 21:28:06 -0700193 virtual int32_t getScanCodeState(int32_t deviceId, uint32_t sourceMask,
194 int32_t scanCode);
195 virtual int32_t getKeyCodeState(int32_t deviceId, uint32_t sourceMask,
196 int32_t keyCode);
197 virtual int32_t getSwitchState(int32_t deviceId, uint32_t sourceMask,
198 int32_t sw);
Jeff Brown9c3cda02010-06-15 01:31:58 -0700199
Jeff Brown6d0fec22010-07-23 21:28:06 -0700200 virtual bool hasKeys(int32_t deviceId, uint32_t sourceMask,
201 size_t numCodes, const int32_t* keyCodes, uint8_t* outFlags);
Jeff Brown9c3cda02010-06-15 01:31:58 -0700202
Jeff Brownc3db8582010-10-20 15:33:38 -0700203protected:
204 // These methods are protected virtual so they can be overridden and instrumented
205 // by test cases.
206 virtual InputDevice* createDevice(int32_t deviceId, const String8& name, uint32_t classes);
207
Jeff Brown46b9ac02010-04-22 18:58:52 -0700208private:
Jeff Brown46b9ac02010-04-22 18:58:52 -0700209 sp<EventHubInterface> mEventHub;
Jeff Brown9c3cda02010-06-15 01:31:58 -0700210 sp<InputReaderPolicyInterface> mPolicy;
Jeff Brown46b9ac02010-04-22 18:58:52 -0700211 sp<InputDispatcherInterface> mDispatcher;
212
Jeff Brown6d0fec22010-07-23 21:28:06 -0700213 virtual InputReaderPolicyInterface* getPolicy() { return mPolicy.get(); }
214 virtual InputDispatcherInterface* getDispatcher() { return mDispatcher.get(); }
215 virtual EventHubInterface* getEventHub() { return mEventHub.get(); }
216
217 // This reader/writer lock guards the list of input devices.
218 // The writer lock must be held whenever the list of input devices is modified
219 // and then promptly released.
220 // The reader lock must be held whenever the list of input devices is traversed or an
221 // input device in the list is accessed.
222 // This lock only protects the registry and prevents inadvertent deletion of device objects
223 // that are in use. Individual devices are responsible for guarding their own internal state
224 // as needed for concurrent operation.
225 RWLock mDeviceRegistryLock;
Jeff Brown46b9ac02010-04-22 18:58:52 -0700226 KeyedVector<int32_t, InputDevice*> mDevices;
227
Jeff Brown6d0fec22010-07-23 21:28:06 -0700228 // low-level input event decoding and device management
Jeff Brown46b9ac02010-04-22 18:58:52 -0700229 void process(const RawEvent* rawEvent);
Jeff Brown46b9ac02010-04-22 18:58:52 -0700230
Jeff Brown7342bb92010-10-01 18:55:43 -0700231 void addDevice(int32_t deviceId);
232 void removeDevice(int32_t deviceId);
Jeff Brown9c3cda02010-06-15 01:31:58 -0700233 void configureExcludedDevices();
Jeff Brown46b9ac02010-04-22 18:58:52 -0700234
Jeff Brown6d0fec22010-07-23 21:28:06 -0700235 void consumeEvent(const RawEvent* rawEvent);
Jeff Brown46b9ac02010-04-22 18:58:52 -0700236
Jeff Brownc3db8582010-10-20 15:33:38 -0700237 void handleConfigurationChanged(nsecs_t when);
Jeff Brown9c3cda02010-06-15 01:31:58 -0700238
Jeff Brown6d0fec22010-07-23 21:28:06 -0700239 // state management for all devices
240 Mutex mStateLock;
241
242 int32_t mGlobalMetaState;
243 virtual void updateGlobalMetaState();
244 virtual int32_t getGlobalMetaState();
245
Jeff Brown05dc66a2011-03-02 14:41:58 -0800246 virtual void fadePointer();
247
Jeff Brown6d0fec22010-07-23 21:28:06 -0700248 InputConfiguration mInputConfiguration;
249 void updateInputConfiguration();
250
Jeff Brownfe508922011-01-18 15:10:10 -0800251 nsecs_t mDisableVirtualKeysTimeout;
252 virtual void disableVirtualKeysUntil(nsecs_t time);
253 virtual bool shouldDropVirtualKey(nsecs_t now,
254 InputDevice* device, int32_t keyCode, int32_t scanCode);
255
Jeff Brown6d0fec22010-07-23 21:28:06 -0700256 // state queries
257 typedef int32_t (InputDevice::*GetStateFunc)(uint32_t sourceMask, int32_t code);
258 int32_t getState(int32_t deviceId, uint32_t sourceMask, int32_t code,
259 GetStateFunc getStateFunc);
260 bool markSupportedKeyCodes(int32_t deviceId, uint32_t sourceMask, size_t numCodes,
261 const int32_t* keyCodes, uint8_t* outFlags);
Jeff Brown46b9ac02010-04-22 18:58:52 -0700262};
263
264
265/* Reads raw events from the event hub and processes them, endlessly. */
266class InputReaderThread : public Thread {
267public:
268 InputReaderThread(const sp<InputReaderInterface>& reader);
269 virtual ~InputReaderThread();
270
271private:
272 sp<InputReaderInterface> mReader;
273
274 virtual bool threadLoop();
275};
276
Jeff Brown6d0fec22010-07-23 21:28:06 -0700277
278/* Represents the state of a single input device. */
279class InputDevice {
280public:
281 InputDevice(InputReaderContext* context, int32_t id, const String8& name);
282 ~InputDevice();
283
284 inline InputReaderContext* getContext() { return mContext; }
285 inline int32_t getId() { return mId; }
286 inline const String8& getName() { return mName; }
287 inline uint32_t getSources() { return mSources; }
288
Jeff Brown56194eb2011-03-02 19:23:13 -0800289 inline bool isExternal() { return mIsExternal; }
290 inline void setExternal(bool external) { mIsExternal = external; }
291
Jeff Brown6d0fec22010-07-23 21:28:06 -0700292 inline bool isIgnored() { return mMappers.isEmpty(); }
293
Jeff Brownef3d7e82010-09-30 14:33:04 -0700294 void dump(String8& dump);
Jeff Brown6d0fec22010-07-23 21:28:06 -0700295 void addMapper(InputMapper* mapper);
296 void configure();
297 void reset();
298 void process(const RawEvent* rawEvent);
299
300 void getDeviceInfo(InputDeviceInfo* outDeviceInfo);
301 int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode);
302 int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode);
303 int32_t getSwitchState(uint32_t sourceMask, int32_t switchCode);
304 bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes,
305 const int32_t* keyCodes, uint8_t* outFlags);
306
307 int32_t getMetaState();
308
Jeff Brown05dc66a2011-03-02 14:41:58 -0800309 void fadePointer();
310
Jeff Brown47e6b1b2010-11-29 17:37:49 -0800311 inline const PropertyMap& getConfiguration() {
312 return mConfiguration;
Jeff Brown8d608662010-08-30 03:02:23 -0700313 }
314
Jeff Brown6d0fec22010-07-23 21:28:06 -0700315private:
316 InputReaderContext* mContext;
317 int32_t mId;
318
319 Vector<InputMapper*> mMappers;
320
321 String8 mName;
322 uint32_t mSources;
Jeff Brown56194eb2011-03-02 19:23:13 -0800323 bool mIsExternal;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700324
325 typedef int32_t (InputMapper::*GetStateFunc)(uint32_t sourceMask, int32_t code);
326 int32_t getState(uint32_t sourceMask, int32_t code, GetStateFunc getStateFunc);
Jeff Brown8d608662010-08-30 03:02:23 -0700327
Jeff Brown47e6b1b2010-11-29 17:37:49 -0800328 PropertyMap mConfiguration;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700329};
330
331
332/* An input mapper transforms raw input events into cooked event data.
333 * A single input device can have multiple associated input mappers in order to interpret
334 * different classes of events.
335 */
336class InputMapper {
337public:
338 InputMapper(InputDevice* device);
339 virtual ~InputMapper();
340
341 inline InputDevice* getDevice() { return mDevice; }
342 inline int32_t getDeviceId() { return mDevice->getId(); }
343 inline const String8 getDeviceName() { return mDevice->getName(); }
344 inline InputReaderContext* getContext() { return mContext; }
345 inline InputReaderPolicyInterface* getPolicy() { return mContext->getPolicy(); }
346 inline InputDispatcherInterface* getDispatcher() { return mContext->getDispatcher(); }
347 inline EventHubInterface* getEventHub() { return mContext->getEventHub(); }
348
349 virtual uint32_t getSources() = 0;
350 virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
Jeff Brownef3d7e82010-09-30 14:33:04 -0700351 virtual void dump(String8& dump);
Jeff Brown6d0fec22010-07-23 21:28:06 -0700352 virtual void configure();
353 virtual void reset();
354 virtual void process(const RawEvent* rawEvent) = 0;
355
356 virtual int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode);
357 virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode);
358 virtual int32_t getSwitchState(uint32_t sourceMask, int32_t switchCode);
359 virtual bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes,
360 const int32_t* keyCodes, uint8_t* outFlags);
361
362 virtual int32_t getMetaState();
363
Jeff Brown05dc66a2011-03-02 14:41:58 -0800364 virtual void fadePointer();
365
Jeff Brown6d0fec22010-07-23 21:28:06 -0700366protected:
367 InputDevice* mDevice;
368 InputReaderContext* mContext;
Jeff Browncb1404e2011-01-15 18:14:15 -0800369
370 static void dumpRawAbsoluteAxisInfo(String8& dump,
371 const RawAbsoluteAxisInfo& axis, const char* name);
Jeff Brown6d0fec22010-07-23 21:28:06 -0700372};
373
374
375class SwitchInputMapper : public InputMapper {
376public:
377 SwitchInputMapper(InputDevice* device);
378 virtual ~SwitchInputMapper();
379
380 virtual uint32_t getSources();
381 virtual void process(const RawEvent* rawEvent);
382
383 virtual int32_t getSwitchState(uint32_t sourceMask, int32_t switchCode);
384
385private:
386 void processSwitch(nsecs_t when, int32_t switchCode, int32_t switchValue);
387};
388
389
390class KeyboardInputMapper : public InputMapper {
391public:
Jeff Brownefd32662011-03-08 15:13:06 -0800392 KeyboardInputMapper(InputDevice* device, uint32_t source, int32_t keyboardType);
Jeff Brown6d0fec22010-07-23 21:28:06 -0700393 virtual ~KeyboardInputMapper();
394
395 virtual uint32_t getSources();
396 virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
Jeff Brownef3d7e82010-09-30 14:33:04 -0700397 virtual void dump(String8& dump);
Jeff Brown47e6b1b2010-11-29 17:37:49 -0800398 virtual void configure();
Jeff Brown6d0fec22010-07-23 21:28:06 -0700399 virtual void reset();
400 virtual void process(const RawEvent* rawEvent);
401
402 virtual int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode);
403 virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode);
404 virtual bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes,
405 const int32_t* keyCodes, uint8_t* outFlags);
406
407 virtual int32_t getMetaState();
408
409private:
Jeff Brown6328cdc2010-07-29 18:18:33 -0700410 Mutex mLock;
411
Jeff Brown6d0fec22010-07-23 21:28:06 -0700412 struct KeyDown {
413 int32_t keyCode;
414 int32_t scanCode;
415 };
416
Jeff Brownefd32662011-03-08 15:13:06 -0800417 uint32_t mSource;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700418 int32_t mKeyboardType;
419
Jeff Brown47e6b1b2010-11-29 17:37:49 -0800420 // Immutable configuration parameters.
421 struct Parameters {
422 int32_t associatedDisplayId;
423 bool orientationAware;
424 } mParameters;
425
Jeff Brown6328cdc2010-07-29 18:18:33 -0700426 struct LockedState {
427 Vector<KeyDown> keyDowns; // keys that are down
428 int32_t metaState;
429 nsecs_t downTime; // time of most recent key down
Jeff Brown497a92c2010-09-12 17:55:08 -0700430
431 struct LedState {
432 bool avail; // led is available
433 bool on; // we think the led is currently on
434 };
435 LedState capsLockLedState;
436 LedState numLockLedState;
437 LedState scrollLockLedState;
Jeff Brown6328cdc2010-07-29 18:18:33 -0700438 } mLocked;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700439
Jeff Brown6328cdc2010-07-29 18:18:33 -0700440 void initializeLocked();
Jeff Brown6d0fec22010-07-23 21:28:06 -0700441
Jeff Brown47e6b1b2010-11-29 17:37:49 -0800442 void configureParameters();
443 void dumpParameters(String8& dump);
444
Jeff Brown6d0fec22010-07-23 21:28:06 -0700445 bool isKeyboardOrGamepadKey(int32_t scanCode);
Jeff Brown6328cdc2010-07-29 18:18:33 -0700446
Jeff Brown6d0fec22010-07-23 21:28:06 -0700447 void processKey(nsecs_t when, bool down, int32_t keyCode, int32_t scanCode,
448 uint32_t policyFlags);
449
Jeff Brown6328cdc2010-07-29 18:18:33 -0700450 ssize_t findKeyDownLocked(int32_t scanCode);
Jeff Brown497a92c2010-09-12 17:55:08 -0700451
Jeff Brown49ed71d2010-12-06 17:13:33 -0800452 void resetLedStateLocked();
453 void initializeLedStateLocked(LockedState::LedState& ledState, int32_t led);
Jeff Brown497a92c2010-09-12 17:55:08 -0700454 void updateLedStateLocked(bool reset);
455 void updateLedStateForModifierLocked(LockedState::LedState& ledState, int32_t led,
456 int32_t modifier, bool reset);
Jeff Brown6d0fec22010-07-23 21:28:06 -0700457};
458
459
Jeff Brown83c09682010-12-23 17:50:18 -0800460class CursorInputMapper : public InputMapper {
Jeff Brown6d0fec22010-07-23 21:28:06 -0700461public:
Jeff Brown83c09682010-12-23 17:50:18 -0800462 CursorInputMapper(InputDevice* device);
463 virtual ~CursorInputMapper();
Jeff Brown6d0fec22010-07-23 21:28:06 -0700464
465 virtual uint32_t getSources();
466 virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
Jeff Brownef3d7e82010-09-30 14:33:04 -0700467 virtual void dump(String8& dump);
Jeff Brown47e6b1b2010-11-29 17:37:49 -0800468 virtual void configure();
Jeff Brown6d0fec22010-07-23 21:28:06 -0700469 virtual void reset();
470 virtual void process(const RawEvent* rawEvent);
471
Jeff Brownc3fc2d02010-08-10 15:47:53 -0700472 virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode);
473
Jeff Brown05dc66a2011-03-02 14:41:58 -0800474 virtual void fadePointer();
475
Jeff Brown6d0fec22010-07-23 21:28:06 -0700476private:
477 // Amount that trackball needs to move in order to generate a key event.
478 static const int32_t TRACKBALL_MOVEMENT_THRESHOLD = 6;
479
Jeff Brown6328cdc2010-07-29 18:18:33 -0700480 Mutex mLock;
481
Jeff Brown47e6b1b2010-11-29 17:37:49 -0800482 // Immutable configuration parameters.
483 struct Parameters {
Jeff Brown83c09682010-12-23 17:50:18 -0800484 enum Mode {
485 MODE_POINTER,
486 MODE_NAVIGATION,
487 };
488
489 Mode mode;
Jeff Brown47e6b1b2010-11-29 17:37:49 -0800490 int32_t associatedDisplayId;
491 bool orientationAware;
492 } mParameters;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700493
494 struct Accumulator {
495 enum {
Jeff Brownefd32662011-03-08 15:13:06 -0800496 FIELD_BUTTONS = 1,
Jeff Brown6d0fec22010-07-23 21:28:06 -0700497 FIELD_REL_X = 2,
Jeff Brown6f2fba42011-02-19 01:08:02 -0800498 FIELD_REL_Y = 4,
499 FIELD_REL_WHEEL = 8,
500 FIELD_REL_HWHEEL = 16,
Jeff Brown6d0fec22010-07-23 21:28:06 -0700501 };
502
503 uint32_t fields;
504
Jeff Brownefd32662011-03-08 15:13:06 -0800505 uint32_t buttonDown;
506 uint32_t buttonUp;
507
Jeff Brown6d0fec22010-07-23 21:28:06 -0700508 int32_t relX;
509 int32_t relY;
Jeff Brown6f2fba42011-02-19 01:08:02 -0800510 int32_t relWheel;
511 int32_t relHWheel;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700512
513 inline void clear() {
514 fields = 0;
515 }
Jeff Brown6d0fec22010-07-23 21:28:06 -0700516 } mAccumulator;
517
Jeff Brownefd32662011-03-08 15:13:06 -0800518 int32_t mSource;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700519 float mXScale;
520 float mYScale;
521 float mXPrecision;
522 float mYPrecision;
Jeff Brown6f2fba42011-02-19 01:08:02 -0800523
524 bool mHaveVWheel;
525 bool mHaveHWheel;
526 float mVWheelScale;
527 float mHWheelScale;
528
Jeff Brown83c09682010-12-23 17:50:18 -0800529 sp<PointerControllerInterface> mPointerController;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700530
Jeff Brown6328cdc2010-07-29 18:18:33 -0700531 struct LockedState {
Jeff Brownefd32662011-03-08 15:13:06 -0800532 uint32_t buttonState;
Jeff Brown6328cdc2010-07-29 18:18:33 -0700533 nsecs_t downTime;
534 } mLocked;
535
536 void initializeLocked();
Jeff Brown6d0fec22010-07-23 21:28:06 -0700537
Jeff Brown47e6b1b2010-11-29 17:37:49 -0800538 void configureParameters();
539 void dumpParameters(String8& dump);
540
Jeff Brown6d0fec22010-07-23 21:28:06 -0700541 void sync(nsecs_t when);
542};
543
544
545class TouchInputMapper : public InputMapper {
546public:
Jeff Brown47e6b1b2010-11-29 17:37:49 -0800547 TouchInputMapper(InputDevice* device);
Jeff Brown6d0fec22010-07-23 21:28:06 -0700548 virtual ~TouchInputMapper();
549
550 virtual uint32_t getSources();
551 virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
Jeff Brownef3d7e82010-09-30 14:33:04 -0700552 virtual void dump(String8& dump);
Jeff Brown6d0fec22010-07-23 21:28:06 -0700553 virtual void configure();
554 virtual void reset();
555
556 virtual int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode);
557 virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode);
558 virtual bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes,
559 const int32_t* keyCodes, uint8_t* outFlags);
560
Jeff Brown96ad3972011-03-09 17:39:48 -0800561 virtual void fadePointer();
562
Jeff Brown6d0fec22010-07-23 21:28:06 -0700563protected:
Jeff Brown6328cdc2010-07-29 18:18:33 -0700564 Mutex mLock;
565
Jeff Brown6d0fec22010-07-23 21:28:06 -0700566 struct VirtualKey {
567 int32_t keyCode;
568 int32_t scanCode;
569 uint32_t flags;
570
571 // computed hit box, specified in touch screen coords based on known display size
572 int32_t hitLeft;
573 int32_t hitTop;
574 int32_t hitRight;
575 int32_t hitBottom;
576
577 inline bool isHit(int32_t x, int32_t y) const {
578 return x >= hitLeft && x <= hitRight && y >= hitTop && y <= hitBottom;
579 }
580 };
581
Jeff Brown8d608662010-08-30 03:02:23 -0700582 // Raw data for a single pointer.
Jeff Brown6d0fec22010-07-23 21:28:06 -0700583 struct PointerData {
584 uint32_t id;
585 int32_t x;
586 int32_t y;
587 int32_t pressure;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700588 int32_t touchMajor;
589 int32_t touchMinor;
590 int32_t toolMajor;
591 int32_t toolMinor;
592 int32_t orientation;
Jeff Brownc3db8582010-10-20 15:33:38 -0700593
594 inline bool operator== (const PointerData& other) const {
595 return id == other.id
596 && x == other.x
597 && y == other.y
598 && pressure == other.pressure
599 && touchMajor == other.touchMajor
600 && touchMinor == other.touchMinor
601 && toolMajor == other.toolMajor
602 && toolMinor == other.toolMinor
603 && orientation == other.orientation;
604 }
605 inline bool operator!= (const PointerData& other) const {
606 return !(*this == other);
607 }
Jeff Brown6d0fec22010-07-23 21:28:06 -0700608 };
609
Jeff Brown8d608662010-08-30 03:02:23 -0700610 // Raw data for a collection of pointers including a pointer id mapping table.
Jeff Brown6d0fec22010-07-23 21:28:06 -0700611 struct TouchData {
612 uint32_t pointerCount;
613 PointerData pointers[MAX_POINTERS];
614 BitSet32 idBits;
615 uint32_t idToIndex[MAX_POINTER_ID + 1];
Jeff Brown96ad3972011-03-09 17:39:48 -0800616 uint32_t buttonState;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700617
618 void copyFrom(const TouchData& other) {
619 pointerCount = other.pointerCount;
620 idBits = other.idBits;
Jeff Brown96ad3972011-03-09 17:39:48 -0800621 buttonState = other.buttonState;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700622
623 for (uint32_t i = 0; i < pointerCount; i++) {
624 pointers[i] = other.pointers[i];
Jeff Brown9e2ad362010-07-30 19:20:11 -0700625
626 int id = pointers[i].id;
627 idToIndex[id] = other.idToIndex[id];
Jeff Brown6d0fec22010-07-23 21:28:06 -0700628 }
629 }
630
631 inline void clear() {
632 pointerCount = 0;
633 idBits.clear();
Jeff Brown96ad3972011-03-09 17:39:48 -0800634 buttonState = 0;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700635 }
636 };
637
Jeff Brown83c09682010-12-23 17:50:18 -0800638 // Input sources supported by the device.
Jeff Brownefd32662011-03-08 15:13:06 -0800639 uint32_t mTouchSource; // sources when reporting touch data
Jeff Brown96ad3972011-03-09 17:39:48 -0800640 uint32_t mPointerSource; // sources when reporting pointer gestures
Jeff Brown83c09682010-12-23 17:50:18 -0800641
Jeff Brown6d0fec22010-07-23 21:28:06 -0700642 // Immutable configuration parameters.
643 struct Parameters {
Jeff Brown47e6b1b2010-11-29 17:37:49 -0800644 enum DeviceType {
645 DEVICE_TYPE_TOUCH_SCREEN,
646 DEVICE_TYPE_TOUCH_PAD,
Jeff Brown96ad3972011-03-09 17:39:48 -0800647 DEVICE_TYPE_POINTER,
Jeff Brown47e6b1b2010-11-29 17:37:49 -0800648 };
649
650 DeviceType deviceType;
651 int32_t associatedDisplayId;
652 bool orientationAware;
653
Jeff Brown6d0fec22010-07-23 21:28:06 -0700654 bool useBadTouchFilter;
655 bool useJumpyTouchFilter;
656 bool useAveragingTouchFilter;
Jeff Brownfe508922011-01-18 15:10:10 -0800657 nsecs_t virtualKeyQuietTime;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700658 } mParameters;
659
Jeff Brown8d608662010-08-30 03:02:23 -0700660 // Immutable calibration parameters in parsed form.
661 struct Calibration {
Jeff Brownc6d282b2010-10-14 21:42:15 -0700662 // Touch Size
663 enum TouchSizeCalibration {
664 TOUCH_SIZE_CALIBRATION_DEFAULT,
665 TOUCH_SIZE_CALIBRATION_NONE,
666 TOUCH_SIZE_CALIBRATION_GEOMETRIC,
667 TOUCH_SIZE_CALIBRATION_PRESSURE,
Jeff Brown8d608662010-08-30 03:02:23 -0700668 };
669
Jeff Brownc6d282b2010-10-14 21:42:15 -0700670 TouchSizeCalibration touchSizeCalibration;
Jeff Brown8d608662010-08-30 03:02:23 -0700671
Jeff Brownc6d282b2010-10-14 21:42:15 -0700672 // Tool Size
673 enum ToolSizeCalibration {
674 TOOL_SIZE_CALIBRATION_DEFAULT,
675 TOOL_SIZE_CALIBRATION_NONE,
676 TOOL_SIZE_CALIBRATION_GEOMETRIC,
677 TOOL_SIZE_CALIBRATION_LINEAR,
678 TOOL_SIZE_CALIBRATION_AREA,
Jeff Brown8d608662010-08-30 03:02:23 -0700679 };
680
Jeff Brownc6d282b2010-10-14 21:42:15 -0700681 ToolSizeCalibration toolSizeCalibration;
682 bool haveToolSizeLinearScale;
683 float toolSizeLinearScale;
684 bool haveToolSizeLinearBias;
685 float toolSizeLinearBias;
686 bool haveToolSizeAreaScale;
687 float toolSizeAreaScale;
688 bool haveToolSizeAreaBias;
689 float toolSizeAreaBias;
690 bool haveToolSizeIsSummed;
Jeff Brown47e6b1b2010-11-29 17:37:49 -0800691 bool toolSizeIsSummed;
Jeff Brown8d608662010-08-30 03:02:23 -0700692
693 // Pressure
694 enum PressureCalibration {
695 PRESSURE_CALIBRATION_DEFAULT,
696 PRESSURE_CALIBRATION_NONE,
697 PRESSURE_CALIBRATION_PHYSICAL,
698 PRESSURE_CALIBRATION_AMPLITUDE,
699 };
700 enum PressureSource {
701 PRESSURE_SOURCE_DEFAULT,
702 PRESSURE_SOURCE_PRESSURE,
703 PRESSURE_SOURCE_TOUCH,
704 };
705
706 PressureCalibration pressureCalibration;
707 PressureSource pressureSource;
708 bool havePressureScale;
709 float pressureScale;
710
711 // Size
712 enum SizeCalibration {
713 SIZE_CALIBRATION_DEFAULT,
714 SIZE_CALIBRATION_NONE,
715 SIZE_CALIBRATION_NORMALIZED,
716 };
717
718 SizeCalibration sizeCalibration;
719
720 // Orientation
721 enum OrientationCalibration {
722 ORIENTATION_CALIBRATION_DEFAULT,
723 ORIENTATION_CALIBRATION_NONE,
724 ORIENTATION_CALIBRATION_INTERPOLATED,
Jeff Brown517bb4c2011-01-14 19:09:23 -0800725 ORIENTATION_CALIBRATION_VECTOR,
Jeff Brown8d608662010-08-30 03:02:23 -0700726 };
727
728 OrientationCalibration orientationCalibration;
729 } mCalibration;
730
731 // Raw axis information from the driver.
732 struct RawAxes {
Jeff Brown6d0fec22010-07-23 21:28:06 -0700733 RawAbsoluteAxisInfo x;
734 RawAbsoluteAxisInfo y;
735 RawAbsoluteAxisInfo pressure;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700736 RawAbsoluteAxisInfo touchMajor;
737 RawAbsoluteAxisInfo touchMinor;
738 RawAbsoluteAxisInfo toolMajor;
739 RawAbsoluteAxisInfo toolMinor;
740 RawAbsoluteAxisInfo orientation;
Jeff Brown8d608662010-08-30 03:02:23 -0700741 } mRawAxes;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700742
Jeff Brown6328cdc2010-07-29 18:18:33 -0700743 // Current and previous touch sample data.
Jeff Brown6d0fec22010-07-23 21:28:06 -0700744 TouchData mCurrentTouch;
Jeff Brown96ad3972011-03-09 17:39:48 -0800745 PointerCoords mCurrentTouchCoords[MAX_POINTERS];
746
Jeff Brown6d0fec22010-07-23 21:28:06 -0700747 TouchData mLastTouch;
Jeff Brown96ad3972011-03-09 17:39:48 -0800748 PointerCoords mLastTouchCoords[MAX_POINTERS];
Jeff Brown6d0fec22010-07-23 21:28:06 -0700749
750 // The time the primary pointer last went down.
751 nsecs_t mDownTime;
752
Jeff Brown96ad3972011-03-09 17:39:48 -0800753 // The pointer controller, or null if the device is not a pointer.
754 sp<PointerControllerInterface> mPointerController;
755
Jeff Brown6328cdc2010-07-29 18:18:33 -0700756 struct LockedState {
757 Vector<VirtualKey> virtualKeys;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700758
Jeff Brown6328cdc2010-07-29 18:18:33 -0700759 // The surface orientation and width and height set by configureSurfaceLocked().
760 int32_t surfaceOrientation;
761 int32_t surfaceWidth, surfaceHeight;
762
Jeff Brownefd32662011-03-08 15:13:06 -0800763 // The associated display orientation and width and height set by configureSurfaceLocked().
764 int32_t associatedDisplayOrientation;
765 int32_t associatedDisplayWidth, associatedDisplayHeight;
766
Jeff Brown6328cdc2010-07-29 18:18:33 -0700767 // Translation and scaling factors, orientation-independent.
Jeff Brown6328cdc2010-07-29 18:18:33 -0700768 float xScale;
769 float xPrecision;
770
Jeff Brown6328cdc2010-07-29 18:18:33 -0700771 float yScale;
772 float yPrecision;
773
Jeff Brown8d608662010-08-30 03:02:23 -0700774 float geometricScale;
775
Jeff Brownc6d282b2010-10-14 21:42:15 -0700776 float toolSizeLinearScale;
777 float toolSizeLinearBias;
778 float toolSizeAreaScale;
779 float toolSizeAreaBias;
Jeff Brown8d608662010-08-30 03:02:23 -0700780
Jeff Brown6328cdc2010-07-29 18:18:33 -0700781 float pressureScale;
782
Jeff Brown6328cdc2010-07-29 18:18:33 -0700783 float sizeScale;
784
785 float orientationScale;
786
787 // Oriented motion ranges for input device info.
788 struct OrientedRanges {
789 InputDeviceInfo::MotionRange x;
790 InputDeviceInfo::MotionRange y;
Jeff Brown8d608662010-08-30 03:02:23 -0700791
792 bool havePressure;
Jeff Brown6328cdc2010-07-29 18:18:33 -0700793 InputDeviceInfo::MotionRange pressure;
Jeff Brown8d608662010-08-30 03:02:23 -0700794
795 bool haveSize;
Jeff Brown6328cdc2010-07-29 18:18:33 -0700796 InputDeviceInfo::MotionRange size;
Jeff Brown8d608662010-08-30 03:02:23 -0700797
Jeff Brownc6d282b2010-10-14 21:42:15 -0700798 bool haveTouchSize;
Jeff Brown6328cdc2010-07-29 18:18:33 -0700799 InputDeviceInfo::MotionRange touchMajor;
800 InputDeviceInfo::MotionRange touchMinor;
Jeff Brown8d608662010-08-30 03:02:23 -0700801
Jeff Brownc6d282b2010-10-14 21:42:15 -0700802 bool haveToolSize;
Jeff Brown6328cdc2010-07-29 18:18:33 -0700803 InputDeviceInfo::MotionRange toolMajor;
804 InputDeviceInfo::MotionRange toolMinor;
Jeff Brown8d608662010-08-30 03:02:23 -0700805
806 bool haveOrientation;
Jeff Brown6328cdc2010-07-29 18:18:33 -0700807 InputDeviceInfo::MotionRange orientation;
808 } orientedRanges;
809
810 // Oriented dimensions and precision.
811 float orientedSurfaceWidth, orientedSurfaceHeight;
812 float orientedXPrecision, orientedYPrecision;
813
814 struct CurrentVirtualKeyState {
815 bool down;
816 nsecs_t downTime;
817 int32_t keyCode;
818 int32_t scanCode;
819 } currentVirtualKey;
Jeff Brown96ad3972011-03-09 17:39:48 -0800820
821 // Scale factor for gesture based pointer movements.
822 float pointerGestureXMovementScale;
823 float pointerGestureYMovementScale;
824
825 // Scale factor for gesture based zooming and other freeform motions.
826 float pointerGestureXZoomScale;
827 float pointerGestureYZoomScale;
828
829 // The maximum swipe width squared.
830 int32_t pointerGestureMaxSwipeWidthSquared;
Jeff Brown6328cdc2010-07-29 18:18:33 -0700831 } mLocked;
Jeff Brown6d0fec22010-07-23 21:28:06 -0700832
Jeff Brown8d608662010-08-30 03:02:23 -0700833 virtual void configureParameters();
Jeff Brownef3d7e82010-09-30 14:33:04 -0700834 virtual void dumpParameters(String8& dump);
Jeff Brown8d608662010-08-30 03:02:23 -0700835 virtual void configureRawAxes();
Jeff Brownef3d7e82010-09-30 14:33:04 -0700836 virtual void dumpRawAxes(String8& dump);
Jeff Brown6328cdc2010-07-29 18:18:33 -0700837 virtual bool configureSurfaceLocked();
Jeff Brownef3d7e82010-09-30 14:33:04 -0700838 virtual void dumpSurfaceLocked(String8& dump);
Jeff Brown6328cdc2010-07-29 18:18:33 -0700839 virtual void configureVirtualKeysLocked();
Jeff Brownef3d7e82010-09-30 14:33:04 -0700840 virtual void dumpVirtualKeysLocked(String8& dump);
Jeff Brown8d608662010-08-30 03:02:23 -0700841 virtual void parseCalibration();
842 virtual void resolveCalibration();
Jeff Brownef3d7e82010-09-30 14:33:04 -0700843 virtual void dumpCalibration(String8& dump);
Jeff Brown6d0fec22010-07-23 21:28:06 -0700844
845 enum TouchResult {
846 // Dispatch the touch normally.
847 DISPATCH_TOUCH,
848 // Do not dispatch the touch, but keep tracking the current stroke.
849 SKIP_TOUCH,
850 // Do not dispatch the touch, and drop all information associated with the current stoke
851 // so the next movement will appear as a new down.
852 DROP_STROKE
853 };
854
855 void syncTouch(nsecs_t when, bool havePointerIds);
856
857private:
858 /* Maximum number of historical samples to average. */
859 static const uint32_t AVERAGING_HISTORY_SIZE = 5;
860
861 /* Slop distance for jumpy pointer detection.
862 * The vertical range of the screen divided by this is our epsilon value. */
863 static const uint32_t JUMPY_EPSILON_DIVISOR = 212;
864
865 /* Number of jumpy points to drop for touchscreens that need it. */
866 static const uint32_t JUMPY_TRANSITION_DROPS = 3;
867 static const uint32_t JUMPY_DROP_LIMIT = 3;
868
869 /* Maximum squared distance for averaging.
870 * If moving farther than this, turn of averaging to avoid lag in response. */
871 static const uint64_t AVERAGING_DISTANCE_LIMIT = 75 * 75;
872
873 struct AveragingTouchFilterState {
874 // Individual history tracks are stored by pointer id
875 uint32_t historyStart[MAX_POINTERS];
876 uint32_t historyEnd[MAX_POINTERS];
877 struct {
878 struct {
879 int32_t x;
880 int32_t y;
881 int32_t pressure;
882 } pointers[MAX_POINTERS];
883 } historyData[AVERAGING_HISTORY_SIZE];
884 } mAveragingTouchFilter;
885
Jeff Brown2dfd7a72010-08-17 20:38:35 -0700886 struct JumpyTouchFilterState {
Jeff Brown6d0fec22010-07-23 21:28:06 -0700887 uint32_t jumpyPointsDropped;
888 } mJumpyTouchFilter;
889
890 struct PointerDistanceHeapElement {
891 uint32_t currentPointerIndex : 8;
892 uint32_t lastPointerIndex : 8;
893 uint64_t distance : 48; // squared distance
894 };
895
Jeff Brown96ad3972011-03-09 17:39:48 -0800896 struct PointerGesture {
897 enum Mode {
898 // No fingers, button is not pressed.
899 // Nothing happening.
900 NEUTRAL,
901
902 // No fingers, button is not pressed.
903 // Tap detected.
904 // Emits DOWN and UP events at the pointer location.
905 TAP,
906
907 // Button is pressed.
908 // Pointer follows the active finger if there is one. Other fingers are ignored.
909 // Emits DOWN, MOVE and UP events at the pointer location.
910 CLICK_OR_DRAG,
911
912 // Exactly one finger, button is not pressed.
913 // Pointer follows the active finger.
914 // Emits HOVER_MOVE events at the pointer location.
915 HOVER,
916
917 // More than two fingers involved but they haven't moved enough for us
918 // to figure out what is intended.
919 INDETERMINATE_MULTITOUCH,
920
921 // Exactly two fingers moving in the same direction, button is not pressed.
922 // Pointer does not move.
923 // Emits DOWN, MOVE and UP events with a single pointer coordinate that
924 // follows the midpoint between both fingers.
925 // The centroid is fixed when entering this state.
926 SWIPE,
927
928 // Two or more fingers moving in arbitrary directions, button is not pressed.
929 // Pointer does not move.
930 // Emits DOWN, POINTER_DOWN, MOVE, POINTER_UP and UP events that follow
931 // each finger individually relative to the initial centroid of the finger.
932 // The centroid is fixed when entering this state.
933 FREEFORM,
934
935 // Waiting for quiet time to end before starting the next gesture.
936 QUIET,
937 };
938
939 // The active pointer id from the raw touch data.
940 int32_t activeTouchId; // -1 if none
941
942 // The active pointer id from the gesture last delivered to the application.
943 int32_t activeGestureId; // -1 if none
944
945 // Pointer coords and ids for the current and previous pointer gesture.
946 Mode currentGestureMode;
947 uint32_t currentGesturePointerCount;
948 BitSet32 currentGestureIdBits;
949 uint32_t currentGestureIdToIndex[MAX_POINTER_ID + 1];
950 PointerCoords currentGestureCoords[MAX_POINTERS];
951
952 Mode lastGestureMode;
953 uint32_t lastGesturePointerCount;
954 BitSet32 lastGestureIdBits;
955 uint32_t lastGestureIdToIndex[MAX_POINTER_ID + 1];
956 PointerCoords lastGestureCoords[MAX_POINTERS];
957
958 // Tracks for all pointers originally went down.
959 TouchData touchOrigin;
960
961 // Describes how touch ids are mapped to gesture ids for freeform gestures.
962 uint32_t freeformTouchToGestureIdMap[MAX_POINTER_ID + 1];
963
964 // Initial centroid of the movement.
965 // Used to calculate how far the touch pointers have moved since the gesture started.
966 int32_t initialCentroidX;
967 int32_t initialCentroidY;
968
969 // Initial pointer location.
970 // Used to track where the pointer was when the gesture started.
971 float initialPointerX;
972 float initialPointerY;
973
974 // Time the pointer gesture last went down.
975 nsecs_t downTime;
976
977 // Time we started waiting for a tap gesture.
978 nsecs_t tapTime;
979
980 // Time we started waiting for quiescence.
981 nsecs_t quietTime;
982
983 // A velocity tracker for determining whether to switch active pointers during drags.
984 VelocityTracker velocityTracker;
985
986 void reset() {
987 activeTouchId = -1;
988 activeGestureId = -1;
989 currentGestureMode = NEUTRAL;
990 currentGesturePointerCount = 0;
991 currentGestureIdBits.clear();
992 lastGestureMode = NEUTRAL;
993 lastGesturePointerCount = 0;
994 lastGestureIdBits.clear();
995 touchOrigin.clear();
996 initialCentroidX = 0;
997 initialCentroidY = 0;
998 initialPointerX = 0;
999 initialPointerY = 0;
1000 downTime = 0;
1001 velocityTracker.clear();
1002 resetTapTime();
1003 resetQuietTime();
1004 }
1005
1006 void resetTapTime() {
1007 tapTime = LLONG_MIN;
1008 }
1009
1010 void resetQuietTime() {
1011 quietTime = LLONG_MIN;
1012 }
1013 } mPointerGesture;
1014
Jeff Brown6328cdc2010-07-29 18:18:33 -07001015 void initializeLocked();
Jeff Brown6d0fec22010-07-23 21:28:06 -07001016
1017 TouchResult consumeOffScreenTouches(nsecs_t when, uint32_t policyFlags);
1018 void dispatchTouches(nsecs_t when, uint32_t policyFlags);
Jeff Brown96ad3972011-03-09 17:39:48 -08001019 void prepareTouches(int32_t* outEdgeFlags, float* outXPrecision, float* outYPrecision);
1020 void dispatchPointerGestures(nsecs_t when, uint32_t policyFlags);
1021 void preparePointerGestures(nsecs_t when,
1022 bool* outCancelPreviousGesture, bool* outFinishPreviousGesture);
1023
1024 // Dispatches a motion event.
1025 // If the changedId is >= 0 and the action is POINTER_DOWN or POINTER_UP, the
1026 // method will take care of setting the index and transmuting the action to DOWN or UP
1027 // it is the first / last pointer to go down / up.
1028 void dispatchMotion(nsecs_t when, uint32_t policyFlags, uint32_t source,
1029 int32_t action, int32_t flags, uint32_t metaState, int32_t edgeFlags,
1030 const PointerCoords* coords, const uint32_t* idToIndex, BitSet32 idBits,
1031 int32_t changedId, float xPrecision, float yPrecision, nsecs_t downTime);
1032
1033 // Updates pointer coords for pointers with specified ids that have moved.
1034 // Returns true if any of them changed.
1035 bool updateMovedPointerCoords(const PointerCoords* inCoords, const uint32_t* inIdToIndex,
1036 PointerCoords* outCoords, const uint32_t* outIdToIndex, BitSet32 idBits) const;
1037
Jeff Brownefd32662011-03-08 15:13:06 -08001038 void suppressSwipeOntoVirtualKeys(nsecs_t when);
Jeff Brown6d0fec22010-07-23 21:28:06 -07001039
Jeff Brown6328cdc2010-07-29 18:18:33 -07001040 bool isPointInsideSurfaceLocked(int32_t x, int32_t y);
1041 const VirtualKey* findVirtualKeyHitLocked(int32_t x, int32_t y);
Jeff Brown6d0fec22010-07-23 21:28:06 -07001042
1043 bool applyBadTouchFilter();
1044 bool applyJumpyTouchFilter();
1045 void applyAveragingTouchFilter();
1046 void calculatePointerIds();
1047};
1048
1049
1050class SingleTouchInputMapper : public TouchInputMapper {
1051public:
Jeff Brown47e6b1b2010-11-29 17:37:49 -08001052 SingleTouchInputMapper(InputDevice* device);
Jeff Brown6d0fec22010-07-23 21:28:06 -07001053 virtual ~SingleTouchInputMapper();
1054
1055 virtual void reset();
1056 virtual void process(const RawEvent* rawEvent);
1057
1058protected:
Jeff Brown8d608662010-08-30 03:02:23 -07001059 virtual void configureRawAxes();
Jeff Brown6d0fec22010-07-23 21:28:06 -07001060
1061private:
1062 struct Accumulator {
1063 enum {
1064 FIELD_BTN_TOUCH = 1,
1065 FIELD_ABS_X = 2,
1066 FIELD_ABS_Y = 4,
1067 FIELD_ABS_PRESSURE = 8,
Jeff Brownefd32662011-03-08 15:13:06 -08001068 FIELD_ABS_TOOL_WIDTH = 16,
Jeff Brown96ad3972011-03-09 17:39:48 -08001069 FIELD_BUTTONS = 32,
Jeff Brown6d0fec22010-07-23 21:28:06 -07001070 };
1071
1072 uint32_t fields;
1073
1074 bool btnTouch;
1075 int32_t absX;
1076 int32_t absY;
1077 int32_t absPressure;
1078 int32_t absToolWidth;
1079
Jeff Brown96ad3972011-03-09 17:39:48 -08001080 uint32_t buttonDown;
1081 uint32_t buttonUp;
1082
Jeff Brown6d0fec22010-07-23 21:28:06 -07001083 inline void clear() {
1084 fields = 0;
Jeff Brown96ad3972011-03-09 17:39:48 -08001085 buttonDown = 0;
1086 buttonUp = 0;
Jeff Brown6d0fec22010-07-23 21:28:06 -07001087 }
Jeff Brown6d0fec22010-07-23 21:28:06 -07001088 } mAccumulator;
1089
1090 bool mDown;
1091 int32_t mX;
1092 int32_t mY;
1093 int32_t mPressure;
Jeff Brown8d608662010-08-30 03:02:23 -07001094 int32_t mToolWidth;
Jeff Brown96ad3972011-03-09 17:39:48 -08001095 uint32_t mButtonState;
Jeff Brown6d0fec22010-07-23 21:28:06 -07001096
1097 void initialize();
1098
1099 void sync(nsecs_t when);
1100};
1101
1102
1103class MultiTouchInputMapper : public TouchInputMapper {
1104public:
Jeff Brown47e6b1b2010-11-29 17:37:49 -08001105 MultiTouchInputMapper(InputDevice* device);
Jeff Brown6d0fec22010-07-23 21:28:06 -07001106 virtual ~MultiTouchInputMapper();
1107
1108 virtual void reset();
1109 virtual void process(const RawEvent* rawEvent);
1110
1111protected:
Jeff Brown8d608662010-08-30 03:02:23 -07001112 virtual void configureRawAxes();
Jeff Brown6d0fec22010-07-23 21:28:06 -07001113
1114private:
1115 struct Accumulator {
1116 enum {
1117 FIELD_ABS_MT_POSITION_X = 1,
1118 FIELD_ABS_MT_POSITION_Y = 2,
1119 FIELD_ABS_MT_TOUCH_MAJOR = 4,
1120 FIELD_ABS_MT_TOUCH_MINOR = 8,
1121 FIELD_ABS_MT_WIDTH_MAJOR = 16,
1122 FIELD_ABS_MT_WIDTH_MINOR = 32,
1123 FIELD_ABS_MT_ORIENTATION = 64,
Jeff Brown2dfd7a72010-08-17 20:38:35 -07001124 FIELD_ABS_MT_TRACKING_ID = 128,
1125 FIELD_ABS_MT_PRESSURE = 256,
Jeff Brown6d0fec22010-07-23 21:28:06 -07001126 };
1127
1128 uint32_t pointerCount;
1129 struct Pointer {
1130 uint32_t fields;
1131
1132 int32_t absMTPositionX;
1133 int32_t absMTPositionY;
1134 int32_t absMTTouchMajor;
1135 int32_t absMTTouchMinor;
1136 int32_t absMTWidthMajor;
1137 int32_t absMTWidthMinor;
1138 int32_t absMTOrientation;
1139 int32_t absMTTrackingId;
Jeff Brown2dfd7a72010-08-17 20:38:35 -07001140 int32_t absMTPressure;
Jeff Brown6d0fec22010-07-23 21:28:06 -07001141
1142 inline void clear() {
1143 fields = 0;
1144 }
1145 } pointers[MAX_POINTERS + 1]; // + 1 to remove the need for extra range checks
1146
Jeff Brown96ad3972011-03-09 17:39:48 -08001147 // Bitfield of buttons that went down or up.
1148 uint32_t buttonDown;
1149 uint32_t buttonUp;
1150
Jeff Brown6d0fec22010-07-23 21:28:06 -07001151 inline void clear() {
1152 pointerCount = 0;
1153 pointers[0].clear();
Jeff Brown96ad3972011-03-09 17:39:48 -08001154 buttonDown = 0;
1155 buttonUp = 0;
Jeff Brown6d0fec22010-07-23 21:28:06 -07001156 }
Jeff Brown6d0fec22010-07-23 21:28:06 -07001157 } mAccumulator;
1158
Jeff Brown96ad3972011-03-09 17:39:48 -08001159 uint32_t mButtonState;
1160
Jeff Brown6d0fec22010-07-23 21:28:06 -07001161 void initialize();
1162
1163 void sync(nsecs_t when);
1164};
1165
Jeff Browncb1404e2011-01-15 18:14:15 -08001166
1167class JoystickInputMapper : public InputMapper {
1168public:
1169 JoystickInputMapper(InputDevice* device);
1170 virtual ~JoystickInputMapper();
1171
1172 virtual uint32_t getSources();
1173 virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
1174 virtual void dump(String8& dump);
1175 virtual void configure();
1176 virtual void reset();
1177 virtual void process(const RawEvent* rawEvent);
1178
1179private:
Jeff Brown6f2fba42011-02-19 01:08:02 -08001180 struct Axis {
1181 RawAbsoluteAxisInfo rawAxisInfo;
Jeff Brown85297452011-03-04 13:07:49 -08001182 AxisInfo axisInfo;
Jeff Browncb1404e2011-01-15 18:14:15 -08001183
Jeff Brown6f2fba42011-02-19 01:08:02 -08001184 bool explicitlyMapped; // true if the axis was explicitly assigned an axis id
Jeff Browncb1404e2011-01-15 18:14:15 -08001185
Jeff Brown6f2fba42011-02-19 01:08:02 -08001186 float scale; // scale factor from raw to normalized values
1187 float offset; // offset to add after scaling for normalization
Jeff Brown85297452011-03-04 13:07:49 -08001188 float highScale; // scale factor from raw to normalized values of high split
1189 float highOffset; // offset to add after scaling for normalization of high split
Jeff Browncb1404e2011-01-15 18:14:15 -08001190
Jeff Brown6f2fba42011-02-19 01:08:02 -08001191 float min; // normalized inclusive minimum
1192 float max; // normalized inclusive maximum
1193 float flat; // normalized flat region size
1194 float fuzz; // normalized error tolerance
Jeff Browncb1404e2011-01-15 18:14:15 -08001195
Jeff Brown6f2fba42011-02-19 01:08:02 -08001196 float filter; // filter out small variations of this size
Jeff Brown85297452011-03-04 13:07:49 -08001197 float currentValue; // current value
1198 float newValue; // most recent value
1199 float highCurrentValue; // current value of high split
1200 float highNewValue; // most recent value of high split
Jeff Browncb1404e2011-01-15 18:14:15 -08001201
Jeff Brown85297452011-03-04 13:07:49 -08001202 void initialize(const RawAbsoluteAxisInfo& rawAxisInfo, const AxisInfo& axisInfo,
1203 bool explicitlyMapped, float scale, float offset,
1204 float highScale, float highOffset,
Jeff Brown6f2fba42011-02-19 01:08:02 -08001205 float min, float max, float flat, float fuzz) {
1206 this->rawAxisInfo = rawAxisInfo;
Jeff Brown85297452011-03-04 13:07:49 -08001207 this->axisInfo = axisInfo;
Jeff Brown6f2fba42011-02-19 01:08:02 -08001208 this->explicitlyMapped = explicitlyMapped;
1209 this->scale = scale;
1210 this->offset = offset;
Jeff Brown85297452011-03-04 13:07:49 -08001211 this->highScale = highScale;
1212 this->highOffset = highOffset;
Jeff Brown6f2fba42011-02-19 01:08:02 -08001213 this->min = min;
1214 this->max = max;
1215 this->flat = flat;
1216 this->fuzz = fuzz;
1217 this->filter = 0;
Jeff Brown85297452011-03-04 13:07:49 -08001218 resetValue();
1219 }
1220
1221 void resetValue() {
1222 this->currentValue = 0;
Jeff Brown6f2fba42011-02-19 01:08:02 -08001223 this->newValue = 0;
Jeff Brown85297452011-03-04 13:07:49 -08001224 this->highCurrentValue = 0;
1225 this->highNewValue = 0;
Jeff Browncb1404e2011-01-15 18:14:15 -08001226 }
1227 };
1228
Jeff Brown6f2fba42011-02-19 01:08:02 -08001229 // Axes indexed by raw ABS_* axis index.
1230 KeyedVector<int32_t, Axis> mAxes;
Jeff Browncb1404e2011-01-15 18:14:15 -08001231
Jeff Brown6f2fba42011-02-19 01:08:02 -08001232 void sync(nsecs_t when, bool force);
Jeff Browncb1404e2011-01-15 18:14:15 -08001233
Jeff Brown85297452011-03-04 13:07:49 -08001234 bool haveAxis(int32_t axisId);
Jeff Brown6f2fba42011-02-19 01:08:02 -08001235 void pruneAxes(bool ignoreExplicitlyMappedAxes);
Jeff Brown85297452011-03-04 13:07:49 -08001236 bool filterAxes(bool force);
1237
1238 static bool hasValueChangedSignificantly(float filter,
1239 float newValue, float currentValue, float min, float max);
1240 static bool hasMovedNearerToValueWithinFilteredRange(float filter,
1241 float newValue, float currentValue, float thresholdValue);
Jeff Browncb1404e2011-01-15 18:14:15 -08001242
Jeff Brown6f2fba42011-02-19 01:08:02 -08001243 static bool isCenteredAxis(int32_t axis);
Jeff Browncb1404e2011-01-15 18:14:15 -08001244};
1245
Jeff Brown46b9ac02010-04-22 18:58:52 -07001246} // namespace android
1247
1248#endif // _UI_INPUT_READER_H