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

Commit 655f0a37 authored by András Kurucz's avatar András Kurucz
Browse files

Avoid duplicate calls to the FalsingManager upon Notification dismissals

Upon handling the touch events in NotificationSwipeHelper we were calling isDismissGesture(event) multiple times for the same event. It resulted in multiple calls to the FalsingManager#isFalseTouch() which then recalculated the results for each call.

Bug: 236197248
Test: atest NotificationSwipeHelperTest
Change-Id: Ie0e24a1b3107564f7e0810501739fe2a67d95b5b
parent 9fb9f4cf
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -251,13 +251,13 @@ class NotificationSwipeHelper extends SwipeHelper implements NotificationSwipeAc
                || (isFastNonDismissGesture && isAbleToShowMenu);
        int menuSnapTarget = menuRow.getMenuSnapTarget();
        boolean isNonFalseMenuRevealingGesture =
                !isFalseGesture() && isMenuRevealingGestureAwayFromMenu;
                isMenuRevealingGestureAwayFromMenu && !isFalseGesture();
        if ((isNonDismissGestureTowardsMenu || isNonFalseMenuRevealingGesture)
                && menuSnapTarget != 0) {
            // Menu has not been snapped to previously and this is menu revealing gesture
            snapOpen(animView, menuSnapTarget, velocity);
            menuRow.onSnapOpen();
        } else if (isDismissGesture(ev) && !gestureTowardsMenu) {
        } else if (isDismissGesture && !gestureTowardsMenu) {
            dismiss(animView, velocity);
            menuRow.onDismiss();
        } else {
+145 −4
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import static junit.framework.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyFloat;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
@@ -227,14 +228,154 @@ public class NotificationSwipeHelperTest extends SysuiTestCase {
    }

    @Test
    public void testHandleUpEvent_menuRow() {
        when(mSwipeHelper.getCurrentMenuRow()).thenReturn(mMenuRow);
        doNothing().when(mSwipeHelper).handleMenuRowSwipe(mEvent, mView, 0, mMenuRow);
    public void testHandleUpEvent_menuRowWithoutMenu_dismiss() {
        doNothing().when(mSwipeHelper).dismiss(any(), anyFloat());
        doReturn(true).when(mSwipeHelper).isDismissGesture(any());
        doReturn(true).when(mSwipeHelper).swipedFarEnough();
        when(mMenuRow.shouldShowMenu()).thenReturn(true);
        mSwipeHelper.setCurrentMenuRow(mMenuRow);

        assertTrue("Menu row exists",
                mSwipeHelper.handleUpEvent(mEvent, mView, 0, 0));
        verify(mMenuRow, times(1)).onTouchEnd();
        verify(mSwipeHelper, times(1)).isDismissGesture(mEvent);
        verify(mSwipeHelper, times(1)).dismiss(mView, 0);
        verify(mSwipeHelper, never()).isFalseGesture();
    }

    @Test
    public void testHandleUpEvent_menuRowWithoutMenu_snapback() {
        doNothing().when(mSwipeHelper).snapChild(any(), anyInt(), anyFloat());
        doReturn(false).when(mSwipeHelper).isDismissGesture(any());
        doReturn(true).when(mSwipeHelper).swipedFarEnough();
        when(mMenuRow.shouldShowMenu()).thenReturn(true);
        mSwipeHelper.setCurrentMenuRow(mMenuRow);

        assertTrue("Menu row exists",
                mSwipeHelper.handleUpEvent(mEvent, mView, 0, 0));
        verify(mMenuRow, times(1)).onTouchEnd();
        verify(mSwipeHelper, times(1)).isDismissGesture(mEvent);
        verify(mSwipeHelper, times(1)).snapClosed(mView, 0);
        verify(mMenuRow, times(1)).onSnapClosed();
        verify(mSwipeHelper, never()).isFalseGesture();
    }

    @Test
    public void testHandleUpEvent_menuRowWithOpenMenu_dismissed() {
        doNothing().when(mSwipeHelper).dismiss(any(), anyFloat());
        doReturn(true).when(mSwipeHelper).isDismissGesture(any());
        doReturn(true).when(mSwipeHelper).swipedFarEnough();
        when(mMenuRow.shouldShowMenu()).thenReturn(true);
        when(mMenuRow.isSnappedAndOnSameSide()).thenReturn(true);
        mSwipeHelper.setCurrentMenuRow(mMenuRow);

        assertTrue("Menu row exists",
                mSwipeHelper.handleUpEvent(mEvent, mView, 0, 0));
        verify(mMenuRow, times(1)).onTouchEnd();
        verify(mSwipeHelper, times(1)).isDismissGesture(mEvent);
        verify(mSwipeHelper, times(1)).dismiss(mView, 0);
        verify(mSwipeHelper, never()).isFalseGesture();
    }

    @Test
    public void testHandleUpEvent_menuRowWithOpenMenu_snapback() {
        doNothing().when(mSwipeHelper).snapChild(any(), anyInt(), anyFloat());
        doReturn(false).when(mSwipeHelper).isDismissGesture(any());
        doReturn(true).when(mSwipeHelper).swipedFarEnough();
        when(mMenuRow.shouldShowMenu()).thenReturn(true);
        when(mMenuRow.isSnappedAndOnSameSide()).thenReturn(true);
        mSwipeHelper.setCurrentMenuRow(mMenuRow);

        assertTrue("Menu row exists",
                mSwipeHelper.handleUpEvent(mEvent, mView, 0, 0));
        verify(mMenuRow, times(1)).onTouchEnd();
        verify(mSwipeHelper, times(1)).isDismissGesture(mEvent);
        verify(mSwipeHelper, times(1)).snapClosed(mView, 0);
        verify(mMenuRow, times(1)).onSnapClosed();
        verify(mSwipeHelper, never()).isFalseGesture();
    }

    @Test
    public void testHandleUpEvent_menuRowWithClosedMenu_dismissed() {
        doNothing().when(mSwipeHelper).dismiss(any(), anyFloat());
        doReturn(true).when(mSwipeHelper).isDismissGesture(any());
        doReturn(true).when(mSwipeHelper).swipedFarEnough();
        when(mMenuRow.shouldShowMenu()).thenReturn(true);
        when(mMenuRow.isSnappedAndOnSameSide()).thenReturn(false);
        mSwipeHelper.setCurrentMenuRow(mMenuRow);

        assertTrue("Menu row exists",
                mSwipeHelper.handleUpEvent(mEvent, mView, 0, 0));
        verify(mMenuRow, times(1)).onTouchEnd();
        verify(mSwipeHelper, times(1)).handleMenuRowSwipe(mEvent, mView, 0, mMenuRow);
        verify(mSwipeHelper, times(1)).isDismissGesture(mEvent);
        verify(mSwipeHelper, times(1)).dismiss(mView, 0);
        verify(mSwipeHelper, never()).isFalseGesture();
    }

    @Test
    public void testHandleUpEvent_menuRowWithClosedMenu_snapback() {
        doNothing().when(mSwipeHelper).snapChild(any(), anyInt(), anyFloat());
        doReturn(false).when(mSwipeHelper).isDismissGesture(any());
        doReturn(true).when(mSwipeHelper).swipedFarEnough();
        when(mMenuRow.shouldShowMenu()).thenReturn(true);
        when(mMenuRow.isSnappedAndOnSameSide()).thenReturn(false);
        mSwipeHelper.setCurrentMenuRow(mMenuRow);

        assertTrue("Menu row exists",
                mSwipeHelper.handleUpEvent(mEvent, mView, 0, 0));
        verify(mMenuRow, times(1)).onTouchEnd();
        verify(mSwipeHelper, times(1)).isDismissGesture(mEvent);
        verify(mSwipeHelper, times(1)).snapClosed(mView, 0);
        verify(mMenuRow, times(1)).onSnapClosed();
        verify(mSwipeHelper, never()).isFalseGesture();
    }

    @Test
    public void testIsDismissGesture() {
        doReturn(false).when(mSwipeHelper).isFalseGesture();
        doReturn(true).when(mSwipeHelper).swipedFarEnough();
        doReturn(true).when(mSwipeHelper).swipedFastEnough();
        when(mCallback.canChildBeDismissedInDirection(any(), anyBoolean())).thenReturn(true);
        when(mEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_UP);

        assertTrue("Should be a dismiss gesture", mSwipeHelper.isDismissGesture(mEvent));
        verify(mSwipeHelper, times(1)).isFalseGesture();
    }

    @Test
    public void testIsDismissGesture_falseGesture() {
        doReturn(true).when(mSwipeHelper).isFalseGesture();
        doReturn(true).when(mSwipeHelper).swipedFarEnough();
        doReturn(true).when(mSwipeHelper).swipedFastEnough();
        when(mCallback.canChildBeDismissedInDirection(any(), anyBoolean())).thenReturn(true);
        when(mEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_UP);

        assertFalse("False gesture should stop dismissal", mSwipeHelper.isDismissGesture(mEvent));
        verify(mSwipeHelper, times(1)).isFalseGesture();
    }

    @Test
    public void testIsDismissGesture_farEnough() {
        doReturn(false).when(mSwipeHelper).isFalseGesture();
        doReturn(true).when(mSwipeHelper).swipedFarEnough();
        doReturn(false).when(mSwipeHelper).swipedFastEnough();
        when(mCallback.canChildBeDismissedInDirection(any(), anyBoolean())).thenReturn(true);
        when(mEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_UP);

        assertTrue("Should be a dismissal", mSwipeHelper.isDismissGesture(mEvent));
        verify(mSwipeHelper, times(1)).isFalseGesture();
    }

    @Test
    public void testIsDismissGesture_notFarOrFastEnough() {
        doReturn(false).when(mSwipeHelper).isFalseGesture();
        doReturn(false).when(mSwipeHelper).swipedFarEnough();
        doReturn(false).when(mSwipeHelper).swipedFastEnough();
        when(mCallback.canChildBeDismissedInDirection(any(), anyBoolean())).thenReturn(true);
        when(mEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_UP);

        assertFalse("Should not be a dismissal", mSwipeHelper.isDismissGesture(mEvent));
        verify(mSwipeHelper, times(1)).isFalseGesture();
    }

    @Test