From dd3aaa81dc7bcd50bfa8cc87657bdbe9e2b47fdf Mon Sep 17 00:00:00 2001 From: Justin Weir Date: Tue, 29 Nov 2022 15:26:35 -0500 Subject: [PATCH] Prevent touch event dispatch on the top edge when collapsed For some reason, touch events at y=0 can get dispatched all the way to Quick Settings, even though it is not visible. This change prevents that from happening in the most narrow way I could find. Fixes: 235889526 Test: atest and manual Change-Id: Iedbb3b55a94864d320b886ba7c29913ad4b8b145 --- .../NotificationPanelViewController.java | 26 +++++++++---------- .../NotificationPanelViewControllerTest.java | 13 +++++++++- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java index 629d3d4d50ba8..13ce20cb5822a 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java @@ -4603,20 +4603,20 @@ public final class NotificationPanelViewController implements Dumpable { return false; } - // If the view that would receive the touch is disabled, just have status bar - // eat the gesture. - if (event.getAction() == MotionEvent.ACTION_DOWN && !mView.isEnabled()) { - Log.v(TAG, - String.format( - "onTouchForwardedFromStatusBar: " - + "panel view disabled, eating touch at (%d,%d)", - (int) event.getX(), - (int) event.getY() - ) - ); - return true; + if (event.getAction() == MotionEvent.ACTION_DOWN) { + // If the view that would receive the touch is disabled, just have status + // bar eat the gesture. + if (!mView.isEnabled()) { + mShadeLog.logMotionEvent(event, + "onTouchForwardedFromStatusBar: panel view disabled"); + return true; + } + if (isFullyCollapsed() && event.getY() < 1f) { + // b/235889526 Eat events on the top edge of the phone when collapsed + mShadeLog.logMotionEvent(event, "top edge touch ignored"); + return true; + } } - return mView.dispatchTouchEvent(event); } }; diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java index 69a45599668bd..f5b3bd081c72c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java @@ -831,13 +831,24 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { public void handleTouchEventFromStatusBar_panelAndViewEnabled_viewReceivesEvent() { when(mCommandQueue.panelsEnabled()).thenReturn(true); when(mView.isEnabled()).thenReturn(true); - MotionEvent event = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0f, 0f, 0); + MotionEvent event = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0f, 2f, 0); mNotificationPanelViewController.getStatusBarTouchEventHandler().handleTouchEvent(event); verify(mView).dispatchTouchEvent(event); } + @Test + public void handleTouchEventFromStatusBar_topEdgeTouch_viewNeverReceivesEvent() { + when(mCommandQueue.panelsEnabled()).thenReturn(true); + when(mView.isEnabled()).thenReturn(true); + MotionEvent event = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 0f, 0f, 0); + + mNotificationPanelViewController.getStatusBarTouchEventHandler().handleTouchEvent(event); + + verify(mView, never()).dispatchTouchEvent(event); + } + @Test public void testA11y_initializeNode() { AccessibilityNodeInfo nodeInfo = new AccessibilityNodeInfo();