blob: 868a9de939729d8aeae2147823db539283e27a34 [file] [log] [blame]
Jeff Brownc5ed5912010-07-14 18:48:53 -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
17package android.view;
18
Siarhei Vishniakoua7f99b52017-03-21 17:39:40 -070019import android.annotation.RequiresPermission;
20import android.annotation.TestApi;
Mathew Inwooda570dee2018-08-17 14:56:00 +010021import android.annotation.UnsupportedAppUsage;
Jeff Browna47425a2012-04-13 04:09:27 -070022import android.content.Context;
RoboErikca9eef62013-12-16 11:27:55 -080023import android.hardware.input.InputDeviceIdentifier;
Jeff Brownac143512012-04-05 18:57:33 -070024import android.hardware.input.InputManager;
Sergey Vasilinetsacec8842019-02-08 16:42:31 +000025import android.os.Build;
Aurimas Liutikas67e2ae82016-10-11 18:17:42 -070026import android.os.NullVibrator;
Jeff Brown8d608662010-08-30 03:02:23 -070027import android.os.Parcel;
28import android.os.Parcelable;
Jeff Browna47425a2012-04-13 04:09:27 -070029import android.os.Vibrator;
Jeff Brownefd32662011-03-08 15:13:06 -080030
31import java.util.ArrayList;
32import java.util.List;
Jeff Brown8d608662010-08-30 03:02:23 -070033
Jeff Brownc5ed5912010-07-14 18:48:53 -070034/**
35 * Describes the capabilities of a particular input device.
36 * <p>
Jeff Brown9df6e7a2012-04-05 11:49:26 -070037 * Each input device may support multiple classes of input. For example, a multi-function
Jeff Brownc5ed5912010-07-14 18:48:53 -070038 * keyboard may compose the capabilities of a standard keyboard together with a track pad mouse
39 * or other pointing device.
40 * </p><p>
Jeff Browndc1ab4b2010-09-14 18:03:38 -070041 * Some input devices present multiple distinguishable sources of input.
Jeff Brownc5ed5912010-07-14 18:48:53 -070042 * Applications can query the framework about the characteristics of each distinct source.
43 * </p><p>
44 * As a further wrinkle, different kinds of input sources uses different coordinate systems
45 * to describe motion events. Refer to the comments on the input source constants for
46 * the appropriate interpretation.
Jeff Brown6d0fec22010-07-23 21:28:06 -070047 * </p>
Jeff Brownc5ed5912010-07-14 18:48:53 -070048 */
Jeff Brown8d608662010-08-30 03:02:23 -070049public final class InputDevice implements Parcelable {
Jeff Brown9f25b7f2012-04-10 14:30:49 -070050 private final int mId;
Jeff Brownaf9e8d32012-04-12 17:32:48 -070051 private final int mGeneration;
Michael Wrightac6c78b2013-07-17 13:21:45 -070052 private final int mControllerNumber;
Jeff Brown9f25b7f2012-04-10 14:30:49 -070053 private final String mName;
Michael Wright54e56942013-08-12 16:39:59 -070054 private final int mVendorId;
55 private final int mProductId;
Jeff Brown9f25b7f2012-04-10 14:30:49 -070056 private final String mDescriptor;
RoboErikca9eef62013-12-16 11:27:55 -080057 private final InputDeviceIdentifier mIdentifier;
Sergey Vasilinetsacec8842019-02-08 16:42:31 +000058 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
Jeff Browndaa37532012-05-01 15:54:03 -070059 private final boolean mIsExternal;
Jeff Brown9f25b7f2012-04-10 14:30:49 -070060 private final int mSources;
61 private final int mKeyboardType;
62 private final KeyCharacterMap mKeyCharacterMap;
Jeff Browna47425a2012-04-13 04:09:27 -070063 private final boolean mHasVibrator;
Tim Kilbourn72285e52015-06-05 15:52:05 -070064 private final boolean mHasMicrophone;
Michael Wright7ddd1102013-05-20 15:04:55 -070065 private final boolean mHasButtonUnderPad;
Jeff Brownefd32662011-03-08 15:13:06 -080066 private final ArrayList<MotionRange> mMotionRanges = new ArrayList<MotionRange>();
Jeff Brown91c69ab2011-02-14 17:03:18 -080067
Jeff Browna47425a2012-04-13 04:09:27 -070068 private Vibrator mVibrator; // guarded by mMotionRanges during initialization
69
Jeff Brownc5ed5912010-07-14 18:48:53 -070070 /**
71 * A mask for input source classes.
RoboErikca9eef62013-12-16 11:27:55 -080072 *
Jeff Brownc5ed5912010-07-14 18:48:53 -070073 * Each distinct input source constant has one or more input source class bits set to
74 * specify the desired interpretation for its input events.
75 */
76 public static final int SOURCE_CLASS_MASK = 0x000000ff;
Michael Wrighte7a9ae82013-03-08 15:19:19 -080077
78 /**
79 * The input source has no class.
80 *
81 * It is up to the application to determine how to handle the device based on the device type.
82 */
83 public static final int SOURCE_CLASS_NONE = 0x00000000;
84
Jeff Brownc5ed5912010-07-14 18:48:53 -070085 /**
86 * The input source has buttons or keys.
Jeff Browndc1ab4b2010-09-14 18:03:38 -070087 * Examples: {@link #SOURCE_KEYBOARD}, {@link #SOURCE_DPAD}.
RoboErikca9eef62013-12-16 11:27:55 -080088 *
Jeff Brownc5ed5912010-07-14 18:48:53 -070089 * A {@link KeyEvent} should be interpreted as a button or key press.
RoboErikca9eef62013-12-16 11:27:55 -080090 *
Jeff Brown6eb5ac92010-08-30 23:29:07 -070091 * Use {@link #getKeyCharacterMap} to query the device's button and key mappings.
Jeff Brownc5ed5912010-07-14 18:48:53 -070092 */
93 public static final int SOURCE_CLASS_BUTTON = 0x00000001;
RoboErikca9eef62013-12-16 11:27:55 -080094
Jeff Brownc5ed5912010-07-14 18:48:53 -070095 /**
96 * The input source is a pointing device associated with a display.
97 * Examples: {@link #SOURCE_TOUCHSCREEN}, {@link #SOURCE_MOUSE}.
RoboErikca9eef62013-12-16 11:27:55 -080098 *
Jeff Brownc5ed5912010-07-14 18:48:53 -070099 * A {@link MotionEvent} should be interpreted as absolute coordinates in
100 * display units according to the {@link View} hierarchy. Pointer down/up indicated when
101 * the finger touches the display or when the selection button is pressed/released.
RoboErikca9eef62013-12-16 11:27:55 -0800102 *
Jeff Brownc5ed5912010-07-14 18:48:53 -0700103 * Use {@link #getMotionRange} to query the range of the pointing device. Some devices permit
104 * touches outside the display area so the effective range may be somewhat smaller or larger
105 * than the actual display size.
106 */
107 public static final int SOURCE_CLASS_POINTER = 0x00000002;
RoboErikca9eef62013-12-16 11:27:55 -0800108
Jeff Brownc5ed5912010-07-14 18:48:53 -0700109 /**
110 * The input source is a trackball navigation device.
111 * Examples: {@link #SOURCE_TRACKBALL}.
RoboErikca9eef62013-12-16 11:27:55 -0800112 *
Jeff Brownc5ed5912010-07-14 18:48:53 -0700113 * A {@link MotionEvent} should be interpreted as relative movements in device-specific
114 * units used for navigation purposes. Pointer down/up indicates when the selection button
115 * is pressed/released.
RoboErikca9eef62013-12-16 11:27:55 -0800116 *
Jeff Brownc5ed5912010-07-14 18:48:53 -0700117 * Use {@link #getMotionRange} to query the range of motion.
118 */
119 public static final int SOURCE_CLASS_TRACKBALL = 0x00000004;
RoboErikca9eef62013-12-16 11:27:55 -0800120
Jeff Brownc5ed5912010-07-14 18:48:53 -0700121 /**
122 * The input source is an absolute positioning device not associated with a display
123 * (unlike {@link #SOURCE_CLASS_POINTER}).
RoboErikca9eef62013-12-16 11:27:55 -0800124 *
Jeff Brownc5ed5912010-07-14 18:48:53 -0700125 * A {@link MotionEvent} should be interpreted as absolute coordinates in
126 * device-specific surface units.
RoboErikca9eef62013-12-16 11:27:55 -0800127 *
Jeff Brownc5ed5912010-07-14 18:48:53 -0700128 * Use {@link #getMotionRange} to query the range of positions.
129 */
130 public static final int SOURCE_CLASS_POSITION = 0x00000008;
Jeff Browncb1404e2011-01-15 18:14:15 -0800131
132 /**
133 * The input source is a joystick.
134 *
135 * A {@link MotionEvent} should be interpreted as absolute joystick movements.
136 *
137 * Use {@link #getMotionRange} to query the range of positions.
138 */
139 public static final int SOURCE_CLASS_JOYSTICK = 0x00000010;
140
Jeff Brownc5ed5912010-07-14 18:48:53 -0700141 /**
Jeff Brownc5ed5912010-07-14 18:48:53 -0700142 * The input source is unknown.
143 */
144 public static final int SOURCE_UNKNOWN = 0x00000000;
RoboErikca9eef62013-12-16 11:27:55 -0800145
Jeff Brownc5ed5912010-07-14 18:48:53 -0700146 /**
147 * The input source is a keyboard.
Jeff Brown9df6e7a2012-04-05 11:49:26 -0700148 *
149 * This source indicates pretty much anything that has buttons. Use
150 * {@link #getKeyboardType()} to determine whether the keyboard has alphabetic keys
151 * and can be used to enter text.
152 *
Jeff Brownc5ed5912010-07-14 18:48:53 -0700153 * @see #SOURCE_CLASS_BUTTON
154 */
155 public static final int SOURCE_KEYBOARD = 0x00000100 | SOURCE_CLASS_BUTTON;
RoboErikca9eef62013-12-16 11:27:55 -0800156
Jeff Brownc5ed5912010-07-14 18:48:53 -0700157 /**
158 * The input source is a DPad.
RoboErikca9eef62013-12-16 11:27:55 -0800159 *
Jeff Brownc5ed5912010-07-14 18:48:53 -0700160 * @see #SOURCE_CLASS_BUTTON
161 */
162 public static final int SOURCE_DPAD = 0x00000200 | SOURCE_CLASS_BUTTON;
Jeff Browncb1404e2011-01-15 18:14:15 -0800163
164 /**
165 * The input source is a game pad.
166 * (It may also be a {@link #SOURCE_JOYSTICK}).
167 *
168 * @see #SOURCE_CLASS_BUTTON
169 */
170 public static final int SOURCE_GAMEPAD = 0x00000400 | SOURCE_CLASS_BUTTON;
171
Jeff Brownc5ed5912010-07-14 18:48:53 -0700172 /**
Jeff Brownc5ed5912010-07-14 18:48:53 -0700173 * The input source is a touch screen pointing device.
RoboErikca9eef62013-12-16 11:27:55 -0800174 *
Jeff Brownc5ed5912010-07-14 18:48:53 -0700175 * @see #SOURCE_CLASS_POINTER
176 */
177 public static final int SOURCE_TOUCHSCREEN = 0x00001000 | SOURCE_CLASS_POINTER;
RoboErikca9eef62013-12-16 11:27:55 -0800178
Jeff Brownc5ed5912010-07-14 18:48:53 -0700179 /**
180 * The input source is a mouse pointing device.
181 * This code is also used for other mouse-like pointing devices such as trackpads
182 * and trackpoints.
RoboErikca9eef62013-12-16 11:27:55 -0800183 *
Jeff Brownc5ed5912010-07-14 18:48:53 -0700184 * @see #SOURCE_CLASS_POINTER
185 */
186 public static final int SOURCE_MOUSE = 0x00002000 | SOURCE_CLASS_POINTER;
Jeff Brownfe9f8ab2011-05-06 18:20:01 -0700187
188 /**
189 * The input source is a stylus pointing device.
Jeff Brown00710e92012-04-19 15:18:26 -0700190 * <p>
191 * Note that this bit merely indicates that an input device is capable of obtaining
192 * input from a stylus. To determine whether a given touch event was produced
193 * by a stylus, examine the tool type returned by {@link MotionEvent#getToolType(int)}
194 * for each individual pointer.
195 * </p><p>
196 * A single touch event may multiple pointers with different tool types,
197 * such as an event that has one pointer with tool type
198 * {@link MotionEvent#TOOL_TYPE_FINGER} and another pointer with tool type
199 * {@link MotionEvent#TOOL_TYPE_STYLUS}. So it is important to examine
200 * the tool type of each pointer, regardless of the source reported
201 * by {@link MotionEvent#getSource()}.
202 * </p>
Jeff Brownfe9f8ab2011-05-06 18:20:01 -0700203 *
204 * @see #SOURCE_CLASS_POINTER
205 */
206 public static final int SOURCE_STYLUS = 0x00004000 | SOURCE_CLASS_POINTER;
207
Jeff Brownc5ed5912010-07-14 18:48:53 -0700208 /**
Michael Wrightf18920b2015-06-12 15:24:38 +0100209 * The input device is a Bluetooth stylus.
210 * <p>
211 * Note that this bit merely indicates that an input device is capable of
212 * obtaining input from a Bluetooth stylus. To determine whether a given
213 * touch event was produced by a stylus, examine the tool type returned by
214 * {@link MotionEvent#getToolType(int)} for each individual pointer.
215 * </p><p>
216 * A single touch event may multiple pointers with different tool types,
217 * such as an event that has one pointer with tool type
218 * {@link MotionEvent#TOOL_TYPE_FINGER} and another pointer with tool type
219 * {@link MotionEvent#TOOL_TYPE_STYLUS}. So it is important to examine
220 * the tool type of each pointer, regardless of the source reported
221 * by {@link MotionEvent#getSource()}.
222 * </p><p>
223 * A bluetooth stylus generally receives its pressure and button state
224 * information from the stylus itself, and derives the rest from another
225 * source. For example, a Bluetooth stylus used in conjunction with a
226 * touchscreen would derive its contact position and pointer size from the
227 * touchscreen and may not be any more accurate than other tools such as
228 * fingers.
229 * </p>
230 *
231 * @see #SOURCE_STYLUS
232 * @see #SOURCE_CLASS_POINTER
233 */
234 public static final int SOURCE_BLUETOOTH_STYLUS =
235 0x00008000 | SOURCE_STYLUS;
236
237 /**
Jeff Brownc5ed5912010-07-14 18:48:53 -0700238 * The input source is a trackball.
RoboErikca9eef62013-12-16 11:27:55 -0800239 *
Jeff Brownc5ed5912010-07-14 18:48:53 -0700240 * @see #SOURCE_CLASS_TRACKBALL
241 */
242 public static final int SOURCE_TRACKBALL = 0x00010000 | SOURCE_CLASS_TRACKBALL;
RoboErikca9eef62013-12-16 11:27:55 -0800243
Jeff Brownc5ed5912010-07-14 18:48:53 -0700244 /**
Vladislav Kaznacheev3787de12016-12-21 10:36:35 -0800245 * The input source is a mouse device whose relative motions should be interpreted as
246 * navigation events.
247 *
248 * @see #SOURCE_CLASS_TRACKBALL
249 */
250 public static final int SOURCE_MOUSE_RELATIVE = 0x00020000 | SOURCE_CLASS_TRACKBALL;
251
252 /**
Jeff Brownc5ed5912010-07-14 18:48:53 -0700253 * The input source is a touch pad or digitizer tablet that is not
Jeff Browne33348b2010-07-15 23:54:05 -0700254 * associated with a display (unlike {@link #SOURCE_TOUCHSCREEN}).
RoboErikca9eef62013-12-16 11:27:55 -0800255 *
Jeff Brownc5ed5912010-07-14 18:48:53 -0700256 * @see #SOURCE_CLASS_POSITION
257 */
258 public static final int SOURCE_TOUCHPAD = 0x00100000 | SOURCE_CLASS_POSITION;
Jeff Browncb1404e2011-01-15 18:14:15 -0800259
260 /**
Michael Wrighte7a9ae82013-03-08 15:19:19 -0800261 * The input source is a touch device whose motions should be interpreted as navigation events.
262 *
263 * For example, an upward swipe should be as an upward focus traversal in the same manner as
264 * pressing up on a D-Pad would be. Swipes to the left, right and down should be treated in a
265 * similar manner.
266 *
267 * @see #SOURCE_CLASS_NONE
268 */
269 public static final int SOURCE_TOUCH_NAVIGATION = 0x00200000 | SOURCE_CLASS_NONE;
270
271 /**
Prashant Malani67322b12015-08-25 17:41:34 -0700272 * The input source is a rotating encoder device whose motions should be interpreted as akin to
273 * those of a scroll wheel.
274 *
275 * @see #SOURCE_CLASS_NONE
Prashant Malani67322b12015-08-25 17:41:34 -0700276 */
277 public static final int SOURCE_ROTARY_ENCODER = 0x00400000 | SOURCE_CLASS_NONE;
278
279 /**
Jeff Browncb1404e2011-01-15 18:14:15 -0800280 * The input source is a joystick.
281 * (It may also be a {@link #SOURCE_GAMEPAD}).
282 *
283 * @see #SOURCE_CLASS_JOYSTICK
284 */
285 public static final int SOURCE_JOYSTICK = 0x01000000 | SOURCE_CLASS_JOYSTICK;
286
Jeff Brown6d0fec22010-07-23 21:28:06 -0700287 /**
Jinsuk Kim96658f72014-05-14 15:33:43 +0900288 * The input source is a device connected through HDMI-based bus.
289 *
290 * The key comes in through HDMI-CEC or MHL signal line, and is treated as if it were
291 * generated by a locally connected DPAD or keyboard.
292 */
293 public static final int SOURCE_HDMI = 0x02000000 | SOURCE_CLASS_BUTTON;
294
295 /**
Jeff Brown6d0fec22010-07-23 21:28:06 -0700296 * A special input source constant that is used when filtering input devices
297 * to match devices that provide any type of input source.
298 */
299 public static final int SOURCE_ANY = 0xffffff00;
Jeff Brownc5ed5912010-07-14 18:48:53 -0700300
Jeff Browne33348b2010-07-15 23:54:05 -0700301 /**
Jeff Brown91c69ab2011-02-14 17:03:18 -0800302 * Constant for retrieving the range of values for {@link MotionEvent#AXIS_X}.
RoboErikca9eef62013-12-16 11:27:55 -0800303 *
Jeff Browne33348b2010-07-15 23:54:05 -0700304 * @see #getMotionRange
Jeff Brown91c69ab2011-02-14 17:03:18 -0800305 * @deprecated Use {@link MotionEvent#AXIS_X} instead.
Jeff Browne33348b2010-07-15 23:54:05 -0700306 */
Jeff Brown91c69ab2011-02-14 17:03:18 -0800307 @Deprecated
308 public static final int MOTION_RANGE_X = MotionEvent.AXIS_X;
309
Jeff Browne33348b2010-07-15 23:54:05 -0700310 /**
Jeff Brown91c69ab2011-02-14 17:03:18 -0800311 * Constant for retrieving the range of values for {@link MotionEvent#AXIS_Y}.
RoboErikca9eef62013-12-16 11:27:55 -0800312 *
Jeff Browne33348b2010-07-15 23:54:05 -0700313 * @see #getMotionRange
Jeff Brown91c69ab2011-02-14 17:03:18 -0800314 * @deprecated Use {@link MotionEvent#AXIS_Y} instead.
Jeff Browne33348b2010-07-15 23:54:05 -0700315 */
Jeff Brown91c69ab2011-02-14 17:03:18 -0800316 @Deprecated
317 public static final int MOTION_RANGE_Y = MotionEvent.AXIS_Y;
318
Jeff Browne33348b2010-07-15 23:54:05 -0700319 /**
Jeff Brown91c69ab2011-02-14 17:03:18 -0800320 * Constant for retrieving the range of values for {@link MotionEvent#AXIS_PRESSURE}.
RoboErikca9eef62013-12-16 11:27:55 -0800321 *
Jeff Browne33348b2010-07-15 23:54:05 -0700322 * @see #getMotionRange
Jeff Brown91c69ab2011-02-14 17:03:18 -0800323 * @deprecated Use {@link MotionEvent#AXIS_PRESSURE} instead.
Jeff Browne33348b2010-07-15 23:54:05 -0700324 */
Jeff Brown91c69ab2011-02-14 17:03:18 -0800325 @Deprecated
326 public static final int MOTION_RANGE_PRESSURE = MotionEvent.AXIS_PRESSURE;
327
Jeff Browne33348b2010-07-15 23:54:05 -0700328 /**
Jeff Brown91c69ab2011-02-14 17:03:18 -0800329 * Constant for retrieving the range of values for {@link MotionEvent#AXIS_SIZE}.
RoboErikca9eef62013-12-16 11:27:55 -0800330 *
Jeff Browne33348b2010-07-15 23:54:05 -0700331 * @see #getMotionRange
Jeff Brown91c69ab2011-02-14 17:03:18 -0800332 * @deprecated Use {@link MotionEvent#AXIS_SIZE} instead.
Jeff Browne33348b2010-07-15 23:54:05 -0700333 */
Jeff Brown91c69ab2011-02-14 17:03:18 -0800334 @Deprecated
335 public static final int MOTION_RANGE_SIZE = MotionEvent.AXIS_SIZE;
336
Jeff Browne33348b2010-07-15 23:54:05 -0700337 /**
Jeff Brown91c69ab2011-02-14 17:03:18 -0800338 * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOUCH_MAJOR}.
RoboErikca9eef62013-12-16 11:27:55 -0800339 *
Jeff Browne33348b2010-07-15 23:54:05 -0700340 * @see #getMotionRange
Jeff Brown91c69ab2011-02-14 17:03:18 -0800341 * @deprecated Use {@link MotionEvent#AXIS_TOUCH_MAJOR} instead.
Jeff Browne33348b2010-07-15 23:54:05 -0700342 */
Jeff Brown91c69ab2011-02-14 17:03:18 -0800343 @Deprecated
344 public static final int MOTION_RANGE_TOUCH_MAJOR = MotionEvent.AXIS_TOUCH_MAJOR;
345
Jeff Browne33348b2010-07-15 23:54:05 -0700346 /**
Jeff Brown91c69ab2011-02-14 17:03:18 -0800347 * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOUCH_MINOR}.
RoboErikca9eef62013-12-16 11:27:55 -0800348 *
Jeff Browne33348b2010-07-15 23:54:05 -0700349 * @see #getMotionRange
Jeff Brown91c69ab2011-02-14 17:03:18 -0800350 * @deprecated Use {@link MotionEvent#AXIS_TOUCH_MINOR} instead.
Jeff Browne33348b2010-07-15 23:54:05 -0700351 */
Jeff Brown91c69ab2011-02-14 17:03:18 -0800352 @Deprecated
353 public static final int MOTION_RANGE_TOUCH_MINOR = MotionEvent.AXIS_TOUCH_MINOR;
354
Jeff Browne33348b2010-07-15 23:54:05 -0700355 /**
Jeff Brown91c69ab2011-02-14 17:03:18 -0800356 * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOOL_MAJOR}.
RoboErikca9eef62013-12-16 11:27:55 -0800357 *
Jeff Browne33348b2010-07-15 23:54:05 -0700358 * @see #getMotionRange
Jeff Brown91c69ab2011-02-14 17:03:18 -0800359 * @deprecated Use {@link MotionEvent#AXIS_TOOL_MAJOR} instead.
Jeff Browne33348b2010-07-15 23:54:05 -0700360 */
Jeff Brown91c69ab2011-02-14 17:03:18 -0800361 @Deprecated
362 public static final int MOTION_RANGE_TOOL_MAJOR = MotionEvent.AXIS_TOOL_MAJOR;
363
Jeff Browne33348b2010-07-15 23:54:05 -0700364 /**
Jeff Brown91c69ab2011-02-14 17:03:18 -0800365 * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOOL_MINOR}.
RoboErikca9eef62013-12-16 11:27:55 -0800366 *
Jeff Browne33348b2010-07-15 23:54:05 -0700367 * @see #getMotionRange
Jeff Brown91c69ab2011-02-14 17:03:18 -0800368 * @deprecated Use {@link MotionEvent#AXIS_TOOL_MINOR} instead.
Jeff Browne33348b2010-07-15 23:54:05 -0700369 */
Jeff Brown91c69ab2011-02-14 17:03:18 -0800370 @Deprecated
371 public static final int MOTION_RANGE_TOOL_MINOR = MotionEvent.AXIS_TOOL_MINOR;
372
Jeff Browne33348b2010-07-15 23:54:05 -0700373 /**
Jeff Brown91c69ab2011-02-14 17:03:18 -0800374 * Constant for retrieving the range of values for {@link MotionEvent#AXIS_ORIENTATION}.
RoboErikca9eef62013-12-16 11:27:55 -0800375 *
Jeff Browne33348b2010-07-15 23:54:05 -0700376 * @see #getMotionRange
Jeff Brown91c69ab2011-02-14 17:03:18 -0800377 * @deprecated Use {@link MotionEvent#AXIS_ORIENTATION} instead.
Jeff Browne33348b2010-07-15 23:54:05 -0700378 */
Jeff Brown91c69ab2011-02-14 17:03:18 -0800379 @Deprecated
380 public static final int MOTION_RANGE_ORIENTATION = MotionEvent.AXIS_ORIENTATION;
RoboErikca9eef62013-12-16 11:27:55 -0800381
Jeff Brown6d0fec22010-07-23 21:28:06 -0700382 /**
383 * There is no keyboard.
384 */
385 public static final int KEYBOARD_TYPE_NONE = 0;
RoboErikca9eef62013-12-16 11:27:55 -0800386
Jeff Brown6d0fec22010-07-23 21:28:06 -0700387 /**
388 * The keyboard is not fully alphabetic. It may be a numeric keypad or an assortment
389 * of buttons that are not mapped as alphabetic keys suitable for text input.
390 */
391 public static final int KEYBOARD_TYPE_NON_ALPHABETIC = 1;
RoboErikca9eef62013-12-16 11:27:55 -0800392
Jeff Brown6d0fec22010-07-23 21:28:06 -0700393 /**
394 * The keyboard supports a complement of alphabetic keys.
395 */
396 public static final int KEYBOARD_TYPE_ALPHABETIC = 2;
Jeff Brown91c69ab2011-02-14 17:03:18 -0800397
Kristian Monsen1f9dc882016-03-25 16:42:15 -0700398 private static final int MAX_RANGES = 1000;
399
Jeff Brown9f25b7f2012-04-10 14:30:49 -0700400 public static final Parcelable.Creator<InputDevice> CREATOR =
401 new Parcelable.Creator<InputDevice>() {
402 public InputDevice createFromParcel(Parcel in) {
403 return new InputDevice(in);
404 }
405 public InputDevice[] newArray(int size) {
406 return new InputDevice[size];
407 }
408 };
409
Jeff Brown8d608662010-08-30 03:02:23 -0700410 // Called by native code.
Mathew Inwooda570dee2018-08-17 14:56:00 +0100411 @UnsupportedAppUsage
Michael Wright54e56942013-08-12 16:39:59 -0700412 private InputDevice(int id, int generation, int controllerNumber, String name, int vendorId,
Tim Kilbourn6d85cf22015-04-08 10:23:35 -0700413 int productId, String descriptor, boolean isExternal, int sources, int keyboardType,
Tim Kilbourn72285e52015-06-05 15:52:05 -0700414 KeyCharacterMap keyCharacterMap, boolean hasVibrator, boolean hasMicrophone,
Tim Kilbourn415b4502015-03-19 16:02:02 -0700415 boolean hasButtonUnderPad) {
Jeff Brown9f25b7f2012-04-10 14:30:49 -0700416 mId = id;
Jeff Brownaf9e8d32012-04-12 17:32:48 -0700417 mGeneration = generation;
Michael Wrightac6c78b2013-07-17 13:21:45 -0700418 mControllerNumber = controllerNumber;
Jeff Brown9f25b7f2012-04-10 14:30:49 -0700419 mName = name;
Michael Wright54e56942013-08-12 16:39:59 -0700420 mVendorId = vendorId;
421 mProductId = productId;
Jeff Brown9f25b7f2012-04-10 14:30:49 -0700422 mDescriptor = descriptor;
Jeff Browndaa37532012-05-01 15:54:03 -0700423 mIsExternal = isExternal;
Jeff Brown9f25b7f2012-04-10 14:30:49 -0700424 mSources = sources;
425 mKeyboardType = keyboardType;
426 mKeyCharacterMap = keyCharacterMap;
Jeff Browna47425a2012-04-13 04:09:27 -0700427 mHasVibrator = hasVibrator;
Tim Kilbourn72285e52015-06-05 15:52:05 -0700428 mHasMicrophone = hasMicrophone;
Michael Wright7ddd1102013-05-20 15:04:55 -0700429 mHasButtonUnderPad = hasButtonUnderPad;
RoboErikca9eef62013-12-16 11:27:55 -0800430 mIdentifier = new InputDeviceIdentifier(descriptor, vendorId, productId);
Jeff Brown9f25b7f2012-04-10 14:30:49 -0700431 }
432
433 private InputDevice(Parcel in) {
434 mId = in.readInt();
Jeff Brownaf9e8d32012-04-12 17:32:48 -0700435 mGeneration = in.readInt();
Michael Wrightac6c78b2013-07-17 13:21:45 -0700436 mControllerNumber = in.readInt();
Jeff Brown9f25b7f2012-04-10 14:30:49 -0700437 mName = in.readString();
Michael Wright54e56942013-08-12 16:39:59 -0700438 mVendorId = in.readInt();
439 mProductId = in.readInt();
Jeff Brown9f25b7f2012-04-10 14:30:49 -0700440 mDescriptor = in.readString();
Jeff Browndaa37532012-05-01 15:54:03 -0700441 mIsExternal = in.readInt() != 0;
Jeff Brown9f25b7f2012-04-10 14:30:49 -0700442 mSources = in.readInt();
443 mKeyboardType = in.readInt();
444 mKeyCharacterMap = KeyCharacterMap.CREATOR.createFromParcel(in);
Jeff Browna47425a2012-04-13 04:09:27 -0700445 mHasVibrator = in.readInt() != 0;
Tim Kilbourn72285e52015-06-05 15:52:05 -0700446 mHasMicrophone = in.readInt() != 0;
Michael Wright7ddd1102013-05-20 15:04:55 -0700447 mHasButtonUnderPad = in.readInt() != 0;
RoboErikca9eef62013-12-16 11:27:55 -0800448 mIdentifier = new InputDeviceIdentifier(mDescriptor, mVendorId, mProductId);
Jeff Brown9f25b7f2012-04-10 14:30:49 -0700449
Kristian Monsen1f9dc882016-03-25 16:42:15 -0700450 int numRanges = in.readInt();
451 if (numRanges > MAX_RANGES) {
452 numRanges = MAX_RANGES;
453 }
454
455 for (int i = 0; i < numRanges; i++) {
456 addMotionRange(in.readInt(), in.readInt(), in.readFloat(), in.readFloat(),
457 in.readFloat(), in.readFloat(), in.readFloat());
Jeff Brown9f25b7f2012-04-10 14:30:49 -0700458 }
Jeff Brown8d608662010-08-30 03:02:23 -0700459 }
Jeff Browne33348b2010-07-15 23:54:05 -0700460
461 /**
462 * Gets information about the input device with the specified id.
463 * @param id The device id.
464 * @return The input device or null if not found.
465 */
Jeff Brownc5ed5912010-07-14 18:48:53 -0700466 public static InputDevice getDevice(int id) {
Jeff Brown9f25b7f2012-04-10 14:30:49 -0700467 return InputManager.getInstance().getInputDevice(id);
Jeff Brown8d608662010-08-30 03:02:23 -0700468 }
RoboErikca9eef62013-12-16 11:27:55 -0800469
Jeff Brown8d608662010-08-30 03:02:23 -0700470 /**
471 * Gets the ids of all input devices in the system.
472 * @return The input device ids.
473 */
474 public static int[] getDeviceIds() {
Jeff Brown9f25b7f2012-04-10 14:30:49 -0700475 return InputManager.getInstance().getInputDeviceIds();
Jeff Brown8d608662010-08-30 03:02:23 -0700476 }
Jeff Brown9df6e7a2012-04-05 11:49:26 -0700477
Jeff Brown8d608662010-08-30 03:02:23 -0700478 /**
479 * Gets the input device id.
Jeff Brown9df6e7a2012-04-05 11:49:26 -0700480 * <p>
481 * Each input device receives a unique id when it is first configured
482 * by the system. The input device id may change when the system is restarted or if the
483 * input device is disconnected, reconnected or reconfigured at any time.
484 * If you require a stable identifier for a device that persists across
485 * boots and reconfigurations, use {@link #getDescriptor()}.
486 * </p>
487 *
Jeff Brown8d608662010-08-30 03:02:23 -0700488 * @return The input device id.
489 */
490 public int getId() {
491 return mId;
Jeff Brownc5ed5912010-07-14 18:48:53 -0700492 }
Jeff Brown9df6e7a2012-04-05 11:49:26 -0700493
494 /**
Michael Wrightac6c78b2013-07-17 13:21:45 -0700495 * The controller number for a given input device.
496 * <p>
Michael Wright10fac452013-09-03 12:37:12 -0700497 * Each gamepad or joystick is given a unique, positive controller number when initially
498 * configured by the system. This number may change due to events such as device disconnects /
499 * reconnects or user initiated reassignment. Any change in number will trigger an event that
500 * can be observed by registering an {@link InputManager.InputDeviceListener}.
501 * </p>
502 * <p>
503 * All input devices which are not gamepads or joysticks will be assigned a controller number
Michael Wrightac6c78b2013-07-17 13:21:45 -0700504 * of 0.
505 * </p>
Michael Wright10fac452013-09-03 12:37:12 -0700506 *
507 * @return The controller number of the device.
Michael Wrightac6c78b2013-07-17 13:21:45 -0700508 */
509 public int getControllerNumber() {
510 return mControllerNumber;
511 }
512
513 /**
RoboErikca9eef62013-12-16 11:27:55 -0800514 * The set of identifying information for type of input device. This
515 * information can be used by the system to configure appropriate settings
516 * for the device.
517 *
518 * @return The identifier object for this device
519 * @hide
520 */
521 public InputDeviceIdentifier getIdentifier() {
522 return mIdentifier;
523 }
524
525 /**
Jeff Brownaf9e8d32012-04-12 17:32:48 -0700526 * Gets a generation number for this input device.
527 * The generation number is incremented whenever the device is reconfigured and its
528 * properties may have changed.
529 *
530 * @return The generation number.
531 *
532 * @hide
533 */
534 public int getGeneration() {
535 return mGeneration;
536 }
537
538 /**
Michael Wright54e56942013-08-12 16:39:59 -0700539 * Gets the vendor id for the given device, if available.
540 * <p>
541 * A vendor id uniquely identifies the company who manufactured the device. A value of 0 will
542 * be assigned where a vendor id is not available.
543 * </p>
544 *
545 * @return The vendor id of a given device
546 */
547 public int getVendorId() {
548 return mVendorId;
549 }
550
551 /**
552 * Gets the product id for the given device, if available.
553 * <p>
554 * A product id uniquely identifies which product within the address space of a given vendor,
555 * identified by the device's vendor id. A value of 0 will be assigned where a product id is
556 * not available.
557 * </p>
558 *
559 * @return The product id of a given device
560 */
561 public int getProductId() {
562 return mProductId;
563 }
564
565 /**
Jeff Brown9df6e7a2012-04-05 11:49:26 -0700566 * Gets the input device descriptor, which is a stable identifier for an input device.
567 * <p>
568 * An input device descriptor uniquely identifies an input device. Its value
569 * is intended to be persistent across system restarts, and should not change even
570 * if the input device is disconnected, reconnected or reconfigured at any time.
Jeff Browne38fdfa2012-04-06 14:51:01 -0700571 * </p><p>
572 * It is possible for there to be multiple {@link InputDevice} instances that have the
573 * same input device descriptor. This might happen in situations where a single
574 * human input device registers multiple {@link InputDevice} instances (HID collections)
575 * that describe separate features of the device, such as a keyboard that also
576 * has a trackpad. Alternately, it may be that the input devices are simply
577 * indistinguishable, such as two keyboards made by the same manufacturer.
578 * </p><p>
Jeff Browndaa37532012-05-01 15:54:03 -0700579 * The input device descriptor returned by {@link #getDescriptor} should only be
Jeff Browne38fdfa2012-04-06 14:51:01 -0700580 * used when an application needs to remember settings associated with a particular
581 * input device. For all other purposes when referring to a logical
582 * {@link InputDevice} instance at runtime use the id returned by {@link #getId()}.
Jeff Brown9df6e7a2012-04-05 11:49:26 -0700583 * </p>
584 *
585 * @return The input device descriptor.
586 */
587 public String getDescriptor() {
Jeff Browne38fdfa2012-04-06 14:51:01 -0700588 return mDescriptor;
Jeff Brown9df6e7a2012-04-05 11:49:26 -0700589 }
590
Jeff Brownc5ed5912010-07-14 18:48:53 -0700591 /**
Jeff Brown9f25b7f2012-04-10 14:30:49 -0700592 * Returns true if the device is a virtual input device rather than a real one,
593 * such as the virtual keyboard (see {@link KeyCharacterMap#VIRTUAL_KEYBOARD}).
594 * <p>
595 * Virtual input devices are provided to implement system-level functionality
596 * and should not be seen or configured by users.
597 * </p>
598 *
599 * @return True if the device is virtual.
600 *
601 * @see KeyCharacterMap#VIRTUAL_KEYBOARD
602 */
603 public boolean isVirtual() {
604 return mId < 0;
605 }
606
607 /**
Jeff Browndaa37532012-05-01 15:54:03 -0700608 * Returns true if the device is external (connected to USB or Bluetooth or some other
609 * peripheral bus), otherwise it is built-in.
610 *
611 * @return True if the device is external.
Jeff Browndaa37532012-05-01 15:54:03 -0700612 */
613 public boolean isExternal() {
614 return mIsExternal;
615 }
616
617 /**
Jeff Brown7e4ff4b2012-05-30 14:32:16 -0700618 * Returns true if the device is a full keyboard.
619 *
620 * @return True if the device is a full keyboard.
621 *
622 * @hide
623 */
624 public boolean isFullKeyboard() {
625 return (mSources & SOURCE_KEYBOARD) == SOURCE_KEYBOARD
626 && mKeyboardType == KEYBOARD_TYPE_ALPHABETIC;
627 }
628
629 /**
Jeff Brownc5ed5912010-07-14 18:48:53 -0700630 * Gets the name of this input device.
631 * @return The input device name.
632 */
633 public String getName() {
634 return mName;
635 }
RoboErikca9eef62013-12-16 11:27:55 -0800636
Jeff Brownc5ed5912010-07-14 18:48:53 -0700637 /**
638 * Gets the input sources supported by this input device as a combined bitfield.
639 * @return The supported input sources.
640 */
641 public int getSources() {
642 return mSources;
643 }
RoboErikca9eef62013-12-16 11:27:55 -0800644
Jeff Brownc5ed5912010-07-14 18:48:53 -0700645 /**
Michael Wrightd08c8642014-03-28 12:59:34 -0700646 * Determines whether the input device supports the given source or sources.
647 *
648 * @param source The input source or sources to check against. This can be a generic device
649 * type such as {@link InputDevice#SOURCE_MOUSE}, a more generic device class, such as
650 * {@link InputDevice#SOURCE_CLASS_POINTER}, or a combination of sources bitwise ORed together.
651 * @return Whether the device can produce all of the given sources.
652 */
653 public boolean supportsSource(int source) {
654 return (mSources & source) == source;
655 }
656
657 /**
Jeff Brown6d0fec22010-07-23 21:28:06 -0700658 * Gets the keyboard type.
659 * @return The keyboard type.
660 */
661 public int getKeyboardType() {
662 return mKeyboardType;
663 }
RoboErikca9eef62013-12-16 11:27:55 -0800664
Jeff Brown6d0fec22010-07-23 21:28:06 -0700665 /**
Jeff Brownc5ed5912010-07-14 18:48:53 -0700666 * Gets the key character map associated with this input device.
667 * @return The key character map.
668 */
669 public KeyCharacterMap getKeyCharacterMap() {
Jeff Brown9f25b7f2012-04-10 14:30:49 -0700670 return mKeyCharacterMap;
Jeff Brown1e08fe92011-11-15 17:48:10 -0800671 }
672
Jeff Browne33348b2010-07-15 23:54:05 -0700673 /**
Michael Wrightb7b2d4b2013-08-19 15:55:38 -0700674 * Gets whether the device is capable of producing the list of keycodes.
675 * @param keys The list of android keycodes to check for.
676 * @return An array of booleans where each member specifies whether the device is capable of
677 * generating the keycode given by the corresponding value at the same index in the keys array.
678 */
679 public boolean[] hasKeys(int... keys) {
680 return InputManager.getInstance().deviceHasKeys(mId, keys);
681 }
682
683 /**
Jeff Brown91c69ab2011-02-14 17:03:18 -0800684 * Gets information about the range of values for a particular {@link MotionEvent} axis.
Jeff Brownefd32662011-03-08 15:13:06 -0800685 * If the device supports multiple sources, the same axis may have different meanings
686 * for each source. Returns information about the first axis found for any source.
687 * To obtain information about the axis for a specific source, use
688 * {@link #getMotionRange(int, int)}.
689 *
Jeff Brown91c69ab2011-02-14 17:03:18 -0800690 * @param axis The axis constant.
691 * @return The range of values, or null if the requested axis is not
Jeff Browne33348b2010-07-15 23:54:05 -0700692 * supported by the device.
Jeff Brown91c69ab2011-02-14 17:03:18 -0800693 *
694 * @see MotionEvent#AXIS_X
695 * @see MotionEvent#AXIS_Y
Jeff Browne33348b2010-07-15 23:54:05 -0700696 */
Jeff Brown91c69ab2011-02-14 17:03:18 -0800697 public MotionRange getMotionRange(int axis) {
Jeff Brownefd32662011-03-08 15:13:06 -0800698 final int numRanges = mMotionRanges.size();
699 for (int i = 0; i < numRanges; i++) {
700 final MotionRange range = mMotionRanges.get(i);
701 if (range.mAxis == axis) {
702 return range;
703 }
704 }
705 return null;
Jeff Brownc5ed5912010-07-14 18:48:53 -0700706 }
Jeff Brown91c69ab2011-02-14 17:03:18 -0800707
Jeff Brown6f2fba42011-02-19 01:08:02 -0800708 /**
Jeff Brownefd32662011-03-08 15:13:06 -0800709 * Gets information about the range of values for a particular {@link MotionEvent} axis
710 * used by a particular source on the device.
711 * If the device supports multiple sources, the same axis may have different meanings
712 * for each source.
Jeff Brown6f2fba42011-02-19 01:08:02 -0800713 *
Jeff Brownefd32662011-03-08 15:13:06 -0800714 * @param axis The axis constant.
715 * @param source The source for which to return information.
716 * @return The range of values, or null if the requested axis is not
717 * supported by the device.
718 *
719 * @see MotionEvent#AXIS_X
720 * @see MotionEvent#AXIS_Y
Jeff Brown6f2fba42011-02-19 01:08:02 -0800721 */
Jeff Brownefd32662011-03-08 15:13:06 -0800722 public MotionRange getMotionRange(int axis, int source) {
723 final int numRanges = mMotionRanges.size();
724 for (int i = 0; i < numRanges; i++) {
725 final MotionRange range = mMotionRanges.get(i);
726 if (range.mAxis == axis && range.mSource == source) {
727 return range;
Jeff Brown6f2fba42011-02-19 01:08:02 -0800728 }
Jeff Brown6f2fba42011-02-19 01:08:02 -0800729 }
Jeff Brownefd32662011-03-08 15:13:06 -0800730 return null;
Jeff Brown6f2fba42011-02-19 01:08:02 -0800731 }
732
Jeff Brownefd32662011-03-08 15:13:06 -0800733 /**
734 * Gets the ranges for all axes supported by the device.
735 * @return The motion ranges for the device.
736 *
737 * @see #getMotionRange(int, int)
738 */
739 public List<MotionRange> getMotionRanges() {
740 return mMotionRanges;
741 }
742
Jeff Brown9f25b7f2012-04-10 14:30:49 -0700743 // Called from native code.
Mathew Inwooda570dee2018-08-17 14:56:00 +0100744 @UnsupportedAppUsage
Jeff Brownefd32662011-03-08 15:13:06 -0800745 private void addMotionRange(int axis, int source,
Michael Wrightc6091c62013-04-01 20:56:04 -0700746 float min, float max, float flat, float fuzz, float resolution) {
747 mMotionRanges.add(new MotionRange(axis, source, min, max, flat, fuzz, resolution));
Jeff Brownc5ed5912010-07-14 18:48:53 -0700748 }
Jeff Brown91c69ab2011-02-14 17:03:18 -0800749
Jeff Browne33348b2010-07-15 23:54:05 -0700750 /**
Jeff Browna47425a2012-04-13 04:09:27 -0700751 * Gets the vibrator service associated with the device, if there is one.
752 * Even if the device does not have a vibrator, the result is never null.
753 * Use {@link Vibrator#hasVibrator} to determine whether a vibrator is
754 * present.
755 *
756 * Note that the vibrator associated with the device may be different from
757 * the system vibrator. To obtain an instance of the system vibrator instead, call
758 * {@link Context#getSystemService} with {@link Context#VIBRATOR_SERVICE} as argument.
759 *
760 * @return The vibrator service associated with the device, never null.
761 */
762 public Vibrator getVibrator() {
763 synchronized (mMotionRanges) {
764 if (mVibrator == null) {
765 if (mHasVibrator) {
766 mVibrator = InputManager.getInstance().getInputDeviceVibrator(mId);
767 } else {
768 mVibrator = NullVibrator.getInstance();
769 }
770 }
771 return mVibrator;
772 }
773 }
774
775 /**
Siarhei Vishniakoua7f99b52017-03-21 17:39:40 -0700776 * Returns true if input device is enabled.
777 * @return Whether the input device is enabled.
778 */
779 public boolean isEnabled() {
780 return InputManager.getInstance().isInputDeviceEnabled(mId);
781 }
782
783 /**
784 * Enables the input device.
785 *
786 * @hide
787 */
788 @RequiresPermission(android.Manifest.permission.DISABLE_INPUT_DEVICE)
789 @TestApi
790 public void enable() {
791 InputManager.getInstance().enableInputDevice(mId);
792 }
793
794 /**
795 * Disables the input device.
796 *
797 * @hide
798 */
799 @RequiresPermission(android.Manifest.permission.DISABLE_INPUT_DEVICE)
800 @TestApi
801 public void disable() {
802 InputManager.getInstance().disableInputDevice(mId);
803 }
804
805 /**
Tim Kilbourn6d85cf22015-04-08 10:23:35 -0700806 * Reports whether the device has a built-in microphone.
807 * @return Whether the device has a built-in microphone.
808 */
Tim Kilbourn72285e52015-06-05 15:52:05 -0700809 public boolean hasMicrophone() {
810 return mHasMicrophone;
Tim Kilbourn6d85cf22015-04-08 10:23:35 -0700811 }
812
813 /**
Michael Wright7ddd1102013-05-20 15:04:55 -0700814 * Reports whether the device has a button under its touchpad
815 * @return Whether the device has a button under its touchpad
816 * @hide
817 */
818 public boolean hasButtonUnderPad() {
819 return mHasButtonUnderPad;
820 }
821
822 /**
Michael Wrighte051f6f2016-05-13 17:44:16 +0100823 * Sets the current pointer type.
824 * @param pointerType the type of the pointer icon.
Jun Mukai1db53972015-09-11 18:08:31 -0700825 * @hide
826 */
Michael Wrighte051f6f2016-05-13 17:44:16 +0100827 public void setPointerType(int pointerType) {
828 InputManager.getInstance().setPointerIconType(pointerType);
Jun Mukai1db53972015-09-11 18:08:31 -0700829 }
830
831 /**
Jun Mukaid4eaef72015-10-30 15:54:33 -0700832 * Specifies the current custom pointer.
833 * @param icon the icon data.
834 * @hide
835 */
836 public void setCustomPointerIcon(PointerIcon icon) {
837 InputManager.getInstance().setCustomPointerIcon(icon);
838 }
839
840 /**
Jeff Brown91c69ab2011-02-14 17:03:18 -0800841 * Provides information about the range of values for a particular {@link MotionEvent} axis.
842 *
843 * @see InputDevice#getMotionRange(int)
Jeff Browne33348b2010-07-15 23:54:05 -0700844 */
Jeff Brownc5ed5912010-07-14 18:48:53 -0700845 public static final class MotionRange {
Jeff Brownefd32662011-03-08 15:13:06 -0800846 private int mAxis;
847 private int mSource;
Jeff Brown8d608662010-08-30 03:02:23 -0700848 private float mMin;
849 private float mMax;
850 private float mFlat;
851 private float mFuzz;
Michael Wrightc6091c62013-04-01 20:56:04 -0700852 private float mResolution;
Jeff Brown91c69ab2011-02-14 17:03:18 -0800853
Michael Wrightc6091c62013-04-01 20:56:04 -0700854 private MotionRange(int axis, int source, float min, float max, float flat, float fuzz,
855 float resolution) {
Jeff Brownefd32662011-03-08 15:13:06 -0800856 mAxis = axis;
857 mSource = source;
Jeff Brown8d608662010-08-30 03:02:23 -0700858 mMin = min;
859 mMax = max;
860 mFlat = flat;
861 mFuzz = fuzz;
Michael Wrightc6091c62013-04-01 20:56:04 -0700862 mResolution = resolution;
Jeff Brown8d608662010-08-30 03:02:23 -0700863 }
Jeff Brown91c69ab2011-02-14 17:03:18 -0800864
Jeff Browne33348b2010-07-15 23:54:05 -0700865 /**
Jeff Brownefd32662011-03-08 15:13:06 -0800866 * Gets the axis id.
867 * @return The axis id.
868 */
869 public int getAxis() {
870 return mAxis;
871 }
872
873 /**
874 * Gets the source for which the axis is defined.
875 * @return The source.
876 */
877 public int getSource() {
878 return mSource;
879 }
880
Michael Wright74e41562013-03-08 14:58:14 -0800881
882 /**
883 * Determines whether the event is from the given source.
884 *
885 * @param source The input source to check against. This can be a specific device type,
886 * such as {@link InputDevice#SOURCE_TOUCH_NAVIGATION}, or a more generic device class,
887 * such as {@link InputDevice#SOURCE_CLASS_POINTER}.
888 * @return Whether the event is from the given source.
889 */
890 public boolean isFromSource(int source) {
891 return (getSource() & source) == source;
892 }
893
Jeff Brownefd32662011-03-08 15:13:06 -0800894 /**
Jeff Brown6f2fba42011-02-19 01:08:02 -0800895 * Gets the inclusive minimum value for the axis.
896 * @return The inclusive minimum value.
Jeff Browne33348b2010-07-15 23:54:05 -0700897 */
898 public float getMin() {
Jeff Brown8d608662010-08-30 03:02:23 -0700899 return mMin;
Jeff Browne33348b2010-07-15 23:54:05 -0700900 }
Jeff Brown91c69ab2011-02-14 17:03:18 -0800901
Jeff Browne33348b2010-07-15 23:54:05 -0700902 /**
Jeff Brown6f2fba42011-02-19 01:08:02 -0800903 * Gets the inclusive maximum value for the axis.
904 * @return The inclusive maximum value.
Jeff Browne33348b2010-07-15 23:54:05 -0700905 */
906 public float getMax() {
Jeff Brown8d608662010-08-30 03:02:23 -0700907 return mMax;
Jeff Browne33348b2010-07-15 23:54:05 -0700908 }
Jeff Brown91c69ab2011-02-14 17:03:18 -0800909
Jeff Browne33348b2010-07-15 23:54:05 -0700910 /**
Jeff Brown6f2fba42011-02-19 01:08:02 -0800911 * Gets the range of the axis (difference between maximum and minimum).
Jeff Browne33348b2010-07-15 23:54:05 -0700912 * @return The range of values.
913 */
914 public float getRange() {
Jeff Brown6f2fba42011-02-19 01:08:02 -0800915 return mMax - mMin;
Jeff Browne33348b2010-07-15 23:54:05 -0700916 }
Jeff Brown91c69ab2011-02-14 17:03:18 -0800917
Jeff Browne33348b2010-07-15 23:54:05 -0700918 /**
Jeff Brown91c69ab2011-02-14 17:03:18 -0800919 * Gets the extent of the center flat position with respect to this axis.
Jeff Brown6f2fba42011-02-19 01:08:02 -0800920 * <p>
Jeff Browne33348b2010-07-15 23:54:05 -0700921 * For example, a flat value of 8 means that the center position is between -8 and +8.
Jeff Browndc1ab4b2010-09-14 18:03:38 -0700922 * This value is mainly useful for calibrating self-centering devices.
Jeff Brown6f2fba42011-02-19 01:08:02 -0800923 * </p>
Jeff Browne33348b2010-07-15 23:54:05 -0700924 * @return The extent of the center flat position.
925 */
926 public float getFlat() {
Jeff Brown8d608662010-08-30 03:02:23 -0700927 return mFlat;
Jeff Browne33348b2010-07-15 23:54:05 -0700928 }
Jeff Brown91c69ab2011-02-14 17:03:18 -0800929
Jeff Browne33348b2010-07-15 23:54:05 -0700930 /**
Jeff Brown91c69ab2011-02-14 17:03:18 -0800931 * Gets the error tolerance for input device measurements with respect to this axis.
Jeff Brown6f2fba42011-02-19 01:08:02 -0800932 * <p>
Jeff Browne33348b2010-07-15 23:54:05 -0700933 * For example, a value of 2 indicates that the measured value may be up to +/- 2 units
934 * away from the actual value due to noise and device sensitivity limitations.
Jeff Brown6f2fba42011-02-19 01:08:02 -0800935 * </p>
Jeff Browne33348b2010-07-15 23:54:05 -0700936 * @return The error tolerance.
937 */
938 public float getFuzz() {
Jeff Brown8d608662010-08-30 03:02:23 -0700939 return mFuzz;
940 }
Michael Wrightc6091c62013-04-01 20:56:04 -0700941
942 /**
943 * Gets the resolution for input device measurements with respect to this axis.
944 * @return The resolution in units per millimeter, or units per radian for rotational axes.
945 */
946 public float getResolution() {
947 return mResolution;
948 }
Jeff Brown8d608662010-08-30 03:02:23 -0700949 }
Jeff Brown91c69ab2011-02-14 17:03:18 -0800950
Jeff Brown8d608662010-08-30 03:02:23 -0700951 @Override
952 public void writeToParcel(Parcel out, int flags) {
953 out.writeInt(mId);
Jeff Brownaf9e8d32012-04-12 17:32:48 -0700954 out.writeInt(mGeneration);
Michael Wrightac6c78b2013-07-17 13:21:45 -0700955 out.writeInt(mControllerNumber);
Jeff Brown8d608662010-08-30 03:02:23 -0700956 out.writeString(mName);
Michael Wright54e56942013-08-12 16:39:59 -0700957 out.writeInt(mVendorId);
958 out.writeInt(mProductId);
Jeff Browne38fdfa2012-04-06 14:51:01 -0700959 out.writeString(mDescriptor);
Jeff Browndaa37532012-05-01 15:54:03 -0700960 out.writeInt(mIsExternal ? 1 : 0);
Jeff Brown8d608662010-08-30 03:02:23 -0700961 out.writeInt(mSources);
962 out.writeInt(mKeyboardType);
Jeff Brown9f25b7f2012-04-10 14:30:49 -0700963 mKeyCharacterMap.writeToParcel(out, flags);
Jeff Browna47425a2012-04-13 04:09:27 -0700964 out.writeInt(mHasVibrator ? 1 : 0);
Tim Kilbourn72285e52015-06-05 15:52:05 -0700965 out.writeInt(mHasMicrophone ? 1 : 0);
Michael Wright7ddd1102013-05-20 15:04:55 -0700966 out.writeInt(mHasButtonUnderPad ? 1 : 0);
Jeff Brown91c69ab2011-02-14 17:03:18 -0800967
Jeff Brownefd32662011-03-08 15:13:06 -0800968 final int numRanges = mMotionRanges.size();
Kristian Monsen1f9dc882016-03-25 16:42:15 -0700969 out.writeInt(numRanges);
Jeff Brownefd32662011-03-08 15:13:06 -0800970 for (int i = 0; i < numRanges; i++) {
971 MotionRange range = mMotionRanges.get(i);
972 out.writeInt(range.mAxis);
973 out.writeInt(range.mSource);
Jeff Brown91c69ab2011-02-14 17:03:18 -0800974 out.writeFloat(range.mMin);
975 out.writeFloat(range.mMax);
976 out.writeFloat(range.mFlat);
977 out.writeFloat(range.mFuzz);
Michael Wrightc6091c62013-04-01 20:56:04 -0700978 out.writeFloat(range.mResolution);
Jeff Brown8d608662010-08-30 03:02:23 -0700979 }
Jeff Brown8d608662010-08-30 03:02:23 -0700980 }
Jeff Brown91c69ab2011-02-14 17:03:18 -0800981
Jeff Brown8d608662010-08-30 03:02:23 -0700982 @Override
983 public int describeContents() {
984 return 0;
985 }
Jeff Brown91c69ab2011-02-14 17:03:18 -0800986
Jeff Brown8d608662010-08-30 03:02:23 -0700987 @Override
988 public String toString() {
989 StringBuilder description = new StringBuilder();
990 description.append("Input Device ").append(mId).append(": ").append(mName).append("\n");
Jeff Browne38fdfa2012-04-06 14:51:01 -0700991 description.append(" Descriptor: ").append(mDescriptor).append("\n");
Jeff Brownaf9e8d32012-04-12 17:32:48 -0700992 description.append(" Generation: ").append(mGeneration).append("\n");
Jeff Browndaa37532012-05-01 15:54:03 -0700993 description.append(" Location: ").append(mIsExternal ? "external" : "built-in").append("\n");
Jeff Browne38fdfa2012-04-06 14:51:01 -0700994
Jeff Brown8d608662010-08-30 03:02:23 -0700995 description.append(" Keyboard Type: ");
996 switch (mKeyboardType) {
997 case KEYBOARD_TYPE_NONE:
998 description.append("none");
999 break;
1000 case KEYBOARD_TYPE_NON_ALPHABETIC:
1001 description.append("non-alphabetic");
1002 break;
1003 case KEYBOARD_TYPE_ALPHABETIC:
1004 description.append("alphabetic");
1005 break;
1006 }
1007 description.append("\n");
Jeff Brown91c69ab2011-02-14 17:03:18 -08001008
Jeff Browna47425a2012-04-13 04:09:27 -07001009 description.append(" Has Vibrator: ").append(mHasVibrator).append("\n");
1010
Tim Kilbourn72285e52015-06-05 15:52:05 -07001011 description.append(" Has mic: ").append(mHasMicrophone).append("\n");
Tim Kilbourn6d85cf22015-04-08 10:23:35 -07001012
Jeff Brownefd32662011-03-08 15:13:06 -08001013 description.append(" Sources: 0x").append(Integer.toHexString(mSources)).append(" (");
Jeff Brown8d608662010-08-30 03:02:23 -07001014 appendSourceDescriptionIfApplicable(description, SOURCE_KEYBOARD, "keyboard");
1015 appendSourceDescriptionIfApplicable(description, SOURCE_DPAD, "dpad");
Jeff Brown8d608662010-08-30 03:02:23 -07001016 appendSourceDescriptionIfApplicable(description, SOURCE_TOUCHSCREEN, "touchscreen");
1017 appendSourceDescriptionIfApplicable(description, SOURCE_MOUSE, "mouse");
Jeff Brownfe9f8ab2011-05-06 18:20:01 -07001018 appendSourceDescriptionIfApplicable(description, SOURCE_STYLUS, "stylus");
Jeff Brown8d608662010-08-30 03:02:23 -07001019 appendSourceDescriptionIfApplicable(description, SOURCE_TRACKBALL, "trackball");
Vladislav Kaznacheev3787de12016-12-21 10:36:35 -08001020 appendSourceDescriptionIfApplicable(description, SOURCE_MOUSE_RELATIVE, "mouse_relative");
Jeff Brown8d608662010-08-30 03:02:23 -07001021 appendSourceDescriptionIfApplicable(description, SOURCE_TOUCHPAD, "touchpad");
Jeff Brown91c69ab2011-02-14 17:03:18 -08001022 appendSourceDescriptionIfApplicable(description, SOURCE_JOYSTICK, "joystick");
1023 appendSourceDescriptionIfApplicable(description, SOURCE_GAMEPAD, "gamepad");
1024 description.append(" )\n");
1025
1026 final int numAxes = mMotionRanges.size();
1027 for (int i = 0; i < numAxes; i++) {
Jeff Brownefd32662011-03-08 15:13:06 -08001028 MotionRange range = mMotionRanges.get(i);
1029 description.append(" ").append(MotionEvent.axisToString(range.mAxis));
1030 description.append(": source=0x").append(Integer.toHexString(range.mSource));
1031 description.append(" min=").append(range.mMin);
Jeff Brown91c69ab2011-02-14 17:03:18 -08001032 description.append(" max=").append(range.mMax);
1033 description.append(" flat=").append(range.mFlat);
1034 description.append(" fuzz=").append(range.mFuzz);
Michael Wrightc6091c62013-04-01 20:56:04 -07001035 description.append(" resolution=").append(range.mResolution);
Jeff Brown91c69ab2011-02-14 17:03:18 -08001036 description.append("\n");
1037 }
Jeff Brown8d608662010-08-30 03:02:23 -07001038 return description.toString();
1039 }
Jeff Brown91c69ab2011-02-14 17:03:18 -08001040
Jeff Brown8d608662010-08-30 03:02:23 -07001041 private void appendSourceDescriptionIfApplicable(StringBuilder description, int source,
1042 String sourceName) {
1043 if ((mSources & source) == source) {
1044 description.append(" ");
1045 description.append(sourceName);
1046 }
1047 }
Jeff Brownc5ed5912010-07-14 18:48:53 -07001048}