MotionEvent.java revision 5c225b1680e696ae8bbf505a1997d6f720672f74
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.view;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock;
220dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackbornimport android.util.Log;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Object used to report movement (mouse, pen, finger, trackball) events.  This
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * class may hold either absolute or relative movements, depending on what
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it is being used for.
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class MotionEvent implements Parcelable {
305c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    private static final long MS_PER_NS = 1000000;
310dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    static final boolean DEBUG_POINTERS = false;
320dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
349822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Bit mask of the parts of the action code that are the action itself.
359822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
369822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public static final int ACTION_MASK             = 0xff;
379822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
389822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Constant for {@link #getAction}: A pressed gesture has started, the
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * motion contains the initial starting location.
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ACTION_DOWN             = 0;
439822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Constant for {@link #getAction}: A pressed gesture has finished, the
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * motion contains the final release location as well as any intermediate
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * points since the last down or move event.
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ACTION_UP               = 1;
509822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Constant for {@link #getAction}: A change has happened during a
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * press gesture (between {@link #ACTION_DOWN} and {@link #ACTION_UP}).
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The motion contains the most recent point, as well as any intermediate
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * points since the last down or move event.
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ACTION_MOVE             = 2;
589822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Constant for {@link #getAction}: The current gesture has been aborted.
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * You will not receive any more points in it.  You should treat this as
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * an up event, but not perform any action that you normally would.
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ACTION_CANCEL           = 3;
659822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Constant for {@link #getAction}: A movement has happened outside of the
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * normal bounds of the UI element.  This does not provide a full gesture,
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * but only the initial location of the movement/touch.
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ACTION_OUTSIDE          = 4;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
749822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * A non-primary pointer has gone down.  The bits in
750dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #ACTION_POINTER_ID_MASK} indicate which pointer changed.
769822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
779822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public static final int ACTION_POINTER_DOWN     = 5;
789822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
799822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
80b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * A non-primary pointer has gone up.  The bits in
81b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * {@link #ACTION_POINTER_ID_MASK} indicate which pointer changed.
829822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
83b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    public static final int ACTION_POINTER_UP       = 6;
849822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
859822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
86b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * Bits in the action code that represent a pointer index, used with
87b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * {@link #ACTION_POINTER_DOWN} and {@link #ACTION_POINTER_UP}.  Shifting
88b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * down by {@link #ACTION_POINTER_INDEX_SHIFT} provides the actual pointer
89b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * index where the data for the pointer going up or down can be found; you can
90b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * get its identifier with {@link #getPointerId(int)} and the actual
91b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * data with {@link #getX(int)} etc.
929822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
93b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    public static final int ACTION_POINTER_INDEX_MASK  = 0xff00;
949822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
959822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
96b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * Bit shift for the action bits holding the pointer index as
97b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * defined by {@link #ACTION_POINTER_INDEX_MASK}.
989822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
99b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    public static final int ACTION_POINTER_INDEX_SHIFT = 8;
1009822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1019822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
102b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * @deprecated Use {@link #ACTION_POINTER_INDEX_MASK} to retrieve the
103b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * data index associated with {@link #ACTION_POINTER_DOWN}.
1049822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
105b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    @Deprecated
106b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    public static final int ACTION_POINTER_1_DOWN   = ACTION_POINTER_DOWN | 0x0000;
107b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn
108b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    /**
109b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * @deprecated Use {@link #ACTION_POINTER_INDEX_MASK} to retrieve the
110b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * data index associated with {@link #ACTION_POINTER_DOWN}.
111b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     */
112b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    @Deprecated
113b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    public static final int ACTION_POINTER_2_DOWN   = ACTION_POINTER_DOWN | 0x0100;
1149822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1159822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
116b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * @deprecated Use {@link #ACTION_POINTER_INDEX_MASK} to retrieve the
117b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * data index associated with {@link #ACTION_POINTER_DOWN}.
1189822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
119b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    @Deprecated
120b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    public static final int ACTION_POINTER_3_DOWN   = ACTION_POINTER_DOWN | 0x0200;
121b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn
122b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    /**
123b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * @deprecated Use {@link #ACTION_POINTER_INDEX_MASK} to retrieve the
124b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * data index associated with {@link #ACTION_POINTER_UP}.
125b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     */
126b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    @Deprecated
1279822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public static final int ACTION_POINTER_1_UP     = ACTION_POINTER_UP | 0x0000;
1289822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1299822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
130b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * @deprecated Use {@link #ACTION_POINTER_INDEX_MASK} to retrieve the
131b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * data index associated with {@link #ACTION_POINTER_UP}.
1329822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
133b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    @Deprecated
1349822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public static final int ACTION_POINTER_2_UP     = ACTION_POINTER_UP | 0x0100;
1359822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1369822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
137b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * @deprecated Use {@link #ACTION_POINTER_INDEX_MASK} to retrieve the
138b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * data index associated with {@link #ACTION_POINTER_UP}.
1399822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
140b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    @Deprecated
1419822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public static final int ACTION_POINTER_3_UP     = ACTION_POINTER_UP | 0x0200;
1429822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1439822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
144b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * @deprecated Renamed to {@link #ACTION_POINTER_INDEX_MASK} to match
145b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * the actual data contained in these bits.
1469822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
147b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    @Deprecated
1480dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public static final int ACTION_POINTER_ID_MASK  = 0xff00;
1499822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1509822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
151b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * @deprecated Renamed to {@link #ACTION_POINTER_INDEX_SHIFT} to match
152b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * the actual data contained in these bits.
1539822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
154b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    @Deprecated
1550dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public static final int ACTION_POINTER_ID_SHIFT = 8;
1569822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean TRACK_RECYCLED_LOCATION = false;
158cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Flag indicating the motion event intersected the top edge of the screen.
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int EDGE_TOP = 0x00000001;
163cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Flag indicating the motion event intersected the bottom edge of the screen.
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int EDGE_BOTTOM = 0x00000002;
168cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Flag indicating the motion event intersected the left edge of the screen.
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int EDGE_LEFT = 0x00000004;
173cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Flag indicating the motion event intersected the right edge of the screen.
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int EDGE_RIGHT = 0x00000008;
178cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
1799822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
1809822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Offset for the sample's X coordinate.
1819822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @hide
1829822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
1839822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    static public final int SAMPLE_X = 0;
1849822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1859822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
1869822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Offset for the sample's Y coordinate.
1879822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @hide
1889822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
1899822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    static public final int SAMPLE_Y = 1;
1909822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1919822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
1929822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Offset for the sample's X coordinate.
1939822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @hide
1949822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
1959822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    static public final int SAMPLE_PRESSURE = 2;
1969822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1979822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
1989822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Offset for the sample's X coordinate.
1999822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @hide
2009822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
2019822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    static public final int SAMPLE_SIZE = 3;
2029822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
2039822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
2049822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Number of data items for each sample.
2059822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @hide
2069822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
2079822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    static public final int NUM_SAMPLE_DATA = 4;
2089822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
2091e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn    /**
2101e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn     * Number of possible pointers.
2111e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn     * @hide
2121e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn     */
2131e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn    static public final int BASE_AVAIL_POINTERS = 5;
2141e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn
2159822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    static private final int BASE_AVAIL_SAMPLES = 8;
2169822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static private final int MAX_RECYCLED = 10;
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static private Object gRecyclerLock = new Object();
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static private int gRecyclerUsed = 0;
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static private MotionEvent gRecyclerTop = null;
221cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
2225c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    private long mDownTimeNano;
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mAction;
2245c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    private float mXOffset;
2255c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    private float mYOffset;
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float mXPrecision;
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float mYPrecision;
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mDeviceId;
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mEdgeFlags;
2309822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    private int mMetaState;
2319822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
2329822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    private int mNumPointers;
2339822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    private int mNumSamples;
2345c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
2355c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    private int mLastDataSampleIndex;
2365c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    private int mLastEventTimeNanoSampleIndex;
2375c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
2380dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    // Array of mNumPointers size of identifiers for each pointer of data.
2390dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    private int[] mPointerIdentifiers;
2405c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
2419822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    // Array of (mNumSamples * mNumPointers * NUM_SAMPLE_DATA) size of event data.
2425c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    // Samples are ordered from oldest to newest.
2439822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    private float[] mDataSamples;
2445c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
2455c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    // Array of mNumSamples size of event time stamps in nanoseconds.
2465c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    // Samples are ordered from oldest to newest.
2475c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    private long[] mEventTimeNanoSamples;
2488169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private MotionEvent mNext;
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private RuntimeException mRecycledLocation;
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mRecycled;
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    private MotionEvent(int pointerCount, int sampleCount) {
25446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        mPointerIdentifiers = new int[pointerCount];
25546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        mDataSamples = new float[pointerCount * sampleCount * NUM_SAMPLE_DATA];
2565c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        mEventTimeNanoSamples = new long[sampleCount];
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
258cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
25946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    static private MotionEvent obtain(int pointerCount, int sampleCount) {
26046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        final MotionEvent ev;
26146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        synchronized (gRecyclerLock) {
26246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            if (gRecyclerTop == null) {
26346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                if (pointerCount < BASE_AVAIL_POINTERS) {
26446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                    pointerCount = BASE_AVAIL_POINTERS;
26546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                }
26646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                if (sampleCount < BASE_AVAIL_SAMPLES) {
26746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                    sampleCount = BASE_AVAIL_SAMPLES;
26846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                }
26946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                return new MotionEvent(pointerCount, sampleCount);
27046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            }
27146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            ev = gRecyclerTop;
27246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            gRecyclerTop = ev.mNext;
2735c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            gRecyclerUsed -= 1;
27446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
27546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        ev.mRecycledLocation = null;
27646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        ev.mRecycled = false;
27746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        ev.mNext = null;
27846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
27946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        if (ev.mPointerIdentifiers.length < pointerCount) {
28046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            ev.mPointerIdentifiers = new int[pointerCount];
28146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
28246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2835c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        if (ev.mEventTimeNanoSamples.length < sampleCount) {
2845c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            ev.mEventTimeNanoSamples = new long[sampleCount];
28546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
28646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
28746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        final int neededDataSamplesLength = pointerCount * sampleCount * NUM_SAMPLE_DATA;
2885c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        if (ev.mDataSamples.length < neededDataSamplesLength) {
28946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            ev.mDataSamples = new float[neededDataSamplesLength];
29046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
29146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
29246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        return ev;
29346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
2945c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
29553071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    /**
29653071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * Create a new MotionEvent, filling in all of the basic values that
29753071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * define the motion.
29853071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     *
29953071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param downTime The time (in ms) when the user originally pressed down to start
30053071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * a stream of position events.  This must be obtained from {@link SystemClock#uptimeMillis()}.
30153071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param eventTime  The the time (in ms) when this specific event was generated.  This
30253071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * must be obtained from {@link SystemClock#uptimeMillis()}.
30353071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param eventTimeNano  The the time (in ns) when this specific event was generated.  This
30453071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * must be obtained from {@link System#nanoTime()}.
30553071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param action The kind of action being performed -- one of either
30653071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or
30753071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * {@link #ACTION_CANCEL}.
3080dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointers The number of points that will be in this event.
3090dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param inPointerIds An array of <em>pointers</em> values providing
3100dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * an identifier for each pointer.
3110dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param inData An array of <em>pointers*NUM_SAMPLE_DATA</em> of initial
3120dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * data samples for the event.
31353071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param metaState The state of any meta / modifier keys that were in effect when
31453071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * the event was generated.
31553071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param xPrecision The precision of the X coordinate being reported.
31653071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param yPrecision The precision of the Y coordinate being reported.
31753071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param deviceId The id for the device that this event came from.  An id of
31853071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * zero indicates that the event didn't come from a physical device; other
31953071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * numbers are arbitrary and you shouldn't depend on the values.
32053071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param edgeFlags A bitfield indicating which edges, if any, where touched by this
32153071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * MotionEvent.
32253071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     *
32353071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @hide
32453071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     */
32553071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    static public MotionEvent obtainNano(long downTime, long eventTime, long eventTimeNano,
3260dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            int action, int pointers, int[] inPointerIds, float[] inData, int metaState,
32753071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan            float xPrecision, float yPrecision, int deviceId, int edgeFlags) {
3285c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        MotionEvent ev = obtain(pointers, 1);
32953071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mDeviceId = deviceId;
33053071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mEdgeFlags = edgeFlags;
3315c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mDownTimeNano = downTime * MS_PER_NS;
33253071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mAction = action;
33353071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mMetaState = metaState;
3345c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mXOffset = 0;
3355c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mYOffset = 0;
33653071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mXPrecision = xPrecision;
33753071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mYPrecision = yPrecision;
3385c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
3399822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mNumPointers = pointers;
3409822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mNumSamples = 1;
3419822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
3425c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mLastDataSampleIndex = 0;
3435c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mLastEventTimeNanoSampleIndex = 0;
3441e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn
3455c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        System.arraycopy(inPointerIds, 0, ev.mPointerIdentifiers, 0, pointers);
3461e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn
3475c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mEventTimeNanoSamples[0] = eventTimeNano;
3485c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
3495c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        System.arraycopy(inData, 0, ev.mDataSamples, 0, pointers * NUM_SAMPLE_DATA);
35053071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan
3510dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        if (DEBUG_POINTERS) {
3520dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            StringBuilder sb = new StringBuilder(128);
3530dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            sb.append("New:");
3545c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            for (int i = 0; i < pointers; i++) {
3550dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append(" #");
3565c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                sb.append(ev.getPointerId(i));
3570dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append("(");
3585c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                sb.append(ev.getX(i));
3590dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append(",");
3605c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                sb.append(ev.getY(i));
3610dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append(")");
3620dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            }
3630dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            Log.v("MotionEvent", sb.toString());
3640dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        }
3650dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn
36653071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        return ev;
36753071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    }
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new MotionEvent, filling in all of the basic values that
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * define the motion.
372cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
373cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * @param downTime The time (in ms) when the user originally pressed down to start
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a stream of position events.  This must be obtained from {@link SystemClock#uptimeMillis()}.
375cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * @param eventTime  The the time (in ms) when this specific event was generated.  This
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * must be obtained from {@link SystemClock#uptimeMillis()}.
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action The kind of action being performed -- one of either
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_CANCEL}.
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x The X coordinate of this event.
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y The Y coordinate of this event.
382cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * @param pressure The current pressure of this event.  The pressure generally
383cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * ranges from 0 (no pressure at all) to 1 (normal pressure), however
384cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * values higher than 1 may be generated depending on the calibration of
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the input device.
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param size A scaled value of the approximate size of the area being pressed when
387cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * touched with the finger. The actual value in pixels corresponding to the finger
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * touch is normalized with a device specific range of values
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and scaled to a value between 0 and 1.
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param metaState The state of any meta / modifier keys that were in effect when
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the event was generated.
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param xPrecision The precision of the X coordinate being reported.
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param yPrecision The precision of the Y coordinate being reported.
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param deviceId The id for the device that this event came from.  An id of
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * zero indicates that the event didn't come from a physical device; other
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * numbers are arbitrary and you shouldn't depend on the values.
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param edgeFlags A bitfield indicating which edges, if any, where touched by this
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * MotionEvent.
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public MotionEvent obtain(long downTime, long eventTime, int action,
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float x, float y, float pressure, float size, int metaState,
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float xPrecision, float yPrecision, int deviceId, int edgeFlags) {
4035c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        MotionEvent ev = obtain(1, 1);
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mDeviceId = deviceId;
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mEdgeFlags = edgeFlags;
4065c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mDownTimeNano = downTime * MS_PER_NS;
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mAction = action;
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mMetaState = metaState;
4095c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mXOffset = 0;
4105c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mYOffset = 0;
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mXPrecision = xPrecision;
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mYPrecision = yPrecision;
4135c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
4149822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mNumPointers = 1;
4159822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mNumSamples = 1;
4165c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
4175c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mLastDataSampleIndex = 0;
4185c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mLastEventTimeNanoSampleIndex = 0;
4195c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
4205c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mPointerIdentifiers[0] = 0;
4215c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
4225c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mEventTimeNanoSamples[0] = eventTime * MS_PER_NS;
4235c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
4245c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        float[] dataSamples = ev.mDataSamples;
4255c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        dataSamples[SAMPLE_X] = x;
4265c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        dataSamples[SAMPLE_Y] = y;
4275c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        dataSamples[SAMPLE_PRESSURE] = pressure;
4285c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        dataSamples[SAMPLE_SIZE] = size;
4299822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return ev;
4309822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
4319822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
4329822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
4339822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Create a new MotionEvent, filling in all of the basic values that
4349822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * define the motion.
4359822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     *
4369822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param downTime The time (in ms) when the user originally pressed down to start
4379822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * a stream of position events.  This must be obtained from {@link SystemClock#uptimeMillis()}.
4389822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param eventTime  The the time (in ms) when this specific event was generated.  This
4399822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * must be obtained from {@link SystemClock#uptimeMillis()}.
4409822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param action The kind of action being performed -- one of either
4419822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or
4429822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * {@link #ACTION_CANCEL}.
4439822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param pointers The number of pointers that are active in this event.
4449822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param x The X coordinate of this event.
4459822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param y The Y coordinate of this event.
4469822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param pressure The current pressure of this event.  The pressure generally
4479822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * ranges from 0 (no pressure at all) to 1 (normal pressure), however
4489822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * values higher than 1 may be generated depending on the calibration of
4499822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * the input device.
4509822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param size A scaled value of the approximate size of the area being pressed when
4519822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * touched with the finger. The actual value in pixels corresponding to the finger
4529822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * touch is normalized with a device specific range of values
4539822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * and scaled to a value between 0 and 1.
4549822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param metaState The state of any meta / modifier keys that were in effect when
4559822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * the event was generated.
4569822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param xPrecision The precision of the X coordinate being reported.
4579822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param yPrecision The precision of the Y coordinate being reported.
4589822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param deviceId The id for the device that this event came from.  An id of
4599822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * zero indicates that the event didn't come from a physical device; other
4609822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * numbers are arbitrary and you shouldn't depend on the values.
4619822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param edgeFlags A bitfield indicating which edges, if any, where touched by this
4629822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * MotionEvent.
4635c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown     *
4645c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown     * @deprecated Use {@link #obtain(long, long, int, float, float, float, float, int, float, float, int, int)}
4655c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown     * instead.
4669822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
4675c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    @Deprecated
4689822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    static public MotionEvent obtain(long downTime, long eventTime, int action,
4699822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            int pointers, float x, float y, float pressure, float size, int metaState,
4709822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            float xPrecision, float yPrecision, int deviceId, int edgeFlags) {
4715c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return obtain(downTime, eventTime, action, x, y, pressure, size,
4725c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                metaState, xPrecision, yPrecision, deviceId, edgeFlags);
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
474cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new MotionEvent, filling in a subset of the basic motion
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * values.  Those not specified here are: device id (always 0), pressure
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and size (always 1), x and y precision (always 1), and edgeFlags (always 0).
479cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
480cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * @param downTime The time (in ms) when the user originally pressed down to start
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a stream of position events.  This must be obtained from {@link SystemClock#uptimeMillis()}.
482cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * @param eventTime  The the time (in ms) when this specific event was generated.  This
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * must be obtained from {@link SystemClock#uptimeMillis()}.
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action The kind of action being performed -- one of either
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_CANCEL}.
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x The X coordinate of this event.
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y The Y coordinate of this event.
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param metaState The state of any meta / modifier keys that were in effect when
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the event was generated.
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public MotionEvent obtain(long downTime, long eventTime, int action,
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float x, float y, int metaState) {
4945c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return obtain(downTime, eventTime, action, x, y, 1.0f, 1.0f,
4955c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                metaState, 1.0f, 1.0f, 0, 0);
4968169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima    }
4978169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new MotionEvent, copying from an existing one.
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public MotionEvent obtain(MotionEvent o) {
5025c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        MotionEvent ev = obtain(o.mNumPointers, o.mNumSamples);
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mDeviceId = o.mDeviceId;
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mEdgeFlags = o.mEdgeFlags;
5055c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mDownTimeNano = o.mDownTimeNano;
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mAction = o.mAction;
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mMetaState = o.mMetaState;
5085c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mXOffset = o.mXOffset;
5095c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mYOffset = o.mYOffset;
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mXPrecision = o.mXPrecision;
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mYPrecision = o.mYPrecision;
5125c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        int numPointers = ev.mNumPointers = o.mNumPointers;
5135c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        int numSamples = ev.mNumSamples = o.mNumSamples;
5149822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
5155c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mLastDataSampleIndex = o.mLastDataSampleIndex;
5165c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mLastEventTimeNanoSampleIndex = o.mLastEventTimeNanoSampleIndex;
5179822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
5185c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        System.arraycopy(o.mPointerIdentifiers, 0, ev.mPointerIdentifiers, 0, numPointers);
5199822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
5205c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        System.arraycopy(o.mEventTimeNanoSamples, 0, ev.mEventTimeNanoSamples, 0, numSamples);
5219822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
5225c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        System.arraycopy(o.mDataSamples, 0, ev.mDataSamples, 0,
5235c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                numPointers * numSamples * NUM_SAMPLE_DATA);
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ev;
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
526cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5288df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn     * Create a new MotionEvent, copying from an existing one, but not including
5298df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn     * any historical point information.
5308df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn     */
5318df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn    static public MotionEvent obtainNoHistory(MotionEvent o) {
5325c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        MotionEvent ev = obtain(o.mNumPointers, 1);
5338df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        ev.mDeviceId = o.mDeviceId;
5348df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        ev.mEdgeFlags = o.mEdgeFlags;
5355c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mDownTimeNano = o.mDownTimeNano;
5368df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        ev.mAction = o.mAction;
5378df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        ev.mMetaState = o.mMetaState;
5385c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mXOffset = o.mXOffset;
5395c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mYOffset = o.mYOffset;
5408df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        ev.mXPrecision = o.mXPrecision;
5418df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        ev.mYPrecision = o.mYPrecision;
5428df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn
5435c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        int numPointers = ev.mNumPointers = o.mNumPointers;
5448df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        ev.mNumSamples = 1;
5458df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn
5465c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mLastDataSampleIndex = 0;
5475c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mLastEventTimeNanoSampleIndex = 0;
5488df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn
5495c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        System.arraycopy(o.mPointerIdentifiers, 0, ev.mPointerIdentifiers, 0, numPointers);
5508df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn
5515c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mEventTimeNanoSamples[0] = o.mEventTimeNanoSamples[o.mLastEventTimeNanoSampleIndex];
5525c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
5535c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        System.arraycopy(o.mDataSamples, o.mLastDataSampleIndex, ev.mDataSamples, 0,
5545c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                numPointers * NUM_SAMPLE_DATA);
5558df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        return ev;
5568df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn    }
5578df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn
5588df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn    /**
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Recycle the MotionEvent, to be re-used by a later caller.  After calling
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this function you must not ever touch the event again.
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5625c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    public final void recycle() {
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Ensure recycle is only called once!
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (TRACK_RECYCLED_LOCATION) {
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mRecycledLocation != null) {
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException(toString() + " recycled twice!", mRecycledLocation);
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecycledLocation = new RuntimeException("Last recycled here");
569d28f4be870ea8850a2d4a2fe51333643f16b9ab1Jeff Brown            //Log.w("MotionEvent", "Recycling event " + this, mRecycledLocation);
570d28f4be870ea8850a2d4a2fe51333643f16b9ab1Jeff Brown        } else {
571d28f4be870ea8850a2d4a2fe51333643f16b9ab1Jeff Brown            if (mRecycled) {
572d28f4be870ea8850a2d4a2fe51333643f16b9ab1Jeff Brown                throw new RuntimeException(toString() + " recycled twice!");
573d28f4be870ea8850a2d4a2fe51333643f16b9ab1Jeff Brown            }
574d28f4be870ea8850a2d4a2fe51333643f16b9ab1Jeff Brown            mRecycled = true;
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (gRecyclerLock) {
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (gRecyclerUsed < MAX_RECYCLED) {
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                gRecyclerUsed++;
5809822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn                mNumSamples = 0;
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mNext = gRecyclerTop;
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                gRecyclerTop = this;
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5865c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
5875c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    /**
5885c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown     * Scales down the coordination of this event by the given scale.
5895c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown     *
5905c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown     * @hide
5915c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown     */
5925c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    public final void scale(float scale) {
5935c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        mXOffset *= scale;
5945c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        mYOffset *= scale;
5955c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        mXPrecision *= scale;
5965c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        mYPrecision *= scale;
5975c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
5985c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        float[] history = mDataSamples;
5995c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        final int length = mNumPointers * mNumSamples * NUM_SAMPLE_DATA;
6005c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        for (int i = 0; i < length; i += NUM_SAMPLE_DATA) {
6015c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            history[i + SAMPLE_X] *= scale;
6025c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            history[i + SAMPLE_Y] *= scale;
6035c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            // no need to scale pressure
6045c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            history[i + SAMPLE_SIZE] *= scale;    // TODO: square this?
6055c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        }
6065c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    }
607cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the kind of action being performed -- one of either
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or
611b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * {@link #ACTION_CANCEL}.  Consider using {@link #getActionMasked}
612b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * and {@link #getActionIndex} to retrieve the separate masked action
613b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * and pointer index.
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getAction() {
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAction;
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
620b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * Return the masked action being performed, without pointer index
621b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * information.  May be any of the actions: {@link #ACTION_DOWN},
622b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * {@link #ACTION_MOVE}, {@link #ACTION_UP}, {@link #ACTION_CANCEL},
623b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * {@link #ACTION_POINTER_DOWN}, or {@link #ACTION_POINTER_UP}.
624b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * Use {@link #getActionIndex} to return the index associated with
625b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * pointer actions.
626b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     */
627b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    public final int getActionMasked() {
628b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn        return mAction & ACTION_MASK;
629b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    }
630b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn
631b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    /**
632b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * For {@link #ACTION_POINTER_DOWN} or {@link #ACTION_POINTER_UP}
633b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * as returned by {@link #getActionMasked}, this returns the associated
634b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * pointer index.  The index may be used with {@link #getPointerId(int)},
635b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * {@link #getX(int)}, {@link #getY(int)}, {@link #getPressure(int)},
636b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * and {@link #getSize(int)} to get information about the pointer that has
637b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * gone down or up.
638b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     */
639b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    public final int getActionIndex() {
640b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn        return (mAction & ACTION_POINTER_INDEX_MASK) >> ACTION_POINTER_INDEX_SHIFT;
641b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    }
642b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn
643b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    /**
644cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * Returns the time (in ms) when the user originally pressed down to start
645cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * a stream of position events.
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final long getDownTime() {
6485c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDownTimeNano / MS_PER_NS;
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the time (in ms) when this specific event was generated.
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final long getEventTime() {
6555c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mEventTimeNanoSamples[mLastEventTimeNanoSampleIndex] / MS_PER_NS;
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
65953071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * Returns the time (in ns) when this specific event was generated.
66053071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * The value is in nanosecond precision but it may not have nanosecond accuracy.
66153071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     *
66253071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @hide
66353071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     */
66453071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    public final long getEventTimeNano() {
6655c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mEventTimeNanoSamples[mLastEventTimeNanoSampleIndex];
66653071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    }
66753071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan
66853071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    /**
6690dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getX(int)} for the first pointer index (may be an
6700dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final float getX() {
6735c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[mLastDataSampleIndex + SAMPLE_X] + mXOffset;
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6770dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getY(int)} for the first pointer index (may be an
6780dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final float getY() {
6815c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[mLastDataSampleIndex + SAMPLE_Y] + mYOffset;
6829822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
6839822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
6849822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
6850dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getPressure(int)} for the first pointer index (may be an
6860dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
6879822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
6889822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public final float getPressure() {
6895c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[mLastDataSampleIndex + SAMPLE_PRESSURE];
6909822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
6919822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
6929822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
6930dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getSize(int)} for the first pointer index (may be an
6940dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
6959822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
6969822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public final float getSize() {
6975c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[mLastDataSampleIndex + SAMPLE_SIZE];
6989822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
6999822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
7009822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
7010dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * The number of pointers of data contained in this event.  Always
7020dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * >= 1.
7030dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     */
7040dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final int getPointerCount() {
7050dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        return mNumPointers;
7060dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    }
7070dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn
7080dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    /**
7090dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Return the pointer identifier associated with a particular pointer
7100dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * data index is this event.  The identifier tells you the actual pointer
7110dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * number associated with the data, accounting for individual pointers
7120dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * going up and down since the start of the current gesture.
7130dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
7140dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
7150dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     */
716d41ba666d12a24ee4624ea9a009151e6165e3775Dianne Hackborn    public final int getPointerId(int pointerIndex) {
717d41ba666d12a24ee4624ea9a009151e6165e3775Dianne Hackborn        return mPointerIdentifiers[pointerIndex];
7180dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    }
7190dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn
7200dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    /**
7210dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Given a pointer identifier, find the index of its data in the event.
7220dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     *
7230dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerId The identifier of the pointer to be found.
7240dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @return Returns either the index of the pointer (for use with
7250dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getX(int) et al.), or -1 if there is no data available for
7260dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * that pointer identifier.
7270dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     */
7280dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final int findPointerIndex(int pointerId) {
7290dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        int i = mNumPointers;
7300dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        while (i > 0) {
7310dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            i--;
7320dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            if (mPointerIdentifiers[i] == pointerId) {
7330dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                return i;
7340dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            }
7350dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        }
7360dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        return -1;
7370dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    }
7380dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn
7390dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    /**
7400dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns the X coordinate of this event for the given pointer
7410dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * <em>index</em> (use {@link #getPointerId(int)} to find the pointer
7420dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * identifier for this index).
7439822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Whole numbers are pixels; the
7449822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * value may have a fraction for input devices that are sub-pixel precise.
7450dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
7460dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
7479822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
7480dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getX(int pointerIndex) {
7495c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[mLastDataSampleIndex
7505c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                            + pointerIndex * NUM_SAMPLE_DATA + SAMPLE_X] + mXOffset;
7519822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
7529822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
7539822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
7540dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns the Y coordinate of this event for the given pointer
7550dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * <em>index</em> (use {@link #getPointerId(int)} to find the pointer
7560dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * identifier for this index).
7579822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Whole numbers are pixels; the
7589822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * value may have a fraction for input devices that are sub-pixel precise.
7590dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
7600dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
7619822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
7620dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getY(int pointerIndex) {
7635c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[mLastDataSampleIndex
7645c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                            + pointerIndex * NUM_SAMPLE_DATA + SAMPLE_Y] + mYOffset;
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7680dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns the current pressure of this event for the given pointer
7690dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * <em>index</em> (use {@link #getPointerId(int)} to find the pointer
7700dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * identifier for this index).
7719822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * The pressure generally
772cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * ranges from 0 (no pressure at all) to 1 (normal pressure), however
773cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * values higher than 1 may be generated depending on the calibration of
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the input device.
7750dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
7760dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7780dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getPressure(int pointerIndex) {
7795c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[mLastDataSampleIndex
7805c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                            + pointerIndex * NUM_SAMPLE_DATA + SAMPLE_PRESSURE];
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7840dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns a scaled value of the approximate size for the given pointer
7850dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * <em>index</em> (use {@link #getPointerId(int)} to find the pointer
7860dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * identifier for this index).
7870dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * This represents some approximation of the area of the screen being
7880dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * pressed; the actual value in pixels corresponding to the
7899822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * touch is normalized with the device specific range of values
790cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * and scaled to a value between 0 and 1. The value of size can be used to
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * determine fat touch events.
7920dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
7930dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7950dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getSize(int pointerIndex) {
7965c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[mLastDataSampleIndex
7975c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                            + pointerIndex * NUM_SAMPLE_DATA + SAMPLE_SIZE];
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the state of any meta / modifier keys that were in effect when
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the event was generated.  This is the same values as those
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned by {@link KeyEvent#getMetaState() KeyEvent.getMetaState}.
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return an integer in which each bit set to 1 represents a pressed
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         meta key
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see KeyEvent#getMetaState()
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getMetaState() {
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mMetaState;
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the original raw X coordinate of this event.  For touch
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * events on the screen, this is the original location of the event
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on the screen, before it had been adjusted for the containing window
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and views.
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final float getRawX() {
8215c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[mLastDataSampleIndex + SAMPLE_X];
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the original raw Y coordinate of this event.  For touch
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * events on the screen, this is the original location of the event
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on the screen, before it had been adjusted for the containing window
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and views.
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final float getRawY() {
8315c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[mLastDataSampleIndex + SAMPLE_Y];
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the precision of the X coordinates being reported.  You can
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * multiple this number with {@link #getX} to find the actual hardware
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value of the X coordinate.
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the precision of X coordinates being reported.
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final float getXPrecision() {
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mXPrecision;
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
843cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the precision of the Y coordinates being reported.  You can
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * multiple this number with {@link #getY} to find the actual hardware
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value of the Y coordinate.
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the precision of Y coordinates being reported.
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final float getYPrecision() {
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mYPrecision;
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
853cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the number of historical points in this event.  These are
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * movements that have occurred between this event and the previous event.
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This only applies to ACTION_MOVE events -- all other actions will have
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a size of 0.
859cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the number of historical points in the event.
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getHistorySize() {
8635c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mLastEventTimeNanoSampleIndex;
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
865cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the time that a historical movement occurred between this event
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and the previous event.  Only applies to ACTION_MOVE events.
869cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pos Which historical value to return; must be less than
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getHistorySize}
872cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getHistorySize
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getEventTime
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final long getHistoricalEventTime(int pos) {
8775c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mEventTimeNanoSamples[pos] / MS_PER_NS;
8789822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
8799822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
8809822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
8810dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getHistoricalX(int)} for the first pointer index (may be an
8820dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
8839822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
8849822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public final float getHistoricalX(int pos) {
8855c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[pos * mNumPointers * NUM_SAMPLE_DATA + SAMPLE_X] + mXOffset;
8869822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
8879822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
8889822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
8890dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getHistoricalY(int)} for the first pointer index (may be an
8900dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
8919822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
8929822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public final float getHistoricalY(int pos) {
8935c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[pos * mNumPointers * NUM_SAMPLE_DATA + SAMPLE_Y] + mYOffset;
8949822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
8959822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
8969822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
8970dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getHistoricalPressure(int)} for the first pointer index (may be an
8980dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
8999822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
9009822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public final float getHistoricalPressure(int pos) {
9015c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[pos * mNumPointers * NUM_SAMPLE_DATA + SAMPLE_PRESSURE];
9029822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
9039822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
9049822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
9050dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getHistoricalSize(int)} for the first pointer index (may be an
9060dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
9079822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
9089822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public final float getHistoricalSize(int pos) {
9095c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[pos * mNumPointers * NUM_SAMPLE_DATA + SAMPLE_SIZE];
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
911cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9130dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns a historical X coordinate, as per {@link #getX(int)}, that
9140dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * occurred between this event and the previous event for the given pointer.
9150dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Only applies to ACTION_MOVE events.
916cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
9170dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
9180dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pos Which historical value to return; must be less than
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getHistorySize}
921cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getHistorySize
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getX
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9250dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getHistoricalX(int pointerIndex, int pos) {
9265c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[(pos * mNumPointers + pointerIndex)
9275c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                            * NUM_SAMPLE_DATA + SAMPLE_X] + mXOffset;
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
929cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9310dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns a historical Y coordinate, as per {@link #getY(int)}, that
9320dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * occurred between this event and the previous event for the given pointer.
9330dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Only applies to ACTION_MOVE events.
934cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
9350dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
9360dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pos Which historical value to return; must be less than
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getHistorySize}
939cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getHistorySize
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getY
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9430dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getHistoricalY(int pointerIndex, int pos) {
9445c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[(pos * mNumPointers + pointerIndex)
9455c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                            * NUM_SAMPLE_DATA + SAMPLE_Y] + mYOffset;
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
947cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9490dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns a historical pressure coordinate, as per {@link #getPressure(int)},
9500dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * that occurred between this event and the previous event for the given
9510dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * pointer.  Only applies to ACTION_MOVE events.
952cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
9530dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
9540dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pos Which historical value to return; must be less than
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getHistorySize}
9570dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     *
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getHistorySize
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getPressure
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9610dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getHistoricalPressure(int pointerIndex, int pos) {
9625c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[(pos * mNumPointers + pointerIndex)
9635c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                            * NUM_SAMPLE_DATA + SAMPLE_PRESSURE];
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
965cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9670dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns a historical size coordinate, as per {@link #getSize(int)}, that
9680dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * occurred between this event and the previous event for the given pointer.
9690dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Only applies to ACTION_MOVE events.
970cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
9710dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
9720dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pos Which historical value to return; must be less than
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getHistorySize}
9750dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     *
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getHistorySize
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getSize
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9790dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getHistoricalSize(int pointerIndex, int pos) {
9805c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[(pos * mNumPointers + pointerIndex)
9815c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                            * NUM_SAMPLE_DATA + SAMPLE_SIZE];
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
983cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the id for the device that this event came from.  An id of
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * zero indicates that the event didn't come from a physical device; other
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * numbers are arbitrary and you shouldn't depend on the values.
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getDeviceId() {
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDeviceId;
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
992cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
99446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown     * Returns a bitfield indicating which edges, if any, were touched by this
995cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * MotionEvent. For touch events, clients can use this to determine if the
996cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * user's finger was touching the edge of the display.
997cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EDGE_LEFT
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EDGE_TOP
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EDGE_RIGHT
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EDGE_BOTTOM
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getEdgeFlags() {
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mEdgeFlags;
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1006cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the bitfield indicating which edges, if any, where touched by this
1010cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * MotionEvent.
1011cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getEdgeFlags()
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setEdgeFlags(int flags) {
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEdgeFlags = flags;
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets this event's action.
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setAction(int action) {
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = action;
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Adjust this event's location.
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param deltaX Amount to add to the current X coordinate of the event.
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param deltaY Amount to add to the current Y coordinate of the event.
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void offsetLocation(float deltaX, float deltaY) {
10315c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        mXOffset += deltaX;
10325c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        mYOffset += deltaY;
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1034cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set this event's location.  Applies {@link #offsetLocation} with a
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * delta from the current location to the given new location.
1038cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x New absolute X location.
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y New absolute Y location.
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setLocation(float x, float y) {
10435c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        mXOffset = x - mDataSamples[mLastDataSampleIndex + SAMPLE_X];
10445c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        mYOffset = y - mDataSamples[mLastDataSampleIndex + SAMPLE_Y];
10455c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    }
10465c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
10475c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    private final void incrementNumSamplesAndReserveStorage(int dataSampleStride) {
10485c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        if (mNumSamples == mEventTimeNanoSamples.length) {
10495c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            long[] newEventTimeNanoSamples = new long[mNumSamples + BASE_AVAIL_SAMPLES];
10505c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            System.arraycopy(mEventTimeNanoSamples, 0, newEventTimeNanoSamples, 0, mNumSamples);
10515c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            mEventTimeNanoSamples = newEventTimeNanoSamples;
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10535c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
10545c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        int nextDataSampleIndex = mLastDataSampleIndex + dataSampleStride;
10555c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        if (nextDataSampleIndex + dataSampleStride > mDataSamples.length) {
10565c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            float[] newDataSamples = new float[nextDataSampleIndex
10575c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                                               + BASE_AVAIL_SAMPLES * dataSampleStride];
10585c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            System.arraycopy(mDataSamples, 0, newDataSamples, 0, nextDataSampleIndex);
10595c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            mDataSamples = newDataSamples;
10605c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        }
10615c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
10625c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        mLastEventTimeNanoSampleIndex = mNumSamples;
10635c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        mLastDataSampleIndex = nextDataSampleIndex;
10645c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        mNumSamples += 1;
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1066cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Add a new movement to the batch of movements in this event.  The event's
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * current location, position and size is updated to the new values.  In
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the future, the current values in the event will be added to a list of
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * historic values.
1072cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
10739822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param eventTime The time stamp for this data.
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x The new X position.
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y The new Y position.
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pressure The new pressure.
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param size The new size.
10789822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param metaState Meta key state.
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void addBatch(long eventTime, float x, float y,
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float pressure, float size, int metaState) {
10825c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        incrementNumSamplesAndReserveStorage(NUM_SAMPLE_DATA);
10839822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
10845c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        mEventTimeNanoSamples[mLastEventTimeNanoSampleIndex] = eventTime * MS_PER_NS;
10859822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
10865c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        float[] dataSamples = mDataSamples;
10875c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        dataSamples[mLastDataSampleIndex + SAMPLE_X] = x - mXOffset;
10885c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        dataSamples[mLastDataSampleIndex + SAMPLE_Y] = y - mYOffset;
10895c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        dataSamples[mLastDataSampleIndex + SAMPLE_PRESSURE] = pressure;
10905c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        dataSamples[mLastDataSampleIndex + SAMPLE_SIZE] = size;
10919822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
10929822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        mMetaState |= metaState;
10939822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
1094cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
10959822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
10969822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Add a new movement to the batch of movements in this event.  The
10979822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * input data must contain (NUM_SAMPLE_DATA * {@link #getPointerCount()})
10989822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * samples of data.
10999822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     *
11009822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param eventTime The time stamp for this data.
11019822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param inData The actual data.
11029822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param metaState Meta key state.
11039822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     *
11049822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @hide
11059822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
11069822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public final void addBatch(long eventTime, float[] inData, int metaState) {
11075c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        final int numPointers = mNumPointers;
11085c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        final int dataSampleStride = numPointers * NUM_SAMPLE_DATA;
11095c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        incrementNumSamplesAndReserveStorage(dataSampleStride);
11109822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
11115c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        mEventTimeNanoSamples[mLastEventTimeNanoSampleIndex] = eventTime * MS_PER_NS;
11129822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
11135c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        float[] dataSamples = mDataSamples;
11145c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        System.arraycopy(inData, 0, dataSamples, mLastDataSampleIndex, dataSampleStride);
11155c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
11165c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        if (mXOffset != 0 || mYOffset != 0) {
11175c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            int index = mLastEventTimeNanoSampleIndex;
11185c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            for (int i = 0; i < numPointers; i++) {
11195c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                dataSamples[index + SAMPLE_X] -= mXOffset;
11205c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                dataSamples[index + SAMPLE_Y] -= mYOffset;
11215c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                index += NUM_SAMPLE_DATA;
11225c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            }
11235c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        }
11249822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMetaState |= metaState;
11260dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn
11270dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        if (DEBUG_POINTERS) {
11280dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            StringBuilder sb = new StringBuilder(128);
11290dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            sb.append("Add:");
11305c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            for (int i = 0; i < mNumPointers; i++) {
11310dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append(" #");
11325c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                sb.append(getPointerId(i));
11330dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append("(");
11345c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                sb.append(getX(i));
11350dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append(",");
11365c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                sb.append(getY(i));
11370dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append(")");
11380dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            }
11390dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            Log.v("MotionEvent", sb.toString());
11400dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        }
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1142cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String toString() {
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return "MotionEvent{" + Integer.toHexString(System.identityHashCode(this))
11469822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            + " action=" + mAction + " x=" + getX()
11479822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            + " y=" + getY() + " pressure=" + getPressure() + " size=" + getSize() + "}";
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Parcelable.Creator<MotionEvent> CREATOR
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new Parcelable.Creator<MotionEvent>() {
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public MotionEvent createFromParcel(Parcel in) {
11535c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            final int NP = in.readInt();
11545c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            final int NS = in.readInt();
11555c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            final int NI = NP * NS * NUM_SAMPLE_DATA;
11565c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
11575c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            MotionEvent ev = obtain(NP, NS);
11585c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            ev.mNumPointers = NP;
11595c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            ev.mNumSamples = NS;
11605c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
11615c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            ev.mDownTimeNano = in.readLong();
11625c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            ev.mAction = in.readInt();
11635c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            ev.mXOffset = in.readFloat();
11645c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            ev.mYOffset = in.readFloat();
11655c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            ev.mXPrecision = in.readFloat();
11665c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            ev.mYPrecision = in.readFloat();
11675c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            ev.mDeviceId = in.readInt();
11685c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            ev.mEdgeFlags = in.readInt();
11695c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            ev.mMetaState = in.readInt();
11705c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
11715c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            final int[] pointerIdentifiers = ev.mPointerIdentifiers;
11725c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            for (int i = 0; i < NP; i++) {
11735c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                pointerIdentifiers[i] = in.readInt();
11745c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            }
11755c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
11765c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            final long[] eventTimeNanoSamples = ev.mEventTimeNanoSamples;
11775c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            for (int i = 0; i < NS; i++) {
11785c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                eventTimeNanoSamples[i] = in.readLong();
11795c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            }
11805c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
11815c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            final float[] dataSamples = ev.mDataSamples;
11825c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            for (int i = 0; i < NI; i++) {
11835c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                dataSamples[i] = in.readFloat();
11845c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            }
11855c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
11865c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            ev.mLastEventTimeNanoSampleIndex = NS - 1;
11875c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            ev.mLastDataSampleIndex = (NS - 1) * NP * NUM_SAMPLE_DATA;
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ev;
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public MotionEvent[] newArray(int size) {
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new MotionEvent[size];
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int describeContents() {
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel out, int flags) {
12019822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int NP = mNumPointers;
12029822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int NS = mNumSamples;
12035c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        final int NI = NP * NS * NUM_SAMPLE_DATA;
12045c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
12055c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        out.writeInt(NP);
12069822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        out.writeInt(NS);
12075c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
12085c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        out.writeLong(mDownTimeNano);
12095c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        out.writeInt(mAction);
12105c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        out.writeFloat(mXOffset);
12115c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        out.writeFloat(mYOffset);
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeFloat(mXPrecision);
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeFloat(mYPrecision);
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mDeviceId);
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mEdgeFlags);
12165c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        out.writeInt(mMetaState);
12175c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
12185c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        final int[] pointerIdentifiers = mPointerIdentifiers;
12195c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        for (int i = 0; i < NP; i++) {
12205c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            out.writeInt(pointerIdentifiers[i]);
12215c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        }
12225c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
12235c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        final long[] eventTimeNanoSamples = mEventTimeNanoSamples;
12245c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        for (int i = 0; i < NS; i++) {
12255c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            out.writeLong(eventTimeNanoSamples[i]);
12265c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        }
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12285c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        final float[] dataSamples = mDataSamples;
12295c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        for (int i = 0; i < NI; i++) {
12305c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            out.writeFloat(dataSamples[i]);
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1234