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