1c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown/*
2c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * Copyright (C) 2010 The Android Open Source Project
3c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown *
4c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
5c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * you may not use this file except in compliance with the License.
6c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * You may obtain a copy of the License at
7c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown *
8c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
9c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown *
10c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * Unless required by applicable law or agreed to in writing, software
11c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
12c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * See the License for the specific language governing permissions and
14c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * limitations under the License.
15c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown */
16c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
17c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brownpackage android.view;
18c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
19a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brownimport android.content.Context;
20ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErikimport android.hardware.input.InputDeviceIdentifier;
21ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brownimport android.hardware.input.InputManager;
228d60866e2100db70ecf0502c14768a384514d7e9Jeff Brownimport android.os.Parcel;
238d60866e2100db70ecf0502c14768a384514d7e9Jeff Brownimport android.os.Parcelable;
24a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brownimport android.os.Vibrator;
25a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brownimport android.os.NullVibrator;
26efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown
27efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brownimport java.util.ArrayList;
28efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brownimport java.util.List;
298d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
30c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown/**
31c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * Describes the capabilities of a particular input device.
32c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * <p>
339df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown * Each input device may support multiple classes of input.  For example, a multi-function
34c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * keyboard may compose the capabilities of a standard keyboard together with a track pad mouse
35c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * or other pointing device.
36c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * </p><p>
37dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * Some input devices present multiple distinguishable sources of input.
38c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * Applications can query the framework about the characteristics of each distinct source.
39c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * </p><p>
40c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * As a further wrinkle, different kinds of input sources uses different coordinate systems
41c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * to describe motion events.  Refer to the comments on the input source constants for
42c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * the appropriate interpretation.
436d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * </p>
44c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown */
458d60866e2100db70ecf0502c14768a384514d7e9Jeff Brownpublic final class InputDevice implements Parcelable {
469f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private final int mId;
47af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    private final int mGeneration;
48ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright    private final int mControllerNumber;
499f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private final String mName;
5054e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    private final int mVendorId;
5154e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    private final int mProductId;
529f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private final String mDescriptor;
53ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik    private final InputDeviceIdentifier mIdentifier;
54daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown    private final boolean mIsExternal;
559f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private final int mSources;
569f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private final int mKeyboardType;
579f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private final KeyCharacterMap mKeyCharacterMap;
58a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    private final boolean mHasVibrator;
5972285e5600fad17c42730d6f84164d8425d4d43cTim Kilbourn    private final boolean mHasMicrophone;
607ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright    private final boolean mHasButtonUnderPad;
61efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    private final ArrayList<MotionRange> mMotionRanges = new ArrayList<MotionRange>();
6291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
63a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    private Vibrator mVibrator; // guarded by mMotionRanges during initialization
64a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown
65c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
66c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A mask for input source classes.
67ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
68c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Each distinct input source constant has one or more input source class bits set to
69c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * specify the desired interpretation for its input events.
70c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
71c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_MASK = 0x000000ff;
72e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright
73e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright    /**
74e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     * The input source has no class.
75e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     *
76e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     * It is up to the application to determine how to handle the device based on the device type.
77e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     */
78e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright    public static final int SOURCE_CLASS_NONE = 0x00000000;
79e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright
80c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
81c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source has buttons or keys.
82dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * Examples: {@link #SOURCE_KEYBOARD}, {@link #SOURCE_DPAD}.
83ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
84c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A {@link KeyEvent} should be interpreted as a button or key press.
85ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
866eb5ac9ceeb3ff67d38c7ead54b4247e762f278dJeff Brown     * Use {@link #getKeyCharacterMap} to query the device's button and key mappings.
87c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
88c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_BUTTON = 0x00000001;
89ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
90c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
91c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a pointing device associated with a display.
92c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Examples: {@link #SOURCE_TOUCHSCREEN}, {@link #SOURCE_MOUSE}.
93ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
94c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A {@link MotionEvent} should be interpreted as absolute coordinates in
95c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * display units according to the {@link View} hierarchy.  Pointer down/up indicated when
96c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * the finger touches the display or when the selection button is pressed/released.
97ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
98c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Use {@link #getMotionRange} to query the range of the pointing device.  Some devices permit
99c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * touches outside the display area so the effective range may be somewhat smaller or larger
100c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * than the actual display size.
101c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
102c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_POINTER = 0x00000002;
103ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
104c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
105c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a trackball navigation device.
106c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Examples: {@link #SOURCE_TRACKBALL}.
107ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
108c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A {@link MotionEvent} should be interpreted as relative movements in device-specific
109c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * units used for navigation purposes.  Pointer down/up indicates when the selection button
110c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * is pressed/released.
111ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
112c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Use {@link #getMotionRange} to query the range of motion.
113c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
114c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_TRACKBALL = 0x00000004;
115ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
116c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
117c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is an absolute positioning device not associated with a display
118c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * (unlike {@link #SOURCE_CLASS_POINTER}).
119ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
120c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A {@link MotionEvent} should be interpreted as absolute coordinates in
121c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * device-specific surface units.
122ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
123c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Use {@link #getMotionRange} to query the range of positions.
124c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
125c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_POSITION = 0x00000008;
126cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
127cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /**
128cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * The input source is a joystick.
129cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     *
130cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * A {@link MotionEvent} should be interpreted as absolute joystick movements.
131cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     *
132cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * Use {@link #getMotionRange} to query the range of positions.
133cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     */
134cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int SOURCE_CLASS_JOYSTICK = 0x00000010;
135cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
136c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
137c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is unknown.
138c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
139c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_UNKNOWN = 0x00000000;
140ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
141c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
142c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a keyboard.
1439df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     *
1449df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * This source indicates pretty much anything that has buttons.  Use
1459df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * {@link #getKeyboardType()} to determine whether the keyboard has alphabetic keys
1469df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * and can be used to enter text.
1479df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     *
148c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_BUTTON
149c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
150c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_KEYBOARD = 0x00000100 | SOURCE_CLASS_BUTTON;
151ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
152c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
153c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a DPad.
154ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
155c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_BUTTON
156c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
157c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_DPAD = 0x00000200 | SOURCE_CLASS_BUTTON;
158cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
159cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /**
160cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * The input source is a game pad.
161cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * (It may also be a {@link #SOURCE_JOYSTICK}).
162cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     *
163cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * @see #SOURCE_CLASS_BUTTON
164cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     */
165cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int SOURCE_GAMEPAD = 0x00000400 | SOURCE_CLASS_BUTTON;
166cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
167c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
168c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a touch screen pointing device.
169ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
170c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_POINTER
171c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
172c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_TOUCHSCREEN = 0x00001000 | SOURCE_CLASS_POINTER;
173ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
174c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
175c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a mouse pointing device.
176c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * This code is also used for other mouse-like pointing devices such as trackpads
177c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * and trackpoints.
178ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
179c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_POINTER
180c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
181c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_MOUSE = 0x00002000 | SOURCE_CLASS_POINTER;
182fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown
183fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    /**
184fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown     * The input source is a stylus pointing device.
18500710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * <p>
18600710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * Note that this bit merely indicates that an input device is capable of obtaining
18700710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * input from a stylus.  To determine whether a given touch event was produced
18800710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * by a stylus, examine the tool type returned by {@link MotionEvent#getToolType(int)}
18900710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * for each individual pointer.
19000710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * </p><p>
19100710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * A single touch event may multiple pointers with different tool types,
19200710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * such as an event that has one pointer with tool type
19300710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * {@link MotionEvent#TOOL_TYPE_FINGER} and another pointer with tool type
19400710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * {@link MotionEvent#TOOL_TYPE_STYLUS}.  So it is important to examine
19500710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * the tool type of each pointer, regardless of the source reported
19600710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * by {@link MotionEvent#getSource()}.
19700710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * </p>
198fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown     *
199fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown     * @see #SOURCE_CLASS_POINTER
200fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown     */
201fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    public static final int SOURCE_STYLUS = 0x00004000 | SOURCE_CLASS_POINTER;
202fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown
203c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
204f18920ba3182087938e245fab8e3e3008a39606bMichael Wright     * The input device is a Bluetooth stylus.
205f18920ba3182087938e245fab8e3e3008a39606bMichael Wright     * <p>
206f18920ba3182087938e245fab8e3e3008a39606bMichael Wright     * Note that this bit merely indicates that an input device is capable of
207f18920ba3182087938e245fab8e3e3008a39606bMichael Wright     * obtaining input from a Bluetooth stylus.  To determine whether a given
208f18920ba3182087938e245fab8e3e3008a39606bMichael Wright     * touch event was produced by a stylus, examine the tool type returned by
209f18920ba3182087938e245fab8e3e3008a39606bMichael Wright     * {@link MotionEvent#getToolType(int)} for each individual pointer.
210f18920ba3182087938e245fab8e3e3008a39606bMichael Wright     * </p><p>
211f18920ba3182087938e245fab8e3e3008a39606bMichael Wright     * A single touch event may multiple pointers with different tool types,
212f18920ba3182087938e245fab8e3e3008a39606bMichael Wright     * such as an event that has one pointer with tool type
213f18920ba3182087938e245fab8e3e3008a39606bMichael Wright     * {@link MotionEvent#TOOL_TYPE_FINGER} and another pointer with tool type
214f18920ba3182087938e245fab8e3e3008a39606bMichael Wright     * {@link MotionEvent#TOOL_TYPE_STYLUS}.  So it is important to examine
215f18920ba3182087938e245fab8e3e3008a39606bMichael Wright     * the tool type of each pointer, regardless of the source reported
216f18920ba3182087938e245fab8e3e3008a39606bMichael Wright     * by {@link MotionEvent#getSource()}.
217f18920ba3182087938e245fab8e3e3008a39606bMichael Wright     * </p><p>
218f18920ba3182087938e245fab8e3e3008a39606bMichael Wright     * A bluetooth stylus generally receives its pressure and button state
219f18920ba3182087938e245fab8e3e3008a39606bMichael Wright     * information from the stylus itself, and derives the rest from another
220f18920ba3182087938e245fab8e3e3008a39606bMichael Wright     * source. For example, a Bluetooth stylus used in conjunction with a
221f18920ba3182087938e245fab8e3e3008a39606bMichael Wright     * touchscreen would derive its contact position and pointer size from the
222f18920ba3182087938e245fab8e3e3008a39606bMichael Wright     * touchscreen and may not be any more accurate than other tools such as
223f18920ba3182087938e245fab8e3e3008a39606bMichael Wright     * fingers.
224f18920ba3182087938e245fab8e3e3008a39606bMichael Wright     * </p>
225f18920ba3182087938e245fab8e3e3008a39606bMichael Wright     *
226f18920ba3182087938e245fab8e3e3008a39606bMichael Wright     * @see #SOURCE_STYLUS
227f18920ba3182087938e245fab8e3e3008a39606bMichael Wright     * @see #SOURCE_CLASS_POINTER
228f18920ba3182087938e245fab8e3e3008a39606bMichael Wright     */
229f18920ba3182087938e245fab8e3e3008a39606bMichael Wright    public static final int SOURCE_BLUETOOTH_STYLUS =
230f18920ba3182087938e245fab8e3e3008a39606bMichael Wright            0x00008000 | SOURCE_STYLUS;
231f18920ba3182087938e245fab8e3e3008a39606bMichael Wright
232f18920ba3182087938e245fab8e3e3008a39606bMichael Wright    /**
233c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a trackball.
234ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
235c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_TRACKBALL
236c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
237c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_TRACKBALL = 0x00010000 | SOURCE_CLASS_TRACKBALL;
238ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
239c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
240c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a touch pad or digitizer tablet that is not
241e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * associated with a display (unlike {@link #SOURCE_TOUCHSCREEN}).
242ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
243c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_POSITION
244c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
245c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_TOUCHPAD = 0x00100000 | SOURCE_CLASS_POSITION;
246cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
247cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /**
248e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     * The input source is a touch device whose motions should be interpreted as navigation events.
249e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     *
250e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     * For example, an upward swipe should be as an upward focus traversal in the same manner as
251e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     * pressing up on a D-Pad would be. Swipes to the left, right and down should be treated in a
252e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     * similar manner.
253e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     *
254e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     * @see #SOURCE_CLASS_NONE
255e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     */
256e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright    public static final int SOURCE_TOUCH_NAVIGATION = 0x00200000 | SOURCE_CLASS_NONE;
257e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright
258e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright    /**
25967322b1ff058d9abadd94c10b0ce167508ead6f5Prashant Malani     * The input source is a rotating encoder device whose motions should be interpreted as akin to
26067322b1ff058d9abadd94c10b0ce167508ead6f5Prashant Malani     * those of a scroll wheel.
26167322b1ff058d9abadd94c10b0ce167508ead6f5Prashant Malani     *
26267322b1ff058d9abadd94c10b0ce167508ead6f5Prashant Malani     * @see #SOURCE_CLASS_NONE
26367322b1ff058d9abadd94c10b0ce167508ead6f5Prashant Malani     * {@hide}
26467322b1ff058d9abadd94c10b0ce167508ead6f5Prashant Malani     */
26567322b1ff058d9abadd94c10b0ce167508ead6f5Prashant Malani    public static final int SOURCE_ROTARY_ENCODER = 0x00400000 | SOURCE_CLASS_NONE;
26667322b1ff058d9abadd94c10b0ce167508ead6f5Prashant Malani
26767322b1ff058d9abadd94c10b0ce167508ead6f5Prashant Malani    /**
268cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * The input source is a joystick.
269cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * (It may also be a {@link #SOURCE_GAMEPAD}).
270cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     *
271cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * @see #SOURCE_CLASS_JOYSTICK
272cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     */
273cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int SOURCE_JOYSTICK = 0x01000000 | SOURCE_CLASS_JOYSTICK;
274cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
2756d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
27696658f716779b4f2f5dd148cbf6df59d5a87ace4Jinsuk Kim     * The input source is a device connected through HDMI-based bus.
27796658f716779b4f2f5dd148cbf6df59d5a87ace4Jinsuk Kim     *
27896658f716779b4f2f5dd148cbf6df59d5a87ace4Jinsuk Kim     * The key comes in through HDMI-CEC or MHL signal line, and is treated as if it were
27996658f716779b4f2f5dd148cbf6df59d5a87ace4Jinsuk Kim     * generated by a locally connected DPAD or keyboard.
28096658f716779b4f2f5dd148cbf6df59d5a87ace4Jinsuk Kim     */
28196658f716779b4f2f5dd148cbf6df59d5a87ace4Jinsuk Kim    public static final int SOURCE_HDMI = 0x02000000 | SOURCE_CLASS_BUTTON;
28296658f716779b4f2f5dd148cbf6df59d5a87ace4Jinsuk Kim
28396658f716779b4f2f5dd148cbf6df59d5a87ace4Jinsuk Kim    /**
2846d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * A special input source constant that is used when filtering input devices
2856d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * to match devices that provide any type of input source.
2866d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
2876d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int SOURCE_ANY = 0xffffff00;
288c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
289e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
29091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_X}.
291ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
292e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
29391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_X} instead.
294e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
29591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
29691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_X = MotionEvent.AXIS_X;
29791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
298e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
29991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_Y}.
300ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
301e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
30291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_Y} instead.
303e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
30491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
30591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_Y = MotionEvent.AXIS_Y;
30691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
307e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
30891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_PRESSURE}.
309ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
310e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
31191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_PRESSURE} instead.
312e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
31391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
31491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_PRESSURE = MotionEvent.AXIS_PRESSURE;
31591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
316e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
31791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_SIZE}.
318ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
319e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
32091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_SIZE} instead.
321e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
32291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
32391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_SIZE = MotionEvent.AXIS_SIZE;
32491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
325e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
32691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOUCH_MAJOR}.
327ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
328e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
32991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_TOUCH_MAJOR} instead.
330e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
33191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
33291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_TOUCH_MAJOR = MotionEvent.AXIS_TOUCH_MAJOR;
33391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
334e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
33591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOUCH_MINOR}.
336ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
337e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
33891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_TOUCH_MINOR} instead.
339e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
34091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
34191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_TOUCH_MINOR = MotionEvent.AXIS_TOUCH_MINOR;
34291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
343e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
34491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOOL_MAJOR}.
345ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
346e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
34791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_TOOL_MAJOR} instead.
348e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
34991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
35091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_TOOL_MAJOR = MotionEvent.AXIS_TOOL_MAJOR;
35191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
352e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
35391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOOL_MINOR}.
354ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
355e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
35691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_TOOL_MINOR} instead.
357e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
35891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
35991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_TOOL_MINOR = MotionEvent.AXIS_TOOL_MINOR;
36091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
361e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
36291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_ORIENTATION}.
363ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
364e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
36591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_ORIENTATION} instead.
366e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
36791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
36891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_ORIENTATION = MotionEvent.AXIS_ORIENTATION;
369ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
3706d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
3716d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * There is no keyboard.
3726d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
3736d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int KEYBOARD_TYPE_NONE = 0;
374ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
3756d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
3766d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * The keyboard is not fully alphabetic.  It may be a numeric keypad or an assortment
3776d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * of buttons that are not mapped as alphabetic keys suitable for text input.
3786d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
3796d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int KEYBOARD_TYPE_NON_ALPHABETIC = 1;
380ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
3816d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
3826d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * The keyboard supports a complement of alphabetic keys.
3836d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
3846d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int KEYBOARD_TYPE_ALPHABETIC = 2;
38591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
3869f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    public static final Parcelable.Creator<InputDevice> CREATOR =
3879f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            new Parcelable.Creator<InputDevice>() {
3889f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        public InputDevice createFromParcel(Parcel in) {
3899f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            return new InputDevice(in);
3909f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        }
3919f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        public InputDevice[] newArray(int size) {
3929f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            return new InputDevice[size];
3939f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        }
3949f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    };
3959f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
3968d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    // Called by native code.
39754e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    private InputDevice(int id, int generation, int controllerNumber, String name, int vendorId,
3986d85cf2bd7cba6890f1b2bb26073105c3b8fc432Tim Kilbourn            int productId, String descriptor, boolean isExternal, int sources, int keyboardType,
39972285e5600fad17c42730d6f84164d8425d4d43cTim Kilbourn            KeyCharacterMap keyCharacterMap, boolean hasVibrator, boolean hasMicrophone,
400415b450bf29a8ad28ecc5c1c1eea9bd61e49bf72Tim Kilbourn            boolean hasButtonUnderPad) {
4019f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mId = id;
402af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        mGeneration = generation;
403ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright        mControllerNumber = controllerNumber;
4049f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mName = name;
40554e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        mVendorId = vendorId;
40654e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        mProductId = productId;
4079f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mDescriptor = descriptor;
408daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown        mIsExternal = isExternal;
4099f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mSources = sources;
4109f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyboardType = keyboardType;
4119f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyCharacterMap = keyCharacterMap;
412a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown        mHasVibrator = hasVibrator;
41372285e5600fad17c42730d6f84164d8425d4d43cTim Kilbourn        mHasMicrophone = hasMicrophone;
4147ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright        mHasButtonUnderPad = hasButtonUnderPad;
415ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik        mIdentifier = new InputDeviceIdentifier(descriptor, vendorId, productId);
4169f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
4179f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
4189f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private InputDevice(Parcel in) {
4199f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mId = in.readInt();
420af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        mGeneration = in.readInt();
421ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright        mControllerNumber = in.readInt();
4229f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mName = in.readString();
42354e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        mVendorId = in.readInt();
42454e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        mProductId = in.readInt();
4259f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mDescriptor = in.readString();
426daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown        mIsExternal = in.readInt() != 0;
4279f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mSources = in.readInt();
4289f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyboardType = in.readInt();
4299f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyCharacterMap = KeyCharacterMap.CREATOR.createFromParcel(in);
430a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown        mHasVibrator = in.readInt() != 0;
43172285e5600fad17c42730d6f84164d8425d4d43cTim Kilbourn        mHasMicrophone = in.readInt() != 0;
4327ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright        mHasButtonUnderPad = in.readInt() != 0;
433ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik        mIdentifier = new InputDeviceIdentifier(mDescriptor, mVendorId, mProductId);
4349f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
4359f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        for (;;) {
4369f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            int axis = in.readInt();
4379f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            if (axis < 0) {
4389f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown                break;
4399f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            }
440c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright            addMotionRange(axis, in.readInt(), in.readFloat(), in.readFloat(), in.readFloat(),
441c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright                    in.readFloat(), in.readFloat());
4429f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        }
4438d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
444e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown
445e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
446e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * Gets information about the input device with the specified id.
447e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @param id The device id.
448e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @return The input device or null if not found.
449e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
450c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static InputDevice getDevice(int id) {
4519f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return InputManager.getInstance().getInputDevice(id);
4528d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
453ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
4548d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    /**
4558d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * Gets the ids of all input devices in the system.
4568d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * @return The input device ids.
4578d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     */
4588d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public static int[] getDeviceIds() {
4599f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return InputManager.getInstance().getInputDeviceIds();
4608d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
4619df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown
4628d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    /**
4638d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * Gets the input device id.
4649df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * <p>
4659df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * Each input device receives a unique id when it is first configured
4669df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * by the system.  The input device id may change when the system is restarted or if the
4679df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * input device is disconnected, reconnected or reconfigured at any time.
4689df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * If you require a stable identifier for a device that persists across
4699df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * boots and reconfigurations, use {@link #getDescriptor()}.
4709df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * </p>
4719df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     *
4728d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * @return The input device id.
4738d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     */
4748d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public int getId() {
4758d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return mId;
476c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
4779df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown
4789df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown    /**
479ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright     * The controller number for a given input device.
480ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright     * <p>
48110fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * Each gamepad or joystick is given a unique, positive controller number when initially
48210fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * configured by the system. This number may change due to events such as device disconnects /
48310fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * reconnects or user initiated reassignment. Any change in number will trigger an event that
48410fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * can be observed by registering an {@link InputManager.InputDeviceListener}.
48510fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * </p>
48610fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * <p>
48710fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * All input devices which are not gamepads or joysticks will be assigned a controller number
488ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright     * of 0.
489ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright     * </p>
49010fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     *
49110fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * @return The controller number of the device.
492ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright     */
493ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright    public int getControllerNumber() {
494ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright        return mControllerNumber;
495ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright    }
496ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright
497ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright    /**
498ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     * The set of identifying information for type of input device. This
499ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     * information can be used by the system to configure appropriate settings
500ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     * for the device.
501ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
502ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     * @return The identifier object for this device
503ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     * @hide
504ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     */
505ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik    public InputDeviceIdentifier getIdentifier() {
506ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik        return mIdentifier;
507ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik    }
508ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
509ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik    /**
510af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     * Gets a generation number for this input device.
511af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     * The generation number is incremented whenever the device is reconfigured and its
512af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     * properties may have changed.
513af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     *
514af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     * @return The generation number.
515af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     *
516af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     * @hide
517af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     */
518af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    public int getGeneration() {
519af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        return mGeneration;
520af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    }
521af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown
522af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    /**
52354e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * Gets the vendor id for the given device, if available.
52454e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * <p>
52554e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * A vendor id uniquely identifies the company who manufactured the device. A value of 0 will
52654e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * be assigned where a vendor id is not available.
52754e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * </p>
52854e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     *
52954e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * @return The vendor id of a given device
53054e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     */
53154e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    public int getVendorId() {
53254e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        return mVendorId;
53354e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    }
53454e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright
53554e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    /**
53654e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * Gets the product id for the given device, if available.
53754e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * <p>
53854e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * A product id uniquely identifies which product within the address space of a given vendor,
53954e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * identified by the device's vendor id. A value of 0 will be assigned where a product id is
54054e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * not available.
54154e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * </p>
54254e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     *
54354e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * @return The product id of a given device
54454e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     */
54554e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    public int getProductId() {
54654e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        return mProductId;
54754e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    }
54854e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright
54954e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    /**
5509df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * Gets the input device descriptor, which is a stable identifier for an input device.
5519df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * <p>
5529df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * An input device descriptor uniquely identifies an input device.  Its value
5539df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * is intended to be persistent across system restarts, and should not change even
5549df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * if the input device is disconnected, reconnected or reconfigured at any time.
555e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * </p><p>
556e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * It is possible for there to be multiple {@link InputDevice} instances that have the
557e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * same input device descriptor.  This might happen in situations where a single
558e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * human input device registers multiple {@link InputDevice} instances (HID collections)
559e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * that describe separate features of the device, such as a keyboard that also
560e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * has a trackpad.  Alternately, it may be that the input devices are simply
561e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * indistinguishable, such as two keyboards made by the same manufacturer.
562e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * </p><p>
563daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     * The input device descriptor returned by {@link #getDescriptor} should only be
564e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * used when an application needs to remember settings associated with a particular
565e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * input device.  For all other purposes when referring to a logical
566e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * {@link InputDevice} instance at runtime use the id returned by {@link #getId()}.
5679df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * </p>
5689df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     *
5699df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * @return The input device descriptor.
5709df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     */
5719df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown    public String getDescriptor() {
572e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown        return mDescriptor;
5739df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown    }
5749df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown
575c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
5769f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * Returns true if the device is a virtual input device rather than a real one,
5779f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * such as the virtual keyboard (see {@link KeyCharacterMap#VIRTUAL_KEYBOARD}).
5789f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * <p>
5799f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * Virtual input devices are provided to implement system-level functionality
5809f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * and should not be seen or configured by users.
5819f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * </p>
5829f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     *
5839f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * @return True if the device is virtual.
5849f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     *
5859f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * @see KeyCharacterMap#VIRTUAL_KEYBOARD
5869f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     */
5879f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    public boolean isVirtual() {
5889f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return mId < 0;
5899f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
5909f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
5919f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    /**
592daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     * Returns true if the device is external (connected to USB or Bluetooth or some other
593daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     * peripheral bus), otherwise it is built-in.
594daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     *
595daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     * @return True if the device is external.
596daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     *
597daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     * @hide
598daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     */
599daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown    public boolean isExternal() {
600daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown        return mIsExternal;
601daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown    }
602daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown
603daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown    /**
6047e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown     * Returns true if the device is a full keyboard.
6057e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown     *
6067e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown     * @return True if the device is a full keyboard.
6077e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown     *
6087e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown     * @hide
6097e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown     */
6107e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown    public boolean isFullKeyboard() {
6117e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown        return (mSources & SOURCE_KEYBOARD) == SOURCE_KEYBOARD
6127e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown                && mKeyboardType == KEYBOARD_TYPE_ALPHABETIC;
6137e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown    }
6147e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown
6157e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown    /**
616c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Gets the name of this input device.
617c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @return The input device name.
618c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
619c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public String getName() {
620c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mName;
621c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
622ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
623c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
624c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Gets the input sources supported by this input device as a combined bitfield.
625c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @return The supported input sources.
626c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
627c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public int getSources() {
628c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mSources;
629c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
630ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
631c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
632d08c864784b5d416805aee502e5294b0188a7bd8Michael Wright     * Determines whether the input device supports the given source or sources.
633d08c864784b5d416805aee502e5294b0188a7bd8Michael Wright     *
634d08c864784b5d416805aee502e5294b0188a7bd8Michael Wright     * @param source The input source or sources to check against. This can be a generic device
635d08c864784b5d416805aee502e5294b0188a7bd8Michael Wright     * type such as {@link InputDevice#SOURCE_MOUSE}, a more generic device class, such as
636d08c864784b5d416805aee502e5294b0188a7bd8Michael Wright     * {@link InputDevice#SOURCE_CLASS_POINTER}, or a combination of sources bitwise ORed together.
637d08c864784b5d416805aee502e5294b0188a7bd8Michael Wright     * @return Whether the device can produce all of the given sources.
638d08c864784b5d416805aee502e5294b0188a7bd8Michael Wright     */
639d08c864784b5d416805aee502e5294b0188a7bd8Michael Wright    public boolean supportsSource(int source) {
640d08c864784b5d416805aee502e5294b0188a7bd8Michael Wright        return (mSources & source) == source;
641d08c864784b5d416805aee502e5294b0188a7bd8Michael Wright    }
642d08c864784b5d416805aee502e5294b0188a7bd8Michael Wright
643d08c864784b5d416805aee502e5294b0188a7bd8Michael Wright    /**
6446d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * Gets the keyboard type.
6456d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * @return The keyboard type.
6466d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
6476d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public int getKeyboardType() {
6486d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mKeyboardType;
6496d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    }
650ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
6516d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
652c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Gets the key character map associated with this input device.
653c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @return The key character map.
654c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
655c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public KeyCharacterMap getKeyCharacterMap() {
6569f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return mKeyCharacterMap;
6571e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown    }
6581e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown
659e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
660b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright     * Gets whether the device is capable of producing the list of keycodes.
661b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright     * @param keys The list of android keycodes to check for.
662b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright     * @return An array of booleans where each member specifies whether the device is capable of
663b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright     * generating the keycode given by the corresponding value at the same index in the keys array.
664b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright     */
665b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright    public boolean[] hasKeys(int... keys) {
666b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright        return InputManager.getInstance().deviceHasKeys(mId, keys);
667b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright    }
668b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright
669b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright    /**
67091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Gets information about the range of values for a particular {@link MotionEvent} axis.
671efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * If the device supports multiple sources, the same axis may have different meanings
672efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * for each source.  Returns information about the first axis found for any source.
673efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * To obtain information about the axis for a specific source, use
674efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * {@link #getMotionRange(int, int)}.
675efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     *
67691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @param axis The axis constant.
67791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @return The range of values, or null if the requested axis is not
678e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * supported by the device.
67991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     *
68091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @see MotionEvent#AXIS_X
68191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @see MotionEvent#AXIS_Y
682e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
68391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public MotionRange getMotionRange(int axis) {
684efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        final int numRanges = mMotionRanges.size();
685efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        for (int i = 0; i < numRanges; i++) {
686efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            final MotionRange range = mMotionRanges.get(i);
687efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            if (range.mAxis == axis) {
688efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown                return range;
689efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            }
690efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        }
691efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        return null;
692c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
69391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
6946f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    /**
695efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * Gets information about the range of values for a particular {@link MotionEvent} axis
696efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * used by a particular source on the device.
697efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * If the device supports multiple sources, the same axis may have different meanings
698efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * for each source.
699efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     *
700efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @param axis The axis constant.
701efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @param source The source for which to return information.
702efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @return The range of values, or null if the requested axis is not
703efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * supported by the device.
7046f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     *
705efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @see MotionEvent#AXIS_X
706efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @see MotionEvent#AXIS_Y
707efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     */
708efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    public MotionRange getMotionRange(int axis, int source) {
709efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        final int numRanges = mMotionRanges.size();
710efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        for (int i = 0; i < numRanges; i++) {
711efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            final MotionRange range = mMotionRanges.get(i);
712efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            if (range.mAxis == axis && range.mSource == source) {
713efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown                return range;
7146f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            }
7156f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        }
716efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        return null;
7176f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    }
7186f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown
719efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    /**
720efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * Gets the ranges for all axes supported by the device.
721efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @return The motion ranges for the device.
722efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     *
723efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @see #getMotionRange(int, int)
724efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     */
725efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    public List<MotionRange> getMotionRanges() {
726efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        return mMotionRanges;
727efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    }
728efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown
7299f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    // Called from native code.
730efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    private void addMotionRange(int axis, int source,
731c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright            float min, float max, float flat, float fuzz, float resolution) {
732c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright        mMotionRanges.add(new MotionRange(axis, source, min, max, flat, fuzz, resolution));
733c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
73491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
735e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
736a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * Gets the vibrator service associated with the device, if there is one.
737a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * Even if the device does not have a vibrator, the result is never null.
738a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * Use {@link Vibrator#hasVibrator} to determine whether a vibrator is
739a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * present.
740a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     *
741a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * Note that the vibrator associated with the device may be different from
742a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * the system vibrator.  To obtain an instance of the system vibrator instead, call
743a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * {@link Context#getSystemService} with {@link Context#VIBRATOR_SERVICE} as argument.
744a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     *
745a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * @return The vibrator service associated with the device, never null.
746a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     */
747a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    public Vibrator getVibrator() {
748a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown        synchronized (mMotionRanges) {
749a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown            if (mVibrator == null) {
750a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown                if (mHasVibrator) {
751a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown                    mVibrator = InputManager.getInstance().getInputDeviceVibrator(mId);
752a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown                } else {
753a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown                    mVibrator = NullVibrator.getInstance();
754a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown                }
755a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown            }
756a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown            return mVibrator;
757a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown        }
758a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    }
759a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown
760a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    /**
7616d85cf2bd7cba6890f1b2bb26073105c3b8fc432Tim Kilbourn     * Reports whether the device has a built-in microphone.
7626d85cf2bd7cba6890f1b2bb26073105c3b8fc432Tim Kilbourn     * @return Whether the device has a built-in microphone.
7636d85cf2bd7cba6890f1b2bb26073105c3b8fc432Tim Kilbourn     */
76472285e5600fad17c42730d6f84164d8425d4d43cTim Kilbourn    public boolean hasMicrophone() {
76572285e5600fad17c42730d6f84164d8425d4d43cTim Kilbourn        return mHasMicrophone;
7666d85cf2bd7cba6890f1b2bb26073105c3b8fc432Tim Kilbourn    }
7676d85cf2bd7cba6890f1b2bb26073105c3b8fc432Tim Kilbourn
7686d85cf2bd7cba6890f1b2bb26073105c3b8fc432Tim Kilbourn    /**
7697ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright     * Reports whether the device has a button under its touchpad
7707ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright     * @return Whether the device has a button under its touchpad
7717ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright     * @hide
7727ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright     */
7737ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright    public boolean hasButtonUnderPad() {
7747ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright        return mHasButtonUnderPad;
7757ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright    }
7767ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright
7777ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright    /**
778f9d9ce7705475874c82af04eb9b208a7fb556792Michael Wright     * Sets the current pointer type.
779f9d9ce7705475874c82af04eb9b208a7fb556792Michael Wright     * @param pointerType the type of the pointer icon.
7801db5397d88e722b1ab82ccb2b429ceec1179ccd8Jun Mukai     * @hide
7811db5397d88e722b1ab82ccb2b429ceec1179ccd8Jun Mukai     */
782f9d9ce7705475874c82af04eb9b208a7fb556792Michael Wright    public void setPointerType(int pointerType) {
783f9d9ce7705475874c82af04eb9b208a7fb556792Michael Wright        InputManager.getInstance().setPointerIconType(pointerType);
7841db5397d88e722b1ab82ccb2b429ceec1179ccd8Jun Mukai    }
7851db5397d88e722b1ab82ccb2b429ceec1179ccd8Jun Mukai
7861db5397d88e722b1ab82ccb2b429ceec1179ccd8Jun Mukai    /**
787d4eaef7f4c5a5d281de4fff272cd33e892e26264Jun Mukai     * Specifies the current custom pointer.
788d4eaef7f4c5a5d281de4fff272cd33e892e26264Jun Mukai     * @param icon the icon data.
789d4eaef7f4c5a5d281de4fff272cd33e892e26264Jun Mukai     * @hide
790d4eaef7f4c5a5d281de4fff272cd33e892e26264Jun Mukai     */
791d4eaef7f4c5a5d281de4fff272cd33e892e26264Jun Mukai    public void setCustomPointerIcon(PointerIcon icon) {
792d4eaef7f4c5a5d281de4fff272cd33e892e26264Jun Mukai        InputManager.getInstance().setCustomPointerIcon(icon);
793d4eaef7f4c5a5d281de4fff272cd33e892e26264Jun Mukai    }
794d4eaef7f4c5a5d281de4fff272cd33e892e26264Jun Mukai
795d4eaef7f4c5a5d281de4fff272cd33e892e26264Jun Mukai    /**
79691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Provides information about the range of values for a particular {@link MotionEvent} axis.
79791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     *
79891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @see InputDevice#getMotionRange(int)
799e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
800c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final class MotionRange {
801efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        private int mAxis;
802efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        private int mSource;
8038d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mMin;
8048d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mMax;
8058d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mFlat;
8068d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mFuzz;
807c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright        private float mResolution;
80891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
809c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright        private MotionRange(int axis, int source, float min, float max, float flat, float fuzz,
810c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright                float resolution) {
811efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            mAxis = axis;
812efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            mSource = source;
8138d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mMin = min;
8148d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mMax = max;
8158d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mFlat = flat;
8168d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mFuzz = fuzz;
817c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright            mResolution = resolution;
8188d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
81991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
820e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
821efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         * Gets the axis id.
822efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         * @return The axis id.
823efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         */
824efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        public int getAxis() {
825efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            return mAxis;
826efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        }
827efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown
828efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        /**
829efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         * Gets the source for which the axis is defined.
830efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         * @return The source.
831efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         */
832efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        public int getSource() {
833efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            return mSource;
834efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        }
835efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown
83674e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright
83774e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright        /**
83874e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         * Determines whether the event is from the given source.
83974e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         *
84074e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         * @param source The input source to check against. This can be a specific device type,
84174e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         * such as {@link InputDevice#SOURCE_TOUCH_NAVIGATION}, or a more generic device class,
84274e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         * such as {@link InputDevice#SOURCE_CLASS_POINTER}.
84374e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         * @return Whether the event is from the given source.
84474e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         */
84574e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright        public boolean isFromSource(int source) {
84674e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright            return (getSource() & source) == source;
84774e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright        }
84874e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright
849efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        /**
8506f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * Gets the inclusive minimum value for the axis.
8516f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * @return The inclusive minimum value.
852e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
853e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getMin() {
8548d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mMin;
855e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
85691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
857e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
8586f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * Gets the inclusive maximum value for the axis.
8596f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * @return The inclusive maximum value.
860e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
861e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getMax() {
8628d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mMax;
863e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
86491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
865e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
8666f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * Gets the range of the axis (difference between maximum and minimum).
867e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * @return The range of values.
868e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
869e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getRange() {
8706f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            return mMax - mMin;
871e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
87291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
873e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
87491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown         * Gets the extent of the center flat position with respect to this axis.
8756f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * <p>
876e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * For example, a flat value of 8 means that the center position is between -8 and +8.
877dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown         * This value is mainly useful for calibrating self-centering devices.
8786f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * </p>
879e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * @return The extent of the center flat position.
880e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
881e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getFlat() {
8828d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mFlat;
883e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
88491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
885e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
88691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown         * Gets the error tolerance for input device measurements with respect to this axis.
8876f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * <p>
888e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * For example, a value of 2 indicates that the measured value may be up to +/- 2 units
889e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * away from the actual value due to noise and device sensitivity limitations.
8906f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * </p>
891e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * @return The error tolerance.
892e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
893e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getFuzz() {
8948d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mFuzz;
8958d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
896c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright
897c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright        /**
898c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright         * Gets the resolution for input device measurements with respect to this axis.
899c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright         * @return The resolution in units per millimeter, or units per radian for rotational axes.
900c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright         */
901c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright        public float getResolution() {
902c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright            return mResolution;
903c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright        }
9048d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
90591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
9068d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    @Override
9078d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public void writeToParcel(Parcel out, int flags) {
9088d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(mId);
909af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        out.writeInt(mGeneration);
910ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright        out.writeInt(mControllerNumber);
9118d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeString(mName);
91254e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        out.writeInt(mVendorId);
91354e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        out.writeInt(mProductId);
914e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown        out.writeString(mDescriptor);
915daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown        out.writeInt(mIsExternal ? 1 : 0);
9168d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(mSources);
9178d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(mKeyboardType);
9189f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyCharacterMap.writeToParcel(out, flags);
919a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown        out.writeInt(mHasVibrator ? 1 : 0);
92072285e5600fad17c42730d6f84164d8425d4d43cTim Kilbourn        out.writeInt(mHasMicrophone ? 1 : 0);
9217ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright        out.writeInt(mHasButtonUnderPad ? 1 : 0);
92291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
923efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        final int numRanges = mMotionRanges.size();
924efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        for (int i = 0; i < numRanges; i++) {
925efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            MotionRange range = mMotionRanges.get(i);
926efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            out.writeInt(range.mAxis);
927efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            out.writeInt(range.mSource);
92891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            out.writeFloat(range.mMin);
92991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            out.writeFloat(range.mMax);
93091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            out.writeFloat(range.mFlat);
93191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            out.writeFloat(range.mFuzz);
932c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright            out.writeFloat(range.mResolution);
9338d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
9348d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(-1);
9358d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
93691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
9378d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    @Override
9388d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public int describeContents() {
9398d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return 0;
9408d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
94191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
9428d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    @Override
9438d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public String toString() {
9448d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        StringBuilder description = new StringBuilder();
9458d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        description.append("Input Device ").append(mId).append(": ").append(mName).append("\n");
946e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown        description.append("  Descriptor: ").append(mDescriptor).append("\n");
947af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        description.append("  Generation: ").append(mGeneration).append("\n");
948daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown        description.append("  Location: ").append(mIsExternal ? "external" : "built-in").append("\n");
949e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown
9508d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        description.append("  Keyboard Type: ");
9518d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        switch (mKeyboardType) {
9528d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            case KEYBOARD_TYPE_NONE:
9538d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                description.append("none");
9548d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                break;
9558d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            case KEYBOARD_TYPE_NON_ALPHABETIC:
9568d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                description.append("non-alphabetic");
9578d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                break;
9588d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            case KEYBOARD_TYPE_ALPHABETIC:
9598d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                description.append("alphabetic");
9608d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                break;
9618d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
9628d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        description.append("\n");
96391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
964a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown        description.append("  Has Vibrator: ").append(mHasVibrator).append("\n");
965a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown
96672285e5600fad17c42730d6f84164d8425d4d43cTim Kilbourn        description.append("  Has mic: ").append(mHasMicrophone).append("\n");
9676d85cf2bd7cba6890f1b2bb26073105c3b8fc432Tim Kilbourn
968efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        description.append("  Sources: 0x").append(Integer.toHexString(mSources)).append(" (");
9698d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_KEYBOARD, "keyboard");
9708d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_DPAD, "dpad");
9718d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_TOUCHSCREEN, "touchscreen");
9728d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_MOUSE, "mouse");
973fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_STYLUS, "stylus");
9748d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_TRACKBALL, "trackball");
9758d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_TOUCHPAD, "touchpad");
97691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_JOYSTICK, "joystick");
97791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_GAMEPAD, "gamepad");
97891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        description.append(" )\n");
97991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
98091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        final int numAxes = mMotionRanges.size();
98191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        for (int i = 0; i < numAxes; i++) {
982efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            MotionRange range = mMotionRanges.get(i);
983efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            description.append("    ").append(MotionEvent.axisToString(range.mAxis));
984efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            description.append(": source=0x").append(Integer.toHexString(range.mSource));
985efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            description.append(" min=").append(range.mMin);
98691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            description.append(" max=").append(range.mMax);
98791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            description.append(" flat=").append(range.mFlat);
98891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            description.append(" fuzz=").append(range.mFuzz);
989c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright            description.append(" resolution=").append(range.mResolution);
99091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            description.append("\n");
99191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        }
9928d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return description.toString();
9938d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
99491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
9958d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    private void appendSourceDescriptionIfApplicable(StringBuilder description, int source,
9968d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            String sourceName) {
9978d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        if ((mSources & source) == source) {
9988d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            description.append(" ");
9998d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            description.append(sourceName);
10008d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
10018d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
1002c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown}
1003