Start expanding QS directly when overscrolling to it.

This removes the janky transition from scrolling to flinging.

Change-Id: I691ac94ec06af7f7431ad162e07c21d2c753e99c
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index c82bdf6..2790540 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -94,6 +94,7 @@
     private int mQsMaxExpansionHeight;
     private int mQsPeekHeight;
     private boolean mStackScrollerOverscrolling;
+    private boolean mQsExpansionFromOverscroll;
     private boolean mQsExpansionEnabled = true;
     private ValueAnimator mQsExpansionAnimator;
     private FlingAnimationUtils mFlingAnimationUtils;
@@ -523,19 +524,25 @@
 
 
     @Override
-    public void onOverscrollTopChanged(float amount) {
+    public void onOverscrollTopChanged(float amount, boolean isRubberbanded) {
         cancelAnimation();
         float rounded = amount >= 1f ? amount : 0f;
-        mStackScrollerOverscrolling = rounded != 0f;
+        mStackScrollerOverscrolling = rounded != 0f && isRubberbanded;
+        mQsExpansionFromOverscroll = rounded != 0f;
         setQsExpansion(mQsMinExpansionHeight + rounded);
         updateQsState();
     }
 
     @Override
     public void flingTopOverscroll(float velocity, boolean open) {
-        mStackScrollerOverscrolling = false;
         setQsExpansion(mQsExpansionHeight);
-        flingSettings(velocity, open);
+        flingSettings(velocity, open, new Runnable() {
+            @Override
+            public void run() {
+                mStackScrollerOverscrolling = false;
+                mQsExpansionFromOverscroll = false;
+            }
+        });
     }
 
     private void onQsExpansionStarted() {
@@ -571,13 +578,12 @@
     private void updateQsState() {
         boolean expandVisually = mQsExpanded || mStackScrollerOverscrolling;
         mHeader.setExpanded(expandVisually, mStackScrollerOverscrolling);
-        mNotificationStackScroller.setEnabled(!mQsExpanded);
+        mNotificationStackScroller.setEnabled(!mQsExpanded || mQsExpansionFromOverscroll);
         mQsPanel.setVisibility(expandVisually ? View.VISIBLE : View.INVISIBLE);
-        mQsContainer.setVisibility(mKeyguardShowing && !expandVisually
-                ? View.INVISIBLE
-                : View.VISIBLE);
+        mQsContainer.setVisibility(
+                mKeyguardShowing && !expandVisually ? View.INVISIBLE : View.VISIBLE);
         mScrollView.setTouchEnabled(mQsExpanded);
-        mNotificationStackScroller.setTouchEnabled(!mQsExpanded);
+        mNotificationStackScroller.setTouchEnabled(!mQsExpanded || mQsExpansionFromOverscroll);
     }
 
     private void setQsExpansion(float height) {
@@ -640,9 +646,17 @@
             mQsExpansionAnimator.cancel();
         }
     }
+
     private void flingSettings(float vel, boolean expand) {
+        flingSettings(vel, expand, null);
+    }
+
+    private void flingSettings(float vel, boolean expand, final Runnable onFinishRunnable) {
         float target = expand ? mQsMaxExpansionHeight : mQsMinExpansionHeight;
         if (target == mQsExpansionHeight) {
+            if (onFinishRunnable != null) {
+                onFinishRunnable.run();
+            }
             return;
         }
         ValueAnimator animator = ValueAnimator.ofFloat(mQsExpansionHeight, target);
@@ -657,6 +671,9 @@
             @Override
             public void onAnimationEnd(Animator animation) {
                 mQsExpansionAnimator = null;
+                if (onFinishRunnable != null) {
+                    onFinishRunnable.run();
+                }
             }
         });
         animator.start();