InputDevice.java revision ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cd
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;
597ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright    private final boolean mHasButtonUnderPad;
60efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    private final ArrayList<MotionRange> mMotionRanges = new ArrayList<MotionRange>();
6191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
62a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    private Vibrator mVibrator; // guarded by mMotionRanges during initialization
63a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown
64c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
65c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A mask for input source classes.
66ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
67c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Each distinct input source constant has one or more input source class bits set to
68c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * specify the desired interpretation for its input events.
69c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
70c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_MASK = 0x000000ff;
71e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright
72e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright    /**
73e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     * The input source has no class.
74e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     *
75e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     * It is up to the application to determine how to handle the device based on the device type.
76e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     */
77e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright    public static final int SOURCE_CLASS_NONE = 0x00000000;
78e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright
79c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
80c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source has buttons or keys.
81dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * Examples: {@link #SOURCE_KEYBOARD}, {@link #SOURCE_DPAD}.
82ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
83c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A {@link KeyEvent} should be interpreted as a button or key press.
84ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
856eb5ac9ceeb3ff67d38c7ead54b4247e762f278dJeff Brown     * Use {@link #getKeyCharacterMap} to query the device's button and key mappings.
86c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
87c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_BUTTON = 0x00000001;
88ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
89c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
90c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a pointing device associated with a display.
91c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Examples: {@link #SOURCE_TOUCHSCREEN}, {@link #SOURCE_MOUSE}.
92ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
93c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A {@link MotionEvent} should be interpreted as absolute coordinates in
94c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * display units according to the {@link View} hierarchy.  Pointer down/up indicated when
95c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * the finger touches the display or when the selection button is pressed/released.
96ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
97c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Use {@link #getMotionRange} to query the range of the pointing device.  Some devices permit
98c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * touches outside the display area so the effective range may be somewhat smaller or larger
99c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * than the actual display size.
100c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
101c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_POINTER = 0x00000002;
102ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
103c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
104c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a trackball navigation device.
105c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Examples: {@link #SOURCE_TRACKBALL}.
106ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
107c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A {@link MotionEvent} should be interpreted as relative movements in device-specific
108c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * units used for navigation purposes.  Pointer down/up indicates when the selection button
109c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * is pressed/released.
110ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
111c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Use {@link #getMotionRange} to query the range of motion.
112c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
113c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_TRACKBALL = 0x00000004;
114ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
115c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
116c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is an absolute positioning device not associated with a display
117c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * (unlike {@link #SOURCE_CLASS_POINTER}).
118ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
119c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A {@link MotionEvent} should be interpreted as absolute coordinates in
120c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * device-specific surface units.
121ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
122c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Use {@link #getMotionRange} to query the range of positions.
123c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
124c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_POSITION = 0x00000008;
125cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
126cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /**
127cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * The input source is a joystick.
128cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     *
129cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * A {@link MotionEvent} should be interpreted as absolute joystick movements.
130cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     *
131cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * Use {@link #getMotionRange} to query the range of positions.
132cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     */
133cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int SOURCE_CLASS_JOYSTICK = 0x00000010;
134cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
135c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
136c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is unknown.
137c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
138c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_UNKNOWN = 0x00000000;
139ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
140c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
141c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a keyboard.
1429df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     *
1439df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * This source indicates pretty much anything that has buttons.  Use
1449df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * {@link #getKeyboardType()} to determine whether the keyboard has alphabetic keys
1459df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * and can be used to enter text.
1469df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     *
147c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_BUTTON
148c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
149c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_KEYBOARD = 0x00000100 | SOURCE_CLASS_BUTTON;
150ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
151c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
152c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a DPad.
153ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
154c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_BUTTON
155c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
156c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_DPAD = 0x00000200 | SOURCE_CLASS_BUTTON;
157cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
158cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /**
159cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * The input source is a game pad.
160cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * (It may also be a {@link #SOURCE_JOYSTICK}).
161cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     *
162cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * @see #SOURCE_CLASS_BUTTON
163cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     */
164cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int SOURCE_GAMEPAD = 0x00000400 | SOURCE_CLASS_BUTTON;
165cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
166c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
167c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a touch screen pointing device.
168ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
169c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_POINTER
170c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
171c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_TOUCHSCREEN = 0x00001000 | SOURCE_CLASS_POINTER;
172ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
173c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
174c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a mouse pointing device.
175c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * This code is also used for other mouse-like pointing devices such as trackpads
176c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * and trackpoints.
177ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
178c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_POINTER
179c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
180c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_MOUSE = 0x00002000 | SOURCE_CLASS_POINTER;
181fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown
182fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    /**
183fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown     * The input source is a stylus pointing device.
18400710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * <p>
18500710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * Note that this bit merely indicates that an input device is capable of obtaining
18600710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * input from a stylus.  To determine whether a given touch event was produced
18700710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * by a stylus, examine the tool type returned by {@link MotionEvent#getToolType(int)}
18800710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * for each individual pointer.
18900710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * </p><p>
19000710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * A single touch event may multiple pointers with different tool types,
19100710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * such as an event that has one pointer with tool type
19200710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * {@link MotionEvent#TOOL_TYPE_FINGER} and another pointer with tool type
19300710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * {@link MotionEvent#TOOL_TYPE_STYLUS}.  So it is important to examine
19400710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * the tool type of each pointer, regardless of the source reported
19500710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * by {@link MotionEvent#getSource()}.
19600710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * </p>
197fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown     *
198fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown     * @see #SOURCE_CLASS_POINTER
199fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown     */
200fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    public static final int SOURCE_STYLUS = 0x00004000 | SOURCE_CLASS_POINTER;
201fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown
202c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
203c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a trackball.
204ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
205c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_TRACKBALL
206c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
207c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_TRACKBALL = 0x00010000 | SOURCE_CLASS_TRACKBALL;
208ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
209c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
210c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a touch pad or digitizer tablet that is not
211e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * associated with a display (unlike {@link #SOURCE_TOUCHSCREEN}).
212ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
213c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_POSITION
214c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
215c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_TOUCHPAD = 0x00100000 | SOURCE_CLASS_POSITION;
216cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
217cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /**
218e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     * The input source is a touch device whose motions should be interpreted as navigation events.
219e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     *
220e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     * For example, an upward swipe should be as an upward focus traversal in the same manner as
221e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     * pressing up on a D-Pad would be. Swipes to the left, right and down should be treated in a
222e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     * similar manner.
223e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     *
224e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     * @see #SOURCE_CLASS_NONE
225e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     */
226e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright    public static final int SOURCE_TOUCH_NAVIGATION = 0x00200000 | SOURCE_CLASS_NONE;
227e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright
228e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright    /**
229cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * The input source is a joystick.
230cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * (It may also be a {@link #SOURCE_GAMEPAD}).
231cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     *
232cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * @see #SOURCE_CLASS_JOYSTICK
233cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     */
234cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int SOURCE_JOYSTICK = 0x01000000 | SOURCE_CLASS_JOYSTICK;
235cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
2366d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
2376d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * A special input source constant that is used when filtering input devices
2386d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * to match devices that provide any type of input source.
2396d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
2406d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int SOURCE_ANY = 0xffffff00;
241c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
242e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
24391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_X}.
244ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
245e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
24691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_X} instead.
247e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
24891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
24991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_X = MotionEvent.AXIS_X;
25091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
251e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
25291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_Y}.
253ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
254e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
25591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_Y} instead.
256e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
25791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
25891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_Y = MotionEvent.AXIS_Y;
25991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
260e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
26191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_PRESSURE}.
262ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
263e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
26491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_PRESSURE} instead.
265e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
26691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
26791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_PRESSURE = MotionEvent.AXIS_PRESSURE;
26891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
269e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
27091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_SIZE}.
271ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
272e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
27391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_SIZE} instead.
274e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
27591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
27691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_SIZE = MotionEvent.AXIS_SIZE;
27791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
278e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
27991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOUCH_MAJOR}.
280ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
281e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
28291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_TOUCH_MAJOR} instead.
283e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
28491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
28591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_TOUCH_MAJOR = MotionEvent.AXIS_TOUCH_MAJOR;
28691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
287e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
28891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOUCH_MINOR}.
289ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
290e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
29191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_TOUCH_MINOR} instead.
292e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
29391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
29491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_TOUCH_MINOR = MotionEvent.AXIS_TOUCH_MINOR;
29591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
296e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
29791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOOL_MAJOR}.
298ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
299e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
30091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_TOOL_MAJOR} instead.
301e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
30291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
30391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_TOOL_MAJOR = MotionEvent.AXIS_TOOL_MAJOR;
30491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
305e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
30691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOOL_MINOR}.
307ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
308e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
30991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_TOOL_MINOR} instead.
310e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
31191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
31291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_TOOL_MINOR = MotionEvent.AXIS_TOOL_MINOR;
31391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
314e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
31591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_ORIENTATION}.
316ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
317e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
31891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_ORIENTATION} instead.
319e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
32091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
32191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_ORIENTATION = MotionEvent.AXIS_ORIENTATION;
322ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
3236d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
3246d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * There is no keyboard.
3256d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
3266d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int KEYBOARD_TYPE_NONE = 0;
327ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
3286d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
3296d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * The keyboard is not fully alphabetic.  It may be a numeric keypad or an assortment
3306d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * of buttons that are not mapped as alphabetic keys suitable for text input.
3316d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
3326d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int KEYBOARD_TYPE_NON_ALPHABETIC = 1;
333ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
3346d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
3356d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * The keyboard supports a complement of alphabetic keys.
3366d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
3376d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int KEYBOARD_TYPE_ALPHABETIC = 2;
33891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
3399f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    public static final Parcelable.Creator<InputDevice> CREATOR =
3409f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            new Parcelable.Creator<InputDevice>() {
3419f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        public InputDevice createFromParcel(Parcel in) {
3429f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            return new InputDevice(in);
3439f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        }
3449f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        public InputDevice[] newArray(int size) {
3459f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            return new InputDevice[size];
3469f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        }
3479f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    };
3489f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
3498d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    // Called by native code.
35054e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    private InputDevice(int id, int generation, int controllerNumber, String name, int vendorId,
35154e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright            int productId, String descriptor, boolean isExternal, int sources, int keyboardType,
352ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright            KeyCharacterMap keyCharacterMap, boolean hasVibrator, boolean hasButtonUnderPad) {
3539f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mId = id;
354af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        mGeneration = generation;
355ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright        mControllerNumber = controllerNumber;
3569f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mName = name;
35754e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        mVendorId = vendorId;
35854e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        mProductId = productId;
3599f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mDescriptor = descriptor;
360daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown        mIsExternal = isExternal;
3619f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mSources = sources;
3629f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyboardType = keyboardType;
3639f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyCharacterMap = keyCharacterMap;
364a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown        mHasVibrator = hasVibrator;
3657ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright        mHasButtonUnderPad = hasButtonUnderPad;
366ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik        mIdentifier = new InputDeviceIdentifier(descriptor, vendorId, productId);
3679f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
3689f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
3699f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private InputDevice(Parcel in) {
3709f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mId = in.readInt();
371af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        mGeneration = in.readInt();
372ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright        mControllerNumber = in.readInt();
3739f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mName = in.readString();
37454e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        mVendorId = in.readInt();
37554e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        mProductId = in.readInt();
3769f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mDescriptor = in.readString();
377daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown        mIsExternal = in.readInt() != 0;
3789f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mSources = in.readInt();
3799f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyboardType = in.readInt();
3809f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyCharacterMap = KeyCharacterMap.CREATOR.createFromParcel(in);
381a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown        mHasVibrator = in.readInt() != 0;
3827ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright        mHasButtonUnderPad = in.readInt() != 0;
383ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik        mIdentifier = new InputDeviceIdentifier(mDescriptor, mVendorId, mProductId);
3849f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
3859f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        for (;;) {
3869f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            int axis = in.readInt();
3879f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            if (axis < 0) {
3889f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown                break;
3899f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            }
390c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright            addMotionRange(axis, in.readInt(), in.readFloat(), in.readFloat(), in.readFloat(),
391c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright                    in.readFloat(), in.readFloat());
3929f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        }
3938d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
394e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown
395e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
396e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * Gets information about the input device with the specified id.
397e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @param id The device id.
398e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @return The input device or null if not found.
399e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
400c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static InputDevice getDevice(int id) {
4019f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return InputManager.getInstance().getInputDevice(id);
4028d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
403ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
4048d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    /**
4058d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * Gets the ids of all input devices in the system.
4068d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * @return The input device ids.
4078d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     */
4088d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public static int[] getDeviceIds() {
4099f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return InputManager.getInstance().getInputDeviceIds();
4108d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
4119df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown
4128d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    /**
4138d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * Gets the input device id.
4149df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * <p>
4159df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * Each input device receives a unique id when it is first configured
4169df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * by the system.  The input device id may change when the system is restarted or if the
4179df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * input device is disconnected, reconnected or reconfigured at any time.
4189df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * If you require a stable identifier for a device that persists across
4199df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * boots and reconfigurations, use {@link #getDescriptor()}.
4209df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * </p>
4219df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     *
4228d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * @return The input device id.
4238d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     */
4248d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public int getId() {
4258d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return mId;
426c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
4279df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown
4289df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown    /**
429ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright     * The controller number for a given input device.
430ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright     * <p>
43110fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * Each gamepad or joystick is given a unique, positive controller number when initially
43210fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * configured by the system. This number may change due to events such as device disconnects /
43310fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * reconnects or user initiated reassignment. Any change in number will trigger an event that
43410fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * can be observed by registering an {@link InputManager.InputDeviceListener}.
43510fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * </p>
43610fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * <p>
43710fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * All input devices which are not gamepads or joysticks will be assigned a controller number
438ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright     * of 0.
439ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright     * </p>
44010fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     *
44110fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * @return The controller number of the device.
442ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright     */
443ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright    public int getControllerNumber() {
444ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright        return mControllerNumber;
445ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright    }
446ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright
447ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright    /**
448ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     * The set of identifying information for type of input device. This
449ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     * information can be used by the system to configure appropriate settings
450ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     * for the device.
451ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
452ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     * @return The identifier object for this device
453ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     * @hide
454ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     */
455ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik    public InputDeviceIdentifier getIdentifier() {
456ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik        return mIdentifier;
457ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik    }
458ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
459ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik    /**
460af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     * Gets a generation number for this input device.
461af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     * The generation number is incremented whenever the device is reconfigured and its
462af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     * properties may have changed.
463af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     *
464af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     * @return The generation number.
465af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     *
466af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     * @hide
467af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     */
468af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    public int getGeneration() {
469af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        return mGeneration;
470af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    }
471af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown
472af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    /**
47354e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * Gets the vendor id for the given device, if available.
47454e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * <p>
47554e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * A vendor id uniquely identifies the company who manufactured the device. A value of 0 will
47654e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * be assigned where a vendor id is not available.
47754e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * </p>
47854e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     *
47954e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * @return The vendor id of a given device
48054e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     */
48154e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    public int getVendorId() {
48254e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        return mVendorId;
48354e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    }
48454e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright
48554e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    /**
48654e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * Gets the product id for the given device, if available.
48754e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * <p>
48854e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * A product id uniquely identifies which product within the address space of a given vendor,
48954e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * identified by the device's vendor id. A value of 0 will be assigned where a product id is
49054e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * not available.
49154e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * </p>
49254e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     *
49354e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * @return The product id of a given device
49454e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     */
49554e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    public int getProductId() {
49654e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        return mProductId;
49754e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    }
49854e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright
49954e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    /**
5009df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * Gets the input device descriptor, which is a stable identifier for an input device.
5019df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * <p>
5029df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * An input device descriptor uniquely identifies an input device.  Its value
5039df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * is intended to be persistent across system restarts, and should not change even
5049df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * if the input device is disconnected, reconnected or reconfigured at any time.
505e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * </p><p>
506e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * It is possible for there to be multiple {@link InputDevice} instances that have the
507e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * same input device descriptor.  This might happen in situations where a single
508e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * human input device registers multiple {@link InputDevice} instances (HID collections)
509e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * that describe separate features of the device, such as a keyboard that also
510e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * has a trackpad.  Alternately, it may be that the input devices are simply
511e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * indistinguishable, such as two keyboards made by the same manufacturer.
512e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * </p><p>
513daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     * The input device descriptor returned by {@link #getDescriptor} should only be
514e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * used when an application needs to remember settings associated with a particular
515e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * input device.  For all other purposes when referring to a logical
516e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * {@link InputDevice} instance at runtime use the id returned by {@link #getId()}.
5179df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * </p>
5189df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     *
5199df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * @return The input device descriptor.
5209df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     */
5219df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown    public String getDescriptor() {
522e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown        return mDescriptor;
5239df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown    }
5249df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown
525c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
5269f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * Returns true if the device is a virtual input device rather than a real one,
5279f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * such as the virtual keyboard (see {@link KeyCharacterMap#VIRTUAL_KEYBOARD}).
5289f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * <p>
5299f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * Virtual input devices are provided to implement system-level functionality
5309f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * and should not be seen or configured by users.
5319f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * </p>
5329f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     *
5339f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * @return True if the device is virtual.
5349f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     *
5359f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * @see KeyCharacterMap#VIRTUAL_KEYBOARD
5369f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     */
5379f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    public boolean isVirtual() {
5389f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return mId < 0;
5399f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
5409f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
5419f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    /**
542daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     * Returns true if the device is external (connected to USB or Bluetooth or some other
543daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     * peripheral bus), otherwise it is built-in.
544daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     *
545daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     * @return True if the device is external.
546daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     *
547daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     * @hide
548daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     */
549daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown    public boolean isExternal() {
550daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown        return mIsExternal;
551daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown    }
552daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown
553daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown    /**
5547e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown     * Returns true if the device is a full keyboard.
5557e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown     *
5567e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown     * @return True if the device is a full keyboard.
5577e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown     *
5587e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown     * @hide
5597e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown     */
5607e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown    public boolean isFullKeyboard() {
5617e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown        return (mSources & SOURCE_KEYBOARD) == SOURCE_KEYBOARD
5627e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown                && mKeyboardType == KEYBOARD_TYPE_ALPHABETIC;
5637e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown    }
5647e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown
5657e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown    /**
566c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Gets the name of this input device.
567c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @return The input device name.
568c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
569c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public String getName() {
570c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mName;
571c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
572ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
573c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
574c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Gets the input sources supported by this input device as a combined bitfield.
575c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @return The supported input sources.
576c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
577c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public int getSources() {
578c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mSources;
579c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
580ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
581c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
5826d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * Gets the keyboard type.
5836d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * @return The keyboard type.
5846d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
5856d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public int getKeyboardType() {
5866d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mKeyboardType;
5876d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    }
588ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
5896d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
590c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Gets the key character map associated with this input device.
591c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @return The key character map.
592c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
593c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public KeyCharacterMap getKeyCharacterMap() {
5949f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return mKeyCharacterMap;
5951e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown    }
5961e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown
597e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
598b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright     * Gets whether the device is capable of producing the list of keycodes.
599b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright     * @param keys The list of android keycodes to check for.
600b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright     * @return An array of booleans where each member specifies whether the device is capable of
601b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright     * generating the keycode given by the corresponding value at the same index in the keys array.
602b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright     */
603b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright    public boolean[] hasKeys(int... keys) {
604b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright        return InputManager.getInstance().deviceHasKeys(mId, keys);
605b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright    }
606b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright
607b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright    /**
60891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Gets information about the range of values for a particular {@link MotionEvent} axis.
609efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * If the device supports multiple sources, the same axis may have different meanings
610efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * for each source.  Returns information about the first axis found for any source.
611efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * To obtain information about the axis for a specific source, use
612efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * {@link #getMotionRange(int, int)}.
613efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     *
61491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @param axis The axis constant.
61591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @return The range of values, or null if the requested axis is not
616e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * supported by the device.
61791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     *
61891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @see MotionEvent#AXIS_X
61991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @see MotionEvent#AXIS_Y
620e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
62191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public MotionRange getMotionRange(int axis) {
622efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        final int numRanges = mMotionRanges.size();
623efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        for (int i = 0; i < numRanges; i++) {
624efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            final MotionRange range = mMotionRanges.get(i);
625efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            if (range.mAxis == axis) {
626efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown                return range;
627efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            }
628efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        }
629efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        return null;
630c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
63191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
6326f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    /**
633efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * Gets information about the range of values for a particular {@link MotionEvent} axis
634efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * used by a particular source on the device.
635efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * If the device supports multiple sources, the same axis may have different meanings
636efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * for each source.
637efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     *
638efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @param axis The axis constant.
639efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @param source The source for which to return information.
640efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @return The range of values, or null if the requested axis is not
641efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * supported by the device.
6426f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     *
643efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @see MotionEvent#AXIS_X
644efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @see MotionEvent#AXIS_Y
645efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     */
646efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    public MotionRange getMotionRange(int axis, int source) {
647efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        final int numRanges = mMotionRanges.size();
648efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        for (int i = 0; i < numRanges; i++) {
649efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            final MotionRange range = mMotionRanges.get(i);
650efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            if (range.mAxis == axis && range.mSource == source) {
651efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown                return range;
6526f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            }
6536f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        }
654efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        return null;
6556f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    }
6566f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown
657efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    /**
658efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * Gets the ranges for all axes supported by the device.
659efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @return The motion ranges for the device.
660efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     *
661efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @see #getMotionRange(int, int)
662efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     */
663efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    public List<MotionRange> getMotionRanges() {
664efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        return mMotionRanges;
665efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    }
666efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown
6679f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    // Called from native code.
668efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    private void addMotionRange(int axis, int source,
669c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright            float min, float max, float flat, float fuzz, float resolution) {
670c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright        mMotionRanges.add(new MotionRange(axis, source, min, max, flat, fuzz, resolution));
671c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
67291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
673e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
674a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * Gets the vibrator service associated with the device, if there is one.
675a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * Even if the device does not have a vibrator, the result is never null.
676a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * Use {@link Vibrator#hasVibrator} to determine whether a vibrator is
677a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * present.
678a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     *
679a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * Note that the vibrator associated with the device may be different from
680a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * the system vibrator.  To obtain an instance of the system vibrator instead, call
681a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * {@link Context#getSystemService} with {@link Context#VIBRATOR_SERVICE} as argument.
682a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     *
683a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * @return The vibrator service associated with the device, never null.
684a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     */
685a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    public Vibrator getVibrator() {
686a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown        synchronized (mMotionRanges) {
687a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown            if (mVibrator == null) {
688a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown                if (mHasVibrator) {
689a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown                    mVibrator = InputManager.getInstance().getInputDeviceVibrator(mId);
690a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown                } else {
691a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown                    mVibrator = NullVibrator.getInstance();
692a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown                }
693a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown            }
694a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown            return mVibrator;
695a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown        }
696a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    }
697a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown
698a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    /**
6997ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright     * Reports whether the device has a button under its touchpad
7007ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright     * @return Whether the device has a button under its touchpad
7017ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright     * @hide
7027ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright     */
7037ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright    public boolean hasButtonUnderPad() {
7047ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright        return mHasButtonUnderPad;
7057ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright    }
7067ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright
7077ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright    /**
70891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Provides information about the range of values for a particular {@link MotionEvent} axis.
70991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     *
71091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @see InputDevice#getMotionRange(int)
711e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
712c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final class MotionRange {
713efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        private int mAxis;
714efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        private int mSource;
7158d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mMin;
7168d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mMax;
7178d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mFlat;
7188d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mFuzz;
719c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright        private float mResolution;
72091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
721c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright        private MotionRange(int axis, int source, float min, float max, float flat, float fuzz,
722c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright                float resolution) {
723efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            mAxis = axis;
724efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            mSource = source;
7258d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mMin = min;
7268d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mMax = max;
7278d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mFlat = flat;
7288d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mFuzz = fuzz;
729c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright            mResolution = resolution;
7308d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
73191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
732e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
733efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         * Gets the axis id.
734efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         * @return The axis id.
735efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         */
736efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        public int getAxis() {
737efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            return mAxis;
738efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        }
739efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown
740efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        /**
741efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         * Gets the source for which the axis is defined.
742efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         * @return The source.
743efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         */
744efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        public int getSource() {
745efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            return mSource;
746efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        }
747efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown
74874e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright
74974e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright        /**
75074e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         * Determines whether the event is from the given source.
75174e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         *
75274e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         * @param source The input source to check against. This can be a specific device type,
75374e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         * such as {@link InputDevice#SOURCE_TOUCH_NAVIGATION}, or a more generic device class,
75474e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         * such as {@link InputDevice#SOURCE_CLASS_POINTER}.
75574e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         * @return Whether the event is from the given source.
75674e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         */
75774e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright        public boolean isFromSource(int source) {
75874e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright            return (getSource() & source) == source;
75974e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright        }
76074e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright
761efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        /**
7626f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * Gets the inclusive minimum value for the axis.
7636f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * @return The inclusive minimum value.
764e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
765e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getMin() {
7668d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mMin;
767e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
76891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
769e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
7706f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * Gets the inclusive maximum value for the axis.
7716f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * @return The inclusive maximum value.
772e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
773e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getMax() {
7748d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mMax;
775e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
77691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
777e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
7786f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * Gets the range of the axis (difference between maximum and minimum).
779e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * @return The range of values.
780e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
781e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getRange() {
7826f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            return mMax - mMin;
783e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
78491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
785e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
78691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown         * Gets the extent of the center flat position with respect to this axis.
7876f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * <p>
788e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * For example, a flat value of 8 means that the center position is between -8 and +8.
789dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown         * This value is mainly useful for calibrating self-centering devices.
7906f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * </p>
791e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * @return The extent of the center flat position.
792e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
793e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getFlat() {
7948d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mFlat;
795e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
79691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
797e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
79891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown         * Gets the error tolerance for input device measurements with respect to this axis.
7996f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * <p>
800e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * For example, a value of 2 indicates that the measured value may be up to +/- 2 units
801e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * away from the actual value due to noise and device sensitivity limitations.
8026f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * </p>
803e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * @return The error tolerance.
804e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
805e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getFuzz() {
8068d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mFuzz;
8078d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
808c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright
809c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright        /**
810c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright         * Gets the resolution for input device measurements with respect to this axis.
811c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright         * @return The resolution in units per millimeter, or units per radian for rotational axes.
812c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright         */
813c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright        public float getResolution() {
814c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright            return mResolution;
815c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright        }
8168d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
81791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
8188d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    @Override
8198d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public void writeToParcel(Parcel out, int flags) {
8208d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(mId);
821af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        out.writeInt(mGeneration);
822ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright        out.writeInt(mControllerNumber);
8238d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeString(mName);
82454e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        out.writeInt(mVendorId);
82554e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        out.writeInt(mProductId);
826e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown        out.writeString(mDescriptor);
827daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown        out.writeInt(mIsExternal ? 1 : 0);
8288d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(mSources);
8298d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(mKeyboardType);
8309f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyCharacterMap.writeToParcel(out, flags);
831a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown        out.writeInt(mHasVibrator ? 1 : 0);
8327ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright        out.writeInt(mHasButtonUnderPad ? 1 : 0);
83391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
834efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        final int numRanges = mMotionRanges.size();
835efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        for (int i = 0; i < numRanges; i++) {
836efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            MotionRange range = mMotionRanges.get(i);
837efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            out.writeInt(range.mAxis);
838efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            out.writeInt(range.mSource);
83991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            out.writeFloat(range.mMin);
84091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            out.writeFloat(range.mMax);
84191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            out.writeFloat(range.mFlat);
84291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            out.writeFloat(range.mFuzz);
843c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright            out.writeFloat(range.mResolution);
8448d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
8458d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(-1);
8468d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
84791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
8488d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    @Override
8498d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public int describeContents() {
8508d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return 0;
8518d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
85291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
8538d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    @Override
8548d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public String toString() {
8558d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        StringBuilder description = new StringBuilder();
8568d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        description.append("Input Device ").append(mId).append(": ").append(mName).append("\n");
857e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown        description.append("  Descriptor: ").append(mDescriptor).append("\n");
858af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        description.append("  Generation: ").append(mGeneration).append("\n");
859daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown        description.append("  Location: ").append(mIsExternal ? "external" : "built-in").append("\n");
860e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown
8618d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        description.append("  Keyboard Type: ");
8628d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        switch (mKeyboardType) {
8638d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            case KEYBOARD_TYPE_NONE:
8648d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                description.append("none");
8658d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                break;
8668d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            case KEYBOARD_TYPE_NON_ALPHABETIC:
8678d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                description.append("non-alphabetic");
8688d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                break;
8698d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            case KEYBOARD_TYPE_ALPHABETIC:
8708d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                description.append("alphabetic");
8718d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                break;
8728d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
8738d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        description.append("\n");
87491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
875a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown        description.append("  Has Vibrator: ").append(mHasVibrator).append("\n");
876a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown
877efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        description.append("  Sources: 0x").append(Integer.toHexString(mSources)).append(" (");
8788d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_KEYBOARD, "keyboard");
8798d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_DPAD, "dpad");
8808d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_TOUCHSCREEN, "touchscreen");
8818d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_MOUSE, "mouse");
882fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_STYLUS, "stylus");
8838d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_TRACKBALL, "trackball");
8848d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_TOUCHPAD, "touchpad");
88591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_JOYSTICK, "joystick");
88691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_GAMEPAD, "gamepad");
88791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        description.append(" )\n");
88891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
88991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        final int numAxes = mMotionRanges.size();
89091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        for (int i = 0; i < numAxes; i++) {
891efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            MotionRange range = mMotionRanges.get(i);
892efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            description.append("    ").append(MotionEvent.axisToString(range.mAxis));
893efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            description.append(": source=0x").append(Integer.toHexString(range.mSource));
894efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            description.append(" min=").append(range.mMin);
89591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            description.append(" max=").append(range.mMax);
89691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            description.append(" flat=").append(range.mFlat);
89791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            description.append(" fuzz=").append(range.mFuzz);
898c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright            description.append(" resolution=").append(range.mResolution);
89991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            description.append("\n");
90091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        }
9018d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return description.toString();
9028d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
90391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
9048d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    private void appendSourceDescriptionIfApplicable(StringBuilder description, int source,
9058d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            String sourceName) {
9068d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        if ((mSources & source) == source) {
9078d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            description.append(" ");
9088d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            description.append(sourceName);
9098d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
9108d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
911c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown}
912