1eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn/*
2eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Copyright (C) 2011 The Android Open Source Project
3eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn *
4eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
5eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * you may not use this file except in compliance with the License.
6eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * You may obtain a copy of the License at
7eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn *
8eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
9eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn *
10eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * Unless required by applicable law or agreed to in writing, software
11eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
12eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * See the License for the specific language governing permissions and
14eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn * limitations under the License.
15eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */
16eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn
17eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackbornpackage android.support.v4.view;
18eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn
19eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackbornimport android.view.MotionEvent;
20eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn
21eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn/**
220574ca37da4619afe4e26753f5a1b4de314b6565Svetoslav Ganov * Helper for accessing features in {@link MotionEvent} introduced
230574ca37da4619afe4e26753f5a1b4de314b6565Svetoslav Ganov * after API level 4 in a backwards compatible fashion.
24eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn */
25eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackbornpublic class MotionEventCompat {
26eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    /**
27eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     * Interface for the full API.
28eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     */
29eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    interface MotionEventVersionImpl {
30eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        public int findPointerIndex(MotionEvent event, int pointerId);
31eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        public int getPointerId(MotionEvent event, int pointerIndex);
32eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        public float getX(MotionEvent event, int pointerIndex);
33eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        public float getY(MotionEvent event, int pointerIndex);
341ce805e30800bf2852fa5421b7277a18e089ee31Adam Powell        public int getPointerCount(MotionEvent event);
35eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    }
36eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn
37eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    /**
38eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     * Interface implementation that doesn't use anything about v4 APIs.
39eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     */
40eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    static class BaseMotionEventVersionImpl implements MotionEventVersionImpl {
41eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        @Override
42eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        public int findPointerIndex(MotionEvent event, int pointerId) {
434fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell            if (pointerId == 0) {
444fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell                // id 0 == index 0 and vice versa.
454fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell                return 0;
464fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell            }
47eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn            return -1;
48eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        }
49eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        @Override
50eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        public int getPointerId(MotionEvent event, int pointerIndex) {
514fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell            if (pointerIndex == 0) {
524fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell                // index 0 == id 0 and vice versa.
534fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell                return 0;
544fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell            }
554fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell            throw new IndexOutOfBoundsException("Pre-Eclair does not support multiple pointers");
56eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        }
57eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        @Override
58eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        public float getX(MotionEvent event, int pointerIndex) {
594fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell            if (pointerIndex == 0) {
604fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell                return event.getX();
614fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell            }
624fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell            throw new IndexOutOfBoundsException("Pre-Eclair does not support multiple pointers");
63eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        }
64eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        @Override
65eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        public float getY(MotionEvent event, int pointerIndex) {
664fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell            if (pointerIndex == 0) {
674fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell                return event.getY();
684fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell            }
694fb2aa8fb492e12ed48daa4f025e0bfac00a2514Adam Powell            throw new IndexOutOfBoundsException("Pre-Eclair does not support multiple pointers");
70eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        }
711ce805e30800bf2852fa5421b7277a18e089ee31Adam Powell        @Override
721ce805e30800bf2852fa5421b7277a18e089ee31Adam Powell        public int getPointerCount(MotionEvent event) {
731ce805e30800bf2852fa5421b7277a18e089ee31Adam Powell            return 1;
741ce805e30800bf2852fa5421b7277a18e089ee31Adam Powell        }
75eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    }
76eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn
77eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    /**
78eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     * Interface implementation for devices with at least v11 APIs.
79eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     */
80eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    static class EclairMotionEventVersionImpl implements MotionEventVersionImpl {
81eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        @Override
82eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        public int findPointerIndex(MotionEvent event, int pointerId) {
83eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn            return MotionEventCompatEclair.findPointerIndex(event, pointerId);
84eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        }
85eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        @Override
86eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        public int getPointerId(MotionEvent event, int pointerIndex) {
87eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn            return MotionEventCompatEclair.getPointerId(event, pointerIndex);
88eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        }
89eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        @Override
90eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        public float getX(MotionEvent event, int pointerIndex) {
91eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn            return MotionEventCompatEclair.getX(event, pointerIndex);
92eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        }
93eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        @Override
94eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        public float getY(MotionEvent event, int pointerIndex) {
95eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn            return MotionEventCompatEclair.getY(event, pointerIndex);
96eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        }
971ce805e30800bf2852fa5421b7277a18e089ee31Adam Powell        @Override
981ce805e30800bf2852fa5421b7277a18e089ee31Adam Powell        public int getPointerCount(MotionEvent event) {
991ce805e30800bf2852fa5421b7277a18e089ee31Adam Powell            return MotionEventCompatEclair.getPointerCount(event);
1001ce805e30800bf2852fa5421b7277a18e089ee31Adam Powell        }
101eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    }
102eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn
103eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    /**
104eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     * Select the correct implementation to use for the current platform.
105eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     */
106eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    static final MotionEventVersionImpl IMPL;
107eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    static {
108eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        if (android.os.Build.VERSION.SDK_INT >= 5) {
109eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn            IMPL = new EclairMotionEventVersionImpl();
110eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        } else {
111eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn            IMPL = new BaseMotionEventVersionImpl();
112eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        }
113eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    }
114eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn
115eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    // -------------------------------------------------------------------
116eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn
117eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    /**
118eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     * Synonym for {@link MotionEvent#ACTION_MASK}.
119eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     */
120eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    public static final int ACTION_MASK = 0xff;
121eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn
122eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    /**
123eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     * Synonym for {@link MotionEvent#ACTION_POINTER_DOWN}.
124eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     */
125eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    public static final int ACTION_POINTER_DOWN = 5;
126eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn
127eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    /**
128eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     * Synonym for {@link MotionEvent#ACTION_POINTER_UP}.
129eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     */
130eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    public static final int ACTION_POINTER_UP = 6;
131eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn
132eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    /**
133eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     * Synonym for {@link MotionEvent#ACTION_HOVER_MOVE}.
134eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     */
135eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    public static final int ACTION_HOVER_MOVE = 7;
136eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn
137eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    /**
138eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     * Synonym for {@link MotionEvent#ACTION_SCROLL}.
139eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     */
140eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    public static final int ACTION_SCROLL = 8;
141eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn
142eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    /**
143eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     * Synonym for {@link MotionEvent#ACTION_POINTER_INDEX_MASK}.
144eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     */
145eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    public static final int ACTION_POINTER_INDEX_MASK  = 0xff00;
146eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn
147eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    /**
148eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     * Synonym for {@link MotionEvent#ACTION_POINTER_INDEX_SHIFT}.
149eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     */
150eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    public static final int ACTION_POINTER_INDEX_SHIFT = 8;
151eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn
152eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    /**
153dc5487a46b75572fa9120b22e89487c0178ff0a0Svetoslav Ganov     * Constant for {@link #getActionMasked}: The pointer is not down but has entered the
154dc5487a46b75572fa9120b22e89487c0178ff0a0Svetoslav Ganov     * boundaries of a window or view.
155dc5487a46b75572fa9120b22e89487c0178ff0a0Svetoslav Ganov     * <p>
156dc5487a46b75572fa9120b22e89487c0178ff0a0Svetoslav Ganov     * This action is always delivered to the window or view under the pointer.
157dc5487a46b75572fa9120b22e89487c0178ff0a0Svetoslav Ganov     * </p><p>
158dc5487a46b75572fa9120b22e89487c0178ff0a0Svetoslav Ganov     * This action is not a touch event so it is delivered to
159e350edbd81af058201ac1b5dbe6631dafaffdadbSvetoslav Ganov     * {@link android.view.View#onGenericMotionEvent(MotionEvent)} rather than
160e350edbd81af058201ac1b5dbe6631dafaffdadbSvetoslav Ganov     * {@link android.view.View#onTouchEvent(MotionEvent)}.
161dc5487a46b75572fa9120b22e89487c0178ff0a0Svetoslav Ganov     * </p>
162dc5487a46b75572fa9120b22e89487c0178ff0a0Svetoslav Ganov     */
163dc5487a46b75572fa9120b22e89487c0178ff0a0Svetoslav Ganov    public static final int ACTION_HOVER_ENTER = 9;
164dc5487a46b75572fa9120b22e89487c0178ff0a0Svetoslav Ganov
165dc5487a46b75572fa9120b22e89487c0178ff0a0Svetoslav Ganov    /**
166dc5487a46b75572fa9120b22e89487c0178ff0a0Svetoslav Ganov     * Constant for {@link #getActionMasked}: The pointer is not down but has exited the
167dc5487a46b75572fa9120b22e89487c0178ff0a0Svetoslav Ganov     * boundaries of a window or view.
168dc5487a46b75572fa9120b22e89487c0178ff0a0Svetoslav Ganov     * <p>
169dc5487a46b75572fa9120b22e89487c0178ff0a0Svetoslav Ganov     * This action is always delivered to the window or view that was previously under the pointer.
170dc5487a46b75572fa9120b22e89487c0178ff0a0Svetoslav Ganov     * </p><p>
171dc5487a46b75572fa9120b22e89487c0178ff0a0Svetoslav Ganov     * This action is not a touch event so it is delivered to
172e350edbd81af058201ac1b5dbe6631dafaffdadbSvetoslav Ganov     * {@link android.view.View#onGenericMotionEvent(MotionEvent)} rather than
173e350edbd81af058201ac1b5dbe6631dafaffdadbSvetoslav Ganov     * {@link android.view.View#onTouchEvent(MotionEvent)}.
174dc5487a46b75572fa9120b22e89487c0178ff0a0Svetoslav Ganov     * </p>
175dc5487a46b75572fa9120b22e89487c0178ff0a0Svetoslav Ganov     */
176dc5487a46b75572fa9120b22e89487c0178ff0a0Svetoslav Ganov    public static final int ACTION_HOVER_EXIT = 10;
177dc5487a46b75572fa9120b22e89487c0178ff0a0Svetoslav Ganov
178dc5487a46b75572fa9120b22e89487c0178ff0a0Svetoslav Ganov    /**
179eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     * Call {@link MotionEvent#getAction}, returning only the {@link #ACTION_MASK}
180eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     * portion.
181eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     */
182eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    public static int getActionMasked(MotionEvent event) {
183eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        return event.getAction() & ACTION_MASK;
184eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    }
185eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn
186eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    /**
187eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     * Call {@link MotionEvent#getAction}, returning only the pointer index
188eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     * portion
189eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     */
190eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    public static int getActionIndex(MotionEvent event) {
191eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        return (event.getAction() & ACTION_POINTER_INDEX_MASK)
192eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn                >> ACTION_POINTER_INDEX_SHIFT;
193eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    }
194eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn
195eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    /**
196eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     * Call {@link MotionEvent#findPointerIndex(int)}.
1970574ca37da4619afe4e26753f5a1b4de314b6565Svetoslav Ganov     * If running on a pre-{@link android.os.Build.VERSION_CODES#ECLAIR} device,
198eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     * does nothing and returns -1.
199eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     */
200eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    public static int findPointerIndex(MotionEvent event, int pointerId) {
201eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        return IMPL.findPointerIndex(event, pointerId);
202eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    }
203eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn
204eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    /**
205eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     * Call {@link MotionEvent#getPointerId(int)}.
2060574ca37da4619afe4e26753f5a1b4de314b6565Svetoslav Ganov     * If running on a pre-{@link android.os.Build.VERSION_CODES#ECLAIR} device,
207eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     * {@link IndexOutOfBoundsException} is thrown.
208eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     */
209eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    public static int getPointerId(MotionEvent event, int pointerIndex) {
210eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        return IMPL.getPointerId(event, pointerIndex);
211eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    }
212eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn
213eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    /**
214eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     * Call {@link MotionEvent#getX(int)}.
2150574ca37da4619afe4e26753f5a1b4de314b6565Svetoslav Ganov     * If running on a pre-{@link android.os.Build.VERSION_CODES#ECLAIR} device,
216eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     * {@link IndexOutOfBoundsException} is thrown.
217eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     */
218eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    public static float getX(MotionEvent event, int pointerIndex) {
219eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        return IMPL.getX(event, pointerIndex);
220eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    }
221eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn
222eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    /**
223eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     * Call {@link MotionEvent#getY(int)}.
2240574ca37da4619afe4e26753f5a1b4de314b6565Svetoslav Ganov     * If running on a pre-{@link android.os.Build.VERSION_CODES#ECLAIR} device,
225eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     * {@link IndexOutOfBoundsException} is thrown.
226eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn     */
227eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    public static float getY(MotionEvent event, int pointerIndex) {
228eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn        return IMPL.getY(event, pointerIndex);
229eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn    }
2301ce805e30800bf2852fa5421b7277a18e089ee31Adam Powell
2311ce805e30800bf2852fa5421b7277a18e089ee31Adam Powell    /**
2321ce805e30800bf2852fa5421b7277a18e089ee31Adam Powell     * The number of pointers of data contained in this event.  Always
2331ce805e30800bf2852fa5421b7277a18e089ee31Adam Powell     * >= 1.
2341ce805e30800bf2852fa5421b7277a18e089ee31Adam Powell     */
2351ce805e30800bf2852fa5421b7277a18e089ee31Adam Powell    public static int getPointerCount(MotionEvent event) {
2361ce805e30800bf2852fa5421b7277a18e089ee31Adam Powell        return IMPL.getPointerCount(event);
2371ce805e30800bf2852fa5421b7277a18e089ee31Adam Powell    }
238eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn}
239