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;
20ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brownimport android.hardware.input.InputManager;
218d60866e2100db70ecf0502c14768a384514d7e9Jeff Brownimport android.os.Parcel;
228d60866e2100db70ecf0502c14768a384514d7e9Jeff Brownimport android.os.Parcelable;
23a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brownimport android.os.Vibrator;
24a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brownimport android.os.NullVibrator;
25efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown
26efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brownimport java.util.ArrayList;
27efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brownimport java.util.List;
288d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
29c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown/**
30c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * Describes the capabilities of a particular input device.
31c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * <p>
329df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown * Each input device may support multiple classes of input.  For example, a multi-function
33c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * keyboard may compose the capabilities of a standard keyboard together with a track pad mouse
34c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * or other pointing device.
35c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * </p><p>
36dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * Some input devices present multiple distinguishable sources of input.
37c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * Applications can query the framework about the characteristics of each distinct source.
38c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * </p><p>
39c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * As a further wrinkle, different kinds of input sources uses different coordinate systems
40c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * to describe motion events.  Refer to the comments on the input source constants for
41c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * the appropriate interpretation.
426d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * </p>
43c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown */
448d60866e2100db70ecf0502c14768a384514d7e9Jeff Brownpublic final class InputDevice implements Parcelable {
459f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private final int mId;
46af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    private final int mGeneration;
47ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright    private final int mControllerNumber;
489f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private final String mName;
4954e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    private final int mVendorId;
5054e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    private final int mProductId;
519f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private final String mDescriptor;
52daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown    private final boolean mIsExternal;
539f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private final int mSources;
549f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private final int mKeyboardType;
559f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private final KeyCharacterMap mKeyCharacterMap;
56a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    private final boolean mHasVibrator;
577ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright    private final boolean mHasButtonUnderPad;
58efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    private final ArrayList<MotionRange> mMotionRanges = new ArrayList<MotionRange>();
5991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
60a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    private Vibrator mVibrator; // guarded by mMotionRanges during initialization
61a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown
62c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
63c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A mask for input source classes.
64c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
65c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Each distinct input source constant has one or more input source class bits set to
66c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * specify the desired interpretation for its input events.
67c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
68c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_MASK = 0x000000ff;
69e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright
70e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright    /**
71e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     * The input source has no class.
72e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     *
73e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     * It is up to the application to determine how to handle the device based on the device type.
74e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     */
75e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright    public static final int SOURCE_CLASS_NONE = 0x00000000;
76e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright
77c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
78c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source has buttons or keys.
79dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * Examples: {@link #SOURCE_KEYBOARD}, {@link #SOURCE_DPAD}.
80c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
81c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A {@link KeyEvent} should be interpreted as a button or key press.
82c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
836eb5ac9ceeb3ff67d38c7ead54b4247e762f278dJeff Brown     * Use {@link #getKeyCharacterMap} to query the device's button and key mappings.
84c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
85c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_BUTTON = 0x00000001;
86c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
87c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
88c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a pointing device associated with a display.
89c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Examples: {@link #SOURCE_TOUCHSCREEN}, {@link #SOURCE_MOUSE}.
90c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
91c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A {@link MotionEvent} should be interpreted as absolute coordinates in
92c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * display units according to the {@link View} hierarchy.  Pointer down/up indicated when
93c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * the finger touches the display or when the selection button is pressed/released.
94c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
95c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Use {@link #getMotionRange} to query the range of the pointing device.  Some devices permit
96c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * touches outside the display area so the effective range may be somewhat smaller or larger
97c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * than the actual display size.
98c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
99c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_POINTER = 0x00000002;
100c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
101c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
102c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a trackball navigation device.
103c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Examples: {@link #SOURCE_TRACKBALL}.
104c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
105c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A {@link MotionEvent} should be interpreted as relative movements in device-specific
106c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * units used for navigation purposes.  Pointer down/up indicates when the selection button
107c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * is pressed/released.
108c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
109c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Use {@link #getMotionRange} to query the range of motion.
110c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
111c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_TRACKBALL = 0x00000004;
112c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
113c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
114c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is an absolute positioning device not associated with a display
115c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * (unlike {@link #SOURCE_CLASS_POINTER}).
116c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
117c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A {@link MotionEvent} should be interpreted as absolute coordinates in
118c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * device-specific surface units.
119c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
120c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Use {@link #getMotionRange} to query the range of positions.
121c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
122c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_POSITION = 0x00000008;
123cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
124cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /**
125cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * The input source is a joystick.
126cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     *
127cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * A {@link MotionEvent} should be interpreted as absolute joystick movements.
128cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     *
129cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * Use {@link #getMotionRange} to query the range of positions.
130cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     */
131cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int SOURCE_CLASS_JOYSTICK = 0x00000010;
132cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
133c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
134c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is unknown.
135c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
136c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_UNKNOWN = 0x00000000;
137c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
138c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
139c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a keyboard.
1409df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     *
1419df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * This source indicates pretty much anything that has buttons.  Use
1429df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * {@link #getKeyboardType()} to determine whether the keyboard has alphabetic keys
1439df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * and can be used to enter text.
1449df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     *
145c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_BUTTON
146c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
147c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_KEYBOARD = 0x00000100 | SOURCE_CLASS_BUTTON;
148c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
149c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
150c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a DPad.
151c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
152c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_BUTTON
153c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
154c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_DPAD = 0x00000200 | SOURCE_CLASS_BUTTON;
155cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
156cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /**
157cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * The input source is a game pad.
158cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * (It may also be a {@link #SOURCE_JOYSTICK}).
159cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     *
160cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * @see #SOURCE_CLASS_BUTTON
161cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     */
162cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int SOURCE_GAMEPAD = 0x00000400 | SOURCE_CLASS_BUTTON;
163cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
164c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
165c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a touch screen pointing device.
166c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
167c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_POINTER
168c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
169c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_TOUCHSCREEN = 0x00001000 | SOURCE_CLASS_POINTER;
170c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
171c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
172c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a mouse pointing device.
173c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * This code is also used for other mouse-like pointing devices such as trackpads
174c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * and trackpoints.
175c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
176c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_POINTER
177c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
178c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_MOUSE = 0x00002000 | SOURCE_CLASS_POINTER;
179fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown
180fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    /**
181fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown     * The input source is a stylus pointing device.
18200710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * <p>
18300710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * Note that this bit merely indicates that an input device is capable of obtaining
18400710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * input from a stylus.  To determine whether a given touch event was produced
18500710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * by a stylus, examine the tool type returned by {@link MotionEvent#getToolType(int)}
18600710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * for each individual pointer.
18700710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * </p><p>
18800710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * A single touch event may multiple pointers with different tool types,
18900710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * such as an event that has one pointer with tool type
19000710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * {@link MotionEvent#TOOL_TYPE_FINGER} and another pointer with tool type
19100710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * {@link MotionEvent#TOOL_TYPE_STYLUS}.  So it is important to examine
19200710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * the tool type of each pointer, regardless of the source reported
19300710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * by {@link MotionEvent#getSource()}.
19400710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * </p>
195fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown     *
196fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown     * @see #SOURCE_CLASS_POINTER
197fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown     */
198fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    public static final int SOURCE_STYLUS = 0x00004000 | SOURCE_CLASS_POINTER;
199fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown
200c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
201c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a trackball.
202c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
203c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_TRACKBALL
204c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
205c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_TRACKBALL = 0x00010000 | SOURCE_CLASS_TRACKBALL;
206c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
207c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
208c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a touch pad or digitizer tablet that is not
209e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * associated with a display (unlike {@link #SOURCE_TOUCHSCREEN}).
210c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
211c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_POSITION
212c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
213c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_TOUCHPAD = 0x00100000 | SOURCE_CLASS_POSITION;
214cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
215cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /**
216e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     * The input source is a touch device whose motions should be interpreted as navigation events.
217e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     *
218e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     * For example, an upward swipe should be as an upward focus traversal in the same manner as
219e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     * pressing up on a D-Pad would be. Swipes to the left, right and down should be treated in a
220e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     * similar manner.
221e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     *
222e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     * @see #SOURCE_CLASS_NONE
223e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     */
224e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright    public static final int SOURCE_TOUCH_NAVIGATION = 0x00200000 | SOURCE_CLASS_NONE;
225e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright
226e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright    /**
227cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * The input source is a joystick.
228cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * (It may also be a {@link #SOURCE_GAMEPAD}).
229cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     *
230cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * @see #SOURCE_CLASS_JOYSTICK
231cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     */
232cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int SOURCE_JOYSTICK = 0x01000000 | SOURCE_CLASS_JOYSTICK;
233cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
2346d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
2356d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * A special input source constant that is used when filtering input devices
2366d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * to match devices that provide any type of input source.
2376d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
2386d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int SOURCE_ANY = 0xffffff00;
239c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
240e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
24191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_X}.
242e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
243e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
24491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_X} instead.
245e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
24691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
24791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_X = MotionEvent.AXIS_X;
24891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
249e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
25091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_Y}.
251e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
252e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
25391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_Y} instead.
254e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
25591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
25691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_Y = MotionEvent.AXIS_Y;
25791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
258e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
25991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_PRESSURE}.
260e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
261e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
26291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_PRESSURE} instead.
263e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
26491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
26591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_PRESSURE = MotionEvent.AXIS_PRESSURE;
26691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
267e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
26891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_SIZE}.
269e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
270e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
27191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_SIZE} instead.
272e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
27391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
27491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_SIZE = MotionEvent.AXIS_SIZE;
27591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
276e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
27791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOUCH_MAJOR}.
278e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
279e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
28091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_TOUCH_MAJOR} instead.
281e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
28291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
28391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_TOUCH_MAJOR = MotionEvent.AXIS_TOUCH_MAJOR;
28491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
285e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
28691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOUCH_MINOR}.
287e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
288e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
28991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_TOUCH_MINOR} instead.
290e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
29191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
29291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_TOUCH_MINOR = MotionEvent.AXIS_TOUCH_MINOR;
29391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
294e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
29591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOOL_MAJOR}.
296e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
297e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
29891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_TOOL_MAJOR} instead.
299e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
30091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
30191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_TOOL_MAJOR = MotionEvent.AXIS_TOOL_MAJOR;
30291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
303e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
30491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOOL_MINOR}.
305e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
306e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
30791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_TOOL_MINOR} instead.
308e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
30991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
31091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_TOOL_MINOR = MotionEvent.AXIS_TOOL_MINOR;
31191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
312e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
31391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_ORIENTATION}.
314e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
315e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
31691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_ORIENTATION} instead.
317e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
31891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
31991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_ORIENTATION = MotionEvent.AXIS_ORIENTATION;
3208d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
3216d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
3226d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * There is no keyboard.
3236d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
3246d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int KEYBOARD_TYPE_NONE = 0;
3256d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
3266d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
3276d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * The keyboard is not fully alphabetic.  It may be a numeric keypad or an assortment
3286d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * of buttons that are not mapped as alphabetic keys suitable for text input.
3296d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
3306d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int KEYBOARD_TYPE_NON_ALPHABETIC = 1;
3316d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
3326d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
3336d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * The keyboard supports a complement of alphabetic keys.
3346d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
3356d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int KEYBOARD_TYPE_ALPHABETIC = 2;
33691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
3379f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    public static final Parcelable.Creator<InputDevice> CREATOR =
3389f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            new Parcelable.Creator<InputDevice>() {
3399f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        public InputDevice createFromParcel(Parcel in) {
3409f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            return new InputDevice(in);
3419f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        }
3429f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        public InputDevice[] newArray(int size) {
3439f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            return new InputDevice[size];
3449f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        }
3459f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    };
3469f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
3478d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    // Called by native code.
34854e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    private InputDevice(int id, int generation, int controllerNumber, String name, int vendorId,
34954e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright            int productId, String descriptor, boolean isExternal, int sources, int keyboardType,
350ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright            KeyCharacterMap keyCharacterMap, boolean hasVibrator, boolean hasButtonUnderPad) {
3519f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mId = id;
352af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        mGeneration = generation;
353ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright        mControllerNumber = controllerNumber;
3549f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mName = name;
35554e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        mVendorId = vendorId;
35654e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        mProductId = productId;
3579f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mDescriptor = descriptor;
358daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown        mIsExternal = isExternal;
3599f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mSources = sources;
3609f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyboardType = keyboardType;
3619f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyCharacterMap = keyCharacterMap;
362a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown        mHasVibrator = hasVibrator;
3637ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright        mHasButtonUnderPad = hasButtonUnderPad;
3649f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
3659f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
3669f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private InputDevice(Parcel in) {
3679f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mId = in.readInt();
368af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        mGeneration = in.readInt();
369ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright        mControllerNumber = in.readInt();
3709f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mName = in.readString();
37154e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        mVendorId = in.readInt();
37254e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        mProductId = in.readInt();
3739f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mDescriptor = in.readString();
374daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown        mIsExternal = in.readInt() != 0;
3759f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mSources = in.readInt();
3769f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyboardType = in.readInt();
3779f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyCharacterMap = KeyCharacterMap.CREATOR.createFromParcel(in);
378a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown        mHasVibrator = in.readInt() != 0;
3797ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright        mHasButtonUnderPad = in.readInt() != 0;
3809f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
3819f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        for (;;) {
3829f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            int axis = in.readInt();
3839f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            if (axis < 0) {
3849f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown                break;
3859f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            }
386c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright            addMotionRange(axis, in.readInt(), in.readFloat(), in.readFloat(), in.readFloat(),
387c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright                    in.readFloat(), in.readFloat());
3889f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        }
3898d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
390e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown
391e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
392e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * Gets information about the input device with the specified id.
393e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @param id The device id.
394e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @return The input device or null if not found.
395e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
396c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static InputDevice getDevice(int id) {
3979f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return InputManager.getInstance().getInputDevice(id);
3988d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
3998d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
4008d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    /**
4018d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * Gets the ids of all input devices in the system.
4028d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * @return The input device ids.
4038d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     */
4048d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public static int[] getDeviceIds() {
4059f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return InputManager.getInstance().getInputDeviceIds();
4068d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
4079df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown
4088d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    /**
4098d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * Gets the input device id.
4109df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * <p>
4119df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * Each input device receives a unique id when it is first configured
4129df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * by the system.  The input device id may change when the system is restarted or if the
4139df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * input device is disconnected, reconnected or reconfigured at any time.
4149df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * If you require a stable identifier for a device that persists across
4159df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * boots and reconfigurations, use {@link #getDescriptor()}.
4169df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * </p>
4179df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     *
4188d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * @return The input device id.
4198d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     */
4208d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public int getId() {
4218d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return mId;
422c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
4239df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown
4249df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown    /**
425ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright     * The controller number for a given input device.
426ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright     * <p>
42710fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * Each gamepad or joystick is given a unique, positive controller number when initially
42810fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * configured by the system. This number may change due to events such as device disconnects /
42910fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * reconnects or user initiated reassignment. Any change in number will trigger an event that
43010fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * can be observed by registering an {@link InputManager.InputDeviceListener}.
43110fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * </p>
43210fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * <p>
43310fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * All input devices which are not gamepads or joysticks will be assigned a controller number
434ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright     * of 0.
435ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright     * </p>
43610fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     *
43710fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * @return The controller number of the device.
438ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright     */
439ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright    public int getControllerNumber() {
440ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright        return mControllerNumber;
441ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright    }
442ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright
443ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright    /**
444af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     * Gets a generation number for this input device.
445af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     * The generation number is incremented whenever the device is reconfigured and its
446af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     * properties may have changed.
447af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     *
448af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     * @return The generation number.
449af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     *
450af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     * @hide
451af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     */
452af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    public int getGeneration() {
453af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        return mGeneration;
454af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    }
455af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown
456af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    /**
45754e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * Gets the vendor id for the given device, if available.
45854e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * <p>
45954e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * A vendor id uniquely identifies the company who manufactured the device. A value of 0 will
46054e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * be assigned where a vendor id is not available.
46154e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * </p>
46254e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     *
46354e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * @return The vendor id of a given device
46454e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     */
46554e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    public int getVendorId() {
46654e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        return mVendorId;
46754e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    }
46854e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright
46954e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    /**
47054e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * Gets the product id for the given device, if available.
47154e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * <p>
47254e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * A product id uniquely identifies which product within the address space of a given vendor,
47354e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * identified by the device's vendor id. A value of 0 will be assigned where a product id is
47454e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * not available.
47554e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * </p>
47654e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     *
47754e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * @return The product id of a given device
47854e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     */
47954e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    public int getProductId() {
48054e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        return mProductId;
48154e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    }
48254e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright
48354e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    /**
4849df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * Gets the input device descriptor, which is a stable identifier for an input device.
4859df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * <p>
4869df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * An input device descriptor uniquely identifies an input device.  Its value
4879df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * is intended to be persistent across system restarts, and should not change even
4889df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * if the input device is disconnected, reconnected or reconfigured at any time.
489e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * </p><p>
490e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * It is possible for there to be multiple {@link InputDevice} instances that have the
491e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * same input device descriptor.  This might happen in situations where a single
492e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * human input device registers multiple {@link InputDevice} instances (HID collections)
493e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * that describe separate features of the device, such as a keyboard that also
494e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * has a trackpad.  Alternately, it may be that the input devices are simply
495e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * indistinguishable, such as two keyboards made by the same manufacturer.
496e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * </p><p>
497daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     * The input device descriptor returned by {@link #getDescriptor} should only be
498e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * used when an application needs to remember settings associated with a particular
499e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * input device.  For all other purposes when referring to a logical
500e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * {@link InputDevice} instance at runtime use the id returned by {@link #getId()}.
5019df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * </p>
5029df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     *
5039df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * @return The input device descriptor.
5049df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     */
5059df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown    public String getDescriptor() {
506e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown        return mDescriptor;
5079df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown    }
5089df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown
509c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
5109f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * Returns true if the device is a virtual input device rather than a real one,
5119f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * such as the virtual keyboard (see {@link KeyCharacterMap#VIRTUAL_KEYBOARD}).
5129f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * <p>
5139f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * Virtual input devices are provided to implement system-level functionality
5149f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * and should not be seen or configured by users.
5159f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * </p>
5169f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     *
5179f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * @return True if the device is virtual.
5189f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     *
5199f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * @see KeyCharacterMap#VIRTUAL_KEYBOARD
5209f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     */
5219f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    public boolean isVirtual() {
5229f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return mId < 0;
5239f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
5249f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
5259f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    /**
526daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     * Returns true if the device is external (connected to USB or Bluetooth or some other
527daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     * peripheral bus), otherwise it is built-in.
528daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     *
529daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     * @return True if the device is external.
530daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     *
531daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     * @hide
532daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     */
533daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown    public boolean isExternal() {
534daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown        return mIsExternal;
535daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown    }
536daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown
537daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown    /**
5387e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown     * Returns true if the device is a full keyboard.
5397e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown     *
5407e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown     * @return True if the device is a full keyboard.
5417e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown     *
5427e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown     * @hide
5437e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown     */
5447e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown    public boolean isFullKeyboard() {
5457e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown        return (mSources & SOURCE_KEYBOARD) == SOURCE_KEYBOARD
5467e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown                && mKeyboardType == KEYBOARD_TYPE_ALPHABETIC;
5477e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown    }
5487e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown
5497e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown    /**
550c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Gets the name of this input device.
551c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @return The input device name.
552c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
553c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public String getName() {
554c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mName;
555c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
556c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
557c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
558c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Gets the input sources supported by this input device as a combined bitfield.
559c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @return The supported input sources.
560c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
561c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public int getSources() {
562c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mSources;
563c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
564c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
565c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
5666d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * Gets the keyboard type.
5676d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * @return The keyboard type.
5686d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
5696d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public int getKeyboardType() {
5706d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mKeyboardType;
5716d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    }
5726d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
5736d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
574c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Gets the key character map associated with this input device.
575c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @return The key character map.
576c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
577c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public KeyCharacterMap getKeyCharacterMap() {
5789f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return mKeyCharacterMap;
5791e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown    }
5801e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown
581e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
582b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright     * Gets whether the device is capable of producing the list of keycodes.
583b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright     * @param keys The list of android keycodes to check for.
584b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright     * @return An array of booleans where each member specifies whether the device is capable of
585b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright     * generating the keycode given by the corresponding value at the same index in the keys array.
586b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright     */
587b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright    public boolean[] hasKeys(int... keys) {
588b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright        return InputManager.getInstance().deviceHasKeys(mId, keys);
589b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright    }
590b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright
591b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright    /**
59291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Gets information about the range of values for a particular {@link MotionEvent} axis.
593efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * If the device supports multiple sources, the same axis may have different meanings
594efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * for each source.  Returns information about the first axis found for any source.
595efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * To obtain information about the axis for a specific source, use
596efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * {@link #getMotionRange(int, int)}.
597efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     *
59891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @param axis The axis constant.
59991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @return The range of values, or null if the requested axis is not
600e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * supported by the device.
60191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     *
60291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @see MotionEvent#AXIS_X
60391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @see MotionEvent#AXIS_Y
604e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
60591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public MotionRange getMotionRange(int axis) {
606efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        final int numRanges = mMotionRanges.size();
607efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        for (int i = 0; i < numRanges; i++) {
608efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            final MotionRange range = mMotionRanges.get(i);
609efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            if (range.mAxis == axis) {
610efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown                return range;
611efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            }
612efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        }
613efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        return null;
614c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
61591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
6166f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    /**
617efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * Gets information about the range of values for a particular {@link MotionEvent} axis
618efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * used by a particular source on the device.
619efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * If the device supports multiple sources, the same axis may have different meanings
620efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * for each source.
621efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     *
622efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @param axis The axis constant.
623efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @param source The source for which to return information.
624efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @return The range of values, or null if the requested axis is not
625efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * supported by the device.
6266f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     *
627efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @see MotionEvent#AXIS_X
628efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @see MotionEvent#AXIS_Y
629efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     */
630efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    public MotionRange getMotionRange(int axis, int source) {
631efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        final int numRanges = mMotionRanges.size();
632efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        for (int i = 0; i < numRanges; i++) {
633efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            final MotionRange range = mMotionRanges.get(i);
634efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            if (range.mAxis == axis && range.mSource == source) {
635efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown                return range;
6366f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            }
6376f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        }
638efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        return null;
6396f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    }
6406f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown
641efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    /**
642efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * Gets the ranges for all axes supported by the device.
643efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @return The motion ranges for the device.
644efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     *
645efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @see #getMotionRange(int, int)
646efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     */
647efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    public List<MotionRange> getMotionRanges() {
648efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        return mMotionRanges;
649efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    }
650efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown
6519f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    // Called from native code.
652efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    private void addMotionRange(int axis, int source,
653c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright            float min, float max, float flat, float fuzz, float resolution) {
654c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright        mMotionRanges.add(new MotionRange(axis, source, min, max, flat, fuzz, resolution));
655c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
65691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
657e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
658a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * Gets the vibrator service associated with the device, if there is one.
659a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * Even if the device does not have a vibrator, the result is never null.
660a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * Use {@link Vibrator#hasVibrator} to determine whether a vibrator is
661a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * present.
662a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     *
663a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * Note that the vibrator associated with the device may be different from
664a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * the system vibrator.  To obtain an instance of the system vibrator instead, call
665a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * {@link Context#getSystemService} with {@link Context#VIBRATOR_SERVICE} as argument.
666a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     *
667a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * @return The vibrator service associated with the device, never null.
668a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     */
669a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    public Vibrator getVibrator() {
670a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown        synchronized (mMotionRanges) {
671a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown            if (mVibrator == null) {
672a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown                if (mHasVibrator) {
673a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown                    mVibrator = InputManager.getInstance().getInputDeviceVibrator(mId);
674a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown                } else {
675a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown                    mVibrator = NullVibrator.getInstance();
676a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown                }
677a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown            }
678a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown            return mVibrator;
679a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown        }
680a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    }
681a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown
682a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    /**
6837ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright     * Reports whether the device has a button under its touchpad
6847ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright     * @return Whether the device has a button under its touchpad
6857ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright     * @hide
6867ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright     */
6877ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright    public boolean hasButtonUnderPad() {
6887ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright        return mHasButtonUnderPad;
6897ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright    }
6907ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright
6917ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright    /**
69291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Provides information about the range of values for a particular {@link MotionEvent} axis.
69391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     *
69491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @see InputDevice#getMotionRange(int)
695e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
696c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final class MotionRange {
697efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        private int mAxis;
698efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        private int mSource;
6998d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mMin;
7008d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mMax;
7018d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mFlat;
7028d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mFuzz;
703c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright        private float mResolution;
70491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
705c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright        private MotionRange(int axis, int source, float min, float max, float flat, float fuzz,
706c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright                float resolution) {
707efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            mAxis = axis;
708efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            mSource = source;
7098d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mMin = min;
7108d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mMax = max;
7118d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mFlat = flat;
7128d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mFuzz = fuzz;
713c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright            mResolution = resolution;
7148d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
71591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
716e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
717efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         * Gets the axis id.
718efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         * @return The axis id.
719efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         */
720efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        public int getAxis() {
721efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            return mAxis;
722efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        }
723efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown
724efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        /**
725efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         * Gets the source for which the axis is defined.
726efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         * @return The source.
727efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         */
728efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        public int getSource() {
729efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            return mSource;
730efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        }
731efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown
73274e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright
73374e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright        /**
73474e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         * Determines whether the event is from the given source.
73574e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         *
73674e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         * @param source The input source to check against. This can be a specific device type,
73774e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         * such as {@link InputDevice#SOURCE_TOUCH_NAVIGATION}, or a more generic device class,
73874e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         * such as {@link InputDevice#SOURCE_CLASS_POINTER}.
73974e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         * @return Whether the event is from the given source.
74074e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         */
74174e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright        public boolean isFromSource(int source) {
74274e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright            return (getSource() & source) == source;
74374e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright        }
74474e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright
745efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        /**
7466f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * Gets the inclusive minimum value for the axis.
7476f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * @return The inclusive minimum value.
748e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
749e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getMin() {
7508d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mMin;
751e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
75291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
753e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
7546f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * Gets the inclusive maximum value for the axis.
7556f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * @return The inclusive maximum value.
756e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
757e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getMax() {
7588d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mMax;
759e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
76091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
761e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
7626f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * Gets the range of the axis (difference between maximum and minimum).
763e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * @return The range of values.
764e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
765e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getRange() {
7666f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            return mMax - mMin;
767e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
76891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
769e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
77091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown         * Gets the extent of the center flat position with respect to this axis.
7716f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * <p>
772e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * For example, a flat value of 8 means that the center position is between -8 and +8.
773dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown         * This value is mainly useful for calibrating self-centering devices.
7746f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * </p>
775e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * @return The extent of the center flat position.
776e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
777e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getFlat() {
7788d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mFlat;
779e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
78091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
781e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
78291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown         * Gets the error tolerance for input device measurements with respect to this axis.
7836f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * <p>
784e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * For example, a value of 2 indicates that the measured value may be up to +/- 2 units
785e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * away from the actual value due to noise and device sensitivity limitations.
7866f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * </p>
787e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * @return The error tolerance.
788e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
789e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getFuzz() {
7908d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mFuzz;
7918d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
792c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright
793c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright        /**
794c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright         * Gets the resolution for input device measurements with respect to this axis.
795c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright         * @return The resolution in units per millimeter, or units per radian for rotational axes.
796c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright         */
797c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright        public float getResolution() {
798c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright            return mResolution;
799c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright        }
8008d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
80191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
8028d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    @Override
8038d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public void writeToParcel(Parcel out, int flags) {
8048d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(mId);
805af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        out.writeInt(mGeneration);
806ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright        out.writeInt(mControllerNumber);
8078d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeString(mName);
80854e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        out.writeInt(mVendorId);
80954e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        out.writeInt(mProductId);
810e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown        out.writeString(mDescriptor);
811daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown        out.writeInt(mIsExternal ? 1 : 0);
8128d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(mSources);
8138d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(mKeyboardType);
8149f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyCharacterMap.writeToParcel(out, flags);
815a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown        out.writeInt(mHasVibrator ? 1 : 0);
8167ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright        out.writeInt(mHasButtonUnderPad ? 1 : 0);
81791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
818efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        final int numRanges = mMotionRanges.size();
819efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        for (int i = 0; i < numRanges; i++) {
820efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            MotionRange range = mMotionRanges.get(i);
821efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            out.writeInt(range.mAxis);
822efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            out.writeInt(range.mSource);
82391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            out.writeFloat(range.mMin);
82491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            out.writeFloat(range.mMax);
82591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            out.writeFloat(range.mFlat);
82691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            out.writeFloat(range.mFuzz);
827c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright            out.writeFloat(range.mResolution);
8288d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
8298d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(-1);
8308d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
83191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
8328d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    @Override
8338d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public int describeContents() {
8348d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return 0;
8358d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
83691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
8378d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    @Override
8388d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public String toString() {
8398d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        StringBuilder description = new StringBuilder();
8408d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        description.append("Input Device ").append(mId).append(": ").append(mName).append("\n");
841e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown        description.append("  Descriptor: ").append(mDescriptor).append("\n");
842af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        description.append("  Generation: ").append(mGeneration).append("\n");
843daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown        description.append("  Location: ").append(mIsExternal ? "external" : "built-in").append("\n");
844e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown
8458d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        description.append("  Keyboard Type: ");
8468d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        switch (mKeyboardType) {
8478d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            case KEYBOARD_TYPE_NONE:
8488d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                description.append("none");
8498d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                break;
8508d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            case KEYBOARD_TYPE_NON_ALPHABETIC:
8518d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                description.append("non-alphabetic");
8528d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                break;
8538d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            case KEYBOARD_TYPE_ALPHABETIC:
8548d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                description.append("alphabetic");
8558d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                break;
8568d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
8578d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        description.append("\n");
85891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
859a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown        description.append("  Has Vibrator: ").append(mHasVibrator).append("\n");
860a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown
861efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        description.append("  Sources: 0x").append(Integer.toHexString(mSources)).append(" (");
8628d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_KEYBOARD, "keyboard");
8638d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_DPAD, "dpad");
8648d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_TOUCHSCREEN, "touchscreen");
8658d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_MOUSE, "mouse");
866fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_STYLUS, "stylus");
8678d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_TRACKBALL, "trackball");
8688d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_TOUCHPAD, "touchpad");
86991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_JOYSTICK, "joystick");
87091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_GAMEPAD, "gamepad");
87191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        description.append(" )\n");
87291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
87391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        final int numAxes = mMotionRanges.size();
87491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        for (int i = 0; i < numAxes; i++) {
875efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            MotionRange range = mMotionRanges.get(i);
876efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            description.append("    ").append(MotionEvent.axisToString(range.mAxis));
877efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            description.append(": source=0x").append(Integer.toHexString(range.mSource));
878efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            description.append(" min=").append(range.mMin);
87991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            description.append(" max=").append(range.mMax);
88091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            description.append(" flat=").append(range.mFlat);
88191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            description.append(" fuzz=").append(range.mFuzz);
882c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright            description.append(" resolution=").append(range.mResolution);
88391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            description.append("\n");
88491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        }
8858d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return description.toString();
8868d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
88791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
8888d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    private void appendSourceDescriptionIfApplicable(StringBuilder description, int source,
8898d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            String sourceName) {
8908d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        if ((mSources & source) == source) {
8918d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            description.append(" ");
8928d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            description.append(sourceName);
8938d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
8948d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
895c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown}
896