InputDevice.java revision e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1e
1c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown/*
2c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * Copyright (C) 2010 The Android Open Source Project
3c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown *
4c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
5c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * you may not use this file except in compliance with the License.
6c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * You may obtain a copy of the License at
7c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown *
8c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
9c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown *
10c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * Unless required by applicable law or agreed to in writing, software
11c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
12c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * See the License for the specific language governing permissions and
14c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * limitations under the License.
15c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown */
16c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
17c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brownpackage android.view;
18c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
19a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brownimport android.content.Context;
20ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brownimport android.hardware.input.InputManager;
218d60866e2100db70ecf0502c14768a384514d7e9Jeff Brownimport android.os.Parcel;
228d60866e2100db70ecf0502c14768a384514d7e9Jeff Brownimport android.os.Parcelable;
23a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brownimport android.os.Vibrator;
24a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brownimport android.os.NullVibrator;
25efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown
26efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brownimport java.util.ArrayList;
27efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brownimport java.util.List;
288d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
29c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown/**
30c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * Describes the capabilities of a particular input device.
31c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * <p>
329df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown * Each input device may support multiple classes of input.  For example, a multi-function
33c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * keyboard may compose the capabilities of a standard keyboard together with a track pad mouse
34c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * or other pointing device.
35c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * </p><p>
36dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * Some input devices present multiple distinguishable sources of input.
37c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * Applications can query the framework about the characteristics of each distinct source.
38c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * </p><p>
39c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * As a further wrinkle, different kinds of input sources uses different coordinate systems
40c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * to describe motion events.  Refer to the comments on the input source constants for
41c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * the appropriate interpretation.
426d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * </p>
43c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown */
448d60866e2100db70ecf0502c14768a384514d7e9Jeff Brownpublic final class InputDevice implements Parcelable {
459f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private final int mId;
46af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    private final int mGeneration;
479f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private final String mName;
489f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private final String mDescriptor;
49daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown    private final boolean mIsExternal;
509f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private final int mSources;
519f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private final int mKeyboardType;
529f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private final KeyCharacterMap mKeyCharacterMap;
53a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    private final boolean mHasVibrator;
54efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    private final ArrayList<MotionRange> mMotionRanges = new ArrayList<MotionRange>();
5591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
56a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    private Vibrator mVibrator; // guarded by mMotionRanges during initialization
57a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown
58c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
59c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A mask for input source classes.
60c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
61c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Each distinct input source constant has one or more input source class bits set to
62c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * specify the desired interpretation for its input events.
63c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
64c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_MASK = 0x000000ff;
65e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright
66e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright    /**
67e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     * The input source has no class.
68e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     *
69e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     * It is up to the application to determine how to handle the device based on the device type.
70e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     */
71e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright    public static final int SOURCE_CLASS_NONE = 0x00000000;
72e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright
73c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
74c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source has buttons or keys.
75dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * Examples: {@link #SOURCE_KEYBOARD}, {@link #SOURCE_DPAD}.
76c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
77c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A {@link KeyEvent} should be interpreted as a button or key press.
78c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
796eb5ac9ceeb3ff67d38c7ead54b4247e762f278dJeff Brown     * Use {@link #getKeyCharacterMap} to query the device's button and key mappings.
80c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
81c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_BUTTON = 0x00000001;
82c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
83c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
84c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a pointing device associated with a display.
85c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Examples: {@link #SOURCE_TOUCHSCREEN}, {@link #SOURCE_MOUSE}.
86c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
87c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A {@link MotionEvent} should be interpreted as absolute coordinates in
88c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * display units according to the {@link View} hierarchy.  Pointer down/up indicated when
89c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * the finger touches the display or when the selection button is pressed/released.
90c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
91c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Use {@link #getMotionRange} to query the range of the pointing device.  Some devices permit
92c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * touches outside the display area so the effective range may be somewhat smaller or larger
93c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * than the actual display size.
94c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
95c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_POINTER = 0x00000002;
96c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
97c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
98c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a trackball navigation device.
99c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Examples: {@link #SOURCE_TRACKBALL}.
100c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
101c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A {@link MotionEvent} should be interpreted as relative movements in device-specific
102c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * units used for navigation purposes.  Pointer down/up indicates when the selection button
103c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * is pressed/released.
104c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
105c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Use {@link #getMotionRange} to query the range of motion.
106c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
107c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_TRACKBALL = 0x00000004;
108c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
109c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
110c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is an absolute positioning device not associated with a display
111c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * (unlike {@link #SOURCE_CLASS_POINTER}).
112c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
113c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A {@link MotionEvent} should be interpreted as absolute coordinates in
114c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * device-specific surface units.
115c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
116c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Use {@link #getMotionRange} to query the range of positions.
117c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
118c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_POSITION = 0x00000008;
119cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
120cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /**
121cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * The input source is a joystick.
122cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     *
123cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * A {@link MotionEvent} should be interpreted as absolute joystick movements.
124cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     *
125cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * Use {@link #getMotionRange} to query the range of positions.
126cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     */
127cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int SOURCE_CLASS_JOYSTICK = 0x00000010;
128cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
129c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
130c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is unknown.
131c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
132c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_UNKNOWN = 0x00000000;
133c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
134c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
135c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a keyboard.
1369df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     *
1379df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * This source indicates pretty much anything that has buttons.  Use
1389df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * {@link #getKeyboardType()} to determine whether the keyboard has alphabetic keys
1399df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * and can be used to enter text.
1409df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     *
141c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_BUTTON
142c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
143c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_KEYBOARD = 0x00000100 | SOURCE_CLASS_BUTTON;
144c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
145c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
146c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a DPad.
147c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
148c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_BUTTON
149c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
150c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_DPAD = 0x00000200 | SOURCE_CLASS_BUTTON;
151cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
152cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /**
153cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * The input source is a game pad.
154cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * (It may also be a {@link #SOURCE_JOYSTICK}).
155cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     *
156cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * @see #SOURCE_CLASS_BUTTON
157cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     */
158cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int SOURCE_GAMEPAD = 0x00000400 | SOURCE_CLASS_BUTTON;
159cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
160c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
161c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a touch screen pointing device.
162c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
163c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_POINTER
164c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
165c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_TOUCHSCREEN = 0x00001000 | SOURCE_CLASS_POINTER;
166c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
167c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
168c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a mouse pointing device.
169c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * This code is also used for other mouse-like pointing devices such as trackpads
170c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * and trackpoints.
171c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
172c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_POINTER
173c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
174c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_MOUSE = 0x00002000 | SOURCE_CLASS_POINTER;
175fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown
176fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    /**
177fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown     * The input source is a stylus pointing device.
17800710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * <p>
17900710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * Note that this bit merely indicates that an input device is capable of obtaining
18000710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * input from a stylus.  To determine whether a given touch event was produced
18100710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * by a stylus, examine the tool type returned by {@link MotionEvent#getToolType(int)}
18200710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * for each individual pointer.
18300710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * </p><p>
18400710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * A single touch event may multiple pointers with different tool types,
18500710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * such as an event that has one pointer with tool type
18600710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * {@link MotionEvent#TOOL_TYPE_FINGER} and another pointer with tool type
18700710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * {@link MotionEvent#TOOL_TYPE_STYLUS}.  So it is important to examine
18800710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * the tool type of each pointer, regardless of the source reported
18900710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * by {@link MotionEvent#getSource()}.
19000710e906bdafd58386ee7f81fa84addd218122fJeff Brown     * </p>
191fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown     *
192fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown     * @see #SOURCE_CLASS_POINTER
193fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown     */
194fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    public static final int SOURCE_STYLUS = 0x00004000 | SOURCE_CLASS_POINTER;
195fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown
196c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
197c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a trackball.
198c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
199c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_TRACKBALL
200c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
201c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_TRACKBALL = 0x00010000 | SOURCE_CLASS_TRACKBALL;
202c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
203c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
204c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a touch pad or digitizer tablet that is not
205e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * associated with a display (unlike {@link #SOURCE_TOUCHSCREEN}).
206c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
207c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_POSITION
208c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
209c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_TOUCHPAD = 0x00100000 | SOURCE_CLASS_POSITION;
210cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
211cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /**
212e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     * The input source is a touch device whose motions should be interpreted as navigation events.
213e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     *
214e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     * For example, an upward swipe should be as an upward focus traversal in the same manner as
215e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     * pressing up on a D-Pad would be. Swipes to the left, right and down should be treated in a
216e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     * similar manner.
217e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     *
218e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     * @see #SOURCE_CLASS_NONE
219e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright     */
220e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright    public static final int SOURCE_TOUCH_NAVIGATION = 0x00200000 | SOURCE_CLASS_NONE;
221e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright
222e7a9ae8ba0fb7fc61960e3facd0c5534e9ffce1eMichael Wright    /**
223cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * The input source is a joystick.
224cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * (It may also be a {@link #SOURCE_GAMEPAD}).
225cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     *
226cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * @see #SOURCE_CLASS_JOYSTICK
227cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     */
228cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int SOURCE_JOYSTICK = 0x01000000 | SOURCE_CLASS_JOYSTICK;
229cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
2306d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
2316d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * A special input source constant that is used when filtering input devices
2326d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * to match devices that provide any type of input source.
2336d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
2346d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int SOURCE_ANY = 0xffffff00;
235c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
236e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
23791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_X}.
238e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
239e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
24091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_X} instead.
241e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
24291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
24391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_X = MotionEvent.AXIS_X;
24491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
245e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
24691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_Y}.
247e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
248e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
24991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_Y} instead.
250e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
25191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
25291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_Y = MotionEvent.AXIS_Y;
25391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
254e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
25591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_PRESSURE}.
256e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
257e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
25891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_PRESSURE} instead.
259e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
26091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
26191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_PRESSURE = MotionEvent.AXIS_PRESSURE;
26291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
263e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
26491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_SIZE}.
265e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
266e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
26791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_SIZE} instead.
268e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
26991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
27091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_SIZE = MotionEvent.AXIS_SIZE;
27191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
272e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
27391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOUCH_MAJOR}.
274e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
275e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
27691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_TOUCH_MAJOR} instead.
277e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
27891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
27991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_TOUCH_MAJOR = MotionEvent.AXIS_TOUCH_MAJOR;
28091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
281e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
28291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOUCH_MINOR}.
283e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
284e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
28591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_TOUCH_MINOR} instead.
286e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
28791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
28891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_TOUCH_MINOR = MotionEvent.AXIS_TOUCH_MINOR;
28991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
290e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
29191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOOL_MAJOR}.
292e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
293e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
29491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_TOOL_MAJOR} instead.
295e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
29691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
29791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_TOOL_MAJOR = MotionEvent.AXIS_TOOL_MAJOR;
29891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
299e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
30091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOOL_MINOR}.
301e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
302e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
30391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_TOOL_MINOR} instead.
304e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
30591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
30691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_TOOL_MINOR = MotionEvent.AXIS_TOOL_MINOR;
30791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
308e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
30991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_ORIENTATION}.
310e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
311e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
31291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_ORIENTATION} instead.
313e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
31491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
31591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_ORIENTATION = MotionEvent.AXIS_ORIENTATION;
3168d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
3176d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
3186d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * There is no keyboard.
3196d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
3206d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int KEYBOARD_TYPE_NONE = 0;
3216d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
3226d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
3236d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * The keyboard is not fully alphabetic.  It may be a numeric keypad or an assortment
3246d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * of buttons that are not mapped as alphabetic keys suitable for text input.
3256d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
3266d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int KEYBOARD_TYPE_NON_ALPHABETIC = 1;
3276d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
3286d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
3296d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * The keyboard supports a complement of alphabetic keys.
3306d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
3316d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int KEYBOARD_TYPE_ALPHABETIC = 2;
33291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
3339f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    public static final Parcelable.Creator<InputDevice> CREATOR =
3349f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            new Parcelable.Creator<InputDevice>() {
3359f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        public InputDevice createFromParcel(Parcel in) {
3369f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            return new InputDevice(in);
3379f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        }
3389f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        public InputDevice[] newArray(int size) {
3399f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            return new InputDevice[size];
3409f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        }
3419f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    };
3429f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
3438d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    // Called by native code.
344daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown    private InputDevice(int id, int generation, String name, String descriptor,
345daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown            boolean isExternal, int sources,
346a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown            int keyboardType, KeyCharacterMap keyCharacterMap, boolean hasVibrator) {
3479f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mId = id;
348af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        mGeneration = generation;
3499f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mName = name;
3509f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mDescriptor = descriptor;
351daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown        mIsExternal = isExternal;
3529f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mSources = sources;
3539f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyboardType = keyboardType;
3549f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyCharacterMap = keyCharacterMap;
355a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown        mHasVibrator = hasVibrator;
3569f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
3579f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
3589f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private InputDevice(Parcel in) {
3599f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mId = in.readInt();
360af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        mGeneration = in.readInt();
3619f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mName = in.readString();
3629f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mDescriptor = in.readString();
363daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown        mIsExternal = in.readInt() != 0;
3649f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mSources = in.readInt();
3659f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyboardType = in.readInt();
3669f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyCharacterMap = KeyCharacterMap.CREATOR.createFromParcel(in);
367a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown        mHasVibrator = in.readInt() != 0;
3689f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
3699f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        for (;;) {
3709f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            int axis = in.readInt();
3719f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            if (axis < 0) {
3729f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown                break;
3739f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            }
3749f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            addMotionRange(axis, in.readInt(),
3759f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown                    in.readFloat(), in.readFloat(), in.readFloat(), in.readFloat());
3769f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        }
3778d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
378e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown
379e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
380e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * Gets information about the input device with the specified id.
381e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @param id The device id.
382e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @return The input device or null if not found.
383e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
384c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static InputDevice getDevice(int id) {
3859f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return InputManager.getInstance().getInputDevice(id);
3868d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
3878d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
3888d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    /**
3898d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * Gets the ids of all input devices in the system.
3908d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * @return The input device ids.
3918d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     */
3928d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public static int[] getDeviceIds() {
3939f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return InputManager.getInstance().getInputDeviceIds();
3948d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
3959df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown
3968d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    /**
3978d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * Gets the input device id.
3989df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * <p>
3999df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * Each input device receives a unique id when it is first configured
4009df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * by the system.  The input device id may change when the system is restarted or if the
4019df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * input device is disconnected, reconnected or reconfigured at any time.
4029df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * If you require a stable identifier for a device that persists across
4039df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * boots and reconfigurations, use {@link #getDescriptor()}.
4049df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * </p>
4059df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     *
4068d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * @return The input device id.
4078d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     */
4088d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public int getId() {
4098d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return mId;
410c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
4119df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown
4129df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown    /**
413af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     * Gets a generation number for this input device.
414af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     * The generation number is incremented whenever the device is reconfigured and its
415af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     * properties may have changed.
416af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     *
417af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     * @return The generation number.
418af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     *
419af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     * @hide
420af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown     */
421af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    public int getGeneration() {
422af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        return mGeneration;
423af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    }
424af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown
425af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown    /**
4269df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * Gets the input device descriptor, which is a stable identifier for an input device.
4279df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * <p>
4289df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * An input device descriptor uniquely identifies an input device.  Its value
4299df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * is intended to be persistent across system restarts, and should not change even
4309df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * if the input device is disconnected, reconnected or reconfigured at any time.
431e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * </p><p>
432e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * It is possible for there to be multiple {@link InputDevice} instances that have the
433e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * same input device descriptor.  This might happen in situations where a single
434e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * human input device registers multiple {@link InputDevice} instances (HID collections)
435e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * that describe separate features of the device, such as a keyboard that also
436e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * has a trackpad.  Alternately, it may be that the input devices are simply
437e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * indistinguishable, such as two keyboards made by the same manufacturer.
438e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * </p><p>
439daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     * The input device descriptor returned by {@link #getDescriptor} should only be
440e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * used when an application needs to remember settings associated with a particular
441e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * input device.  For all other purposes when referring to a logical
442e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * {@link InputDevice} instance at runtime use the id returned by {@link #getId()}.
4439df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * </p>
4449df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     *
4459df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * @return The input device descriptor.
4469df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     */
4479df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown    public String getDescriptor() {
448e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown        return mDescriptor;
4499df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown    }
4509df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown
451c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
4529f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * Returns true if the device is a virtual input device rather than a real one,
4539f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * such as the virtual keyboard (see {@link KeyCharacterMap#VIRTUAL_KEYBOARD}).
4549f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * <p>
4559f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * Virtual input devices are provided to implement system-level functionality
4569f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * and should not be seen or configured by users.
4579f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * </p>
4589f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     *
4599f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * @return True if the device is virtual.
4609f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     *
4619f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * @see KeyCharacterMap#VIRTUAL_KEYBOARD
4629f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     */
4639f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    public boolean isVirtual() {
4649f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return mId < 0;
4659f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
4669f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
4679f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    /**
468daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     * Returns true if the device is external (connected to USB or Bluetooth or some other
469daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     * peripheral bus), otherwise it is built-in.
470daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     *
471daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     * @return True if the device is external.
472daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     *
473daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     * @hide
474daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown     */
475daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown    public boolean isExternal() {
476daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown        return mIsExternal;
477daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown    }
478daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown
479daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown    /**
4807e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown     * Returns true if the device is a full keyboard.
4817e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown     *
4827e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown     * @return True if the device is a full keyboard.
4837e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown     *
4847e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown     * @hide
4857e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown     */
4867e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown    public boolean isFullKeyboard() {
4877e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown        return (mSources & SOURCE_KEYBOARD) == SOURCE_KEYBOARD
4887e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown                && mKeyboardType == KEYBOARD_TYPE_ALPHABETIC;
4897e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown    }
4907e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown
4917e4ff4b986d626493afb676dd4824d2b3663260aJeff Brown    /**
492c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Gets the name of this input device.
493c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @return The input device name.
494c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
495c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public String getName() {
496c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mName;
497c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
498c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
499c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
500c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Gets the input sources supported by this input device as a combined bitfield.
501c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @return The supported input sources.
502c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
503c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public int getSources() {
504c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mSources;
505c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
506c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
507c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
5086d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * Gets the keyboard type.
5096d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * @return The keyboard type.
5106d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
5116d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public int getKeyboardType() {
5126d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mKeyboardType;
5136d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    }
5146d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
5156d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
516c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Gets the key character map associated with this input device.
517c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @return The key character map.
518c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
519c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public KeyCharacterMap getKeyCharacterMap() {
5209f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return mKeyCharacterMap;
5211e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown    }
5221e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown
523e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
52491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Gets information about the range of values for a particular {@link MotionEvent} axis.
525efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * If the device supports multiple sources, the same axis may have different meanings
526efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * for each source.  Returns information about the first axis found for any source.
527efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * To obtain information about the axis for a specific source, use
528efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * {@link #getMotionRange(int, int)}.
529efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     *
53091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @param axis The axis constant.
53191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @return The range of values, or null if the requested axis is not
532e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * supported by the device.
53391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     *
53491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @see MotionEvent#AXIS_X
53591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @see MotionEvent#AXIS_Y
5366f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     * @see #getSupportedAxes()
537e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
53891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public MotionRange getMotionRange(int axis) {
539efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        final int numRanges = mMotionRanges.size();
540efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        for (int i = 0; i < numRanges; i++) {
541efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            final MotionRange range = mMotionRanges.get(i);
542efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            if (range.mAxis == axis) {
543efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown                return range;
544efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            }
545efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        }
546efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        return null;
547c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
54891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
5496f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    /**
550efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * Gets information about the range of values for a particular {@link MotionEvent} axis
551efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * used by a particular source on the device.
552efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * If the device supports multiple sources, the same axis may have different meanings
553efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * for each source.
554efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     *
555efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @param axis The axis constant.
556efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @param source The source for which to return information.
557efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @return The range of values, or null if the requested axis is not
558efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * supported by the device.
5596f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     *
560efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @see MotionEvent#AXIS_X
561efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @see MotionEvent#AXIS_Y
562efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @see #getSupportedAxes()
563efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     */
564efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    public MotionRange getMotionRange(int axis, int source) {
565efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        final int numRanges = mMotionRanges.size();
566efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        for (int i = 0; i < numRanges; i++) {
567efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            final MotionRange range = mMotionRanges.get(i);
568efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            if (range.mAxis == axis && range.mSource == source) {
569efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown                return range;
5706f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            }
5716f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        }
572efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        return null;
5736f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    }
5746f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown
575efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    /**
576efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * Gets the ranges for all axes supported by the device.
577efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @return The motion ranges for the device.
578efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     *
579efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @see #getMotionRange(int, int)
580efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     */
581efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    public List<MotionRange> getMotionRanges() {
582efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        return mMotionRanges;
583efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    }
584efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown
5859f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    // Called from native code.
586efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    private void addMotionRange(int axis, int source,
587efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            float min, float max, float flat, float fuzz) {
588efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        mMotionRanges.add(new MotionRange(axis, source, min, max, flat, fuzz));
589c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
59091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
591e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
592a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * Gets the vibrator service associated with the device, if there is one.
593a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * Even if the device does not have a vibrator, the result is never null.
594a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * Use {@link Vibrator#hasVibrator} to determine whether a vibrator is
595a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * present.
596a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     *
597a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * Note that the vibrator associated with the device may be different from
598a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * the system vibrator.  To obtain an instance of the system vibrator instead, call
599a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * {@link Context#getSystemService} with {@link Context#VIBRATOR_SERVICE} as argument.
600a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     *
601a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     * @return The vibrator service associated with the device, never null.
602a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown     */
603a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    public Vibrator getVibrator() {
604a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown        synchronized (mMotionRanges) {
605a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown            if (mVibrator == null) {
606a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown                if (mHasVibrator) {
607a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown                    mVibrator = InputManager.getInstance().getInputDeviceVibrator(mId);
608a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown                } else {
609a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown                    mVibrator = NullVibrator.getInstance();
610a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown                }
611a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown            }
612a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown            return mVibrator;
613a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown        }
614a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    }
615a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown
616a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown    /**
61791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Provides information about the range of values for a particular {@link MotionEvent} axis.
61891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     *
61991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @see InputDevice#getMotionRange(int)
620e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
621c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final class MotionRange {
622efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        private int mAxis;
623efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        private int mSource;
6248d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mMin;
6258d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mMax;
6268d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mFlat;
6278d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mFuzz;
62891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
629efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        private MotionRange(int axis, int source, float min, float max, float flat, float fuzz) {
630efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            mAxis = axis;
631efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            mSource = source;
6328d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mMin = min;
6338d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mMax = max;
6348d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mFlat = flat;
6358d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mFuzz = fuzz;
6368d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
63791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
638e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
639efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         * Gets the axis id.
640efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         * @return The axis id.
641efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         */
642efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        public int getAxis() {
643efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            return mAxis;
644efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        }
645efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown
646efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        /**
647efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         * Gets the source for which the axis is defined.
648efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         * @return The source.
649efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         */
650efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        public int getSource() {
651efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            return mSource;
652efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        }
653efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown
65474e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright
65574e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright        /**
65674e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         * Determines whether the event is from the given source.
65774e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         *
65874e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         * @param source The input source to check against. This can be a specific device type,
65974e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         * such as {@link InputDevice#SOURCE_TOUCH_NAVIGATION}, or a more generic device class,
66074e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         * such as {@link InputDevice#SOURCE_CLASS_POINTER}.
66174e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         * @return Whether the event is from the given source.
66274e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright         */
66374e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright        public boolean isFromSource(int source) {
66474e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright            return (getSource() & source) == source;
66574e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright        }
66674e4156e5c62392c37f4a70358de30dcfff4956fMichael Wright
667efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        /**
6686f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * Gets the inclusive minimum value for the axis.
6696f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * @return The inclusive minimum value.
670e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
671e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getMin() {
6728d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mMin;
673e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
67491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
675e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
6766f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * Gets the inclusive maximum value for the axis.
6776f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * @return The inclusive maximum value.
678e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
679e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getMax() {
6808d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mMax;
681e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
68291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
683e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
6846f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * Gets the range of the axis (difference between maximum and minimum).
685e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * @return The range of values.
686e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
687e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getRange() {
6886f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            return mMax - mMin;
689e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
69091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
691e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
69291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown         * Gets the extent of the center flat position with respect to this axis.
6936f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * <p>
694e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * For example, a flat value of 8 means that the center position is between -8 and +8.
695dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown         * This value is mainly useful for calibrating self-centering devices.
6966f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * </p>
697e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * @return The extent of the center flat position.
698e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
699e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getFlat() {
7008d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mFlat;
701e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
70291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
703e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
70491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown         * Gets the error tolerance for input device measurements with respect to this axis.
7056f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * <p>
706e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * For example, a value of 2 indicates that the measured value may be up to +/- 2 units
707e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * away from the actual value due to noise and device sensitivity limitations.
7086f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * </p>
709e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * @return The error tolerance.
710e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
711e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getFuzz() {
7128d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mFuzz;
7138d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
7148d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
71591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
7168d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    @Override
7178d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public void writeToParcel(Parcel out, int flags) {
7188d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(mId);
719af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        out.writeInt(mGeneration);
7208d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeString(mName);
721e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown        out.writeString(mDescriptor);
722daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown        out.writeInt(mIsExternal ? 1 : 0);
7238d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(mSources);
7248d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(mKeyboardType);
7259f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyCharacterMap.writeToParcel(out, flags);
726a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown        out.writeInt(mHasVibrator ? 1 : 0);
72791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
728efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        final int numRanges = mMotionRanges.size();
729efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        for (int i = 0; i < numRanges; i++) {
730efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            MotionRange range = mMotionRanges.get(i);
731efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            out.writeInt(range.mAxis);
732efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            out.writeInt(range.mSource);
73391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            out.writeFloat(range.mMin);
73491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            out.writeFloat(range.mMax);
73591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            out.writeFloat(range.mFlat);
73691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            out.writeFloat(range.mFuzz);
7378d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
7388d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(-1);
7398d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
74091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
7418d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    @Override
7428d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public int describeContents() {
7438d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return 0;
7448d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
74591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
7468d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    @Override
7478d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public String toString() {
7488d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        StringBuilder description = new StringBuilder();
7498d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        description.append("Input Device ").append(mId).append(": ").append(mName).append("\n");
750e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown        description.append("  Descriptor: ").append(mDescriptor).append("\n");
751af9e8d38184c6ba4d2d3eb5bde7014a66dd8a78bJeff Brown        description.append("  Generation: ").append(mGeneration).append("\n");
752daa3753a04699724d2cfe824ac1f5a266d643a05Jeff Brown        description.append("  Location: ").append(mIsExternal ? "external" : "built-in").append("\n");
753e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown
7548d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        description.append("  Keyboard Type: ");
7558d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        switch (mKeyboardType) {
7568d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            case KEYBOARD_TYPE_NONE:
7578d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                description.append("none");
7588d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                break;
7598d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            case KEYBOARD_TYPE_NON_ALPHABETIC:
7608d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                description.append("non-alphabetic");
7618d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                break;
7628d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            case KEYBOARD_TYPE_ALPHABETIC:
7638d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                description.append("alphabetic");
7648d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                break;
7658d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
7668d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        description.append("\n");
76791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
768a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown        description.append("  Has Vibrator: ").append(mHasVibrator).append("\n");
769a47425a13c19f95057df78b8bb65bb25657e8753Jeff Brown
770efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        description.append("  Sources: 0x").append(Integer.toHexString(mSources)).append(" (");
7718d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_KEYBOARD, "keyboard");
7728d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_DPAD, "dpad");
7738d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_TOUCHSCREEN, "touchscreen");
7748d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_MOUSE, "mouse");
775fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_STYLUS, "stylus");
7768d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_TRACKBALL, "trackball");
7778d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_TOUCHPAD, "touchpad");
77891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_JOYSTICK, "joystick");
77991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_GAMEPAD, "gamepad");
78091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        description.append(" )\n");
78191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
78291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        final int numAxes = mMotionRanges.size();
78391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        for (int i = 0; i < numAxes; i++) {
784efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            MotionRange range = mMotionRanges.get(i);
785efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            description.append("    ").append(MotionEvent.axisToString(range.mAxis));
786efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            description.append(": source=0x").append(Integer.toHexString(range.mSource));
787efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            description.append(" min=").append(range.mMin);
78891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            description.append(" max=").append(range.mMax);
78991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            description.append(" flat=").append(range.mFlat);
79091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            description.append(" fuzz=").append(range.mFuzz);
79191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            description.append("\n");
79291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        }
7938d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return description.toString();
7948d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
79591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
7968d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    private void appendSourceDescriptionIfApplicable(StringBuilder description, int source,
7978d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            String sourceName) {
7988d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        if ((mSources & source) == source) {
7998d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            description.append(" ");
8008d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            description.append(sourceName);
8018d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
8028d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
803c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown}
804