Reenable touches to notifications in expanded QS

Revert "Closing the QS when tapping on the notifications now."
This reverts commit 3bb0bb8817690728a40edd3f8f665b09907a451b.

Revert "Disabled touch interaction when in Quick settings."
This reverts commit 5cd19bc6a4fac0513bb285fdaf08b1d19c87f4ae.

Also, shuffle order of notifications and quick settings such that
scrolling still works and delegate touches from stack scroller to
the scroll view for expanded QS panel.

In addition, make the panel close transition work when QS is expanded
and scrolled.

Last but not least, decrease scrim amount so the notifications still
look 100% interactive.

Change-Id: I17710e078cff84bcdf303c22986a31135dae2aee
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 6334930..b80a03e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -92,6 +92,7 @@
     private boolean mQsExpandedWhenExpandingStarted;
     private boolean mQsFullyExpanded;
     private boolean mKeyguardShowing;
+    private int mStatusBarState;
     private float mInitialHeightOnTouch;
     private float mInitialTouchX;
     private float mInitialTouchY;
@@ -125,7 +126,12 @@
     private boolean mBlockTouches;
     private ArrayList<View> mSwipeTranslationViews = new ArrayList<>();
     private int mNotificationScrimWaitDistance;
-    private boolean mOnNotificationsOnDown;
+
+    /**
+     * If we are in a panel collapsing motion, we reset scrollY of our scroll view but still
+     * need to take this into account in our panel height calculation.
+     */
+    private int mScrollYOverride = -1;
 
     public NotificationPanelView(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -152,6 +158,7 @@
                 findViewById(R.id.notification_stack_scroller);
         mNotificationStackScroller.setOnHeightChangedListener(this);
         mNotificationStackScroller.setOverscrollTopChangedListener(this);
+        mNotificationStackScroller.setScrollView(mScrollView);
         mFastOutSlowInInterpolator = AnimationUtils.loadInterpolator(getContext(),
                 android.R.interpolator.fast_out_slow_in);
         mFastOutLinearInterpolator = AnimationUtils.loadInterpolator(getContext(),
@@ -347,7 +354,6 @@
                 mInitialTouchX = x;
                 initVelocityTracker();
                 trackMovement(event);
-                mOnNotificationsOnDown = isOnNotifications(x, y);
                 if (shouldQuickSettingsIntercept(mInitialTouchX, mInitialTouchY, 0)) {
                     getParent().requestDisallowInterceptTouchEvent(true);
                 }
@@ -395,8 +401,6 @@
                 if (mQsTracking) {
                     flingQsWithCurrentVelocity();
                     mQsTracking = false;
-                } else if (mQsFullyExpanded && mOnNotificationsOnDown) {
-                    flingSettings(0 /* vel */, false /* expand */);
                 }
                 mIntercepting = false;
                 break;
@@ -404,10 +408,6 @@
         return !mQsExpanded && super.onInterceptTouchEvent(event);
     }
 
-    private boolean isOnNotifications(float x, float y) {
-        return mNotificationStackScroller.getChildAtPosition(x, y) != null;
-    }
-
     @Override
     public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
 
@@ -561,7 +561,6 @@
         }
     }
 
-
     @Override
     public void onOverscrollTopChanged(float amount, boolean isRubberbanded) {
         cancelAnimation();
@@ -580,6 +579,7 @@
             public void run() {
                 mStackScrollerOverscrolling = false;
                 mQsExpansionFromOverscroll = false;
+                updateQsState();
             }
         });
     }
@@ -603,14 +603,18 @@
             mQsExpanded = expanded;
             updateQsState();
             requestPanelHeightUpdate();
+            mNotificationStackScroller.setInterceptDelegateEnabled(expanded);
         }
     }
 
