MotionEvent.java revision 9e2ad36be87f2703b3d737189944d82f93bd4f27
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;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Object used to report movement (mouse, pen, finger, trackball) events.  This
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * class may hold either absolute or relative movements, depending on what
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it is being used for.
27c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown *
28c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * Refer to {@link InputDevice} for information about how different kinds of
29c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown * input devices and sources represent pointer coordinates.
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
31c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brownpublic final class MotionEvent extends InputEvent implements Parcelable {
325c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    private static final long MS_PER_NS = 1000000;
330dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
359822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Bit mask of the parts of the action code that are the action itself.
369822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
379822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public static final int ACTION_MASK             = 0xff;
389822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
399822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Constant for {@link #getAction}: A pressed gesture has started, the
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * motion contains the initial starting location.
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ACTION_DOWN             = 0;
449822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Constant for {@link #getAction}: A pressed gesture has finished, the
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * motion contains the final release location as well as any intermediate
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * points since the last down or move event.
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ACTION_UP               = 1;
519822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Constant for {@link #getAction}: A change has happened during a
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * press gesture (between {@link #ACTION_DOWN} and {@link #ACTION_UP}).
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The motion contains the most recent point, as well as any intermediate
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * points since the last down or move event.
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ACTION_MOVE             = 2;
599822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Constant for {@link #getAction}: The current gesture has been aborted.
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * You will not receive any more points in it.  You should treat this as
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * an up event, but not perform any action that you normally would.
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ACTION_CANCEL           = 3;
669822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Constant for {@link #getAction}: A movement has happened outside of the
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * normal bounds of the UI element.  This does not provide a full gesture,
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * but only the initial location of the movement/touch.
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ACTION_OUTSIDE          = 4;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
749822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
759822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * A non-primary pointer has gone down.  The bits in
760dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #ACTION_POINTER_ID_MASK} indicate which pointer changed.
779822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
789822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public static final int ACTION_POINTER_DOWN     = 5;
799822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
809822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
81b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * A non-primary pointer has gone up.  The bits in
82b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * {@link #ACTION_POINTER_ID_MASK} indicate which pointer changed.
839822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
84b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    public static final int ACTION_POINTER_UP       = 6;
859822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
869822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
87b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * Bits in the action code that represent a pointer index, used with
88b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * {@link #ACTION_POINTER_DOWN} and {@link #ACTION_POINTER_UP}.  Shifting
89b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * down by {@link #ACTION_POINTER_INDEX_SHIFT} provides the actual pointer
90b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * index where the data for the pointer going up or down can be found; you can
91b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * get its identifier with {@link #getPointerId(int)} and the actual
92b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * data with {@link #getX(int)} etc.
939822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
94b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    public static final int ACTION_POINTER_INDEX_MASK  = 0xff00;
959822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
969822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
97b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * Bit shift for the action bits holding the pointer index as
98b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * defined by {@link #ACTION_POINTER_INDEX_MASK}.
999822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
100b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    public static final int ACTION_POINTER_INDEX_SHIFT = 8;
1019822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1029822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
103b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * @deprecated Use {@link #ACTION_POINTER_INDEX_MASK} to retrieve the
104b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * data index associated with {@link #ACTION_POINTER_DOWN}.
1059822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
106b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    @Deprecated
107b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    public static final int ACTION_POINTER_1_DOWN   = ACTION_POINTER_DOWN | 0x0000;
108b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn
109b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    /**
110b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * @deprecated Use {@link #ACTION_POINTER_INDEX_MASK} to retrieve the
111b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * data index associated with {@link #ACTION_POINTER_DOWN}.
112b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     */
113b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    @Deprecated
114b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    public static final int ACTION_POINTER_2_DOWN   = ACTION_POINTER_DOWN | 0x0100;
1159822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1169822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
117b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * @deprecated Use {@link #ACTION_POINTER_INDEX_MASK} to retrieve the
118b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * data index associated with {@link #ACTION_POINTER_DOWN}.
1199822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
120b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    @Deprecated
121b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    public static final int ACTION_POINTER_3_DOWN   = ACTION_POINTER_DOWN | 0x0200;
122b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn
123b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    /**
124b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * @deprecated Use {@link #ACTION_POINTER_INDEX_MASK} to retrieve the
125b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * data index associated with {@link #ACTION_POINTER_UP}.
126b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     */
127b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    @Deprecated
1289822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public static final int ACTION_POINTER_1_UP     = ACTION_POINTER_UP | 0x0000;
1299822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1309822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
131b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * @deprecated Use {@link #ACTION_POINTER_INDEX_MASK} to retrieve the
132b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * data index associated with {@link #ACTION_POINTER_UP}.
1339822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
134b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    @Deprecated
1359822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public static final int ACTION_POINTER_2_UP     = ACTION_POINTER_UP | 0x0100;
1369822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1379822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
138b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * @deprecated Use {@link #ACTION_POINTER_INDEX_MASK} to retrieve the
139b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * data index associated with {@link #ACTION_POINTER_UP}.
1409822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
141b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    @Deprecated
1429822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public static final int ACTION_POINTER_3_UP     = ACTION_POINTER_UP | 0x0200;
1439822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1449822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
145b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * @deprecated Renamed to {@link #ACTION_POINTER_INDEX_MASK} to match
146b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * the actual data contained in these bits.
1479822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
148b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    @Deprecated
1490dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public static final int ACTION_POINTER_ID_MASK  = 0xff00;
1509822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1519822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
152b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * @deprecated Renamed to {@link #ACTION_POINTER_INDEX_SHIFT} to match
153b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * the actual data contained in these bits.
1549822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
155b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    @Deprecated
1560dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public static final int ACTION_POINTER_ID_SHIFT = 8;
1579822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean TRACK_RECYCLED_LOCATION = false;
159cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Flag indicating the motion event intersected the top edge of the screen.
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int EDGE_TOP = 0x00000001;
164cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Flag indicating the motion event intersected the bottom edge of the screen.
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int EDGE_BOTTOM = 0x00000002;
169cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Flag indicating the motion event intersected the left edge of the screen.
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int EDGE_LEFT = 0x00000004;
174cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Flag indicating the motion event intersected the right edge of the screen.
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int EDGE_RIGHT = 0x00000008;
179cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
1809e2ad36be87f2703b3d737189944d82f93bd4f27Jeff Brown    /*
1819822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Offset for the sample's X coordinate.
1829822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
1836d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    static private final int SAMPLE_X = 0;
1849822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1859e2ad36be87f2703b3d737189944d82f93bd4f27Jeff Brown    /*
1869822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Offset for the sample's Y coordinate.
1879822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
1886d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    static private final int SAMPLE_Y = 1;
1899822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1909e2ad36be87f2703b3d737189944d82f93bd4f27Jeff Brown    /*
191c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Offset for the sample's pressure.
1929822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
1936d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    static private final int SAMPLE_PRESSURE = 2;
1949822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
1959e2ad36be87f2703b3d737189944d82f93bd4f27Jeff Brown    /*
196c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Offset for the sample's size
1979822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
1986d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    static private final int SAMPLE_SIZE = 3;
1999822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
2009e2ad36be87f2703b3d737189944d82f93bd4f27Jeff Brown    /*
201c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Offset for the sample's touch major axis length.
202c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
2036d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    static private final int SAMPLE_TOUCH_MAJOR = 4;
204c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
2059e2ad36be87f2703b3d737189944d82f93bd4f27Jeff Brown    /*
206c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Offset for the sample's touch minor axis length.
207c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
2086d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    static private final int SAMPLE_TOUCH_MINOR = 5;
209c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
2109e2ad36be87f2703b3d737189944d82f93bd4f27Jeff Brown    /*
211c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Offset for the sample's tool major axis length.
212c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
2136d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    static private final int SAMPLE_TOOL_MAJOR = 6;
214c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
2159e2ad36be87f2703b3d737189944d82f93bd4f27Jeff Brown    /*
216c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Offset for the sample's tool minor axis length.
217c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
2186d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    static private final int SAMPLE_TOOL_MINOR = 7;
219c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
2209e2ad36be87f2703b3d737189944d82f93bd4f27Jeff Brown    /*
221c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Offset for the sample's orientation.
222c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
2236d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    static private final int SAMPLE_ORIENTATION = 8;
224c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
2259e2ad36be87f2703b3d737189944d82f93bd4f27Jeff Brown    /*
2269822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Number of data items for each sample.
2279822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
2286d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown    static private final int NUM_SAMPLE_DATA = 9;
2299822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
2309e2ad36be87f2703b3d737189944d82f93bd4f27Jeff Brown    /*
2319e2ad36be87f2703b3d737189944d82f93bd4f27Jeff Brown     * Minimum number of pointers for which to reserve space when allocating new
2329e2ad36be87f2703b3d737189944d82f93bd4f27Jeff Brown     * motion events.  This is explicitly not a bound on the maximum number of pointers.
2331e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn     */
2349e2ad36be87f2703b3d737189944d82f93bd4f27Jeff Brown    static private final int BASE_AVAIL_POINTERS = 5;
2351e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn
2369e2ad36be87f2703b3d737189944d82f93bd4f27Jeff Brown    /*
2379e2ad36be87f2703b3d737189944d82f93bd4f27Jeff Brown     * Minimum number of samples for which to reserve space when allocating new motion events.
2389e2ad36be87f2703b3d737189944d82f93bd4f27Jeff Brown     */
2399822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    static private final int BASE_AVAIL_SAMPLES = 8;
2409822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static private final int MAX_RECYCLED = 10;
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static private Object gRecyclerLock = new Object();
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static private int gRecyclerUsed = 0;
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static private MotionEvent gRecyclerTop = null;
245cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
2465c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    private long mDownTimeNano;
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mAction;
2485c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    private float mXOffset;
2495c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    private float mYOffset;
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float mXPrecision;
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private float mYPrecision;
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mEdgeFlags;
2539822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    private int mMetaState;
2549822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
2559822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    private int mNumPointers;
2569822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    private int mNumSamples;
2575c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
2585c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    private int mLastDataSampleIndex;
2595c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    private int mLastEventTimeNanoSampleIndex;
2605c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
2610dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    // Array of mNumPointers size of identifiers for each pointer of data.
2620dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    private int[] mPointerIdentifiers;
2635c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
2649822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    // Array of (mNumSamples * mNumPointers * NUM_SAMPLE_DATA) size of event data.
2655c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    // Samples are ordered from oldest to newest.
2669822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    private float[] mDataSamples;
2675c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
2685c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    // Array of mNumSamples size of event time stamps in nanoseconds.
2695c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    // Samples are ordered from oldest to newest.
2705c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    private long[] mEventTimeNanoSamples;
2718169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private MotionEvent mNext;
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private RuntimeException mRecycledLocation;
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mRecycled;
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    private MotionEvent(int pointerCount, int sampleCount) {
27746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        mPointerIdentifiers = new int[pointerCount];
27846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        mDataSamples = new float[pointerCount * sampleCount * NUM_SAMPLE_DATA];
2795c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        mEventTimeNanoSamples = new long[sampleCount];
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
281cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
28246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    static private MotionEvent obtain(int pointerCount, int sampleCount) {
28346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        final MotionEvent ev;
28446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        synchronized (gRecyclerLock) {
28546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            if (gRecyclerTop == null) {
28646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                if (pointerCount < BASE_AVAIL_POINTERS) {
28746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                    pointerCount = BASE_AVAIL_POINTERS;
28846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                }
28946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                if (sampleCount < BASE_AVAIL_SAMPLES) {
29046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                    sampleCount = BASE_AVAIL_SAMPLES;
29146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                }
29246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown                return new MotionEvent(pointerCount, sampleCount);
29346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            }
29446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            ev = gRecyclerTop;
29546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            gRecyclerTop = ev.mNext;
2965c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            gRecyclerUsed -= 1;
29746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
29846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        ev.mRecycledLocation = null;
29946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        ev.mRecycled = false;
30046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        ev.mNext = null;
30146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
30246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        if (ev.mPointerIdentifiers.length < pointerCount) {
30346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            ev.mPointerIdentifiers = new int[pointerCount];
30446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
30546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3065c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        if (ev.mEventTimeNanoSamples.length < sampleCount) {
3075c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            ev.mEventTimeNanoSamples = new long[sampleCount];
30846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
30946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
31046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        final int neededDataSamplesLength = pointerCount * sampleCount * NUM_SAMPLE_DATA;
3115c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        if (ev.mDataSamples.length < neededDataSamplesLength) {
31246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            ev.mDataSamples = new float[neededDataSamplesLength];
31346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        }
31446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
31546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        return ev;
31646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
3175c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
31853071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    /**
31953071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * Create a new MotionEvent, filling in all of the basic values that
32053071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * define the motion.
32153071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     *
32253071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param downTime The time (in ms) when the user originally pressed down to start
32353071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * a stream of position events.  This must be obtained from {@link SystemClock#uptimeMillis()}.
324c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param eventTime The the time (in ms) when this specific event was generated.  This
32553071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * must be obtained from {@link SystemClock#uptimeMillis()}.
32653071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param action The kind of action being performed -- one of either
32753071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or
32853071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * {@link #ACTION_CANCEL}.
3290dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointers The number of points that will be in this event.
330c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param pointerIds An array of <em>pointers</em> values providing
3310dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * an identifier for each pointer.
332c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param pointerCoords An array of <em>pointers</em> values providing
333c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * a {@link PointerCoords} coordinate object for each pointer.
33453071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param metaState The state of any meta / modifier keys that were in effect when
33553071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * the event was generated.
33653071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param xPrecision The precision of the X coordinate being reported.
33753071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param yPrecision The precision of the Y coordinate being reported.
33853071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param deviceId The id for the device that this event came from.  An id of
33953071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * zero indicates that the event didn't come from a physical device; other
34053071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * numbers are arbitrary and you shouldn't depend on the values.
34153071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @param edgeFlags A bitfield indicating which edges, if any, where touched by this
34253071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * MotionEvent.
343c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param source The source of this event.
34453071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     */
345c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    static public MotionEvent obtain(long downTime, long eventTime,
346c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            int action, int pointers, int[] pointerIds, PointerCoords[] pointerCoords,
347c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            int metaState, float xPrecision, float yPrecision, int deviceId,
348c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            int edgeFlags, int source) {
3495c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        MotionEvent ev = obtain(pointers, 1);
35053071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mDeviceId = deviceId;
351c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        ev.mSource = source;
35253071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mEdgeFlags = edgeFlags;
3535c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mDownTimeNano = downTime * MS_PER_NS;
35453071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mAction = action;
35553071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mMetaState = metaState;
3565c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mXOffset = 0;
3575c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mYOffset = 0;
35853071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mXPrecision = xPrecision;
35953071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        ev.mYPrecision = yPrecision;
3605c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
3619822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mNumPointers = pointers;
3629822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mNumSamples = 1;
3639822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
3645c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mLastDataSampleIndex = 0;
3655c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mLastEventTimeNanoSampleIndex = 0;
3661e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn
367c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        System.arraycopy(pointerIds, 0, ev.mPointerIdentifiers, 0, pointers);
3681e8dfc73fba88766ee3c25ae7b3bb1850319b11dDianne Hackborn
369c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        ev.mEventTimeNanoSamples[0] = eventTime * MS_PER_NS;
3705c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
371c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        ev.setPointerCoordsAtSampleIndex(0, pointerCoords);
3720dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn
37353071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan        return ev;
37453071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    }
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new MotionEvent, filling in all of the basic values that
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * define the motion.
379cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
380cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * @param downTime The time (in ms) when the user originally pressed down to start
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a stream of position events.  This must be obtained from {@link SystemClock#uptimeMillis()}.
382cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * @param eventTime  The the time (in ms) when this specific event was generated.  This
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * must be obtained from {@link SystemClock#uptimeMillis()}.
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action The kind of action being performed -- one of either
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_CANCEL}.
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x The X coordinate of this event.
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y The Y coordinate of this event.
389cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * @param pressure The current pressure of this event.  The pressure generally
390cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * ranges from 0 (no pressure at all) to 1 (normal pressure), however
391cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * values higher than 1 may be generated depending on the calibration of
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the input device.
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param size A scaled value of the approximate size of the area being pressed when
394cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * touched with the finger. The actual value in pixels corresponding to the finger
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * touch is normalized with a device specific range of values
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and scaled to a value between 0 and 1.
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param metaState The state of any meta / modifier keys that were in effect when
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the event was generated.
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param xPrecision The precision of the X coordinate being reported.
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param yPrecision The precision of the Y coordinate being reported.
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param deviceId The id for the device that this event came from.  An id of
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * zero indicates that the event didn't come from a physical device; other
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * numbers are arbitrary and you shouldn't depend on the values.
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param edgeFlags A bitfield indicating which edges, if any, where touched by this
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * MotionEvent.
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public MotionEvent obtain(long downTime, long eventTime, int action,
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float x, float y, float pressure, float size, int metaState,
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float xPrecision, float yPrecision, int deviceId, int edgeFlags) {
4105c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        MotionEvent ev = obtain(1, 1);
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mDeviceId = deviceId;
412c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        ev.mSource = InputDevice.SOURCE_UNKNOWN;
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mEdgeFlags = edgeFlags;
4145c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mDownTimeNano = downTime * MS_PER_NS;
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mAction = action;
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mMetaState = metaState;
4175c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mXOffset = 0;
4185c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mYOffset = 0;
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mXPrecision = xPrecision;
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mYPrecision = yPrecision;
4215c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
4229822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mNumPointers = 1;
4239822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        ev.mNumSamples = 1;
4245c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
4255c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mLastDataSampleIndex = 0;
4265c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mLastEventTimeNanoSampleIndex = 0;
4275c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
4285c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mPointerIdentifiers[0] = 0;
4295c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
4305c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mEventTimeNanoSamples[0] = eventTime * MS_PER_NS;
4315c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
432c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        ev.setPointerCoordsAtSampleIndex(0, x, y, pressure, size);
4339822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        return ev;
4349822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
4359822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
4369822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
4379822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Create a new MotionEvent, filling in all of the basic values that
4389822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * define the motion.
4399822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     *
4409822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param downTime The time (in ms) when the user originally pressed down to start
4419822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * a stream of position events.  This must be obtained from {@link SystemClock#uptimeMillis()}.
4429822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param eventTime  The the time (in ms) when this specific event was generated.  This
4439822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * must be obtained from {@link SystemClock#uptimeMillis()}.
4449822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param action The kind of action being performed -- one of either
4459822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or
4469822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * {@link #ACTION_CANCEL}.
4479822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param pointers The number of pointers that are active in this event.
4489822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param x The X coordinate of this event.
4499822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param y The Y coordinate of this event.
4509822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param pressure The current pressure of this event.  The pressure generally
4519822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * ranges from 0 (no pressure at all) to 1 (normal pressure), however
4529822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * values higher than 1 may be generated depending on the calibration of
4539822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * the input device.
4549822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param size A scaled value of the approximate size of the area being pressed when
4559822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * touched with the finger. The actual value in pixels corresponding to the finger
4569822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * touch is normalized with a device specific range of values
4579822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * and scaled to a value between 0 and 1.
4589822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param metaState The state of any meta / modifier keys that were in effect when
4599822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * the event was generated.
4609822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param xPrecision The precision of the X coordinate being reported.
4619822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param yPrecision The precision of the Y coordinate being reported.
4629822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param deviceId The id for the device that this event came from.  An id of
4639822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * zero indicates that the event didn't come from a physical device; other
4649822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * numbers are arbitrary and you shouldn't depend on the values.
4659822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param edgeFlags A bitfield indicating which edges, if any, where touched by this
4669822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * MotionEvent.
4675c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown     *
4685c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown     * @deprecated Use {@link #obtain(long, long, int, float, float, float, float, int, float, float, int, int)}
4695c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown     * instead.
4709822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
4715c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    @Deprecated
4729822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    static public MotionEvent obtain(long downTime, long eventTime, int action,
4739822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            int pointers, float x, float y, float pressure, float size, int metaState,
4749822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            float xPrecision, float yPrecision, int deviceId, int edgeFlags) {
4755c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return obtain(downTime, eventTime, action, x, y, pressure, size,
4765c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                metaState, xPrecision, yPrecision, deviceId, edgeFlags);
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
478cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new MotionEvent, filling in a subset of the basic motion
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * values.  Those not specified here are: device id (always 0), pressure
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and size (always 1), x and y precision (always 1), and edgeFlags (always 0).
483cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
484cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * @param downTime The time (in ms) when the user originally pressed down to start
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a stream of position events.  This must be obtained from {@link SystemClock#uptimeMillis()}.
486cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * @param eventTime  The the time (in ms) when this specific event was generated.  This
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * must be obtained from {@link SystemClock#uptimeMillis()}.
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action The kind of action being performed -- one of either
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_CANCEL}.
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x The X coordinate of this event.
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y The Y coordinate of this event.
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param metaState The state of any meta / modifier keys that were in effect when
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the event was generated.
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public MotionEvent obtain(long downTime, long eventTime, int action,
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float x, float y, int metaState) {
4985c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return obtain(downTime, eventTime, action, x, y, 1.0f, 1.0f,
4995c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                metaState, 1.0f, 1.0f, 0, 0);
5008169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima    }
5018169daed2f7a8731d478b884b1f455c747b88478Mitsuru Oshima
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new MotionEvent, copying from an existing one.
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static public MotionEvent obtain(MotionEvent o) {
5065c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        MotionEvent ev = obtain(o.mNumPointers, o.mNumSamples);
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mDeviceId = o.mDeviceId;
508c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        ev.mSource = o.mSource;
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mEdgeFlags = o.mEdgeFlags;
5105c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mDownTimeNano = o.mDownTimeNano;
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mAction = o.mAction;
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mMetaState = o.mMetaState;
5135c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mXOffset = o.mXOffset;
5145c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mYOffset = o.mYOffset;
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mXPrecision = o.mXPrecision;
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ev.mYPrecision = o.mYPrecision;
5175c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        int numPointers = ev.mNumPointers = o.mNumPointers;
5185c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        int numSamples = ev.mNumSamples = o.mNumSamples;
5199822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
5205c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mLastDataSampleIndex = o.mLastDataSampleIndex;
5215c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mLastEventTimeNanoSampleIndex = o.mLastEventTimeNanoSampleIndex;
5229822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
5235c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        System.arraycopy(o.mPointerIdentifiers, 0, ev.mPointerIdentifiers, 0, numPointers);
5249822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
5255c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        System.arraycopy(o.mEventTimeNanoSamples, 0, ev.mEventTimeNanoSamples, 0, numSamples);
5269822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
5275c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        System.arraycopy(o.mDataSamples, 0, ev.mDataSamples, 0,
5285c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                numPointers * numSamples * NUM_SAMPLE_DATA);
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return ev;
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
531cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5338df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn     * Create a new MotionEvent, copying from an existing one, but not including
5348df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn     * any historical point information.
5358df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn     */
5368df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn    static public MotionEvent obtainNoHistory(MotionEvent o) {
5375c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        MotionEvent ev = obtain(o.mNumPointers, 1);
5388df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        ev.mDeviceId = o.mDeviceId;
539c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        ev.mSource = o.mSource;
5408df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        ev.mEdgeFlags = o.mEdgeFlags;
5415c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mDownTimeNano = o.mDownTimeNano;
5428df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        ev.mAction = o.mAction;
5438df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        ev.mMetaState = o.mMetaState;
5445c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mXOffset = o.mXOffset;
5455c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mYOffset = o.mYOffset;
5468df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        ev.mXPrecision = o.mXPrecision;
5478df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        ev.mYPrecision = o.mYPrecision;
5488df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn
5495c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        int numPointers = ev.mNumPointers = o.mNumPointers;
5508df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        ev.mNumSamples = 1;
5518df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn
5525c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mLastDataSampleIndex = 0;
5535c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mLastEventTimeNanoSampleIndex = 0;
5548df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn
5555c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        System.arraycopy(o.mPointerIdentifiers, 0, ev.mPointerIdentifiers, 0, numPointers);
5568df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn
5575c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        ev.mEventTimeNanoSamples[0] = o.mEventTimeNanoSamples[o.mLastEventTimeNanoSampleIndex];
5585c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
5595c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        System.arraycopy(o.mDataSamples, o.mLastDataSampleIndex, ev.mDataSamples, 0,
5605c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                numPointers * NUM_SAMPLE_DATA);
5618df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn        return ev;
5628df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn    }
5638df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn
5648df8b2b405c60cacf7a66c4e2ca078dd3d7ec7bdDianne Hackborn    /**
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Recycle the MotionEvent, to be re-used by a later caller.  After calling
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this function you must not ever touch the event again.
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5685c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    public final void recycle() {
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Ensure recycle is only called once!
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (TRACK_RECYCLED_LOCATION) {
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mRecycledLocation != null) {
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new RuntimeException(toString() + " recycled twice!", mRecycledLocation);
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRecycledLocation = new RuntimeException("Last recycled here");
575d28f4be870ea8850a2d4a2fe51333643f16b9ab1Jeff Brown            //Log.w("MotionEvent", "Recycling event " + this, mRecycledLocation);
576d28f4be870ea8850a2d4a2fe51333643f16b9ab1Jeff Brown        } else {
577d28f4be870ea8850a2d4a2fe51333643f16b9ab1Jeff Brown            if (mRecycled) {
578d28f4be870ea8850a2d4a2fe51333643f16b9ab1Jeff Brown                throw new RuntimeException(toString() + " recycled twice!");
579d28f4be870ea8850a2d4a2fe51333643f16b9ab1Jeff Brown            }
580d28f4be870ea8850a2d4a2fe51333643f16b9ab1Jeff Brown            mRecycled = true;
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (gRecyclerLock) {
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (gRecyclerUsed < MAX_RECYCLED) {
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                gRecyclerUsed++;
5869822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn                mNumSamples = 0;
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mNext = gRecyclerTop;
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                gRecyclerTop = this;
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5925c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
5935c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    /**
5945c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown     * Scales down the coordination of this event by the given scale.
5955c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown     *
5965c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown     * @hide
5975c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown     */
5985c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    public final void scale(float scale) {
5995c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        mXOffset *= scale;
6005c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        mYOffset *= scale;
6015c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        mXPrecision *= scale;
6025c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        mYPrecision *= scale;
6035c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
6045c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        float[] history = mDataSamples;
6055c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        final int length = mNumPointers * mNumSamples * NUM_SAMPLE_DATA;
6065c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        for (int i = 0; i < length; i += NUM_SAMPLE_DATA) {
6075c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            history[i + SAMPLE_X] *= scale;
6085c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            history[i + SAMPLE_Y] *= scale;
6095c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            // no need to scale pressure
6105c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            history[i + SAMPLE_SIZE] *= scale;    // TODO: square this?
611c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            history[i + SAMPLE_TOUCH_MAJOR] *= scale;
612c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            history[i + SAMPLE_TOUCH_MINOR] *= scale;
613c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            history[i + SAMPLE_TOOL_MAJOR] *= scale;
614c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            history[i + SAMPLE_TOOL_MINOR] *= scale;
6155c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        }
6165c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    }
617cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the kind of action being performed -- one of either
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_DOWN}, {@link #ACTION_MOVE}, {@link #ACTION_UP}, or
621b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * {@link #ACTION_CANCEL}.  Consider using {@link #getActionMasked}
622b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * and {@link #getActionIndex} to retrieve the separate masked action
623b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * and pointer index.
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getAction() {
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAction;
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
630b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * Return the masked action being performed, without pointer index
631b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * information.  May be any of the actions: {@link #ACTION_DOWN},
632b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * {@link #ACTION_MOVE}, {@link #ACTION_UP}, {@link #ACTION_CANCEL},
633b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * {@link #ACTION_POINTER_DOWN}, or {@link #ACTION_POINTER_UP}.
634b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * Use {@link #getActionIndex} to return the index associated with
635b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * pointer actions.
636b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     */
637b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    public final int getActionMasked() {
638b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn        return mAction & ACTION_MASK;
639b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    }
640b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn
641b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    /**
642b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * For {@link #ACTION_POINTER_DOWN} or {@link #ACTION_POINTER_UP}
643b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * as returned by {@link #getActionMasked}, this returns the associated
644b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * pointer index.  The index may be used with {@link #getPointerId(int)},
645b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * {@link #getX(int)}, {@link #getY(int)}, {@link #getPressure(int)},
646b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * and {@link #getSize(int)} to get information about the pointer that has
647b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     * gone down or up.
648b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn     */
649b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    public final int getActionIndex() {
650b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn        return (mAction & ACTION_POINTER_INDEX_MASK) >> ACTION_POINTER_INDEX_SHIFT;
651b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    }
652b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn
653b125dc5599468a09d82751cd76152071ae485afbDianne Hackborn    /**
654cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * Returns the time (in ms) when the user originally pressed down to start
655cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * a stream of position events.
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final long getDownTime() {
6585c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDownTimeNano / MS_PER_NS;
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the time (in ms) when this specific event was generated.
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final long getEventTime() {
6655c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mEventTimeNanoSamples[mLastEventTimeNanoSampleIndex] / MS_PER_NS;
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
66953071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * Returns the time (in ns) when this specific event was generated.
67053071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * The value is in nanosecond precision but it may not have nanosecond accuracy.
67153071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     *
67253071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     * @hide
67353071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan     */
67453071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    public final long getEventTimeNano() {
6755c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mEventTimeNanoSamples[mLastEventTimeNanoSampleIndex];
67653071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    }
67753071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan
67853071d6d159f6dfd6fe0328a39bcf967ef308a64Michael Chan    /**
6790dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getX(int)} for the first pointer index (may be an
6800dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final float getX() {
6835c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[mLastDataSampleIndex + SAMPLE_X] + mXOffset;
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6870dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getY(int)} for the first pointer index (may be an
6880dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final float getY() {
6915c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[mLastDataSampleIndex + SAMPLE_Y] + mYOffset;
6929822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
6939822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
6949822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
6950dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getPressure(int)} for the first pointer index (may be an
6960dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
6979822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
6989822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public final float getPressure() {
6995c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[mLastDataSampleIndex + SAMPLE_PRESSURE];
7009822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
7019822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
7029822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
7030dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getSize(int)} for the first pointer index (may be an
7040dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
7059822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
7069822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public final float getSize() {
7075c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[mLastDataSampleIndex + SAMPLE_SIZE];
7089822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
709c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
710c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
711c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * {@link #getTouchMajor(int)} for the first pointer index (may be an
712c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * arbitrary pointer identifier).
713c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
714c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public final float getTouchMajor() {
715c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mDataSamples[mLastDataSampleIndex + SAMPLE_TOUCH_MAJOR];
716c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
717c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
718c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
719c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * {@link #getTouchMinor(int)} for the first pointer index (may be an
720c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * arbitrary pointer identifier).
721c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
722c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public final float getTouchMinor() {
723c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mDataSamples[mLastDataSampleIndex + SAMPLE_TOUCH_MINOR];
724c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
725c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
726c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
727c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * {@link #getToolMajor(int)} for the first pointer index (may be an
728c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * arbitrary pointer identifier).
729c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
730c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public final float getToolMajor() {
731c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mDataSamples[mLastDataSampleIndex + SAMPLE_TOOL_MAJOR];
732c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
733c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
734c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
735c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * {@link #getToolMinor(int)} for the first pointer index (may be an
736c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * arbitrary pointer identifier).
737c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
738c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public final float getToolMinor() {
739c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mDataSamples[mLastDataSampleIndex + SAMPLE_TOOL_MINOR];
740c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
741c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
742c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
743c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * {@link #getOrientation(int)} for the first pointer index (may be an
744c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * arbitrary pointer identifier).
745c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
746c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public final float getOrientation() {
747c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mDataSamples[mLastDataSampleIndex + SAMPLE_ORIENTATION];
748c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
7499822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
7509822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
7510dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * The number of pointers of data contained in this event.  Always
7520dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * >= 1.
7530dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     */
7540dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final int getPointerCount() {
7550dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        return mNumPointers;
7560dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    }
7570dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn
7580dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    /**
7590dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Return the pointer identifier associated with a particular pointer
7600dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * data index is this event.  The identifier tells you the actual pointer
7610dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * number associated with the data, accounting for individual pointers
7620dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * going up and down since the start of the current gesture.
7630dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
7640dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
7650dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     */
766d41ba666d12a24ee4624ea9a009151e6165e3775Dianne Hackborn    public final int getPointerId(int pointerIndex) {
767d41ba666d12a24ee4624ea9a009151e6165e3775Dianne Hackborn        return mPointerIdentifiers[pointerIndex];
7680dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    }
7690dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn
7700dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    /**
7710dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Given a pointer identifier, find the index of its data in the event.
7720dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     *
7730dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerId The identifier of the pointer to be found.
7740dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @return Returns either the index of the pointer (for use with
7750dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getX(int) et al.), or -1 if there is no data available for
7760dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * that pointer identifier.
7770dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     */
7780dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final int findPointerIndex(int pointerId) {
7790dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        int i = mNumPointers;
7800dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        while (i > 0) {
7810dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            i--;
7820dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            if (mPointerIdentifiers[i] == pointerId) {
7830dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn                return i;
7840dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn            }
7850dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        }
7860dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn        return -1;
7870dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    }
7880dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn
7890dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    /**
7900dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns the X coordinate of this event for the given pointer
7910dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * <em>index</em> (use {@link #getPointerId(int)} to find the pointer
7920dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * identifier for this index).
7939822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Whole numbers are pixels; the
7949822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * value may have a fraction for input devices that are sub-pixel precise.
7950dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
7960dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
7979822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
7980dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getX(int pointerIndex) {
7995c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[mLastDataSampleIndex
8005c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                            + pointerIndex * NUM_SAMPLE_DATA + SAMPLE_X] + mXOffset;
8019822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
8029822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
8039822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
8040dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns the Y coordinate of this event for the given pointer
8050dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * <em>index</em> (use {@link #getPointerId(int)} to find the pointer
8060dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * identifier for this index).
8079822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * Whole numbers are pixels; the
8089822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * value may have a fraction for input devices that are sub-pixel precise.
8090dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
8100dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
8119822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
8120dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getY(int pointerIndex) {
8135c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[mLastDataSampleIndex
8145c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                            + pointerIndex * NUM_SAMPLE_DATA + SAMPLE_Y] + mYOffset;
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8180dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns the current pressure of this event for the given pointer
8190dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * <em>index</em> (use {@link #getPointerId(int)} to find the pointer
8200dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * identifier for this index).
8219822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * The pressure generally
822cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * ranges from 0 (no pressure at all) to 1 (normal pressure), however
823cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * values higher than 1 may be generated depending on the calibration of
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the input device.
8250dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
8260dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8280dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getPressure(int pointerIndex) {
8295c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[mLastDataSampleIndex
8305c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                            + pointerIndex * NUM_SAMPLE_DATA + SAMPLE_PRESSURE];
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8340dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns a scaled value of the approximate size for the given pointer
8350dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * <em>index</em> (use {@link #getPointerId(int)} to find the pointer
8360dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * identifier for this index).
8370dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * This represents some approximation of the area of the screen being
8380dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * pressed; the actual value in pixels corresponding to the
8399822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * touch is normalized with the device specific range of values
840cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * and scaled to a value between 0 and 1. The value of size can be used to
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * determine fat touch events.
8420dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
8430dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8450dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getSize(int pointerIndex) {
8465c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[mLastDataSampleIndex
8475c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                            + pointerIndex * NUM_SAMPLE_DATA + SAMPLE_SIZE];
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
849c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
850c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
851c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Returns the length of the major axis of an ellipse that describes the touch
852c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * area at the point of contact for the given pointer
853c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * <em>index</em> (use {@link #getPointerId(int)} to find the pointer
854c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * identifier for this index).
855c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
856c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * (the first pointer that is down) to {@link #getPointerCount()}-1.
857c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
858c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public final float getTouchMajor(int pointerIndex) {
859c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mDataSamples[mLastDataSampleIndex
860c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                            + pointerIndex * NUM_SAMPLE_DATA + SAMPLE_TOUCH_MAJOR];
861c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
862c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
863c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
864c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Returns the length of the minor axis of an ellipse that describes the touch
865c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * area at the point of contact for the given pointer
866c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * <em>index</em> (use {@link #getPointerId(int)} to find the pointer
867c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * identifier for this index).
868c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
869c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * (the first pointer that is down) to {@link #getPointerCount()}-1.
870c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
871c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public final float getTouchMinor(int pointerIndex) {
872c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mDataSamples[mLastDataSampleIndex
873c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                            + pointerIndex * NUM_SAMPLE_DATA + SAMPLE_TOUCH_MINOR];
874c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
875c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
876c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
877c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Returns the length of the major axis of an ellipse that describes the size of
878c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * the approaching tool for the given pointer
879c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * <em>index</em> (use {@link #getPointerId(int)} to find the pointer
880c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * identifier for this index).
881c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The tool area represents the estimated size of the finger or pen that is
882c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * touching the device independent of its actual touch area at the point of contact.
883c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
884c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * (the first pointer that is down) to {@link #getPointerCount()}-1.
885c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
886c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public final float getToolMajor(int pointerIndex) {
887c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mDataSamples[mLastDataSampleIndex
888c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                            + pointerIndex * NUM_SAMPLE_DATA + SAMPLE_TOOL_MAJOR];
889c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
890c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
891c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
892c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Returns the length of the minor axis of an ellipse that describes the size of
893c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * the approaching tool for the given pointer
894c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * <em>index</em> (use {@link #getPointerId(int)} to find the pointer
895c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * identifier for this index).
896c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The tool area represents the estimated size of the finger or pen that is
897c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * touching the device independent of its actual touch area at the point of contact.
898c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
899c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * (the first pointer that is down) to {@link #getPointerCount()}-1.
900c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
901c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public final float getToolMinor(int pointerIndex) {
902c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mDataSamples[mLastDataSampleIndex
903c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                            + pointerIndex * NUM_SAMPLE_DATA + SAMPLE_TOOL_MINOR];
904c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
905c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
906c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
907c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Returns the orientation of the touch area and tool area in radians clockwise from vertical
908c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * for the given pointer <em>index</em> (use {@link #getPointerId(int)} to find the pointer
909c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * identifier for this index).
910c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * An angle of 0 degrees indicates that the major axis of contact is oriented
911c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * upwards, is perfectly circular or is of unknown orientation.  A positive angle
912c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * indicates that the major axis of contact is oriented to the right.  A negative angle
913c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * indicates that the major axis of contact is oriented to the left.
9146d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown     * The full range is from -PI/2 radians (finger pointing fully left) to PI/2 radians
915c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * (finger pointing fully right).
916c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
917c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * (the first pointer that is down) to {@link #getPointerCount()}-1.
918c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
919c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public final float getOrientation(int pointerIndex) {
920c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mDataSamples[mLastDataSampleIndex
921c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                            + pointerIndex * NUM_SAMPLE_DATA + SAMPLE_ORIENTATION];
922c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
923c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
924c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
925c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Populates a {@link PointerCoords} object with pointer coordinate data for
926c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * the specified pointer index.
927c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
928c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
929c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * (the first pointer that is down) to {@link #getPointerCount()}-1.
930c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param outPointerCoords The pointer coordinate object to populate.
931c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
932c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public final void getPointerCoords(int pointerIndex, PointerCoords outPointerCoords) {
933c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        final int sampleIndex = mLastDataSampleIndex + pointerIndex * NUM_SAMPLE_DATA;
934c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        getPointerCoordsAtSampleIndex(sampleIndex, outPointerCoords);
935c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the state of any meta / modifier keys that were in effect when
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the event was generated.  This is the same values as those
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned by {@link KeyEvent#getMetaState() KeyEvent.getMetaState}.
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return an integer in which each bit set to 1 represents a pressed
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         meta key
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see KeyEvent#getMetaState()
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getMetaState() {
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mMetaState;
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the original raw X coordinate of this event.  For touch
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * events on the screen, this is the original location of the event
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on the screen, before it had been adjusted for the containing window
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and views.
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final float getRawX() {
9585c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[mLastDataSampleIndex + SAMPLE_X];
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
960c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the original raw Y coordinate of this event.  For touch
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * events on the screen, this is the original location of the event
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on the screen, before it had been adjusted for the containing window
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and views.
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final float getRawY() {
9685c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[mLastDataSampleIndex + SAMPLE_Y];
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the precision of the X coordinates being reported.  You can
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * multiple this number with {@link #getX} to find the actual hardware
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value of the X coordinate.
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the precision of X coordinates being reported.
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final float getXPrecision() {
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mXPrecision;
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
980cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the precision of the Y coordinates being reported.  You can
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * multiple this number with {@link #getY} to find the actual hardware
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value of the Y coordinate.
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the precision of Y coordinates being reported.
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final float getYPrecision() {
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mYPrecision;
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
990cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the number of historical points in this event.  These are
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * movements that have occurred between this event and the previous event.
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This only applies to ACTION_MOVE events -- all other actions will have
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a size of 0.
996cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the number of historical points in the event.
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getHistorySize() {
10005c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mLastEventTimeNanoSampleIndex;
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1002cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the time that a historical movement occurred between this event
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and the previous event.  Only applies to ACTION_MOVE events.
1006cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pos Which historical value to return; must be less than
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getHistorySize}
1009cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getHistorySize
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getEventTime
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final long getHistoricalEventTime(int pos) {
10145c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mEventTimeNanoSamples[pos] / MS_PER_NS;
10159822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
10169822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
10179822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
10180dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getHistoricalX(int)} for the first pointer index (may be an
10190dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
10209822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
10219822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public final float getHistoricalX(int pos) {
10225c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[pos * mNumPointers * NUM_SAMPLE_DATA + SAMPLE_X] + mXOffset;
10239822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
10249822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
10259822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
10260dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getHistoricalY(int)} for the first pointer index (may be an
10270dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
10289822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
10299822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public final float getHistoricalY(int pos) {
10305c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[pos * mNumPointers * NUM_SAMPLE_DATA + SAMPLE_Y] + mYOffset;
10319822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
10329822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
10339822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
10340dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getHistoricalPressure(int)} for the first pointer index (may be an
10350dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
10369822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
10379822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public final float getHistoricalPressure(int pos) {
10385c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[pos * mNumPointers * NUM_SAMPLE_DATA + SAMPLE_PRESSURE];
10399822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
10409822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
10419822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
10420dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * {@link #getHistoricalSize(int)} for the first pointer index (may be an
10430dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * arbitrary pointer identifier).
10449822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
10459822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    public final float getHistoricalSize(int pos) {
10465c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[pos * mNumPointers * NUM_SAMPLE_DATA + SAMPLE_SIZE];
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1048cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1050c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * {@link #getHistoricalTouchMajor(int)} for the first pointer index (may be an
1051c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * arbitrary pointer identifier).
1052c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
1053c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public final float getHistoricalTouchMajor(int pos) {
1054c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mDataSamples[pos * mNumPointers * NUM_SAMPLE_DATA + SAMPLE_TOUCH_MAJOR];
1055c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
1056c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
1057c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
1058c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * {@link #getHistoricalTouchMinor(int)} for the first pointer index (may be an
1059c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * arbitrary pointer identifier).
1060c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
1061c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public final float getHistoricalTouchMinor(int pos) {
1062c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mDataSamples[pos * mNumPointers * NUM_SAMPLE_DATA + SAMPLE_TOUCH_MINOR];
1063c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
1064c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
1065c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
1066c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * {@link #getHistoricalToolMajor(int)} for the first pointer index (may be an
1067c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * arbitrary pointer identifier).
1068c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
1069c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public final float getHistoricalToolMajor(int pos) {
1070c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mDataSamples[pos * mNumPointers * NUM_SAMPLE_DATA + SAMPLE_TOOL_MAJOR];
1071c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
1072c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
1073c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
1074c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * {@link #getHistoricalToolMinor(int)} for the first pointer index (may be an
1075c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * arbitrary pointer identifier).
1076c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
1077c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public final float getHistoricalToolMinor(int pos) {
1078c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mDataSamples[pos * mNumPointers * NUM_SAMPLE_DATA + SAMPLE_TOOL_MINOR];
1079c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
1080c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
1081c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
1082c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * {@link #getHistoricalOrientation(int)} for the first pointer index (may be an
1083c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * arbitrary pointer identifier).
1084c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
1085c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public final float getHistoricalOrientation(int pos) {
1086c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mDataSamples[pos * mNumPointers * NUM_SAMPLE_DATA + SAMPLE_ORIENTATION];
1087c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
1088c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
1089c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
10900dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns a historical X coordinate, as per {@link #getX(int)}, that
10910dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * occurred between this event and the previous event for the given pointer.
10920dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Only applies to ACTION_MOVE events.
1093cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
10940dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
10950dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pos Which historical value to return; must be less than
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getHistorySize}
1098cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getHistorySize
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getX
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11020dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getHistoricalX(int pointerIndex, int pos) {
11035c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[(pos * mNumPointers + pointerIndex)
11045c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                            * NUM_SAMPLE_DATA + SAMPLE_X] + mXOffset;
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1106cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11080dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns a historical Y coordinate, as per {@link #getY(int)}, that
11090dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * occurred between this event and the previous event for the given pointer.
11100dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Only applies to ACTION_MOVE events.
1111cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
11120dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
11130dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pos Which historical value to return; must be less than
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getHistorySize}
1116cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getHistorySize
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getY
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11200dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getHistoricalY(int pointerIndex, int pos) {
11215c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[(pos * mNumPointers + pointerIndex)
11225c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                            * NUM_SAMPLE_DATA + SAMPLE_Y] + mYOffset;
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1124cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11260dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns a historical pressure coordinate, as per {@link #getPressure(int)},
11270dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * that occurred between this event and the previous event for the given
11280dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * pointer.  Only applies to ACTION_MOVE events.
1129cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
11300dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
11310dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pos Which historical value to return; must be less than
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getHistorySize}
11340dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     *
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getHistorySize
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getPressure
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11380dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getHistoricalPressure(int pointerIndex, int pos) {
11395c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[(pos * mNumPointers + pointerIndex)
11405c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                            * NUM_SAMPLE_DATA + SAMPLE_PRESSURE];
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1142cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11440dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Returns a historical size coordinate, as per {@link #getSize(int)}, that
11450dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * occurred between this event and the previous event for the given pointer.
11460dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * Only applies to ACTION_MOVE events.
1147cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
11480dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
11490dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     * (the first pointer that is down) to {@link #getPointerCount()}-1.
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pos Which historical value to return; must be less than
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getHistorySize}
11520dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn     *
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getHistorySize
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getSize
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11560dd7cb4b4ef86eb7d4e837b1948501da66adeebeDianne Hackborn    public final float getHistoricalSize(int pointerIndex, int pos) {
11575c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        return mDataSamples[(pos * mNumPointers + pointerIndex)
11585c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                            * NUM_SAMPLE_DATA + SAMPLE_SIZE];
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1160c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
1161c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
1162c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Returns a historical touch major axis coordinate, as per {@link #getTouchMajor(int)}, that
1163c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * occurred between this event and the previous event for the given pointer.
1164c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Only applies to ACTION_MOVE events.
1165c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
1166c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
1167c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * (the first pointer that is down) to {@link #getPointerCount()}-1.
1168c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param pos Which historical value to return; must be less than
1169c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * {@link #getHistorySize}
1170c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
1171c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #getHistorySize
1172c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #getTouchMajor
1173c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
1174c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public final float getHistoricalTouchMajor(int pointerIndex, int pos) {
1175c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mDataSamples[(pos * mNumPointers + pointerIndex)
1176c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                            * NUM_SAMPLE_DATA + SAMPLE_TOUCH_MAJOR];
1177c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
1178cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1180c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Returns a historical touch minor axis coordinate, as per {@link #getTouchMinor(int)}, that
1181c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * occurred between this event and the previous event for the given pointer.
1182c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Only applies to ACTION_MOVE events.
1183c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
1184c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
1185c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * (the first pointer that is down) to {@link #getPointerCount()}-1.
1186c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param pos Which historical value to return; must be less than
1187c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * {@link #getHistorySize}
1188c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
1189c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #getHistorySize
1190c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #getTouchMinor
1191c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
1192c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public final float getHistoricalTouchMinor(int pointerIndex, int pos) {
1193c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mDataSamples[(pos * mNumPointers + pointerIndex)
1194c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                            * NUM_SAMPLE_DATA + SAMPLE_TOUCH_MINOR];
1195c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
1196c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
1197c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
1198c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Returns a historical tool major axis coordinate, as per {@link #getToolMajor(int)}, that
1199c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * occurred between this event and the previous event for the given pointer.
1200c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Only applies to ACTION_MOVE events.
1201c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
1202c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
1203c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * (the first pointer that is down) to {@link #getPointerCount()}-1.
1204c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param pos Which historical value to return; must be less than
1205c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * {@link #getHistorySize}
1206c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
1207c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #getHistorySize
1208c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #getToolMajor
1209c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
1210c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public final float getHistoricalToolMajor(int pointerIndex, int pos) {
1211c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mDataSamples[(pos * mNumPointers + pointerIndex)
1212c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                            * NUM_SAMPLE_DATA + SAMPLE_TOOL_MAJOR];
1213c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
1214c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
1215c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
1216c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Returns a historical tool minor axis coordinate, as per {@link #getToolMinor(int)}, that
1217c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * occurred between this event and the previous event for the given pointer.
1218c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Only applies to ACTION_MOVE events.
1219c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
1220c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
1221c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * (the first pointer that is down) to {@link #getPointerCount()}-1.
1222c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param pos Which historical value to return; must be less than
1223c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * {@link #getHistorySize}
1224c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
1225c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #getHistorySize
1226c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #getToolMinor
1227c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
1228c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public final float getHistoricalToolMinor(int pointerIndex, int pos) {
1229c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mDataSamples[(pos * mNumPointers + pointerIndex)
1230c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                            * NUM_SAMPLE_DATA + SAMPLE_TOOL_MINOR];
1231c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
1232c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
1233c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
1234c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Returns a historical orientation coordinate, as per {@link #getOrientation(int)}, that
1235c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * occurred between this event and the previous event for the given pointer.
1236c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Only applies to ACTION_MOVE events.
1237c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
1238c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
1239c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * (the first pointer that is down) to {@link #getPointerCount()}-1.
1240c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param pos Which historical value to return; must be less than
1241c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * {@link #getHistorySize}
1242c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
1243c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #getHistorySize
1244c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #getOrientation
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1246c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public final float getHistoricalOrientation(int pointerIndex, int pos) {
1247c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        return mDataSamples[(pos * mNumPointers + pointerIndex)
1248c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                            * NUM_SAMPLE_DATA + SAMPLE_ORIENTATION];
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1250cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1252c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Populates a {@link PointerCoords} object with historical pointer coordinate data,
1253c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * as per {@link #getPointerCoords}, that occurred between this event and the previous
1254c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * event for the given pointer.
1255c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Only applies to ACTION_MOVE events.
1256c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
1257c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
1258c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * (the first pointer that is down) to {@link #getPointerCount()}-1.
1259c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param pos Which historical value to return; must be less than
1260c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * {@link #getHistorySize}
1261c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param outPointerCoords The pointer coordinate object to populate.
1262c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
1263c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #getHistorySize
1264c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @see #getPointerCoords
1265c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
1266c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public final void getHistoricalPointerCoords(int pointerIndex, int pos,
1267c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            PointerCoords outPointerCoords) {
1268c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        final int sampleIndex = (pos * mNumPointers + pointerIndex) * NUM_SAMPLE_DATA;
1269c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        getPointerCoordsAtSampleIndex(sampleIndex, outPointerCoords);
1270c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
1271c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
1272c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
127346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown     * Returns a bitfield indicating which edges, if any, were touched by this
1274cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * MotionEvent. For touch events, clients can use this to determine if the
1275cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * user's finger was touching the edge of the display.
1276cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EDGE_LEFT
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EDGE_TOP
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EDGE_RIGHT
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EDGE_BOTTOM
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getEdgeFlags() {
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mEdgeFlags;
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1285cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the bitfield indicating which edges, if any, where touched by this
1289cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     * MotionEvent.
1290cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getEdgeFlags()
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setEdgeFlags(int flags) {
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEdgeFlags = flags;
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets this event's action.
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setAction(int action) {
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = action;
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Adjust this event's location.
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param deltaX Amount to add to the current X coordinate of the event.
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param deltaY Amount to add to the current Y coordinate of the event.
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void offsetLocation(float deltaX, float deltaY) {
13105c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        mXOffset += deltaX;
13115c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        mYOffset += deltaY;
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1313cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set this event's location.  Applies {@link #offsetLocation} with a
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * delta from the current location to the given new location.
1317cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x New absolute X location.
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y New absolute Y location.
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void setLocation(float x, float y) {
13225c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        mXOffset = x - mDataSamples[mLastDataSampleIndex + SAMPLE_X];
13235c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        mYOffset = y - mDataSamples[mLastDataSampleIndex + SAMPLE_Y];
13245c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    }
13255c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
1326c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    private final void getPointerCoordsAtSampleIndex(int sampleIndex,
1327c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            PointerCoords outPointerCoords) {
1328c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        outPointerCoords.x = mDataSamples[sampleIndex + SAMPLE_X] + mXOffset;
1329c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        outPointerCoords.y = mDataSamples[sampleIndex + SAMPLE_Y] + mYOffset;
1330c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        outPointerCoords.pressure = mDataSamples[sampleIndex + SAMPLE_PRESSURE];
1331c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        outPointerCoords.size = mDataSamples[sampleIndex + SAMPLE_SIZE];
1332c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        outPointerCoords.touchMajor = mDataSamples[sampleIndex + SAMPLE_TOUCH_MAJOR];
1333c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        outPointerCoords.touchMinor = mDataSamples[sampleIndex + SAMPLE_TOUCH_MINOR];
1334c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        outPointerCoords.toolMajor = mDataSamples[sampleIndex + SAMPLE_TOOL_MAJOR];
1335c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        outPointerCoords.toolMinor = mDataSamples[sampleIndex + SAMPLE_TOOL_MINOR];
1336c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        outPointerCoords.orientation = mDataSamples[sampleIndex + SAMPLE_ORIENTATION];
1337c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
1338c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
1339c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    private final void setPointerCoordsAtSampleIndex(int sampleIndex,
1340c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            PointerCoords[] pointerCoords) {
1341c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        final int numPointers = mNumPointers;
1342c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        for (int i = 0; i < numPointers; i++) {
1343c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            setPointerCoordsAtSampleIndex(sampleIndex, pointerCoords[i]);
1344c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            sampleIndex += NUM_SAMPLE_DATA;
1345c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        }
1346c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
1347c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
1348c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    private final void setPointerCoordsAtSampleIndex(int sampleIndex,
1349c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            PointerCoords pointerCoords) {
1350c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDataSamples[sampleIndex + SAMPLE_X] = pointerCoords.x - mXOffset;
1351c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDataSamples[sampleIndex + SAMPLE_Y] = pointerCoords.y - mYOffset;
1352c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDataSamples[sampleIndex + SAMPLE_PRESSURE] = pointerCoords.pressure;
1353c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDataSamples[sampleIndex + SAMPLE_SIZE] = pointerCoords.size;
1354c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDataSamples[sampleIndex + SAMPLE_TOUCH_MAJOR] = pointerCoords.touchMajor;
1355c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDataSamples[sampleIndex + SAMPLE_TOUCH_MINOR] = pointerCoords.touchMinor;
1356c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDataSamples[sampleIndex + SAMPLE_TOOL_MAJOR] = pointerCoords.toolMajor;
1357c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDataSamples[sampleIndex + SAMPLE_TOOL_MINOR] = pointerCoords.toolMinor;
1358c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDataSamples[sampleIndex + SAMPLE_ORIENTATION] = pointerCoords.orientation;
1359c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
1360c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
1361c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    private final void setPointerCoordsAtSampleIndex(int sampleIndex,
1362c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown            float x, float y, float pressure, float size) {
1363c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDataSamples[sampleIndex + SAMPLE_X] = x - mXOffset;
1364c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDataSamples[sampleIndex + SAMPLE_Y] = y - mYOffset;
1365c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDataSamples[sampleIndex + SAMPLE_PRESSURE] = pressure;
1366c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDataSamples[sampleIndex + SAMPLE_SIZE] = size;
1367c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDataSamples[sampleIndex + SAMPLE_TOUCH_MAJOR] = pressure;
1368c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDataSamples[sampleIndex + SAMPLE_TOUCH_MINOR] = pressure;
1369c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDataSamples[sampleIndex + SAMPLE_TOOL_MAJOR] = size;
1370c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDataSamples[sampleIndex + SAMPLE_TOOL_MINOR] = size;
1371c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDataSamples[sampleIndex + SAMPLE_ORIENTATION] = 0;
1372c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
1373c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
13745c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    private final void incrementNumSamplesAndReserveStorage(int dataSampleStride) {
13755c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        if (mNumSamples == mEventTimeNanoSamples.length) {
13765c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            long[] newEventTimeNanoSamples = new long[mNumSamples + BASE_AVAIL_SAMPLES];
13775c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            System.arraycopy(mEventTimeNanoSamples, 0, newEventTimeNanoSamples, 0, mNumSamples);
13785c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            mEventTimeNanoSamples = newEventTimeNanoSamples;
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13805c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
13815c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        int nextDataSampleIndex = mLastDataSampleIndex + dataSampleStride;
13825c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        if (nextDataSampleIndex + dataSampleStride > mDataSamples.length) {
13835c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            float[] newDataSamples = new float[nextDataSampleIndex
13845c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown                                               + BASE_AVAIL_SAMPLES * dataSampleStride];
13855c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            System.arraycopy(mDataSamples, 0, newDataSamples, 0, nextDataSampleIndex);
13865c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            mDataSamples = newDataSamples;
13875c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        }
13885c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
13895c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        mLastEventTimeNanoSampleIndex = mNumSamples;
13905c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        mLastDataSampleIndex = nextDataSampleIndex;
13915c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        mNumSamples += 1;
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1393cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Add a new movement to the batch of movements in this event.  The event's
1396c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * current location, position and size is updated to the new values.
1397c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The current values in the event are added to a list of historical values.
1398c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
1399e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * Only applies to {@link #ACTION_MOVE} events.
1400cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy     *
1401c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param eventTime The time stamp (in ms) for this data.
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x The new X position.
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y The new Y position.
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pressure The new pressure.
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param size The new size.
14069822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param metaState Meta key state.
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void addBatch(long eventTime, float x, float y,
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float pressure, float size, int metaState) {
14105c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        incrementNumSamplesAndReserveStorage(NUM_SAMPLE_DATA);
14119822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
14125c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        mEventTimeNanoSamples[mLastEventTimeNanoSampleIndex] = eventTime * MS_PER_NS;
1413c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        setPointerCoordsAtSampleIndex(mLastDataSampleIndex, x, y, pressure, size);
14149822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
14159822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        mMetaState |= metaState;
14169822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    }
1417cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
14189822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn    /**
1419c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Add a new movement to the batch of movements in this event.  The event's
1420c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * current location, position and size is updated to the new values.
1421c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * The current values in the event are added to a list of historical values.
1422c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
1423e33348ba54cd68d6936cffd4507037c14d4b10c2Jeff Brown     * Only applies to {@link #ACTION_MOVE} events.
14249822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     *
1425c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param eventTime The time stamp (in ms) for this data.
1426c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param pointerCoords The new pointer coordinates.
14279822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     * @param metaState Meta key state.
14289822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn     */
1429c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public final void addBatch(long eventTime, PointerCoords[] pointerCoords, int metaState) {
1430c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        final int dataSampleStride = mNumPointers * NUM_SAMPLE_DATA;
14315c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        incrementNumSamplesAndReserveStorage(dataSampleStride);
14329822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
14335c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        mEventTimeNanoSamples[mLastEventTimeNanoSampleIndex] = eventTime * MS_PER_NS;
1434c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        setPointerCoordsAtSampleIndex(mLastDataSampleIndex, pointerCoords);
14359822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMetaState |= metaState;
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1438cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String toString() {
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return "MotionEvent{" + Integer.toHexString(System.identityHashCode(this))
14429822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            + " action=" + mAction + " x=" + getX()
14439822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn            + " y=" + getY() + " pressure=" + getPressure() + " size=" + getSize() + "}";
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Parcelable.Creator<MotionEvent> CREATOR
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new Parcelable.Creator<MotionEvent>() {
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public MotionEvent createFromParcel(Parcel in) {
14496ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            in.readInt(); // skip token, we already know this is a MotionEvent
14506ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            return MotionEvent.createFromParcelBody(in);
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public MotionEvent[] newArray(int size) {
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new MotionEvent[size];
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14586ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown    /** @hide */
14596ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown    public static MotionEvent createFromParcelBody(Parcel in) {
14606ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        final int NP = in.readInt();
14616ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        final int NS = in.readInt();
14626ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        final int NI = NP * NS * NUM_SAMPLE_DATA;
14636ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
14646ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        MotionEvent ev = obtain(NP, NS);
14656ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        ev.mNumPointers = NP;
14666ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        ev.mNumSamples = NS;
14676ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
14686ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        ev.readBaseFromParcel(in);
14696ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
14706ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        ev.mDownTimeNano = in.readLong();
14716ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        ev.mAction = in.readInt();
14726ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        ev.mXOffset = in.readFloat();
14736ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        ev.mYOffset = in.readFloat();
14746ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        ev.mXPrecision = in.readFloat();
14756ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        ev.mYPrecision = in.readFloat();
14766ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        ev.mEdgeFlags = in.readInt();
14776ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        ev.mMetaState = in.readInt();
14786ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
14796ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        final int[] pointerIdentifiers = ev.mPointerIdentifiers;
14806ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        for (int i = 0; i < NP; i++) {
14816ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            pointerIdentifiers[i] = in.readInt();
14826ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        }
14836ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
14846ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        final long[] eventTimeNanoSamples = ev.mEventTimeNanoSamples;
14856ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        for (int i = 0; i < NS; i++) {
14866ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            eventTimeNanoSamples[i] = in.readLong();
14876ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        }
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14896ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        final float[] dataSamples = ev.mDataSamples;
14906ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        for (int i = 0; i < NI; i++) {
14916ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            dataSamples[i] = in.readFloat();
14926ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        }
14936ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
14946ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        ev.mLastEventTimeNanoSampleIndex = NS - 1;
14956ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        ev.mLastDataSampleIndex = (NS - 1) * NP * NUM_SAMPLE_DATA;
14966ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        return ev;
14976ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown    }
14986ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel out, int flags) {
15006ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        out.writeInt(PARCEL_TOKEN_MOTION_EVENT);
15016ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
15029822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int NP = mNumPointers;
15039822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        final int NS = mNumSamples;
15045c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        final int NI = NP * NS * NUM_SAMPLE_DATA;
15055c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
15065c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        out.writeInt(NP);
15079822d2b27330793ea4ba9c3316ef35f402f35fb4Dianne Hackborn        out.writeInt(NS);
15085c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
15096ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        writeBaseToParcel(out);
15106ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
15115c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        out.writeLong(mDownTimeNano);
15125c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        out.writeInt(mAction);
15135c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        out.writeFloat(mXOffset);
15145c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        out.writeFloat(mYOffset);
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeFloat(mXPrecision);
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeFloat(mYPrecision);
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mEdgeFlags);
15185c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        out.writeInt(mMetaState);
15195c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
15205c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        final int[] pointerIdentifiers = mPointerIdentifiers;
15215c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        for (int i = 0; i < NP; i++) {
15225c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            out.writeInt(pointerIdentifiers[i]);
15235c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        }
15245c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
15255c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        final long[] eventTimeNanoSamples = mEventTimeNanoSamples;
15265c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        for (int i = 0; i < NS; i++) {
15275c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            out.writeLong(eventTimeNanoSamples[i]);
15285c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        }
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15305c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        final float[] dataSamples = mDataSamples;
15315c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown        for (int i = 0; i < NI; i++) {
15325c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            out.writeFloat(dataSamples[i]);
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1535c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
1536c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
1537c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Transfer object for pointer coordinates.
1538c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
1539c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Objects of this type can be used to manufacture new {@link MotionEvent} objects
1540c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * and to query pointer coordinate information in bulk.
1541c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
1542c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Refer to {@link InputDevice} for information about how different kinds of
1543c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * input devices and sources represent pointer coordinates.
1544c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
1545c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public static final class PointerCoords {
1546c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        /**
1547c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * The X coordinate of the pointer movement.
1548c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * The interpretation varies by input source and may represent the position of
1549c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * the center of the contact area, a relative displacement in device-specific units
1550c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * or something else.
1551c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         */
1552c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        public float x;
1553c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
1554c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        /**
1555c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * The Y coordinate of the pointer movement.
1556c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * The interpretation varies by input source and may represent the position of
1557c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * the center of the contact area, a relative displacement in device-specific units
1558c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * or something else.
1559c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         */
1560c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        public float y;
1561c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
1562c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        /**
1563c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * A scaled value that describes the pressure applied to the pointer.
1564c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * The pressure generally ranges from 0 (no pressure at all) to 1 (normal pressure),
1565c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * however values higher than 1 may be generated depending on the calibration of
1566c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * the input device.
1567c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         */
1568c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        public float pressure;
1569c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
1570c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        /**
1571c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * A scaled value of the approximate size of the pointer touch area.
1572c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * This represents some approximation of the area of the screen being
1573c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * pressed; the actual value in pixels corresponding to the
1574c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * touch is normalized with the device specific range of values
1575c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * and scaled to a value between 0 and 1. The value of size can be used to
1576c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * determine fat touch events.
1577c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         */
1578c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        public float size;
1579c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
1580c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        /**
1581c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * The length of the major axis of an ellipse that describes the touch area at
1582c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * the point of contact.
1583c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         */
1584c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        public float touchMajor;
1585c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
1586c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        /**
1587c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * The length of the minor axis of an ellipse that describes the touch area at
1588c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * the point of contact.
1589c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         */
1590c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        public float touchMinor;
1591c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
1592c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        /**
1593c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * The length of the major axis of an ellipse that describes the size of
1594c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * the approaching tool.
1595c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * The tool area represents the estimated size of the finger or pen that is
1596c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * touching the device independent of its actual touch area at the point of contact.
1597c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         */
1598c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        public float toolMajor;
1599c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
1600c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        /**
1601c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * The length of the minor axis of an ellipse that describes the size of
1602c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * the approaching tool.
1603c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * The tool area represents the estimated size of the finger or pen that is
1604c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * touching the device independent of its actual touch area at the point of contact.
1605c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         */
1606c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        public float toolMinor;
1607c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
1608c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        /**
1609c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * The orientation of the touch area and tool area in radians clockwise from vertical.
1610c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * An angle of 0 degrees indicates that the major axis of contact is oriented
1611c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * upwards, is perfectly circular or is of unknown orientation.  A positive angle
1612c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * indicates that the major axis of contact is oriented to the right.  A negative angle
1613c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * indicates that the major axis of contact is oriented to the left.
16146d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown         * The full range is from -PI/2 radians (finger pointing fully left) to PI/2 radians
1615c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         * (finger pointing fully right).
1616c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown         */
1617c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        public float orientation;
1618c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
1619c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        /*
16206d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown        private static final float PI_4 = (float) (Math.PI / 4);
1621c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
1622c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        public float getTouchWidth() {
16236d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown            return Math.abs(orientation) > PI_4 ? touchMajor : touchMinor;
1624c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        }
1625c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
1626c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        public float getTouchHeight() {
16276d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown            return Math.abs(orientation) > PI_4 ? touchMinor : touchMajor;
1628c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        }
1629c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
1630c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        public float getToolWidth() {
16316d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown            return Math.abs(orientation) > PI_4 ? toolMajor : toolMinor;
1632c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        }
1633c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
1634c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        public float getToolHeight() {
16356d0fec2de3601821f4f44eeb7d7deedebb2b7117Jeff Brown            return Math.abs(orientation) > PI_4 ? toolMinor : toolMajor;
1636c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        }
1637c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        */
1638c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1640