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

Commit dd588c76 authored by Rohan Shah's avatar Rohan Shah
Browse files

Allow keep showing to bypass bouncer

User experience improvement that alleviates the current bouncer bug with
the blocking helper (where users can't swipe after interacting with the
blocking helper).

Bug: 78222122
Test: Added test case, verified on device with lock screen pin + helper
Change-Id: I54806df8b960ea305b120aef6217a6b90f30590b
parent 8ca46fc4
Loading
Loading
Loading
Loading
+11 −7
Original line number Diff line number Diff line
@@ -91,22 +91,24 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G
    private boolean mIsForBlockingHelper;
    private boolean mNegativeUserSentiment;

    /** Counter tag that describes how the user exit or quit out of this view. */
    private String mExitReasonCounter = NotificationCounters.BLOCKING_HELPER_DISMISSED;
    /**
     * String that describes how the user exit or quit out of this view, also used as a counter tag.
     */
    private String mExitReason = NotificationCounters.BLOCKING_HELPER_DISMISSED;

    private OnClickListener mOnKeepShowing = v -> {
        mExitReasonCounter = NotificationCounters.BLOCKING_HELPER_KEEP_SHOWING;
        mExitReason = NotificationCounters.BLOCKING_HELPER_KEEP_SHOWING;
        closeControls(v);
    };

    private OnClickListener mOnStopOrMinimizeNotifications = v -> {
        mExitReasonCounter = NotificationCounters.BLOCKING_HELPER_STOP_NOTIFICATIONS;
        mExitReason = NotificationCounters.BLOCKING_HELPER_STOP_NOTIFICATIONS;
        swapContent(false);
    };

    private OnClickListener mOnUndo = v -> {
        // Reset exit counter that we'll log and record an undo event separately (not an exit event)
        mExitReasonCounter = NotificationCounters.BLOCKING_HELPER_DISMISSED;
        mExitReason = NotificationCounters.BLOCKING_HELPER_DISMISSED;
        logBlockingHelperCounter(NotificationCounters.BLOCKING_HELPER_UNDO);
        swapContent(true);
    };
@@ -300,7 +302,9 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G

    private void saveImportance() {
        if (!mIsNonblockable) {
            if (mCheckSaveListener != null) {
            // Only go through the lock screen/bouncer if the user didn't hit 'Keep showing'.
            if (mCheckSaveListener != null
                    && !NotificationCounters.BLOCKING_HELPER_KEEP_SHOWING.equals(mExitReason)) {
                mCheckSaveListener.checkSave(this::updateImportance, mSbn);
            } else {
                updateImportance();
@@ -495,7 +499,7 @@ public class NotificationInfo extends LinearLayout implements NotificationGuts.G
        if (save) {
            saveImportance();
        }
        logBlockingHelperCounter(mExitReasonCounter);
        logBlockingHelperCounter(mExitReason);
        return false;
    }

+30 −0
Original line number Diff line number Diff line
@@ -509,6 +509,36 @@ public class NotificationInfoTest extends SysuiTestCase {
                        anyString(), eq(TEST_UID), eq(true));
    }


    @Test
    public void testCloseControls_nonNullCheckSaveListenerDoesntDelayKeepShowing()
            throws Exception {
        NotificationInfo.CheckSaveListener listener =
                mock(NotificationInfo.CheckSaveListener.class);
        mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
                TEST_PACKAGE_NAME, mNotificationChannel /* notificationChannel */,
                10 /* numUniqueChannelsInRow */, mSbn, listener /* checkSaveListener */,
                null /* onSettingsClick */, null /* onAppSettingsClick */ ,
                false /* isNonblockable */, true /* isForBlockingHelper */,
                true /* isUserSentimentNegative */);

        NotificationGuts guts = spy(new NotificationGuts(mContext, null));
        when(guts.getWindowToken()).thenReturn(mock(IBinder.class));
        doNothing().when(guts).animateClose(anyInt(), anyInt(), anyBoolean());
        doNothing().when(guts).setExposed(anyBoolean(), anyBoolean());
        guts.setGutsContent(mNotificationInfo);
        mNotificationInfo.setGutsParent(guts);

        mNotificationInfo.findViewById(R.id.keep).performClick();

        verify(mBlockingHelperManager).dismissCurrentBlockingHelper();
        mTestableLooper.processAllMessages();
        verify(mMockINotificationManager, times(1))
                .setNotificationsEnabledWithImportanceLockForPackage(
                        anyString(), eq(TEST_UID), eq(true));
    }


    @Test
    public void testCloseControls_blockingHelperDismissedIfShown() throws Exception {
        mNotificationInfo.bindNotification(