From 4ab2820e6c668ae7c55b300f126bb9f70c202ba3 Mon Sep 17 00:00:00 2001 From: Mady Mellor Date: Tue, 6 Jun 2017 11:42:50 -0700 Subject: [PATCH] Updates to NotificationMenuRowPlugin so that long press may be captured MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .../statusbar/NotificationMenuRowPlugin.java | 11 +++++++--- .../src/com/android/systemui/SwipeHelper.java | 20 ++++++++++++++----- .../statusbar/ExpandableNotificationRow.java | 6 +++--- .../statusbar/NotificationMenuRow.java | 4 ++-- .../statusbar/NotificationMenuRowTest.java | 6 +++--- 5 files changed, 31 insertions(+), 16 deletions(-) diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationMenuRowPlugin.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationMenuRowPlugin.java index 28f78e58c05a7..ecc2ff4791129 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationMenuRowPlugin.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationMenuRowPlugin.java @@ -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; } diff --git a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java index 93d661da9afd9..699fdef3180a6 100644 --- a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java +++ b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java @@ -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 diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java index c445c0dd77877..713f91b12e3b7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java @@ -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); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java index 570de1815fc40..9ba574b17f15b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java @@ -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; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMenuRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMenuRowTest.java index e0d8042238d2d..630da2e7eabcb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMenuRowTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMenuRowTest.java @@ -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); } }