1/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.view;
18
19import android.graphics.Matrix;
20import android.os.Parcel;
21import android.os.Parcelable;
22import android.os.SystemClock;
23import android.util.SparseArray;
24
25/**
26 * Object used to report movement (mouse, pen, finger, trackball) events.
27 * Motion events may hold either absolute or relative movements and other data,
28 * depending on the type of device.
29 *
30 * <h3>Overview</h3>
31 * <p>
32 * Motion events describe movements in terms of an action code and a set of axis values.
33 * The action code specifies the state change that occurred such as a pointer going
34 * down or up.  The axis values describe the position and other movement properties.
35 * </p><p>
36 * For example, when the user first touches the screen, the system delivers a touch
37 * event to the appropriate {@link View} with the action code {@link #ACTION_DOWN}
38 * and a set of axis values that include the X and Y coordinates of the touch and
39 * information about the pressure, size and orientation of the contact area.
40 * </p><p>
41 * Some devices can report multiple movement traces at the same time.  Multi-touch
42 * screens emit one movement trace for each finger.  The individual fingers or
43 * other objects that generate movement traces are referred to as <em>pointers</em>.
44 * Motion events contain information about all of the pointers that are currently active
45 * even if some of them have not moved since the last event was delivered.
46 * </p><p>
47 * The number of pointers only ever changes by one as individual pointers go up and down,
48 * except when the gesture is canceled.
49 * </p><p>
50 * Each pointer has a unique id that is assigned when it first goes down
51 * (indicated by {@link #ACTION_DOWN} or {@link #ACTION_POINTER_DOWN}).  A pointer id
52 * remains valid until the pointer eventually goes up (indicated by {@link #ACTION_UP}
53 * or {@link #ACTION_POINTER_UP}) or when the gesture is canceled (indicated by
54 * {@link #ACTION_CANCEL}).
55 * </p><p>
56 * The MotionEvent class provides many methods to query the position and other properties of
57 * pointers, such as {@link #getX(int)}, {@link #getY(int)}, {@link #getAxisValue},
58 * {@link #getPointerId(int)}, {@link #getToolType(int)}, and many others.  Most of these
59 * methods accept the pointer index as a parameter rather than the pointer id.
60 * The pointer index of each pointer in the event ranges from 0 to one less than the value
61 * returned by {@link #getPointerCount()}.
62 * </p><p>
63 * The order in which individual pointers appear within a motion event is undefined.
64 * Thus the pointer index of a pointer can change from one event to the next but
65 * the pointer id of a pointer is guaranteed to remain constant as long as the pointer
66 * remains active.  Use the {@link #getPointerId(int)} method to obtain the
67 * pointer id of a pointer to track it across all subsequent motion events in a gesture.
68 * Then for successive motion events, use the {@link #findPointerIndex(int)} method
69 * to obtain the pointer index for a given pointer id in that motion event.
70 * </p><p>
71 * Mouse and stylus buttons can be retrieved using {@link #getButtonState()}.  It is a
72 * good idea to check the button state while handling {@link #ACTION_DOWN} as part
73 * of a touch event.  The application may choose to perform some different action
74 * if the touch event starts due to a secondary button click, such as presenting a
75 * context menu.
76 * </p>
77 *
78 * <h3>Batching</h3>
79 * <p>
80 * For efficiency, motion events with {@link #ACTION_MOVE} may batch together
81 * multiple movement samples within a single object.  The most current
82 * pointer coordinates are available using {@link #getX(int)} and {@link #getY(int)}.
83 * Earlier coordinates within the batch are accessed using {@link #getHistoricalX(int, int)}
84 * and {@link #getHistoricalY(int, int)}.  The coordinates are "historical" only
85 * insofar as they are older than the current coordinates in the batch; however,
86 * they are still distinct from any other coordinates reported in prior motion events.
87 * To process all coordinates in the batch in time order, first consume the historical
88 * coordinates then consume the current coordinates.
89 * </p><p>
90 * Example: Consuming all samples for all pointers in a motion event in time order.
91 * </p><p><pre><code>
92 * void printSamples(MotionEvent ev) {
93 *     final int historySize = ev.getHistorySize();
94 *     final int pointerCount = ev.getPointerCount();
95 *     for (int h = 0; h &lt; historySize; h++) {
96 *         System.out.printf("At time %d:", ev.getHistoricalEventTime(h));
97 *         for (int p = 0; p &lt; pointerCount; p++) {
98 *             System.out.printf("  pointer %d: (%f,%f)",
99 *                 ev.getPointerId(p), ev.getHistoricalX(p, h), ev.getHistoricalY(p, h));
100 *         }
101 *     }
102 *     System.out.printf("At time %d:", ev.getEventTime());
103 *     for (int p = 0; p &lt; pointerCount; p++) {
104 *         System.out.printf("  pointer %d: (%f,%f)",
105 *             ev.getPointerId(p), ev.getX(p), ev.getY(p));
106 *     }
107 * }
108 * </code></pre></p>
109 *
110 * <h3>Device Types</h3>
111 * <p>
112 * The interpretation of the contents of a MotionEvent varies significantly depending
113 * on the source class of the device.
114 * </p><p>
115 * On pointing devices with source class {@link InputDevice#SOURCE_CLASS_POINTER}
116 * such as touch screens, the pointer coordinates specify absolute
117 * positions such as view X/Y coordinates.  Each complete gesture is represented
118 * by a sequence of motion events with actions that describe pointer state transitions
119 * and movements.  A gesture starts with a motion event with {@link #ACTION_DOWN}
120 * that provides the location of the first pointer down.  As each additional
121 * pointer that goes down or up, the framework will generate a motion event with
122 * {@link #ACTION_POINTER_DOWN} or {@link #ACTION_POINTER_UP} accordingly.
123 * Pointer movements are described by motion events with {@link #ACTION_MOVE}.
124 * Finally, a gesture end either when the final pointer goes up as represented
125 * by a motion event with {@link #ACTION_UP} or when gesture is canceled
126 * with {@link #ACTION_CANCEL}.
127 * </p><p>
128 * Some pointing devices such as mice may support vertical and/or horizontal scrolling.
129 * A scroll event is reported as a generic motion event with {@link #ACTION_SCROLL} that
130 * includes the relative scroll offset in the {@link #AXIS_VSCROLL} and
131 * {@link #AXIS_HSCROLL} axes.  See {@link #getAxisValue(int)} for information
132 * about retrieving these additional axes.
133 * </p><p>
134 * On trackball devices with source class {@link InputDevice#SOURCE_CLASS_TRACKBALL},
135 * the pointer coordinates specify relative movements as X/Y deltas.
136 * A trackball gesture consists of a sequence of movements described by motion
137 * events with {@link #ACTION_MOVE} interspersed with occasional {@link #ACTION_DOWN}
138 * or {@link #ACTION_UP} motion events when the trackball button is pressed or released.
139 * </p><p>
140 * On joystick devices with source class {@link InputDevice#SOURCE_CLASS_JOYSTICK},
141 * the pointer coordinates specify the absolute position of the joystick axes.
142 * The joystick axis values are normalized to a range of -1.0 to 1.0 where 0.0 corresponds
143 * to the center position.  More information about the set of available axes and the
144 * range of motion can be obtained using {@link InputDevice#getMotionRange}.
145 * Some common joystick axes are {@link #AXIS_X}, {@link #AXIS_Y},
146 * {@link #AXIS_HAT_X}, {@link #AXIS_HAT_Y}, {@link #AXIS_Z} and {@link #AXIS_RZ}.
147 * </p><p>
148 * Refer to {@link InputDevice} for more information about how different kinds of
149 * input devices and sources represent pointer coordinates.
150 * </p>
151 *
152 * <h3>Consistency Guarantees</h3>
153 * <p>
154 * Motion events are always delivered to views as a consistent stream of events.
155 * What constitutes a consistent stream varies depending on the type of device.
156 * For touch events, consistency implies that pointers go down one at a time,
157 * move around as a group and then go up one at a time or are canceled.
158 * </p><p>
159 * While the framework tries to deliver consistent streams of motion events to
160 * views, it cannot guarantee it.  Some events may be dropped or modified by
161 * containing views in the application before they are delivered thereby making
162 * the stream of events inconsistent.  Views should always be prepared to
163 * handle {@link #ACTION_CANCEL} and should tolerate anomalous
164 * situations such as receiving a new {@link #ACTION_DOWN} without first having
165 * received an {@link #ACTION_UP} for the prior gesture.
166 * </p>
167 */
168public final class MotionEvent extends InputEvent implements Parcelable {
169    private static final long NS_PER_MS = 1000000;
170
171    /**
172     * An invalid pointer id.
173     *
174     * This value (-1) can be used as a placeholder to indicate that a pointer id
175     * has not been assigned or is not available.  It cannot appear as
176     * a pointer id inside a {@link MotionEvent}.
177     */
178    public static final int INVALID_POINTER_ID = -1;
179
180    /**
181     * Bit mask of the parts of the action code that are the action itself.
182     */
183    public static final int ACTION_MASK             = 0xff;
184
185    /**
186     * Constant for {@link #getActionMasked}: A pressed gesture has started, the
187     * motion contains the initial starting location.
188     * <p>
189     * This is also a good time to check the button state to distinguish
190     * secondary and tertiary button clicks and handle them appropriately.
191     * Use {@link #getButtonState} to retrieve the button state.
192     * </p>
193     */
194    public static final int ACTION_DOWN             = 0;
195
196    /**
197     * Constant for {@link #getActionMasked}: A pressed gesture has finished, the
198     * motion contains the final release location as well as any intermediate
199     * points since the last down or move event.
200     */
201    public static final int ACTION_UP               = 1;
202
203    /**
204     * Constant for {@link #getActionMasked}: A change has happened during a
205     * press gesture (between {@link #ACTION_DOWN} and {@link #ACTION_UP}).
206     * The motion contains the most recent point, as well as any intermediate
207     * points since the last down or move event.
208     */
209    public static final int ACTION_MOVE             = 2;
210
211    /**
212     * Constant for {@link #getActionMasked}: The current gesture has been aborted.
213     * You will not receive any more points in it.  You should treat this as
214     * an up event, but not perform any action that you normally would.
215     */
216    public static final int ACTION_CANCEL           = 3;
217
218    /**
219     * Constant for {@link #getActionMasked}: A movement has happened outside of the
220     * normal bounds of the UI element.  This does not provide a full gesture,
221     * but only the initial location of the movement/touch.
222     */
223    public static final int ACTION_OUTSIDE          = 4;
224
225    /**
226     * Constant for {@link #getActionMasked}: A non-primary pointer has gone down.
227     * <p>
228     * Use {@link #getActionIndex} to retrieve the index of the pointer that changed.
229     * </p><p>
230     * The index is encoded in the {@link #ACTION_POINTER_INDEX_MASK} bits of the
231     * unmasked action returned by {@link #getAction}.
232     * </p>
233     */
234    public static final int ACTION_POINTER_DOWN     = 5;
235
236    /**
237     * Constant for {@link #getActionMasked}: A non-primary pointer has gone up.
238     * <p>
239     * Use {@link #getActionIndex} to retrieve the index of the pointer that changed.
240     * </p><p>
241     * The index is encoded in the {@link #ACTION_POINTER_INDEX_MASK} bits of the
242     * unmasked action returned by {@link #getAction}.
243     * </p>
244     */
245    public static final int ACTION_POINTER_UP       = 6;
246
247    /**
248     * Constant for {@link #getActionMasked}: A change happened but the pointer
249     * is not down (unlike {@link #ACTION_MOVE}).  The motion contains the most
250     * recent point, as well as any intermediate points since the last
251     * hover move event.
252     * <p>
253     * This action is always delivered to the window or view under the pointer.
254     * </p><p>
255     * This action is not a touch event so it is delivered to
256     * {@link View#onGenericMotionEvent(MotionEvent)} rather than
257     * {@link View#onTouchEvent(MotionEvent)}.
258     * </p>
259     */
260    public static final int ACTION_HOVER_MOVE       = 7;
261
262    /**
263     * Constant for {@link #getActionMasked}: The motion event contains relative
264     * vertical and/or horizontal scroll offsets.  Use {@link #getAxisValue(int)}
265     * to retrieve the information from {@link #AXIS_VSCROLL} and {@link #AXIS_HSCROLL}.
266     * The pointer may or may not be down when this event is dispatched.
267     * <p>
268     * This action is always delivered to the window or view under the pointer, which
269     * may not be the window or view currently touched.
270     * </p><p>
271     * This action is not a touch event so it is delivered to
272     * {@link View#onGenericMotionEvent(MotionEvent)} rather than
273     * {@link View#onTouchEvent(MotionEvent)}.
274     * </p>
275     */
276    public static final int ACTION_SCROLL           = 8;
277
278    /**
279     * Constant for {@link #getActionMasked}: The pointer is not down but has entered the
280     * boundaries of a window or view.
281     * <p>
282     * This action is always delivered to the window or view under the pointer.
283     * </p><p>
284     * This action is not a touch event so it is delivered to
285     * {@link View#onGenericMotionEvent(MotionEvent)} rather than
286     * {@link View#onTouchEvent(MotionEvent)}.
287     * </p>
288     */
289    public static final int ACTION_HOVER_ENTER      = 9;
290
291    /**
292     * Constant for {@link #getActionMasked}: The pointer is not down but has exited the
293     * boundaries of a window or view.
294     * <p>
295     * This action is always delivered to the window or view that was previously under the pointer.
296     * </p><p>
297     * This action is not a touch event so it is delivered to
298     * {@link View#onGenericMotionEvent(MotionEvent)} rather than
299     * {@link View#onTouchEvent(MotionEvent)}.
300     * </p>
301     */
302    public static final int ACTION_HOVER_EXIT       = 10;
303
304    /**
305     * Bits in the action code that represent a pointer index, used with
306     * {@link #ACTION_POINTER_DOWN} and {@link #ACTION_POINTER_UP}.  Shifting
307     * down by {@link #ACTION_POINTER_INDEX_SHIFT} provides the actual pointer
308     * index where the data for the pointer going up or down can be found; you can
309     * get its identifier with {@link #getPointerId(int)} and the actual
310     * data with {@link #getX(int)} etc.
311     *
312     * @see #getActionIndex
313     */
314    public static final int ACTION_POINTER_INDEX_MASK  = 0xff00;
315
316    /**
317     * Bit shift for the action bits holding the pointer index as
318     * defined by {@link #ACTION_POINTER_INDEX_MASK}.
319     *
320     * @see #getActionIndex
321     */
322    public static final int ACTION_POINTER_INDEX_SHIFT = 8;
323
324    /**
325     * @deprecated Use {@link #ACTION_POINTER_INDEX_MASK} to retrieve the
326     * data index associated with {@link #ACTION_POINTER_DOWN}.
327     */
328    @Deprecated
329    public static final int ACTION_POINTER_1_DOWN   = ACTION_POINTER_DOWN | 0x0000;
330
331    /**
332     * @deprecated Use {@link #ACTION_POINTER_INDEX_MASK} to retrieve the
333     * data index associated with {@link #ACTION_POINTER_DOWN}.
334     */
335    @Deprecated
336    public static final int ACTION_POINTER_2_DOWN   = ACTION_POINTER_DOWN | 0x0100;
337
338    /**
339     * @deprecated Use {@link #ACTION_POINTER_INDEX_MASK} to retrieve the
340     * data index associated with {@link #ACTION_POINTER_DOWN}.
341     */
342    @Deprecated
343    public static final int ACTION_POINTER_3_DOWN   = ACTION_POINTER_DOWN | 0x0200;
344
345    /**
346     * @deprecated Use {@link #ACTION_POINTER_INDEX_MASK} to retrieve the
347     * data index associated with {@link #ACTION_POINTER_UP}.
348     */
349    @Deprecated
350    public static final int ACTION_POINTER_1_UP     = ACTION_POINTER_UP | 0x0000;
351
352    /**
353     * @deprecated Use {@link #ACTION_POINTER_INDEX_MASK} to retrieve the
354     * data index associated with {@link #ACTION_POINTER_UP}.
355     */
356    @Deprecated
357    public static final int ACTION_POINTER_2_UP     = ACTION_POINTER_UP | 0x0100;
358
359    /**
360     * @deprecated Use {@link #ACTION_POINTER_INDEX_MASK} to retrieve the
361     * data index associated with {@link #ACTION_POINTER_UP}.
362     */
363    @Deprecated
364    public static final int ACTION_POINTER_3_UP     = ACTION_POINTER_UP | 0x0200;
365
366    /**
367     * @deprecated Renamed to {@link #ACTION_POINTER_INDEX_MASK} to match
368     * the actual data contained in these bits.
369     */
370    @Deprecated
371    public static final int ACTION_POINTER_ID_MASK  = 0xff00;
372
373    /**
374     * @deprecated Renamed to {@link #ACTION_POINTER_INDEX_SHIFT} to match
375     * the actual data contained in these bits.
376     */
377    @Deprecated
378    public static final int ACTION_POINTER_ID_SHIFT = 8;
379
380    /**
381     * This flag indicates that the window that received this motion event is partly
382     * or wholly obscured by another visible window above it.  This flag is set to true
383     * even if the event did not directly pass through the obscured area.
384     * A security sensitive application can check this flag to identify situations in which
385     * a malicious application may have covered up part of its content for the purpose
386     * of misleading the user or hijacking touches.  An appropriate response might be
387     * to drop the suspect touches or to take additional precautions to confirm the user's
388     * actual intent.
389     */
390    public static final int FLAG_WINDOW_IS_OBSCURED = 0x1;
391
392    /**
393     * Private flag that indicates when the system has detected that this motion event
394     * may be inconsistent with respect to the sequence of previously delivered motion events,
395     * such as when a pointer move event is sent but the pointer is not down.
396     *
397     * @hide
398     * @see #isTainted
399     * @see #setTainted
400     */
401    public static final int FLAG_TAINTED = 0x80000000;
402
403    /**
404     * Flag indicating the motion event intersected the top edge of the screen.
405     */
406    public static final int EDGE_TOP = 0x00000001;
407
408    /**
409     * Flag indicating the motion event intersected the bottom edge of the screen.
410     */
411    public static final int EDGE_BOTTOM = 0x00000002;
412
413    /**
414     * Flag indicating the motion event intersected the left edge of the screen.
415     */
416    public static final int EDGE_LEFT = 0x00000004;
417
418    /**
419     * Flag indicating the motion event intersected the right edge of the screen.
420     */
421    public static final int EDGE_RIGHT = 0x00000008;
422
423    /**
424     * Axis constant: X axis of a motion event.
425     * <p>
426     * <ul>
427     * <li>For a touch screen, reports the absolute X screen position of the center of
428     * the touch contact area.  The units are display pixels.
429     * <li>For a touch pad, reports the absolute X surface position of the center of the touch
430     * contact area.  The units are device-dependent; use {@link InputDevice#getMotionRange(int)}
431     * to query the effective range of values.
432     * <li>For a mouse, reports the absolute X screen position of the mouse pointer.
433     * The units are display pixels.
434     * <li>For a trackball, reports the relative horizontal displacement of the trackball.
435     * The value is normalized to a range from -1.0 (left) to 1.0 (right).
436     * <li>For a joystick, reports the absolute X position of the joystick.
437     * The value is normalized to a range from -1.0 (left) to 1.0 (right).
438     * </ul>
439     * </p>
440     *
441     * @see #getX(int)
442     * @see #getHistoricalX(int, int)
443     * @see MotionEvent.PointerCoords#x
444     * @see InputDevice#getMotionRange
445     */
446    public static final int AXIS_X = 0;
447
448    /**
449     * Axis constant: Y axis of a motion event.
450     * <p>
451     * <ul>
452     * <li>For a touch screen, reports the absolute Y screen position of the center of
453     * the touch contact area.  The units are display pixels.
454     * <li>For a touch pad, reports the absolute Y surface position of the center of the touch
455     * contact area.  The units are device-dependent; use {@link InputDevice#getMotionRange(int)}
456     * to query the effective range of values.
457     * <li>For a mouse, reports the absolute Y screen position of the mouse pointer.
458     * The units are display pixels.
459     * <li>For a trackball, reports the relative vertical displacement of the trackball.
460     * The value is normalized to a range from -1.0 (up) to 1.0 (down).
461     * <li>For a joystick, reports the absolute Y position of the joystick.
462     * The value is normalized to a range from -1.0 (up or far) to 1.0 (down or near).
463     * </ul>
464     * </p>
465     *
466     * @see #getY(int)
467     * @see #getHistoricalY(int, int)
468     * @see MotionEvent.PointerCoords#y
469     * @see InputDevice#getMotionRange
470     */
471    public static final int AXIS_Y = 1;
472
473    /**
474     * Axis constant: Pressure axis of a motion event.
475     * <p>
476     * <ul>
477     * <li>For a touch screen or touch pad, reports the approximate pressure applied to the surface
478     * by a finger or other tool.  The value is normalized to a range from
479     * 0 (no pressure at all) to 1 (normal pressure), although values higher than 1
480     * may be generated depending on the calibration of the input device.
481     * <li>For a trackball, the value is set to 1 if the trackball button is pressed
482     * or 0 otherwise.
483     * <li>For a mouse, the value is set to 1 if the primary mouse button is pressed
484     * or 0 otherwise.
485     * </ul>
486     * </p>
487     *
488     * @see #getPressure(int)
489     * @see #getHistoricalPressure(int, int)
490     * @see MotionEvent.PointerCoords#pressure
491     * @see InputDevice#getMotionRange
492     */
493    public static final int AXIS_PRESSURE = 2;
494
495    /**
496     * Axis constant: Size axis of a motion event.
497     * <p>
498     * <ul>
499     * <li>For a touch screen or touch pad, reports the approximate size of the contact area in
500     * relation to the maximum detectable size for the device.  The value is normalized
501     * to a range from 0 (smallest detectable size) to 1 (largest detectable size),
502     * although it is not a linear scale.  This value is of limited use.
503     * To obtain calibrated size information, use
504     * {@link #AXIS_TOUCH_MAJOR} or {@link #AXIS_TOOL_MAJOR}.
505     * </ul>
506     * </p>
507     *
508     * @see #getSize(int)
509     * @see #getHistoricalSize(int, int)
510     * @see MotionEvent.PointerCoords#size
511     * @see InputDevice#getMotionRange
512     */
513    public static final int AXIS_SIZE = 3;
514
515    /**
516     * Axis constant: TouchMajor axis of a motion event.
517     * <p>
518     * <ul>
519     * <li>For a touch screen, reports the length of the major axis of an ellipse that
520     * represents the touch area at the point of contact.
521     * The units are display pixels.
522     * <li>For a touch pad, reports the length of the major axis of an ellipse that
523     * represents the touch area at the point of contact.
524     * The units are device-dependent; use {@link InputDevice#getMotionRange(int)}
525     * to query the effective range of values.
526     * </ul>
527     * </p>
528     *
529     * @see #getTouchMajor(int)
530     * @see #getHistoricalTouchMajor(int, int)
531     * @see MotionEvent.PointerCoords#touchMajor
532     * @see InputDevice#getMotionRange
533     */
534    public static final int AXIS_TOUCH_MAJOR = 4;
535
536    /**
537     * Axis constant: TouchMinor axis of a motion event.
538     * <p>
539     * <ul>
540     * <li>For a touch screen, reports the length of the minor axis of an ellipse that
541     * represents the touch area at the point of contact.
542     * The units are display pixels.
543     * <li>For a touch pad, reports the length of the minor axis of an ellipse that
544     * represents the touch area at the point of contact.
545     * The units are device-dependent; use {@link InputDevice#getMotionRange(int)}
546     * to query the effective range of values.
547     * </ul>
548     * </p><p>
549     * When the touch is circular, the major and minor axis lengths will be equal to one another.
550     * </p>
551     *
552     * @see #getTouchMinor(int)
553     * @see #getHistoricalTouchMinor(int, int)
554     * @see MotionEvent.PointerCoords#touchMinor
555     * @see InputDevice#getMotionRange
556     */
557    public static final int AXIS_TOUCH_MINOR = 5;
558
559    /**
560     * Axis constant: ToolMajor axis of a motion event.
561     * <p>
562     * <ul>
563     * <li>For a touch screen, reports the length of the major axis of an ellipse that
564     * represents the size of the approaching finger or tool used to make contact.
565     * <li>For a touch pad, reports the length of the major axis of an ellipse that
566     * represents the size of the approaching finger or tool used to make contact.
567     * The units are device-dependent; use {@link InputDevice#getMotionRange(int)}
568     * to query the effective range of values.
569     * </ul>
570     * </p><p>
571     * When the touch is circular, the major and minor axis lengths will be equal to one another.
572     * </p><p>
573     * The tool size may be larger than the touch size since the tool may not be fully
574     * in contact with the touch sensor.
575     * </p>
576     *
577     * @see #getToolMajor(int)
578     * @see #getHistoricalToolMajor(int, int)
579     * @see MotionEvent.PointerCoords#toolMajor
580     * @see InputDevice#getMotionRange
581     */
582    public static final int AXIS_TOOL_MAJOR = 6;
583
584    /**
585     * Axis constant: ToolMinor axis of a motion event.
586     * <p>
587     * <ul>
588     * <li>For a touch screen, reports the length of the minor axis of an ellipse that
589     * represents the size of the approaching finger or tool used to make contact.
590     * <li>For a touch pad, reports the length of the minor axis of an ellipse that
591     * represents the size of the approaching finger or tool used to make contact.
592     * The units are device-dependent; use {@link InputDevice#getMotionRange(int)}
593     * to query the effective range of values.
594     * </ul>
595     * </p><p>
596     * When the touch is circular, the major and minor axis lengths will be equal to one another.
597     * </p><p>
598     * The tool size may be larger than the touch size since the tool may not be fully
599     * in contact with the touch sensor.
600     * </p>
601     *
602     * @see #getToolMinor(int)
603     * @see #getHistoricalToolMinor(int, int)
604     * @see MotionEvent.PointerCoords#toolMinor
605     * @see InputDevice#getMotionRange
606     */
607    public static final int AXIS_TOOL_MINOR = 7;
608
609    /**
610     * Axis constant: Orientation axis of a motion event.
611     * <p>
612     * <ul>
613     * <li>For a touch screen or touch pad, reports the orientation of the finger
614     * or tool in radians relative to the vertical plane of the device.
615     * An angle of 0 radians indicates that the major axis of contact is oriented
616     * upwards, is perfectly circular or is of unknown orientation.  A positive angle
617     * indicates that the major axis of contact is oriented to the right.  A negative angle
618     * indicates that the major axis of contact is oriented to the left.
619     * The full range is from -PI/2 radians (finger pointing fully left) to PI/2 radians
620     * (finger pointing fully right).
621     * <li>For a stylus, the orientation indicates the direction in which the stylus
622     * is pointing in relation to the vertical axis of the current orientation of the screen.
623     * The range is from -PI radians to PI radians, where 0 is pointing up,
624     * -PI/2 radians is pointing left, -PI or PI radians is pointing down, and PI/2 radians
625     * is pointing right.  See also {@link #AXIS_TILT}.
626     * </ul>
627     * </p>
628     *
629     * @see #getOrientation(int)
630     * @see #getHistoricalOrientation(int, int)
631     * @see MotionEvent.PointerCoords#orientation
632     * @see InputDevice#getMotionRange
633     */
634    public static final int AXIS_ORIENTATION = 8;
635
636    /**
637     * Axis constant: Vertical Scroll axis of a motion event.
638     * <p>
639     * <ul>
640     * <li>For a mouse, reports the relative movement of the vertical scroll wheel.
641     * The value is normalized to a range from -1.0 (down) to 1.0 (up).
642     * </ul>
643     * </p><p>
644     * This axis should be used to scroll views vertically.
645     * </p>
646     *
647     * @see #getAxisValue(int, int)
648     * @see #getHistoricalAxisValue(int, int, int)
649     * @see MotionEvent.PointerCoords#getAxisValue(int)
650     * @see InputDevice#getMotionRange
651     */
652    public static final int AXIS_VSCROLL = 9;
653
654    /**
655     * Axis constant: Horizontal Scroll axis of a motion event.
656     * <p>
657     * <ul>
658     * <li>For a mouse, reports the relative movement of the horizontal scroll wheel.
659     * The value is normalized to a range from -1.0 (left) to 1.0 (right).
660     * </ul>
661     * </p><p>
662     * This axis should be used to scroll views horizontally.
663     * </p>
664     *
665     * @see #getAxisValue(int, int)
666     * @see #getHistoricalAxisValue(int, int, int)
667     * @see MotionEvent.PointerCoords#getAxisValue(int)
668     * @see InputDevice#getMotionRange
669     */
670    public static final int AXIS_HSCROLL = 10;
671
672    /**
673     * Axis constant: Z axis of a motion event.
674     * <p>
675     * <ul>
676     * <li>For a joystick, reports the absolute Z position of the joystick.
677     * The value is normalized to a range from -1.0 (high) to 1.0 (low).
678     * <em>On game pads with two analog joysticks, this axis is often reinterpreted
679     * to report the absolute X position of the second joystick instead.</em>
680     * </ul>
681     * </p>
682     *
683     * @see #getAxisValue(int, int)
684     * @see #getHistoricalAxisValue(int, int, int)
685     * @see MotionEvent.PointerCoords#getAxisValue(int)
686     * @see InputDevice#getMotionRange
687     */
688    public static final int AXIS_Z = 11;
689
690    /**
691     * Axis constant: X Rotation axis of a motion event.
692     * <p>
693     * <ul>
694     * <li>For a joystick, reports the absolute rotation angle about the X axis.
695     * The value is normalized to a range from -1.0 (counter-clockwise) to 1.0 (clockwise).
696     * </ul>
697     * </p>
698     *
699     * @see #getAxisValue(int, int)
700     * @see #getHistoricalAxisValue(int, int, int)
701     * @see MotionEvent.PointerCoords#getAxisValue(int)
702     * @see InputDevice#getMotionRange
703     */
704    public static final int AXIS_RX = 12;
705
706    /**
707     * Axis constant: Y Rotation axis of a motion event.
708     * <p>
709     * <ul>
710     * <li>For a joystick, reports the absolute rotation angle about the Y axis.
711     * The value is normalized to a range from -1.0 (counter-clockwise) to 1.0 (clockwise).
712     * </ul>
713     * </p>
714     *
715     * @see #getAxisValue(int, int)
716     * @see #getHistoricalAxisValue(int, int, int)
717     * @see MotionEvent.PointerCoords#getAxisValue(int)
718     * @see InputDevice#getMotionRange
719     */
720    public static final int AXIS_RY = 13;
721
722    /**
723     * Axis constant: Z Rotation axis of a motion event.
724     * <p>
725     * <ul>
726     * <li>For a joystick, reports the absolute rotation angle about the Z axis.
727     * The value is normalized to a range from -1.0 (counter-clockwise) to 1.0 (clockwise).
728     * <em>On game pads with two analog joysticks, this axis is often reinterpreted
729     * to report the absolute Y position of the second joystick instead.</em>
730     * </ul>
731     * </p>
732     *
733     * @see #getAxisValue(int, int)
734     * @see #getHistoricalAxisValue(int, int, int)
735     * @see MotionEvent.PointerCoords#getAxisValue(int)
736     * @see InputDevice#getMotionRange
737     */
738    public static final int AXIS_RZ = 14;
739
740    /**
741     * Axis constant: Hat X axis of a motion event.
742     * <p>
743     * <ul>
744     * <li>For a joystick, reports the absolute X position of the directional hat control.
745     * The value is normalized to a range from -1.0 (left) to 1.0 (right).
746     * </ul>
747     * </p>
748     *
749     * @see #getAxisValue(int, int)
750     * @see #getHistoricalAxisValue(int, int, int)
751     * @see MotionEvent.PointerCoords#getAxisValue(int)
752     * @see InputDevice#getMotionRange
753     */
754    public static final int AXIS_HAT_X = 15;
755
756    /**
757     * Axis constant: Hat Y axis of a motion event.
758     * <p>
759     * <ul>
760     * <li>For a joystick, reports the absolute Y position of the directional hat control.
761     * The value is normalized to a range from -1.0 (up) to 1.0 (down).
762     * </ul>
763     * </p>
764     *
765     * @see #getAxisValue(int, int)
766     * @see #getHistoricalAxisValue(int, int, int)
767     * @see MotionEvent.PointerCoords#getAxisValue(int)
768     * @see InputDevice#getMotionRange
769     */
770    public static final int AXIS_HAT_Y = 16;
771
772    /**
773     * Axis constant: Left Trigger axis of a motion event.
774     * <p>
775     * <ul>
776     * <li>For a joystick, reports the absolute position of the left trigger control.
777     * The value is normalized to a range from 0.0 (released) to 1.0 (fully pressed).
778     * </ul>
779     * </p>
780     *
781     * @see #getAxisValue(int, int)
782     * @see #getHistoricalAxisValue(int, int, int)
783     * @see MotionEvent.PointerCoords#getAxisValue(int)
784     * @see InputDevice#getMotionRange
785     */
786    public static final int AXIS_LTRIGGER = 17;
787
788    /**
789     * Axis constant: Right Trigger axis of a motion event.
790     * <p>
791     * <ul>
792     * <li>For a joystick, reports the absolute position of the right trigger control.
793     * The value is normalized to a range from 0.0 (released) to 1.0 (fully pressed).
794     * </ul>
795     * </p>
796     *
797     * @see #getAxisValue(int, int)
798     * @see #getHistoricalAxisValue(int, int, int)
799     * @see MotionEvent.PointerCoords#getAxisValue(int)
800     * @see InputDevice#getMotionRange
801     */
802    public static final int AXIS_RTRIGGER = 18;
803
804    /**
805     * Axis constant: Throttle axis of a motion event.
806     * <p>
807     * <ul>
808     * <li>For a joystick, reports the absolute position of the throttle control.
809     * The value is normalized to a range from 0.0 (fully open) to 1.0 (fully closed).
810     * </ul>
811     * </p>
812     *
813     * @see #getAxisValue(int, int)
814     * @see #getHistoricalAxisValue(int, int, int)
815     * @see MotionEvent.PointerCoords#getAxisValue(int)
816     * @see InputDevice#getMotionRange
817     */
818    public static final int AXIS_THROTTLE = 19;
819
820    /**
821     * Axis constant: Rudder axis of a motion event.
822     * <p>
823     * <ul>
824     * <li>For a joystick, reports the absolute position of the rudder control.
825     * The value is normalized to a range from -1.0 (turn left) to 1.0 (turn right).
826     * </ul>
827     * </p>
828     *
829     * @see #getAxisValue(int, int)
830     * @see #getHistoricalAxisValue(int, int, int)
831     * @see MotionEvent.PointerCoords#getAxisValue(int)
832     * @see InputDevice#getMotionRange
833     */
834    public static final int AXIS_RUDDER = 20;
835
836    /**
837     * Axis constant: Wheel axis of a motion event.
838     * <p>
839     * <ul>
840     * <li>For a joystick, reports the absolute position of the steering wheel control.
841     * The value is normalized to a range from -1.0 (turn left) to 1.0 (turn right).
842     * </ul>
843     * </p>
844     *
845     * @see #getAxisValue(int, int)
846     * @see #getHistoricalAxisValue(int, int, int)
847     * @see MotionEvent.PointerCoords#getAxisValue(int)
848     * @see InputDevice#getMotionRange
849     */
850    public static final int AXIS_WHEEL = 21;
851
852    /**
853     * Axis constant: Gas axis of a motion event.
854     * <p>
855     * <ul>
856     * <li>For a joystick, reports the absolute position of the gas (accelerator) control.
857     * The value is normalized to a range from 0.0 (no acceleration)
858     * to 1.0 (maximum acceleration).
859     * </ul>
860     * </p>
861     *
862     * @see #getAxisValue(int, int)
863     * @see #getHistoricalAxisValue(int, int, int)
864     * @see MotionEvent.PointerCoords#getAxisValue(int)
865     * @see InputDevice#getMotionRange
866     */
867    public static final int AXIS_GAS = 22;
868
869    /**
870     * Axis constant: Brake axis of a motion event.
871     * <p>
872     * <ul>
873     * <li>For a joystick, reports the absolute position of the brake control.
874     * The value is normalized to a range from 0.0 (no braking) to 1.0 (maximum braking).
875     * </ul>
876     * </p>
877     *
878     * @see #getAxisValue(int, int)
879     * @see #getHistoricalAxisValue(int, int, int)
880     * @see MotionEvent.PointerCoords#getAxisValue(int)
881     * @see InputDevice#getMotionRange
882     */
883    public static final int AXIS_BRAKE = 23;
884
885    /**
886     * Axis constant: Distance axis of a motion event.
887     * <p>
888     * <ul>
889     * <li>For a stylus, reports the distance of the stylus from the screen.
890     * A value of 0.0 indicates direct contact and larger values indicate increasing
891     * distance from the surface.
892     * </ul>
893     * </p>
894     *
895     * @see #getAxisValue(int, int)
896     * @see #getHistoricalAxisValue(int, int, int)
897     * @see MotionEvent.PointerCoords#getAxisValue(int)
898     * @see InputDevice#getMotionRange
899     */
900    public static final int AXIS_DISTANCE = 24;
901
902    /**
903     * Axis constant: Tilt axis of a motion event.
904     * <p>
905     * <ul>
906     * <li>For a stylus, reports the tilt angle of the stylus in radians where
907     * 0 radians indicates that the stylus is being held perpendicular to the
908     * surface, and PI/2 radians indicates that the stylus is being held flat
909     * against the surface.
910     * </ul>
911     * </p>
912     *
913     * @see #getAxisValue(int, int)
914     * @see #getHistoricalAxisValue(int, int, int)
915     * @see MotionEvent.PointerCoords#getAxisValue(int, int)
916     * @see InputDevice#getMotionRange
917     */
918    public static final int AXIS_TILT = 25;
919
920    /**
921     * Axis constant: Generic 1 axis of a motion event.
922     * The interpretation of a generic axis is device-specific.
923     *
924     * @see #getAxisValue(int, int)
925     * @see #getHistoricalAxisValue(int, int, int)
926     * @see MotionEvent.PointerCoords#getAxisValue(int)
927     * @see InputDevice#getMotionRange
928     */
929    public static final int AXIS_GENERIC_1 = 32;
930
931    /**
932     * Axis constant: Generic 2 axis of a motion event.
933     * The interpretation of a generic axis is device-specific.
934     *
935     * @see #getAxisValue(int, int)
936     * @see #getHistoricalAxisValue(int, int, int)
937     * @see MotionEvent.PointerCoords#getAxisValue(int)
938     * @see InputDevice#getMotionRange
939     */
940    public static final int AXIS_GENERIC_2 = 33;
941
942    /**
943     * Axis constant: Generic 3 axis of a motion event.
944     * The interpretation of a generic axis is device-specific.
945     *
946     * @see #getAxisValue(int, int)
947     * @see #getHistoricalAxisValue(int, int, int)
948     * @see MotionEvent.PointerCoords#getAxisValue(int)
949     * @see InputDevice#getMotionRange
950     */
951    public static final int AXIS_GENERIC_3 = 34;
952
953    /**
954     * Axis constant: Generic 4 axis of a motion event.
955     * The interpretation of a generic axis is device-specific.
956     *
957     * @see #getAxisValue(int, int)
958     * @see #getHistoricalAxisValue(int, int, int)
959     * @see MotionEvent.PointerCoords#getAxisValue(int)
960     * @see InputDevice#getMotionRange
961     */
962    public static final int AXIS_GENERIC_4 = 35;
963
964    /**
965     * Axis constant: Generic 5 axis of a motion event.
966     * The interpretation of a generic axis is device-specific.
967     *
968     * @see #getAxisValue(int, int)
969     * @see #getHistoricalAxisValue(int, int, int)
970     * @see MotionEvent.PointerCoords#getAxisValue(int)
971     * @see InputDevice#getMotionRange
972     */
973    public static final int AXIS_GENERIC_5 = 36;
974
975    /**
976     * Axis constant: Generic 6 axis of a motion event.
977     * The interpretation of a generic axis is device-specific.
978     *
979     * @see #getAxisValue(int, int)
980     * @see #getHistoricalAxisValue(int, int, int)
981     * @see MotionEvent.PointerCoords#getAxisValue(int)
982     * @see InputDevice#getMotionRange
983     */
984    public static final int AXIS_GENERIC_6 = 37;
985
986    /**
987     * Axis constant: Generic 7 axis of a motion event.
988     * The interpretation of a generic axis is device-specific.
989     *
990     * @see #getAxisValue(int, int)
991     * @see #getHistoricalAxisValue(int, int, int)
992     * @see MotionEvent.PointerCoords#getAxisValue(int)
993     * @see InputDevice#getMotionRange
994     */
995    public static final int AXIS_GENERIC_7 = 38;
996
997    /**
998     * Axis constant: Generic 8 axis of a motion event.
999     * The interpretation of a generic axis is device-specific.
1000     *
1001     * @see #getAxisValue(int, int)
1002     * @see #getHistoricalAxisValue(int, int, int)
1003     * @see MotionEvent.PointerCoords#getAxisValue(int)
1004     * @see InputDevice#getMotionRange
1005     */
1006    public static final int AXIS_GENERIC_8 = 39;
1007
1008    /**
1009     * Axis constant: Generic 9 axis of a motion event.
1010     * The interpretation of a generic axis is device-specific.
1011     *
1012     * @see #getAxisValue(int, int)
1013     * @see #getHistoricalAxisValue(int, int, int)
1014     * @see MotionEvent.PointerCoords#getAxisValue(int)
1015     * @see InputDevice#getMotionRange
1016     */
1017    public static final int AXIS_GENERIC_9 = 40;
1018
1019    /**
1020     * Axis constant: Generic 10 axis of a motion event.
1021     * The interpretation of a generic axis is device-specific.
1022     *
1023     * @see #getAxisValue(int, int)
1024     * @see #getHistoricalAxisValue(int, int, int)
1025     * @see MotionEvent.PointerCoords#getAxisValue(int)
1026     * @see InputDevice#getMotionRange
1027     */
1028    public static final int AXIS_GENERIC_10 = 41;
1029
1030    /**
1031     * Axis constant: Generic 11 axis of a motion event.
1032     * The interpretation of a generic axis is device-specific.
1033     *
1034     * @see #getAxisValue(int, int)
1035     * @see #getHistoricalAxisValue(int, int, int)
1036     * @see MotionEvent.PointerCoords#getAxisValue(int)
1037     * @see InputDevice#getMotionRange
1038     */
1039    public static final int AXIS_GENERIC_11 = 42;
1040
1041    /**
1042     * Axis constant: Generic 12 axis of a motion event.
1043     * The interpretation of a generic axis is device-specific.
1044     *
1045     * @see #getAxisValue(int, int)
1046     * @see #getHistoricalAxisValue(int, int, int)
1047     * @see MotionEvent.PointerCoords#getAxisValue(int)
1048     * @see InputDevice#getMotionRange
1049     */
1050    public static final int AXIS_GENERIC_12 = 43;
1051
1052    /**
1053     * Axis constant: Generic 13 axis of a motion event.
1054     * The interpretation of a generic axis is device-specific.
1055     *
1056     * @see #getAxisValue(int, int)
1057     * @see #getHistoricalAxisValue(int, int, int)
1058     * @see MotionEvent.PointerCoords#getAxisValue(int)
1059     * @see InputDevice#getMotionRange
1060     */
1061    public static final int AXIS_GENERIC_13 = 44;
1062
1063    /**
1064     * Axis constant: Generic 14 axis of a motion event.
1065     * The interpretation of a generic axis is device-specific.
1066     *
1067     * @see #getAxisValue(int, int)
1068     * @see #getHistoricalAxisValue(int, int, int)
1069     * @see MotionEvent.PointerCoords#getAxisValue(int)
1070     * @see InputDevice#getMotionRange
1071     */
1072    public static final int AXIS_GENERIC_14 = 45;
1073
1074    /**
1075     * Axis constant: Generic 15 axis of a motion event.
1076     * The interpretation of a generic axis is device-specific.
1077     *
1078     * @see #getAxisValue(int, int)
1079     * @see #getHistoricalAxisValue(int, int, int)
1080     * @see MotionEvent.PointerCoords#getAxisValue(int)
1081     * @see InputDevice#getMotionRange
1082     */
1083    public static final int AXIS_GENERIC_15 = 46;
1084
1085    /**
1086     * Axis constant: Generic 16 axis of a motion event.
1087     * The interpretation of a generic axis is device-specific.
1088     *
1089     * @see #getAxisValue(int, int)
1090     * @see #getHistoricalAxisValue(int, int, int)
1091     * @see MotionEvent.PointerCoords#getAxisValue(int)
1092     * @see InputDevice#getMotionRange
1093     */
1094    public static final int AXIS_GENERIC_16 = 47;
1095
1096    // NOTE: If you add a new axis here you must also add it to:
1097    //  native/include/android/input.h
1098    //  frameworks/base/include/ui/KeycodeLabels.h
1099
1100    // Symbolic names of all axes.
1101    private static final SparseArray<String> AXIS_SYMBOLIC_NAMES = new SparseArray<String>();
1102    static {
1103        SparseArray<String> names = AXIS_SYMBOLIC_NAMES;
1104        names.append(AXIS_X, "AXIS_X");
1105        names.append(AXIS_Y, "AXIS_Y");
1106        names.append(AXIS_PRESSURE, "AXIS_PRESSURE");
1107        names.append(AXIS_SIZE, "AXIS_SIZE");
1108        names.append(AXIS_TOUCH_MAJOR, "AXIS_TOUCH_MAJOR");
1109        names.append(AXIS_TOUCH_MINOR, "AXIS_TOUCH_MINOR");
1110        names.append(AXIS_TOOL_MAJOR, "AXIS_TOOL_MAJOR");
1111        names.append(AXIS_TOOL_MINOR, "AXIS_TOOL_MINOR");
1112        names.append(AXIS_ORIENTATION, "AXIS_ORIENTATION");
1113        names.append(AXIS_VSCROLL, "AXIS_VSCROLL");
1114        names.append(AXIS_HSCROLL, "AXIS_HSCROLL");
1115        names.append(AXIS_Z, "AXIS_Z");
1116        names.append(AXIS_RX, "AXIS_RX");
1117        names.append(AXIS_RY, "AXIS_RY");
1118        names.append(AXIS_RZ, "AXIS_RZ");
1119        names.append(AXIS_HAT_X, "AXIS_HAT_X");
1120        names.append(AXIS_HAT_Y, "AXIS_HAT_Y");
1121        names.append(AXIS_LTRIGGER, "AXIS_LTRIGGER");
1122        names.append(AXIS_RTRIGGER, "AXIS_RTRIGGER");
1123        names.append(AXIS_THROTTLE, "AXIS_THROTTLE");
1124        names.append(AXIS_RUDDER, "AXIS_RUDDER");
1125        names.append(AXIS_WHEEL, "AXIS_WHEEL");
1126        names.append(AXIS_GAS, "AXIS_GAS");
1127        names.append(AXIS_BRAKE, "AXIS_BRAKE");
1128        names.append(AXIS_DISTANCE, "AXIS_DISTANCE");
1129        names.append(AXIS_TILT, "AXIS_TILT");
1130        names.append(AXIS_GENERIC_1, "AXIS_GENERIC_1");
1131        names.append(AXIS_GENERIC_2, "AXIS_GENERIC_2");
1132        names.append(AXIS_GENERIC_3, "AXIS_GENERIC_3");
1133        names.append(AXIS_GENERIC_4, "AXIS_GENERIC_4");
1134        names.append(AXIS_GENERIC_5, "AXIS_GENERIC_5");
1135        names.append(AXIS_GENERIC_6, "AXIS_GENERIC_6");
1136        names.append(AXIS_GENERIC_7, "AXIS_GENERIC_7");
1137        names.append(AXIS_GENERIC_8, "AXIS_GENERIC_8");
1138        names.append(AXIS_GENERIC_9, "AXIS_GENERIC_9");
1139        names.append(AXIS_GENERIC_10, "AXIS_GENERIC_10");
1140        names.append(AXIS_GENERIC_11, "AXIS_GENERIC_11");
1141        names.append(AXIS_GENERIC_12, "AXIS_GENERIC_12");
1142        names.append(AXIS_GENERIC_13, "AXIS_GENERIC_13");
1143        names.append(AXIS_GENERIC_14, "AXIS_GENERIC_14");
1144        names.append(AXIS_GENERIC_15, "AXIS_GENERIC_15");
1145        names.append(AXIS_GENERIC_16, "AXIS_GENERIC_16");
1146    }
1147
1148    /**
1149     * Button constant: Primary button (left mouse button).
1150     *
1151     * This button constant is not set in response to simple touches with a finger
1152     * or stylus tip.  The user must actually push a button.
1153     *
1154     * @see #getButtonState
1155     */
1156    public static final int BUTTON_PRIMARY = 1 << 0;
1157
1158    /**
1159     * Button constant: Secondary button (right mouse button, stylus first button).
1160     *
1161     * @see #getButtonState
1162     */
1163    public static final int BUTTON_SECONDARY = 1 << 1;
1164
1165    /**
1166     * Button constant: Tertiary button (middle mouse button, stylus second button).
1167     *
1168     * @see #getButtonState
1169     */
1170    public static final int BUTTON_TERTIARY = 1 << 2;
1171
1172    /**
1173     * Button constant: Back button pressed (mouse back button).
1174     * <p>
1175     * The system may send a {@link KeyEvent#KEYCODE_BACK} key press to the application
1176     * when this button is pressed.
1177     * </p>
1178     *
1179     * @see #getButtonState
1180     */
1181    public static final int BUTTON_BACK = 1 << 3;
1182
1183    /**
1184     * Button constant: Forward button pressed (mouse forward button).
1185     * <p>
1186     * The system may send a {@link KeyEvent#KEYCODE_FORWARD} key press to the application
1187     * when this button is pressed.
1188     * </p>
1189     *
1190     * @see #getButtonState
1191     */
1192    public static final int BUTTON_FORWARD = 1 << 4;
1193
1194    // NOTE: If you add a new axis here you must also add it to:
1195    //  native/include/android/input.h
1196
1197    // Symbolic names of all button states in bit order from least significant
1198    // to most significant.
1199    private static final String[] BUTTON_SYMBOLIC_NAMES = new String[] {
1200        "BUTTON_PRIMARY",
1201        "BUTTON_SECONDARY",
1202        "BUTTON_TERTIARY",
1203        "BUTTON_BACK",
1204        "BUTTON_FORWARD",
1205        "0x00000020",
1206        "0x00000040",
1207        "0x00000080",
1208        "0x00000100",
1209        "0x00000200",
1210        "0x00000400",
1211        "0x00000800",
1212        "0x00001000",
1213        "0x00002000",
1214        "0x00004000",
1215        "0x00008000",
1216        "0x00010000",
1217        "0x00020000",
1218        "0x00040000",
1219        "0x00080000",
1220        "0x00100000",
1221        "0x00200000",
1222        "0x00400000",
1223        "0x00800000",
1224        "0x01000000",
1225        "0x02000000",
1226        "0x04000000",
1227        "0x08000000",
1228        "0x10000000",
1229        "0x20000000",
1230        "0x40000000",
1231        "0x80000000",
1232    };
1233
1234    /**
1235     * Tool type constant: Unknown tool type.
1236     * This constant is used when the tool type is not known or is not relevant,
1237     * such as for a trackball or other non-pointing device.
1238     *
1239     * @see #getToolType
1240     */
1241    public static final int TOOL_TYPE_UNKNOWN = 0;
1242
1243    /**
1244     * Tool type constant: The tool is a finger.
1245     *
1246     * @see #getToolType
1247     */
1248    public static final int TOOL_TYPE_FINGER = 1;
1249
1250    /**
1251     * Tool type constant: The tool is a stylus.
1252     *
1253     * @see #getToolType
1254     */
1255    public static final int TOOL_TYPE_STYLUS = 2;
1256
1257    /**
1258     * Tool type constant: The tool is a mouse or trackpad.
1259     *
1260     * @see #getToolType
1261     */
1262    public static final int TOOL_TYPE_MOUSE = 3;
1263
1264    /**
1265     * Tool type constant: The tool is an eraser or a stylus being used in an inverted posture.
1266     *
1267     * @see #getToolType
1268     */
1269    public static final int TOOL_TYPE_ERASER = 4;
1270
1271    // NOTE: If you add a new tool type here you must also add it to:
1272    //  native/include/android/input.h
1273
1274    // Symbolic names of all tool types.
1275    private static final SparseArray<String> TOOL_TYPE_SYMBOLIC_NAMES = new SparseArray<String>();
1276    static {
1277        SparseArray<String> names = TOOL_TYPE_SYMBOLIC_NAMES;
1278        names.append(TOOL_TYPE_UNKNOWN, "TOOL_TYPE_UNKNOWN");
1279        names.append(TOOL_TYPE_FINGER, "TOOL_TYPE_FINGER");
1280        names.append(TOOL_TYPE_STYLUS, "TOOL_TYPE_STYLUS");
1281        names.append(TOOL_TYPE_MOUSE, "TOOL_TYPE_MOUSE");
1282        names.append(TOOL_TYPE_ERASER, "TOOL_TYPE_ERASER");
1283    }
1284
1285    // Private value for history pos that obtains the current sample.
1286    private static final int HISTORY_CURRENT = -0x80000000;
1287
1288    private static final int MAX_RECYCLED = 10;
1289    private static final Object gRecyclerLock = new Object();
1290    private static int gRecyclerUsed;
1291    private static MotionEvent gRecyclerTop;
1292
1293    // Shared temporary objects used when translating coordinates supplied by
1294    // the caller into single element PointerCoords and pointer id arrays.
1295    private static final Object gSharedTempLock = new Object();
1296    private static PointerCoords[] gSharedTempPointerCoords;
1297    private static PointerProperties[] gSharedTempPointerProperties;
1298    private static int[] gSharedTempPointerIndexMap;
1299
1300    private static final void ensureSharedTempPointerCapacity(int desiredCapacity) {
1301        if (gSharedTempPointerCoords == null
1302                || gSharedTempPointerCoords.length < desiredCapacity) {
1303            int capacity = gSharedTempPointerCoords != null ? gSharedTempPointerCoords.length : 8;
1304            while (capacity < desiredCapacity) {
1305                capacity *= 2;
1306            }
1307            gSharedTempPointerCoords = PointerCoords.createArray(capacity);
1308            gSharedTempPointerProperties = PointerProperties.createArray(capacity);
1309            gSharedTempPointerIndexMap = new int[capacity];
1310        }
1311    }
1312
1313    // Pointer to the native MotionEvent object that contains the actual data.
1314    private int mNativePtr;
1315
1316    private MotionEvent mNext;
1317
1318    private static native int nativeInitialize(int nativePtr,
1319            int deviceId, int source, int action, int flags, int edgeFlags,
1320            int metaState, int buttonState,
1321            float xOffset, float yOffset, float xPrecision, float yPrecision,
1322            long downTimeNanos, long eventTimeNanos,
1323            int pointerCount, PointerProperties[] pointerIds, PointerCoords[] pointerCoords);
1324    private static native int nativeCopy(int destNativePtr, int sourceNativePtr,
1325            boolean keepHistory);
1326    private static native void nativeDispose(int nativePtr);
1327    private static native void nativeAddBatch(int nativePtr, long eventTimeNanos,
1328            PointerCoords[] pointerCoords, int metaState);
1329
1330    private static native int nativeGetDeviceId(int nativePtr);
1331    private static native int nativeGetSource(int nativePtr);
1332    private static native int nativeSetSource(int nativePtr, int source);
1333    private static native int nativeGetAction(int nativePtr);
1334    private static native void nativeSetAction(int nativePtr, int action);
1335    private static native boolean nativeIsTouchEvent(int nativePtr);
1336    private static native int nativeGetFlags(int nativePtr);
1337    private static native void nativeSetFlags(int nativePtr, int flags);
1338    private static native int nativeGetEdgeFlags(int nativePtr);
1339    private static native void nativeSetEdgeFlags(int nativePtr, int action);
1340    private static native int nativeGetMetaState(int nativePtr);
1341    private static native int nativeGetButtonState(int nativePtr);
1342    private static native void nativeOffsetLocation(int nativePtr, float deltaX, float deltaY);
1343    private static native float nativeGetXOffset(int nativePtr);
1344    private static native float nativeGetYOffset(int nativePtr);
1345    private static native float nativeGetXPrecision(int nativePtr);
1346    private static native float nativeGetYPrecision(int nativePtr);
1347    private static native long nativeGetDownTimeNanos(int nativePtr);
1348    private static native void nativeSetDownTimeNanos(int nativePtr, long downTime);
1349
1350    private static native int nativeGetPointerCount(int nativePtr);
1351    private static native int nativeGetPointerId(int nativePtr, int pointerIndex);
1352    private static native int nativeGetToolType(int nativePtr, int pointerIndex);
1353    private static native int nativeFindPointerIndex(int nativePtr, int pointerId);
1354
1355    private static native int nativeGetHistorySize(int nativePtr);
1356    private static native long nativeGetEventTimeNanos(int nativePtr, int historyPos);
1357    private static native float nativeGetRawAxisValue(int nativePtr,
1358            int axis, int pointerIndex, int historyPos);
1359    private static native float nativeGetAxisValue(int nativePtr,
1360            int axis, int pointerIndex, int historyPos);
1361    private static native void nativeGetPointerCoords(int nativePtr,
1362            int pointerIndex, int historyPos, PointerCoords outPointerCoords);
1363    private static native void nativeGetPointerProperties(int nativePtr,
1364            int pointerIndex, PointerProperties outPointerProperties);
1365
1366    private static native void nativeScale(int nativePtr, float scale);
1367    private static native void nativeTransform(int nativePtr, Matrix matrix);
1368
1369    private static native int nativeReadFromParcel(int nativePtr, Parcel parcel);
1370    private static native void nativeWriteToParcel(int nativePtr, Parcel parcel);
1371
1372    private MotionEvent() {
1373    }
1374
1375    @Override
1376    protected void finalize() throws Throwable {
1377        try {
1378            if (mNativePtr != 0) {
1379                nativeDispose(mNativePtr);
1380                mNativePtr = 0;
1381            }
1382        } finally {
1383            super.finalize();
1384        }
1385    }
1386
1387    static private MotionEvent obtain() {
1388        final MotionEvent ev;
1389        synchronized (gRecyclerLock) {
1390            ev = gRecyclerTop;
1391            if (ev == null) {
1392                return new MotionEvent();
1393            }
1394            gRecyclerTop = ev.mNext;
1395            gRecyclerUsed -= 1;
1396        }
1397        ev.mNext = null;
1398        ev.prepareForReuse();
1399        return ev;
1400    }
1401
1402    /**
1403     * Create a new MotionEvent, filling in all of the basic values that
1404     * define the motion.
1405     *
1406     * @param downTime The time (in ms) when the user originally pressed down to start
1407     * a stream of position events.  This must be obtained from {@link SystemClock#uptimeMillis()}.
1408     * @param eventTime The the time (in ms) when this specific event was generated.  This
1409     * must be obtained from {@link SystemClock#uptimeMillis()}.
1410     * @param action The kind of action being performed, such as {@link #ACTION_DOWN}.
1411     * @param pointerCount The number of pointers that will be in this event.
1412     * @param pointerProperties An array of <em>pointerCount</em> values providing
1413     * a {@link PointerProperties} property object for each pointer, which must
1414     * include the pointer identifier.
1415     * @param pointerCoords An array of <em>pointerCount</em> values providing
1416     * a {@link PointerCoords} coordinate object for each pointer.
1417     * @param metaState The state of any meta / modifier keys that were in effect when
1418     * the event was generated.
1419     * @param buttonState The state of buttons that are pressed.
1420     * @param xPrecision The precision of the X coordinate being reported.
1421     * @param yPrecision The precision of the Y coordinate being reported.
1422     * @param deviceId The id for the device that this event came from.  An id of
1423     * zero indicates that the event didn't come from a physical device; other
1424     * numbers are arbitrary and you shouldn't depend on the values.
1425     * @param edgeFlags A bitfield indicating which edges, if any, were touched by this
1426     * MotionEvent.
1427     * @param source The source of this event.
1428     * @param flags The motion event flags.
1429     */
1430    static public MotionEvent obtain(long downTime, long eventTime,
1431            int action, int pointerCount, PointerProperties[] pointerProperties,
1432            PointerCoords[] pointerCoords, int metaState, int buttonState,
1433            float xPrecision, float yPrecision, int deviceId,
1434            int edgeFlags, int source, int flags) {
1435        MotionEvent ev = obtain();
1436        ev.mNativePtr = nativeInitialize(ev.mNativePtr,
1437                deviceId, source, action, flags, edgeFlags, metaState, buttonState,
1438                0, 0, xPrecision, yPrecision,
1439                downTime * NS_PER_MS, eventTime * NS_PER_MS,
1440                pointerCount, pointerProperties, pointerCoords);
1441        return ev;
1442    }
1443
1444    /**
1445     * Create a new MotionEvent, filling in all of the basic values that
1446     * define the motion.
1447     *
1448     * @param downTime The time (in ms) when the user originally pressed down to start
1449     * a stream of position events.  This must be obtained from {@link SystemClock#uptimeMillis()}.
1450     * @param eventTime The the time (in ms) when this specific event was generated.  This
1451     * must be obtained from {@link SystemClock#uptimeMillis()}.
1452     * @param action The kind of action being performed, such as {@link #ACTION_DOWN}.
1453     * @param pointerCount The number of pointers that will be in this event.
1454     * @param pointerIds An array of <em>pointerCount</em> values providing
1455     * an identifier for each pointer.
1456     * @param pointerCoords An array of <em>pointerCount</em> values providing
1457     * a {@link PointerCoords} coordinate object for each pointer.
1458     * @param metaState The state of any meta / modifier keys that were in effect when
1459     * the event was generated.
1460     * @param xPrecision The precision of the X coordinate being reported.
1461     * @param yPrecision The precision of the Y coordinate being reported.
1462     * @param deviceId The id for the device that this event came from.  An id of
1463     * zero indicates that the event didn't come from a physical device; other
1464     * numbers are arbitrary and you shouldn't depend on the values.
1465     * @param edgeFlags A bitfield indicating which edges, if any, were touched by this
1466     * MotionEvent.
1467     * @param source The source of this event.
1468     * @param flags The motion event flags.
1469     *
1470     * @deprecated Use {@link #obtain(long, long, int, int, PointerProperties[], PointerCoords[], int, int, float, float, int, int, int, int)}
1471     * instead.
1472     */
1473    @Deprecated
1474    static public MotionEvent obtain(long downTime, long eventTime,
1475            int action, int pointerCount, int[] pointerIds, PointerCoords[] pointerCoords,
1476            int metaState, float xPrecision, float yPrecision, int deviceId,
1477            int edgeFlags, int source, int flags) {
1478        synchronized (gSharedTempLock) {
1479            ensureSharedTempPointerCapacity(pointerCount);
1480            final PointerProperties[] pp = gSharedTempPointerProperties;
1481            for (int i = 0; i < pointerCount; i++) {
1482                pp[i].clear();
1483                pp[i].id = pointerIds[i];
1484            }
1485            return obtain(downTime, eventTime, action, pointerCount, pp,
1486                    pointerCoords, metaState, 0, xPrecision, yPrecision, deviceId,
1487                    edgeFlags, source, flags);
1488        }
1489    }
1490
1491    /**
1492     * Create a new MotionEvent, filling in all of the basic values that
1493     * define the motion.
1494     *
1495     * @param downTime The time (in ms) when the user originally pressed down to start
1496     * a stream of position events.  This must be obtained from {@link SystemClock#uptimeMillis()}.
1497     * @param eventTime  The the time (in ms) when this specific event was generated.  This
1498     * must be obtained from {@link SystemClock#uptimeMillis()}.
1499     * @param action The kind of action being performed, such as {@link #ACTION_DOWN}.
1500     * @param x The X coordinate of this event.
1501     * @param y The Y coordinate of this event.
1502     * @param pressure The current pressure of this event.  The pressure generally
1503     * ranges from 0 (no pressure at all) to 1 (normal pressure), however
1504     * values higher than 1 may be generated depending on the calibration of
1505     * the input device.
1506     * @param size A scaled value of the approximate size of the area being pressed when
1507     * touched with the finger. The actual value in pixels corresponding to the finger
1508     * touch is normalized with a device specific range of values
1509     * and scaled to a value between 0 and 1.
1510     * @param metaState The state of any meta / modifier keys that were in effect when
1511     * the event was generated.
1512     * @param xPrecision The precision of the X coordinate being reported.
1513     * @param yPrecision The precision of the Y coordinate being reported.
1514     * @param deviceId The id for the device that this event came from.  An id of
1515     * zero indicates that the event didn't come from a physical device; other
1516     * numbers are arbitrary and you shouldn't depend on the values.
1517     * @param edgeFlags A bitfield indicating which edges, if any, were touched by this
1518     * MotionEvent.
1519     */
1520    static public MotionEvent obtain(long downTime, long eventTime, int action,
1521            float x, float y, float pressure, float size, int metaState,
1522            float xPrecision, float yPrecision, int deviceId, int edgeFlags) {
1523        MotionEvent ev = obtain();
1524        synchronized (gSharedTempLock) {
1525            ensureSharedTempPointerCapacity(1);
1526            final PointerProperties[] pp = gSharedTempPointerProperties;
1527            pp[0].clear();
1528            pp[0].id = 0;
1529
1530            final PointerCoords pc[] = gSharedTempPointerCoords;
1531            pc[0].clear();
1532            pc[0].x = x;
1533            pc[0].y = y;
1534            pc[0].pressure = pressure;
1535            pc[0].size = size;
1536
1537            ev.mNativePtr = nativeInitialize(ev.mNativePtr,
1538                    deviceId, InputDevice.SOURCE_UNKNOWN, action, 0, edgeFlags, metaState, 0,
1539                    0, 0, xPrecision, yPrecision,
1540                    downTime * NS_PER_MS, eventTime * NS_PER_MS,
1541                    1, pp, pc);
1542            return ev;
1543        }
1544    }
1545
1546    /**
1547     * Create a new MotionEvent, filling in all of the basic values that
1548     * define the motion.
1549     *
1550     * @param downTime The time (in ms) when the user originally pressed down to start
1551     * a stream of position events.  This must be obtained from {@link SystemClock#uptimeMillis()}.
1552     * @param eventTime  The the time (in ms) when this specific event was generated.  This
1553     * must be obtained from {@link SystemClock#uptimeMillis()}.
1554     * @param action The kind of action being performed, such as {@link #ACTION_DOWN}.
1555     * @param pointerCount The number of pointers that are active in this event.
1556     * @param x The X coordinate of this event.
1557     * @param y The Y coordinate of this event.
1558     * @param pressure The current pressure of this event.  The pressure generally
1559     * ranges from 0 (no pressure at all) to 1 (normal pressure), however
1560     * values higher than 1 may be generated depending on the calibration of
1561     * the input device.
1562     * @param size A scaled value of the approximate size of the area being pressed when
1563     * touched with the finger. The actual value in pixels corresponding to the finger
1564     * touch is normalized with a device specific range of values
1565     * and scaled to a value between 0 and 1.
1566     * @param metaState The state of any meta / modifier keys that were in effect when
1567     * the event was generated.
1568     * @param xPrecision The precision of the X coordinate being reported.
1569     * @param yPrecision The precision of the Y coordinate being reported.
1570     * @param deviceId The id for the device that this event came from.  An id of
1571     * zero indicates that the event didn't come from a physical device; other
1572     * numbers are arbitrary and you shouldn't depend on the values.
1573     * @param edgeFlags A bitfield indicating which edges, if any, were touched by this
1574     * MotionEvent.
1575     *
1576     * @deprecated Use {@link #obtain(long, long, int, float, float, float, float, int, float, float, int, int)}
1577     * instead.
1578     */
1579    @Deprecated
1580    static public MotionEvent obtain(long downTime, long eventTime, int action,
1581            int pointerCount, float x, float y, float pressure, float size, int metaState,
1582            float xPrecision, float yPrecision, int deviceId, int edgeFlags) {
1583        return obtain(downTime, eventTime, action, x, y, pressure, size,
1584                metaState, xPrecision, yPrecision, deviceId, edgeFlags);
1585    }
1586
1587    /**
1588     * Create a new MotionEvent, filling in a subset of the basic motion
1589     * values.  Those not specified here are: device id (always 0), pressure
1590     * and size (always 1), x and y precision (always 1), and edgeFlags (always 0).
1591     *
1592     * @param downTime The time (in ms) when the user originally pressed down to start
1593     * a stream of position events.  This must be obtained from {@link SystemClock#uptimeMillis()}.
1594     * @param eventTime  The the time (in ms) when this specific event was generated.  This
1595     * must be obtained from {@link SystemClock#uptimeMillis()}.
1596     * @param action The kind of action being performed, such as {@link #ACTION_DOWN}.
1597     * @param x The X coordinate of this event.
1598     * @param y The Y coordinate of this event.
1599     * @param metaState The state of any meta / modifier keys that were in effect when
1600     * the event was generated.
1601     */
1602    static public MotionEvent obtain(long downTime, long eventTime, int action,
1603            float x, float y, int metaState) {
1604        return obtain(downTime, eventTime, action, x, y, 1.0f, 1.0f,
1605                metaState, 1.0f, 1.0f, 0, 0);
1606    }
1607
1608    /**
1609     * Create a new MotionEvent, copying from an existing one.
1610     */
1611    static public MotionEvent obtain(MotionEvent other) {
1612        if (other == null) {
1613            throw new IllegalArgumentException("other motion event must not be null");
1614        }
1615
1616        MotionEvent ev = obtain();
1617        ev.mNativePtr = nativeCopy(ev.mNativePtr, other.mNativePtr, true /*keepHistory*/);
1618        return ev;
1619    }
1620
1621    /**
1622     * Create a new MotionEvent, copying from an existing one, but not including
1623     * any historical point information.
1624     */
1625    static public MotionEvent obtainNoHistory(MotionEvent other) {
1626        if (other == null) {
1627            throw new IllegalArgumentException("other motion event must not be null");
1628        }
1629
1630        MotionEvent ev = obtain();
1631        ev.mNativePtr = nativeCopy(ev.mNativePtr, other.mNativePtr, false /*keepHistory*/);
1632        return ev;
1633    }
1634
1635    /** @hide */
1636    @Override
1637    public MotionEvent copy() {
1638        return obtain(this);
1639    }
1640
1641    /**
1642     * Recycle the MotionEvent, to be re-used by a later caller.  After calling
1643     * this function you must not ever touch the event again.
1644     */
1645    @Override
1646    public final void recycle() {
1647        super.recycle();
1648
1649        synchronized (gRecyclerLock) {
1650            if (gRecyclerUsed < MAX_RECYCLED) {
1651                gRecyclerUsed++;
1652                mNext = gRecyclerTop;
1653                gRecyclerTop = this;
1654            }
1655        }
1656    }
1657
1658    /**
1659     * Applies a scale factor to all points within this event.
1660     *
1661     * This method is used to adjust touch events to simulate different density
1662     * displays for compatibility mode.  The values returned by {@link #getRawX()},
1663     * {@link #getRawY()}, {@link #getXPrecision()} and {@link #getYPrecision()}
1664     * are also affected by the scale factor.
1665     *
1666     * @param scale The scale factor to apply.
1667     * @hide
1668     */
1669    public final void scale(float scale) {
1670        if (scale != 1.0f) {
1671            nativeScale(mNativePtr, scale);
1672        }
1673    }
1674
1675    /** {@inheritDoc} */
1676    @Override
1677    public final int getDeviceId() {
1678        return nativeGetDeviceId(mNativePtr);
1679    }
1680
1681    /** {@inheritDoc} */
1682    @Override
1683    public final int getSource() {
1684        return nativeGetSource(mNativePtr);
1685    }
1686
1687    /** {@inheritDoc} */
1688    @Override
1689    public final void setSource(int source) {
1690        nativeSetSource(mNativePtr, source);
1691    }
1692
1693    /**
1694     * Return the kind of action being performed.
1695     * Consider using {@link #getActionMasked} and {@link #getActionIndex} to retrieve
1696     * the separate masked action and pointer index.
1697     * @return The action, such as {@link #ACTION_DOWN} or
1698     * the combination of {@link #ACTION_POINTER_DOWN} with a shifted pointer index.
1699     */
1700    public final int getAction() {
1701        return nativeGetAction(mNativePtr);
1702    }
1703
1704    /**
1705     * Return the masked action being performed, without pointer index information.
1706     * Use {@link #getActionIndex} to return the index associated with pointer actions.
1707     * @return The action, such as {@link #ACTION_DOWN} or {@link #ACTION_POINTER_DOWN}.
1708     */
1709    public final int getActionMasked() {
1710        return nativeGetAction(mNativePtr) & ACTION_MASK;
1711    }
1712
1713    /**
1714     * For {@link #ACTION_POINTER_DOWN} or {@link #ACTION_POINTER_UP}
1715     * as returned by {@link #getActionMasked}, this returns the associated
1716     * pointer index.
1717     * The index may be used with {@link #getPointerId(int)},
1718     * {@link #getX(int)}, {@link #getY(int)}, {@link #getPressure(int)},
1719     * and {@link #getSize(int)} to get information about the pointer that has
1720     * gone down or up.
1721     * @return The index associated with the action.
1722     */
1723    public final int getActionIndex() {
1724        return (nativeGetAction(mNativePtr) & ACTION_POINTER_INDEX_MASK)
1725                >> ACTION_POINTER_INDEX_SHIFT;
1726    }
1727
1728    /**
1729     * Returns true if this motion event is a touch event.
1730     * <p>
1731     * Specifically excludes pointer events with action {@link #ACTION_HOVER_MOVE},
1732     * {@link #ACTION_HOVER_ENTER}, {@link #ACTION_HOVER_EXIT}, or {@link #ACTION_SCROLL}
1733     * because they are not actually touch events (the pointer is not down).
1734     * </p>
1735     * @return True if this motion event is a touch event.
1736     * @hide
1737     */
1738    public final boolean isTouchEvent() {
1739        return nativeIsTouchEvent(mNativePtr);
1740    }
1741
1742    /**
1743     * Gets the motion event flags.
1744     *
1745     * @see #FLAG_WINDOW_IS_OBSCURED
1746     */
1747    public final int getFlags() {
1748        return nativeGetFlags(mNativePtr);
1749    }
1750
1751    /** @hide */
1752    @Override
1753    public final boolean isTainted() {
1754        final int flags = getFlags();
1755        return (flags & FLAG_TAINTED) != 0;
1756    }
1757
1758    /** @hide */
1759    @Override
1760    public final void setTainted(boolean tainted) {
1761        final int flags = getFlags();
1762        nativeSetFlags(mNativePtr, tainted ? flags | FLAG_TAINTED : flags & ~FLAG_TAINTED);
1763    }
1764
1765    /**
1766     * Returns the time (in ms) when the user originally pressed down to start
1767     * a stream of position events.
1768     */
1769    public final long getDownTime() {
1770        return nativeGetDownTimeNanos(mNativePtr) / NS_PER_MS;
1771    }
1772
1773    /**
1774     * Sets the time (in ms) when the user originally pressed down to start
1775     * a stream of position events.
1776     *
1777     * @hide
1778     */
1779    public final void setDownTime(long downTime) {
1780        nativeSetDownTimeNanos(mNativePtr, downTime * NS_PER_MS);
1781    }
1782
1783    /**
1784     * Retrieve the time this event occurred,
1785     * in the {@link android.os.SystemClock#uptimeMillis} time base.
1786     *
1787     * @return Returns the time this event occurred,
1788     * in the {@link android.os.SystemClock#uptimeMillis} time base.
1789     */
1790    @Override
1791    public final long getEventTime() {
1792        return nativeGetEventTimeNanos(mNativePtr, HISTORY_CURRENT) / NS_PER_MS;
1793    }
1794
1795    /**
1796     * Retrieve the time this event occurred,
1797     * in the {@link android.os.SystemClock#uptimeMillis} time base but with
1798     * nanosecond precision.
1799     * <p>
1800     * The value is in nanosecond precision but it may not have nanosecond accuracy.
1801     * </p>
1802     *
1803     * @return Returns the time this event occurred,
1804     * in the {@link android.os.SystemClock#uptimeMillis} time base but with
1805     * nanosecond precision.
1806     *
1807     * @hide
1808     */
1809    @Override
1810    public final long getEventTimeNano() {
1811        return nativeGetEventTimeNanos(mNativePtr, HISTORY_CURRENT);
1812    }
1813
1814    /**
1815     * {@link #getX(int)} for the first pointer index (may be an
1816     * arbitrary pointer identifier).
1817     *
1818     * @see #AXIS_X
1819     */
1820    public final float getX() {
1821        return nativeGetAxisValue(mNativePtr, AXIS_X, 0, HISTORY_CURRENT);
1822    }
1823
1824    /**
1825     * {@link #getY(int)} for the first pointer index (may be an
1826     * arbitrary pointer identifier).
1827     *
1828     * @see #AXIS_Y
1829     */
1830    public final float getY() {
1831        return nativeGetAxisValue(mNativePtr, AXIS_Y, 0, HISTORY_CURRENT);
1832    }
1833
1834    /**
1835     * {@link #getPressure(int)} for the first pointer index (may be an
1836     * arbitrary pointer identifier).
1837     *
1838     * @see #AXIS_PRESSURE
1839     */
1840    public final float getPressure() {
1841        return nativeGetAxisValue(mNativePtr, AXIS_PRESSURE, 0, HISTORY_CURRENT);
1842    }
1843
1844    /**
1845     * {@link #getSize(int)} for the first pointer index (may be an
1846     * arbitrary pointer identifier).
1847     *
1848     * @see #AXIS_SIZE
1849     */
1850    public final float getSize() {
1851        return nativeGetAxisValue(mNativePtr, AXIS_SIZE, 0, HISTORY_CURRENT);
1852    }
1853
1854    /**
1855     * {@link #getTouchMajor(int)} for the first pointer index (may be an
1856     * arbitrary pointer identifier).
1857     *
1858     * @see #AXIS_TOUCH_MAJOR
1859     */
1860    public final float getTouchMajor() {
1861        return nativeGetAxisValue(mNativePtr, AXIS_TOUCH_MAJOR, 0, HISTORY_CURRENT);
1862    }
1863
1864    /**
1865     * {@link #getTouchMinor(int)} for the first pointer index (may be an
1866     * arbitrary pointer identifier).
1867     *
1868     * @see #AXIS_TOUCH_MINOR
1869     */
1870    public final float getTouchMinor() {
1871        return nativeGetAxisValue(mNativePtr, AXIS_TOUCH_MINOR, 0, HISTORY_CURRENT);
1872    }
1873
1874    /**
1875     * {@link #getToolMajor(int)} for the first pointer index (may be an
1876     * arbitrary pointer identifier).
1877     *
1878     * @see #AXIS_TOOL_MAJOR
1879     */
1880    public final float getToolMajor() {
1881        return nativeGetAxisValue(mNativePtr, AXIS_TOOL_MAJOR, 0, HISTORY_CURRENT);
1882    }
1883
1884    /**
1885     * {@link #getToolMinor(int)} for the first pointer index (may be an
1886     * arbitrary pointer identifier).
1887     *
1888     * @see #AXIS_TOOL_MINOR
1889     */
1890    public final float getToolMinor() {
1891        return nativeGetAxisValue(mNativePtr, AXIS_TOOL_MINOR, 0, HISTORY_CURRENT);
1892    }
1893
1894    /**
1895     * {@link #getOrientation(int)} for the first pointer index (may be an
1896     * arbitrary pointer identifier).
1897     *
1898     * @see #AXIS_ORIENTATION
1899     */
1900    public final float getOrientation() {
1901        return nativeGetAxisValue(mNativePtr, AXIS_ORIENTATION, 0, HISTORY_CURRENT);
1902    }
1903
1904    /**
1905     * {@link #getAxisValue(int)} for the first pointer index (may be an
1906     * arbitrary pointer identifier).
1907     *
1908     * @param axis The axis identifier for the axis value to retrieve.
1909     *
1910     * @see #AXIS_X
1911     * @see #AXIS_Y
1912     */
1913    public final float getAxisValue(int axis) {
1914        return nativeGetAxisValue(mNativePtr, axis, 0, HISTORY_CURRENT);
1915    }
1916
1917    /**
1918     * The number of pointers of data contained in this event.  Always
1919     * >= 1.
1920     */
1921    public final int getPointerCount() {
1922        return nativeGetPointerCount(mNativePtr);
1923    }
1924
1925    /**
1926     * Return the pointer identifier associated with a particular pointer
1927     * data index is this event.  The identifier tells you the actual pointer
1928     * number associated with the data, accounting for individual pointers
1929     * going up and down since the start of the current gesture.
1930     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
1931     * (the first pointer that is down) to {@link #getPointerCount()}-1.
1932     */
1933    public final int getPointerId(int pointerIndex) {
1934        return nativeGetPointerId(mNativePtr, pointerIndex);
1935    }
1936
1937    /**
1938     * Gets the tool type of a pointer for the given pointer index.
1939     * The tool type indicates the type of tool used to make contact such
1940     * as a finger or stylus, if known.
1941     *
1942     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
1943     * (the first pointer that is down) to {@link #getPointerCount()}-1.
1944     * @return The tool type of the pointer.
1945     *
1946     * @see #TOOL_TYPE_UNKNOWN
1947     * @see #TOOL_TYPE_FINGER
1948     * @see #TOOL_TYPE_STYLUS
1949     * @see #TOOL_TYPE_MOUSE
1950     */
1951    public final int getToolType(int pointerIndex) {
1952        return nativeGetToolType(mNativePtr, pointerIndex);
1953    }
1954
1955    /**
1956     * Given a pointer identifier, find the index of its data in the event.
1957     *
1958     * @param pointerId The identifier of the pointer to be found.
1959     * @return Returns either the index of the pointer (for use with
1960     * {@link #getX(int)} et al.), or -1 if there is no data available for
1961     * that pointer identifier.
1962     */
1963    public final int findPointerIndex(int pointerId) {
1964        return nativeFindPointerIndex(mNativePtr, pointerId);
1965    }
1966
1967    /**
1968     * Returns the X coordinate of this event for the given pointer
1969     * <em>index</em> (use {@link #getPointerId(int)} to find the pointer
1970     * identifier for this index).
1971     * Whole numbers are pixels; the
1972     * value may have a fraction for input devices that are sub-pixel precise.
1973     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
1974     * (the first pointer that is down) to {@link #getPointerCount()}-1.
1975     *
1976     * @see #AXIS_X
1977     */
1978    public final float getX(int pointerIndex) {
1979        return nativeGetAxisValue(mNativePtr, AXIS_X, pointerIndex, HISTORY_CURRENT);
1980    }
1981
1982    /**
1983     * Returns the Y coordinate of this event for the given pointer
1984     * <em>index</em> (use {@link #getPointerId(int)} to find the pointer
1985     * identifier for this index).
1986     * Whole numbers are pixels; the
1987     * value may have a fraction for input devices that are sub-pixel precise.
1988     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
1989     * (the first pointer that is down) to {@link #getPointerCount()}-1.
1990     *
1991     * @see #AXIS_Y
1992     */
1993    public final float getY(int pointerIndex) {
1994        return nativeGetAxisValue(mNativePtr, AXIS_Y, pointerIndex, HISTORY_CURRENT);
1995    }
1996
1997    /**
1998     * Returns the current pressure of this event for the given pointer
1999     * <em>index</em> (use {@link #getPointerId(int)} to find the pointer
2000     * identifier for this index).
2001     * The pressure generally
2002     * ranges from 0 (no pressure at all) to 1 (normal pressure), however
2003     * values higher than 1 may be generated depending on the calibration of
2004     * the input device.
2005     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
2006     * (the first pointer that is down) to {@link #getPointerCount()}-1.
2007     *
2008     * @see #AXIS_PRESSURE
2009     */
2010    public final float getPressure(int pointerIndex) {
2011        return nativeGetAxisValue(mNativePtr, AXIS_PRESSURE, pointerIndex, HISTORY_CURRENT);
2012    }
2013
2014    /**
2015     * Returns a scaled value of the approximate size for the given pointer
2016     * <em>index</em> (use {@link #getPointerId(int)} to find the pointer
2017     * identifier for this index).
2018     * This represents some approximation of the area of the screen being
2019     * pressed; the actual value in pixels corresponding to the
2020     * touch is normalized with the device specific range of values
2021     * and scaled to a value between 0 and 1. The value of size can be used to
2022     * determine fat touch events.
2023     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
2024     * (the first pointer that is down) to {@link #getPointerCount()}-1.
2025     *
2026     * @see #AXIS_SIZE
2027     */
2028    public final float getSize(int pointerIndex) {
2029        return nativeGetAxisValue(mNativePtr, AXIS_SIZE, pointerIndex, HISTORY_CURRENT);
2030    }
2031
2032    /**
2033     * Returns the length of the major axis of an ellipse that describes the touch
2034     * area at the point of contact for the given pointer
2035     * <em>index</em> (use {@link #getPointerId(int)} to find the pointer
2036     * identifier for this index).
2037     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
2038     * (the first pointer that is down) to {@link #getPointerCount()}-1.
2039     *
2040     * @see #AXIS_TOUCH_MAJOR
2041     */
2042    public final float getTouchMajor(int pointerIndex) {
2043        return nativeGetAxisValue(mNativePtr, AXIS_TOUCH_MAJOR, pointerIndex, HISTORY_CURRENT);
2044    }
2045
2046    /**
2047     * Returns the length of the minor axis of an ellipse that describes the touch
2048     * area at the point of contact for the given pointer
2049     * <em>index</em> (use {@link #getPointerId(int)} to find the pointer
2050     * identifier for this index).
2051     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
2052     * (the first pointer that is down) to {@link #getPointerCount()}-1.
2053     *
2054     * @see #AXIS_TOUCH_MINOR
2055     */
2056    public final float getTouchMinor(int pointerIndex) {
2057        return nativeGetAxisValue(mNativePtr, AXIS_TOUCH_MINOR, pointerIndex, HISTORY_CURRENT);
2058    }
2059
2060    /**
2061     * Returns the length of the major axis of an ellipse that describes the size of
2062     * the approaching tool for the given pointer
2063     * <em>index</em> (use {@link #getPointerId(int)} to find the pointer
2064     * identifier for this index).
2065     * The tool area represents the estimated size of the finger or pen that is
2066     * touching the device independent of its actual touch area at the point of contact.
2067     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
2068     * (the first pointer that is down) to {@link #getPointerCount()}-1.
2069     *
2070     * @see #AXIS_TOOL_MAJOR
2071     */
2072    public final float getToolMajor(int pointerIndex) {
2073        return nativeGetAxisValue(mNativePtr, AXIS_TOOL_MAJOR, pointerIndex, HISTORY_CURRENT);
2074    }
2075
2076    /**
2077     * Returns the length of the minor axis of an ellipse that describes the size of
2078     * the approaching tool for the given pointer
2079     * <em>index</em> (use {@link #getPointerId(int)} to find the pointer
2080     * identifier for this index).
2081     * The tool area represents the estimated size of the finger or pen that is
2082     * touching the device independent of its actual touch area at the point of contact.
2083     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
2084     * (the first pointer that is down) to {@link #getPointerCount()}-1.
2085     *
2086     * @see #AXIS_TOOL_MINOR
2087     */
2088    public final float getToolMinor(int pointerIndex) {
2089        return nativeGetAxisValue(mNativePtr, AXIS_TOOL_MINOR, pointerIndex, HISTORY_CURRENT);
2090    }
2091
2092    /**
2093     * Returns the orientation of the touch area and tool area in radians clockwise from vertical
2094     * for the given pointer <em>index</em> (use {@link #getPointerId(int)} to find the pointer
2095     * identifier for this index).
2096     * An angle of 0 radians indicates that the major axis of contact is oriented
2097     * upwards, is perfectly circular or is of unknown orientation.  A positive angle
2098     * indicates that the major axis of contact is oriented to the right.  A negative angle
2099     * indicates that the major axis of contact is oriented to the left.
2100     * The full range is from -PI/2 radians (finger pointing fully left) to PI/2 radians
2101     * (finger pointing fully right).
2102     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
2103     * (the first pointer that is down) to {@link #getPointerCount()}-1.
2104     *
2105     * @see #AXIS_ORIENTATION
2106     */
2107    public final float getOrientation(int pointerIndex) {
2108        return nativeGetAxisValue(mNativePtr, AXIS_ORIENTATION, pointerIndex, HISTORY_CURRENT);
2109    }
2110
2111    /**
2112     * Returns the value of the requested axis for the given pointer <em>index</em>
2113     * (use {@link #getPointerId(int)} to find the pointer identifier for this index).
2114     *
2115     * @param axis The axis identifier for the axis value to retrieve.
2116     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
2117     * (the first pointer that is down) to {@link #getPointerCount()}-1.
2118     * @return The value of the axis, or 0 if the axis is not available.
2119     *
2120     * @see #AXIS_X
2121     * @see #AXIS_Y
2122     */
2123    public final float getAxisValue(int axis, int pointerIndex) {
2124        return nativeGetAxisValue(mNativePtr, axis, pointerIndex, HISTORY_CURRENT);
2125    }
2126
2127    /**
2128     * Populates a {@link PointerCoords} object with pointer coordinate data for
2129     * the specified pointer index.
2130     *
2131     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
2132     * (the first pointer that is down) to {@link #getPointerCount()}-1.
2133     * @param outPointerCoords The pointer coordinate object to populate.
2134     *
2135     * @see PointerCoords
2136     */
2137    public final void getPointerCoords(int pointerIndex, PointerCoords outPointerCoords) {
2138        nativeGetPointerCoords(mNativePtr, pointerIndex, HISTORY_CURRENT, outPointerCoords);
2139    }
2140
2141    /**
2142     * Populates a {@link PointerProperties} object with pointer properties for
2143     * the specified pointer index.
2144     *
2145     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
2146     * (the first pointer that is down) to {@link #getPointerCount()}-1.
2147     * @param outPointerProperties The pointer properties object to populate.
2148     *
2149     * @see PointerProperties
2150     */
2151    public final void getPointerProperties(int pointerIndex,
2152            PointerProperties outPointerProperties) {
2153        nativeGetPointerProperties(mNativePtr, pointerIndex, outPointerProperties);
2154    }
2155
2156    /**
2157     * Returns the state of any meta / modifier keys that were in effect when
2158     * the event was generated.  This is the same values as those
2159     * returned by {@link KeyEvent#getMetaState() KeyEvent.getMetaState}.
2160     *
2161     * @return an integer in which each bit set to 1 represents a pressed
2162     *         meta key
2163     *
2164     * @see KeyEvent#getMetaState()
2165     */
2166    public final int getMetaState() {
2167        return nativeGetMetaState(mNativePtr);
2168    }
2169
2170    /**
2171     * Gets the state of all buttons that are pressed such as a mouse or stylus button.
2172     *
2173     * @return The button state.
2174     *
2175     * @see #BUTTON_PRIMARY
2176     * @see #BUTTON_SECONDARY
2177     * @see #BUTTON_TERTIARY
2178     * @see #BUTTON_FORWARD
2179     * @see #BUTTON_BACK
2180     */
2181    public final int getButtonState() {
2182        return nativeGetButtonState(mNativePtr);
2183    }
2184
2185    /**
2186     * Returns the original raw X coordinate of this event.  For touch
2187     * events on the screen, this is the original location of the event
2188     * on the screen, before it had been adjusted for the containing window
2189     * and views.
2190     *
2191     * @see #getX(int)
2192     * @see #AXIS_X
2193     */
2194    public final float getRawX() {
2195        return nativeGetRawAxisValue(mNativePtr, AXIS_X, 0, HISTORY_CURRENT);
2196    }
2197
2198    /**
2199     * Returns the original raw Y coordinate of this event.  For touch
2200     * events on the screen, this is the original location of the event
2201     * on the screen, before it had been adjusted for the containing window
2202     * and views.
2203     *
2204     * @see #getY(int)
2205     * @see #AXIS_Y
2206     */
2207    public final float getRawY() {
2208        return nativeGetRawAxisValue(mNativePtr, AXIS_Y, 0, HISTORY_CURRENT);
2209    }
2210
2211    /**
2212     * Return the precision of the X coordinates being reported.  You can
2213     * multiply this number with {@link #getX} to find the actual hardware
2214     * value of the X coordinate.
2215     * @return Returns the precision of X coordinates being reported.
2216     *
2217     * @see #AXIS_X
2218     */
2219    public final float getXPrecision() {
2220        return nativeGetXPrecision(mNativePtr);
2221    }
2222
2223    /**
2224     * Return the precision of the Y coordinates being reported.  You can
2225     * multiply this number with {@link #getY} to find the actual hardware
2226     * value of the Y coordinate.
2227     * @return Returns the precision of Y coordinates being reported.
2228     *
2229     * @see #AXIS_Y
2230     */
2231    public final float getYPrecision() {
2232        return nativeGetYPrecision(mNativePtr);
2233    }
2234
2235    /**
2236     * Returns the number of historical points in this event.  These are
2237     * movements that have occurred between this event and the previous event.
2238     * This only applies to ACTION_MOVE events -- all other actions will have
2239     * a size of 0.
2240     *
2241     * @return Returns the number of historical points in the event.
2242     */
2243    public final int getHistorySize() {
2244        return nativeGetHistorySize(mNativePtr);
2245    }
2246
2247    /**
2248     * Returns the time that a historical movement occurred between this event
2249     * and the previous event, in the {@link android.os.SystemClock#uptimeMillis} time base.
2250     * <p>
2251     * This only applies to ACTION_MOVE events.
2252     * </p>
2253     *
2254     * @param pos Which historical value to return; must be less than
2255     * {@link #getHistorySize}
2256     * @return Returns the time that a historical movement occurred between this
2257     * event and the previous event,
2258     * in the {@link android.os.SystemClock#uptimeMillis} time base.
2259     *
2260     * @see #getHistorySize
2261     * @see #getEventTime
2262     */
2263    public final long getHistoricalEventTime(int pos) {
2264        return nativeGetEventTimeNanos(mNativePtr, pos) / NS_PER_MS;
2265    }
2266
2267    /**
2268     * Returns the time that a historical movement occurred between this event
2269     * and the previous event, in the {@link android.os.SystemClock#uptimeMillis} time base
2270     * but with nanosecond (instead of millisecond) precision.
2271     * <p>
2272     * This only applies to ACTION_MOVE events.
2273     * </p><p>
2274     * The value is in nanosecond precision but it may not have nanosecond accuracy.
2275     * </p>
2276     *
2277     * @param pos Which historical value to return; must be less than
2278     * {@link #getHistorySize}
2279     * @return Returns the time that a historical movement occurred between this
2280     * event and the previous event,
2281     * in the {@link android.os.SystemClock#uptimeMillis} time base but with
2282     * nanosecond (instead of millisecond) precision.
2283     *
2284     * @see #getHistorySize
2285     * @see #getEventTime
2286     *
2287     * @hide
2288     */
2289    public final long getHistoricalEventTimeNano(int pos) {
2290        return nativeGetEventTimeNanos(mNativePtr, pos);
2291    }
2292
2293    /**
2294     * {@link #getHistoricalX(int, int)} for the first pointer index (may be an
2295     * arbitrary pointer identifier).
2296     *
2297     * @param pos Which historical value to return; must be less than
2298     * {@link #getHistorySize}
2299     *
2300     * @see #getHistorySize
2301     * @see #getX()
2302     * @see #AXIS_X
2303     */
2304    public final float getHistoricalX(int pos) {
2305        return nativeGetAxisValue(mNativePtr, AXIS_X, 0, pos);
2306    }
2307
2308    /**
2309     * {@link #getHistoricalY(int, int)} for the first pointer index (may be an
2310     * arbitrary pointer identifier).
2311     *
2312     * @param pos Which historical value to return; must be less than
2313     * {@link #getHistorySize}
2314     *
2315     * @see #getHistorySize
2316     * @see #getY()
2317     * @see #AXIS_Y
2318     */
2319    public final float getHistoricalY(int pos) {
2320        return nativeGetAxisValue(mNativePtr, AXIS_Y, 0, pos);
2321    }
2322
2323    /**
2324     * {@link #getHistoricalPressure(int, int)} for the first pointer index (may be an
2325     * arbitrary pointer identifier).
2326     *
2327     * @param pos Which historical value to return; must be less than
2328     * {@link #getHistorySize}
2329     *
2330     * @see #getHistorySize
2331     * @see #getPressure()
2332     * @see #AXIS_PRESSURE
2333     */
2334    public final float getHistoricalPressure(int pos) {
2335        return nativeGetAxisValue(mNativePtr, AXIS_PRESSURE, 0, pos);
2336    }
2337
2338    /**
2339     * {@link #getHistoricalSize(int, int)} for the first pointer index (may be an
2340     * arbitrary pointer identifier).
2341     *
2342     * @param pos Which historical value to return; must be less than
2343     * {@link #getHistorySize}
2344     *
2345     * @see #getHistorySize
2346     * @see #getSize()
2347     * @see #AXIS_SIZE
2348     */
2349    public final float getHistoricalSize(int pos) {
2350        return nativeGetAxisValue(mNativePtr, AXIS_SIZE, 0, pos);
2351    }
2352
2353    /**
2354     * {@link #getHistoricalTouchMajor(int, int)} for the first pointer index (may be an
2355     * arbitrary pointer identifier).
2356     *
2357     * @param pos Which historical value to return; must be less than
2358     * {@link #getHistorySize}
2359     *
2360     * @see #getHistorySize
2361     * @see #getTouchMajor()
2362     * @see #AXIS_TOUCH_MAJOR
2363     */
2364    public final float getHistoricalTouchMajor(int pos) {
2365        return nativeGetAxisValue(mNativePtr, AXIS_TOUCH_MAJOR, 0, pos);
2366    }
2367
2368    /**
2369     * {@link #getHistoricalTouchMinor(int, int)} for the first pointer index (may be an
2370     * arbitrary pointer identifier).
2371     *
2372     * @param pos Which historical value to return; must be less than
2373     * {@link #getHistorySize}
2374     *
2375     * @see #getHistorySize
2376     * @see #getTouchMinor()
2377     * @see #AXIS_TOUCH_MINOR
2378     */
2379    public final float getHistoricalTouchMinor(int pos) {
2380        return nativeGetAxisValue(mNativePtr, AXIS_TOUCH_MINOR, 0, pos);
2381    }
2382
2383    /**
2384     * {@link #getHistoricalToolMajor(int, int)} for the first pointer index (may be an
2385     * arbitrary pointer identifier).
2386     *
2387     * @param pos Which historical value to return; must be less than
2388     * {@link #getHistorySize}
2389     *
2390     * @see #getHistorySize
2391     * @see #getToolMajor()
2392     * @see #AXIS_TOOL_MAJOR
2393     */
2394    public final float getHistoricalToolMajor(int pos) {
2395        return nativeGetAxisValue(mNativePtr, AXIS_TOOL_MAJOR, 0, pos);
2396    }
2397
2398    /**
2399     * {@link #getHistoricalToolMinor(int, int)} for the first pointer index (may be an
2400     * arbitrary pointer identifier).
2401     *
2402     * @param pos Which historical value to return; must be less than
2403     * {@link #getHistorySize}
2404     *
2405     * @see #getHistorySize
2406     * @see #getToolMinor()
2407     * @see #AXIS_TOOL_MINOR
2408     */
2409    public final float getHistoricalToolMinor(int pos) {
2410        return nativeGetAxisValue(mNativePtr, AXIS_TOOL_MINOR, 0, pos);
2411    }
2412
2413    /**
2414     * {@link #getHistoricalOrientation(int, int)} for the first pointer index (may be an
2415     * arbitrary pointer identifier).
2416     *
2417     * @param pos Which historical value to return; must be less than
2418     * {@link #getHistorySize}
2419     *
2420     * @see #getHistorySize
2421     * @see #getOrientation()
2422     * @see #AXIS_ORIENTATION
2423     */
2424    public final float getHistoricalOrientation(int pos) {
2425        return nativeGetAxisValue(mNativePtr, AXIS_ORIENTATION, 0, pos);
2426    }
2427
2428    /**
2429     * {@link #getHistoricalAxisValue(int, int, int)} for the first pointer index (may be an
2430     * arbitrary pointer identifier).
2431     *
2432     * @param axis The axis identifier for the axis value to retrieve.
2433     * @param pos Which historical value to return; must be less than
2434     * {@link #getHistorySize}
2435     *
2436     * @see #getHistorySize
2437     * @see #getAxisValue(int)
2438     * @see #AXIS_X
2439     * @see #AXIS_Y
2440     */
2441    public final float getHistoricalAxisValue(int axis, int pos) {
2442        return nativeGetAxisValue(mNativePtr, axis, 0, pos);
2443    }
2444
2445    /**
2446     * Returns a historical X coordinate, as per {@link #getX(int)}, that
2447     * occurred between this event and the previous event for the given pointer.
2448     * Only applies to ACTION_MOVE events.
2449     *
2450     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
2451     * (the first pointer that is down) to {@link #getPointerCount()}-1.
2452     * @param pos Which historical value to return; must be less than
2453     * {@link #getHistorySize}
2454     *
2455     * @see #getHistorySize
2456     * @see #getX(int)
2457     * @see #AXIS_X
2458     */
2459    public final float getHistoricalX(int pointerIndex, int pos) {
2460        return nativeGetAxisValue(mNativePtr, AXIS_X, pointerIndex, pos);
2461    }
2462
2463    /**
2464     * Returns a historical Y coordinate, as per {@link #getY(int)}, that
2465     * occurred between this event and the previous event for the given pointer.
2466     * Only applies to ACTION_MOVE events.
2467     *
2468     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
2469     * (the first pointer that is down) to {@link #getPointerCount()}-1.
2470     * @param pos Which historical value to return; must be less than
2471     * {@link #getHistorySize}
2472     *
2473     * @see #getHistorySize
2474     * @see #getY(int)
2475     * @see #AXIS_Y
2476     */
2477    public final float getHistoricalY(int pointerIndex, int pos) {
2478        return nativeGetAxisValue(mNativePtr, AXIS_Y, pointerIndex, pos);
2479    }
2480
2481    /**
2482     * Returns a historical pressure coordinate, as per {@link #getPressure(int)},
2483     * that occurred between this event and the previous event for the given
2484     * pointer.  Only applies to ACTION_MOVE events.
2485     *
2486     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
2487     * (the first pointer that is down) to {@link #getPointerCount()}-1.
2488     * @param pos Which historical value to return; must be less than
2489     * {@link #getHistorySize}
2490     *
2491     * @see #getHistorySize
2492     * @see #getPressure(int)
2493     * @see #AXIS_PRESSURE
2494     */
2495    public final float getHistoricalPressure(int pointerIndex, int pos) {
2496        return nativeGetAxisValue(mNativePtr, AXIS_PRESSURE, pointerIndex, pos);
2497    }
2498
2499    /**
2500     * Returns a historical size coordinate, as per {@link #getSize(int)}, that
2501     * occurred between this event and the previous event for the given pointer.
2502     * Only applies to ACTION_MOVE events.
2503     *
2504     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
2505     * (the first pointer that is down) to {@link #getPointerCount()}-1.
2506     * @param pos Which historical value to return; must be less than
2507     * {@link #getHistorySize}
2508     *
2509     * @see #getHistorySize
2510     * @see #getSize(int)
2511     * @see #AXIS_SIZE
2512     */
2513    public final float getHistoricalSize(int pointerIndex, int pos) {
2514        return nativeGetAxisValue(mNativePtr, AXIS_SIZE, pointerIndex, pos);
2515    }
2516
2517    /**
2518     * Returns a historical touch major axis coordinate, as per {@link #getTouchMajor(int)}, that
2519     * occurred between this event and the previous event for the given pointer.
2520     * Only applies to ACTION_MOVE events.
2521     *
2522     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
2523     * (the first pointer that is down) to {@link #getPointerCount()}-1.
2524     * @param pos Which historical value to return; must be less than
2525     * {@link #getHistorySize}
2526     *
2527     * @see #getHistorySize
2528     * @see #getTouchMajor(int)
2529     * @see #AXIS_TOUCH_MAJOR
2530     */
2531    public final float getHistoricalTouchMajor(int pointerIndex, int pos) {
2532        return nativeGetAxisValue(mNativePtr, AXIS_TOUCH_MAJOR, pointerIndex, pos);
2533    }
2534
2535    /**
2536     * Returns a historical touch minor axis coordinate, as per {@link #getTouchMinor(int)}, that
2537     * occurred between this event and the previous event for the given pointer.
2538     * Only applies to ACTION_MOVE events.
2539     *
2540     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
2541     * (the first pointer that is down) to {@link #getPointerCount()}-1.
2542     * @param pos Which historical value to return; must be less than
2543     * {@link #getHistorySize}
2544     *
2545     * @see #getHistorySize
2546     * @see #getTouchMinor(int)
2547     * @see #AXIS_TOUCH_MINOR
2548     */
2549    public final float getHistoricalTouchMinor(int pointerIndex, int pos) {
2550        return nativeGetAxisValue(mNativePtr, AXIS_TOUCH_MINOR, pointerIndex, pos);
2551    }
2552
2553    /**
2554     * Returns a historical tool major axis coordinate, as per {@link #getToolMajor(int)}, that
2555     * occurred between this event and the previous event for the given pointer.
2556     * Only applies to ACTION_MOVE events.
2557     *
2558     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
2559     * (the first pointer that is down) to {@link #getPointerCount()}-1.
2560     * @param pos Which historical value to return; must be less than
2561     * {@link #getHistorySize}
2562     *
2563     * @see #getHistorySize
2564     * @see #getToolMajor(int)
2565     * @see #AXIS_TOOL_MAJOR
2566     */
2567    public final float getHistoricalToolMajor(int pointerIndex, int pos) {
2568        return nativeGetAxisValue(mNativePtr, AXIS_TOOL_MAJOR, pointerIndex, pos);
2569    }
2570
2571    /**
2572     * Returns a historical tool minor axis coordinate, as per {@link #getToolMinor(int)}, that
2573     * occurred between this event and the previous event for the given pointer.
2574     * Only applies to ACTION_MOVE events.
2575     *
2576     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
2577     * (the first pointer that is down) to {@link #getPointerCount()}-1.
2578     * @param pos Which historical value to return; must be less than
2579     * {@link #getHistorySize}
2580     *
2581     * @see #getHistorySize
2582     * @see #getToolMinor(int)
2583     * @see #AXIS_TOOL_MINOR
2584     */
2585    public final float getHistoricalToolMinor(int pointerIndex, int pos) {
2586        return nativeGetAxisValue(mNativePtr, AXIS_TOOL_MINOR, pointerIndex, pos);
2587    }
2588
2589    /**
2590     * Returns a historical orientation coordinate, as per {@link #getOrientation(int)}, that
2591     * occurred between this event and the previous event for the given pointer.
2592     * Only applies to ACTION_MOVE events.
2593     *
2594     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
2595     * (the first pointer that is down) to {@link #getPointerCount()}-1.
2596     * @param pos Which historical value to return; must be less than
2597     * {@link #getHistorySize}
2598     *
2599     * @see #getHistorySize
2600     * @see #getOrientation(int)
2601     * @see #AXIS_ORIENTATION
2602     */
2603    public final float getHistoricalOrientation(int pointerIndex, int pos) {
2604        return nativeGetAxisValue(mNativePtr, AXIS_ORIENTATION, pointerIndex, pos);
2605    }
2606
2607    /**
2608     * Returns the historical value of the requested axis, as per {@link #getAxisValue(int, int)},
2609     * occurred between this event and the previous event for the given pointer.
2610     * Only applies to ACTION_MOVE events.
2611     *
2612     * @param axis The axis identifier for the axis value to retrieve.
2613     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
2614     * (the first pointer that is down) to {@link #getPointerCount()}-1.
2615     * @param pos Which historical value to return; must be less than
2616     * {@link #getHistorySize}
2617     * @return The value of the axis, or 0 if the axis is not available.
2618     *
2619     * @see #AXIS_X
2620     * @see #AXIS_Y
2621     */
2622    public final float getHistoricalAxisValue(int axis, int pointerIndex, int pos) {
2623        return nativeGetAxisValue(mNativePtr, axis, pointerIndex, pos);
2624    }
2625
2626    /**
2627     * Populates a {@link PointerCoords} object with historical pointer coordinate data,
2628     * as per {@link #getPointerCoords}, that occurred between this event and the previous
2629     * event for the given pointer.
2630     * Only applies to ACTION_MOVE events.
2631     *
2632     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
2633     * (the first pointer that is down) to {@link #getPointerCount()}-1.
2634     * @param pos Which historical value to return; must be less than
2635     * {@link #getHistorySize}
2636     * @param outPointerCoords The pointer coordinate object to populate.
2637     *
2638     * @see #getHistorySize
2639     * @see #getPointerCoords
2640     * @see PointerCoords
2641     */
2642    public final void getHistoricalPointerCoords(int pointerIndex, int pos,
2643            PointerCoords outPointerCoords) {
2644        nativeGetPointerCoords(mNativePtr, pointerIndex, pos, outPointerCoords);
2645    }
2646
2647    /**
2648     * Returns a bitfield indicating which edges, if any, were touched by this
2649     * MotionEvent. For touch events, clients can use this to determine if the
2650     * user's finger was touching the edge of the display.
2651     *
2652     * This property is only set for {@link #ACTION_DOWN} events.
2653     *
2654     * @see #EDGE_LEFT
2655     * @see #EDGE_TOP
2656     * @see #EDGE_RIGHT
2657     * @see #EDGE_BOTTOM
2658     */
2659    public final int getEdgeFlags() {
2660        return nativeGetEdgeFlags(mNativePtr);
2661    }
2662
2663    /**
2664     * Sets the bitfield indicating which edges, if any, were touched by this
2665     * MotionEvent.
2666     *
2667     * @see #getEdgeFlags()
2668     */
2669    public final void setEdgeFlags(int flags) {
2670        nativeSetEdgeFlags(mNativePtr, flags);
2671    }
2672
2673    /**
2674     * Sets this event's action.
2675     */
2676    public final void setAction(int action) {
2677        nativeSetAction(mNativePtr, action);
2678    }
2679
2680    /**
2681     * Adjust this event's location.
2682     * @param deltaX Amount to add to the current X coordinate of the event.
2683     * @param deltaY Amount to add to the current Y coordinate of the event.
2684     */
2685    public final void offsetLocation(float deltaX, float deltaY) {
2686        if (deltaX != 0.0f || deltaY != 0.0f) {
2687            nativeOffsetLocation(mNativePtr, deltaX, deltaY);
2688        }
2689    }
2690
2691    /**
2692     * Set this event's location.  Applies {@link #offsetLocation} with a
2693     * delta from the current location to the given new location.
2694     *
2695     * @param x New absolute X location.
2696     * @param y New absolute Y location.
2697     */
2698    public final void setLocation(float x, float y) {
2699        float oldX = getX();
2700        float oldY = getY();
2701        offsetLocation(x - oldX, y - oldY);
2702    }
2703
2704    /**
2705     * Applies a transformation matrix to all of the points in the event.
2706     *
2707     * @param matrix The transformation matrix to apply.
2708     */
2709    public final void transform(Matrix matrix) {
2710        if (matrix == null) {
2711            throw new IllegalArgumentException("matrix must not be null");
2712        }
2713
2714        nativeTransform(mNativePtr, matrix);
2715    }
2716
2717    /**
2718     * Add a new movement to the batch of movements in this event.  The event's
2719     * current location, position and size is updated to the new values.
2720     * The current values in the event are added to a list of historical values.
2721     *
2722     * Only applies to {@link #ACTION_MOVE} or {@link #ACTION_HOVER_MOVE} events.
2723     *
2724     * @param eventTime The time stamp (in ms) for this data.
2725     * @param x The new X position.
2726     * @param y The new Y position.
2727     * @param pressure The new pressure.
2728     * @param size The new size.
2729     * @param metaState Meta key state.
2730     */
2731    public final void addBatch(long eventTime, float x, float y,
2732            float pressure, float size, int metaState) {
2733        synchronized (gSharedTempLock) {
2734            ensureSharedTempPointerCapacity(1);
2735            final PointerCoords[] pc = gSharedTempPointerCoords;
2736            pc[0].clear();
2737            pc[0].x = x;
2738            pc[0].y = y;
2739            pc[0].pressure = pressure;
2740            pc[0].size = size;
2741
2742            nativeAddBatch(mNativePtr, eventTime * NS_PER_MS, pc, metaState);
2743        }
2744    }
2745
2746    /**
2747     * Add a new movement to the batch of movements in this event.  The event's
2748     * current location, position and size is updated to the new values.
2749     * The current values in the event are added to a list of historical values.
2750     *
2751     * Only applies to {@link #ACTION_MOVE} or {@link #ACTION_HOVER_MOVE} events.
2752     *
2753     * @param eventTime The time stamp (in ms) for this data.
2754     * @param pointerCoords The new pointer coordinates.
2755     * @param metaState Meta key state.
2756     */
2757    public final void addBatch(long eventTime, PointerCoords[] pointerCoords, int metaState) {
2758        nativeAddBatch(mNativePtr, eventTime * NS_PER_MS, pointerCoords, metaState);
2759    }
2760
2761    /**
2762     * Adds all of the movement samples of the specified event to this one if
2763     * it is compatible.  To be compatible, the event must have the same device id,
2764     * source, action, flags, pointer count, pointer properties.
2765     *
2766     * Only applies to {@link #ACTION_MOVE} or {@link #ACTION_HOVER_MOVE} events.
2767     *
2768     * @param event The event whose movements samples should be added to this one
2769     * if possible.
2770     * @return True if batching was performed or false if batching was not possible.
2771     * @hide
2772     */
2773    public final boolean addBatch(MotionEvent event) {
2774        final int action = nativeGetAction(mNativePtr);
2775        if (action != ACTION_MOVE && action != ACTION_HOVER_MOVE) {
2776            return false;
2777        }
2778        if (action != nativeGetAction(event.mNativePtr)) {
2779            return false;
2780        }
2781
2782        if (nativeGetDeviceId(mNativePtr) != nativeGetDeviceId(event.mNativePtr)
2783                || nativeGetSource(mNativePtr) != nativeGetSource(event.mNativePtr)
2784                || nativeGetFlags(mNativePtr) != nativeGetFlags(event.mNativePtr)) {
2785            return false;
2786        }
2787
2788        final int pointerCount = nativeGetPointerCount(mNativePtr);
2789        if (pointerCount != nativeGetPointerCount(event.mNativePtr)) {
2790            return false;
2791        }
2792
2793        synchronized (gSharedTempLock) {
2794            ensureSharedTempPointerCapacity(Math.max(pointerCount, 2));
2795            final PointerProperties[] pp = gSharedTempPointerProperties;
2796            final PointerCoords[] pc = gSharedTempPointerCoords;
2797
2798            for (int i = 0; i < pointerCount; i++) {
2799                nativeGetPointerProperties(mNativePtr, i, pp[0]);
2800                nativeGetPointerProperties(event.mNativePtr, i, pp[1]);
2801                if (!pp[0].equals(pp[1])) {
2802                    return false;
2803                }
2804            }
2805
2806            final int metaState = nativeGetMetaState(event.mNativePtr);
2807            final int historySize = nativeGetHistorySize(event.mNativePtr);
2808            for (int h = 0; h <= historySize; h++) {
2809                final int historyPos = (h == historySize ? HISTORY_CURRENT : h);
2810
2811                for (int i = 0; i < pointerCount; i++) {
2812                    nativeGetPointerCoords(event.mNativePtr, i, historyPos, pc[i]);
2813                }
2814
2815                final long eventTimeNanos = nativeGetEventTimeNanos(event.mNativePtr, historyPos);
2816                nativeAddBatch(mNativePtr, eventTimeNanos, pc, metaState);
2817            }
2818        }
2819        return true;
2820    }
2821
2822    /**
2823     * Returns true if all points in the motion event are completely within the specified bounds.
2824     * @hide
2825     */
2826    public final boolean isWithinBoundsNoHistory(float left, float top,
2827            float right, float bottom) {
2828        final int pointerCount = nativeGetPointerCount(mNativePtr);
2829        for (int i = 0; i < pointerCount; i++) {
2830            final float x = nativeGetAxisValue(mNativePtr, AXIS_X, i, HISTORY_CURRENT);
2831            final float y = nativeGetAxisValue(mNativePtr, AXIS_Y, i, HISTORY_CURRENT);
2832            if (x < left || x > right || y < top || y > bottom) {
2833                return false;
2834            }
2835        }
2836        return true;
2837    }
2838
2839    private static final float clamp(float value, float low, float high) {
2840        if (value < low) {
2841            return low;
2842        } else if (value > high) {
2843            return high;
2844        }
2845        return value;
2846    }
2847
2848    /**
2849     * Returns a new motion events whose points have been clamped to the specified bounds.
2850     * @hide
2851     */
2852    public final MotionEvent clampNoHistory(float left, float top, float right, float bottom) {
2853        MotionEvent ev = obtain();
2854        synchronized (gSharedTempLock) {
2855            final int pointerCount = nativeGetPointerCount(mNativePtr);
2856
2857            ensureSharedTempPointerCapacity(pointerCount);
2858            final PointerProperties[] pp = gSharedTempPointerProperties;
2859            final PointerCoords[] pc = gSharedTempPointerCoords;
2860
2861            for (int i = 0; i < pointerCount; i++) {
2862                nativeGetPointerProperties(mNativePtr, i, pp[i]);
2863                nativeGetPointerCoords(mNativePtr, i, HISTORY_CURRENT, pc[i]);
2864                pc[i].x = clamp(pc[i].x, left, right);
2865                pc[i].y = clamp(pc[i].y, top, bottom);
2866            }
2867            ev.mNativePtr = nativeInitialize(ev.mNativePtr,
2868                    nativeGetDeviceId(mNativePtr), nativeGetSource(mNativePtr),
2869                    nativeGetAction(mNativePtr), nativeGetFlags(mNativePtr),
2870                    nativeGetEdgeFlags(mNativePtr), nativeGetMetaState(mNativePtr),
2871                    nativeGetButtonState(mNativePtr),
2872                    nativeGetXOffset(mNativePtr), nativeGetYOffset(mNativePtr),
2873                    nativeGetXPrecision(mNativePtr), nativeGetYPrecision(mNativePtr),
2874                    nativeGetDownTimeNanos(mNativePtr),
2875                    nativeGetEventTimeNanos(mNativePtr, HISTORY_CURRENT),
2876                    pointerCount, pp, pc);
2877            return ev;
2878        }
2879    }
2880
2881    /**
2882     * Gets an integer where each pointer id present in the event is marked as a bit.
2883     * @hide
2884     */
2885    public final int getPointerIdBits() {
2886        int idBits = 0;
2887        final int pointerCount = nativeGetPointerCount(mNativePtr);
2888        for (int i = 0; i < pointerCount; i++) {
2889            idBits |= 1 << nativeGetPointerId(mNativePtr, i);
2890        }
2891        return idBits;
2892    }
2893
2894    /**
2895     * Splits a motion event such that it includes only a subset of pointer ids.
2896     * @hide
2897     */
2898    public final MotionEvent split(int idBits) {
2899        MotionEvent ev = obtain();
2900        synchronized (gSharedTempLock) {
2901            final int oldPointerCount = nativeGetPointerCount(mNativePtr);
2902            ensureSharedTempPointerCapacity(oldPointerCount);
2903            final PointerProperties[] pp = gSharedTempPointerProperties;
2904            final PointerCoords[] pc = gSharedTempPointerCoords;
2905            final int[] map = gSharedTempPointerIndexMap;
2906
2907            final int oldAction = nativeGetAction(mNativePtr);
2908            final int oldActionMasked = oldAction & ACTION_MASK;
2909            final int oldActionPointerIndex = (oldAction & ACTION_POINTER_INDEX_MASK)
2910                    >> ACTION_POINTER_INDEX_SHIFT;
2911            int newActionPointerIndex = -1;
2912            int newPointerCount = 0;
2913            int newIdBits = 0;
2914            for (int i = 0; i < oldPointerCount; i++) {
2915                nativeGetPointerProperties(mNativePtr, i, pp[newPointerCount]);
2916                final int idBit = 1 << pp[newPointerCount].id;
2917                if ((idBit & idBits) != 0) {
2918                    if (i == oldActionPointerIndex) {
2919                        newActionPointerIndex = newPointerCount;
2920                    }
2921                    map[newPointerCount] = i;
2922                    newPointerCount += 1;
2923                    newIdBits |= idBit;
2924                }
2925            }
2926
2927            if (newPointerCount == 0) {
2928                throw new IllegalArgumentException("idBits did not match any ids in the event");
2929            }
2930
2931            final int newAction;
2932            if (oldActionMasked == ACTION_POINTER_DOWN || oldActionMasked == ACTION_POINTER_UP) {
2933                if (newActionPointerIndex < 0) {
2934                    // An unrelated pointer changed.
2935                    newAction = ACTION_MOVE;
2936                } else if (newPointerCount == 1) {
2937                    // The first/last pointer went down/up.
2938                    newAction = oldActionMasked == ACTION_POINTER_DOWN
2939                            ? ACTION_DOWN : ACTION_UP;
2940                } else {
2941                    // A secondary pointer went down/up.
2942                    newAction = oldActionMasked
2943                            | (newActionPointerIndex << ACTION_POINTER_INDEX_SHIFT);
2944                }
2945            } else {
2946                // Simple up/down/cancel/move or other motion action.
2947                newAction = oldAction;
2948            }
2949
2950            final int historySize = nativeGetHistorySize(mNativePtr);
2951            for (int h = 0; h <= historySize; h++) {
2952                final int historyPos = h == historySize ? HISTORY_CURRENT : h;
2953
2954                for (int i = 0; i < newPointerCount; i++) {
2955                    nativeGetPointerCoords(mNativePtr, map[i], historyPos, pc[i]);
2956                }
2957
2958                final long eventTimeNanos = nativeGetEventTimeNanos(mNativePtr, historyPos);
2959                if (h == 0) {
2960                    ev.mNativePtr = nativeInitialize(ev.mNativePtr,
2961                            nativeGetDeviceId(mNativePtr), nativeGetSource(mNativePtr),
2962                            newAction, nativeGetFlags(mNativePtr),
2963                            nativeGetEdgeFlags(mNativePtr), nativeGetMetaState(mNativePtr),
2964                            nativeGetButtonState(mNativePtr),
2965                            nativeGetXOffset(mNativePtr), nativeGetYOffset(mNativePtr),
2966                            nativeGetXPrecision(mNativePtr), nativeGetYPrecision(mNativePtr),
2967                            nativeGetDownTimeNanos(mNativePtr), eventTimeNanos,
2968                            newPointerCount, pp, pc);
2969                } else {
2970                    nativeAddBatch(ev.mNativePtr, eventTimeNanos, pc, 0);
2971                }
2972            }
2973            return ev;
2974        }
2975    }
2976
2977    @Override
2978    public String toString() {
2979        StringBuilder msg = new StringBuilder();
2980        msg.append("MotionEvent { action=").append(actionToString(getAction()));
2981
2982        final int pointerCount = getPointerCount();
2983        for (int i = 0; i < pointerCount; i++) {
2984            msg.append(", id[").append(i).append("]=").append(getPointerId(i));
2985            msg.append(", x[").append(i).append("]=").append(getX(i));
2986            msg.append(", y[").append(i).append("]=").append(getY(i));
2987            msg.append(", toolType[").append(i).append("]=").append(
2988                    toolTypeToString(getToolType(i)));
2989        }
2990
2991        msg.append(", buttonState=").append(MotionEvent.buttonStateToString(getButtonState()));
2992        msg.append(", metaState=").append(KeyEvent.metaStateToString(getMetaState()));
2993        msg.append(", flags=0x").append(Integer.toHexString(getFlags()));
2994        msg.append(", edgeFlags=0x").append(Integer.toHexString(getEdgeFlags()));
2995        msg.append(", pointerCount=").append(pointerCount);
2996        msg.append(", historySize=").append(getHistorySize());
2997        msg.append(", eventTime=").append(getEventTime());
2998        msg.append(", downTime=").append(getDownTime());
2999        msg.append(", deviceId=").append(getDeviceId());
3000        msg.append(", source=0x").append(Integer.toHexString(getSource()));
3001        msg.append(" }");
3002        return msg.toString();
3003    }
3004
3005    /**
3006     * Returns a string that represents the symbolic name of the specified unmasked action
3007     * such as "ACTION_DOWN", "ACTION_POINTER_DOWN(3)" or an equivalent numeric constant
3008     * such as "35" if unknown.
3009     *
3010     * @param action The unmasked action.
3011     * @return The symbolic name of the specified action.
3012     * @see #getAction()
3013     */
3014    public static String actionToString(int action) {
3015        switch (action) {
3016            case ACTION_DOWN:
3017                return "ACTION_DOWN";
3018            case ACTION_UP:
3019                return "ACTION_UP";
3020            case ACTION_CANCEL:
3021                return "ACTION_CANCEL";
3022            case ACTION_OUTSIDE:
3023                return "ACTION_OUTSIDE";
3024            case ACTION_MOVE:
3025                return "ACTION_MOVE";
3026            case ACTION_HOVER_MOVE:
3027                return "ACTION_HOVER_MOVE";
3028            case ACTION_SCROLL:
3029                return "ACTION_SCROLL";
3030            case ACTION_HOVER_ENTER:
3031                return "ACTION_HOVER_ENTER";
3032            case ACTION_HOVER_EXIT:
3033                return "ACTION_HOVER_EXIT";
3034        }
3035        int index = (action & ACTION_POINTER_INDEX_MASK) >> ACTION_POINTER_INDEX_SHIFT;
3036        switch (action & ACTION_MASK) {
3037            case ACTION_POINTER_DOWN:
3038                return "ACTION_POINTER_DOWN(" + index + ")";
3039            case ACTION_POINTER_UP:
3040                return "ACTION_POINTER_UP(" + index + ")";
3041            default:
3042                return Integer.toString(action);
3043        }
3044    }
3045
3046    /**
3047     * Returns a string that represents the symbolic name of the specified axis
3048     * such as "AXIS_X" or an equivalent numeric constant such as "42" if unknown.
3049     *
3050     * @param axis The axis.
3051     * @return The symbolic name of the specified axis.
3052     */
3053    public static String axisToString(int axis) {
3054        String symbolicName = AXIS_SYMBOLIC_NAMES.get(axis);
3055        return symbolicName != null ? symbolicName : Integer.toString(axis);
3056    }
3057
3058    /**
3059     * Gets an axis by its symbolic name such as "AXIS_X" or an
3060     * equivalent numeric constant such as "42".
3061     *
3062     * @param symbolicName The symbolic name of the axis.
3063     * @return The axis or -1 if not found.
3064     * @see KeyEvent#keyCodeToString(int)
3065     */
3066    public static int axisFromString(String symbolicName) {
3067        if (symbolicName == null) {
3068            throw new IllegalArgumentException("symbolicName must not be null");
3069        }
3070
3071        final int count = AXIS_SYMBOLIC_NAMES.size();
3072        for (int i = 0; i < count; i++) {
3073            if (symbolicName.equals(AXIS_SYMBOLIC_NAMES.valueAt(i))) {
3074                return i;
3075            }
3076        }
3077
3078        try {
3079            return Integer.parseInt(symbolicName, 10);
3080        } catch (NumberFormatException ex) {
3081            return -1;
3082        }
3083    }
3084
3085    /**
3086     * Returns a string that represents the symbolic name of the specified combined
3087     * button state flags such as "0", "BUTTON_PRIMARY",
3088     * "BUTTON_PRIMARY|BUTTON_SECONDARY" or an equivalent numeric constant such as "0x10000000"
3089     * if unknown.
3090     *
3091     * @param buttonState The button state.
3092     * @return The symbolic name of the specified combined button state flags.
3093     * @hide
3094     */
3095    public static String buttonStateToString(int buttonState) {
3096        if (buttonState == 0) {
3097            return "0";
3098        }
3099        StringBuilder result = null;
3100        int i = 0;
3101        while (buttonState != 0) {
3102            final boolean isSet = (buttonState & 1) != 0;
3103            buttonState >>>= 1; // unsigned shift!
3104            if (isSet) {
3105                final String name = BUTTON_SYMBOLIC_NAMES[i];
3106                if (result == null) {
3107                    if (buttonState == 0) {
3108                        return name;
3109                    }
3110                    result = new StringBuilder(name);
3111                } else {
3112                    result.append('|');
3113                    result.append(name);
3114                }
3115            }
3116            i += 1;
3117        }
3118        return result.toString();
3119    }
3120
3121    /**
3122     * Returns a string that represents the symbolic name of the specified tool type
3123     * such as "TOOL_TYPE_FINGER" or an equivalent numeric constant such as "42" if unknown.
3124     *
3125     * @param toolType The tool type.
3126     * @return The symbolic name of the specified tool type.
3127     * @hide
3128     */
3129    public static String toolTypeToString(int toolType) {
3130        String symbolicName = TOOL_TYPE_SYMBOLIC_NAMES.get(toolType);
3131        return symbolicName != null ? symbolicName : Integer.toString(toolType);
3132    }
3133
3134    public static final Parcelable.Creator<MotionEvent> CREATOR
3135            = new Parcelable.Creator<MotionEvent>() {
3136        public MotionEvent createFromParcel(Parcel in) {
3137            in.readInt(); // skip token, we already know this is a MotionEvent
3138            return MotionEvent.createFromParcelBody(in);
3139        }
3140
3141        public MotionEvent[] newArray(int size) {
3142            return new MotionEvent[size];
3143        }
3144    };
3145
3146    /** @hide */
3147    public static MotionEvent createFromParcelBody(Parcel in) {
3148        MotionEvent ev = obtain();
3149        ev.mNativePtr = nativeReadFromParcel(ev.mNativePtr, in);
3150        return ev;
3151    }
3152
3153    public void writeToParcel(Parcel out, int flags) {
3154        out.writeInt(PARCEL_TOKEN_MOTION_EVENT);
3155        nativeWriteToParcel(mNativePtr, out);
3156    }
3157
3158    /**
3159     * Transfer object for pointer coordinates.
3160     *
3161     * Objects of this type can be used to specify the pointer coordinates when
3162     * creating new {@link MotionEvent} objects and to query pointer coordinates
3163     * in bulk.
3164     *
3165     * Refer to {@link InputDevice} for information about how different kinds of
3166     * input devices and sources represent pointer coordinates.
3167     */
3168    public static final class PointerCoords {
3169        private static final int INITIAL_PACKED_AXIS_VALUES = 8;
3170        private long mPackedAxisBits;
3171        private float[] mPackedAxisValues;
3172
3173        /**
3174         * Creates a pointer coords object with all axes initialized to zero.
3175         */
3176        public PointerCoords() {
3177        }
3178
3179        /**
3180         * Creates a pointer coords object as a copy of the
3181         * contents of another pointer coords object.
3182         *
3183         * @param other The pointer coords object to copy.
3184         */
3185        public PointerCoords(PointerCoords other) {
3186            copyFrom(other);
3187        }
3188
3189        /** @hide */
3190        public static PointerCoords[] createArray(int size) {
3191            PointerCoords[] array = new PointerCoords[size];
3192            for (int i = 0; i < size; i++) {
3193                array[i] = new PointerCoords();
3194            }
3195            return array;
3196        }
3197
3198        /**
3199         * The X component of the pointer movement.
3200         *
3201         * @see MotionEvent#AXIS_X
3202         */
3203        public float x;
3204
3205        /**
3206         * The Y component of the pointer movement.
3207         *
3208         * @see MotionEvent#AXIS_Y
3209         */
3210        public float y;
3211
3212        /**
3213         * A normalized value that describes the pressure applied to the device
3214         * by a finger or other tool.
3215         * The pressure generally ranges from 0 (no pressure at all) to 1 (normal pressure),
3216         * although values higher than 1 may be generated depending on the calibration of
3217         * the input device.
3218         *
3219         * @see MotionEvent#AXIS_PRESSURE
3220         */
3221        public float pressure;
3222
3223        /**
3224         * A normalized value that describes the approximate size of the pointer touch area
3225         * in relation to the maximum detectable size of the device.
3226         * It represents some approximation of the area of the screen being
3227         * pressed; the actual value in pixels corresponding to the
3228         * touch is normalized with the device specific range of values
3229         * and scaled to a value between 0 and 1. The value of size can be used to
3230         * determine fat touch events.
3231         *
3232         * @see MotionEvent#AXIS_SIZE
3233         */
3234        public float size;
3235
3236        /**
3237         * The length of the major axis of an ellipse that describes the touch area at
3238         * the point of contact.
3239         * If the device is a touch screen, the length is reported in pixels, otherwise it is
3240         * reported in device-specific units.
3241         *
3242         * @see MotionEvent#AXIS_TOUCH_MAJOR
3243         */
3244        public float touchMajor;
3245
3246        /**
3247         * The length of the minor axis of an ellipse that describes the touch area at
3248         * the point of contact.
3249         * If the device is a touch screen, the length is reported in pixels, otherwise it is
3250         * reported in device-specific units.
3251         *
3252         * @see MotionEvent#AXIS_TOUCH_MINOR
3253         */
3254        public float touchMinor;
3255
3256        /**
3257         * The length of the major axis of an ellipse that describes the size of
3258         * the approaching tool.
3259         * The tool area represents the estimated size of the finger or pen that is
3260         * touching the device independent of its actual touch area at the point of contact.
3261         * If the device is a touch screen, the length is reported in pixels, otherwise it is
3262         * reported in device-specific units.
3263         *
3264         * @see MotionEvent#AXIS_TOOL_MAJOR
3265         */
3266        public float toolMajor;
3267
3268        /**
3269         * The length of the minor axis of an ellipse that describes the size of
3270         * the approaching tool.
3271         * The tool area represents the estimated size of the finger or pen that is
3272         * touching the device independent of its actual touch area at the point of contact.
3273         * If the device is a touch screen, the length is reported in pixels, otherwise it is
3274         * reported in device-specific units.
3275         *
3276         * @see MotionEvent#AXIS_TOOL_MINOR
3277         */
3278        public float toolMinor;
3279
3280        /**
3281         * The orientation of the touch area and tool area in radians clockwise from vertical.
3282         * An angle of 0 radians indicates that the major axis of contact is oriented
3283         * upwards, is perfectly circular or is of unknown orientation.  A positive angle
3284         * indicates that the major axis of contact is oriented to the right.  A negative angle
3285         * indicates that the major axis of contact is oriented to the left.
3286         * The full range is from -PI/2 radians (finger pointing fully left) to PI/2 radians
3287         * (finger pointing fully right).
3288         *
3289         * @see MotionEvent#AXIS_ORIENTATION
3290         */
3291        public float orientation;
3292
3293        /**
3294         * Clears the contents of this object.
3295         * Resets all axes to zero.
3296         */
3297        public void clear() {
3298            mPackedAxisBits = 0;
3299
3300            x = 0;
3301            y = 0;
3302            pressure = 0;
3303            size = 0;
3304            touchMajor = 0;
3305            touchMinor = 0;
3306            toolMajor = 0;
3307            toolMinor = 0;
3308            orientation = 0;
3309        }
3310
3311        /**
3312         * Copies the contents of another pointer coords object.
3313         *
3314         * @param other The pointer coords object to copy.
3315         */
3316        public void copyFrom(PointerCoords other) {
3317            final long bits = other.mPackedAxisBits;
3318            mPackedAxisBits = bits;
3319            if (bits != 0) {
3320                final float[] otherValues = other.mPackedAxisValues;
3321                final int count = Long.bitCount(bits);
3322                float[] values = mPackedAxisValues;
3323                if (values == null || count > values.length) {
3324                    values = new float[otherValues.length];
3325                    mPackedAxisValues = values;
3326                }
3327                System.arraycopy(otherValues, 0, values, 0, count);
3328            }
3329
3330            x = other.x;
3331            y = other.y;
3332            pressure = other.pressure;
3333            size = other.size;
3334            touchMajor = other.touchMajor;
3335            touchMinor = other.touchMinor;
3336            toolMajor = other.toolMajor;
3337            toolMinor = other.toolMinor;
3338            orientation = other.orientation;
3339        }
3340
3341        /**
3342         * Gets the value associated with the specified axis.
3343         *
3344         * @param axis The axis identifier for the axis value to retrieve.
3345         * @return The value associated with the axis, or 0 if none.
3346         *
3347         * @see MotionEvent#AXIS_X
3348         * @see MotionEvent#AXIS_Y
3349         */
3350        public float getAxisValue(int axis) {
3351            switch (axis) {
3352                case AXIS_X:
3353                    return x;
3354                case AXIS_Y:
3355                    return y;
3356                case AXIS_PRESSURE:
3357                    return pressure;
3358                case AXIS_SIZE:
3359                    return size;
3360                case AXIS_TOUCH_MAJOR:
3361                    return touchMajor;
3362                case AXIS_TOUCH_MINOR:
3363                    return touchMinor;
3364                case AXIS_TOOL_MAJOR:
3365                    return toolMajor;
3366                case AXIS_TOOL_MINOR:
3367                    return toolMinor;
3368                case AXIS_ORIENTATION:
3369                    return orientation;
3370                default: {
3371                    if (axis < 0 || axis > 63) {
3372                        throw new IllegalArgumentException("Axis out of range.");
3373                    }
3374                    final long bits = mPackedAxisBits;
3375                    final long axisBit = 1L << axis;
3376                    if ((bits & axisBit) == 0) {
3377                        return 0;
3378                    }
3379                    final int index = Long.bitCount(bits & (axisBit - 1L));
3380                    return mPackedAxisValues[index];
3381                }
3382            }
3383        }
3384
3385        /**
3386         * Sets the value associated with the specified axis.
3387         *
3388         * @param axis The axis identifier for the axis value to assign.
3389         * @param value The value to set.
3390         *
3391         * @see MotionEvent#AXIS_X
3392         * @see MotionEvent#AXIS_Y
3393         */
3394        public void setAxisValue(int axis, float value) {
3395            switch (axis) {
3396                case AXIS_X:
3397                    x = value;
3398                    break;
3399                case AXIS_Y:
3400                    y = value;
3401                    break;
3402                case AXIS_PRESSURE:
3403                    pressure = value;
3404                    break;
3405                case AXIS_SIZE:
3406                    size = value;
3407                    break;
3408                case AXIS_TOUCH_MAJOR:
3409                    touchMajor = value;
3410                    break;
3411                case AXIS_TOUCH_MINOR:
3412                    touchMinor = value;
3413                    break;
3414                case AXIS_TOOL_MAJOR:
3415                    toolMajor = value;
3416                    break;
3417                case AXIS_TOOL_MINOR:
3418                    toolMinor = value;
3419                    break;
3420                case AXIS_ORIENTATION:
3421                    orientation = value;
3422                    break;
3423                default: {
3424                    if (axis < 0 || axis > 63) {
3425                        throw new IllegalArgumentException("Axis out of range.");
3426                    }
3427                    final long bits = mPackedAxisBits;
3428                    final long axisBit = 1L << axis;
3429                    final int index = Long.bitCount(bits & (axisBit - 1L));
3430                    float[] values = mPackedAxisValues;
3431                    if ((bits & axisBit) == 0) {
3432                        if (values == null) {
3433                            values = new float[INITIAL_PACKED_AXIS_VALUES];
3434                            mPackedAxisValues = values;
3435                        } else {
3436                            final int count = Long.bitCount(bits);
3437                            if (count < values.length) {
3438                                if (index != count) {
3439                                    System.arraycopy(values, index, values, index + 1,
3440                                            count - index);
3441                                }
3442                            } else {
3443                                float[] newValues = new float[count * 2];
3444                                System.arraycopy(values, 0, newValues, 0, index);
3445                                System.arraycopy(values, index, newValues, index + 1,
3446                                        count - index);
3447                                values = newValues;
3448                                mPackedAxisValues = values;
3449                            }
3450                        }
3451                        mPackedAxisBits = bits | axisBit;
3452                    }
3453                    values[index] = value;
3454                }
3455            }
3456        }
3457    }
3458
3459    /**
3460     * Transfer object for pointer properties.
3461     *
3462     * Objects of this type can be used to specify the pointer id and tool type
3463     * when creating new {@link MotionEvent} objects and to query pointer properties in bulk.
3464     */
3465    public static final class PointerProperties {
3466        /**
3467         * Creates a pointer properties object with an invalid pointer id.
3468         */
3469        public PointerProperties() {
3470            clear();
3471        }
3472
3473        /**
3474         * Creates a pointer properties object as a copy of the contents of
3475         * another pointer properties object.
3476         * @param other
3477         */
3478        public PointerProperties(PointerProperties other) {
3479            copyFrom(other);
3480        }
3481
3482        /** @hide */
3483        public static PointerProperties[] createArray(int size) {
3484            PointerProperties[] array = new PointerProperties[size];
3485            for (int i = 0; i < size; i++) {
3486                array[i] = new PointerProperties();
3487            }
3488            return array;
3489        }
3490
3491        /**
3492         * The pointer id.
3493         * Initially set to {@link #INVALID_POINTER_ID} (-1).
3494         *
3495         * @see MotionEvent#getPointerId(int)
3496         */
3497        public int id;
3498
3499        /**
3500         * The pointer tool type.
3501         * Initially set to 0.
3502         *
3503         * @see MotionEvent#getToolType(int)
3504         */
3505        public int toolType;
3506
3507        /**
3508         * Resets the pointer properties to their initial values.
3509         */
3510        public void clear() {
3511            id = INVALID_POINTER_ID;
3512            toolType = TOOL_TYPE_UNKNOWN;
3513        }
3514
3515        /**
3516         * Copies the contents of another pointer properties object.
3517         *
3518         * @param other The pointer properties object to copy.
3519         */
3520        public void copyFrom(PointerProperties other) {
3521            id = other.id;
3522            toolType = other.toolType;
3523        }
3524
3525        @Override
3526        public boolean equals(Object other) {
3527            if (other instanceof PointerProperties) {
3528                return equals((PointerProperties)other);
3529            }
3530            return false;
3531        }
3532
3533        private boolean equals(PointerProperties other) {
3534            return other != null && id == other.id && toolType == other.toolType;
3535        }
3536
3537        @Override
3538        public int hashCode() {
3539            return id | (toolType << 8);
3540        }
3541    }
3542}
3543