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    /**
23796658f716779b4f2f5dd148cbf6df59d5a87ace4Jinsuk Kim     * The input source is a device connected through HDMI-based bus.
23896658f716779b4f2f5dd148cbf6df59d5a87ace4Jinsuk Kim     *
23996658f716779b4f2f5dd148cbf6df59d5a87ace4Jinsuk Kim     * The key comes in through HDMI-CEC or MHL signal line, and is treated as if it were
24096658f716779b4f2f5dd148cbf6df59d5a87ace4Jinsuk Kim     * generated by a locally connected DPAD or keyboard.
24196658f716779b4f2f5dd148cbf6df59d5a87ace4Jinsuk Kim     */
24296658f716779b4f2f5dd148cbf6df59d5a87ace4Jinsuk Kim    public static final int SOURCE_HDMI = 0x02000000 | SOURCE_CLASS_BUTTON;
24396658f716779b4f2f5dd148cbf6df59d5a87ace4Jinsuk Kim
24496658f716779b4f2f5dd148cbf6df59d5a87ace4Jinsuk Kim    /**
2456d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * A special input source constant that is used when filtering input devices
2466d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * to match devices that provide any type of input source.
2476d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
2486d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int SOURCE_ANY = 0xffffff00;
249c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
250e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
25191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_X}.
252ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
253e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
25491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_X} instead.
255e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
25691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
25791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_X = MotionEvent.AXIS_X;
25891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
259e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
26091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_Y}.
261ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
262e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
26391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_Y} instead.
264e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
26591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
26691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_Y = MotionEvent.AXIS_Y;
26791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
268e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
26991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_PRESSURE}.
270ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
271e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
27291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_PRESSURE} instead.
273e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
27491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
27591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_PRESSURE = MotionEvent.AXIS_PRESSURE;
27691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
277e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
27891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_SIZE}.
279ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
280e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
28191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_SIZE} instead.
282e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
28391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
28491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_SIZE = MotionEvent.AXIS_SIZE;
28591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
286e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
28791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOUCH_MAJOR}.
288ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
289e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
29091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_TOUCH_MAJOR} instead.
291e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
29291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
29391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_TOUCH_MAJOR = MotionEvent.AXIS_TOUCH_MAJOR;
29491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
295e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
29691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOUCH_MINOR}.
297ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
298e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
29991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_TOUCH_MINOR} instead.
300e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
30191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
30291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_TOUCH_MINOR = MotionEvent.AXIS_TOUCH_MINOR;
30391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
304e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
30591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOOL_MAJOR}.
306ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
307e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
30891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_TOOL_MAJOR} instead.
309e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
31091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
31191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_TOOL_MAJOR = MotionEvent.AXIS_TOOL_MAJOR;
31291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
313e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
31491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOOL_MINOR}.
315ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
316e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
31791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_TOOL_MINOR} instead.
318e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
31991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
32091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_TOOL_MINOR = MotionEvent.AXIS_TOOL_MINOR;
32191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
322e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
32391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_ORIENTATION}.
324ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
325e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
32691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_ORIENTATION} instead.
327e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
32891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
32991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_ORIENTATION = MotionEvent.AXIS_ORIENTATION;
330ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
3316d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
3326d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * There is no keyboard.
3336d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
3346d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int KEYBOARD_TYPE_NONE = 0;
335ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
3366d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
3376d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * The keyboard is not fully alphabetic.  It may be a numeric keypad or an assortment
3386d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * of buttons that are not mapped as alphabetic keys suitable for text input.
3396d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
3406d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int KEYBOARD_TYPE_NON_ALPHABETIC = 1;
341ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
3426d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
3436d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * The keyboard supports a complement of alphabetic keys.
3446d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
3456d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int KEYBOARD_TYPE_ALPHABETIC = 2;
34691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
3479f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    public static final Parcelable.Creator<InputDevice> CREATOR =
3489f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            new Parcelable.Creator<InputDevice>() {
3499f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        public InputDevice createFromParcel(Parcel in) {
3509f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            return new InputDevice(in);
3519f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        }
3529f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        public InputDevice[] newArray(int size) {
3539f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            return new InputDevice[size];
3549f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        }
3559f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    };
3569f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
3578d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    // Called by native code.
35854e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    private InputDevice(int id, int generation, int controllerNumber, String name, int vendorId,
35954e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright            int productId, String descriptor, boolean isExternal, int sources, int keyboardType,
360ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright            KeyCharacterMap keyCharacterMap, boolean hasVibrator, boolean hasButtonUnderPad) {
3619f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mId = id;
362af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        mGeneration = generation;
363ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright        mControllerNumber = controllerNumber;
3649f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mName = name;
36554e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        mVendorId = vendorId;
36654e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        mProductId = productId;
3679f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mDescriptor = descriptor;
368daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown        mIsExternal = isExternal;
3699f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mSources = sources;
3709f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyboardType = keyboardType;
3719f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyCharacterMap = keyCharacterMap;
372a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown        mHasVibrator = hasVibrator;
3737ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright        mHasButtonUnderPad = hasButtonUnderPad;
374ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik        mIdentifier = new InputDeviceIdentifier(descriptor, vendorId, productId);
3759f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
3769f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
3779f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private InputDevice(Parcel in) {
3789f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mId = in.readInt();
379af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        mGeneration = in.readInt();
380ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright        mControllerNumber = in.readInt();
3819f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mName = in.readString();
38254e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        mVendorId = in.readInt();
38354e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        mProductId = in.readInt();
3849f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mDescriptor = in.readString();
385daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown        mIsExternal = in.readInt() != 0;
3869f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mSources = in.readInt();
3879f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyboardType = in.readInt();
3889f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyCharacterMap = KeyCharacterMap.CREATOR.createFromParcel(in);
389a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown        mHasVibrator = in.readInt() != 0;
3907ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright        mHasButtonUnderPad = in.readInt() != 0;
391ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik        mIdentifier = new InputDeviceIdentifier(mDescriptor, mVendorId, mProductId);
3929f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
3939f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        for (;;) {
3949f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            int axis = in.readInt();
3959f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            if (axis < 0) {
3969f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown                break;
3979f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            }
398c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright            addMotionRange(axis, in.readInt(), in.readFloat(), in.readFloat(), in.readFloat(),
399c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright                    in.readFloat(), in.readFloat());
4009f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        }
4018d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
402e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown
403e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
404e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * Gets information about the input device with the specified id.
405e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @param id The device id.
406e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @return The input device or null if not found.
407e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
408c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static InputDevice getDevice(int id) {
4099f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return InputManager.getInstance().getInputDevice(id);
4108d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
411ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
4128d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    /**
4138d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * Gets the ids of all input devices in the system.
4148d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * @return The input device ids.
4158d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     */
4168d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public static int[] getDeviceIds() {
4179f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return InputManager.getInstance().getInputDeviceIds();
4188d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
4199df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown
4208d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    /**
4218d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * Gets the input device id.
4229df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * <p>
4239df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * Each input device receives a unique id when it is first configured
4249df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * by the system.  The input device id may change when the system is restarted or if the
4259df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * input device is disconnected, reconnected or reconfigured at any time.
4269df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * If you require a stable identifier for a device that persists across
4279df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * boots and reconfigurations, use {@link #getDescriptor()}.
4289df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * </p>
4299df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     *
4308d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * @return The input device id.
4318d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     */
4328d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public int getId() {
4338d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return mId;
434c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
4359df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown
4369df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown    /**
437ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright     * The controller number for a given input device.
438ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright     * <p>
43910fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * Each gamepad or joystick is given a unique, positive controller number when initially
44010fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * configured by the system. This number may change due to events such as device disconnects /
44110fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * reconnects or user initiated reassignment. Any change in number will trigger an event that
44210fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * can be observed by registering an {@link InputManager.InputDeviceListener}.
44310fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * </p>
44410fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * <p>
44510fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * All input devices which are not gamepads or joysticks will be assigned a controller number
446ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright     * of 0.
447ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright     * </p>
44810fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     *
44910fac45b6f620ac2ef242e983c3b4d6ad85eb223Michael Wright     * @return The controller number of the device.
450ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright     */
451ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright    public int getControllerNumber() {
452ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright        return mControllerNumber;
453ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright    }
454ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright
455ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright    /**
456ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     * The set of identifying information for type of input device. This
457ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     * information can be used by the system to configure appropriate settings
458ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     * for the device.
459ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     *
460ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     * @return The identifier object for this device
461ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     * @hide
462ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik     */
463ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik    public InputDeviceIdentifier getIdentifier() {
464ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik        return mIdentifier;
465ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik    }
466ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
467ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik    /**
468af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     * Gets a generation number for this input device.
469af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     * The generation number is incremented whenever the device is reconfigured and its
470af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     * properties may have changed.
471af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     *
472af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     * @return The generation number.
473af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     *
474af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     * @hide
475af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     */
476af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    public int getGeneration() {
477af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        return mGeneration;
478af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    }
479af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown
480af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    /**
48154e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * Gets the vendor id for the given device, if available.
48254e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * <p>
48354e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * A vendor id uniquely identifies the company who manufactured the device. A value of 0 will
48454e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * be assigned where a vendor id is not available.
48554e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * </p>
48654e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     *
48754e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * @return The vendor id of a given device
48854e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     */
48954e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    public int getVendorId() {
49054e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        return mVendorId;
49154e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    }
49254e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright
49354e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    /**
49454e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * Gets the product id for the given device, if available.
49554e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * <p>
49654e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * A product id uniquely identifies which product within the address space of a given vendor,
49754e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * identified by the device's vendor id. A value of 0 will be assigned where a product id is
49854e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * not available.
49954e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * </p>
50054e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     *
50154e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     * @return The product id of a given device
50254e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright     */
50354e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    public int getProductId() {
50454e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        return mProductId;
50554e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    }
50654e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright
50754e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright    /**
5089df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * Gets the input device descriptor, which is a stable identifier for an input device.
5099df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * <p>
5109df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * An input device descriptor uniquely identifies an input device.  Its value
5119df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * is intended to be persistent across system restarts, and should not change even
5129df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * if the input device is disconnected, reconnected or reconfigured at any time.
513e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * </p><p>
514e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * It is possible for there to be multiple {@link InputDevice} instances that have the
515e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * same input device descriptor.  This might happen in situations where a single
516e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * human input device registers multiple {@link InputDevice} instances (HID collections)
517e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * that describe separate features of the device, such as a keyboard that also
518e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * has a trackpad.  Alternately, it may be that the input devices are simply
519e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * indistinguishable, such as two keyboards made by the same manufacturer.
520e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * </p><p>
521daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     * The input device descriptor returned by {@link #getDescriptor} should only be
522e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * used when an application needs to remember settings associated with a particular
523e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * input device.  For all other purposes when referring to a logical
524e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * {@link InputDevice} instance at runtime use the id returned by {@link #getId()}.
5259df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * </p>
5269df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     *
5279df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * @return The input device descriptor.
5289df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     */
5299df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown    public String getDescriptor() {
530e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown        return mDescriptor;
5319df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown    }
5329df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown
533c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
5349f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * Returns true if the device is a virtual input device rather than a real one,
5359f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * such as the virtual keyboard (see {@link KeyCharacterMap#VIRTUAL_KEYBOARD}).
5369f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * <p>
5379f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * Virtual input devices are provided to implement system-level functionality
5389f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * and should not be seen or configured by users.
5399f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * </p>
5409f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     *
5419f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * @return True if the device is virtual.
5429f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     *
5439f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * @see KeyCharacterMap#VIRTUAL_KEYBOARD
5449f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     */
5459f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    public boolean isVirtual() {
5469f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return mId < 0;
5479f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
5489f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
5499f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    /**
550daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     * Returns true if the device is external (connected to USB or Bluetooth or some other
551daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     * peripheral bus), otherwise it is built-in.
552daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     *
553daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     * @return True if the device is external.
554daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     *
555daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     * @hide
556daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     */
557daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown    public boolean isExternal() {
558daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown        return mIsExternal;
559daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown    }
560daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown
561daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown    /**
5627e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown     * Returns true if the device is a full keyboard.
5637e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown     *
5647e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown     * @return True if the device is a full keyboard.
5657e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown     *
5667e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown     * @hide
5677e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown     */
5687e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown    public boolean isFullKeyboard() {
5697e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown        return (mSources & SOURCE_KEYBOARD) == SOURCE_KEYBOARD
5707e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown                && mKeyboardType == KEYBOARD_TYPE_ALPHABETIC;
5717e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown    }
5727e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown
5737e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown    /**
574c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Gets the name of this input device.
575c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @return The input device name.
576c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
577c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public String getName() {
578c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mName;
579c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
580ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
581c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
582c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Gets the input sources supported by this input device as a combined bitfield.
583c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @return The supported input sources.
584c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
585c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public int getSources() {
586c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mSources;
587c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
588ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
589c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
590d08c864784b5d416805aee502e5294b0188a7bd8Michael Wright     * Determines whether the input device supports the given source or sources.
591d08c864784b5d416805aee502e5294b0188a7bd8Michael Wright     *
592d08c864784b5d416805aee502e5294b0188a7bd8Michael Wright     * @param source The input source or sources to check against. This can be a generic device
593d08c864784b5d416805aee502e5294b0188a7bd8Michael Wright     * type such as {@link InputDevice#SOURCE_MOUSE}, a more generic device class, such as
594d08c864784b5d416805aee502e5294b0188a7bd8Michael Wright     * {@link InputDevice#SOURCE_CLASS_POINTER}, or a combination of sources bitwise ORed together.
595d08c864784b5d416805aee502e5294b0188a7bd8Michael Wright     * @return Whether the device can produce all of the given sources.
596d08c864784b5d416805aee502e5294b0188a7bd8Michael Wright     */
597d08c864784b5d416805aee502e5294b0188a7bd8Michael Wright    public boolean supportsSource(int source) {
598d08c864784b5d416805aee502e5294b0188a7bd8Michael Wright        return (mSources & source) == source;
599d08c864784b5d416805aee502e5294b0188a7bd8Michael Wright    }
600d08c864784b5d416805aee502e5294b0188a7bd8Michael Wright
601d08c864784b5d416805aee502e5294b0188a7bd8Michael Wright    /**
6026d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * Gets the keyboard type.
6036d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * @return The keyboard type.
6046d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
6056d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public int getKeyboardType() {
6066d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mKeyboardType;
6076d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    }
608ca9eef6203b7cfb0084f8305d4dcc5d70a7a25cdRoboErik
6096d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
610c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Gets the key character map associated with this input device.
611c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @return The key character map.
612c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
613c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public KeyCharacterMap getKeyCharacterMap() {
6149f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return mKeyCharacterMap;
6151e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown    }
6161e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown
617e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
618b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright     * Gets whether the device is capable of producing the list of keycodes.
619b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright     * @param keys The list of android keycodes to check for.
620b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright     * @return An array of booleans where each member specifies whether the device is capable of
621b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright     * generating the keycode given by the corresponding value at the same index in the keys array.
622b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright     */
623b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright    public boolean[] hasKeys(int... keys) {
624b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright        return InputManager.getInstance().deviceHasKeys(mId, keys);
625b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright    }
626b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright
627b7b2d4b490f5dd672e0b00ced579dc052e3637e9Michael Wright    /**
62891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Gets information about the range of values for a particular {@link MotionEvent} axis.
629efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * If the device supports multiple sources, the same axis may have different meanings
630efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * for each source.  Returns information about the first axis found for any source.
631efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * To obtain information about the axis for a specific source, use
632efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * {@link #getMotionRange(int, int)}.
633efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     *
63491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @param axis The axis constant.
63591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @return The range of values, or null if the requested axis is not
636e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * supported by the device.
63791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     *
63891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @see MotionEvent#AXIS_X
63991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @see MotionEvent#AXIS_Y
640e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
64191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public MotionRange getMotionRange(int axis) {
642efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        final int numRanges = mMotionRanges.size();
643efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        for (int i = 0; i < numRanges; i++) {
644efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            final MotionRange range = mMotionRanges.get(i);
645efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            if (range.mAxis == axis) {
646efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown                return range;
647efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            }
648efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        }
649efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        return null;
650c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
65191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
6526f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    /**
653efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * Gets information about the range of values for a particular {@link MotionEvent} axis
654efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * used by a particular source on the device.
655efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * If the device supports multiple sources, the same axis may have different meanings
656efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * for each source.
657efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     *
658efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @param axis The axis constant.
659efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @param source The source for which to return information.
660efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @return The range of values, or null if the requested axis is not
661efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * supported by the device.
6626f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     *
663efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @see MotionEvent#AXIS_X
664efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @see MotionEvent#AXIS_Y
665efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     */
666efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    public MotionRange getMotionRange(int axis, int source) {
667efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        final int numRanges = mMotionRanges.size();
668efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        for (int i = 0; i < numRanges; i++) {
669efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            final MotionRange range = mMotionRanges.get(i);
670efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            if (range.mAxis == axis && range.mSource == source) {
671efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown                return range;
6726f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            }
6736f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        }
674efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        return null;
6756f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    }
6766f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown
677efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    /**
678efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * Gets the ranges for all axes supported by the device.
679efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @return The motion ranges for the device.
680efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     *
681efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @see #getMotionRange(int, int)
682efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     */
683efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    public List<MotionRange> getMotionRanges() {
684efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        return mMotionRanges;
685efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    }
686efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown
6879f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    // Called from native code.
688efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    private void addMotionRange(int axis, int source,
689c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright            float min, float max, float flat, float fuzz, float resolution) {
690c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright        mMotionRanges.add(new MotionRange(axis, source, min, max, flat, fuzz, resolution));
691c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
69291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
693e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
694a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * Gets the vibrator service associated with the device, if there is one.
695a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * Even if the device does not have a vibrator, the result is never null.
696a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * Use {@link Vibrator#hasVibrator} to determine whether a vibrator is
697a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * present.
698a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     *
699a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * Note that the vibrator associated with the device may be different from
700a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * the system vibrator.  To obtain an instance of the system vibrator instead, call
701a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * {@link Context#getSystemService} with {@link Context#VIBRATOR_SERVICE} as argument.
702a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     *
703a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * @return The vibrator service associated with the device, never null.
704a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     */
705a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    public Vibrator getVibrator() {
706a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown        synchronized (mMotionRanges) {
707a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown            if (mVibrator == null) {
708a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown                if (mHasVibrator) {
709a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown                    mVibrator = InputManager.getInstance().getInputDeviceVibrator(mId);
710a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown                } else {
711a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown                    mVibrator = NullVibrator.getInstance();
712a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown                }
713a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown            }
714a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown            return mVibrator;
715a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown        }
716a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    }
717a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown
718a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    /**
7197ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright     * Reports whether the device has a button under its touchpad
7207ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright     * @return Whether the device has a button under its touchpad
7217ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright     * @hide
7227ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright     */
7237ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright    public boolean hasButtonUnderPad() {
7247ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright        return mHasButtonUnderPad;
7257ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright    }
7267ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright
7277ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright    /**
72891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Provides information about the range of values for a particular {@link MotionEvent} axis.
72991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     *
73091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @see InputDevice#getMotionRange(int)
731e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
732c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final class MotionRange {
733efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        private int mAxis;
734efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        private int mSource;
7358d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mMin;
7368d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mMax;
7378d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mFlat;
7388d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mFuzz;
739c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright        private float mResolution;
74091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
741c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright        private MotionRange(int axis, int source, float min, float max, float flat, float fuzz,
742c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright                float resolution) {
743efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            mAxis = axis;
744efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            mSource = source;
7458d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mMin = min;
7468d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mMax = max;
7478d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mFlat = flat;
7488d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mFuzz = fuzz;
749c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright            mResolution = resolution;
7508d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
75191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
752e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
753efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         * Gets the axis id.
754efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         * @return The axis id.
755efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         */
756efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        public int getAxis() {
757efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            return mAxis;
758efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        }
759efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown
760efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        /**
761efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         * Gets the source for which the axis is defined.
762efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         * @return The source.
763efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         */
764efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        public int getSource() {
765efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            return mSource;
766efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        }
767efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown
76874e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright
76974e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright        /**
77074e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         * Determines whether the event is from the given source.
77174e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         *
77274e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         * @param source The input source to check against. This can be a specific device type,
77374e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         * such as {@link InputDevice#SOURCE_TOUCH_NAVIGATION}, or a more generic device class,
77474e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         * such as {@link InputDevice#SOURCE_CLASS_POINTER}.
77574e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         * @return Whether the event is from the given source.
77674e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         */
77774e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright        public boolean isFromSource(int source) {
77874e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright            return (getSource() & source) == source;
77974e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright        }
78074e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright
781efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        /**
7826f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * Gets the inclusive minimum value for the axis.
7836f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * @return The inclusive minimum value.
784e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
785e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getMin() {
7868d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mMin;
787e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
78891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
789e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
7906f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * Gets the inclusive maximum value for the axis.
7916f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * @return The inclusive maximum value.
792e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
793e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getMax() {
7948d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mMax;
795e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
79691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
797e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
7986f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * Gets the range of the axis (difference between maximum and minimum).
799e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * @return The range of values.
800e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
801e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getRange() {
8026f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            return mMax - mMin;
803e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
80491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
805e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
80691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown         * Gets the extent of the center flat position with respect to this axis.
8076f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * <p>
808e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * For example, a flat value of 8 means that the center position is between -8 and +8.
809dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown         * This value is mainly useful for calibrating self-centering devices.
8106f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * </p>
811e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * @return The extent of the center flat position.
812e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
813e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getFlat() {
8148d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mFlat;
815e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
81691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
817e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
81891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown         * Gets the error tolerance for input device measurements with respect to this axis.
8196f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * <p>
820e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * For example, a value of 2 indicates that the measured value may be up to +/- 2 units
821e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * away from the actual value due to noise and device sensitivity limitations.
8226f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * </p>
823e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * @return The error tolerance.
824e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
825e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getFuzz() {
8268d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mFuzz;
8278d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
828c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright
829c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright        /**
830c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright         * Gets the resolution for input device measurements with respect to this axis.
831c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright         * @return The resolution in units per millimeter, or units per radian for rotational axes.
832c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright         */
833c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright        public float getResolution() {
834c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright            return mResolution;
835c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright        }
8368d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
83791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
8388d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    @Override
8398d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public void writeToParcel(Parcel out, int flags) {
8408d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(mId);
841af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        out.writeInt(mGeneration);
842ac6c78b6eef49f5c1ab2a346d90ccb99ccec18f4Michael Wright        out.writeInt(mControllerNumber);
8438d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeString(mName);
84454e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        out.writeInt(mVendorId);
84554e56946d1aa3586e7b27fb63dfb7d3c1238c61dMichael Wright        out.writeInt(mProductId);
846e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown        out.writeString(mDescriptor);
847daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown        out.writeInt(mIsExternal ? 1 : 0);
8488d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(mSources);
8498d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(mKeyboardType);
8509f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyCharacterMap.writeToParcel(out, flags);
851a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown        out.writeInt(mHasVibrator ? 1 : 0);
8527ddd11035b25b0a2dbf09f9d9efd3fca701f0a79Michael Wright        out.writeInt(mHasButtonUnderPad ? 1 : 0);
85391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
854efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        final int numRanges = mMotionRanges.size();
855efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        for (int i = 0; i < numRanges; i++) {
856efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            MotionRange range = mMotionRanges.get(i);
857efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            out.writeInt(range.mAxis);
858efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            out.writeInt(range.mSource);
85991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            out.writeFloat(range.mMin);
86091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            out.writeFloat(range.mMax);
86191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            out.writeFloat(range.mFlat);
86291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            out.writeFloat(range.mFuzz);
863c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright            out.writeFloat(range.mResolution);
8648d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
8658d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(-1);
8668d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
86791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
8688d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    @Override
8698d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public int describeContents() {
8708d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return 0;
8718d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
87291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
8738d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    @Override
8748d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public String toString() {
8758d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        StringBuilder description = new StringBuilder();
8768d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        description.append("Input Device ").append(mId).append(": ").append(mName).append("\n");
877e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown        description.append("  Descriptor: ").append(mDescriptor).append("\n");
878af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        description.append("  Generation: ").append(mGeneration).append("\n");
879daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown        description.append("  Location: ").append(mIsExternal ? "external" : "built-in").append("\n");
880e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown
8818d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        description.append("  Keyboard Type: ");
8828d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        switch (mKeyboardType) {
8838d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            case KEYBOARD_TYPE_NONE:
8848d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                description.append("none");
8858d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                break;
8868d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            case KEYBOARD_TYPE_NON_ALPHABETIC:
8878d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                description.append("non-alphabetic");
8888d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                break;
8898d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            case KEYBOARD_TYPE_ALPHABETIC:
8908d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                description.append("alphabetic");
8918d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                break;
8928d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
8938d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        description.append("\n");
89491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
895a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown        description.append("  Has Vibrator: ").append(mHasVibrator).append("\n");
896a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown
897efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        description.append("  Sources: 0x").append(Integer.toHexString(mSources)).append(" (");
8988d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_KEYBOARD, "keyboard");
8998d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_DPAD, "dpad");
9008d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_TOUCHSCREEN, "touchscreen");
9018d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_MOUSE, "mouse");
902fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_STYLUS, "stylus");
9038d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_TRACKBALL, "trackball");
9048d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_TOUCHPAD, "touchpad");
90591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_JOYSTICK, "joystick");
90691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_GAMEPAD, "gamepad");
90791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        description.append(" )\n");
90891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
90991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        final int numAxes = mMotionRanges.size();
91091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        for (int i = 0; i < numAxes; i++) {
911efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            MotionRange range = mMotionRanges.get(i);
912efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            description.append("    ").append(MotionEvent.axisToString(range.mAxis));
913efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            description.append(": source=0x").append(Integer.toHexString(range.mSource));
914efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            description.append(" min=").append(range.mMin);
91591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            description.append(" max=").append(range.mMax);
91691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            description.append(" flat=").append(range.mFlat);
91791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            description.append(" fuzz=").append(range.mFuzz);
918c6091c64c90e9557ea58e0d7cf75915aea7c6c3eMichael Wright            description.append(" resolution=").append(range.mResolution);
91991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            description.append("\n");
92091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        }
9218d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return description.toString();
9228d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
92391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
9248d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    private void appendSourceDescriptionIfApplicable(StringBuilder description, int source,
9258d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            String sourceName) {
9268d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        if ((mSources & source) == source) {
9278d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            description.append(" ");
9288d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            description.append(sourceName);
9298d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
9308d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
931c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown}
932