OSDN Git Service

Updates to NotificationMenuRowPlugin so that long press may be captured
authorMady Mellor <madym@google.com>
Tue, 6 Jun 2017 18:42:50 +0000 (11:42 -0700)
committerMady Mellor <madym@google.com>
Mon, 12 Jun 2017 18:08:19 +0000 (18:08 +0000)
This will allow the NotificationMenuRow plugin to do something else
rather than showing a menu when the view is long pressed.

- Allow menu to intercept touch events
- If the menu item provided to long press is null, don’t show it
- Also passes the status bar notification when the menu is created
  or updated

Bug: 62534409
Test: manual, have no plugin and long press -> see notification info
      have a plugin that returns null for long press -> nothing happens
Change-Id: I384c5217d5343e990f4c3506eb2477b015705e5c

packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationMenuRowPlugin.java
packages/SystemUI/src/com/android/systemui/SwipeHelper.java
packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java
packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMenuRowTest.java

index 28f78e5..ecc2ff4 100644 (file)
@@ -15,6 +15,7 @@
 package com.android.systemui.plugins.statusbar;
 
 import android.content.Context;
+import android.service.notification.StatusBarNotification;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewGroup;
@@ -37,7 +38,7 @@ import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.MenuItem
 public interface NotificationMenuRowPlugin extends Plugin {
 
     public static final String ACTION = "com.android.systemui.action.PLUGIN_NOTIFICATION_MENU_ROW";
-    public static final int VERSION = 2;
+    public static final int VERSION = 3;
 
     @ProvidesInterface(version = OnMenuEventListener.VERSION)
     public interface OnMenuEventListener {
@@ -77,7 +78,7 @@ public interface NotificationMenuRowPlugin extends Plugin {
 
     public void setAppName(String appName);
 
-    public void createMenu(ViewGroup parent);
+    public void createMenu(ViewGroup parent, StatusBarNotification sbn);
 
     public View getMenuView();
 
@@ -89,10 +90,14 @@ public interface NotificationMenuRowPlugin extends Plugin {
 
     public void onHeightUpdate();
 
-    public void onNotificationUpdated();
+    public void onNotificationUpdated(StatusBarNotification sbn);
 
     public boolean onTouchEvent(View view, MotionEvent ev, float velocity);
 
+    public default boolean onInterceptTouchEvent(View view, MotionEvent ev) {
+        return false;
+    }
+
     public default boolean useDefaultMenuItems() {
         return false;
     }
index 93d661d..699fdef 100644 (file)
@@ -32,6 +32,7 @@ import android.view.View;
 import android.view.ViewConfiguration;
 import android.view.accessibility.AccessibilityEvent;
 import com.android.systemui.classifier.FalsingManager;
+import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
 import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.MenuItem;
 import com.android.systemui.statusbar.ExpandableNotificationRow;
 import com.android.systemui.statusbar.FlingAnimationUtils;
@@ -81,6 +82,7 @@ public class SwipeHelper implements Gefingerpoken {
     private float mDensityScale;
     private float mTranslation = 0;
 
+    private boolean mMenuRowIntercepting;
     private boolean mLongPressSent;
     private LongPressListener mLongPressListener;
     private Runnable mWatchLongPress;
@@ -265,6 +267,10 @@ public class SwipeHelper implements Gefingerpoken {
 
     @Override
     public boolean onInterceptTouchEvent(final MotionEvent ev) {
+        if (mCurrView instanceof ExpandableNotificationRow) {
+            NotificationMenuRowPlugin nmr = ((ExpandableNotificationRow) mCurrView).getProvider();
+            mMenuRowIntercepting = nmr.onInterceptTouchEvent(mCurrView, ev);
+        }
         final int action = ev.getAction();
 
         switch (action) {
@@ -300,7 +306,10 @@ public class SwipeHelper implements Gefingerpoken {
                                             menuItem = ((ExpandableNotificationRow) mCurrView)
                                                     .getProvider().getLongpressMenuItem(mContext);
                                         }
-                                        mLongPressListener.onLongPress(mCurrView, x, y, menuItem);
+                                        if (menuItem != null) {
+                                            mLongPressListener.onLongPress(mCurrView, x, y,
+                                                    menuItem);
+                                        }
                                     }
                                 }
                             };
@@ -330,15 +339,16 @@ public class SwipeHelper implements Gefingerpoken {
 
             case MotionEvent.ACTION_UP:
             case MotionEvent.ACTION_CANCEL:
-                final boolean captured = (mDragging || mLongPressSent);
+                final boolean captured = (mDragging || mLongPressSent || mMenuRowIntercepting);
                 mDragging = false;
                 mCurrView = null;
                 mLongPressSent = false;
+                mMenuRowIntercepting = false;
                 removeLongPressCallback();
                 if (captured) return true;
                 break;
         }
-        return mDragging || mLongPressSent;
+        return mDragging || mLongPressSent || mMenuRowIntercepting;
     }
 
     /**
@@ -557,11 +567,11 @@ public class SwipeHelper implements Gefingerpoken {
 
     @Override
     public boolean onTouchEvent(MotionEvent ev) {
-        if (mLongPressSent) {
+        if (mLongPressSent && !mMenuRowIntercepting) {
             return true;
         }
 
-        if (!mDragging) {
+        if (!mDragging && !mMenuRowIntercepting) {
             if (mCallback.getChildAtPosition(ev) != null) {
 
                 // We are dragging directly over a card, make sure that we also catch the gesture
index c445c0d..713f91b 100644 (file)
@@ -349,7 +349,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
         mShowingPublicInitialized = false;
         updateNotificationColor();
         if (mMenuRow != null) {
-            mMenuRow.onNotificationUpdated();
+            mMenuRow.onNotificationUpdated(mStatusBarNotification);
         }
         if (mIsSummaryWithChildren) {
             mChildrenContainer.recreateNotificationHeader(mExpandClickListener);
@@ -817,7 +817,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
 
     public NotificationMenuRowPlugin createMenu() {
         if (mMenuRow.getMenuView() == null) {
-            mMenuRow.createMenu(this);
+            mMenuRow.createMenu(this, mStatusBarNotification);
             mMenuRow.setAppName(mAppName);
             FrameLayout.LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT,
                     LayoutParams.MATCH_PARENT);
@@ -852,7 +852,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
         if (oldMenu != null) {
             int menuIndex = indexOfChild(oldMenu);
             removeView(oldMenu);
-            mMenuRow.createMenu(ExpandableNotificationRow.this);
+            mMenuRow.createMenu(ExpandableNotificationRow.this, mStatusBarNotification);
             mMenuRow.setAppName(mAppName);
             addView(mMenuRow.getMenuView(), menuIndex);
         }
index 570de18..9ba574b 100644 (file)
@@ -138,7 +138,7 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl
     }
 
     @Override
-    public void createMenu(ViewGroup parent) {
+    public void createMenu(ViewGroup parent, StatusBarNotification sbn) {
         mParent = (ExpandableNotificationRow) parent;
         createMenuViews(true /* resetState */);
     }
@@ -159,7 +159,7 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl
     }
 
     @Override
-    public void onNotificationUpdated() {
+    public void onNotificationUpdated(StatusBarNotification sbn) {
         if (mMenuContainer == null) {
             // Menu hasn't been created yet, no need to do anything.
             return;
index e0d8042..630da2e 100644 (file)
@@ -42,7 +42,7 @@ public class NotificationMenuRowTest extends LeakCheckedTest {
     @Test
     public void testAttachDetach() {
         NotificationMenuRowPlugin row = new NotificationMenuRow(mContext);
-        row.createMenu(null);
+        row.createMenu(null, null);
         ViewUtils.attachView(row.getMenuView());
         TestableLooper.get(this).processAllMessages();
         ViewUtils.detachView(row.getMenuView());
@@ -52,9 +52,9 @@ public class NotificationMenuRowTest extends LeakCheckedTest {
     @Test
     public void testRecreateMenu() {
         NotificationMenuRowPlugin row = new NotificationMenuRow(mContext);
-        row.createMenu(null);
+        row.createMenu(null, null);
         assertTrue(row.getMenuView() != null);
-        row.createMenu(null);
+        row.createMenu(null, null);
         assertTrue(row.getMenuView() != null);
     }
 }