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

Commit b3ca9f6d authored by Caitlin Shkuratov's avatar Caitlin Shkuratov
Browse files

[Status Bar] Don't propagate internally computed disable flags.

The test with the /** Regression test for b/279790651 */ header is a
test that fails without this change and passes with it.

Fixes: 279790651
Test: atest CollapsedStatusBarFragmentTest
Test: verify status bar still hidden on keyguard
Test: verify clock & notif icons hidden when there's a HUN
Test: verify notif icons hidden when there's an ongoing call
Change-Id: I0616d6f4990541397aaed34001b9a471f324064d
parent 9f9b600e
Loading
Loading
Loading
Loading
+23 −13
Original line number Diff line number Diff line
@@ -112,8 +112,13 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
    private View mClockView;
    private View mOngoingCallChip;
    private View mNotificationIconAreaInner;
    private int mDisabled1;
    private int mDisabled2;
    // Disabled flags come in from external callers, but we also sometimes modify them internally.
    // We need to store both so that we don't accidentally propagate our internally modified flags
    // for too long.
    private int mExternalDisabled1;
    private int mExternalDisabled2;
    private int mInternalDisabled1;
    private int mInternalDisabled2;
    private DarkIconManager mDarkIconManager;
    private final StatusBarFragmentComponent.Factory mStatusBarFragmentComponentFactory;
    private final CommandQueue mCommandQueue;
@@ -141,7 +146,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
    private final OngoingCallListener mOngoingCallListener = new OngoingCallListener() {
        @Override
        public void onOngoingCallStateChanged(boolean animate) {
            disable(getContext().getDisplayId(), mDisabled1, mDisabled2, animate);
            updateStatusBarVisibilities(animate);
        }
    };
    private OperatorNameViewController mOperatorNameViewController;
