Implement two-finger pull down to QS.

Bug: 14590707
Change-Id: I7f88a5b26e88c79e19d4e6c7f4cc8277ffcb2d57
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 e0a1ef1..55b3088 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -126,6 +126,8 @@
     private boolean mBlockTouches;
     private ArrayList<View> mSwipeTranslationViews = new ArrayList<>();
     private int mNotificationScrimWaitDistance;
+    private boolean mTwoFingerQsExpand;
+    private boolean mTwoFingerQsExpandPossible;
 
     /**
      * If we are in a panel collapsing motion, we reset scrollY of our scroll view but still
@@ -487,7 +489,7 @@
         if (mExpandedHeight != 0) {
             handleQsDown(event);
         }
-        if (mQsTracking || mQsExpanded) {
+        if (!mTwoFingerQsExpand && (mQsTracking || mQsExpanded)) {
             onQsTouch(event);
             if (!mConflictingQsExpansionGesture) {
                 return true;
@@ -497,6 +499,15 @@
                 || event.getActionMasked() == MotionEvent.ACTION_UP) {
             mConflictingQsExpansionGesture = false;
         }
+        if (event.getActionMasked() == MotionEvent.ACTION_DOWN && mExpandedHeight == 0) {
+            mTwoFingerQsExpandPossible = true;
+        }
+        if (mTwoFingerQsExpandPossible && event.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN
+                && event.getPointerCount() == 2
+                && event.getY(event.getActionIndex()) < mStatusBarMinHeight) {
+            mTwoFingerQsExpand = true;
+            requestPanelHeightUpdate();
+        }
         super.onTouchEvent(event);
         return true;
     }
@@ -842,7 +853,7 @@
             min = Math.max(min, minHeight);
         }
         int maxHeight;
-        if (mQsExpanded || mIsExpanding && mQsExpandedWhenExpandingStarted) {
+        if (mTwoFingerQsExpand || mQsExpanded || mIsExpanding && mQsExpandedWhenExpandingStarted) {
             maxHeight = (int) calculatePanelHeightQsExpanded();
         } else {
             int emptyBottomMargin = mNotificationStackScroller.getEmptyBottomMargin();
@@ -863,7 +874,7 @@
         if (!mQsExpanded) {
             positionClockAndNotifications();
         }
-        if (mQsExpanded && !mQsTracking && mQsExpansionAnimator == null
+        if (mTwoFingerQsExpand || mQsExpanded && !mQsTracking && mQsExpansionAnimator == null
                 && !mQsExpansionFromOverscroll) {
             float panelHeightQsCollapsed = mNotificationStackScroller.getIntrinsicPadding()
                     + mNotificationStackScroller.getMinStackHeight()
@@ -1049,6 +1060,8 @@
             mHeader.setListening(true);
             mQsPanel.setListening(true);
         }
+        mTwoFingerQsExpand = false;
+        mTwoFingerQsExpandPossible = false;
     }
 
     @Override
@@ -1060,7 +1073,7 @@
 
     @Override
     protected void setOverExpansion(float overExpansion, boolean isPixels) {
-        if (mConflictingQsExpansionGesture) {
+        if (mConflictingQsExpansionGesture || mTwoFingerQsExpand) {
             return;
         }
         if (mStatusBar.getBarState() != StatusBarState.KEYGUARD) {