-    public void setKeyguardShowing(boolean keyguardShowing) {
+    public void setBarState(int statusBarState) {
+        boolean keyguardShowing = statusBarState == StatusBarState.KEYGUARD
+                || statusBarState == StatusBarState.SHADE_LOCKED;
         if (!mKeyguardShowing && keyguardShowing) {
             setQsTranslation(mQsExpansionHeight);
             mHeader.setTranslationY(0f);
         }
+        mStatusBarState = statusBarState;
         mKeyguardShowing = keyguardShowing;
         updateQsState();
     }
@@ -618,12 +622,12 @@
     private void updateQsState() {
         boolean expandVisually = mQsExpanded || mStackScrollerOverscrolling;
         mHeader.setExpanded(expandVisually, mStackScrollerOverscrolling);
-        mNotificationStackScroller.setEnabled(!mQsExpanded || mQsExpansionFromOverscroll);
+        mNotificationStackScroller.setScrollingEnabled(mStatusBarState != StatusBarState.KEYGUARD
+                && (!mQsExpanded || mQsExpansionFromOverscroll));
         mQsPanel.setVisibility(expandVisually ? View.VISIBLE : View.INVISIBLE);
         mQsContainer.setVisibility(
                 mKeyguardShowing && !expandVisually ? View.INVISIBLE : View.VISIBLE);
         mScrollView.setTouchEnabled(mQsExpanded);
-        mNotificationStackScroller.setTouchEnabled(!mQsExpanded || mQsExpansionFromOverscroll);
     }
 
     private void setQsExpansion(float height) {
@@ -823,8 +827,12 @@
             float panelHeightQsExpanded = calculatePanelHeightQsExpanded();
             float t = (expandedHeight - panelHeightQsCollapsed)
                     / (panelHeightQsExpanded - panelHeightQsCollapsed);
+            int qsTempMaxExpansion = mQsMaxExpansionHeight;
+            if (mScrollYOverride != -1) {
+                qsTempMaxExpansion -= mScrollYOverride;
+            }
             setQsExpansion(mQsMinExpansionHeight
-                    + t * (mQsMaxExpansionHeight - mQsMinExpansionHeight));
+                    + t * (qsTempMaxExpansion - mQsMinExpansionHeight));
         }
         mNotificationStackScroller.setStackHeight(expandedHeight);
         updateHeader();
@@ -841,12 +849,20 @@
         if (totalHeight > mNotificationStackScroller.getHeight()) {
             float fullyCollapsedHeight = mQsMaxExpansionHeight
                     + mNotificationStackScroller.getMinStackHeight()
-                    + mNotificationStackScroller.getNotificationTopPadding();
+                    + mNotificationStackScroller.getNotificationTopPadding()
+                    - getScrollViewScrollY();
             totalHeight = Math.max(fullyCollapsedHeight, mNotificationStackScroller.getHeight());
         }
         return totalHeight;
     }
 
+    private int getScrollViewScrollY() {
+        if (mScrollYOverride != -1) {
+            return mScrollYOverride;
+        } else {
+            return mScrollView.getScrollY();
+        }
+    }
     private void updateNotificationTranslucency() {
         float alpha = (mNotificationStackScroller.getNotificationsTopY()
                 + mNotificationStackScroller.getItemHeight())
@@ -957,6 +973,10 @@
         mNotificationStackScroller.onExpansionStarted();
         mIsExpanding = true;
         mQsExpandedWhenExpandingStarted = mQsExpanded;
+        if (mQsExpanded) {
+            mScrollYOverride = mScrollView.getScrollY();
+            onQsExpansionStarted();
+        }
     }
 
     @Override
@@ -964,6 +984,7 @@
         super.onExpandingFinished();
         mNotificationStackScroller.onExpansionStopped();
         mIsExpanding = false;
+        mScrollYOverride = -1;
         if (mExpandedHeight == 0f) {
             mHeader.setListening(false);
             mQsPanel.setListening(false);
@@ -1044,6 +1065,7 @@
     public void onScrollChanged() {
         if (mQsExpanded) {
             requestScrollerTopPaddingUpdate(false /* animate */);
+            requestPanelHeightUpdate();
         }
     }