MotionEvent.java revision d41ba666d12a24ee4624ea9a009151e6165e3775
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    /**
790dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Synonym for {@link #ACTION_POINTER_DOWN} with
800dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #ACTION_POINTER_ID_MASK} of 0: the primary pointer has gone done.
819822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
829822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public static final int ACTION_POINTER_1_DOWN   = ACTION_POINTER_DOWN | 0x0000;
839822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
849822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
850dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Synonym for {@link #ACTION_POINTER_DOWN} with
860dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #ACTION_POINTER_ID_MASK} of 1: the secondary pointer has gone done.
879822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
889822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public static final int ACTION_POINTER_2_DOWN   = ACTION_POINTER_DOWN | 0x0100;
899822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
909822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
910dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Synonym for {@link #ACTION_POINTER_DOWN} with
920dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #ACTION_POINTER_ID_MASK} of 2: the tertiary pointer has gone done.
939822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
949822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public static final int ACTION_POINTER_3_DOWN   = ACTION_POINTER_DOWN | 0x0200;
959822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
969822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
979822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * A non-primary pointer has gone up.  The bits in
980dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #ACTION_POINTER_ID_MASK} indicate which pointer changed.
999822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
1009822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public static final int ACTION_POINTER_UP       = 6;
1019822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1029822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
1030dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Synonym for {@link #ACTION_POINTER_UP} with
1040dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #ACTION_POINTER_ID_MASK} of 0: the primary pointer has gone up.
1059822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
1069822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public static final int ACTION_POINTER_1_UP     = ACTION_POINTER_UP | 0x0000;
1079822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1089822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
1090dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Synonym for {@link #ACTION_POINTER_UP} with
1100dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #ACTION_POINTER_ID_MASK} of 1: the secondary pointer has gone up.
1119822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
1129822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public static final int ACTION_POINTER_2_UP     = ACTION_POINTER_UP | 0x0100;
1139822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1149822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
1150dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Synonym for {@link #ACTION_POINTER_UP} with
1160dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #ACTION_POINTER_ID_MASK} of 2: the tertiary pointer has gone up.
1179822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
1189822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public static final int ACTION_POINTER_3_UP     = ACTION_POINTER_UP | 0x0200;
1199822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1209822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
1219822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Bits in the action code that represent a pointer ID, used with
1229822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * {@link #ACTION_POINTER_DOWN} and {@link #ACTION_POINTER_UP}.  Pointer IDs
1230dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * start at 0, with 0 being the primary (first) pointer in the motion.  Note
1240dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * that this not <em>not</em> an index into the array of pointer values,
1250dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * which is compacted to only contain pointers that are down; the pointer
1260dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * ID for a particular index can be found with {@link #findPointerIndex}.
1279822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
1280dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public static final int ACTION_POINTER_ID_MASK  = 0xff00;
1299822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1309822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
1319822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Bit shift for the action bits holding the pointer identifier as
1320dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * defined by {@link #ACTION_POINTER_ID_MASK}.
1339822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
1340dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public static final int ACTION_POINTER_ID_SHIFT = 8;
1359822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean TRACK_RECYCLED_LOCATION = false;
137cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Flag indicating the motion event intersected the top edge of the screen.
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int EDGE_TOP = 0x00000001;
142cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Flag indicating the motion event intersected the bottom edge of the screen.
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int EDGE_BOTTOM = 0x00000002;
147cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Flag indicating the motion event intersected the left edge of the screen.
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int EDGE_LEFT = 0x00000004;
152cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Flag indicating the motion event intersected the right edge of the screen.
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int EDGE_RIGHT = 0x00000008;
157cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
1589822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
1599822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Offset for the sample's X coordinate.
1609822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @hide
1619822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
1629822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    static public final int SAMPLE_X = 0;
1639822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1649822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
1659822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Offset for the sample's Y coordinate.
1669822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @hide
1679822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
1689822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    static public final int SAMPLE_Y = 1;
1699822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1709822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
1719822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Offset for the sample's X coordinate.
1729822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @hide
1739822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
1749822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    static public final int SAMPLE_PRESSURE = 2;
1759822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1769822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
1779822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Offset for the sample's X coordinate.
1789822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @hide
1799822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
1809822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    static public final int SAMPLE_SIZE = 3;
1819822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1829822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
1839822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Number of data items for each sample.
1849822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @hide
1859822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
1869822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    static public final int NUM_SAMPLE_DATA = 4;
1879822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1889822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    static private final int BASE_AVAIL_POINTERS = 2;
1899822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    static private final int BASE_AVAIL_SAMPLES = 8;
1909822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static private final int MAX_RECYCLED = 10;
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static private Object gRecyclerLock = new Object();
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static private int gRecyclerUsed = 0;
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static private MotionEvent gRecyclerTop = null;
195cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mDownTime;
19753071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    private long mEventTimeNano;
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mAction;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float mRawX;
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float mRawY;
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float mXPrecision;
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float mYPrecision;
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mDeviceId;
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mEdgeFlags;
2059822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    private int mMetaState;
2069822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
2079822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    // Here is the actual event data.  Note that the order of the array
2089822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    // is a little odd: the first entry is the most recent, and the ones
2099822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    // following it are the historical data from oldest to newest.  This
2109822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    // allows us to easily retrieve the most recent data, without having
2119822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    // to copy the arrays every time a new sample is added.
2129822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
2139822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    private int mNumPointers;
2149822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    private int mNumSamples;
2150dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    // Array of mNumPointers size of identifiers for each pointer of data.
2160dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    private int[] mPointerIdentifiers;
2179822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    // Array of (mNumSamples * mNumPointers * NUM_SAMPLE_DATA) size of event data.
2189822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    private float[] mDataSamples;
2199822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    // Array of mNumSamples size of time stamps.
2209822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    private long[] mTimeSamples;
2218169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private MotionEvent mNext;
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private RuntimeException mRecycledLocation;
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mRecycled;
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private MotionEvent() {
2270dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        mPointerIdentifiers = new int[BASE_AVAIL_POINTERS];
2289822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        mDataSamples = new float[BASE_AVAIL_POINTERS*BASE_AVAIL_SAMPLES*NUM_SAMPLE_DATA];
2299822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        mTimeSamples = new long[BASE_AVAIL_SAMPLES];
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
231cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static private MotionEvent obtain() {
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (gRecyclerLock) {
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (gRecyclerTop == null) {
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new MotionEvent();
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            MotionEvent ev = gRecyclerTop;
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            gRecyclerTop = ev.mNext;
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            gRecyclerUsed--;
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ev.mRecycledLocation = null;
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ev.mRecycled = false;
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ev;
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24553071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan
24653071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    /**
24753071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * Create a new MotionEvent, filling in all of the basic values that
24853071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * define the motion.
24953071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     *
25053071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param downTime The time (in ms) when the user originally pressed down to start
25153071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * a stream of position events.  This must be obtained from {@link SystemClock#uptimeMillis()}.
25253071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param eventTime  The the time (in ms) when this specific event was generated.  This
25353071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * must be obtained from {@link SystemClock#uptimeMillis()}.
25453071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param eventTimeNano  The the time (in ns) when this specific event was generated.  This
25553071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * must be obtained from {@link System#nanoTime()}.
25653071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param action The kind of action being performed -- one of either
25753071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or
25853071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * {@link #ACTION_CANCEL}.
2590dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointers The number of points that will be in this event.
2600dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param inPointerIds An array of <em>pointers</em> values providing
2610dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * an identifier for each pointer.
2620dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param inData An array of <em>pointers*NUM_SAMPLE_DATA</em> of initial
2630dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * data samples for the event.
26453071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param metaState The state of any meta / modifier keys that were in effect when
26553071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * the event was generated.
26653071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param xPrecision The precision of the X coordinate being reported.
26753071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param yPrecision The precision of the Y coordinate being reported.
26853071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param deviceId The id for the device that this event came from.  An id of
26953071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * zero indicates that the event didn't come from a physical device; other
27053071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * numbers are arbitrary and you shouldn't depend on the values.
27153071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param edgeFlags A bitfield indicating which edges, if any, where touched by this
27253071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * MotionEvent.
27353071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     *
27453071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @hide
27553071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     */
27653071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    static public MotionEvent obtainNano(long downTime, long eventTime, long eventTimeNano,
2770dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            int action, int pointers, int[] inPointerIds, float[] inData, int metaState,
27853071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan            float xPrecision, float yPrecision, int deviceId, int edgeFlags) {
27953071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        MotionEvent ev = obtain();
28053071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mDeviceId = deviceId;
28153071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mEdgeFlags = edgeFlags;
28253071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mDownTime = downTime;
28353071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mEventTimeNano = eventTimeNano;
28453071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mAction = action;
28553071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mMetaState = metaState;
286ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn        ev.mRawX = inData[SAMPLE_X];
287ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn        ev.mRawY = inData[SAMPLE_Y];
28853071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mXPrecision = xPrecision;
28953071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mYPrecision = yPrecision;
2909822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mNumPointers = pointers;
2919822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mNumSamples = 1;
2929822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
2930dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        System.arraycopy(inPointerIds, 0, ev.mPointerIdentifiers, 0, pointers);
2940dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        System.arraycopy(inData, 0, ev.mDataSamples, 0, pointers * NUM_SAMPLE_DATA);
2959822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mTimeSamples[0] = eventTime;
29653071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan
2970dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        if (DEBUG_POINTERS) {
2980dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            StringBuilder sb = new StringBuilder(128);
2990dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            sb.append("New:");
3000dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            for (int i=0; i<pointers; i++) {
3010dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append(" #");
3020dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append(ev.mPointerIdentifiers[i]);
3030dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append("(");
3040dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append(ev.mDataSamples[(i*NUM_SAMPLE_DATA) + SAMPLE_X]);
3050dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append(",");
3060dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append(ev.mDataSamples[(i*NUM_SAMPLE_DATA) + SAMPLE_Y]);
3070dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append(")");
3080dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            }
3090dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            Log.v("MotionEvent", sb.toString());
3100dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        }
3110dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn
31253071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        return ev;
31353071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    }
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new MotionEvent, filling in all of the basic values that
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * define the motion.
318cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
319cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * @param downTime The time (in ms) when the user originally pressed down to start
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a stream of position events.  This must be obtained from {@link SystemClock#uptimeMillis()}.
321cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * @param eventTime  The the time (in ms) when this specific event was generated.  This
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * must be obtained from {@link SystemClock#uptimeMillis()}.
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action The kind of action being performed -- one of either
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_CANCEL}.
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x The X coordinate of this event.
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y The Y coordinate of this event.
328cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * @param pressure The current pressure of this event.  The pressure generally
329cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * ranges from 0 (no pressure at all) to 1 (normal pressure), however
330cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * values higher than 1 may be generated depending on the calibration of
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the input device.
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param size A scaled value of the approximate size of the area being pressed when
333cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * touched with the finger. The actual value in pixels corresponding to the finger
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * touch is normalized with a device specific range of values
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and scaled to a value between 0 and 1.
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param metaState The state of any meta / modifier keys that were in effect when
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the event was generated.
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param xPrecision The precision of the X coordinate being reported.
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param yPrecision The precision of the Y coordinate being reported.
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param deviceId The id for the device that this event came from.  An id of
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * zero indicates that the event didn't come from a physical device; other
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * numbers are arbitrary and you shouldn't depend on the values.
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param edgeFlags A bitfield indicating which edges, if any, where touched by this
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * MotionEvent.
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public MotionEvent obtain(long downTime, long eventTime, int action,
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float x, float y, float pressure, float size, int metaState,
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float xPrecision, float yPrecision, int deviceId, int edgeFlags) {
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MotionEvent ev = obtain();
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mDeviceId = deviceId;
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mEdgeFlags = edgeFlags;
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mDownTime = downTime;
35353071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mEventTimeNano = eventTime * 1000000;
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mAction = action;
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mMetaState = metaState;
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mXPrecision = xPrecision;
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mYPrecision = yPrecision;
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3599822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mNumPointers = 1;
3609822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mNumSamples = 1;
3610dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        int[] pointerIds = ev.mPointerIdentifiers;
3620dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        pointerIds[0] = 0;
3639822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        float[] data = ev.mDataSamples;
3649822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_X] = ev.mRawX = x;
3659822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_Y] = ev.mRawY = y;
3669822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_PRESSURE] = pressure;
3679822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_SIZE] = size;
3689822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mTimeSamples[0] = eventTime;
3699822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
3709822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return ev;
3719822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
3729822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
3739822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
3749822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Create a new MotionEvent, filling in all of the basic values that
3759822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * define the motion.
3769822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     *
3779822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param downTime The time (in ms) when the user originally pressed down to start
3789822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * a stream of position events.  This must be obtained from {@link SystemClock#uptimeMillis()}.
3799822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param eventTime  The the time (in ms) when this specific event was generated.  This
3809822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * must be obtained from {@link SystemClock#uptimeMillis()}.
3819822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param action The kind of action being performed -- one of either
3829822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or
3839822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * {@link #ACTION_CANCEL}.
3849822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param pointers The number of pointers that are active in this event.
3859822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param x The X coordinate of this event.
3869822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param y The Y coordinate of this event.
3879822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param pressure The current pressure of this event.  The pressure generally
3889822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * ranges from 0 (no pressure at all) to 1 (normal pressure), however
3899822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * values higher than 1 may be generated depending on the calibration of
3909822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * the input device.
3919822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param size A scaled value of the approximate size of the area being pressed when
3929822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * touched with the finger. The actual value in pixels corresponding to the finger
3939822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * touch is normalized with a device specific range of values
3949822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * and scaled to a value between 0 and 1.
3959822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param metaState The state of any meta / modifier keys that were in effect when
3969822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * the event was generated.
3979822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param xPrecision The precision of the X coordinate being reported.
3989822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param yPrecision The precision of the Y coordinate being reported.
3999822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param deviceId The id for the device that this event came from.  An id of
4009822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * zero indicates that the event didn't come from a physical device; other
4019822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * numbers are arbitrary and you shouldn't depend on the values.
4029822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param edgeFlags A bitfield indicating which edges, if any, where touched by this
4039822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * MotionEvent.
4049822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
4059822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    static public MotionEvent obtain(long downTime, long eventTime, int action,
4069822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            int pointers, float x, float y, float pressure, float size, int metaState,
4079822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            float xPrecision, float yPrecision, int deviceId, int edgeFlags) {
4089822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        MotionEvent ev = obtain();
4099822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mDeviceId = deviceId;
4109822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mEdgeFlags = edgeFlags;
4119822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mDownTime = downTime;
4129822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mEventTimeNano = eventTime * 1000000;
4139822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mAction = action;
4149822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mNumPointers = pointers;
4159822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mMetaState = metaState;
4169822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mXPrecision = xPrecision;
4179822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mYPrecision = yPrecision;
4189822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
4199822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mNumPointers = 1;
4209822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mNumSamples = 1;
4210dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        int[] pointerIds = ev.mPointerIdentifiers;
4220dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        pointerIds[0] = 0;
4239822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        float[] data = ev.mDataSamples;
4249822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_X] = ev.mRawX = x;
4259822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_Y] = ev.mRawY = y;
4269822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_PRESSURE] = pressure;
4279822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_SIZE] = size;
4289822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mTimeSamples[0] = eventTime;
4299822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ev;
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
432cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new MotionEvent, filling in a subset of the basic motion
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * values.  Those not specified here are: device id (always 0), pressure
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and size (always 1), x and y precision (always 1), and edgeFlags (always 0).
437cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
438cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * @param downTime The time (in ms) when the user originally pressed down to start
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a stream of position events.  This must be obtained from {@link SystemClock#uptimeMillis()}.
440cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * @param eventTime  The the time (in ms) when this specific event was generated.  This
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * must be obtained from {@link SystemClock#uptimeMillis()}.
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action The kind of action being performed -- one of either
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_CANCEL}.
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x The X coordinate of this event.
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y The Y coordinate of this event.
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param metaState The state of any meta / modifier keys that were in effect when
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the event was generated.
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public MotionEvent obtain(long downTime, long eventTime, int action,
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float x, float y, int metaState) {
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MotionEvent ev = obtain();
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mDeviceId = 0;
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mEdgeFlags = 0;
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mDownTime = downTime;
45653071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mEventTimeNano = eventTime * 1000000;
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mAction = action;
4589822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mNumPointers = 1;
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mMetaState = metaState;
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mXPrecision = 1.0f;
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mYPrecision = 1.0f;
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4639822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mNumPointers = 1;
4649822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mNumSamples = 1;
4650dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        int[] pointerIds = ev.mPointerIdentifiers;
4660dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        pointerIds[0] = 0;
4679822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        float[] data = ev.mDataSamples;
4689822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_X] = ev.mRawX = x;
4699822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_Y] = ev.mRawY = y;
4709822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_PRESSURE] = 1.0f;
4719822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_SIZE] = 1.0f;
4729822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mTimeSamples[0] = eventTime;
4739822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ev;
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4768169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima
4778169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima    /**
47864f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima     * Scales down the coordination of this event by the given scale.
4798169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima     *
4808169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima     * @hide
4818169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima     */
4828169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima    public void scale(float scale) {
48364f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        mRawX *= scale;
48464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        mRawY *= scale;
48564f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        mXPrecision *= scale;
48664f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima        mYPrecision *= scale;
4879822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        float[] history = mDataSamples;
4889822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int length = mNumPointers * mNumSamples * NUM_SAMPLE_DATA;
4899822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        for (int i = 0; i < length; i += NUM_SAMPLE_DATA) {
4909822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            history[i + SAMPLE_X] *= scale;
4919822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            history[i + SAMPLE_Y] *= scale;
4929822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            // no need to scale pressure
4939822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            history[i + SAMPLE_SIZE] *= scale;    // TODO: square this?
4948169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima        }
4958169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima    }
4968169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new MotionEvent, copying from an existing one.
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public MotionEvent obtain(MotionEvent o) {
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        MotionEvent ev = obtain();
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mDeviceId = o.mDeviceId;
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mEdgeFlags = o.mEdgeFlags;
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mDownTime = o.mDownTime;
50553071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mEventTimeNano = o.mEventTimeNano;
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mAction = o.mAction;
5079822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mNumPointers = o.mNumPointers;
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mRawX = o.mRawX;
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mRawY = o.mRawY;
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mMetaState = o.mMetaState;
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mXPrecision = o.mXPrecision;
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mYPrecision = o.mYPrecision;
5139822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
5140dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        final int NS = ev.mNumSamples = o.mNumSamples;
5150dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        if (ev.mTimeSamples.length >= NS) {
5160dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            System.arraycopy(o.mTimeSamples, 0, ev.mTimeSamples, 0, NS);
5179822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        } else {
5189822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            ev.mTimeSamples = (long[])o.mTimeSamples.clone();
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5209822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
5210dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        final int NP = (ev.mNumPointers=o.mNumPointers);
5220dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        if (ev.mPointerIdentifiers.length >= NP) {
5230dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            System.arraycopy(o.mPointerIdentifiers, 0, ev.mPointerIdentifiers, 0, NP);
5249822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        } else {
5250dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            ev.mPointerIdentifiers = (int[])o.mPointerIdentifiers.clone();
5269822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        }
5279822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
5280dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        final int ND = NP * NS * NUM_SAMPLE_DATA;
52918a081e68441a098fe0a1a6283439913cfb6b0caOwen Lin        if (ev.mDataSamples.length >= ND) {
5309822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            System.arraycopy(o.mDataSamples, 0, ev.mDataSamples, 0, ND);
5319822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        } else {
5329822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            ev.mDataSamples = (float[])o.mDataSamples.clone();
5339822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        }
5349822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ev;
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
537cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Recycle the MotionEvent, to be re-used by a later caller.  After calling
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this function you must not ever touch the event again.
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void recycle() {
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Ensure recycle is only called once!
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (TRACK_RECYCLED_LOCATION) {
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mRecycledLocation != null) {
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException(toString() + " recycled twice!", mRecycledLocation);
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecycledLocation = new RuntimeException("Last recycled here");
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (mRecycled) {
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException(toString() + " recycled twice!");
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //Log.w("MotionEvent", "Recycling event " + this, mRecycledLocation);
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (gRecyclerLock) {
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (gRecyclerUsed < MAX_RECYCLED) {
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                gRecyclerUsed++;
5579822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn                mNumSamples = 0;
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mNext = gRecyclerTop;
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                gRecyclerTop = this;
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
563cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the kind of action being performed -- one of either
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_CANCEL}.
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getAction() {
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAction;
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
574cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * Returns the time (in ms) when the user originally pressed down to start
575cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * a stream of position events.
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final long getDownTime() {
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDownTime;
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the time (in ms) when this specific event was generated.
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final long getEventTime() {
5859822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return mTimeSamples[0];
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
58953071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * Returns the time (in ns) when this specific event was generated.
59053071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * The value is in nanosecond precision but it may not have nanosecond accuracy.
59153071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     *
59253071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @hide
59353071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     */
59453071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    public final long getEventTimeNano() {
59553071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        return mEventTimeNano;
59653071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    }
59753071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan
59853071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    /**
5990dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getX(int)} for the first pointer index (may be an
6000dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final float getX() {
6039822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return mDataSamples[SAMPLE_X];
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6070dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getY(int)} for the first pointer index (may be an
6080dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final float getY() {
6119822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return mDataSamples[SAMPLE_Y];
6129822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
6139822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
6149822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
6150dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getPressure(int)} for the first pointer index (may be an
6160dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
6179822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
6189822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public final float getPressure() {
6199822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return mDataSamples[SAMPLE_PRESSURE];
6209822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
6219822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
6229822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
6230dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getSize(int)} for the first pointer index (may be an
6240dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
6259822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
6269822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public final float getSize() {
6279822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return mDataSamples[SAMPLE_SIZE];
6289822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
6299822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
6309822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
6310dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * The number of pointers of data contained in this event.  Always
6320dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * >= 1.
6330dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     */
6340dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final int getPointerCount() {
6350dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        return mNumPointers;
6360dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    }
6370dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn
6380dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    /**
6390dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Return the pointer identifier associated with a particular pointer
6400dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * data index is this event.  The identifier tells you the actual pointer
6410dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * number associated with the data, accounting for individual pointers
6420dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * going up and down since the start of the current gesture.
6430dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
6440dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
6450dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     */
646d41ba666d12a24ee4624ea9a009151e6165e3775Dianne Hackborn    public final int getPointerId(int pointerIndex) {
647d41ba666d12a24ee4624ea9a009151e6165e3775Dianne Hackborn        return mPointerIdentifiers[pointerIndex];
6480dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    }
6490dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn
6500dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    /**
6510dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Given a pointer identifier, find the index of its data in the event.
6520dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     *
6530dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerId The identifier of the pointer to be found.
6540dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @return Returns either the index of the pointer (for use with
6550dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getX(int) et al.), or -1 if there is no data available for
6560dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * that pointer identifier.
6570dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     */
6580dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final int findPointerIndex(int pointerId) {
6590dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        int i = mNumPointers;
6600dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        while (i > 0) {
6610dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            i--;
6620dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            if (mPointerIdentifiers[i] == pointerId) {
6630dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                return i;
6640dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            }
6650dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        }
6660dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        return -1;
6670dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    }
6680dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn
6690dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    /**
6700dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns the X coordinate of this event for the given pointer
6710dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * <em>index</em> (use {@link #getPointerId(int)} to find the pointer
6720dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * identifier for this index).
6739822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Whole numbers are pixels; the
6749822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * value may have a fraction for input devices that are sub-pixel precise.
6750dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
6760dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
6779822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
6780dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getX(int pointerIndex) {
6790dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        return mDataSamples[(pointerIndex*NUM_SAMPLE_DATA) + SAMPLE_X];
6809822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
6819822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
6829822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
6830dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns the Y coordinate of this event for the given pointer
6840dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * <em>index</em> (use {@link #getPointerId(int)} to find the pointer
6850dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * identifier for this index).
6869822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Whole numbers are pixels; the
6879822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * value may have a fraction for input devices that are sub-pixel precise.
6880dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
6890dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
6909822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
6910dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getY(int pointerIndex) {
6920dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        return mDataSamples[(pointerIndex*NUM_SAMPLE_DATA) + SAMPLE_Y];
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6960dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns the current pressure of this event for the given pointer
6970dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * <em>index</em> (use {@link #getPointerId(int)} to find the pointer
6980dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * identifier for this index).
6999822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * The pressure generally
700cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * ranges from 0 (no pressure at all) to 1 (normal pressure), however
701cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * values higher than 1 may be generated depending on the calibration of
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the input device.
7030dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
7040dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7060dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getPressure(int pointerIndex) {
7070dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        return mDataSamples[(pointerIndex*NUM_SAMPLE_DATA) + SAMPLE_PRESSURE];
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7110dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns a scaled value of the approximate size for the given pointer
7120dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * <em>index</em> (use {@link #getPointerId(int)} to find the pointer
7130dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * identifier for this index).
7140dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * This represents some approximation of the area of the screen being
7150dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * pressed; the actual value in pixels corresponding to the
7169822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * touch is normalized with the device specific range of values
717cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * and scaled to a value between 0 and 1. The value of size can be used to
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * determine fat touch events.
7190dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
7200dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7220dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getSize(int pointerIndex) {
7230dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        return mDataSamples[(pointerIndex*NUM_SAMPLE_DATA) + SAMPLE_SIZE];
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the state of any meta / modifier keys that were in effect when
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the event was generated.  This is the same values as those
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned by {@link KeyEvent#getMetaState() KeyEvent.getMetaState}.
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return an integer in which each bit set to 1 represents a pressed
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         meta key
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see KeyEvent#getMetaState()
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getMetaState() {
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mMetaState;
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the original raw X coordinate of this event.  For touch
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * events on the screen, this is the original location of the event
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on the screen, before it had been adjusted for the containing window
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and views.
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final float getRawX() {
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRawX;
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the original raw Y coordinate of this event.  For touch
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * events on the screen, this is the original location of the event
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on the screen, before it had been adjusted for the containing window
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and views.
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final float getRawY() {
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRawY;
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the precision of the X coordinates being reported.  You can
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * multiple this number with {@link #getX} to find the actual hardware
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value of the X coordinate.
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the precision of X coordinates being reported.
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final float getXPrecision() {
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mXPrecision;
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
769cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the precision of the Y coordinates being reported.  You can
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * multiple this number with {@link #getY} to find the actual hardware
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value of the Y coordinate.
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the precision of Y coordinates being reported.
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final float getYPrecision() {
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mYPrecision;
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
779cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the number of historical points in this event.  These are
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * movements that have occurred between this event and the previous event.
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This only applies to ACTION_MOVE events -- all other actions will have
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a size of 0.
785cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the number of historical points in the event.
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getHistorySize() {
7899822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return mNumSamples - 1;
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
791cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the time that a historical movement occurred between this event
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and the previous event.  Only applies to ACTION_MOVE events.
795cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pos Which historical value to return; must be less than
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getHistorySize}
798cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getHistorySize
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getEventTime
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final long getHistoricalEventTime(int pos) {
8039822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return mTimeSamples[pos + 1];
8049822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
8059822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
8069822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
8070dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getHistoricalX(int)} for the first pointer index (may be an
8080dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
8099822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
8109822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public final float getHistoricalX(int pos) {
8119822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return mDataSamples[((pos + 1) * NUM_SAMPLE_DATA * mNumPointers) + SAMPLE_X];
8129822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
8139822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
8149822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
8150dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getHistoricalY(int)} for the first pointer index (may be an
8160dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
8179822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
8189822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public final float getHistoricalY(int pos) {
8199822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return mDataSamples[((pos + 1) * NUM_SAMPLE_DATA * mNumPointers) + SAMPLE_Y];
8209822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
8219822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
8229822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
8230dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getHistoricalPressure(int)} for the first pointer index (may be an
8240dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
8259822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
8269822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public final float getHistoricalPressure(int pos) {
8279822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return mDataSamples[((pos + 1) * NUM_SAMPLE_DATA * mNumPointers) + SAMPLE_PRESSURE];
8289822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
8299822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
8309822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
8310dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getHistoricalSize(int)} for the first pointer index (may be an
8320dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
8339822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
8349822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public final float getHistoricalSize(int pos) {
8359822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return mDataSamples[((pos + 1) * NUM_SAMPLE_DATA * mNumPointers) + SAMPLE_SIZE];
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
837cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8390dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns a historical X coordinate, as per {@link #getX(int)}, that
8400dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * occurred between this event and the previous event for the given pointer.
8410dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Only applies to ACTION_MOVE events.
842cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
8430dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
8440dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pos Which historical value to return; must be less than
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getHistorySize}
847cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getHistorySize
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getX
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8510dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getHistoricalX(int pointerIndex, int pos) {
8529822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return mDataSamples[((pos + 1) * NUM_SAMPLE_DATA * mNumPointers)
8530dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                            + (pointerIndex * NUM_SAMPLE_DATA) + SAMPLE_X];
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
855cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8570dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns a historical Y coordinate, as per {@link #getY(int)}, that
8580dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * occurred between this event and the previous event for the given pointer.
8590dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Only applies to ACTION_MOVE events.
860cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
8610dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
8620dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pos Which historical value to return; must be less than
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getHistorySize}
865cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getHistorySize
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getY
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8690dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getHistoricalY(int pointerIndex, int pos) {
8709822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return mDataSamples[((pos + 1) * NUM_SAMPLE_DATA * mNumPointers)
8710dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                            + (pointerIndex * NUM_SAMPLE_DATA) + SAMPLE_Y];
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
873cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8750dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns a historical pressure coordinate, as per {@link #getPressure(int)},
8760dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * that occurred between this event and the previous event for the given
8770dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * pointer.  Only applies to ACTION_MOVE events.
878cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
8790dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
8800dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pos Which historical value to return; must be less than
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getHistorySize}
8830dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     *
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getHistorySize
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getPressure
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8870dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getHistoricalPressure(int pointerIndex, int pos) {
8889822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return mDataSamples[((pos + 1) * NUM_SAMPLE_DATA * mNumPointers)
8890dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                            + (pointerIndex * NUM_SAMPLE_DATA) + SAMPLE_PRESSURE];
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
891cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8930dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns a historical size coordinate, as per {@link #getSize(int)}, that
8940dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * occurred between this event and the previous event for the given pointer.
8950dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Only applies to ACTION_MOVE events.
896cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
8970dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
8980dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pos Which historical value to return; must be less than
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getHistorySize}
9010dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     *
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getHistorySize
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getSize
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9050dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getHistoricalSize(int pointerIndex, int pos) {
9069822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return mDataSamples[((pos + 1) * NUM_SAMPLE_DATA * mNumPointers)
9070dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                            + (pointerIndex * NUM_SAMPLE_DATA) + SAMPLE_SIZE];
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
909cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the id for the device that this event came from.  An id of
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * zero indicates that the event didn't come from a physical device; other
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * numbers are arbitrary and you shouldn't depend on the values.
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getDeviceId() {
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDeviceId;
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
918cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns a bitfield indicating which edges, if any, where touched by this
921cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * MotionEvent. For touch events, clients can use this to determine if the
922cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * user's finger was touching the edge of the display.
923cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EDGE_LEFT
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EDGE_TOP
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EDGE_RIGHT
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EDGE_BOTTOM
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getEdgeFlags() {
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mEdgeFlags;
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
932cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the bitfield indicating which edges, if any, where touched by this
936cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * MotionEvent.
937cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getEdgeFlags()
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setEdgeFlags(int flags) {
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEdgeFlags = flags;
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets this event's action.
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setAction(int action) {
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = action;
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Adjust this event's location.
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param deltaX Amount to add to the current X coordinate of the event.
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param deltaY Amount to add to the current Y coordinate of the event.
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void offsetLocation(float deltaX, float deltaY) {
9579822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int N = mNumPointers*mNumSamples*4;
9589822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final float[] pos = mDataSamples;
9599822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        for (int i=0; i<N; i+=NUM_SAMPLE_DATA) {
9609822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            pos[i+SAMPLE_X] += deltaX;
9619822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            pos[i+SAMPLE_Y] += deltaY;
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
964cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set this event's location.  Applies {@link #offsetLocation} with a
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * delta from the current location to the given new location.
968cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x New absolute X location.
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y New absolute Y location.
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setLocation(float x, float y) {
9739822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        float deltaX = x-mDataSamples[SAMPLE_X];
9749822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        float deltaY = y-mDataSamples[SAMPLE_Y];
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (deltaX != 0 || deltaY != 0) {
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            offsetLocation(deltaX, deltaY);
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
979cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Add a new movement to the batch of movements in this event.  The event's
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * current location, position and size is updated to the new values.  In
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the future, the current values in the event will be added to a list of
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * historic values.
985cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
9869822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param eventTime The time stamp for this data.
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x The new X position.
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y The new Y position.
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pressure The new pressure.
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param size The new size.
9919822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param metaState Meta key state.
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void addBatch(long eventTime, float x, float y,
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float pressure, float size, int metaState) {
9959822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        float[] data = mDataSamples;
9969822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        long[] times = mTimeSamples;
9979822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
9989822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int NP = mNumPointers;
9999822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int NS = mNumSamples;
10009822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int NI = NP*NS;
10019822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int ND = NI * NUM_SAMPLE_DATA;
10020dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        if (data.length <= ND) {
10030dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            final int NEW_ND = ND + (NP * (BASE_AVAIL_SAMPLES * NUM_SAMPLE_DATA));
10049822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            float[] newData = new float[NEW_ND];
10059822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            System.arraycopy(data, 0, newData, 0, ND);
10069822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            mDataSamples = data = newData;
10079822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        }
10089822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        if (times.length <= NS) {
10099822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            final int NEW_NS = NS + BASE_AVAIL_SAMPLES;
10109822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            long[] newHistoryTimes = new long[NEW_NS];
10119822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            System.arraycopy(times, 0, newHistoryTimes, 0, NS);
10129822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            mTimeSamples = times = newHistoryTimes;
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10149822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
10159822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        times[NS] = times[0];
10169822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        times[0] = eventTime;
10179822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
10189822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int pos = NS*NUM_SAMPLE_DATA;
10199822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[pos+SAMPLE_X] = data[SAMPLE_X];
10209822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[pos+SAMPLE_Y] = data[SAMPLE_Y];
10219822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[pos+SAMPLE_PRESSURE] = data[SAMPLE_PRESSURE];
10229822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[pos+SAMPLE_SIZE] = data[SAMPLE_SIZE];
10239822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_X] = x;
10249822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_Y] = y;
10259822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_PRESSURE] = pressure;
10269822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        data[SAMPLE_SIZE] = size;
10279822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        mNumSamples = NS+1;
1028cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
10299822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        mRawX = x;
10309822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        mRawY = y;
10319822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        mMetaState |= metaState;
10329822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
1033cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
10349822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
10359822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Add a new movement to the batch of movements in this event.  The
10369822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * input data must contain (NUM_SAMPLE_DATA * {@link #getPointerCount()})
10379822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * samples of data.
10389822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     *
10399822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param eventTime The time stamp for this data.
10409822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param inData The actual data.
10419822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param metaState Meta key state.
10429822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     *
10439822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @hide
10449822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
10459822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public final void addBatch(long eventTime, float[] inData, int metaState) {
10469822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        float[] data = mDataSamples;
10479822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        long[] times = mTimeSamples;
10489822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
10499822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int NP = mNumPointers;
10509822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int NS = mNumSamples;
10519822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int NI = NP*NS;
10529822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int ND = NI * NUM_SAMPLE_DATA;
10530dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        if (data.length <= ND) {
10540dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            final int NEW_ND = ND + (NP * (BASE_AVAIL_SAMPLES * NUM_SAMPLE_DATA));
10559822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            float[] newData = new float[NEW_ND];
10569822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            System.arraycopy(data, 0, newData, 0, ND);
10579822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            mDataSamples = data = newData;
10589822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        }
10599822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        if (times.length <= NS) {
10609822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            final int NEW_NS = NS + BASE_AVAIL_SAMPLES;
10619822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            long[] newHistoryTimes = new long[NEW_NS];
10629822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            System.arraycopy(times, 0, newHistoryTimes, 0, NS);
10639822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            mTimeSamples = times = newHistoryTimes;
10649822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        }
10659822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
10669822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        times[NS] = times[0];
10679822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        times[0] = eventTime;
10689822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
10699822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        System.arraycopy(data, 0, data, ND, mNumPointers*NUM_SAMPLE_DATA);
10709822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        System.arraycopy(inData, 0, data, 0, mNumPointers*NUM_SAMPLE_DATA);
10719822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
10729822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        mNumSamples = NS+1;
1073cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
10749822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        mRawX = inData[SAMPLE_X];
10759822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        mRawY = inData[SAMPLE_Y];
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMetaState |= metaState;
10770dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn
10780dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        if (DEBUG_POINTERS) {
10790dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            StringBuilder sb = new StringBuilder(128);
10800dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            sb.append("Add:");
10810dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            for (int i=0; i<mNumPointers; i++) {
10820dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append(" #");
10830dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append(mPointerIdentifiers[i]);
10840dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append("(");
10850dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append(mDataSamples[(i*NUM_SAMPLE_DATA) + SAMPLE_X]);
10860dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append(",");
10870dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append(mDataSamples[(i*NUM_SAMPLE_DATA) + SAMPLE_Y]);
10880dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                sb.append(")");
10890dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            }
10900dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            Log.v("MotionEvent", sb.toString());
10910dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        }
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1093cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String toString() {
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return "MotionEvent{" + Integer.toHexString(System.identityHashCode(this))
10979822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            + " action=" + mAction + " x=" + getX()
10989822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            + " y=" + getY() + " pressure=" + getPressure() + " size=" + getSize() + "}";
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Parcelable.Creator<MotionEvent> CREATOR
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new Parcelable.Creator<MotionEvent>() {
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public MotionEvent createFromParcel(Parcel in) {
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            MotionEvent ev = obtain();
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ev.readFromParcel(in);
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ev;
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public MotionEvent[] newArray(int size) {
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new MotionEvent[size];
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int describeContents() {
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel out, int flags) {
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mDownTime);
112053071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        out.writeLong(mEventTimeNano);
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mAction);
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mMetaState);
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeFloat(mRawX);
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeFloat(mRawY);
11259822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int NP = mNumPointers;
11269822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        out.writeInt(NP);
11279822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int NS = mNumSamples;
11289822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        out.writeInt(NS);
11299822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int NI = NP*NS;
11309822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        if (NI > 0) {
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int i;
11320dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            int[] state = mPointerIdentifiers;
11330dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            for (i=0; i<NP; i++) {
11349822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn                out.writeInt(state[i]);
11359822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            }
11360dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            final int ND = NI*NUM_SAMPLE_DATA;
11379822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            float[] history = mDataSamples;
11380dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            for (i=0; i<ND; i++) {
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeFloat(history[i]);
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11419822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            long[] times = mTimeSamples;
11429822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            for (i=0; i<NS; i++) {
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(times[i]);
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeFloat(mXPrecision);
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeFloat(mYPrecision);
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mDeviceId);
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mEdgeFlags);
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void readFromParcel(Parcel in) {
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = in.readLong();
115453071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        mEventTimeNano = in.readLong();
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = in.readInt();
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMetaState = in.readInt();
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRawX = in.readFloat();
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRawY = in.readFloat();
11599822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int NP = in.readInt();
11609822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        mNumPointers = NP;
11619822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int NS = in.readInt();
11629822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        mNumSamples = NS;
11639822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int NI = NP*NS;
11649822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        if (NI > 0) {
11650dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            int[] ids = mPointerIdentifiers;
11660dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            if (ids.length < NP) {
11670dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                mPointerIdentifiers = ids = new int[NP];
11689822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            }
11690dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            for (int i=0; i<NP; i++) {
11700dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                ids[i] = in.readInt();
11719822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            }
11729822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            float[] history = mDataSamples;
11730dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            final int ND = NI*NUM_SAMPLE_DATA;
11740dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            if (history.length < ND) {
11750dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                mDataSamples = history = new float[ND];
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11770dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            for (int i=0; i<ND; i++) {
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                history[i] = in.readFloat();
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11809822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            long[] times = mTimeSamples;
11819822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            if (times == null || times.length < NS) {
11829822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn                mTimeSamples = times = new long[NS];
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11849822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            for (int i=0; i<NS; i++) {
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                times[i] = in.readLong();
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mXPrecision = in.readFloat();
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mYPrecision = in.readFloat();
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDeviceId = in.readInt();
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEdgeFlags = in.readInt();
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1195