1fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung/*
2fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung * Copyright (C) 2016 The Android Open Source Project
3fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung *
4fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung * Licensed under the Apache License, Version 2.0 (the "License");
5fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung * you may not use this file except in compliance with the License.
6fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung * You may obtain a copy of the License at
7fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung *
8fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung *      http://www.apache.org/licenses/LICENSE-2.0
9fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung *
10fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung * Unless required by applicable law or agreed to in writing, software
11fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung * distributed under the License is distributed on an "AS IS" BASIS,
12fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung * See the License for the specific language governing permissions and
14fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung * limitations under the License.
15fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung */
16fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung
17fa7053789f6f874ea1f950826d2471d910114f6eWinson Chungpackage com.android.systemui.pip.phone;
18fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung
19fa7053789f6f874ea1f950826d2471d910114f6eWinson Chungimport android.graphics.PointF;
20040e72281c2b6a6bfbad169d71821dc72dec3394Winson Chungimport android.util.Log;
21fa7053789f6f874ea1f950826d2471d910114f6eWinson Chungimport android.view.MotionEvent;
22fa7053789f6f874ea1f950826d2471d910114f6eWinson Chungimport android.view.VelocityTracker;
23fa7053789f6f874ea1f950826d2471d910114f6eWinson Chungimport android.view.ViewConfiguration;
24fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung
2529a786590f273b123efa4bb669c4ae51dd055a00Winson Chungimport java.io.PrintWriter;
2629a786590f273b123efa4bb669c4ae51dd055a00Winson Chung
27fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung/**
28fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung * This keeps track of the touch state throughout the current touch gesture.
29fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung */
30fa7053789f6f874ea1f950826d2471d910114f6eWinson Chungpublic class PipTouchState {
3129a786590f273b123efa4bb669c4ae51dd055a00Winson Chung    private static final String TAG = "PipTouchHandler";
32040e72281c2b6a6bfbad169d71821dc72dec3394Winson Chung    private static final boolean DEBUG = true;
33fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung
34fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    private ViewConfiguration mViewConfig;
35fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung
36fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    private VelocityTracker mVelocityTracker;
37fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    private final PointF mDownTouch = new PointF();
38fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    private final PointF mDownDelta = new PointF();
39fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    private final PointF mLastTouch = new PointF();
40fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    private final PointF mLastDelta = new PointF();
41fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    private final PointF mVelocity = new PointF();
4285d3998aa39f412f269806114b3e6154ccbee73fWinson Chung    private boolean mAllowTouches = true;
432a82fe587b850061ace024d2025047554987c10dWinson Chung    private boolean mIsUserInteracting = false;
44fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    private boolean mIsDragging = false;
45fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    private boolean mStartedDragging = false;
46d5a01599f7c90db0cc9bb11e18883a18660a2a45Winson Chung    private boolean mAllowDraggingOffscreen = false;
47fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    private int mActivePointerId;
48fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung
49fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    public PipTouchState(ViewConfiguration viewConfig) {
50fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung        mViewConfig = viewConfig;
51fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    }
52fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung
53fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    /**
5485d3998aa39f412f269806114b3e6154ccbee73fWinson Chung     * Resets this state.
5585d3998aa39f412f269806114b3e6154ccbee73fWinson Chung     */
5685d3998aa39f412f269806114b3e6154ccbee73fWinson Chung    public void reset() {
5785d3998aa39f412f269806114b3e6154ccbee73fWinson Chung        mAllowDraggingOffscreen = false;
5885d3998aa39f412f269806114b3e6154ccbee73fWinson Chung        mIsDragging = false;
5985d3998aa39f412f269806114b3e6154ccbee73fWinson Chung        mStartedDragging = false;
6085d3998aa39f412f269806114b3e6154ccbee73fWinson Chung        mIsUserInteracting = false;
6185d3998aa39f412f269806114b3e6154ccbee73fWinson Chung    }
6285d3998aa39f412f269806114b3e6154ccbee73fWinson Chung
6385d3998aa39f412f269806114b3e6154ccbee73fWinson Chung    /**
64fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung     * Processess a given touch event and updates the state.
65fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung     */
66fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    public void onTouchEvent(MotionEvent ev) {
67fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung        switch (ev.getAction()) {
68fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung            case MotionEvent.ACTION_DOWN: {
6985d3998aa39f412f269806114b3e6154ccbee73fWinson Chung                if (!mAllowTouches) {
7085d3998aa39f412f269806114b3e6154ccbee73fWinson Chung                    return;
7185d3998aa39f412f269806114b3e6154ccbee73fWinson Chung                }
7285d3998aa39f412f269806114b3e6154ccbee73fWinson Chung
73fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                // Initialize the velocity tracker
74fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                initOrResetVelocityTracker();
7585d3998aa39f412f269806114b3e6154ccbee73fWinson Chung
76fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                mActivePointerId = ev.getPointerId(0);
77040e72281c2b6a6bfbad169d71821dc72dec3394Winson Chung                if (DEBUG) {
78040e72281c2b6a6bfbad169d71821dc72dec3394Winson Chung                    Log.e(TAG, "Setting active pointer id on DOWN: " + mActivePointerId);
79040e72281c2b6a6bfbad169d71821dc72dec3394Winson Chung                }
80fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                mLastTouch.set(ev.getX(), ev.getY());
81fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                mDownTouch.set(mLastTouch);
82d5a01599f7c90db0cc9bb11e18883a18660a2a45Winson Chung                mAllowDraggingOffscreen = true;
832a82fe587b850061ace024d2025047554987c10dWinson Chung                mIsUserInteracting = true;
84fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                break;
85fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung            }
86fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung            case MotionEvent.ACTION_MOVE: {
8785d3998aa39f412f269806114b3e6154ccbee73fWinson Chung                // Skip event if we did not start processing this touch gesture
8885d3998aa39f412f269806114b3e6154ccbee73fWinson Chung                if (!mIsUserInteracting) {
8985d3998aa39f412f269806114b3e6154ccbee73fWinson Chung                    break;
9085d3998aa39f412f269806114b3e6154ccbee73fWinson Chung                }
9185d3998aa39f412f269806114b3e6154ccbee73fWinson Chung
92fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                // Update the velocity tracker
93fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                mVelocityTracker.addMovement(ev);
94fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                int pointerIndex = ev.findPointerIndex(mActivePointerId);
95040e72281c2b6a6bfbad169d71821dc72dec3394Winson Chung                if (pointerIndex == -1) {
96040e72281c2b6a6bfbad169d71821dc72dec3394Winson Chung                    Log.e(TAG, "Invalid active pointer id on MOVE: " + mActivePointerId);
97040e72281c2b6a6bfbad169d71821dc72dec3394Winson Chung                    break;
98040e72281c2b6a6bfbad169d71821dc72dec3394Winson Chung                }
99040e72281c2b6a6bfbad169d71821dc72dec3394Winson Chung
100fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                float x = ev.getX(pointerIndex);
101fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                float y = ev.getY(pointerIndex);
102fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                mLastDelta.set(x - mLastTouch.x, y - mLastTouch.y);
103fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                mDownDelta.set(x - mDownTouch.x, y - mDownTouch.y);
104fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung
105fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                boolean hasMovedBeyondTap = mDownDelta.length() > mViewConfig.getScaledTouchSlop();
106fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                if (!mIsDragging) {
107fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                    if (hasMovedBeyondTap) {
108fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                        mIsDragging = true;
109fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                        mStartedDragging = true;
110fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                    }
111fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                } else {
112fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                    mStartedDragging = false;
113fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                }
114fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                mLastTouch.set(x, y);
115fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                break;
116fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung            }
117fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung            case MotionEvent.ACTION_POINTER_UP: {
11885d3998aa39f412f269806114b3e6154ccbee73fWinson Chung                // Skip event if we did not start processing this touch gesture
11985d3998aa39f412f269806114b3e6154ccbee73fWinson Chung                if (!mIsUserInteracting) {
12085d3998aa39f412f269806114b3e6154ccbee73fWinson Chung                    break;
12185d3998aa39f412f269806114b3e6154ccbee73fWinson Chung                }
12285d3998aa39f412f269806114b3e6154ccbee73fWinson Chung
123fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                // Update the velocity tracker
124fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                mVelocityTracker.addMovement(ev);
125fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung
126fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                int pointerIndex = ev.getActionIndex();
127fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                int pointerId = ev.getPointerId(pointerIndex);
128fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                if (pointerId == mActivePointerId) {
129fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                    // Select a new active pointer id and reset the movement state
130fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                    final int newPointerIndex = (pointerIndex == 0) ? 1 : 0;
131fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                    mActivePointerId = ev.getPointerId(newPointerIndex);
132040e72281c2b6a6bfbad169d71821dc72dec3394Winson Chung                    if (DEBUG) {
133040e72281c2b6a6bfbad169d71821dc72dec3394Winson Chung                        Log.e(TAG, "Relinquish active pointer id on POINTER_UP: " +
134040e72281c2b6a6bfbad169d71821dc72dec3394Winson Chung                                mActivePointerId);
135040e72281c2b6a6bfbad169d71821dc72dec3394Winson Chung                    }
136fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                    mLastTouch.set(ev.getX(newPointerIndex), ev.getY(newPointerIndex));
137fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                }
138fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                break;
139fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung            }
140fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung            case MotionEvent.ACTION_UP: {
14185d3998aa39f412f269806114b3e6154ccbee73fWinson Chung                // Skip event if we did not start processing this touch gesture
14285d3998aa39f412f269806114b3e6154ccbee73fWinson Chung                if (!mIsUserInteracting) {
14385d3998aa39f412f269806114b3e6154ccbee73fWinson Chung                    break;
14485d3998aa39f412f269806114b3e6154ccbee73fWinson Chung                }
14585d3998aa39f412f269806114b3e6154ccbee73fWinson Chung
146fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                // Update the velocity tracker
147fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                mVelocityTracker.addMovement(ev);
148fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                mVelocityTracker.computeCurrentVelocity(1000,
149fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                        mViewConfig.getScaledMaximumFlingVelocity());
150fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                mVelocity.set(mVelocityTracker.getXVelocity(), mVelocityTracker.getYVelocity());
151fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung
152fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                int pointerIndex = ev.findPointerIndex(mActivePointerId);
153040e72281c2b6a6bfbad169d71821dc72dec3394Winson Chung                if (pointerIndex == -1) {
154040e72281c2b6a6bfbad169d71821dc72dec3394Winson Chung                    Log.e(TAG, "Invalid active pointer id on UP: " + mActivePointerId);
155040e72281c2b6a6bfbad169d71821dc72dec3394Winson Chung                    break;
156040e72281c2b6a6bfbad169d71821dc72dec3394Winson Chung                }
157040e72281c2b6a6bfbad169d71821dc72dec3394Winson Chung
158fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                mLastTouch.set(ev.getX(pointerIndex), ev.getY(pointerIndex));
159fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung
160fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                // Fall through to clean up
161fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung            }
162fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung            case MotionEvent.ACTION_CANCEL: {
163fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                recycleVelocityTracker();
164fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung                break;
165fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung            }
166fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung        }
167fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    }
168fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung
169fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    /**
170fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung     * @return the velocity of the active touch pointer at the point it is lifted off the screen.
171fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung     */
172fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    public PointF getVelocity() {
173fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung        return mVelocity;
174fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    }
175fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung
176fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    /**
177fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung     * @return the last touch position of the active pointer.
178fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung     */
179fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    public PointF getLastTouchPosition() {
180fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung        return mLastTouch;
181fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    }
182fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung
183fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    /**
184fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung     * @return the movement delta between the last handled touch event and the previous touch
185fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung     *         position.
186fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung     */
187fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    public PointF getLastTouchDelta() {
188fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung        return mLastDelta;
189fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    }
190fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung
191fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    /**
19257d2255cc983b614be61cab86ea8d5cafc03fdecMady Mellor     * @return the down touch position.
19357d2255cc983b614be61cab86ea8d5cafc03fdecMady Mellor     */
19457d2255cc983b614be61cab86ea8d5cafc03fdecMady Mellor    public PointF getDownTouchPosition() {
19557d2255cc983b614be61cab86ea8d5cafc03fdecMady Mellor        return mDownTouch;
19657d2255cc983b614be61cab86ea8d5cafc03fdecMady Mellor    }
19757d2255cc983b614be61cab86ea8d5cafc03fdecMady Mellor
19857d2255cc983b614be61cab86ea8d5cafc03fdecMady Mellor    /**
199fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung     * @return the movement delta between the last handled touch event and the down touch
200fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung     *         position.
201fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung     */
202fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    public PointF getDownTouchDelta() {
203fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung        return mDownDelta;
204fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    }
205fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung
206fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    /**
207fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung     * @return whether the user has started dragging.
208fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung     */
209fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    public boolean isDragging() {
210fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung        return mIsDragging;
211fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    }
212fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung
213fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    /**
2142a82fe587b850061ace024d2025047554987c10dWinson Chung     * @return whether the user is currently interacting with the PiP.
2152a82fe587b850061ace024d2025047554987c10dWinson Chung     */
2162a82fe587b850061ace024d2025047554987c10dWinson Chung    public boolean isUserInteracting() {
2172a82fe587b850061ace024d2025047554987c10dWinson Chung        return mIsUserInteracting;
2182a82fe587b850061ace024d2025047554987c10dWinson Chung    }
2192a82fe587b850061ace024d2025047554987c10dWinson Chung
2202a82fe587b850061ace024d2025047554987c10dWinson Chung    /**
221fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung     * @return whether the user has started dragging just in the last handled touch event.
222fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung     */
223fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    public boolean startedDragging() {
224fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung        return mStartedDragging;
225fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    }
226fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung
227d5a01599f7c90db0cc9bb11e18883a18660a2a45Winson Chung    /**
22885d3998aa39f412f269806114b3e6154ccbee73fWinson Chung     * Sets whether touching is currently allowed.
22985d3998aa39f412f269806114b3e6154ccbee73fWinson Chung     */
23085d3998aa39f412f269806114b3e6154ccbee73fWinson Chung    public void setAllowTouches(boolean allowTouches) {
23185d3998aa39f412f269806114b3e6154ccbee73fWinson Chung        mAllowTouches = allowTouches;
23285d3998aa39f412f269806114b3e6154ccbee73fWinson Chung
23385d3998aa39f412f269806114b3e6154ccbee73fWinson Chung        // If the user happens to touch down before this is sent from the system during a transition
23485d3998aa39f412f269806114b3e6154ccbee73fWinson Chung        // then block any additional handling by resetting the state now
23585d3998aa39f412f269806114b3e6154ccbee73fWinson Chung        if (mIsUserInteracting) {
23685d3998aa39f412f269806114b3e6154ccbee73fWinson Chung            reset();
23785d3998aa39f412f269806114b3e6154ccbee73fWinson Chung        }
23885d3998aa39f412f269806114b3e6154ccbee73fWinson Chung    }
23985d3998aa39f412f269806114b3e6154ccbee73fWinson Chung
24085d3998aa39f412f269806114b3e6154ccbee73fWinson Chung    /**
241d5a01599f7c90db0cc9bb11e18883a18660a2a45Winson Chung     * Disallows dragging offscreen for the duration of the current gesture.
242d5a01599f7c90db0cc9bb11e18883a18660a2a45Winson Chung     */
243d5a01599f7c90db0cc9bb11e18883a18660a2a45Winson Chung    public void setDisallowDraggingOffscreen() {
244d5a01599f7c90db0cc9bb11e18883a18660a2a45Winson Chung        mAllowDraggingOffscreen = false;
245d5a01599f7c90db0cc9bb11e18883a18660a2a45Winson Chung    }
246d5a01599f7c90db0cc9bb11e18883a18660a2a45Winson Chung
247d5a01599f7c90db0cc9bb11e18883a18660a2a45Winson Chung    /**
248d5a01599f7c90db0cc9bb11e18883a18660a2a45Winson Chung     * @return whether dragging offscreen is allowed during this gesture.
249d5a01599f7c90db0cc9bb11e18883a18660a2a45Winson Chung     */
250d5a01599f7c90db0cc9bb11e18883a18660a2a45Winson Chung    public boolean allowDraggingOffscreen() {
251d5a01599f7c90db0cc9bb11e18883a18660a2a45Winson Chung        return mAllowDraggingOffscreen;
252d5a01599f7c90db0cc9bb11e18883a18660a2a45Winson Chung    }
253d5a01599f7c90db0cc9bb11e18883a18660a2a45Winson Chung
254fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    private void initOrResetVelocityTracker() {
255fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung        if (mVelocityTracker == null) {
256fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung            mVelocityTracker = VelocityTracker.obtain();
257fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung        } else {
258fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung            mVelocityTracker.clear();
259fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung        }
260fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    }
261fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung
262fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    private void recycleVelocityTracker() {
263fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung        if (mVelocityTracker != null) {
264fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung            mVelocityTracker.recycle();
265fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung            mVelocityTracker = null;
266fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung        }
267fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung    }
26829a786590f273b123efa4bb669c4ae51dd055a00Winson Chung
26929a786590f273b123efa4bb669c4ae51dd055a00Winson Chung    public void dump(PrintWriter pw, String prefix) {
27029a786590f273b123efa4bb669c4ae51dd055a00Winson Chung        final String innerPrefix = prefix + "  ";
27129a786590f273b123efa4bb669c4ae51dd055a00Winson Chung        pw.println(prefix + TAG);
27285d3998aa39f412f269806114b3e6154ccbee73fWinson Chung        pw.println(innerPrefix + "mAllowTouches=" + mAllowTouches);
273040e72281c2b6a6bfbad169d71821dc72dec3394Winson Chung        pw.println(innerPrefix + "mActivePointerId=" + mActivePointerId);
27429a786590f273b123efa4bb669c4ae51dd055a00Winson Chung        pw.println(innerPrefix + "mDownTouch=" + mDownTouch);
27529a786590f273b123efa4bb669c4ae51dd055a00Winson Chung        pw.println(innerPrefix + "mDownDelta=" + mDownDelta);
27629a786590f273b123efa4bb669c4ae51dd055a00Winson Chung        pw.println(innerPrefix + "mLastTouch=" + mLastTouch);
27729a786590f273b123efa4bb669c4ae51dd055a00Winson Chung        pw.println(innerPrefix + "mLastDelta=" + mLastDelta);
27829a786590f273b123efa4bb669c4ae51dd055a00Winson Chung        pw.println(innerPrefix + "mVelocity=" + mVelocity);
27929a786590f273b123efa4bb669c4ae51dd055a00Winson Chung        pw.println(innerPrefix + "mIsUserInteracting=" + mIsUserInteracting);
28029a786590f273b123efa4bb669c4ae51dd055a00Winson Chung        pw.println(innerPrefix + "mIsDragging=" + mIsDragging);
28129a786590f273b123efa4bb669c4ae51dd055a00Winson Chung        pw.println(innerPrefix + "mStartedDragging=" + mStartedDragging);
28229a786590f273b123efa4bb669c4ae51dd055a00Winson Chung        pw.println(innerPrefix + "mAllowDraggingOffscreen=" + mAllowDraggingOffscreen);
28329a786590f273b123efa4bb669c4ae51dd055a00Winson Chung    }
284fa7053789f6f874ea1f950826d2471d910114f6eWinson Chung}
285