InputDevice.java revision 8d60866e2100db70ecf0502c14768a384514d7e9
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
198d60866e2100db70ecf0502c14768a384514d7e9Jeff Brownimport android.os.Parcel;
208d60866e2100db70ecf0502c14768a384514d7e9Jeff Brownimport android.os.Parcelable;
218d60866e2100db70ecf0502c14768a384514d7e9Jeff Brownimport android.os.RemoteException;
228d60866e2100db70ecf0502c14768a384514d7e9Jeff Brownimport android.os.ServiceManager;
238d60866e2100db70ecf0502c14768a384514d7e9Jeff Brownimport android.util.Log;
248d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
25c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown/**
26c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * Describes the capabilities of a particular input device.
27c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * <p>
28c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * Each input device may support multiple classes of input.  For example, a multifunction
29c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * keyboard may compose the capabilities of a standard keyboard together with a track pad mouse
30c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * or other pointing device.
31c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * </p><p>
32c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * Some input devices present multiple distinguishable sources of input.  For example, a
33c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * game pad may have two analog joysticks, a directional pad and a full complement of buttons.
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 {
42c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    private int mId;
43c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    private String mName;
44c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    private int mSources;
456d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    private int mKeyboardType;
46c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
478d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    private MotionRange[] mMotionRanges;
488d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
49c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
50c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A mask for input source classes.
51c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
52c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Each distinct input source constant has one or more input source class bits set to
53c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * specify the desired interpretation for its input events.
54c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
55c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_MASK = 0x000000ff;
56c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
57c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
58c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source has buttons or keys.
59c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Examples: {@link #SOURCE_KEYBOARD}, {@link #SOURCE_GAMEPAD}, {@link #SOURCE_DPAD}.
60c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
61c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A {@link KeyEvent} should be interpreted as a button or key press.
62c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
63e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * Use {@link #hasKey} to query whether the device supports a particular button or key.
64c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
65c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_BUTTON = 0x00000001;
66c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
67c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
68c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a pointing device associated with a display.
69c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Examples: {@link #SOURCE_TOUCHSCREEN}, {@link #SOURCE_MOUSE}.
70c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
71c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A {@link MotionEvent} should be interpreted as absolute coordinates in
72c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * display units according to the {@link View} hierarchy.  Pointer down/up indicated when
73c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * the finger touches the display or when the selection button is pressed/released.
74c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
75c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Use {@link #getMotionRange} to query the range of the pointing device.  Some devices permit
76c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * touches outside the display area so the effective range may be somewhat smaller or larger
77c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * than the actual display size.
78c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
79c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_POINTER = 0x00000002;
80c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
81c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
82c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a trackball navigation device.
83c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Examples: {@link #SOURCE_TRACKBALL}.
84c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
85c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A {@link MotionEvent} should be interpreted as relative movements in device-specific
86c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * units used for navigation purposes.  Pointer down/up indicates when the selection button
87c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * is pressed/released.
88c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
89c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Use {@link #getMotionRange} to query the range of motion.
90c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
91c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_TRACKBALL = 0x00000004;
92c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
93c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
94c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is an absolute positioning device not associated with a display
95c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * (unlike {@link #SOURCE_CLASS_POINTER}).
96c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
97c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A {@link MotionEvent} should be interpreted as absolute coordinates in
98c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * device-specific surface units.
99c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
100c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Use {@link #getMotionRange} to query the range of positions.
101c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
102c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_POSITION = 0x00000008;
103c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
104c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
105c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a joystick.
106c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
107c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A {@link KeyEvent} should be interpreted as a joystick button press.
108c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
109c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * A {@link MotionEvent} should be interpreted in absolute coordinates as a joystick
110c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * position in normalized device-specific units nominally between -1.0 and 1.0.
111c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
112c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Use {@link #getMotionRange} to query the range and precision of motion.
113c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
114c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_CLASS_JOYSTICK = 0x00000010;
115c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
116c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
117c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is unknown.
118c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
119c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_UNKNOWN = 0x00000000;
120c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
121c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
122c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a keyboard.
123c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
124c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_BUTTON
125c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
126c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_KEYBOARD = 0x00000100 | SOURCE_CLASS_BUTTON;
127c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
128c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
129c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a DPad.
130c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
131c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_BUTTON
132c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
133c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_DPAD = 0x00000200 | SOURCE_CLASS_BUTTON;
134c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
135c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
136c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a gamepad.
137c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
138c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_BUTTON
139c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
140c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_GAMEPAD = 0x00000400 | SOURCE_CLASS_BUTTON;
141c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
142c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
143c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a touch screen pointing device.
144c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
145c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_POINTER
146c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
147c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_TOUCHSCREEN = 0x00001000 | SOURCE_CLASS_POINTER;
148c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
149c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
150c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a mouse pointing device.
151c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * This code is also used for other mouse-like pointing devices such as trackpads
152c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * and trackpoints.
153c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
154c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_POINTER
155c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
156c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_MOUSE = 0x00002000 | SOURCE_CLASS_POINTER;
157c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
158c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
159c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a trackball.
160c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
161c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_TRACKBALL
162c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
163c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_TRACKBALL = 0x00010000 | SOURCE_CLASS_TRACKBALL;
164c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
165c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
166c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a touch pad or digitizer tablet that is not
167e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * associated with a display (unlike {@link #SOURCE_TOUCHSCREEN}).
168c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
169c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_POSITION
170c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
171c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_TOUCHPAD = 0x00100000 | SOURCE_CLASS_POSITION;
172c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
173c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
174c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a joystick mounted on the left or is a standalone joystick.
175c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
176c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_JOYSTICK
177c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
178c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_JOYSTICK_LEFT = 0x01000000 | SOURCE_CLASS_JOYSTICK;
179c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
180c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
181c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a joystick mounted on the right.
182c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
183c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_JOYSTICK
184c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
185c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_JOYSTICK_RIGHT = 0x02000000 | SOURCE_CLASS_JOYSTICK;
1866d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
1876d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
1886d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * A special input source constant that is used when filtering input devices
1896d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * to match devices that provide any type of input source.
1906d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
1916d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int SOURCE_ANY = 0xffffff00;
192c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
193e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
194e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent.PointerCoords#x}.
195e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
196e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
197e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
198c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int MOTION_RANGE_X = 0;
199e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown
200e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
201e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent.PointerCoords#y}.
202e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
203e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
204e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
205c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int MOTION_RANGE_Y = 1;
206e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown
207e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
208e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent.PointerCoords#pressure}.
209e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
210e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
211e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
212c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int MOTION_RANGE_PRESSURE = 2;
213e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown
214e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
215e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent.PointerCoords#size}.
216e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
217e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
218e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
219c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int MOTION_RANGE_SIZE = 3;
220e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown
221e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
222e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent.PointerCoords#touchMajor}.
223e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
224e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
225e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
226c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int MOTION_RANGE_TOUCH_MAJOR = 4;
227e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown
228e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
229e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent.PointerCoords#touchMinor}.
230e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
231e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
232e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
233c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int MOTION_RANGE_TOUCH_MINOR = 5;
234e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown
235e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
236e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent.PointerCoords#toolMajor}.
237e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
238e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
239e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
240c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int MOTION_RANGE_TOOL_MAJOR = 6;
241e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown
242e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
243e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent.PointerCoords#toolMinor}.
244e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
245e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
246e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
247c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int MOTION_RANGE_TOOL_MINOR = 7;
248c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
249e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
250e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * Constant for retrieving the range of values for
251e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * {@link MotionEvent.PointerCoords#orientation}.
252e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
253e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
254e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
255e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    public static final int MOTION_RANGE_ORIENTATION = 8;
2566d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
2578d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    private static final int MOTION_RANGE_LAST = MOTION_RANGE_ORIENTATION;
2588d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
2596d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
2606d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * There is no keyboard.
2616d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
2626d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int KEYBOARD_TYPE_NONE = 0;
2636d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
2646d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
2656d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * The keyboard is not fully alphabetic.  It may be a numeric keypad or an assortment
2666d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * of buttons that are not mapped as alphabetic keys suitable for text input.
2676d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
2686d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int KEYBOARD_TYPE_NON_ALPHABETIC = 1;
2696d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
2706d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
2716d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * The keyboard supports a complement of alphabetic keys.
2726d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
2736d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int KEYBOARD_TYPE_ALPHABETIC = 2;
2748d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
2758d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    // Called by native code.
2768d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    private InputDevice() {
2778d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        mMotionRanges = new MotionRange[MOTION_RANGE_LAST + 1];
2788d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
279e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown
280e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
281e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * Gets information about the input device with the specified id.
282e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @param id The device id.
283e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @return The input device or null if not found.
284e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
285c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static InputDevice getDevice(int id) {
2868d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
2878d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        try {
2888d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return wm.getInputDevice(id);
2898d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        } catch (RemoteException ex) {
2908d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            throw new RuntimeException(
2918d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                    "Could not get input device information from Window Manager.", ex);
2928d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
2938d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
2948d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
2958d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    /**
2968d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * Gets the ids of all input devices in the system.
2978d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * @return The input device ids.
2988d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     */
2998d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public static int[] getDeviceIds() {
3008d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
3018d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        try {
3028d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return wm.getInputDeviceIds();
3038d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        } catch (RemoteException ex) {
3048d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            throw new RuntimeException(
3058d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                    "Could not get input device ids from Window Manager.", ex);
3068d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
3078d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
3088d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
3098d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    /**
3108d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * Gets the input device id.
3118d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * @return The input device id.
3128d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     */
3138d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public int getId() {
3148d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return mId;
315c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
316c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
317c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
318c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Gets the name of this input device.
319c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @return The input device name.
320c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
321c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public String getName() {
322c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mName;
323c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
324c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
325c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
326c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Gets the input sources supported by this input device as a combined bitfield.
327c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @return The supported input sources.
328c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
329c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public int getSources() {
330c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mSources;
331c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
332c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
333c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
3346d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * Gets the keyboard type.
3356d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * @return The keyboard type.
3366d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
3376d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public int getKeyboardType() {
3386d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mKeyboardType;
3396d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    }
3406d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
3416d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
342c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Gets the key character map associated with this input device.
343c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @return The key character map.
344c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
345c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public KeyCharacterMap getKeyCharacterMap() {
346c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return KeyCharacterMap.load(mId);
347c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
348c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
349e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
350e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * Gets information about the range of values for a particular {@link MotionEvent}
351e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * coordinate.
3528d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * @param rangeType The motion range constant.
353e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @return The range of values, or null if the requested coordinate is not
354e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * supported by the device.
355e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
3568d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public MotionRange getMotionRange(int rangeType) {
3578d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        if (rangeType < 0 || rangeType > MOTION_RANGE_LAST) {
3588d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            throw new IllegalArgumentException("Requested range is out of bounds.");
3598d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
3608d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
3618d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return mMotionRanges[rangeType];
362c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
363c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
3648d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    private void addMotionRange(int rangeType, float min, float max, float flat, float fuzz) {
3658d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        if (rangeType >= 0 && rangeType <= MOTION_RANGE_LAST) {
3668d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            MotionRange range = new MotionRange(min, max, flat, fuzz);
3678d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mMotionRanges[rangeType] = range;
3688d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
369c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
370c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
371e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
372e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * Provides information about the range of values for a particular {@link MotionEvent}
373e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * coordinate.
374e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
375c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final class MotionRange {
3768d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mMin;
3778d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mMax;
3788d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mFlat;
3798d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mFuzz;
3808d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
3818d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private MotionRange(float min, float max, float flat, float fuzz) {
3828d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mMin = min;
3838d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mMax = max;
3848d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mFlat = flat;
3858d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mFuzz = fuzz;
3868d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
3878d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
388e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
389e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * Gets the minimum value for the coordinate.
390e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * @return The minimum value.
391e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
392e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getMin() {
3938d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mMin;
394e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
395e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown
396e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
397e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * Gets the maximum value for the coordinate.
398e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * @return The minimum value.
399e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
400e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getMax() {
4018d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mMax;
402e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
403e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown
404e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
405e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * Gets the range of the coordinate (difference between maximum and minimum).
406e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * @return The range of values.
407e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
408e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getRange() {
4098d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mMax - mMin;
410e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
411e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown
412e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
413e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * Gets the extent of the center flat position with respect to this coordinate.
414e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * For example, a flat value of 8 means that the center position is between -8 and +8.
415e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * This value is mainly useful for calibrating joysticks.
416e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * @return The extent of the center flat position.
417e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
418e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getFlat() {
4198d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mFlat;
420e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
421e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown
422e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
423e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * Gets the error tolerance for input device measurements with respect to this coordinate.
424e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * For example, a value of 2 indicates that the measured value may be up to +/- 2 units
425e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * away from the actual value due to noise and device sensitivity limitations.
426e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * @return The error tolerance.
427e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
428e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getFuzz() {
4298d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mFuzz;
4308d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
4318d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
4328d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
4338d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public static final Parcelable.Creator<InputDevice> CREATOR
4348d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            = new Parcelable.Creator<InputDevice>() {
4358d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        public InputDevice createFromParcel(Parcel in) {
4368d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            InputDevice result = new InputDevice();
4378d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            result.readFromParcel(in);
4388d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return result;
4398d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
4408d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
4418d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        public InputDevice[] newArray(int size) {
4428d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return new InputDevice[size];
4438d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
4448d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    };
4458d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
4468d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    private void readFromParcel(Parcel in) {
4478d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        mId = in.readInt();
4488d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        mName = in.readString();
4498d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        mSources = in.readInt();
4508d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        mKeyboardType = in.readInt();
4518d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
4528d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        for (;;) {
4538d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            int rangeType = in.readInt();
4548d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            if (rangeType < 0) {
4558d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                break;
4568d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            }
4578d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
4588d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            addMotionRange(rangeType,
4598d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                    in.readFloat(), in.readFloat(), in.readFloat(), in.readFloat());
4608d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
4618d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
4628d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
4638d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    @Override
4648d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public void writeToParcel(Parcel out, int flags) {
4658d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(mId);
4668d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeString(mName);
4678d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(mSources);
4688d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(mKeyboardType);
4698d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
4708d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        for (int i = 0; i <= MOTION_RANGE_LAST; i++) {
4718d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            MotionRange range = mMotionRanges[i];
4728d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            if (range != null) {
4738d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                out.writeInt(i);
4748d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                out.writeFloat(range.mMin);
4758d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                out.writeFloat(range.mMax);
4768d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                out.writeFloat(range.mFlat);
4778d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                out.writeFloat(range.mFuzz);
4788d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            }
4798d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
4808d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(-1);
4818d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
4828d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
4838d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    @Override
4848d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public int describeContents() {
4858d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return 0;
4868d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
4878d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
4888d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    @Override
4898d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public String toString() {
4908d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        StringBuilder description = new StringBuilder();
4918d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        description.append("Input Device ").append(mId).append(": ").append(mName).append("\n");
4928d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
4938d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        description.append("  Keyboard Type: ");
4948d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        switch (mKeyboardType) {
4958d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            case KEYBOARD_TYPE_NONE:
4968d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                description.append("none");
4978d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                break;
4988d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            case KEYBOARD_TYPE_NON_ALPHABETIC:
4998d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                description.append("non-alphabetic");
5008d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                break;
5018d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            case KEYBOARD_TYPE_ALPHABETIC:
5028d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                description.append("alphabetic");
5038d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                break;
5048d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
5058d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        description.append("\n");
5068d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
5078d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        description.append("  Sources:");
5088d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_KEYBOARD, "keyboard");
5098d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_DPAD, "dpad");
5108d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_GAMEPAD, "gamepad");
5118d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_TOUCHSCREEN, "touchscreen");
5128d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_MOUSE, "mouse");
5138d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_TRACKBALL, "trackball");
5148d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_TOUCHPAD, "touchpad");
5158d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_JOYSTICK_LEFT, "joystick_left");
5168d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_JOYSTICK_RIGHT, "joystick_right");
5178d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        description.append("\n");
5188d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
5198d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendRangeDescriptionIfApplicable(description, MOTION_RANGE_X, "x");
5208d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendRangeDescriptionIfApplicable(description, MOTION_RANGE_Y, "y");
5218d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendRangeDescriptionIfApplicable(description, MOTION_RANGE_PRESSURE, "pressure");
5228d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendRangeDescriptionIfApplicable(description, MOTION_RANGE_SIZE, "size");
5238d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendRangeDescriptionIfApplicable(description, MOTION_RANGE_TOUCH_MAJOR, "touchMajor");
5248d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendRangeDescriptionIfApplicable(description, MOTION_RANGE_TOUCH_MINOR, "touchMinor");
5258d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendRangeDescriptionIfApplicable(description, MOTION_RANGE_TOOL_MAJOR, "toolMajor");
5268d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendRangeDescriptionIfApplicable(description, MOTION_RANGE_TOOL_MINOR, "toolMinor");
5278d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendRangeDescriptionIfApplicable(description, MOTION_RANGE_ORIENTATION, "orientation");
5288d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
5298d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return description.toString();
5308d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
5318d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
5328d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    private void appendSourceDescriptionIfApplicable(StringBuilder description, int source,
5338d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            String sourceName) {
5348d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        if ((mSources & source) == source) {
5358d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            description.append(" ");
5368d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            description.append(sourceName);
5378d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
5388d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
5398d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
5408d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    private void appendRangeDescriptionIfApplicable(StringBuilder description,
5418d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            int rangeType, String rangeName) {
5428d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        MotionRange range = mMotionRanges[rangeType];
5438d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        if (range != null) {
5448d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            description.append("  Range[").append(rangeName);
5458d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            description.append("]: min=").append(range.mMin);
5468d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            description.append(" max=").append(range.mMax);
5478d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            description.append(" flat=").append(range.mFlat);
5488d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            description.append(" fuzz=").append(range.mFuzz);
5498d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            description.append("\n");
550e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
551e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    }
552c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown}
553