Merge "Don't always auto-collapse an empty notification shade."
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index ed9b542..a92703c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -968,7 +968,8 @@
                 mHandler.sendEmptyMessage(MSG_HIDE_HEADS_UP);
             }
 
-            if (CLOSE_PANEL_WHEN_EMPTIED && mNotificationData.size() == 0) {
+            if (CLOSE_PANEL_WHEN_EMPTIED && mNotificationData.size() == 0
+                    && !mStatusBarWindow.isPointerDown()) {
                 animateCollapsePanels();
             }
         }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
index a600aae..800bc02 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
@@ -42,6 +42,7 @@
     private NotificationRowLayout latestItems;
     private NotificationPanelView mNotificationPanel;
     private ScrollView mScrollView;
+    private boolean mPointerDown;
 
     PhoneStatusBar mService;
 
@@ -86,6 +87,7 @@
 
     @Override
     public boolean onInterceptTouchEvent(MotionEvent ev) {
+        registerPointer(ev);
         boolean intercept = false;
         if (mNotificationPanel.isFullyExpanded() && mScrollView.getVisibility() == View.VISIBLE) {
             intercept = mExpandHelper.onInterceptTouchEvent(ev);
@@ -131,5 +133,21 @@
             mExpandHelper.cancel();
         }
     }
+
+    private void registerPointer(MotionEvent event) {
+        switch (event.getAction()) {
+            case MotionEvent.ACTION_DOWN:
+                mPointerDown = true;
+                break;
+            case MotionEvent.ACTION_CANCEL:
+            case MotionEvent.ACTION_UP:
+                mPointerDown = false;
+                break;
+        }
+    }
+
+    public boolean isPointerDown() {
+        return mPointerDown;
+    }
 }