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

Commit f42b9fae authored by Coco Duan's avatar Coco Duan
Browse files

Glanceable hub is blurred when swiping down shade a little

The issue occurs when swiping down shade over hub a little. If
handleExternalTouch triggers onInterceptTouch again and it returns
false, but a prior call to shouldInterceptTouchEventInternal was
intercepted by the DragDown helper with dragging in progress, ACTION_UP
will not be processed, causing the shade to get stuck.

Fix is to avoid calling onInterceptTouchEvent when DragDown helper has
already intercepted and dragging is in progress.

Bug: 412261838
Test: pull down shade over hub slightly and fully, across various distances
Test: atest NotificationShadeWindowViewControllerTest
Flag: com.android.systemui.hub_blurred_by_shade_fix
Change-Id: Ieef2ff8717c02721297c82dd2d504b38269ecbc1
parent 9b193694
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -2047,3 +2047,13 @@ flag {
      purpose: PURPOSE_BUGFIX
    }
}

flag {
    name: "hub_blurred_by_shade_fix"
    namespace: "systemui"
    description: "Fixes the blurring issue on hub after the shade is pulled down slightly."
    bug: "412261838"
    metadata {
      purpose: PURPOSE_BUGFIX
    }
}
+13 −1
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.systemui.shade;

import static com.android.systemui.Flags.communalShadeTouchHandlingFixes;
import static com.android.systemui.Flags.hubBlurredByShadeFix;
import static com.android.systemui.keyguard.shared.model.KeyguardState.DREAMING;
import static com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN;
import static com.android.systemui.statusbar.StatusBarState.KEYGUARD;
@@ -155,6 +156,11 @@ public class NotificationShadeWindowViewController implements Dumpable {
     * True if we are in the process of handling an external touch event.
     */
    private boolean mHandlingExternalTouch = false;
    /**
     * True if drag down helper intercepted and we're in the dragging process.
     */
    private boolean mUseDragDownHelperForTouch = false;

    private boolean mIsTrackingBarGesture = false;
    private boolean mIsOcclusionTransitionRunning = false;
    private DisableSubpixelTextTransitionListener mDisableSubpixelTextTransitionListener;
@@ -344,6 +350,13 @@ public class NotificationShadeWindowViewController implements Dumpable {
            if (!mView.dispatchTouchEvent(event)) {
                return;
            }
            if (hubBlurredByShadeFix()) {
                // When the DragDownHelper has already initiated a drag of the shade over the hub,
                // just send the touch. If onInterceptTouchEvent is called again mid-drag, it can
                // lead to ACTION_UP being ignored, causing the shade to become stuck.
                mExternalTouchIntercepted = mUseDragDownHelperForTouch
                        && mDragDownHelper.isDraggingDown();
            }
            if (!mExternalTouchIntercepted) {
                mExternalTouchIntercepted = mView.onInterceptTouchEvent(event);
            }
@@ -363,7 +376,6 @@ public class NotificationShadeWindowViewController implements Dumpable {
        mView.setLayoutInsetsController(mNotificationInsetsController);
        mView.setWindowRootViewKeyEventHandler(mWindowRootViewKeyEventHandler);
        mView.setInteractionEventHandler(new NotificationShadeWindowView.InteractionEventHandler() {
            boolean mUseDragDownHelperForTouch = false;
            boolean mLastInterceptWasDragDownHelper = false;

            @Override
+50 −0
Original line number Diff line number Diff line
@@ -522,6 +522,56 @@ class NotificationShadeWindowViewControllerTest(flags: FlagsParameterization) :
        verify(view, never()).onTouchEvent(any())
    }

    @Test
    @EnableFlags(Flags.FLAG_HUB_BLURRED_BY_SHADE_FIX)
    fun handleExternalTouch_isNotInterceptedAndIsNotDraggingDown_onTouchNotSent() {
        whenever(view.dispatchTouchEvent(any())).thenReturn(true)
        whenever(view.onInterceptTouchEvent(any())).thenReturn(false)
        whenever(dragDownHelper.isDraggingDown).thenReturn(false)

        underTest.setStatusBarViewController(phoneStatusBarViewController)

        underTest.handleExternalTouch(DOWN_EVENT)
        underTest.handleExternalTouch(MOVE_EVENT)

        // Interception offered for both events, and onTouchEvent is not called.
        verify(view).onInterceptTouchEvent(DOWN_EVENT)
        verify(view).onInterceptTouchEvent(MOVE_EVENT)
        verify(view, never()).onTouchEvent(any())
    }

    @Test
    @EnableFlags(Flags.FLAG_HUB_BLURRED_BY_SHADE_FIX)
    fun handleExternalTouch_isDraggingDown_onTouchSentAndInterceptTouchNotCalledAgain() {
        whenever(view.dispatchTouchEvent(any())).thenReturn(true)
        whenever(view.onInterceptTouchEvent(any())).thenReturn(false)

        underTest.setStatusBarViewController(phoneStatusBarViewController)
        underTest.handleExternalTouch(DOWN_EVENT)

        whenever(panelExpansionInteractor.isFullyExpanded).thenReturn(true)
        // AND quick settings controller doesn't want it
        whenever(quickSettingsController.shouldQuickSettingsIntercept(any(), any(), any()))
            .thenReturn(false)
        whenever(dragDownHelper.isDragDownEnabled).thenReturn(true)
        whenever(dragDownHelper.onInterceptTouchEvent(any())).thenReturn(true)

        // THEN dragDownHelper should intercept.
        assertThat(interactionEventHandler.shouldInterceptTouchEvent(MOVE_EVENT)).isTrue()
        verify(dragDownHelper).onInterceptTouchEvent(MOVE_EVENT)
        clearInvocations(view)
        // AND dragging down is in progress.
        whenever(dragDownHelper.isDraggingDown).thenReturn(true)

        // Handle touch sent by hub.
        underTest.handleExternalTouch(MOVE_EVENT)

        // Interception not called again.
        verify(view, never()).onInterceptTouchEvent(MOVE_EVENT)
        // onTouchEvent goes to the view.
        verify(view).onTouchEvent(MOVE_EVENT)
    }

    @Test
    @EnableFlags(Flags.FLAG_COMMUNAL_SHADE_TOUCH_HANDLING_FIXES)
    @DisableSceneContainer