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

Commit 3e9e2d40 authored by Michal Brzezinski's avatar Michal Brzezinski
Browse files

Making sure QS panel is always visible when expanding split shade

When we swipe quickly on launcher to expand shade sometimes we go through path where notifyExpandingFinished() is called at the beginning of the movement - when focus transfer happens and expand() is called. This sets `mQsExpandImmediate` to false but it should be always true when expanding split shade.
Fix is to move resetting `mQsExpandImmediate` to onPanelStateChanged reacting to OPEN/CLOSE which should be called only once and only at the end of motion.

This fix also coincidentally fixes b/237909902 as it was caused by not resetting `mQsExpandImmediate` after showing heads up notification, now it's done when we transition to CLOSE state.

Test: NotificationPanelViewControllerTest
Test: which quick flings on launcher try to expand and close shade many times -> notice QS always visible
Fixes: 248555255
Fixes: 237909902
Change-Id: I64e54765fe39182ff7f71d1d6407d3e38df051b1
parent ccfd9427
Loading
Loading
Loading
Loading
+12 −3
Original line number Diff line number Diff line
@@ -430,6 +430,7 @@ public final class NotificationPanelViewController extends PanelViewController {
    /**
     * Determines if QS should be already expanded when expanding shade.
     * Used for split shade, two finger gesture as well as accessibility shortcut to QS.
     * It needs to be set when movement starts as it resets at the end of expansion/collapse.
     */
    @VisibleForTesting
    boolean mQsExpandImmediate;
@@ -1737,9 +1738,11 @@ public final class NotificationPanelViewController extends PanelViewController {
    }

    private void setQsExpandImmediate(boolean expandImmediate) {
        if (expandImmediate != mQsExpandImmediate) {
            mQsExpandImmediate = expandImmediate;
            mPanelEventsEmitter.notifyExpandImmediateChange(expandImmediate);
        }
    }

    private void setShowShelfOnly(boolean shelfOnly) {
        mNotificationStackScrollLayoutController.setShouldShowShelfOnly(
@@ -3326,7 +3329,11 @@ public final class NotificationPanelViewController extends PanelViewController {
        } else {
            setListening(true);
        }
        if (mBarState != SHADE) {
            // updating qsExpandImmediate is done in onPanelStateChanged for unlocked shade but
            // on keyguard panel state is always OPEN so we need to have that extra update
            setQsExpandImmediate(false);
        }
        setShowShelfOnly(false);
        mTwoFingerQsExpandPossible = false;
        updateTrackingHeadsUp(null);
@@ -4985,6 +4992,7 @@ public final class NotificationPanelViewController extends PanelViewController {
        updateQSExpansionEnabledAmbient();

        if (state == STATE_OPEN && mCurrentPanelState != state) {
            setQsExpandImmediate(false);
            mView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
        }
        if (state == STATE_OPENING) {
@@ -4997,6 +5005,7 @@ public final class NotificationPanelViewController extends PanelViewController {
            mCentralSurfaces.makeExpandedVisible(false);
        }
        if (state == STATE_CLOSED) {
            setQsExpandImmediate(false);
            // Close the status bar in the next frame so we can show the end of the
            // animation.
            mView.post(mMaybeHideExpandedRunnable);
+19 −12
Original line number Diff line number Diff line
@@ -23,6 +23,9 @@ import static com.android.keyguard.KeyguardClockSwitch.SMALL;
import static com.android.systemui.statusbar.StatusBarState.KEYGUARD;
import static com.android.systemui.statusbar.StatusBarState.SHADE;
import static com.android.systemui.statusbar.StatusBarState.SHADE_LOCKED;
import static com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManagerKt.STATE_CLOSED;
import static com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManagerKt.STATE_OPEN;
import static com.android.systemui.statusbar.phone.panelstate.PanelExpansionStateManagerKt.STATE_OPENING;

import static com.google.common.truth.Truth.assertThat;

@@ -1249,14 +1252,10 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
    @Test
    public void testQsToBeImmediatelyExpandedWhenOpeningPanelInSplitShade() {
        enableSplitShade(/* enabled= */ true);
        // set panel state to CLOSED
        mPanelExpansionStateManager.onPanelExpansionChanged(/* fraction= */ 0,
                /* expanded= */ false, /* tracking= */ false, /* dragDownPxAmount= */ 0);
        mPanelExpansionStateManager.updateState(STATE_CLOSED);
        assertThat(mNotificationPanelViewController.mQsExpandImmediate).isFalse();

        // change panel state to OPENING
        mPanelExpansionStateManager.onPanelExpansionChanged(/* fraction= */ 0.5f,
                /* expanded= */ true, /* tracking= */ true, /* dragDownPxAmount= */ 100);
        mPanelExpansionStateManager.updateState(STATE_OPENING);

        assertThat(mNotificationPanelViewController.mQsExpandImmediate).isTrue();
    }
@@ -1264,15 +1263,23 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
    @Test
    public void testQsNotToBeImmediatelyExpandedWhenGoingFromUnlockedToLocked() {
        enableSplitShade(/* enabled= */ true);
        // set panel state to CLOSED
        mPanelExpansionStateManager.onPanelExpansionChanged(/* fraction= */ 0,
                /* expanded= */ false, /* tracking= */ false, /* dragDownPxAmount= */ 0);
        mPanelExpansionStateManager.updateState(STATE_CLOSED);

        // go to lockscreen, which also sets fraction to 1.0f and makes shade "expanded"
        mStatusBarStateController.setState(KEYGUARD);
        mPanelExpansionStateManager.onPanelExpansionChanged(/* fraction= */ 1,
                /* expanded= */ true, /* tracking= */ true, /* dragDownPxAmount= */ 0);
        // going to lockscreen would trigger STATE_OPENING
        mPanelExpansionStateManager.updateState(STATE_OPENING);

        assertThat(mNotificationPanelViewController.mQsExpandImmediate).isFalse();
    }

    @Test
    public void testQsImmediateResetsWhenPanelOpensOrCloses() {
        mNotificationPanelViewController.mQsExpandImmediate = true;
        mPanelExpansionStateManager.updateState(STATE_OPEN);
        assertThat(mNotificationPanelViewController.mQsExpandImmediate).isFalse();

        mNotificationPanelViewController.mQsExpandImmediate = true;
        mPanelExpansionStateManager.updateState(STATE_CLOSED);
        assertThat(mNotificationPanelViewController.mQsExpandImmediate).isFalse();
    }