@@ -389,7 +394,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
        notificationIconArea.addView(mNotificationIconAreaInner);

        // #disable should have already been called, so use the disable values to set visibility.
        updateNotificationIconAreaAndCallChip(mDisabled1, false);
        updateNotificationIconAreaAndCallChip(mInternalDisabled1, false);
    }

    /**
@@ -403,12 +408,21 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
        return mStatusBarFragmentComponent;
    }

    private void updateStatusBarVisibilities(boolean animate) {
        // Make sure that we pass the last *external* flags so that we don't accidentally propagate
        // our internal adjustments.
        disable(getContext().getDisplayId(), mExternalDisabled1, mExternalDisabled2, animate);
    }

    @Override
    public void disable(int displayId, int state1, int state2, boolean animate) {
        if (displayId != getContext().getDisplayId()) {
            return;
        }

        mExternalDisabled1 = state1;
        mExternalDisabled2 = state2;

        int state1BeforeAdjustment = state1;
        state1 = adjustDisableFlags(state1);

@@ -416,12 +430,12 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
                /* new= */ new DisableState(state1BeforeAdjustment, state2),
                /* newAfterLocalModification= */ new DisableState(state1, state2));

        final int old1 = mDisabled1;
        final int old1 = mInternalDisabled1;
        final int diff1 = state1 ^ old1;
        final int old2 = mDisabled2;
        final int old2 = mInternalDisabled2;
        final int diff2 = state2 ^ old2;
        mDisabled1 = state1;
        mDisabled2 = state2;
        mInternalDisabled1 = state1;
        mInternalDisabled2 = state2;
        if ((diff1 & DISABLE_SYSTEM_INFO) != 0 || ((diff2 & DISABLE2_SYSTEM_ICONS) != 0)) {
            if ((state1 & DISABLE_SYSTEM_INFO) != 0 || ((state2 & DISABLE2_SYSTEM_ICONS) != 0)) {
                hideEndSideContent(animate);
@@ -683,7 +697,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue

    @Override
    public void onDozingChanged(boolean isDozing) {
        disable(getContext().getDisplayId(), mDisabled1, mDisabled2, false /* animate */);
        updateStatusBarVisibilities(/* animate= */ false);
    }

    @Nullable
@@ -698,10 +712,6 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
        return mSystemEventAnimator.onSystemEventAnimationFinish(hasPersistentDot);
    }

    private boolean isSystemIconAreaDisabled() {
        return (mDisabled1 & DISABLE_SYSTEM_INFO) != 0 || (mDisabled2 & DISABLE2_SYSTEM_ICONS) != 0;
    }

    private void updateStatusBarLocation(int left, int right) {
        int leftMargin = left - mStatusBar.getLeft();
        int rightMargin = mStatusBar.getRight() - right;
+67 −1
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@ package com.android.systemui.statusbar.phone.fragment;

import static android.view.Display.DEFAULT_DISPLAY;

import static com.android.systemui.shade.ShadeExpansionStateManagerKt.STATE_CLOSED;
import static com.android.systemui.shade.ShadeExpansionStateManagerKt.STATE_OPEN;
import static com.android.systemui.statusbar.events.SystemStatusAnimationSchedulerKt.ANIMATING_IN;
import static com.android.systemui.statusbar.events.SystemStatusAnimationSchedulerKt.ANIMATING_OUT;
import static com.android.systemui.statusbar.events.SystemStatusAnimationSchedulerKt.IDLE;
@@ -93,6 +95,7 @@ import java.util.List;
public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest {

    private NotificationIconAreaController mMockNotificationAreaController;
    private ShadeExpansionStateManager mShadeExpansionStateManager;
    private View mNotificationAreaInner;
    private OngoingCallController mOngoingCallController;
    private SystemStatusAnimationScheduler mAnimationScheduler;
@@ -293,6 +296,67 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest {
        assertEquals(View.VISIBLE, getClockView().getVisibility());
    }


    @Test
    public void disable_shadeOpenAndShouldHide_everythingHidden() {
        CollapsedStatusBarFragment fragment = resumeAndGetFragment();

        // WHEN the shade is open and configured to hide the status bar icons
        mShadeExpansionStateManager.updateState(STATE_OPEN);
        when(mShadeViewController.shouldHideStatusBarIconsWhenExpanded()).thenReturn(true);

        fragment.disable(DEFAULT_DISPLAY, 0, 0, false);

        // THEN all views are hidden
        assertEquals(View.INVISIBLE, getClockView().getVisibility());
        Mockito.verify(mNotificationAreaInner, atLeast(1)).setVisibility(eq(View.INVISIBLE));
        assertEquals(View.INVISIBLE, getEndSideContentView().getVisibility());
    }

    @Test
    public void disable_shadeOpenButNotShouldHide_everythingShown() {
        CollapsedStatusBarFragment fragment = resumeAndGetFragment();

        // WHEN the shade is open but *not* configured to hide the status bar icons
        mShadeExpansionStateManager.updateState(STATE_OPEN);
        when(mShadeViewController.shouldHideStatusBarIconsWhenExpanded()).thenReturn(false);

        fragment.disable(DEFAULT_DISPLAY, 0, 0, false);

        // THEN all views are shown
        assertEquals(View.VISIBLE, getClockView().getVisibility());
        Mockito.verify(mNotificationAreaInner, atLeast(1)).setVisibility(eq(View.VISIBLE));
        assertEquals(View.VISIBLE, getEndSideContentView().getVisibility());
    }

    /** Regression test for b/279790651. */
    @Test
    public void disable_shadeOpenAndShouldHide_thenShadeNotOpenAndDozingUpdate_everythingShown() {
        CollapsedStatusBarFragment fragment = resumeAndGetFragment();

        // WHEN the shade is open and configured to hide the status bar icons
        mShadeExpansionStateManager.updateState(STATE_OPEN);
        when(mShadeViewController.shouldHideStatusBarIconsWhenExpanded()).thenReturn(true);

        fragment.disable(DEFAULT_DISPLAY, 0, 0, false);

        // THEN all views are hidden
        assertEquals(View.INVISIBLE, getClockView().getVisibility());
        Mockito.verify(mNotificationAreaInner, atLeast(1)).setVisibility(eq(View.INVISIBLE));
        assertEquals(View.INVISIBLE, getEndSideContentView().getVisibility());

        // WHEN the shade is updated to no longer be open
        mShadeExpansionStateManager.updateState(STATE_CLOSED);

        // AND we internally request an update via dozing change
        fragment.onDozingChanged(true);

        // THEN all views are shown
        assertEquals(View.VISIBLE, getClockView().getVisibility());
        Mockito.verify(mNotificationAreaInner, atLeast(1)).setVisibility(eq(View.VISIBLE));
        assertEquals(View.VISIBLE, getEndSideContentView().getVisibility());
    }

    @Test
    public void userChip_defaultVisibilityIsGone() {
        CollapsedStatusBarFragment fragment = resumeAndGetFragment();
@@ -494,6 +558,8 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest {
        when(mIconManagerFactory.create(any(), any())).thenReturn(mIconManager);
        mSecureSettings = mock(SecureSettings.class);

        mShadeExpansionStateManager = new ShadeExpansionStateManager();

        setUpNotificationIconAreaController();
        return new CollapsedStatusBarFragment(
                mStatusBarFragmentComponentFactory,
@@ -501,7 +567,7 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest {
                mAnimationScheduler,
                mLocationPublisher,
                mMockNotificationAreaController,
                new ShadeExpansionStateManager(),
                mShadeExpansionStateManager,
                mock(FeatureFlags.class),
                mStatusBarIconController,
                mIconManagerFactory,