Fix quick settings on Keyguard

- Fix that quick settings couldn't be scrolled nor closed on Keyguard
if scrolling was needed.
- Fix jumping in unlock motion when closing both panel and QS
- Fix invalid panel height when closing both QS and panel

Bug: 18481668
Change-Id: Ifd12e29bbc64f72f0dc13b43e36b1a57df7524fa
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 de99a82..08844f31 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -23,6 +23,9 @@
 import android.animation.ValueAnimator;
 import android.content.Context;
 import android.content.res.Configuration;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
 import android.util.AttributeSet;
 import android.util.MathUtils;
 import android.view.MotionEvent;
@@ -52,6 +55,8 @@
         View.OnClickListener, NotificationStackScrollLayout.OnOverscrollTopChangedListener,
         KeyguardAffordanceHelper.Callback, NotificationStackScrollLayout.OnEmptySpaceClickListener {
 
+    private static final boolean DEBUG = false;
+
     // Cap and total height of Roboto font. Needs to be adjusted when font for the big clock is
     // changed.
     private static final int CAP_HEIGHT = 1456;
@@ -169,6 +174,7 @@
 
     public NotificationPanelView(Context context, AttributeSet attrs) {
         super(context, attrs);
+        setWillNotDraw(!DEBUG);
     }
 
     public void setStatusBar(PhoneStatusBar bar) {
@@ -503,11 +509,11 @@
                 }
                 if (Math.abs(h) > mTouchSlop && Math.abs(h) > Math.abs(x - mInitialTouchX)
                         && shouldQuickSettingsIntercept(mInitialTouchX, mInitialTouchY, h)) {
+                    mQsTracking = true;
                     onQsExpansionStarted();
                     mInitialHeightOnTouch = mQsExpansionHeight;
                     mInitialTouchY = y;
                     mInitialTouchX = x;
-                    mQsTracking = true;
                     mIntercepting = false;
                     mNotificationStackScroller.removeLongPressCallback();
                     return true;
@@ -747,11 +753,11 @@
     public void onOverscrolled(float lastTouchX, float lastTouchY, int amount) {
         if (mIntercepting && shouldQuickSettingsIntercept(lastTouchX, lastTouchY,
                 -1 /* yDiff: Not relevant here */)) {
+            mQsTracking = true;
             onQsExpansionStarted(amount);
             mInitialHeightOnTouch = mQsExpansionHeight;
             mInitialTouchY = mLastTouchY;
             mInitialTouchX = mLastTouchX;
-            mQsTracking = true;
         }
     }
 
@@ -798,6 +804,7 @@
         }
         mScrollView.scrollTo(0, 0);
         setQsExpansion(height);
+        requestPanelHeightUpdate();
     }
 
     private void setQsExpanded(boolean expanded) {
@@ -1077,6 +1084,9 @@
                     R.string.accessibility_desc_quick_settings));
             mLastAnnouncementWasQuickSettings = true;
         }
+        if (DEBUG) {
+            invalidate();
+        }
     }
 
     private String getKeyguardOrLockScreenString() {
@@ -1239,11 +1249,9 @@
 
     @Override
     protected boolean isScrolledToBottom() {
-        if (mStatusBar.getBarState() == StatusBarState.KEYGUARD) {
-            return true;
-        }
         if (!isInSettings()) {
-            return mNotificationStackScroller.isScrolledToBottom();
+            return mStatusBar.getBarState() == StatusBarState.KEYGUARD
+                    || mNotificationStackScroller.isScrolledToBottom();
         } else {
             return mScrollView.isScrolledToBottom();
         }
@@ -1260,7 +1268,7 @@
         }
         int maxHeight;
         if (mTwoFingerQsExpand || mQsExpanded || mIsExpanding && mQsExpandedWhenExpandingStarted) {
-            maxHeight = Math.max(calculatePanelHeightQsExpanded(), calculatePanelHeightShade());
+            maxHeight = calculatePanelHeightQsExpanded();
         } else {
             maxHeight = calculatePanelHeightShade();
         }
@@ -1289,8 +1297,7 @@
                 // In Shade, interpolate linearly such that QS is closed whenever panel height is
                 // minimum QS expansion + minStackHeight
                 float panelHeightQsCollapsed = mNotificationStackScroller.getIntrinsicPadding()
-                        + mNotificationStackScroller.getMinStackHeight()
-                        + mNotificationStackScroller.getNotificationTopPadding();
+                        + mNotificationStackScroller.getMinStackHeight();
                 float panelHeightQsExpanded = calculatePanelHeightQsExpanded();
                 t = (expandedHeight - panelHeightQsCollapsed)
                         / (panelHeightQsExpanded - panelHeightQsCollapsed);
@@ -1302,6 +1309,9 @@
         updateHeader();
         updateUnlockIcon();
         updateNotificationTranslucency();
+        if (DEBUG) {
+            invalidate();
+        }
     }
 
     /**
@@ -1340,7 +1350,9 @@
         }
         float totalHeight = Math.max(
                 mQsMaxExpansionHeight + mNotificationStackScroller.getNotificationTopPadding(),
-                mClockPositionResult.stackScrollerPadding - mTopPaddingAdjustment)
+                mStatusBarState == StatusBarState.KEYGUARD
+                        ? mClockPositionResult.stackScrollerPadding - mTopPaddingAdjustment
+                        : 0)
                 + notificationHeight;
         if (totalHeight > mNotificationStackScroller.getHeight()) {
             float fullyCollapsedHeight = mQsMaxExpansionHeight
@@ -1353,7 +1365,7 @@
     }
 
     private int getScrollViewScrollY() {
-        if (mScrollYOverride != -1) {
+        if (mScrollYOverride != -1 && !mQsTracking) {
             return mScrollYOverride;
         } else {
             return mScrollView.getScrollY();
@@ -1874,4 +1886,30 @@
     public void onEmptySpaceClicked(float x, float y) {
         onEmptySpaceClick(x);
     }
+
+    @Override
+    protected void dispatchDraw(Canvas canvas) {
+        super.dispatchDraw(canvas);
+        if (DEBUG) {
+            Paint p = new Paint();
+            p.setColor(Color.RED);
+            p.setStrokeWidth(2);
+            p.setStyle(Paint.Style.STROKE);
+            canvas.drawLine(0, getMaxPanelHeight(), getWidth(), getMaxPanelHeight(), p);
+            p.setColor(Color.BLUE);
+            canvas.drawLine(0, getExpandedHeight(), getWidth(), getExpandedHeight(), p);
+            p.setColor(Color.GREEN);
+            canvas.drawLine(0, calculatePanelHeightQsExpanded(), getWidth(),
+                    calculatePanelHeightQsExpanded(), p);
+            p.setColor(Color.YELLOW);
+            canvas.drawLine(0, calculatePanelHeightShade(), getWidth(),
+                    calculatePanelHeightShade(), p);
+            p.setColor(Color.MAGENTA);
+            canvas.drawLine(0, calculateQsTopPadding(), getWidth(),
+                    calculateQsTopPadding(), p);
+            p.setColor(Color.CYAN);
+            canvas.drawLine(0, mNotificationStackScroller.getTopPadding(), getWidth(),
+                    mNotificationStackScroller.getTopPadding(), p);
+        }
+    }
 }