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

Commit 88885b0e authored by Josh Tsuji's avatar Josh Tsuji
Browse files

Keep keyguard visible if we're launching an occluding activity over a going-away keyguard.

This happens when bypass is enabled - the occluding activity
launches over the keyguard visually, but the keyguard is
going away since it's being dismissed by the launch. We
weren't checking for this case, so we were allowing keyguard
to be hidden, showing the shade UI.

Additionally, we need to keep the wallpaper around to prevent
the keyguard UI from showing over a black backdrop during
this animation.

Fixes: 266630755
Test: launch occluding activity over unlocked lockscreen w/ bypass enabled
Change-Id: I5a7df7df5aa5339276470529e7164475c6e99e13
parent fe532fc2
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -2732,6 +2732,7 @@ public final class NotificationPanelViewController implements Dumpable {
    public void setIsLaunchAnimationRunning(boolean running) {
        boolean wasRunning = mIsLaunchAnimationRunning;
        mIsLaunchAnimationRunning = running;
        mCentralSurfaces.updateIsKeyguard();
        if (wasRunning != mIsLaunchAnimationRunning) {
            mShadeExpansionStateManager.notifyLaunchingActivityChanged(running);
        }
@@ -3792,6 +3793,10 @@ public final class NotificationPanelViewController implements Dumpable {
        return mClosing || mIsLaunchAnimationRunning;
    }

    public boolean isLaunchAnimationRunning() {
        return mIsLaunchAnimationRunning;
    }

    public boolean isTracking() {
        return mTracking;
    }
+4 −2
Original line number Diff line number Diff line
@@ -301,9 +301,11 @@ public class NotificationShadeWindowControllerImpl implements NotificationShadeW
    }

    private void applyKeyguardFlags(NotificationShadeWindowState state) {
        final boolean keyguardOrAod = state.keyguardShowing
        // Keyguard is visible if it's showing or if it's fading away (in which case we're animating
        // it out, but the wallpaper should remain visible as a backdrop for the animation);
        final boolean keyguardOrAodVisible = (state.keyguardShowing || state.keyguardFadingAway)
                || (state.dozing && mDozeParameters.getAlwaysOn());
        if ((keyguardOrAod && !state.mediaBackdropShowing && !state.lightRevealScrimOpaque)
        if ((keyguardOrAodVisible && !state.mediaBackdropShowing && !state.lightRevealScrimOpaque)
                || mKeyguardViewMediator.isAnimatingBetweenKeyguardAndSurfaceBehind()) {
            // Show the wallpaper if we're on keyguard/AOD and the wallpaper is not occluded by a
            // solid backdrop. Also, show it if we are currently animating between the
+14 −1
Original line number Diff line number Diff line
@@ -1007,6 +1007,8 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces {
                // The light reveal scrim should always be fully revealed by the time the keyguard
                // is done going away. Double check that this is true.
                if (!mKeyguardStateController.isKeyguardGoingAway()) {
                    updateIsKeyguard();

                    if (mLightRevealScrim.getRevealAmount() != 1f) {
                        Log.e(TAG, "Keyguard is done going away, but someone left the light reveal "
                                + "scrim at reveal amount: " + mLightRevealScrim.getRevealAmount());
@@ -2893,6 +2895,10 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces {
                showKeyguardImpl();
            }
        } else {
            final boolean isLaunchingOrGoingAway =
                    mNotificationPanelViewController.isLaunchAnimationRunning()
                            || mKeyguardStateController.isKeyguardGoingAway();

            // During folding a foldable device this might be called as a result of
            // 'onScreenTurnedOff' call for the inner display.
            // In this case:
@@ -2904,7 +2910,14 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces {
            if (!mScreenOffAnimationController.isKeyguardHideDelayed()
                    // If we're animating occluded, there's an activity launching over the keyguard
                    // UI. Wait to hide it until after the animation concludes.
                    && !mKeyguardViewMediator.isOccludeAnimationPlaying()) {
                    && !mKeyguardViewMediator.isOccludeAnimationPlaying()
                    // If we're occluded, but playing an animation (launch or going away animations)
                    // the keyguard is visible behind the animation.
                    && !(mKeyguardStateController.isOccluded() && isLaunchingOrGoingAway)) {
                    // If we're going away and occluded, it means we are launching over the
                    // unsecured keyguard, which will subsequently go away. Wait to hide it until
                    // after the animation concludes to avoid the lockscreen UI changing into the
                    // shade UI behind the launch animation.
                return hideKeyguardImpl(forceStateChange);
            }
        }
+10 −0
Original line number Diff line number Diff line
@@ -222,6 +222,16 @@ public class NotificationShadeWindowControllerImplTest extends SysuiTestCase {
        assertThat((mLayoutParameters.getValue().flags & FLAG_SHOW_WALLPAPER) != 0).isTrue();
    }

    @Test
    public void attach_fadingAway_wallpaperVisible() {
        clearInvocations(mWindowManager);
        mNotificationShadeWindowController.attach();
        mNotificationShadeWindowController.setKeyguardFadingAway(true);

        verify(mWindowManager).updateViewLayout(any(), mLayoutParameters.capture());
        assertThat((mLayoutParameters.getValue().flags & FLAG_SHOW_WALLPAPER) != 0).isTrue();
    }

    @Test
    public void setBackgroundBlurRadius_expandedWithBlurs() {
        mNotificationShadeWindowController.setBackgroundBlurRadius(10);
+12 −0
Original line number Diff line number Diff line
@@ -1287,6 +1287,18 @@ public class CentralSurfacesImplTest extends SysuiTestCase {
        verify(mPowerManagerService, never()).wakeUp(anyLong(), anyInt(), anyString(), anyString());
    }

    @Test
    public void keyguard_notHidden_ifGoingAwayAndOccluded() {
        setKeyguardShowingAndOccluded(true /* showing */, false /* occluded */);

        when(mKeyguardStateController.isKeyguardGoingAway()).thenReturn(true);
        when(mKeyguardStateController.isOccluded()).thenReturn(true);

        mCentralSurfaces.updateIsKeyguard(false);

        verify(mStatusBarStateController, never()).setState(eq(SHADE), anyBoolean());
    }

    @Test
    public void frpLockedDevice_shadeDisabled() {
        when(mDeviceProvisionedController.isFrpActive()).thenReturn(true);