InputDevice.java revision 9f25b7fdf216c9ef0bd2322cd223eeaf0d60f77f
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
19ac14351e16e1258f1cb54e2bf772b8be004eb2b8Jeff Brownimport android.hardware.input.InputManager;
208d60866e2100db70ecf0502c14768a384514d7e9Jeff Brownimport android.os.Parcel;
218d60866e2100db70ecf0502c14768a384514d7e9Jeff Brownimport android.os.Parcelable;
22efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown
23efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brownimport java.util.ArrayList;
24efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brownimport java.util.List;
258d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
26c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown/**
27c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * Describes the capabilities of a particular input device.
28c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * <p>
299df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown * Each input device may support multiple classes of input.  For example, a multi-function
30c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * keyboard may compose the capabilities of a standard keyboard together with a track pad mouse
31c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * or other pointing device.
32c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * </p><p>
33dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * Some input devices present multiple distinguishable sources of input.
34c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * Applications can query the framework about the characteristics of each distinct source.
35c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * </p><p>
36c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * As a further wrinkle, different kinds of input sources uses different coordinate systems
37c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * to describe motion events.  Refer to the comments on the input source constants for
38c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * the appropriate interpretation.
396d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * </p>
40c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown */
418d60866e2100db70ecf0502c14768a384514d7e9Jeff Brownpublic final class InputDevice implements Parcelable {
429f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private final int mId;
439f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private final String mName;
449f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private final String mDescriptor;
459f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private final int mSources;
469f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private final int mKeyboardType;
479f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private final KeyCharacterMap mKeyCharacterMap;
48efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    private final ArrayList<MotionRange> mMotionRanges = new ArrayList<MotionRange>();
4991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
50c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
51c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A mask for input source classes.
52c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
53c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Each distinct input source constant has one or more input source class bits set to
54c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * specify the desired interpretation for its input events.
55c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
56c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_MASK = 0x000000ff;
57c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
58c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
59c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source has buttons or keys.
60dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * Examples: {@link #SOURCE_KEYBOARD}, {@link #SOURCE_DPAD}.
61c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
62c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A {@link KeyEvent} should be interpreted as a button or key press.
63c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
646eb5ac9ceeb3ff67d38c7ead54b4247e762f278dJeff Brown     * Use {@link #getKeyCharacterMap} to query the device's button and key mappings.
65c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
66c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_BUTTON = 0x00000001;
67c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
68c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
69c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a pointing device associated with a display.
70c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Examples: {@link #SOURCE_TOUCHSCREEN}, {@link #SOURCE_MOUSE}.
71c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
72c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A {@link MotionEvent} should be interpreted as absolute coordinates in
73c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * display units according to the {@link View} hierarchy.  Pointer down/up indicated when
74c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * the finger touches the display or when the selection button is pressed/released.
75c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
76c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Use {@link #getMotionRange} to query the range of the pointing device.  Some devices permit
77c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * touches outside the display area so the effective range may be somewhat smaller or larger
78c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * than the actual display size.
79c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
80c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_POINTER = 0x00000002;
81c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
82c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
83c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a trackball navigation device.
84c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Examples: {@link #SOURCE_TRACKBALL}.
85c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
86c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A {@link MotionEvent} should be interpreted as relative movements in device-specific
87c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * units used for navigation purposes.  Pointer down/up indicates when the selection button
88c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * is pressed/released.
89c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
90c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Use {@link #getMotionRange} to query the range of motion.
91c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
92c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_TRACKBALL = 0x00000004;
93c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
94c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
95c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is an absolute positioning device not associated with a display
96c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * (unlike {@link #SOURCE_CLASS_POINTER}).
97c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
98c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A {@link MotionEvent} should be interpreted as absolute coordinates in
99c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * device-specific surface units.
100c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
101c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Use {@link #getMotionRange} to query the range of positions.
102c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
103c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_POSITION = 0x00000008;
104cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
105cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /**
106cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * The input source is a joystick.
107cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     *
108cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * A {@link MotionEvent} should be interpreted as absolute joystick movements.
109cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     *
110cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * Use {@link #getMotionRange} to query the range of positions.
111cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     */
112cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int SOURCE_CLASS_JOYSTICK = 0x00000010;
113cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
114c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
115c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is unknown.
116c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
117c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_UNKNOWN = 0x00000000;
118c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
119c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
120c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a keyboard.
1219df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     *
1229df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * This source indicates pretty much anything that has buttons.  Use
1239df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * {@link #getKeyboardType()} to determine whether the keyboard has alphabetic keys
1249df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * and can be used to enter text.
1259df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     *
126c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_BUTTON
127c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
128c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_KEYBOARD = 0x00000100 | SOURCE_CLASS_BUTTON;
129c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
130c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
131c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a DPad.
132c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
133c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_BUTTON
134c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
135c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_DPAD = 0x00000200 | SOURCE_CLASS_BUTTON;
136cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
137cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /**
138cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * The input source is a game pad.
139cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * (It may also be a {@link #SOURCE_JOYSTICK}).
140cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     *
141cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * @see #SOURCE_CLASS_BUTTON
142cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     */
143cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int SOURCE_GAMEPAD = 0x00000400 | SOURCE_CLASS_BUTTON;
144cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
145c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
146c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a touch screen pointing device.
147c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
148c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_POINTER
149c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
150c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_TOUCHSCREEN = 0x00001000 | SOURCE_CLASS_POINTER;
151c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
152c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
153c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a mouse pointing device.
154c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * This code is also used for other mouse-like pointing devices such as trackpads
155c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * and trackpoints.
156c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
157c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_POINTER
158c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
159c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_MOUSE = 0x00002000 | SOURCE_CLASS_POINTER;
160fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown
161fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    /**
162fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown     * The input source is a stylus pointing device.
163fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown     *
164fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown     * @see #SOURCE_CLASS_POINTER
165fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown     */
166fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    public static final int SOURCE_STYLUS = 0x00004000 | SOURCE_CLASS_POINTER;
167fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown
168c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
169c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a trackball.
170c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
171c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_TRACKBALL
172c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
173c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_TRACKBALL = 0x00010000 | SOURCE_CLASS_TRACKBALL;
174c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
175c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
176c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a touch pad or digitizer tablet that is not
177e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * associated with a display (unlike {@link #SOURCE_TOUCHSCREEN}).
178c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
179c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_POSITION
180c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
181c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_TOUCHPAD = 0x00100000 | SOURCE_CLASS_POSITION;
182cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
183cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /**
184cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * The input source is a joystick.
185cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * (It may also be a {@link #SOURCE_GAMEPAD}).
186cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     *
187cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * @see #SOURCE_CLASS_JOYSTICK
188cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     */
189cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int SOURCE_JOYSTICK = 0x01000000 | SOURCE_CLASS_JOYSTICK;
190cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
1916d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
1926d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * A special input source constant that is used when filtering input devices
1936d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * to match devices that provide any type of input source.
1946d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
1956d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int SOURCE_ANY = 0xffffff00;
196c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
197e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
19891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_X}.
199e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
200e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
20191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_X} instead.
202e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
20391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
20491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_X = MotionEvent.AXIS_X;
20591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
206e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
20791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_Y}.
208e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
209e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
21091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_Y} instead.
211e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
21291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
21391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_Y = MotionEvent.AXIS_Y;
21491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
215e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
21691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_PRESSURE}.
217e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
218e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
21991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_PRESSURE} instead.
220e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
22191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
22291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_PRESSURE = MotionEvent.AXIS_PRESSURE;
22391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
224e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
22591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_SIZE}.
226e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
227e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
22891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_SIZE} instead.
229e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
23091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
23191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_SIZE = MotionEvent.AXIS_SIZE;
23291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
233e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
23491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOUCH_MAJOR}.
235e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
236e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
23791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_TOUCH_MAJOR} instead.
238e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
23991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
24091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_TOUCH_MAJOR = MotionEvent.AXIS_TOUCH_MAJOR;
24191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
242e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
24391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOUCH_MINOR}.
244e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
245e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
24691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_TOUCH_MINOR} instead.
247e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
24891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
24991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_TOUCH_MINOR = MotionEvent.AXIS_TOUCH_MINOR;
25091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
251e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
25291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOOL_MAJOR}.
253e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
254e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
25591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_TOOL_MAJOR} instead.
256e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
25791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
25891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_TOOL_MAJOR = MotionEvent.AXIS_TOOL_MAJOR;
25991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
260e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
26191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOOL_MINOR}.
262e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
263e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
26491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_TOOL_MINOR} instead.
265e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
26691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
26791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_TOOL_MINOR = MotionEvent.AXIS_TOOL_MINOR;
26891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
269e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
27091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_ORIENTATION}.
271e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
272e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
27391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_ORIENTATION} instead.
274e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
27591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
27691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_ORIENTATION = MotionEvent.AXIS_ORIENTATION;
2778d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
2786d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
2796d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * There is no keyboard.
2806d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
2816d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int KEYBOARD_TYPE_NONE = 0;
2826d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
2836d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
2846d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * The keyboard is not fully alphabetic.  It may be a numeric keypad or an assortment
2856d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * of buttons that are not mapped as alphabetic keys suitable for text input.
2866d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
2876d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int KEYBOARD_TYPE_NON_ALPHABETIC = 1;
2886d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
2896d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
2906d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * The keyboard supports a complement of alphabetic keys.
2916d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
2926d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int KEYBOARD_TYPE_ALPHABETIC = 2;
29391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
2949f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    public static final Parcelable.Creator<InputDevice> CREATOR =
2959f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            new Parcelable.Creator<InputDevice>() {
2969f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        public InputDevice createFromParcel(Parcel in) {
2979f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            return new InputDevice(in);
2989f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        }
2999f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        public InputDevice[] newArray(int size) {
3009f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            return new InputDevice[size];
3019f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        }
3029f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    };
3039f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
3048d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    // Called by native code.
3059f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private InputDevice(int id, String name, String descriptor, int sources,
3069f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            int keyboardType, KeyCharacterMap keyCharacterMap) {
3079f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mId = id;
3089f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mName = name;
3099f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mDescriptor = descriptor;
3109f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mSources = sources;
3119f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyboardType = keyboardType;
3129f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyCharacterMap = keyCharacterMap;
3139f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
3149f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
3159f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    private InputDevice(Parcel in) {
3169f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mId = in.readInt();
3179f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mName = in.readString();
3189f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mDescriptor = in.readString();
3199f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mSources = in.readInt();
3209f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyboardType = in.readInt();
3219f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyCharacterMap = KeyCharacterMap.CREATOR.createFromParcel(in);
3229f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
3239f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        for (;;) {
3249f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            int axis = in.readInt();
3259f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            if (axis < 0) {
3269f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown                break;
3279f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            }
3289f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown            addMotionRange(axis, in.readInt(),
3299f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown                    in.readFloat(), in.readFloat(), in.readFloat(), in.readFloat());
3309f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        }
3318d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
332e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown
333e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
334e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * Gets information about the input device with the specified id.
335e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @param id The device id.
336e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @return The input device or null if not found.
337e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
338c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static InputDevice getDevice(int id) {
3399f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return InputManager.getInstance().getInputDevice(id);
3408d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
3418d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
3428d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    /**
3438d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * Gets the ids of all input devices in the system.
3448d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * @return The input device ids.
3458d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     */
3468d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public static int[] getDeviceIds() {
3479f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return InputManager.getInstance().getInputDeviceIds();
3488d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
3499df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown
3508d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    /**
3518d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * Gets the input device id.
3529df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * <p>
3539df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * Each input device receives a unique id when it is first configured
3549df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * by the system.  The input device id may change when the system is restarted or if the
3559df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * input device is disconnected, reconnected or reconfigured at any time.
3569df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * If you require a stable identifier for a device that persists across
3579df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * boots and reconfigurations, use {@link #getDescriptor()}.
3589df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * </p>
3599df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     *
3608d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * @return The input device id.
3618d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     */
3628d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public int getId() {
3638d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return mId;
364c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
3659df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown
3669df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown    /**
3679df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * Gets the input device descriptor, which is a stable identifier for an input device.
3689df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * <p>
3699df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * An input device descriptor uniquely identifies an input device.  Its value
3709df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * is intended to be persistent across system restarts, and should not change even
3719df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * if the input device is disconnected, reconnected or reconfigured at any time.
372e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * </p><p>
373e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * It is possible for there to be multiple {@link InputDevice} instances that have the
374e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * same input device descriptor.  This might happen in situations where a single
375e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * human input device registers multiple {@link InputDevice} instances (HID collections)
376e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * that describe separate features of the device, such as a keyboard that also
377e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * has a trackpad.  Alternately, it may be that the input devices are simply
378e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * indistinguishable, such as two keyboards made by the same manufacturer.
379e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * </p><p>
380e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * The input device descriptor returned by {@link #getDescriptor} should only bt
381e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * used when an application needs to remember settings associated with a particular
382e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * input device.  For all other purposes when referring to a logical
383e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown     * {@link InputDevice} instance at runtime use the id returned by {@link #getId()}.
3849df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * </p>
3859df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     *
3869df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     * @return The input device descriptor.
3879df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown     */
3889df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown    public String getDescriptor() {
389e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown        return mDescriptor;
3909df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown    }
3919df6e7a926ce480baf70e97ee1b9ea387193f6adJeff Brown
392c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
3939f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * Returns true if the device is a virtual input device rather than a real one,
3949f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * such as the virtual keyboard (see {@link KeyCharacterMap#VIRTUAL_KEYBOARD}).
3959f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * <p>
3969f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * Virtual input devices are provided to implement system-level functionality
3979f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * and should not be seen or configured by users.
3989f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * </p>
3999f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     *
4009f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * @return True if the device is virtual.
4019f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     *
4029f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     * @see KeyCharacterMap#VIRTUAL_KEYBOARD
4039f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown     */
4049f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    public boolean isVirtual() {
4059f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return mId < 0;
4069f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    }
4079f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown
4089f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    /**
409c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Gets the name of this input device.
410c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @return The input device name.
411c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
412c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public String getName() {
413c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mName;
414c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
415c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
416c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
417c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Gets the input sources supported by this input device as a combined bitfield.
418c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @return The supported input sources.
419c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
420c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public int getSources() {
421c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mSources;
422c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
423c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
424c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
4256d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * Gets the keyboard type.
4266d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * @return The keyboard type.
4276d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
4286d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public int getKeyboardType() {
4296d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mKeyboardType;
4306d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    }
4316d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
4326d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
433c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Gets the key character map associated with this input device.
434c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @return The key character map.
435c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
436c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public KeyCharacterMap getKeyCharacterMap() {
4379f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        return mKeyCharacterMap;
4381e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown    }
4391e08fe90df18930691b0c2ec22e5db25d7fcb4cfJeff Brown
440e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
44191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Gets information about the range of values for a particular {@link MotionEvent} axis.
442efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * If the device supports multiple sources, the same axis may have different meanings
443efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * for each source.  Returns information about the first axis found for any source.
444efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * To obtain information about the axis for a specific source, use
445efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * {@link #getMotionRange(int, int)}.
446efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     *
44791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @param axis The axis constant.
44891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @return The range of values, or null if the requested axis is not
449e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * supported by the device.
45091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     *
45191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @see MotionEvent#AXIS_X
45291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @see MotionEvent#AXIS_Y
4536f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     * @see #getSupportedAxes()
454e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
45591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public MotionRange getMotionRange(int axis) {
456efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        final int numRanges = mMotionRanges.size();
457efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        for (int i = 0; i < numRanges; i++) {
458efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            final MotionRange range = mMotionRanges.get(i);
459efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            if (range.mAxis == axis) {
460efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown                return range;
461efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            }
462efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        }
463efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        return null;
464c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
46591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
4666f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    /**
467efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * Gets information about the range of values for a particular {@link MotionEvent} axis
468efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * used by a particular source on the device.
469efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * If the device supports multiple sources, the same axis may have different meanings
470efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * for each source.
471efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     *
472efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @param axis The axis constant.
473efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @param source The source for which to return information.
474efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @return The range of values, or null if the requested axis is not
475efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * supported by the device.
4766f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     *
477efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @see MotionEvent#AXIS_X
478efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @see MotionEvent#AXIS_Y
479efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @see #getSupportedAxes()
480efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     */
481efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    public MotionRange getMotionRange(int axis, int source) {
482efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        final int numRanges = mMotionRanges.size();
483efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        for (int i = 0; i < numRanges; i++) {
484efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            final MotionRange range = mMotionRanges.get(i);
485efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            if (range.mAxis == axis && range.mSource == source) {
486efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown                return range;
4876f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            }
4886f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        }
489efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        return null;
4906f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    }
4916f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown
492efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    /**
493efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * Gets the ranges for all axes supported by the device.
494efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @return The motion ranges for the device.
495efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     *
496efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @see #getMotionRange(int, int)
497efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     */
498efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    public List<MotionRange> getMotionRanges() {
499efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        return mMotionRanges;
500efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    }
501efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown
5029f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown    // Called from native code.
503efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    private void addMotionRange(int axis, int source,
504efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            float min, float max, float flat, float fuzz) {
505efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        mMotionRanges.add(new MotionRange(axis, source, min, max, flat, fuzz));
506c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
50791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
508e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
50991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Provides information about the range of values for a particular {@link MotionEvent} axis.
51091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     *
51191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @see InputDevice#getMotionRange(int)
512e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
513c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final class MotionRange {
514efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        private int mAxis;
515efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        private int mSource;
5168d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mMin;
5178d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mMax;
5188d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mFlat;
5198d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mFuzz;
52091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
521efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        private MotionRange(int axis, int source, float min, float max, float flat, float fuzz) {
522efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            mAxis = axis;
523efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            mSource = source;
5248d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mMin = min;
5258d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mMax = max;
5268d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mFlat = flat;
5278d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mFuzz = fuzz;
5288d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
52991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
530e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
531efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         * Gets the axis id.
532efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         * @return The axis id.
533efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         */
534efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        public int getAxis() {
535efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            return mAxis;
536efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        }
537efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown
538efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        /**
539efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         * Gets the source for which the axis is defined.
540efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         * @return The source.
541efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         */
542efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        public int getSource() {
543efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            return mSource;
544efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        }
545efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown
546efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        /**
5476f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * Gets the inclusive minimum value for the axis.
5486f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * @return The inclusive minimum value.
549e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
550e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getMin() {
5518d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mMin;
552e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
55391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
554e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
5556f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * Gets the inclusive maximum value for the axis.
5566f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * @return The inclusive maximum value.
557e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
558e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getMax() {
5598d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mMax;
560e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
56191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
562e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
5636f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * Gets the range of the axis (difference between maximum and minimum).
564e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * @return The range of values.
565e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
566e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getRange() {
5676f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            return mMax - mMin;
568e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
56991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
570e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
57191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown         * Gets the extent of the center flat position with respect to this axis.
5726f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * <p>
573e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * For example, a flat value of 8 means that the center position is between -8 and +8.
574dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown         * This value is mainly useful for calibrating self-centering devices.
5756f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * </p>
576e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * @return The extent of the center flat position.
577e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
578e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getFlat() {
5798d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mFlat;
580e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
58191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
582e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
58391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown         * Gets the error tolerance for input device measurements with respect to this axis.
5846f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * <p>
585e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * For example, a value of 2 indicates that the measured value may be up to +/- 2 units
586e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * away from the actual value due to noise and device sensitivity limitations.
5876f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * </p>
588e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * @return The error tolerance.
589e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
590e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getFuzz() {
5918d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mFuzz;
5928d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
5938d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
59491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
5958d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    @Override
5968d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public void writeToParcel(Parcel out, int flags) {
5978d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(mId);
5988d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeString(mName);
599e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown        out.writeString(mDescriptor);
6008d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(mSources);
6018d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(mKeyboardType);
6029f25b7fdf216c9ef0bd2322cd223eeaf0d60f77fJeff Brown        mKeyCharacterMap.writeToParcel(out, flags);
60391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
604efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        final int numRanges = mMotionRanges.size();
605efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        for (int i = 0; i < numRanges; i++) {
606efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            MotionRange range = mMotionRanges.get(i);
607efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            out.writeInt(range.mAxis);
608efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            out.writeInt(range.mSource);
60991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            out.writeFloat(range.mMin);
61091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            out.writeFloat(range.mMax);
61191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            out.writeFloat(range.mFlat);
61291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            out.writeFloat(range.mFuzz);
6138d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
6148d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(-1);
6158d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
61691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
6178d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    @Override
6188d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public int describeContents() {
6198d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return 0;
6208d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
62191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
6228d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    @Override
6238d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public String toString() {
6248d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        StringBuilder description = new StringBuilder();
6258d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        description.append("Input Device ").append(mId).append(": ").append(mName).append("\n");
626e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown        description.append("  Descriptor: ").append(mDescriptor).append("\n");
627e38fdfae9196afd1bdc14c5ec6c12793af1e2550Jeff Brown
6288d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        description.append("  Keyboard Type: ");
6298d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        switch (mKeyboardType) {
6308d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            case KEYBOARD_TYPE_NONE:
6318d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                description.append("none");
6328d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                break;
6338d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            case KEYBOARD_TYPE_NON_ALPHABETIC:
6348d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                description.append("non-alphabetic");
6358d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                break;
6368d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            case KEYBOARD_TYPE_ALPHABETIC:
6378d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                description.append("alphabetic");
6388d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                break;
6398d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
6408d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        description.append("\n");
64191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
642efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        description.append("  Sources: 0x").append(Integer.toHexString(mSources)).append(" (");
6438d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_KEYBOARD, "keyboard");
6448d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_DPAD, "dpad");
6458d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_TOUCHSCREEN, "touchscreen");
6468d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_MOUSE, "mouse");
647fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_STYLUS, "stylus");
6488d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_TRACKBALL, "trackball");
6498d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_TOUCHPAD, "touchpad");
65091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_JOYSTICK, "joystick");
65191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_GAMEPAD, "gamepad");
65291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        description.append(" )\n");
65391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
65491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        final int numAxes = mMotionRanges.size();
65591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        for (int i = 0; i < numAxes; i++) {
656efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            MotionRange range = mMotionRanges.get(i);
657efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            description.append("    ").append(MotionEvent.axisToString(range.mAxis));
658efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            description.append(": source=0x").append(Integer.toHexString(range.mSource));
659efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            description.append(" min=").append(range.mMin);
66091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            description.append(" max=").append(range.mMax);
66191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            description.append(" flat=").append(range.mFlat);
66291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            description.append(" fuzz=").append(range.mFuzz);
66391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            description.append("\n");
66491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        }
6658d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return description.toString();
6668d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
66791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
6688d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    private void appendSourceDescriptionIfApplicable(StringBuilder description, int source,
6698d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            String sourceName) {
6708d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        if ((mSources & source) == source) {
6718d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            description.append(" ");
6728d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            description.append(sourceName);
6738d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
6748d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
675c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown}
676