Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dd3aaa81 authored by Justin Weir's avatar Justin Weir
Browse files

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
parent b96b7ad9
Loading
Loading
Loading
Loading
+13 −13
Original line number Diff line number Diff line
@@ -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()
                                )
                        );
                    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);
                }
            };
+12 −1
Original line number Diff line number Diff line
@@ -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();