diff options
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java | 59 |
1 files changed, 38 insertions, 21 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java index aba64bdf6e63..f2218651d7c7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java @@ -121,8 +121,8 @@ public class EdgeBackGestureHandler implements DisplayListener { private final int mEdgeWidth; // The slop to distinguish between horizontal and vertical motion private final float mTouchSlop; - // Minimum distance to move so that is can be considerd as a back swipe - private final float mSwipeThreshold; + // Duration after which we consider the event as longpress. + private final int mLongPressTimeout; // The threshold where the touch needs to be at most, such that the arrow is displayed above the // finger, otherwise it will be below private final int mMinArrowPosition; @@ -164,8 +164,9 @@ public class EdgeBackGestureHandler implements DisplayListener { // TODO: Get this for the current user mEdgeWidth = res.getDimensionPixelSize( com.android.internal.R.dimen.config_backGestureInset); + mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); - mSwipeThreshold = res.getDimension(R.dimen.navigation_edge_action_drag_threshold); + mLongPressTimeout = ViewConfiguration.getLongPressTimeout(); mNavBarHeight = res.getDimensionPixelSize(R.dimen.navigation_bar_frame_height); mMinArrowPosition = res.getDimensionPixelSize( @@ -308,8 +309,18 @@ public class EdgeBackGestureHandler implements DisplayListener { return !isInExcludedRegion; } + private void cancelGesture(MotionEvent ev) { + // Send action cancel to reset all the touch events + mAllowGesture = false; + MotionEvent cancelEv = MotionEvent.obtain(ev); + cancelEv.setAction(MotionEvent.ACTION_CANCEL); + mEdgePanel.handleTouch(cancelEv); + cancelEv.recycle(); + } + private void onMotionEvent(MotionEvent ev) { - if (ev.getAction() == MotionEvent.ACTION_DOWN) { + int action = ev.getActionMasked(); + if (action == MotionEvent.ACTION_DOWN) { // Verify if this is in within the touch region and we aren't in immersive mode, and // either the bouncer is showing or the notification panel is hidden int stateFlags = mOverviewProxyService.getSystemUiStateFlags(); @@ -330,29 +341,35 @@ public class EdgeBackGestureHandler implements DisplayListener { mThresholdCrossed = false; } } else if (mAllowGesture) { - if (!mThresholdCrossed && ev.getAction() == MotionEvent.ACTION_MOVE) { - float dx = Math.abs(ev.getX() - mDownPoint.x); - float dy = Math.abs(ev.getY() - mDownPoint.y); - if (dy > dx && dy > mTouchSlop) { - // Send action cancel to reset all the touch events - mAllowGesture = false; - MotionEvent cancelEv = MotionEvent.obtain(ev); - cancelEv.setAction(MotionEvent.ACTION_CANCEL); - mEdgePanel.handleTouch(cancelEv); - cancelEv.recycle(); + if (!mThresholdCrossed) { + if (action == MotionEvent.ACTION_POINTER_DOWN) { + // We do not support multi touch for back gesture + cancelGesture(ev); return; - - } else if (dx > dy && dx > mTouchSlop) { - mThresholdCrossed = true; - // Capture inputs - mInputMonitor.pilferPointers(); + } else if (action == MotionEvent.ACTION_MOVE) { + if ((ev.getEventTime() - ev.getDownTime()) > mLongPressTimeout) { + cancelGesture(ev); + return; + } + float dx = Math.abs(ev.getX() - mDownPoint.x); + float dy = Math.abs(ev.getY() - mDownPoint.y); + if (dy > dx && dy > mTouchSlop) { + cancelGesture(ev); + return; + + } else if (dx > dy && dx > mTouchSlop) { + mThresholdCrossed = true; + // Capture inputs + mInputMonitor.pilferPointers(); + } } + } // forward touch mEdgePanel.handleTouch(ev); - boolean isUp = ev.getAction() == MotionEvent.ACTION_UP; + boolean isUp = action == MotionEvent.ACTION_UP; if (isUp) { boolean performAction = mEdgePanel.shouldTriggerBack(); if (performAction) { @@ -363,7 +380,7 @@ public class EdgeBackGestureHandler implements DisplayListener { mOverviewProxyService.notifyBackAction(performAction, (int) mDownPoint.x, (int) mDownPoint.y, false /* isButton */, !mIsOnLeftEdge); } - if (isUp || ev.getAction() == MotionEvent.ACTION_CANCEL) { + if (isUp || action == MotionEvent.ACTION_CANCEL) { mRegionSamplingHelper.stop(); } else { updateSamplingRect(); |