InputDevice.java revision efd3266b719eed5f1b217021c0a9e76e4b274b06
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;
23efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown
24efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brownimport java.util.ArrayList;
25efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brownimport java.util.List;
268d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
27c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown/**
28c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * Describes the capabilities of a particular input device.
29c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * <p>
30c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * Each input device may support multiple classes of input.  For example, a multifunction
31c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * keyboard may compose the capabilities of a standard keyboard together with a track pad mouse
32c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * or other pointing device.
33c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * </p><p>
34dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * Some input devices present multiple distinguishable sources of input.
35c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * Applications can query the framework about the characteristics of each distinct source.
36c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * </p><p>
37c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * As a further wrinkle, different kinds of input sources uses different coordinate systems
38c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * to describe motion events.  Refer to the comments on the input source constants for
39c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * the appropriate interpretation.
406d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown * </p>
41c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown */
428d60866e2100db70ecf0502c14768a384514d7e9Jeff Brownpublic final class InputDevice implements Parcelable {
43c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    private int mId;
44c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    private String mName;
45c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    private int mSources;
466d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    private int mKeyboardType;
4791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
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.
121c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
122c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_BUTTON
123c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
124c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_KEYBOARD = 0x00000100 | SOURCE_CLASS_BUTTON;
125c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
126c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
127c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a DPad.
128c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
129c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_BUTTON
130c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
131c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_DPAD = 0x00000200 | SOURCE_CLASS_BUTTON;
132cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
133cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /**
134cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * The input source is a game pad.
135cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * (It may also be a {@link #SOURCE_JOYSTICK}).
136cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     *
137cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * @see #SOURCE_CLASS_BUTTON
138cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     */
139cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int SOURCE_GAMEPAD = 0x00000400 | SOURCE_CLASS_BUTTON;
140cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
141c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
142c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a touch screen pointing device.
143c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
144c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_POINTER
145c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
146c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_TOUCHSCREEN = 0x00001000 | SOURCE_CLASS_POINTER;
147c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
148c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
149c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a mouse pointing device.
150c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * This code is also used for other mouse-like pointing devices such as trackpads
151c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * and trackpoints.
152c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
153c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_POINTER
154c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
155c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_MOUSE = 0x00002000 | SOURCE_CLASS_POINTER;
156c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
157c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
158c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a trackball.
159c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
160c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_TRACKBALL
161c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
162c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_TRACKBALL = 0x00010000 | SOURCE_CLASS_TRACKBALL;
163c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
164c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
165c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The input source is a touch pad or digitizer tablet that is not
166e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * associated with a display (unlike {@link #SOURCE_TOUCHSCREEN}).
167c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
168c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #SOURCE_CLASS_POSITION
169c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
170c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final int SOURCE_TOUCHPAD = 0x00100000 | SOURCE_CLASS_POSITION;
171cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
172cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /**
173cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * The input source is a joystick.
174cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * (It may also be a {@link #SOURCE_GAMEPAD}).
175cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     *
176cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     * @see #SOURCE_CLASS_JOYSTICK
177cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown     */
178cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int SOURCE_JOYSTICK = 0x01000000 | SOURCE_CLASS_JOYSTICK;
179cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown
1806d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
1816d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * A special input source constant that is used when filtering input devices
1826d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * to match devices that provide any type of input source.
1836d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
1846d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int SOURCE_ANY = 0xffffff00;
185c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
186e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
18791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_X}.
188e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
189e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
19091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_X} instead.
191e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
19291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
19391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_X = MotionEvent.AXIS_X;
19491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
195e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
19691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_Y}.
197e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
198e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
19991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_Y} instead.
200e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
20191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
20291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_Y = MotionEvent.AXIS_Y;
20391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
204e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
20591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_PRESSURE}.
206e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
207e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
20891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_PRESSURE} instead.
209e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
21091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
21191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_PRESSURE = MotionEvent.AXIS_PRESSURE;
21291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
213e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
21491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_SIZE}.
215e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
216e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
21791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_SIZE} instead.
218e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
21991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
22091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_SIZE = MotionEvent.AXIS_SIZE;
22191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
222e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
22391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOUCH_MAJOR}.
224e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
225e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
22691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_TOUCH_MAJOR} instead.
227e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
22891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
22991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_TOUCH_MAJOR = MotionEvent.AXIS_TOUCH_MAJOR;
23091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
231e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
23291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOUCH_MINOR}.
233e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
234e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
23591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_TOUCH_MINOR} instead.
236e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
23791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
23891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_TOUCH_MINOR = MotionEvent.AXIS_TOUCH_MINOR;
23991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
240e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
24191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOOL_MAJOR}.
242e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
243e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
24491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_TOOL_MAJOR} instead.
245e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
24691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
24791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_TOOL_MAJOR = MotionEvent.AXIS_TOOL_MAJOR;
24891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
249e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
25091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_TOOL_MINOR}.
251e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
252e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
25391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_TOOL_MINOR} instead.
254e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
25591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
25691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_TOOL_MINOR = MotionEvent.AXIS_TOOL_MINOR;
25791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
258e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
25991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Constant for retrieving the range of values for {@link MotionEvent#AXIS_ORIENTATION}.
260e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     *
261e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @see #getMotionRange
26291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @deprecated Use {@link MotionEvent#AXIS_ORIENTATION} instead.
263e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
26491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Deprecated
26591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public static final int MOTION_RANGE_ORIENTATION = MotionEvent.AXIS_ORIENTATION;
2668d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
2676d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
2686d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * There is no keyboard.
2696d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
2706d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int KEYBOARD_TYPE_NONE = 0;
2716d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
2726d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
2736d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * The keyboard is not fully alphabetic.  It may be a numeric keypad or an assortment
2746d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * of buttons that are not mapped as alphabetic keys suitable for text input.
2756d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
2766d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int KEYBOARD_TYPE_NON_ALPHABETIC = 1;
2776d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
2786d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
2796d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * The keyboard supports a complement of alphabetic keys.
2806d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
2816d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public static final int KEYBOARD_TYPE_ALPHABETIC = 2;
28291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
2838d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    // Called by native code.
2848d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    private InputDevice() {
2858d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
286e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown
287e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
288e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * Gets information about the input device with the specified id.
289e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @param id The device id.
290e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * @return The input device or null if not found.
291e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
292c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static InputDevice getDevice(int id) {
2938d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
2948d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        try {
2958d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return wm.getInputDevice(id);
2968d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        } catch (RemoteException ex) {
2978d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            throw new RuntimeException(
2988d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                    "Could not get input device information from Window Manager.", ex);
2998d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
3008d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
3018d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
3028d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    /**
3038d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * Gets the ids of all input devices in the system.
3048d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * @return The input device ids.
3058d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     */
3068d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public static int[] getDeviceIds() {
3078d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
3088d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        try {
3098d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return wm.getInputDeviceIds();
3108d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        } catch (RemoteException ex) {
3118d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            throw new RuntimeException(
3128d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                    "Could not get input device ids from Window Manager.", ex);
3138d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
3148d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
3158d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
3168d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    /**
3178d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * Gets the input device id.
3188d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     * @return The input device id.
3198d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown     */
3208d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public int getId() {
3218d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return mId;
322c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
323c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
324c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
325c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Gets the name of this input device.
326c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @return The input device name.
327c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
328c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public String getName() {
329c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mName;
330c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
331c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
332c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
333c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Gets the input sources supported by this input device as a combined bitfield.
334c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @return The supported input sources.
335c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
336c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public int getSources() {
337c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mSources;
338c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
339c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
340c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
3416d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * Gets the keyboard type.
3426d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * @return The keyboard type.
3436d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     */
3446d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    public int getKeyboardType() {
3456d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        return mKeyboardType;
3466d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    }
3476d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown
3486d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    /**
349c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Gets the key character map associated with this input device.
350c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @return The key character map.
351c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
352c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public KeyCharacterMap getKeyCharacterMap() {
353c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return KeyCharacterMap.load(mId);
354c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
35591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
356e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
35791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Gets information about the range of values for a particular {@link MotionEvent} axis.
358efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * If the device supports multiple sources, the same axis may have different meanings
359efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * for each source.  Returns information about the first axis found for any source.
360efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * To obtain information about the axis for a specific source, use
361efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * {@link #getMotionRange(int, int)}.
362efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     *
36391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @param axis The axis constant.
36491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @return The range of values, or null if the requested axis is not
365e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * supported by the device.
36691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     *
36791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @see MotionEvent#AXIS_X
36891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @see MotionEvent#AXIS_Y
3696f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     * @see #getSupportedAxes()
370e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
37191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public MotionRange getMotionRange(int axis) {
372efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        final int numRanges = mMotionRanges.size();
373efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        for (int i = 0; i < numRanges; i++) {
374efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            final MotionRange range = mMotionRanges.get(i);
375efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            if (range.mAxis == axis) {
376efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown                return range;
377efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            }
378efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        }
379efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        return null;
380c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
38191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
3826f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    /**
383efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * Gets information about the range of values for a particular {@link MotionEvent} axis
384efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * used by a particular source on the device.
385efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * If the device supports multiple sources, the same axis may have different meanings
386efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * for each source.
387efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     *
388efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @param axis The axis constant.
389efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @param source The source for which to return information.
390efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @return The range of values, or null if the requested axis is not
391efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * supported by the device.
3926f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     *
393efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @see MotionEvent#AXIS_X
394efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @see MotionEvent#AXIS_Y
395efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @see #getSupportedAxes()
396efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     */
397efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    public MotionRange getMotionRange(int axis, int source) {
398efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        final int numRanges = mMotionRanges.size();
399efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        for (int i = 0; i < numRanges; i++) {
400efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            final MotionRange range = mMotionRanges.get(i);
401efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            if (range.mAxis == axis && range.mSource == source) {
402efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown                return range;
4036f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            }
4046f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        }
405efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        return null;
4066f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    }
4076f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown
408efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    /**
409efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * Gets the ranges for all axes supported by the device.
410efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @return The motion ranges for the device.
411efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     *
412efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     * @see #getMotionRange(int, int)
413efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown     */
414efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    public List<MotionRange> getMotionRanges() {
415efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        return mMotionRanges;
416efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    }
417efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown
418efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown    private void addMotionRange(int axis, int source,
419efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            float min, float max, float flat, float fuzz) {
420efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        mMotionRanges.add(new MotionRange(axis, source, min, max, flat, fuzz));
421c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
42291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
423e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown    /**
42491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * Provides information about the range of values for a particular {@link MotionEvent} axis.
42591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     *
42691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown     * @see InputDevice#getMotionRange(int)
427e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     */
428c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final class MotionRange {
429efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        private int mAxis;
430efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        private int mSource;
4318d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mMin;
4328d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mMax;
4338d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mFlat;
4348d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        private float mFuzz;
43591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
436efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        private MotionRange(int axis, int source, float min, float max, float flat, float fuzz) {
437efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            mAxis = axis;
438efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            mSource = source;
4398d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mMin = min;
4408d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mMax = max;
4418d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mFlat = flat;
4428d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            mFuzz = fuzz;
4438d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
44491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
445e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
446efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         * Gets the axis id.
447efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         * @return The axis id.
448efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         */
449efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        public int getAxis() {
450efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            return mAxis;
451efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        }
452efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown
453efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        /**
454efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         * Gets the source for which the axis is defined.
455efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         * @return The source.
456efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown         */
457efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        public int getSource() {
458efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            return mSource;
459efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        }
460efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown
461efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        /**
4626f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * Gets the inclusive minimum value for the axis.
4636f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * @return The inclusive minimum value.
464e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
465e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getMin() {
4668d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mMin;
467e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
46891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
469e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
4706f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * Gets the inclusive maximum value for the axis.
4716f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * @return The inclusive maximum value.
472e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
473e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getMax() {
4748d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mMax;
475e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
47691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
477e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
4786f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * Gets the range of the axis (difference between maximum and minimum).
479e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * @return The range of values.
480e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
481e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getRange() {
4826f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            return mMax - mMin;
483e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
48491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
485e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
48691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown         * Gets the extent of the center flat position with respect to this axis.
4876f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * <p>
488e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * For example, a flat value of 8 means that the center position is between -8 and +8.
489dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown         * This value is mainly useful for calibrating self-centering devices.
4906f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * </p>
491e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * @return The extent of the center flat position.
492e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
493e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getFlat() {
4948d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mFlat;
495e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        }
49691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
497e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        /**
49891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown         * Gets the error tolerance for input device measurements with respect to this axis.
4996f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * <p>
500e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * For example, a value of 2 indicates that the measured value may be up to +/- 2 units
501e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * away from the actual value due to noise and device sensitivity limitations.
5026f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown         * </p>
503e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         * @return The error tolerance.
504e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown         */
505e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown        public float getFuzz() {
5068d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return mFuzz;
5078d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
5088d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
50991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
5108d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public static final Parcelable.Creator<InputDevice> CREATOR
5118d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            = new Parcelable.Creator<InputDevice>() {
5128d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        public InputDevice createFromParcel(Parcel in) {
5138d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            InputDevice result = new InputDevice();
5148d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            result.readFromParcel(in);
5158d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return result;
5168d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
5178d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
5188d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        public InputDevice[] newArray(int size) {
5198d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            return new InputDevice[size];
5208d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
5218d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    };
5228d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
5238d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    private void readFromParcel(Parcel in) {
5248d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        mId = in.readInt();
5258d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        mName = in.readString();
5268d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        mSources = in.readInt();
5278d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        mKeyboardType = in.readInt();
52891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
5298d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        for (;;) {
53091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            int axis = in.readInt();
53191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            if (axis < 0) {
5328d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                break;
5338d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            }
534efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            addMotionRange(axis, in.readInt(),
535efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown                    in.readFloat(), in.readFloat(), in.readFloat(), in.readFloat());
5368d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
5378d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
5388d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
5398d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    @Override
5408d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public void writeToParcel(Parcel out, int flags) {
5418d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(mId);
5428d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeString(mName);
5438d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(mSources);
5448d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(mKeyboardType);
54591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
546efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        final int numRanges = mMotionRanges.size();
547efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        for (int i = 0; i < numRanges; i++) {
548efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            MotionRange range = mMotionRanges.get(i);
549efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            out.writeInt(range.mAxis);
550efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            out.writeInt(range.mSource);
55191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            out.writeFloat(range.mMin);
55291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            out.writeFloat(range.mMax);
55391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            out.writeFloat(range.mFlat);
55491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            out.writeFloat(range.mFuzz);
5558d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
5568d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        out.writeInt(-1);
5578d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
55891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
5598d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    @Override
5608d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public int describeContents() {
5618d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return 0;
5628d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
56391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
5648d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    @Override
5658d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    public String toString() {
5668d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        StringBuilder description = new StringBuilder();
5678d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        description.append("Input Device ").append(mId).append(": ").append(mName).append("\n");
5688d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown
5698d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        description.append("  Keyboard Type: ");
5708d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        switch (mKeyboardType) {
5718d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            case KEYBOARD_TYPE_NONE:
5728d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                description.append("none");
5738d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                break;
5748d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            case KEYBOARD_TYPE_NON_ALPHABETIC:
5758d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                description.append("non-alphabetic");
5768d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                break;
5778d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            case KEYBOARD_TYPE_ALPHABETIC:
5788d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                description.append("alphabetic");
5798d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown                break;
5808d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
5818d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        description.append("\n");
58291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
583efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown        description.append("  Sources: 0x").append(Integer.toHexString(mSources)).append(" (");
5848d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_KEYBOARD, "keyboard");
5858d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_DPAD, "dpad");
5868d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_TOUCHSCREEN, "touchscreen");
5878d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_MOUSE, "mouse");
5888d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_TRACKBALL, "trackball");
5898d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_TOUCHPAD, "touchpad");
59091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_JOYSTICK, "joystick");
59191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        appendSourceDescriptionIfApplicable(description, SOURCE_GAMEPAD, "gamepad");
59291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        description.append(" )\n");
59391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
59491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        final int numAxes = mMotionRanges.size();
59591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        for (int i = 0; i < numAxes; i++) {
596efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            MotionRange range = mMotionRanges.get(i);
597efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            description.append("    ").append(MotionEvent.axisToString(range.mAxis));
598efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            description.append(": source=0x").append(Integer.toHexString(range.mSource));
599efd3266b719eed5f1b217021c0a9e76e4b274b06Jeff Brown            description.append(" min=").append(range.mMin);
60091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            description.append(" max=").append(range.mMax);
60191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            description.append(" flat=").append(range.mFlat);
60291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            description.append(" fuzz=").append(range.mFuzz);
60391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown            description.append("\n");
60491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        }
6058d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        return description.toString();
6068d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
60791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
6088d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    private void appendSourceDescriptionIfApplicable(StringBuilder description, int source,
6098d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            String sourceName) {
6108d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        if ((mSources & source) == source) {
6118d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            description.append(" ");
6128d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown            description.append(sourceName);
6138d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown        }
6148d60866e2100db70ecf0502c14768a384514d7e9Jeff Brown    }
615c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown}
616