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