From b7240136b748e548069c7fe2bd77a7ed4148728e Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Mon, 30 Jun 2014 01:39:07 +0200 Subject: [PATCH] Improve fling logic for opening the notification shade Bug: 15858126 Change-Id: I800b00f80b315218358ea9acbd3614e6d5c87c45 --- .../systemui/statusbar/phone/PanelView.java | 35 ++++++++++++---------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java index c5924867c3c8..7093787a2bd0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java @@ -195,7 +195,12 @@ public abstract class PanelView extends FrameLayout { case MotionEvent.ACTION_MOVE: float h = y - mInitialTouchY; - if (Math.abs(h) > mTouchSlop && Math.abs(h) > Math.abs(x - mInitialTouchX)) { + + // If the panel was collapsed when touching, we only need to check for the + // y-component of the gesture, as we have no conflicting horizontal gesture. + if (Math.abs(h) > mTouchSlop + && (Math.abs(h) > Math.abs(x - mInitialTouchX) + || mInitialOffsetOnTouch == 0f)) { mTouchSlopExceeded = true; if (waitForTouchSlop && !mTracking) { mInitialOffsetOnTouch = mExpandedHeight; @@ -229,8 +234,15 @@ public abstract class PanelView extends FrameLayout { trackMovement(event); if ((mTracking && mTouchSlopExceeded) || event.getActionMasked() == MotionEvent.ACTION_CANCEL) { - float vel = getCurrentVelocity(); - boolean expand = flingExpands(vel); + float vel = 0f; + float vectorVel = 0f; + if (mVelocityTracker != null) { + mVelocityTracker.computeCurrentVelocity(1000); + vel = mVelocityTracker.getYVelocity(); + vectorVel = (float) Math.hypot( + mVelocityTracker.getXVelocity(), mVelocityTracker.getYVelocity()); + } + boolean expand = flingExpands(vel, vectorVel); onTrackingStopped(expand); fling(vel, expand); } else { @@ -259,16 +271,6 @@ public abstract class PanelView extends FrameLayout { onExpandingStarted(); } - private float getCurrentVelocity() { - - // the velocitytracker might be null if we got a bad input stream - if (mVelocityTracker == null) { - return 0; - } - mVelocityTracker.computeCurrentVelocity(1000); - return mVelocityTracker.getYVelocity(); - } - @Override public boolean onInterceptTouchEvent(MotionEvent event) { if (mInstantExpanding) { @@ -368,11 +370,12 @@ public abstract class PanelView extends FrameLayout { } /** - * @param vel the current velocity of the motion + * @param vel the current vertical velocity of the motion + * @param vectorVel the length of the vectorial velocity * @return whether a fling should expands the panel; contracts otherwise */ - private boolean flingExpands(float vel) { - if (Math.abs(vel) < mFlingAnimationUtils.getMinVelocityPxPerSecond()) { + private boolean flingExpands(float vel, float vectorVel) { + if (Math.abs(vectorVel) < mFlingAnimationUtils.getMinVelocityPxPerSecond()) { return getExpandedFraction() > 0.5f; } else { return vel > 0; -- 2.11.0