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 {
300dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    static final boolean DEBUG_POINTERS = false;
310dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
339822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Bit mask of the parts of the action code that are the action itself.
349822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
359822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public static final int ACTION_MASK             = 0xff;
369822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
379822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Constant for {@link #getAction}: A pressed gesture has started, the
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * motion contains the initial starting location.
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ACTION_DOWN             = 0;
429822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Constant for {@link #getAction}: A pressed gesture has finished, the
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * motion contains the final release location as well as any intermediate
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * points since the last down or move event.
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ACTION_UP               = 1;
499822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Constant for {@link #getAction}: A change has happened during a
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * press gesture (between {@link #ACTION_DOWN} and {@link #ACTION_UP}).
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The motion contains the most recent point, as well as any intermediate
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * points since the last down or move event.
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ACTION_MOVE             = 2;
579822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Constant for {@link #getAction}: The current gesture has been aborted.
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * You will not receive any more points in it.  You should treat this as
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * an up event, but not perform any action that you normally would.
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ACTION_CANCEL           = 3;
649822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Constant for {@link #getAction}: A movement has happened outside of the
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * normal bounds of the UI element.  This does not provide a full gesture,
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * but only the initial location of the movement/touch.
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ACTION_OUTSIDE          = 4;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
729822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
739822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * A non-primary pointer has gone down.  The bits in
740dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #ACTION_POINTER_ID_MASK} indicate which pointer changed.
759822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
769822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public static final int ACTION_POINTER_DOWN     = 5;
779822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
789822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
79b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * A non-primary pointer has gone up.  The bits in
80b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * {@link #ACTION_POINTER_ID_MASK} indicate which pointer changed.
819822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
82b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    public static final int ACTION_POINTER_UP       = 6;
839822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
849822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
85b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * Bits in the action code that represent a pointer index, used with
86b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * {@link #ACTION_POINTER_DOWN} and {@link #ACTION_POINTER_UP}.  Shifting
87b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * down by {@link #ACTION_POINTER_INDEX_SHIFT} provides the actual pointer
88b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * index where the data for the pointer going up or down can be found; you can
89b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * get its identifier with {@link #getPointerId(int)} and the actual
90b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * data with {@link #getX(int)} etc.
919822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
92b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    public static final int ACTION_POINTER_INDEX_MASK  = 0xff00;
939822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
949822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
95b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * Bit shift for the action bits holding the pointer index as
96b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * defined by {@link #ACTION_POINTER_INDEX_MASK}.
979822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
98b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    public static final int ACTION_POINTER_INDEX_SHIFT = 8;
999822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1009822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
101b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * @deprecated Use {@link #ACTION_POINTER_INDEX_MASK} to retrieve the
102b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * data index associated with {@link #ACTION_POINTER_DOWN}.
1039822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
104b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    @Deprecated
105b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    public static final int ACTION_POINTER_1_DOWN   = ACTION_POINTER_DOWN | 0x0000;
106b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn
107b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    /**
108b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * @deprecated Use {@link #ACTION_POINTER_INDEX_MASK} to retrieve the
109b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * data index associated with {@link #ACTION_POINTER_DOWN}.
110b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     */
111b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    @Deprecated
112b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    public static final int ACTION_POINTER_2_DOWN   = ACTION_POINTER_DOWN | 0x0100;
1139822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1149822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
115b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * @deprecated Use {@link #ACTION_POINTER_INDEX_MASK} to retrieve the
116b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * data index associated with {@link #ACTION_POINTER_DOWN}.
1179822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
118b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    @Deprecated
119b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    public static final int ACTION_POINTER_3_DOWN   = ACTION_POINTER_DOWN | 0x0200;
120b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn
121b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    /**
122b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * @deprecated Use {@link #ACTION_POINTER_INDEX_MASK} to retrieve the
123b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * data index associated with {@link #ACTION_POINTER_UP}.
124b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     */
125b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    @Deprecated
1269822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public static final int ACTION_POINTER_1_UP     = ACTION_POINTER_UP | 0x0000;
1279822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1289822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
129b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * @deprecated Use {@link #ACTION_POINTER_INDEX_MASK} to retrieve the
130b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * data index associated with {@link #ACTION_POINTER_UP}.
1319822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
132b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    @Deprecated
1339822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public static final int ACTION_POINTER_2_UP     = ACTION_POINTER_UP | 0x0100;
1349822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1359822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
136b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * @deprecated Use {@link #ACTION_POINTER_INDEX_MASK} to retrieve the
137b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * data index associated with {@link #ACTION_POINTER_UP}.
1389822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
139b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    @Deprecated
1409822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public static final int ACTION_POINTER_3_UP     = ACTION_POINTER_UP | 0x0200;
1419822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1429822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
143b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * @deprecated Renamed to {@link #ACTION_POINTER_INDEX_MASK} to match
144b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * the actual data contained in these bits.
1459822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
146b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    @Deprecated
1470dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public static final int ACTION_POINTER_ID_MASK  = 0xff00;
1489822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1499822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
150b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * @deprecated Renamed to {@link #ACTION_POINTER_INDEX_SHIFT} to match
151b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * the actual data contained in these bits.
1529822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
153b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    @Deprecated
1540dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public static final int ACTION_POINTER_ID_SHIFT = 8;
1559822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean TRACK_RECYCLED_LOCATION = false;
157cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Flag indicating the motion event intersected the top edge of the screen.
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int EDGE_TOP = 0x00000001;
162cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Flag indicating the motion event intersected the bottom edge of the screen.
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int EDGE_BOTTOM = 0x00000002;
167cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Flag indicating the motion event intersected the left edge of the screen.
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int EDGE_LEFT = 0x00000004;
172cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Flag indicating the motion event intersected the right edge of the screen.
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int EDGE_RIGHT = 0x00000008;
177cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
1789822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
1799822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Offset for the sample's X coordinate.
1809822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @hide
1819822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
1829822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    static public final int SAMPLE_X = 0;
1839822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1849822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
1859822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Offset for the sample's Y coordinate.
1869822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @hide
1879822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
1889822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    static public final int SAMPLE_Y = 1;
1899822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1909822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
1919822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Offset for the sample's X coordinate.
1929822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @hide
1939822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
1949822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    static public final int SAMPLE_PRESSURE = 2;
1959822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1969822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
1979822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Offset for the sample's X coordinate.
1989822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @hide
1999822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
2009822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    static public final int SAMPLE_SIZE = 3;
2019822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
2029822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
2039822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Number of data items for each sample.
2049822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @hide
2059822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
2069822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    static public final int NUM_SAMPLE_DATA = 4;
2079822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
2081e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn    /**
2091e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn     * Number of possible pointers.
2101e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn     * @hide
2111e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn     */
2121e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn    static public final int BASE_AVAIL_POINTERS = 5;
2131e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn
2149822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    static private final int BASE_AVAIL_SAMPLES = 8;
2159822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static private final int MAX_RECYCLED = 10;
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static private Object gRecyclerLock = new Object();
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static private int gRecyclerUsed = 0;
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static private MotionEvent gRecyclerTop = null;
220cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mDownTime;
22253071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    private long mEventTimeNano;
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mAction;
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float mRawX;
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float mRawY;
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    // Here is the actual event data.  Note that the order of the array
2339822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    // is a little odd: the first entry is the most recent, and the ones
2349822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    // following it are the historical data from oldest to newest.  This
2359822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    // allows us to easily retrieve the most recent data, without having
2369822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    // to copy the arrays every time a new sample is added.
2379822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
2389822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    private int mNumPointers;
2399822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    private int mNumSamples;
2400dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    // Array of mNumPointers size of identifiers for each pointer of data.
2410dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    private int[] mPointerIdentifiers;
2429822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    // Array of (mNumSamples * mNumPointers * NUM_SAMPLE_DATA) size of event data.
2439822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    private float[] mDataSamples;
2449822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    // Array of mNumSamples size of time stamps.
2459822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    private long[] mTimeSamples;
2468169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private MotionEvent mNext;
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private RuntimeException mRecycledLocation;
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mRecycled;
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private MotionEvent() {
2520dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        mPointerIdentifiers = new int[BASE_AVAIL_POINTERS];
2539822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        mDataSamples = new float[BASE_AVAIL_POINTERS*BASE_AVAIL_SAMPLES*NUM_SAMPLE_DATA];
2549822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        mTimeSamples = new long[BASE_AVAIL_SAMPLES];
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
256cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static private MotionEvent obtain() {
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (gRecyclerLock) {
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (gRecyclerTop == null) {
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new MotionEvent();
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            MotionEvent ev = gRecyclerTop;
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            gRecyclerTop = ev.mNext;
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            gRecyclerUsed--;
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ev.mRecycledLocation = null;
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ev.mRecycled = false;
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ev;
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27053071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan
27153071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    /**
27253071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * Create a new MotionEvent, filling in all of the basic values that
27353071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * define the motion.
27453071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     *
27553071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param downTime The time (in ms) when the user originally pressed down to start
27653071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * a stream of position events.  This must be obtained from {@link SystemClock#uptimeMillis()}.
27753071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param eventTime  The the time (in ms) when this specific event was generated.  This
27853071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * must be obtained from {@link SystemClock#uptimeMillis()}.
27953071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param eventTimeNano  The the time (in ns) when this specific event was generated.  This
28053071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * must be obtained from {@link System#nanoTime()}.
28153071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param action The kind of action being performed -- one of either
28253071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or
28353071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * {@link #ACTION_CANCEL}.
2840dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointers The number of points that will be in this event.
2850dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param inPointerIds An array of <em>pointers</em> values providing
2860dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * an identifier for each pointer.
2870dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param inData An array of <em>pointers*NUM_SAMPLE_DATA</em> of initial
2880dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * data samples for the event.
28953071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param metaState The state of any meta / modifier keys that were in effect when
29053071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * the event was generated.
29153071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param xPrecision The precision of the X coordinate being reported.
29253071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param yPrecision The precision of the Y coordinate being reported.
29353071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param deviceId The id for the device that this event came from.  An id of
29453071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * zero indicates that the event didn't come from a physical device; other
29553071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * numbers are arbitrary and you shouldn't depend on the values.
29653071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param edgeFlags A bitfield indicating which edges, if any, where touched by this
29753071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * MotionEvent.
29853071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     *
29953071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @hide
30053071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     */
30153071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    static public MotionEvent obtainNano(long downTime, long eventTime, long eventTimeNano,
3020dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            int action, int pointers, int[] inPointerIds, float[] inData, int metaState,
30353071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan            float xPrecision, float yPrecision, int deviceId, int edgeFlags) {
30453071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        MotionEvent ev = obtain();
30553071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mDeviceId = deviceId;
30653071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mEdgeFlags = edgeFlags;
30753071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mDownTime = downTime;
30853071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mEventTimeNano = eventTimeNano;
30953071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mAction = action;
31053071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mMetaState = metaState;
311ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn        ev.mRawX = inData[SAMPLE_X];
312ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn        ev.mRawY = inData[SAMPLE_Y];
31353071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mXPrecision = xPrecision;
31453071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mYPrecision = yPrecision;
3159822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mNumPointers = pointers;
3169822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mNumSamples = 1;
3179822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
3181e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn        int[] pointerIdentifiers = ev.mPointerIdentifiers;
3191e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn        if (pointerIdentifiers.length < pointers) {
3201e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn            ev.mPointerIdentifiers = pointerIdentifiers = new int[pointers];
3211e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn        }
3221e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn        System.arraycopy(inPointerIds, 0, pointerIdentifiers, 0, pointers);
3231e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn
3241e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn        final int ND = pointers * NUM_SAMPLE_DATA;
3251e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn        float[] dataSamples = ev.mDataSamples;
3261e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn        if (dataSamples.length < ND) {
3271e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn            ev.mDataSamples = dataSamples = new float[ND];
3281e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn        }
3291e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn        System.arraycopy(inData, 0, dataSamples, 0, ND);
3301e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn
3319822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mTimeSamples[0] = eventTime;
33253071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan
3330dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        if (DEBUG_POINTERS) {
3340dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            StringBuilder sb = new StringBuilder(128);
3350dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            sb.append("New:");
3360dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            for (int i=0; i<pointers; i++) {
3370dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append(" #");
3380dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append(ev.mPointerIdentifiers[i]);
3390dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append("(");
3400dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append(ev.mDataSamples[(i*NUM_SAMPLE_DATA) + SAMPLE_X]);
3410dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append(",");
3420dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append(ev.mDataSamples[(i*NUM_SAMPLE_DATA) + SAMPLE_Y]);
3430dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append(")");
3440dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            }
3450dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            Log.v("MotionEvent", sb.toString());
3460dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        }
3470dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn
34853071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        return ev;
34953071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    }
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new MotionEvent, filling in all of the basic values that
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * define the motion.
354cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
355cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * @param downTime The time (in ms) when the user originally pressed down to start
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a stream of position events.  This must be obtained from {@link SystemClock#uptimeMillis()}.
357cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * @param eventTime  The the time (in ms) when this specific event was generated.  This
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * must be obtained from {@link SystemClock#uptimeMillis()}.
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action The kind of action being performed -- one of either
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_CANCEL}.
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x The X coordinate of this event.
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y The Y coordinate of this event.
364cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * @param pressure The current pressure of this event.  The pressure generally
365cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * ranges from 0 (no pressure at all) to 1 (normal pressure), however
366cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * values higher than 1 may be generated depending on the calibration of
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the input device.
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param size A scaled value of the approximate size of the area being pressed when
369cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * touched with the finger. The actual value in pixels corresponding to the finger
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * touch is normalized with a device specific range of values
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and scaled to a value between 0 and 1.
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param metaState The state of any meta / modifier keys that were in effect when
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the event was generated.
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param xPrecision The precision of the X coordinate being reported.
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param yPrecision The precision of the Y coordinate being reported.
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param deviceId The id for the device that this event came from.  An id of
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * zero indicates that the event didn't come from a physical device; other
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * numbers are arbitrary and you shouldn't depend on the values.
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param edgeFlags A bitfield indicating which edges, if any, where touched by this
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * MotionEvent.
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public MotionEvent obtain(long downTime, long eventTime, int action,
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float x, float y, float pressure, float size, int metaState,
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float xPrecision, float yPrecision, int deviceId, int edgeFlags) {
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MotionEvent ev = obtain();
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mDeviceId = deviceId;
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mEdgeFlags = edgeFlags;
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mDownTime = downTime;
38953071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mEventTimeNano = eventTime * 1000000;
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mAction = action;
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mMetaState = metaState;
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mXPrecision = xPrecision;
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mYPrecision = yPrecision;
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3959822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mNumPointers = 1;
3969822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mNumSamples = 1;
3970dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        int[] pointerIds = ev.mPointerIdentifiers;
3980dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        pointerIds[0] = 0;
3999822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        float[] data = ev.mDataSamples;
4009822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_X] = ev.mRawX = x;
4019822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_Y] = ev.mRawY = y;
4029822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_PRESSURE] = pressure;
4039822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_SIZE] = size;
4049822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mTimeSamples[0] = eventTime;
4059822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
4069822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return ev;
4079822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
4089822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
4099822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
4109822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Create a new MotionEvent, filling in all of the basic values that
4119822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * define the motion.
4129822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     *
4139822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param downTime The time (in ms) when the user originally pressed down to start
4149822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * a stream of position events.  This must be obtained from {@link SystemClock#uptimeMillis()}.
4159822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param eventTime  The the time (in ms) when this specific event was generated.  This
4169822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * must be obtained from {@link SystemClock#uptimeMillis()}.
4179822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param action The kind of action being performed -- one of either
4189822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or
4199822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * {@link #ACTION_CANCEL}.
4209822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param pointers The number of pointers that are active in this event.
4219822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param x The X coordinate of this event.
4229822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param y The Y coordinate of this event.
4239822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param pressure The current pressure of this event.  The pressure generally
4249822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * ranges from 0 (no pressure at all) to 1 (normal pressure), however
4259822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * values higher than 1 may be generated depending on the calibration of
4269822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * the input device.
4279822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param size A scaled value of the approximate size of the area being pressed when
4289822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * touched with the finger. The actual value in pixels corresponding to the finger
4299822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * touch is normalized with a device specific range of values
4309822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * and scaled to a value between 0 and 1.
4319822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param metaState The state of any meta / modifier keys that were in effect when
4329822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * the event was generated.
4339822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param xPrecision The precision of the X coordinate being reported.
4349822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param yPrecision The precision of the Y coordinate being reported.
4359822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param deviceId The id for the device that this event came from.  An id of
4369822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * zero indicates that the event didn't come from a physical device; other
4379822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * numbers are arbitrary and you shouldn't depend on the values.
4389822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param edgeFlags A bitfield indicating which edges, if any, where touched by this
4399822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * MotionEvent.
4409822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
4419822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    static public MotionEvent obtain(long downTime, long eventTime, int action,
4429822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            int pointers, float x, float y, float pressure, float size, int metaState,
4439822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            float xPrecision, float yPrecision, int deviceId, int edgeFlags) {
4449822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        MotionEvent ev = obtain();
4459822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mDeviceId = deviceId;
4469822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mEdgeFlags = edgeFlags;
4479822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mDownTime = downTime;
4489822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mEventTimeNano = eventTime * 1000000;
4499822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mAction = action;
4509822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mNumPointers = pointers;
4519822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mMetaState = metaState;
4529822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mXPrecision = xPrecision;
4539822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mYPrecision = yPrecision;
4549822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
4559822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mNumPointers = 1;
4569822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mNumSamples = 1;
4570dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        int[] pointerIds = ev.mPointerIdentifiers;
4580dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        pointerIds[0] = 0;
4599822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        float[] data = ev.mDataSamples;
4609822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_X] = ev.mRawX = x;
4619822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_Y] = ev.mRawY = y;
4629822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_PRESSURE] = pressure;
4639822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_SIZE] = size;
4649822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mTimeSamples[0] = eventTime;
4659822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ev;
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
468cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new MotionEvent, filling in a subset of the basic motion
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * values.  Those not specified here are: device id (always 0), pressure
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and size (always 1), x and y precision (always 1), and edgeFlags (always 0).
473cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
474cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * @param downTime The time (in ms) when the user originally pressed down to start
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a stream of position events.  This must be obtained from {@link SystemClock#uptimeMillis()}.
476cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * @param eventTime  The the time (in ms) when this specific event was generated.  This
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * must be obtained from {@link SystemClock#uptimeMillis()}.
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action The kind of action being performed -- one of either
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_CANCEL}.
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x The X coordinate of this event.
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y The Y coordinate of this event.
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param metaState The state of any meta / modifier keys that were in effect when
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the event was generated.
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public MotionEvent obtain(long downTime, long eventTime, int action,
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float x, float y, int metaState) {
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MotionEvent ev = obtain();
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mDeviceId = 0;
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mEdgeFlags = 0;
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mDownTime = downTime;
49253071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mEventTimeNano = eventTime * 1000000;
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mAction = action;
4949822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mNumPointers = 1;
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mMetaState = metaState;
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mXPrecision = 1.0f;
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mYPrecision = 1.0f;
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4999822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mNumPointers = 1;
5009822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mNumSamples = 1;
5010dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        int[] pointerIds = ev.mPointerIdentifiers;
5020dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        pointerIds[0] = 0;
5039822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        float[] data = ev.mDataSamples;
5049822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_X] = ev.mRawX = x;
5059822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_Y] = ev.mRawY = y;
5069822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_PRESSURE] = 1.0f;
5079822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_SIZE] = 1.0f;
5089822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mTimeSamples[0] = eventTime;
5099822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ev;
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5128169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima
5138169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima    /**
51464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima     * Scales down the coordination of this event by the given scale.
5158169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima     *
5168169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima     * @hide
5178169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima     */
5188169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima    public void scale(float scale) {
51964f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        mRawX *= scale;
52064f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        mRawY *= scale;
52164f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        mXPrecision *= scale;
52264f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        mYPrecision *= scale;
5239822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        float[] history = mDataSamples;
5249822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int length = mNumPointers * mNumSamples * NUM_SAMPLE_DATA;
5259822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        for (int i = 0; i < length; i += NUM_SAMPLE_DATA) {
5269822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            history[i + SAMPLE_X] *= scale;
5279822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            history[i + SAMPLE_Y] *= scale;
5289822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            // no need to scale pressure
5299822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            history[i + SAMPLE_SIZE] *= scale;    // TODO: square this?
5308169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima        }
5318169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima    }
5328169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new MotionEvent, copying from an existing one.
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public MotionEvent obtain(MotionEvent o) {
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MotionEvent ev = obtain();
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mDeviceId = o.mDeviceId;
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mEdgeFlags = o.mEdgeFlags;
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mDownTime = o.mDownTime;
54153071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mEventTimeNano = o.mEventTimeNano;
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mAction = o.mAction;
5439822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mNumPointers = o.mNumPointers;
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mRawX = o.mRawX;
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mRawY = o.mRawY;
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mMetaState = o.mMetaState;
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mXPrecision = o.mXPrecision;
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mYPrecision = o.mYPrecision;
5499822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
5500dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        final int NS = ev.mNumSamples = o.mNumSamples;
5510dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        if (ev.mTimeSamples.length >= NS) {
5520dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            System.arraycopy(o.mTimeSamples, 0, ev.mTimeSamples, 0, NS);
5539822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        } else {
5549822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            ev.mTimeSamples = (long[])o.mTimeSamples.clone();
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5569822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
5570dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        final int NP = (ev.mNumPointers=o.mNumPointers);
5580dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        if (ev.mPointerIdentifiers.length >= NP) {
5590dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            System.arraycopy(o.mPointerIdentifiers, 0, ev.mPointerIdentifiers, 0, NP);
5609822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        } else {
5610dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            ev.mPointerIdentifiers = (int[])o.mPointerIdentifiers.clone();
5629822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        }
5639822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
5640dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        final int ND = NP * NS * NUM_SAMPLE_DATA;
56518a081e68441a098fe0a1a6283439913cfb6b0caOwen Lin        if (ev.mDataSamples.length >= ND) {
5669822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            System.arraycopy(o.mDataSamples, 0, ev.mDataSamples, 0, ND);
5679822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        } else {
5689822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            ev.mDataSamples = (float[])o.mDataSamples.clone();
5699822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        }
5709822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ev;
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
573cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5758df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn     * Create a new MotionEvent, copying from an existing one, but not including
5768df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn     * any historical point information.
5778df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn     */
5788df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn    static public MotionEvent obtainNoHistory(MotionEvent o) {
5798df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        MotionEvent ev = obtain();
5808df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        ev.mDeviceId = o.mDeviceId;
5818df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        ev.mEdgeFlags = o.mEdgeFlags;
5828df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        ev.mDownTime = o.mDownTime;
5838df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        ev.mEventTimeNano = o.mEventTimeNano;
5848df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        ev.mAction = o.mAction;
5858df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        ev.mNumPointers = o.mNumPointers;
5868df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        ev.mRawX = o.mRawX;
5878df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        ev.mRawY = o.mRawY;
5888df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        ev.mMetaState = o.mMetaState;
5898df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        ev.mXPrecision = o.mXPrecision;
5908df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        ev.mYPrecision = o.mYPrecision;
5918df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn
5928df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        ev.mNumSamples = 1;
5938df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        ev.mTimeSamples[0] = o.mTimeSamples[0];
5948df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn
5958df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        final int NP = (ev.mNumPointers=o.mNumPointers);
5968df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        if (ev.mPointerIdentifiers.length >= NP) {
5978df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn            System.arraycopy(o.mPointerIdentifiers, 0, ev.mPointerIdentifiers, 0, NP);
5988df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        } else {
5998df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn            ev.mPointerIdentifiers = (int[])o.mPointerIdentifiers.clone();
6008df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        }
6018df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn
6028df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        final int ND = NP * NUM_SAMPLE_DATA;
6038df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        if (ev.mDataSamples.length >= ND) {
6048df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn            System.arraycopy(o.mDataSamples, 0, ev.mDataSamples, 0, ND);
6058df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        } else {
6068df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn            ev.mDataSamples = (float[])o.mDataSamples.clone();
6078df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        }
6088df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn
6098df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        return ev;
6108df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn    }
6118df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn
6128df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn    /**
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Recycle the MotionEvent, to be re-used by a later caller.  After calling
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this function you must not ever touch the event again.
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void recycle() {
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Ensure recycle is only called once!
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (TRACK_RECYCLED_LOCATION) {
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mRecycledLocation != null) {
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException(toString() + " recycled twice!", mRecycledLocation);
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecycledLocation = new RuntimeException("Last recycled here");
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (mRecycled) {
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException(toString() + " recycled twice!");
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //Log.w("MotionEvent", "Recycling event " + this, mRecycledLocation);
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (gRecyclerLock) {
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (gRecyclerUsed < MAX_RECYCLED) {
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                gRecyclerUsed++;
6319822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn                mNumSamples = 0;
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mNext = gRecyclerTop;
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                gRecyclerTop = this;
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
637cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the kind of action being performed -- one of either
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or
641b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * {@link #ACTION_CANCEL}.  Consider using {@link #getActionMasked}
642b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * and {@link #getActionIndex} to retrieve the separate masked action
643b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * and pointer index.
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getAction() {
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAction;
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
650b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * Return the masked action being performed, without pointer index
651b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * information.  May be any of the actions: {@link #ACTION_DOWN},
652b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * {@link #ACTION_MOVE}, {@link #ACTION_UP}, {@link #ACTION_CANCEL},
653b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * {@link #ACTION_POINTER_DOWN}, or {@link #ACTION_POINTER_UP}.
654b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * Use {@link #getActionIndex} to return the index associated with
655b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * pointer actions.
656b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     */
657b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    public final int getActionMasked() {
658b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn        return mAction & ACTION_MASK;
659b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    }
660b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn
661b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    /**
662b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * For {@link #ACTION_POINTER_DOWN} or {@link #ACTION_POINTER_UP}
663b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * as returned by {@link #getActionMasked}, this returns the associated
664b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * pointer index.  The index may be used with {@link #getPointerId(int)},
665b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * {@link #getX(int)}, {@link #getY(int)}, {@link #getPressure(int)},
666b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * and {@link #getSize(int)} to get information about the pointer that has
667b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * gone down or up.
668b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     */
669b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    public final int getActionIndex() {
670b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn        return (mAction & ACTION_POINTER_INDEX_MASK) >> ACTION_POINTER_INDEX_SHIFT;
671b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    }
672b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn
673b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    /**
674cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * Returns the time (in ms) when the user originally pressed down to start
675cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * a stream of position events.
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final long getDownTime() {
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDownTime;
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the time (in ms) when this specific event was generated.
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final long getEventTime() {
6859822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return mTimeSamples[0];
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
68953071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * Returns the time (in ns) when this specific event was generated.
69053071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * The value is in nanosecond precision but it may not have nanosecond accuracy.
69153071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     *
69253071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @hide
69353071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     */
69453071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    public final long getEventTimeNano() {
69553071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        return mEventTimeNano;
69653071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    }
69753071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan
69853071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    /**
6990dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getX(int)} for the first pointer index (may be an
7000dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final float getX() {
7039822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return mDataSamples[SAMPLE_X];
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7070dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getY(int)} for the first pointer index (may be an
7080dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final float getY() {
7119822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return mDataSamples[SAMPLE_Y];
7129822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
7139822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
7149822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
7150dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getPressure(int)} for the first pointer index (may be an
7160dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
7179822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
7189822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public final float getPressure() {
7199822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return mDataSamples[SAMPLE_PRESSURE];
7209822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
7219822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
7229822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
7230dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getSize(int)} for the first pointer index (may be an
7240dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
7259822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
7269822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public final float getSize() {
7279822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return mDataSamples[SAMPLE_SIZE];
7289822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
7299822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
7309822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
7310dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * The number of pointers of data contained in this event.  Always
7320dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * >= 1.
7330dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     */
7340dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final int getPointerCount() {
7350dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        return mNumPointers;
7360dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    }
7370dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn
7380dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    /**
7390dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Return the pointer identifier associated with a particular pointer
7400dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * data index is this event.  The identifier tells you the actual pointer
7410dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * number associated with the data, accounting for individual pointers
7420dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * going up and down since the start of the current gesture.
7430dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
7440dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
7450dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     */
746d41ba666d12a24ee4624ea9a009151e6165e3775Dianne Hackborn    public final int getPointerId(int pointerIndex) {
747d41ba666d12a24ee4624ea9a009151e6165e3775Dianne Hackborn        return mPointerIdentifiers[pointerIndex];
7480dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    }
7490dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn
7500dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    /**
7510dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Given a pointer identifier, find the index of its data in the event.
7520dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     *
7530dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerId The identifier of the pointer to be found.
7540dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @return Returns either the index of the pointer (for use with
7550dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getX(int) et al.), or -1 if there is no data available for
7560dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * that pointer identifier.
7570dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     */
7580dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final int findPointerIndex(int pointerId) {
7590dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        int i = mNumPointers;
7600dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        while (i > 0) {
7610dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            i--;
7620dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            if (mPointerIdentifiers[i] == pointerId) {
7630dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                return i;
7640dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            }
7650dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        }
7660dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        return -1;
7670dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    }
7680dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn
7690dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    /**
7700dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns the X coordinate of this event for the given pointer
7710dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * <em>index</em> (use {@link #getPointerId(int)} to find the pointer
7720dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * identifier for this index).
7739822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Whole numbers are pixels; the
7749822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * value may have a fraction for input devices that are sub-pixel precise.
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.
7779822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
7780dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getX(int pointerIndex) {
7790dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        return mDataSamples[(pointerIndex*NUM_SAMPLE_DATA) + SAMPLE_X];
7809822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
7819822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
7829822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
7830dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns the Y coordinate of this event for the given pointer
7840dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * <em>index</em> (use {@link #getPointerId(int)} to find the pointer
7850dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * identifier for this index).
7869822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Whole numbers are pixels; the
7879822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * value may have a fraction for input devices that are sub-pixel precise.
7880dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
7890dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
7909822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
7910dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getY(int pointerIndex) {
7920dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        return mDataSamples[(pointerIndex*NUM_SAMPLE_DATA) + SAMPLE_Y];
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7960dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns the current pressure of this event for the given pointer
7970dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * <em>index</em> (use {@link #getPointerId(int)} to find the pointer
7980dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * identifier for this index).
7999822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * The pressure generally
800cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * ranges from 0 (no pressure at all) to 1 (normal pressure), however
801cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * values higher than 1 may be generated depending on the calibration of
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the input device.
8030dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
8040dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8060dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getPressure(int pointerIndex) {
8070dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        return mDataSamples[(pointerIndex*NUM_SAMPLE_DATA) + SAMPLE_PRESSURE];
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8110dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns a scaled value of the approximate size for the given pointer
8120dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * <em>index</em> (use {@link #getPointerId(int)} to find the pointer
8130dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * identifier for this index).
8140dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * This represents some approximation of the area of the screen being
8150dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * pressed; the actual value in pixels corresponding to the
8169822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * touch is normalized with the device specific range of values
817cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * and scaled to a value between 0 and 1. The value of size can be used to
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * determine fat touch events.
8190dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
8200dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8220dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getSize(int pointerIndex) {
8230dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        return mDataSamples[(pointerIndex*NUM_SAMPLE_DATA) + SAMPLE_SIZE];
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the state of any meta / modifier keys that were in effect when
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the event was generated.  This is the same values as those
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned by {@link KeyEvent#getMetaState() KeyEvent.getMetaState}.
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return an integer in which each bit set to 1 represents a pressed
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         meta key
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see KeyEvent#getMetaState()
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getMetaState() {
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mMetaState;
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the original raw X coordinate of this event.  For touch
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * events on the screen, this is the original location of the event
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on the screen, before it had been adjusted for the containing window
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and views.
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final float getRawX() {
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRawX;
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the original raw Y coordinate of this event.  For touch
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * events on the screen, this is the original location of the event
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on the screen, before it had been adjusted for the containing window
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and views.
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final float getRawY() {
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRawY;
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the precision of the X coordinates being reported.  You can
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * multiple this number with {@link #getX} to find the actual hardware
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value of the X coordinate.
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the precision of X coordinates being reported.
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final float getXPrecision() {
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mXPrecision;
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
869cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the precision of the Y coordinates being reported.  You can
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * multiple this number with {@link #getY} to find the actual hardware
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value of the Y coordinate.
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the precision of Y coordinates being reported.
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final float getYPrecision() {
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mYPrecision;
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
879cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the number of historical points in this event.  These are
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * movements that have occurred between this event and the previous event.
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This only applies to ACTION_MOVE events -- all other actions will have
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a size of 0.
885cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the number of historical points in the event.
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getHistorySize() {
8899822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return mNumSamples - 1;
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
891cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the time that a historical movement occurred between this event
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and the previous event.  Only applies to ACTION_MOVE events.
895cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pos Which historical value to return; must be less than
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getHistorySize}
898cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getHistorySize
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getEventTime
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final long getHistoricalEventTime(int pos) {
9039822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return mTimeSamples[pos + 1];
9049822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
9059822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
9069822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
9070dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getHistoricalX(int)} for the first pointer index (may be an
9080dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
9099822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
9109822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public final float getHistoricalX(int pos) {
9119822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return mDataSamples[((pos + 1) * NUM_SAMPLE_DATA * mNumPointers) + SAMPLE_X];
9129822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
9139822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
9149822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
9150dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getHistoricalY(int)} for the first pointer index (may be an
9160dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
9179822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
9189822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public final float getHistoricalY(int pos) {
9199822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return mDataSamples[((pos + 1) * NUM_SAMPLE_DATA * mNumPointers) + SAMPLE_Y];
9209822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
9219822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
9229822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
9230dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getHistoricalPressure(int)} for the first pointer index (may be an
9240dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
9259822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
9269822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public final float getHistoricalPressure(int pos) {
9279822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return mDataSamples[((pos + 1) * NUM_SAMPLE_DATA * mNumPointers) + SAMPLE_PRESSURE];
9289822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
9299822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
9309822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
9310dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getHistoricalSize(int)} for the first pointer index (may be an
9320dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
9339822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
9349822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public final float getHistoricalSize(int pos) {
9359822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return mDataSamples[((pos + 1) * NUM_SAMPLE_DATA * mNumPointers) + SAMPLE_SIZE];
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
937cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9390dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns a historical X coordinate, as per {@link #getX(int)}, that
9400dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * occurred between this event and the previous event for the given pointer.
9410dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Only applies to ACTION_MOVE events.
942cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
9430dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
9440dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pos Which historical value to return; must be less than
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getHistorySize}
947cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getHistorySize
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getX
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9510dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getHistoricalX(int pointerIndex, int pos) {
9529822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return mDataSamples[((pos + 1) * NUM_SAMPLE_DATA * mNumPointers)
9530dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                            + (pointerIndex * NUM_SAMPLE_DATA) + SAMPLE_X];
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
955cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9570dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns a historical Y coordinate, as per {@link #getY(int)}, that
9580dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * occurred between this event and the previous event for the given pointer.
9590dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Only applies to ACTION_MOVE events.
960cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
9610dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
9620dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pos Which historical value to return; must be less than
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getHistorySize}
965cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getHistorySize
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getY
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9690dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getHistoricalY(int pointerIndex, int pos) {
9709822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return mDataSamples[((pos + 1) * NUM_SAMPLE_DATA * mNumPointers)
9710dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                            + (pointerIndex * NUM_SAMPLE_DATA) + SAMPLE_Y];
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
973cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9750dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns a historical pressure coordinate, as per {@link #getPressure(int)},
9760dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * that occurred between this event and the previous event for the given
9770dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * pointer.  Only applies to ACTION_MOVE events.
978cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
9790dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
9800dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pos Which historical value to return; must be less than
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getHistorySize}
9830dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     *
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getHistorySize
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getPressure
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9870dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getHistoricalPressure(int pointerIndex, int pos) {
9889822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return mDataSamples[((pos + 1) * NUM_SAMPLE_DATA * mNumPointers)
9890dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                            + (pointerIndex * NUM_SAMPLE_DATA) + SAMPLE_PRESSURE];
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
991cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9930dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns a historical size coordinate, as per {@link #getSize(int)}, that
9940dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * occurred between this event and the previous event for the given pointer.
9950dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Only applies to ACTION_MOVE events.
996cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
9970dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
9980dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pos Which historical value to return; must be less than
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getHistorySize}
10010dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     *
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getHistorySize
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getSize
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10050dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getHistoricalSize(int pointerIndex, int pos) {
10069822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return mDataSamples[((pos + 1) * NUM_SAMPLE_DATA * mNumPointers)
10070dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                            + (pointerIndex * NUM_SAMPLE_DATA) + SAMPLE_SIZE];
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1009cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the id for the device that this event came from.  An id of
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * zero indicates that the event didn't come from a physical device; other
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * numbers are arbitrary and you shouldn't depend on the values.
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getDeviceId() {
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDeviceId;
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1018cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns a bitfield indicating which edges, if any, where touched by this
1021cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * MotionEvent. For touch events, clients can use this to determine if the
1022cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * user's finger was touching the edge of the display.
1023cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EDGE_LEFT
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EDGE_TOP
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EDGE_RIGHT
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EDGE_BOTTOM
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getEdgeFlags() {
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mEdgeFlags;
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1032cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the bitfield indicating which edges, if any, where touched by this
1036cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * MotionEvent.
1037cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getEdgeFlags()
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setEdgeFlags(int flags) {
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEdgeFlags = flags;
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets this event's action.
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setAction(int action) {
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = action;
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Adjust this event's location.
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param deltaX Amount to add to the current X coordinate of the event.
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param deltaY Amount to add to the current Y coordinate of the event.
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void offsetLocation(float deltaX, float deltaY) {
10579822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int N = mNumPointers*mNumSamples*4;
10589822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final float[] pos = mDataSamples;
10599822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        for (int i=0; i<N; i+=NUM_SAMPLE_DATA) {
10609822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            pos[i+SAMPLE_X] += deltaX;
10619822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            pos[i+SAMPLE_Y] += deltaY;
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1064cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set this event's location.  Applies {@link #offsetLocation} with a
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * delta from the current location to the given new location.
1068cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x New absolute X location.
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y New absolute Y location.
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setLocation(float x, float y) {
10739822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        float deltaX = x-mDataSamples[SAMPLE_X];
10749822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        float deltaY = y-mDataSamples[SAMPLE_Y];
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (deltaX != 0 || deltaY != 0) {
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            offsetLocation(deltaX, deltaY);
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1079cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Add a new movement to the batch of movements in this event.  The event's
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * current location, position and size is updated to the new values.  In
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the future, the current values in the event will be added to a list of
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * historic values.
1085cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
10869822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param eventTime The time stamp for this data.
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x The new X position.
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y The new Y position.
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pressure The new pressure.
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param size The new size.
10919822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param metaState Meta key state.
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void addBatch(long eventTime, float x, float y,
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float pressure, float size, int metaState) {
10959822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        float[] data = mDataSamples;
10969822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        long[] times = mTimeSamples;
10979822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
10989822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int NP = mNumPointers;
10999822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int NS = mNumSamples;
11009822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int NI = NP*NS;
11019822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int ND = NI * NUM_SAMPLE_DATA;
11020dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        if (data.length <= ND) {
11030dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            final int NEW_ND = ND + (NP * (BASE_AVAIL_SAMPLES * NUM_SAMPLE_DATA));
11049822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            float[] newData = new float[NEW_ND];
11059822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            System.arraycopy(data, 0, newData, 0, ND);
11069822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            mDataSamples = data = newData;
11079822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        }
11089822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        if (times.length <= NS) {
11099822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            final int NEW_NS = NS + BASE_AVAIL_SAMPLES;
11109822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            long[] newHistoryTimes = new long[NEW_NS];
11119822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            System.arraycopy(times, 0, newHistoryTimes, 0, NS);
11129822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            mTimeSamples = times = newHistoryTimes;
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11149822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
11159822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        times[NS] = times[0];
11169822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        times[0] = eventTime;
11179822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
11189822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int pos = NS*NUM_SAMPLE_DATA;
11199822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[pos+SAMPLE_X] = data[SAMPLE_X];
11209822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[pos+SAMPLE_Y] = data[SAMPLE_Y];
11219822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[pos+SAMPLE_PRESSURE] = data[SAMPLE_PRESSURE];
11229822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[pos+SAMPLE_SIZE] = data[SAMPLE_SIZE];
11239822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_X] = x;
11249822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_Y] = y;
11259822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_PRESSURE] = pressure;
11269822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_SIZE] = size;
11279822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        mNumSamples = NS+1;
1128cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
11299822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        mRawX = x;
11309822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        mRawY = y;
11319822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        mMetaState |= metaState;
11329822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
1133cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
11349822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
11359822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Add a new movement to the batch of movements in this event.  The
11369822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * input data must contain (NUM_SAMPLE_DATA * {@link #getPointerCount()})
11379822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * samples of data.
11389822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     *
11399822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param eventTime The time stamp for this data.
11409822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param inData The actual data.
11419822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param metaState Meta key state.
11429822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     *
11439822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @hide
11449822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
11459822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public final void addBatch(long eventTime, float[] inData, int metaState) {
11469822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        float[] data = mDataSamples;
11479822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        long[] times = mTimeSamples;
11489822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
11499822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int NP = mNumPointers;
11509822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int NS = mNumSamples;
11519822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int NI = NP*NS;
11529822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int ND = NI * NUM_SAMPLE_DATA;
11532397640740e053af7ef4aa742467f723186d5ad7Dianne Hackborn        if (data.length < (ND+(NP*NUM_SAMPLE_DATA))) {
11540dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            final int NEW_ND = ND + (NP * (BASE_AVAIL_SAMPLES * NUM_SAMPLE_DATA));
11559822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            float[] newData = new float[NEW_ND];
11569822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            System.arraycopy(data, 0, newData, 0, ND);
11579822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            mDataSamples = data = newData;
11589822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        }
11592397640740e053af7ef4aa742467f723186d5ad7Dianne Hackborn        if (times.length < (NS+1)) {
11609822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            final int NEW_NS = NS + BASE_AVAIL_SAMPLES;
11619822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            long[] newHistoryTimes = new long[NEW_NS];
11629822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            System.arraycopy(times, 0, newHistoryTimes, 0, NS);
11639822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            mTimeSamples = times = newHistoryTimes;
11649822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        }
11659822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
11669822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        times[NS] = times[0];
11679822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        times[0] = eventTime;
11689822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
11699822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        System.arraycopy(data, 0, data, ND, mNumPointers*NUM_SAMPLE_DATA);
11709822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        System.arraycopy(inData, 0, data, 0, mNumPointers*NUM_SAMPLE_DATA);
11719822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
11729822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        mNumSamples = NS+1;
1173cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
11749822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        mRawX = inData[SAMPLE_X];
11759822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        mRawY = inData[SAMPLE_Y];
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMetaState |= metaState;
11770dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn
11780dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        if (DEBUG_POINTERS) {
11790dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            StringBuilder sb = new StringBuilder(128);
11800dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            sb.append("Add:");
11810dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            for (int i=0; i<mNumPointers; i++) {
11820dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append(" #");
11830dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append(mPointerIdentifiers[i]);
11840dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append("(");
11850dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append(mDataSamples[(i*NUM_SAMPLE_DATA) + SAMPLE_X]);
11860dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append(",");
11870dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append(mDataSamples[(i*NUM_SAMPLE_DATA) + SAMPLE_Y]);
11880dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append(")");
11890dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            }
11900dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            Log.v("MotionEvent", sb.toString());
11910dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        }
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1193cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String toString() {
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return "MotionEvent{" + Integer.toHexString(System.identityHashCode(this))
11979822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            + " action=" + mAction + " x=" + getX()
11989822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            + " y=" + getY() + " pressure=" + getPressure() + " size=" + getSize() + "}";
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Parcelable.Creator<MotionEvent> CREATOR
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new Parcelable.Creator<MotionEvent>() {
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public MotionEvent createFromParcel(Parcel in) {
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            MotionEvent ev = obtain();
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ev.readFromParcel(in);
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ev;
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public MotionEvent[] newArray(int size) {
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new MotionEvent[size];
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int describeContents() {
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel out, int flags) {
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mDownTime);
122053071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        out.writeLong(mEventTimeNano);
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mAction);
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mMetaState);
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeFloat(mRawX);
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeFloat(mRawY);
12259822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int NP = mNumPointers;
12269822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        out.writeInt(NP);
12279822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int NS = mNumSamples;
12289822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        out.writeInt(NS);
12299822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int NI = NP*NS;
12309822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        if (NI > 0) {
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int i;
12320dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            int[] state = mPointerIdentifiers;
12330dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            for (i=0; i<NP; i++) {
12349822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn                out.writeInt(state[i]);
12359822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            }
12360dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            final int ND = NI*NUM_SAMPLE_DATA;
12379822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            float[] history = mDataSamples;
12380dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            for (i=0; i<ND; i++) {
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeFloat(history[i]);
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12419822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            long[] times = mTimeSamples;
12429822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            for (i=0; i<NS; i++) {
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(times[i]);
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeFloat(mXPrecision);
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeFloat(mYPrecision);
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mDeviceId);
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mEdgeFlags);
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void readFromParcel(Parcel in) {
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = in.readLong();
125453071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        mEventTimeNano = in.readLong();
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = in.readInt();
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMetaState = in.readInt();
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRawX = in.readFloat();
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRawY = in.readFloat();
12599822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int NP = in.readInt();
12609822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        mNumPointers = NP;
12619822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int NS = in.readInt();
12629822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        mNumSamples = NS;
12639822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int NI = NP*NS;
12649822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        if (NI > 0) {
12650dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            int[] ids = mPointerIdentifiers;
12660dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            if (ids.length < NP) {
12670dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                mPointerIdentifiers = ids = new int[NP];
12689822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            }
12690dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            for (int i=0; i<NP; i++) {
12700dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                ids[i] = in.readInt();
12719822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            }
12729822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            float[] history = mDataSamples;
12730dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            final int ND = NI*NUM_SAMPLE_DATA;
12740dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            if (history.length < ND) {
12750dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                mDataSamples = history = new float[ND];
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12770dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            for (int i=0; i<ND; i++) {
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                history[i] = in.readFloat();
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12809822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            long[] times = mTimeSamples;
12819822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            if (times == null || times.length < NS) {
12829822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn                mTimeSamples = times = new long[NS];
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12849822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            for (int i=0; i<NS; i++) {
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                times[i] = in.readLong();
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mXPrecision = in.readFloat();
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mYPrecision = in.readFloat();
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDeviceId = in.readInt();
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEdgeFlags = in.readInt();
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1295