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
This commit is contained in:
Justin Weir
2022-11-29 15:26:35 -05:00
parent b96b7ad9e9
commit dd3aaa81dc
2 changed files with 25 additions and 14 deletions

View File

@@ -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);
}
};

View File

@@ -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();