blob: e9cacf44863e1f33d4aefc5c9ea5b9ef403f2d94 [file] [log] [blame]
Jeff Browne839a582010-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_H
18#define _UI_INPUT_H
19
20/**
21 * Native input event structures.
22 */
23
24#include <android/input.h>
25#include <utils/Vector.h>
Jeff Browne57e8952010-07-23 21:28:06 -070026#include <utils/KeyedVector.h>
Jeff Browne839a582010-04-22 18:58:52 -070027#include <utils/Timers.h>
Jeff Browne57e8952010-07-23 21:28:06 -070028#include <utils/RefBase.h>
29#include <utils/String8.h>
Jeff Brownfa773aa2011-03-09 17:39:48 -080030#include <utils/BitSet.h>
Jeff Browne839a582010-04-22 18:58:52 -070031
Jeff Brown3e341462011-02-14 17:03:18 -080032#ifdef HAVE_ANDROID_OS
33class SkMatrix;
34#endif
35
Jeff Browne839a582010-04-22 18:58:52 -070036/*
37 * Additional private constants not defined in ndk/ui/input.h.
38 */
39enum {
40 /*
41 * Private control to determine when an app is tracking a key sequence.
42 */
Jeff Brown5c1ed842010-07-14 18:48:53 -070043 AKEY_EVENT_FLAG_START_TRACKING = 0x40000000
Jeff Browne839a582010-04-22 18:58:52 -070044};
45
Jeff Brown430c21e2011-01-19 18:41:38 -080046enum {
47 /*
48 * Indicates that an input device has switches.
49 * This input source flag is hidden from the API because switches are only used by the system
50 * and applications have no way to interact with them.
51 */
52 AINPUT_SOURCE_SWITCH = 0x80000000,
53};
54
Jeff Browne839a582010-04-22 18:58:52 -070055/*
Jeff Brown80f3e7c2011-03-02 14:41:58 -080056 * SystemUiVisibility constants from View.
57 */
58enum {
59 ASYSTEM_UI_VISIBILITY_STATUS_BAR_VISIBLE = 0,
60 ASYSTEM_UI_VISIBILITY_STATUS_BAR_HIDDEN = 0x00000001,
61};
62
63/*
Jeff Browne839a582010-04-22 18:58:52 -070064 * Maximum number of pointers supported per motion event.
Jeff Brownd1b0a2b2010-09-26 22:20:12 -070065 * Smallest number of pointers is 1.
Jeff Browneb8b9d82011-01-25 16:02:22 -080066 * (We want at least 10 but some touch controllers obstensibly configured for 10 pointers
67 * will occasionally emit 11. There is not much harm making this constant bigger.)
Jeff Browne839a582010-04-22 18:58:52 -070068 */
Jeff Browneb8b9d82011-01-25 16:02:22 -080069#define MAX_POINTERS 16
Jeff Browne839a582010-04-22 18:58:52 -070070
Dianne Hackborn4d96bb62010-06-18 18:09:33 -070071/*
Jeff Brownd1b0a2b2010-09-26 22:20:12 -070072 * Maximum pointer id value supported in a motion event.
73 * Smallest pointer id is 0.
74 * (This is limited by our use of BitSet32 to track pointer assignments.)
75 */
76#define MAX_POINTER_ID 31
77
78/*
Dianne Hackborn4d96bb62010-06-18 18:09:33 -070079 * Declare a concrete type for the NDK's input event forward declaration.
80 */
Dianne Hackbornce838a22010-07-13 17:48:30 -070081struct AInputEvent {
82 virtual ~AInputEvent() { }
83};
Dianne Hackborn4d96bb62010-06-18 18:09:33 -070084
Jeff Browne839a582010-04-22 18:58:52 -070085/*
Jeff Browne57e8952010-07-23 21:28:06 -070086 * Declare a concrete type for the NDK's input device forward declaration.
Jeff Browne839a582010-04-22 18:58:52 -070087 */
Jeff Browne57e8952010-07-23 21:28:06 -070088struct AInputDevice {
89 virtual ~AInputDevice() { }
Jeff Browne839a582010-04-22 18:58:52 -070090};
91
Jeff Browne57e8952010-07-23 21:28:06 -070092
93namespace android {
94
Jeff Brown3e341462011-02-14 17:03:18 -080095#ifdef HAVE_ANDROID_OS
96class Parcel;
97#endif
98
Jeff Browne839a582010-04-22 18:58:52 -070099/*
100 * Flags that flow alongside events in the input dispatch system to help with certain
101 * policy decisions such as waking from device sleep.
Jeff Brown90f0cee2010-10-08 22:31:17 -0700102 *
103 * These flags are also defined in frameworks/base/core/java/android/view/WindowManagerPolicy.java.
Jeff Browne839a582010-04-22 18:58:52 -0700104 */
105enum {
Jeff Brown956c0fb2010-10-01 14:55:30 -0700106 /* These flags originate in RawEvents and are generally set in the key map.
Jeff Brown6a817e22010-09-12 17:55:08 -0700107 * NOTE: If you edit these flags, also edit labels in KeycodeLabels.h. */
Jeff Browne839a582010-04-22 18:58:52 -0700108
109 POLICY_FLAG_WAKE = 0x00000001,
110 POLICY_FLAG_WAKE_DROPPED = 0x00000002,
111 POLICY_FLAG_SHIFT = 0x00000004,
112 POLICY_FLAG_CAPS_LOCK = 0x00000008,
113 POLICY_FLAG_ALT = 0x00000010,
114 POLICY_FLAG_ALT_GR = 0x00000020,
115 POLICY_FLAG_MENU = 0x00000040,
116 POLICY_FLAG_LAUNCHER = 0x00000080,
Jeff Brown956c0fb2010-10-01 14:55:30 -0700117 POLICY_FLAG_VIRTUAL = 0x00000100,
Jeff Brown6a817e22010-09-12 17:55:08 -0700118 POLICY_FLAG_FUNCTION = 0x00000200,
Jeff Browne839a582010-04-22 18:58:52 -0700119
Jeff Brown51d45a72010-06-17 20:52:56 -0700120 POLICY_FLAG_RAW_MASK = 0x0000ffff,
121
Jeff Brownaf30ff62010-09-01 17:01:00 -0700122 /* These flags are set by the input dispatcher. */
123
124 // Indicates that the input event was injected.
125 POLICY_FLAG_INJECTED = 0x01000000,
126
Jeff Brown33d54ce2010-10-11 14:20:19 -0700127 // Indicates that the input event is from a trusted source such as a directly attached
128 // input device or an application with system-wide event injection permission.
129 POLICY_FLAG_TRUSTED = 0x02000000,
130
Jeff Brown54bc2812010-06-15 01:31:58 -0700131 /* These flags are set by the input reader policy as it intercepts each event. */
Jeff Browne839a582010-04-22 18:58:52 -0700132
133 // Indicates that the screen was off when the event was received and the event
134 // should wake the device.
135 POLICY_FLAG_WOKE_HERE = 0x10000000,
136
137 // Indicates that the screen was dim when the event was received and the event
138 // should brighten the device.
139 POLICY_FLAG_BRIGHT_HERE = 0x20000000,
Jeff Brown90f0cee2010-10-08 22:31:17 -0700140
141 // Indicates that the event should be dispatched to applications.
142 // The input event should still be sent to the InputDispatcher so that it can see all
143 // input events received include those that it will not deliver.
144 POLICY_FLAG_PASS_TO_USER = 0x40000000,
Jeff Browne839a582010-04-22 18:58:52 -0700145};
146
147/*
Jeff Brown46689da2011-03-08 15:13:06 -0800148 * Button state.
149 */
150enum {
151 // Primary button pressed (left mouse button).
152 BUTTON_STATE_PRIMARY = 1 << 0,
153};
154
155/*
Jeff Brown54bc2812010-06-15 01:31:58 -0700156 * Describes the basic configuration of input devices that are present.
157 */
158struct InputConfiguration {
159 enum {
160 TOUCHSCREEN_UNDEFINED = 0,
161 TOUCHSCREEN_NOTOUCH = 1,
162 TOUCHSCREEN_STYLUS = 2,
163 TOUCHSCREEN_FINGER = 3
164 };
165
166 enum {
167 KEYBOARD_UNDEFINED = 0,
168 KEYBOARD_NOKEYS = 1,
169 KEYBOARD_QWERTY = 2,
170 KEYBOARD_12KEY = 3
171 };
172
173 enum {
174 NAVIGATION_UNDEFINED = 0,
175 NAVIGATION_NONAV = 1,
176 NAVIGATION_DPAD = 2,
177 NAVIGATION_TRACKBALL = 3,
178 NAVIGATION_WHEEL = 4
179 };
180
181 int32_t touchScreen;
182 int32_t keyboard;
183 int32_t navigation;
184};
185
186/*
Jeff Browne839a582010-04-22 18:58:52 -0700187 * Pointer coordinate data.
188 */
189struct PointerCoords {
Jeff Brown3ea4de82011-02-19 01:08:02 -0800190 enum { MAX_AXES = 14 }; // 14 so that sizeof(PointerCoords) == 64
Jeff Brown3e341462011-02-14 17:03:18 -0800191
192 // Bitfield of axes that are present in this structure.
Jeff Brown3ea4de82011-02-19 01:08:02 -0800193 uint64_t bits;
Jeff Brown3e341462011-02-14 17:03:18 -0800194
195 // Values of axes that are stored in this structure packed in order by axis id
196 // for each axis that is present in the structure according to 'bits'.
197 float values[MAX_AXES];
198
199 inline void clear() {
200 bits = 0;
201 }
202
Jeff Brown3ea4de82011-02-19 01:08:02 -0800203 float getAxisValue(int32_t axis) const;
204 status_t setAxisValue(int32_t axis, float value);
205 float* editAxisValue(int32_t axis);
Jeff Brown3e341462011-02-14 17:03:18 -0800206
207#ifdef HAVE_ANDROID_OS
208 status_t readFromParcel(Parcel* parcel);
209 status_t writeToParcel(Parcel* parcel) const;
210#endif
211
Jeff Brownfa773aa2011-03-09 17:39:48 -0800212 bool operator==(const PointerCoords& other) const;
213 inline bool operator!=(const PointerCoords& other) const {
214 return !(*this == other);
215 }
216
217 void copyFrom(const PointerCoords& other);
218
Jeff Brown3e341462011-02-14 17:03:18 -0800219private:
220 void tooManyAxes(int axis);
Jeff Browne839a582010-04-22 18:58:52 -0700221};
222
223/*
224 * Input events.
225 */
Dianne Hackborn9c7f8182010-06-28 15:27:30 -0700226class InputEvent : public AInputEvent {
Jeff Browne839a582010-04-22 18:58:52 -0700227public:
228 virtual ~InputEvent() { }
229
230 virtual int32_t getType() const = 0;
231
232 inline int32_t getDeviceId() const { return mDeviceId; }
233
Jeff Brown5c1ed842010-07-14 18:48:53 -0700234 inline int32_t getSource() const { return mSource; }
Jeff Brown3e341462011-02-14 17:03:18 -0800235
236 inline void setSource(int32_t source) { mSource = source; }
237
Jeff Browne839a582010-04-22 18:58:52 -0700238protected:
Jeff Brown5c1ed842010-07-14 18:48:53 -0700239 void initialize(int32_t deviceId, int32_t source);
Dianne Hackborn0e885272010-07-15 17:44:53 -0700240 void initialize(const InputEvent& from);
Jeff Browne839a582010-04-22 18:58:52 -0700241
Jeff Browne839a582010-04-22 18:58:52 -0700242 int32_t mDeviceId;
Jeff Brown5c1ed842010-07-14 18:48:53 -0700243 int32_t mSource;
Jeff Browne839a582010-04-22 18:58:52 -0700244};
245
Jeff Brownf4a4ec22010-06-16 01:53:36 -0700246/*
247 * Key events.
248 */
Jeff Browne839a582010-04-22 18:58:52 -0700249class KeyEvent : public InputEvent {
250public:
251 virtual ~KeyEvent() { }
252
Jeff Brown5c1ed842010-07-14 18:48:53 -0700253 virtual int32_t getType() const { return AINPUT_EVENT_TYPE_KEY; }
Jeff Browne839a582010-04-22 18:58:52 -0700254
255 inline int32_t getAction() const { return mAction; }
256
257 inline int32_t getFlags() const { return mFlags; }
258
259 inline int32_t getKeyCode() const { return mKeyCode; }
260
261 inline int32_t getScanCode() const { return mScanCode; }
262
263 inline int32_t getMetaState() const { return mMetaState; }
264
265 inline int32_t getRepeatCount() const { return mRepeatCount; }
266
267 inline nsecs_t getDownTime() const { return mDownTime; }
268
269 inline nsecs_t getEventTime() const { return mEventTime; }
270
Dianne Hackborn189ed232010-06-29 19:20:40 -0700271 // Return true if this event may have a default action implementation.
272 static bool hasDefaultAction(int32_t keyCode);
273 bool hasDefaultAction() const;
274
275 // Return true if this event represents a system key.
276 static bool isSystemKey(int32_t keyCode);
277 bool isSystemKey() const;
278
Jeff Browne839a582010-04-22 18:58:52 -0700279 void initialize(
280 int32_t deviceId,
Jeff Brown5c1ed842010-07-14 18:48:53 -0700281 int32_t source,
Jeff Browne839a582010-04-22 18:58:52 -0700282 int32_t action,
283 int32_t flags,
284 int32_t keyCode,
285 int32_t scanCode,
286 int32_t metaState,
287 int32_t repeatCount,
288 nsecs_t downTime,
289 nsecs_t eventTime);
Dianne Hackborn0e885272010-07-15 17:44:53 -0700290 void initialize(const KeyEvent& from);
Jeff Browne839a582010-04-22 18:58:52 -0700291
Jeff Brown3e341462011-02-14 17:03:18 -0800292protected:
Jeff Browne839a582010-04-22 18:58:52 -0700293 int32_t mAction;
294 int32_t mFlags;
295 int32_t mKeyCode;
296 int32_t mScanCode;
297 int32_t mMetaState;
298 int32_t mRepeatCount;
299 nsecs_t mDownTime;
300 nsecs_t mEventTime;
301};
302
Jeff Brownf4a4ec22010-06-16 01:53:36 -0700303/*
304 * Motion events.
305 */
Jeff Browne839a582010-04-22 18:58:52 -0700306class MotionEvent : public InputEvent {
307public:
308 virtual ~MotionEvent() { }
309
Jeff Brown5c1ed842010-07-14 18:48:53 -0700310 virtual int32_t getType() const { return AINPUT_EVENT_TYPE_MOTION; }
Jeff Browne839a582010-04-22 18:58:52 -0700311
312 inline int32_t getAction() const { return mAction; }
313
Jeff Brown3e341462011-02-14 17:03:18 -0800314 inline void setAction(int32_t action) { mAction = action; }
315
Jeff Brownaf30ff62010-09-01 17:01:00 -0700316 inline int32_t getFlags() const { return mFlags; }
317
Jeff Browne839a582010-04-22 18:58:52 -0700318 inline int32_t getEdgeFlags() const { return mEdgeFlags; }
319
Jeff Brown3e341462011-02-14 17:03:18 -0800320 inline void setEdgeFlags(int32_t edgeFlags) { mEdgeFlags = edgeFlags; }
321
Jeff Browne839a582010-04-22 18:58:52 -0700322 inline int32_t getMetaState() const { return mMetaState; }
323
Jeff Brown3e341462011-02-14 17:03:18 -0800324 inline void setMetaState(int32_t metaState) { mMetaState = metaState; }
325
Jeff Brownf4a4ec22010-06-16 01:53:36 -0700326 inline float getXOffset() const { return mXOffset; }
327
328 inline float getYOffset() const { return mYOffset; }
329
Jeff Browne839a582010-04-22 18:58:52 -0700330 inline float getXPrecision() const { return mXPrecision; }
331
332 inline float getYPrecision() const { return mYPrecision; }
333
334 inline nsecs_t getDownTime() const { return mDownTime; }
335
336 inline size_t getPointerCount() const { return mPointerIds.size(); }
337
338 inline int32_t getPointerId(size_t pointerIndex) const { return mPointerIds[pointerIndex]; }
339
340 inline nsecs_t getEventTime() const { return mSampleEventTimes[getHistorySize()]; }
341
Jeff Brown3e341462011-02-14 17:03:18 -0800342 const PointerCoords* getRawPointerCoords(size_t pointerIndex) const;
343
344 float getRawAxisValue(int32_t axis, size_t pointerIndex) const;
345
Jeff Brownf4a4ec22010-06-16 01:53:36 -0700346 inline float getRawX(size_t pointerIndex) const {
Jeff Brownb2d44352011-02-17 13:01:34 -0800347 return getRawAxisValue(AMOTION_EVENT_AXIS_X, pointerIndex);
Jeff Browne839a582010-04-22 18:58:52 -0700348 }
349
Jeff Brownf4a4ec22010-06-16 01:53:36 -0700350 inline float getRawY(size_t pointerIndex) const {
Jeff Brownb2d44352011-02-17 13:01:34 -0800351 return getRawAxisValue(AMOTION_EVENT_AXIS_Y, pointerIndex);
Jeff Browne839a582010-04-22 18:58:52 -0700352 }
353
Jeff Brown3e341462011-02-14 17:03:18 -0800354 float getAxisValue(int32_t axis, size_t pointerIndex) const;
355
Jeff Brownf4a4ec22010-06-16 01:53:36 -0700356 inline float getX(size_t pointerIndex) const {
Jeff Brownb2d44352011-02-17 13:01:34 -0800357 return getAxisValue(AMOTION_EVENT_AXIS_X, pointerIndex);
Jeff Brownf4a4ec22010-06-16 01:53:36 -0700358 }
359
360 inline float getY(size_t pointerIndex) const {
Jeff Brownb2d44352011-02-17 13:01:34 -0800361 return getAxisValue(AMOTION_EVENT_AXIS_Y, pointerIndex);
Jeff Brownf4a4ec22010-06-16 01:53:36 -0700362 }
363
Jeff Browne839a582010-04-22 18:58:52 -0700364 inline float getPressure(size_t pointerIndex) const {
Jeff Brownb2d44352011-02-17 13:01:34 -0800365 return getAxisValue(AMOTION_EVENT_AXIS_PRESSURE, pointerIndex);
Jeff Browne839a582010-04-22 18:58:52 -0700366 }
367
368 inline float getSize(size_t pointerIndex) const {
Jeff Brownb2d44352011-02-17 13:01:34 -0800369 return getAxisValue(AMOTION_EVENT_AXIS_SIZE, pointerIndex);
Jeff Browne839a582010-04-22 18:58:52 -0700370 }
371
Jeff Brown5c1ed842010-07-14 18:48:53 -0700372 inline float getTouchMajor(size_t pointerIndex) const {
Jeff Brownb2d44352011-02-17 13:01:34 -0800373 return getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, pointerIndex);
Jeff Brown5c1ed842010-07-14 18:48:53 -0700374 }
375
376 inline float getTouchMinor(size_t pointerIndex) const {
Jeff Brownb2d44352011-02-17 13:01:34 -0800377 return getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, pointerIndex);
Jeff Brown5c1ed842010-07-14 18:48:53 -0700378 }
379
380 inline float getToolMajor(size_t pointerIndex) const {
Jeff Brownb2d44352011-02-17 13:01:34 -0800381 return getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, pointerIndex);
Jeff Brown5c1ed842010-07-14 18:48:53 -0700382 }
383
384 inline float getToolMinor(size_t pointerIndex) const {
Jeff Brownb2d44352011-02-17 13:01:34 -0800385 return getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR, pointerIndex);
Jeff Brown5c1ed842010-07-14 18:48:53 -0700386 }
387
388 inline float getOrientation(size_t pointerIndex) const {
Jeff Brownb2d44352011-02-17 13:01:34 -0800389 return getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, pointerIndex);
Jeff Brown5c1ed842010-07-14 18:48:53 -0700390 }
391
Jeff Browne839a582010-04-22 18:58:52 -0700392 inline size_t getHistorySize() const { return mSampleEventTimes.size() - 1; }
393
394 inline nsecs_t getHistoricalEventTime(size_t historicalIndex) const {
395 return mSampleEventTimes[historicalIndex];
396 }
397
Jeff Brown3e341462011-02-14 17:03:18 -0800398 const PointerCoords* getHistoricalRawPointerCoords(
399 size_t pointerIndex, size_t historicalIndex) const;
400
401 float getHistoricalRawAxisValue(int32_t axis, size_t pointerIndex,
402 size_t historicalIndex) const;
403
Jeff Brownf4a4ec22010-06-16 01:53:36 -0700404 inline float getHistoricalRawX(size_t pointerIndex, size_t historicalIndex) const {
Jeff Brown3e341462011-02-14 17:03:18 -0800405 return getHistoricalRawAxisValue(
Jeff Brownb2d44352011-02-17 13:01:34 -0800406 AMOTION_EVENT_AXIS_X, pointerIndex, historicalIndex);
Jeff Browne839a582010-04-22 18:58:52 -0700407 }
408
Jeff Brownf4a4ec22010-06-16 01:53:36 -0700409 inline float getHistoricalRawY(size_t pointerIndex, size_t historicalIndex) const {
Jeff Brown3e341462011-02-14 17:03:18 -0800410 return getHistoricalRawAxisValue(
Jeff Brownb2d44352011-02-17 13:01:34 -0800411 AMOTION_EVENT_AXIS_Y, pointerIndex, historicalIndex);
Jeff Browne839a582010-04-22 18:58:52 -0700412 }
413
Jeff Brown3e341462011-02-14 17:03:18 -0800414 float getHistoricalAxisValue(int32_t axis, size_t pointerIndex, size_t historicalIndex) const;
415
Jeff Brownf4a4ec22010-06-16 01:53:36 -0700416 inline float getHistoricalX(size_t pointerIndex, size_t historicalIndex) const {
Jeff Brown3e341462011-02-14 17:03:18 -0800417 return getHistoricalAxisValue(
Jeff Brownb2d44352011-02-17 13:01:34 -0800418 AMOTION_EVENT_AXIS_X, pointerIndex, historicalIndex);
Jeff Brownf4a4ec22010-06-16 01:53:36 -0700419 }
420
421 inline float getHistoricalY(size_t pointerIndex, size_t historicalIndex) const {
Jeff Brown3e341462011-02-14 17:03:18 -0800422 return getHistoricalAxisValue(
Jeff Brownb2d44352011-02-17 13:01:34 -0800423 AMOTION_EVENT_AXIS_Y, pointerIndex, historicalIndex);
Jeff Brownf4a4ec22010-06-16 01:53:36 -0700424 }
425
Jeff Browne839a582010-04-22 18:58:52 -0700426 inline float getHistoricalPressure(size_t pointerIndex, size_t historicalIndex) const {
Jeff Brown3e341462011-02-14 17:03:18 -0800427 return getHistoricalAxisValue(
Jeff Brownb2d44352011-02-17 13:01:34 -0800428 AMOTION_EVENT_AXIS_PRESSURE, pointerIndex, historicalIndex);
Jeff Browne839a582010-04-22 18:58:52 -0700429 }
430
431 inline float getHistoricalSize(size_t pointerIndex, size_t historicalIndex) const {
Jeff Brown3e341462011-02-14 17:03:18 -0800432 return getHistoricalAxisValue(
Jeff Brownb2d44352011-02-17 13:01:34 -0800433 AMOTION_EVENT_AXIS_SIZE, pointerIndex, historicalIndex);
Jeff Browne839a582010-04-22 18:58:52 -0700434 }
435
Jeff Brown5c1ed842010-07-14 18:48:53 -0700436 inline float getHistoricalTouchMajor(size_t pointerIndex, size_t historicalIndex) const {
Jeff Brown3e341462011-02-14 17:03:18 -0800437 return getHistoricalAxisValue(
Jeff Brownb2d44352011-02-17 13:01:34 -0800438 AMOTION_EVENT_AXIS_TOUCH_MAJOR, pointerIndex, historicalIndex);
Jeff Brown5c1ed842010-07-14 18:48:53 -0700439 }
440
441 inline float getHistoricalTouchMinor(size_t pointerIndex, size_t historicalIndex) const {
Jeff Brown3e341462011-02-14 17:03:18 -0800442 return getHistoricalAxisValue(
Jeff Brownb2d44352011-02-17 13:01:34 -0800443 AMOTION_EVENT_AXIS_TOUCH_MINOR, pointerIndex, historicalIndex);
Jeff Brown5c1ed842010-07-14 18:48:53 -0700444 }
445
446 inline float getHistoricalToolMajor(size_t pointerIndex, size_t historicalIndex) const {
Jeff Brown3e341462011-02-14 17:03:18 -0800447 return getHistoricalAxisValue(
Jeff Brownb2d44352011-02-17 13:01:34 -0800448 AMOTION_EVENT_AXIS_TOOL_MAJOR, pointerIndex, historicalIndex);
Jeff Brown5c1ed842010-07-14 18:48:53 -0700449 }
450
451 inline float getHistoricalToolMinor(size_t pointerIndex, size_t historicalIndex) const {
Jeff Brown3e341462011-02-14 17:03:18 -0800452 return getHistoricalAxisValue(
Jeff Brownb2d44352011-02-17 13:01:34 -0800453 AMOTION_EVENT_AXIS_TOOL_MINOR, pointerIndex, historicalIndex);
Jeff Brown5c1ed842010-07-14 18:48:53 -0700454 }
455
456 inline float getHistoricalOrientation(size_t pointerIndex, size_t historicalIndex) const {
Jeff Brown3e341462011-02-14 17:03:18 -0800457 return getHistoricalAxisValue(
Jeff Brownb2d44352011-02-17 13:01:34 -0800458 AMOTION_EVENT_AXIS_ORIENTATION, pointerIndex, historicalIndex);
Jeff Brown5c1ed842010-07-14 18:48:53 -0700459 }
460
Jeff Browne839a582010-04-22 18:58:52 -0700461 void initialize(
462 int32_t deviceId,
Jeff Brown5c1ed842010-07-14 18:48:53 -0700463 int32_t source,
Jeff Browne839a582010-04-22 18:58:52 -0700464 int32_t action,
Jeff Brownaf30ff62010-09-01 17:01:00 -0700465 int32_t flags,
Jeff Browne839a582010-04-22 18:58:52 -0700466 int32_t edgeFlags,
467 int32_t metaState,
Jeff Brownf4a4ec22010-06-16 01:53:36 -0700468 float xOffset,
469 float yOffset,
Jeff Browne839a582010-04-22 18:58:52 -0700470 float xPrecision,
471 float yPrecision,
472 nsecs_t downTime,
473 nsecs_t eventTime,
474 size_t pointerCount,
475 const int32_t* pointerIds,
476 const PointerCoords* pointerCoords);
477
Jeff Brown3e341462011-02-14 17:03:18 -0800478 void copyFrom(const MotionEvent* other, bool keepHistory);
479
Jeff Browne839a582010-04-22 18:58:52 -0700480 void addSample(
481 nsecs_t eventTime,
482 const PointerCoords* pointerCoords);
483
484 void offsetLocation(float xOffset, float yOffset);
485
Jeff Brown3e341462011-02-14 17:03:18 -0800486 void scale(float scaleFactor);
487
488#ifdef HAVE_ANDROID_OS
489 void transform(const SkMatrix* matrix);
490
491 status_t readFromParcel(Parcel* parcel);
492 status_t writeToParcel(Parcel* parcel) const;
493#endif
494
Jeff Brownd5ed2852011-03-02 19:23:13 -0800495 static bool isTouchEvent(int32_t source, int32_t action);
496 inline bool isTouchEvent() const {
497 return isTouchEvent(mSource, mAction);
498 }
499
Jeff Brownf4a4ec22010-06-16 01:53:36 -0700500 // Low-level accessors.
501 inline const int32_t* getPointerIds() const { return mPointerIds.array(); }
502 inline const nsecs_t* getSampleEventTimes() const { return mSampleEventTimes.array(); }
503 inline const PointerCoords* getSamplePointerCoords() const {
504 return mSamplePointerCoords.array();
505 }
506
Jeff Brown3e341462011-02-14 17:03:18 -0800507protected:
Jeff Browne839a582010-04-22 18:58:52 -0700508 int32_t mAction;
Jeff Brownaf30ff62010-09-01 17:01:00 -0700509 int32_t mFlags;
Jeff Browne839a582010-04-22 18:58:52 -0700510 int32_t mEdgeFlags;
511 int32_t mMetaState;
Jeff Brownf4a4ec22010-06-16 01:53:36 -0700512 float mXOffset;
513 float mYOffset;
Jeff Browne839a582010-04-22 18:58:52 -0700514 float mXPrecision;
515 float mYPrecision;
516 nsecs_t mDownTime;
517 Vector<int32_t> mPointerIds;
518 Vector<nsecs_t> mSampleEventTimes;
519 Vector<PointerCoords> mSamplePointerCoords;
Jeff Browne839a582010-04-22 18:58:52 -0700520};
521
522/*
523 * Input event factory.
524 */
525class InputEventFactoryInterface {
526protected:
527 virtual ~InputEventFactoryInterface() { }
528
529public:
530 InputEventFactoryInterface() { }
531
532 virtual KeyEvent* createKeyEvent() = 0;
533 virtual MotionEvent* createMotionEvent() = 0;
534};
535
536/*
537 * A simple input event factory implementation that uses a single preallocated instance
538 * of each type of input event that are reused for each request.
539 */
540class PreallocatedInputEventFactory : public InputEventFactoryInterface {
541public:
542 PreallocatedInputEventFactory() { }
543 virtual ~PreallocatedInputEventFactory() { }
544
545 virtual KeyEvent* createKeyEvent() { return & mKeyEvent; }
546 virtual MotionEvent* createMotionEvent() { return & mMotionEvent; }
547
548private:
549 KeyEvent mKeyEvent;
550 MotionEvent mMotionEvent;
551};
552
Jeff Browne57e8952010-07-23 21:28:06 -0700553/*
Jeff Brownfa773aa2011-03-09 17:39:48 -0800554 * Calculates the velocity of pointer motions over time.
555 * Uses essentially the same algorithm as android.view.VelocityTracker.
556 */
557class VelocityTracker {
558public:
559 struct Position {
560 float x, y;
561 };
562
563 VelocityTracker();
564
565 // Resets the velocity tracker state.
566 void clear();
567
568 // Adds movement information for a set of pointers.
569 // The idBits bitfield specifies the pointer ids of the pointers whose positions
570 // are included in the movement.
571 // The positions array contains position information for each pointer in order by
572 // increasing id. Its size should be equal to the number of one bits in idBits.
573 void addMovement(nsecs_t eventTime, BitSet32 idBits, const Position* positions);
574
575 // Gets the velocity of the specified pointer id in position units per second.
576 // Returns false and sets the velocity components to zero if there is no movement
577 // information for the pointer.
578 bool getVelocity(uint32_t id, float* outVx, float* outVy) const;
579
580private:
581 // Number of samples to keep.
582 static const uint32_t HISTORY_SIZE = 10;
583
584 // Oldest sample to consider when calculating the velocity.
585 static const nsecs_t MAX_AGE = 200 * 1000000; // 200 ms
586
587 // The minimum duration between samples when estimating velocity.
588 static const nsecs_t MIN_DURATION = 5 * 1000000; // 5 ms
589
590 struct Movement {
591 nsecs_t eventTime;
592 BitSet32 idBits;
593 Position positions[MAX_POINTERS];
594 };
595
596 uint32_t mIndex;
597 Movement mMovements[HISTORY_SIZE];
598};
599
600/*
Jeff Browne57e8952010-07-23 21:28:06 -0700601 * Describes the characteristics and capabilities of an input device.
602 */
603class InputDeviceInfo {
604public:
605 InputDeviceInfo();
606 InputDeviceInfo(const InputDeviceInfo& other);
607 ~InputDeviceInfo();
608
609 struct MotionRange {
Jeff Brown46689da2011-03-08 15:13:06 -0800610 int32_t axis;
611 uint32_t source;
Jeff Browne57e8952010-07-23 21:28:06 -0700612 float min;
613 float max;
614 float flat;
615 float fuzz;
616 };
617
618 void initialize(int32_t id, const String8& name);
619
620 inline int32_t getId() const { return mId; }
621 inline const String8 getName() const { return mName; }
622 inline uint32_t getSources() const { return mSources; }
623
Jeff Brown46689da2011-03-08 15:13:06 -0800624 const MotionRange* getMotionRange(int32_t axis, uint32_t source) const;
Jeff Browne57e8952010-07-23 21:28:06 -0700625
626 void addSource(uint32_t source);
Jeff Brown46689da2011-03-08 15:13:06 -0800627 void addMotionRange(int32_t axis, uint32_t source,
628 float min, float max, float flat, float fuzz);
629 void addMotionRange(const MotionRange& range);
Jeff Browne57e8952010-07-23 21:28:06 -0700630
631 inline void setKeyboardType(int32_t keyboardType) { mKeyboardType = keyboardType; }
632 inline int32_t getKeyboardType() const { return mKeyboardType; }
633
Jeff Brown46689da2011-03-08 15:13:06 -0800634 inline const Vector<MotionRange>& getMotionRanges() const {
Jeff Brown38a7fab2010-08-30 03:02:23 -0700635 return mMotionRanges;
636 }
637
Jeff Browne57e8952010-07-23 21:28:06 -0700638private:
639 int32_t mId;
640 String8 mName;
641 uint32_t mSources;
642 int32_t mKeyboardType;
643
Jeff Brown46689da2011-03-08 15:13:06 -0800644 Vector<MotionRange> mMotionRanges;
Jeff Browne57e8952010-07-23 21:28:06 -0700645};
646
Jeff Browndb360642010-12-02 13:50:46 -0800647/*
648 * Identifies a device.
649 */
650struct InputDeviceIdentifier {
651 inline InputDeviceIdentifier() :
652 bus(0), vendor(0), product(0), version(0) {
653 }
654
655 String8 name;
656 String8 location;
657 String8 uniqueId;
658 uint16_t bus;
659 uint16_t vendor;
660 uint16_t product;
661 uint16_t version;
662};
663
Jeff Brown66888372010-11-29 17:37:49 -0800664/* Types of input device configuration files. */
665enum InputDeviceConfigurationFileType {
666 INPUT_DEVICE_CONFIGURATION_FILE_TYPE_CONFIGURATION = 0, /* .idc file */
667 INPUT_DEVICE_CONFIGURATION_FILE_TYPE_KEY_LAYOUT = 1, /* .kl file */
668 INPUT_DEVICE_CONFIGURATION_FILE_TYPE_KEY_CHARACTER_MAP = 2, /* .kcm file */
669};
670
671/*
Jeff Browndb360642010-12-02 13:50:46 -0800672 * Gets the path of an input device configuration file, if one is available.
Jeff Brown53c16642010-11-18 20:53:46 -0800673 * Considers both system provided and user installed configuration files.
Jeff Brown66888372010-11-29 17:37:49 -0800674 *
Jeff Browndb360642010-12-02 13:50:46 -0800675 * The device identifier is used to construct several default configuration file
676 * names to try based on the device name, vendor, product, and version.
677 *
Jeff Brown66888372010-11-29 17:37:49 -0800678 * Returns an empty string if not found.
679 */
Jeff Browndb360642010-12-02 13:50:46 -0800680extern String8 getInputDeviceConfigurationFilePathByDeviceIdentifier(
681 const InputDeviceIdentifier& deviceIdentifier,
682 InputDeviceConfigurationFileType type);
683
684/*
685 * Gets the path of an input device configuration file, if one is available.
686 * Considers both system provided and user installed configuration files.
687 *
688 * The name is case-sensitive and is used to construct the filename to resolve.
689 * All characters except 'a'-'z', 'A'-'Z', '0'-'9', '-', and '_' are replaced by underscores.
690 *
691 * Returns an empty string if not found.
692 */
693extern String8 getInputDeviceConfigurationFilePathByName(
Jeff Brown66888372010-11-29 17:37:49 -0800694 const String8& name, InputDeviceConfigurationFileType type);
Jeff Browne839a582010-04-22 18:58:52 -0700695
696} // namespace android
697
698#endif // _UI_INPUT_H