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

Commit 55816370 authored by Josh Tsuji's avatar Josh Tsuji
Browse files

Fix scrim turning opaque during occlusion animation.

Bug: 250542279
Test: atest ScrimController
Test: launch camera and observe scrim does not go opaque
Change-Id: Ic62b7358be0c823eb541d2f87e2cb18dc4a9b5ec
parent 716dcea6
Loading
Loading
Loading
Loading
+13 −1
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dock.DockManager;
import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.scrim.ScrimView;
import com.android.systemui.shade.NotificationPanelViewController;
import com.android.systemui.statusbar.notification.stack.ViewState;
@@ -204,6 +205,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
    private final ScreenOffAnimationController mScreenOffAnimationController;
    private final KeyguardUnlockAnimationController mKeyguardUnlockAnimationController;
    private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
    private KeyguardViewMediator mKeyguardViewMediator;

    private GradientColors mColors;
    private boolean mNeedsDrawableColorUpdate;
@@ -273,7 +275,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
            @Main Executor mainExecutor,
            ScreenOffAnimationController screenOffAnimationController,
            KeyguardUnlockAnimationController keyguardUnlockAnimationController,
            StatusBarKeyguardViewManager statusBarKeyguardViewManager) {
            StatusBarKeyguardViewManager statusBarKeyguardViewManager,
            KeyguardViewMediator keyguardViewMediator) {
        mScrimStateListener = lightBarController::setScrimState;
        mDefaultScrimAlpha = BUSY_SCRIM_ALPHA;

@@ -312,6 +315,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
            }
        });
        mColors = new GradientColors();

        mKeyguardViewMediator = keyguardViewMediator;
    }

    /**
@@ -807,6 +812,13 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
                        mBehindTint,
                        interpolatedFraction);
            }

            // If we're unlocked but still playing the occlude animation, remain at the keyguard
            // alpha temporarily.
            if (mKeyguardViewMediator.isOccludeAnimationPlaying()
                    || mState.mLaunchingAffordanceWithPreview) {
                mNotificationsAlpha = KEYGUARD_SCRIM_ALPHA;
            }
        } else if (mState == ScrimState.AUTH_SCRIMMED_SHADE) {
            float behindFraction = getInterpolatedFraction();
            behindFraction = (float) Math.pow(behindFraction, 0.8f);
+33 −2
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.statusbar.phone;

import static com.android.systemui.statusbar.phone.ScrimController.KEYGUARD_SCRIM_ALPHA;
import static com.android.systemui.statusbar.phone.ScrimController.OPAQUE;
import static com.android.systemui.statusbar.phone.ScrimController.SEMI_TRANSPARENT;
import static com.android.systemui.statusbar.phone.ScrimController.TRANSPARENT;
@@ -58,6 +59,7 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.animation.ShadeInterpolation;
import com.android.systemui.dock.DockManager;
import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.scrim.ScrimView;
import com.android.systemui.statusbar.policy.FakeConfigurationController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -117,6 +119,7 @@ public class ScrimControllerTest extends SysuiTestCase {
    // TODO(b/204991468): Use a real PanelExpansionStateManager object once this bug is fixed. (The
    //   event-dispatch-on-registration pattern caused some of these unit tests to fail.)
    @Mock private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
    @Mock private KeyguardViewMediator mKeyguardViewMediator;

    private static class AnimatorListener implements Animator.AnimatorListener {
        private int mNumStarts;
@@ -230,7 +233,8 @@ public class ScrimControllerTest extends SysuiTestCase {
                mDockManager, mConfigurationController, new FakeExecutor(new FakeSystemClock()),
                mScreenOffAnimationController,
                mKeyguardUnlockAnimationController,
                mStatusBarKeyguardViewManager);
                mStatusBarKeyguardViewManager,
                mKeyguardViewMediator);
        mScrimController.setScrimVisibleListener(visible -> mScrimVisibility = visible);
        mScrimController.attachViews(mScrimBehind, mNotificationsScrim, mScrimInFront);
        mScrimController.setAnimatorListener(mAnimatorListener);
@@ -239,6 +243,8 @@ public class ScrimControllerTest extends SysuiTestCase {
        mScrimController.setWallpaperSupportsAmbientMode(false);
        mScrimController.transitionTo(ScrimState.KEYGUARD);
        finishAnimationsImmediately();

        mScrimController.setLaunchingAffordanceWithPreview(false);
    }

    @After
@@ -852,7 +858,8 @@ public class ScrimControllerTest extends SysuiTestCase {
                mDockManager, mConfigurationController, new FakeExecutor(new FakeSystemClock()),
                mScreenOffAnimationController,
                mKeyguardUnlockAnimationController,
                mStatusBarKeyguardViewManager);
                mStatusBarKeyguardViewManager,
                mKeyguardViewMediator);
        mScrimController.setScrimVisibleListener(visible -> mScrimVisibility = visible);
        mScrimController.attachViews(mScrimBehind, mNotificationsScrim, mScrimInFront);
        mScrimController.setAnimatorListener(mAnimatorListener);
@@ -1592,6 +1599,30 @@ public class ScrimControllerTest extends SysuiTestCase {
        assertScrimAlpha(mScrimBehind, 0);
    }

    @Test
    public void keyguardAlpha_whenUnlockedForOcclusion_ifPlayingOcclusionAnimation() {
        mScrimController.transitionTo(ScrimState.KEYGUARD);

        when(mKeyguardViewMediator.isOccludeAnimationPlaying()).thenReturn(true);

        mScrimController.transitionTo(ScrimState.UNLOCKED);
        finishAnimationsImmediately();

        assertScrimAlpha(mNotificationsScrim, (int) (KEYGUARD_SCRIM_ALPHA * 255f));
    }

    @Test
    public void keyguardAlpha_whenUnlockedForLaunch_ifLaunchingAffordance() {
        mScrimController.transitionTo(ScrimState.KEYGUARD);
        when(mKeyguardViewMediator.isOccludeAnimationPlaying()).thenReturn(true);
        mScrimController.setLaunchingAffordanceWithPreview(true);

        mScrimController.transitionTo(ScrimState.UNLOCKED);
        finishAnimationsImmediately();

        assertScrimAlpha(mNotificationsScrim, (int) (KEYGUARD_SCRIM_ALPHA * 255f));
    }

    private void assertAlphaAfterExpansion(ScrimView scrim, float expectedAlpha, float expansion) {
        mScrimController.setRawPanelExpansionFraction(expansion);
        finishAnimationsImmediately();