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

Commit e71059c5 authored by burakov's avatar burakov
Browse files

[bc25] Do not make the scrim opaque when Dual Shade is open.

Flag: com.android.systemui.dual_shade
Fix: 344854041
Test: Manually by opening and closing the dual shade, and doing the same
in legacy mode to ensure existing behavior didn't break.
Test: Unit tests pass.

Change-Id: I7b71bf4e805f2f1426a28c71009e181439966f2e
parent f32d49d4
Loading
Loading
Loading
Loading
+12 −9
Original line number Original line Diff line number Diff line
@@ -76,6 +76,7 @@ import com.android.systemui.scene.shared.flag.SceneContainerFlag;
import com.android.systemui.scene.shared.model.Scenes;
import com.android.systemui.scene.shared.model.Scenes;
import com.android.systemui.scrim.ScrimView;
import com.android.systemui.scrim.ScrimView;
import com.android.systemui.shade.ShadeViewController;
import com.android.systemui.shade.ShadeViewController;
import com.android.systemui.shade.shared.flag.DualShade;
import com.android.systemui.shade.transition.LargeScreenShadeInterpolator;
import com.android.systemui.shade.transition.LargeScreenShadeInterpolator;
import com.android.systemui.statusbar.notification.stack.ViewState;
import com.android.systemui.statusbar.notification.stack.ViewState;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.ConfigurationController;
@@ -87,6 +88,7 @@ import com.android.systemui.util.wakelock.WakeLock;
import com.android.systemui.wallpapers.data.repository.WallpaperRepository;
import com.android.systemui.wallpapers.data.repository.WallpaperRepository;


import kotlinx.coroutines.CoroutineDispatcher;
import kotlinx.coroutines.CoroutineDispatcher;
import kotlinx.coroutines.ExperimentalCoroutinesApi;


import java.io.PrintWriter;
import java.io.PrintWriter;
import java.lang.annotation.Retention;
import java.lang.annotation.Retention;
@@ -101,6 +103,7 @@ import javax.inject.Inject;
 * security method gets shown).
 * security method gets shown).
 */
 */
@SysUISingleton
@SysUISingleton
@ExperimentalCoroutinesApi
public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dumpable,
public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dumpable,
        CoreStartable {
        CoreStartable {


@@ -999,7 +1002,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
            if (!mScreenOffAnimationController.shouldExpandNotifications()
            if (!mScreenOffAnimationController.shouldExpandNotifications()
                    && !mAnimatingPanelExpansionOnUnlock
                    && !mAnimatingPanelExpansionOnUnlock
                    && !occluding) {
                    && !occluding) {
                if (mTransparentScrimBackground) {
                if (mTransparentScrimBackground || DualShade.isEnabled()) {
                    mBehindAlpha = 0;
                    mBehindAlpha = 0;
                    mNotificationsAlpha = 0;
                    mNotificationsAlpha = 0;
                } else if (mClipsQsScrim) {
                } else if (mClipsQsScrim) {
@@ -1051,7 +1054,12 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
                behindAlpha = 0f;
                behindAlpha = 0f;
            }
            }
            mInFrontAlpha = mState.getFrontAlpha();
            mInFrontAlpha = mState.getFrontAlpha();
            if (mClipsQsScrim) {
            if (DualShade.isEnabled() && mState == ScrimState.SHADE_LOCKED) {
                mBehindAlpha = 0;
                mNotificationsTint = Color.TRANSPARENT;
                mNotificationsAlpha = 0;
                mBehindTint = Color.TRANSPARENT;
            } else if (mClipsQsScrim) {
                mNotificationsAlpha = behindAlpha;
                mNotificationsAlpha = behindAlpha;
                mNotificationsTint = behindTint;
                mNotificationsTint = behindTint;
                mBehindAlpha = 1;
                mBehindAlpha = 1;
@@ -1105,8 +1113,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
    }
    }


    private Pair<Integer, Float> calculateBackStateForState(ScrimState state) {
    private Pair<Integer, Float> calculateBackStateForState(ScrimState state) {
        // Either darken of make the scrim transparent when you
        // Either darken or make the scrim transparent when pulling down the shade.
        // pull down the shade
        float interpolatedFract = getInterpolatedFraction();
        float interpolatedFract = getInterpolatedFraction();


        float stateBehind = mClipsQsScrim ? state.getNotifAlpha() : state.getBehindAlpha();
        float stateBehind = mClipsQsScrim ? state.getNotifAlpha() : state.getBehindAlpha();
@@ -1201,11 +1208,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
            return true;
            return true;
        }
        }


        if (mState == ScrimState.PULSING) {
        return mState == ScrimState.PULSING;
            return true;
        }

        return false;
    }
    }


    /**
    /**
+111 −3
Original line number Original line Diff line number Diff line
@@ -49,6 +49,8 @@ import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.Color;
import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
import android.testing.TestableLooper;
import android.testing.TestableLooper;
import android.testing.ViewUtils;
import android.testing.ViewUtils;
import android.util.MathUtils;
import android.util.MathUtils;
@@ -65,6 +67,7 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.animation.ShadeInterpolation;
import com.android.systemui.animation.ShadeInterpolation;
import com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants;
import com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants;
import com.android.systemui.dock.DockManager;
import com.android.systemui.dock.DockManager;
import com.android.systemui.flags.EnableSceneContainer;
import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository;
import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository;
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor;
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor;
@@ -75,7 +78,9 @@ import com.android.systemui.keyguard.shared.model.TransitionStep;
import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerToGoneTransitionViewModel;
import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerToGoneTransitionViewModel;
import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToGoneTransitionViewModel;
import com.android.systemui.keyguard.ui.viewmodel.PrimaryBouncerToGoneTransitionViewModel;
import com.android.systemui.kosmos.KosmosJavaAdapter;
import com.android.systemui.kosmos.KosmosJavaAdapter;
import com.android.systemui.scene.shared.flag.SceneContainerFlag;
import com.android.systemui.scrim.ScrimView;
import com.android.systemui.scrim.ScrimView;
import com.android.systemui.shade.shared.flag.DualShade;
import com.android.systemui.shade.transition.LargeScreenShadeInterpolator;
import com.android.systemui.shade.transition.LargeScreenShadeInterpolator;
import com.android.systemui.shade.transition.LinearLargeScreenShadeInterpolator;
import com.android.systemui.shade.transition.LinearLargeScreenShadeInterpolator;
import com.android.systemui.statusbar.policy.FakeConfigurationController;
import com.android.systemui.statusbar.policy.FakeConfigurationController;
@@ -309,7 +314,11 @@ public class ScrimControllerTest extends SysuiTestCase {
        mWallpaperRepository.getWallpaperSupportsAmbientMode().setValue(false);
        mWallpaperRepository.getWallpaperSupportsAmbientMode().setValue(false);
        mTestScope.getTestScheduler().runCurrent();
        mTestScope.getTestScheduler().runCurrent();


        if (SceneContainerFlag.isEnabled()) {
            mScrimController.transitionTo(ScrimState.KEYGUARD);
        } else {
            mScrimController.legacyTransitionTo(ScrimState.KEYGUARD);
            mScrimController.legacyTransitionTo(ScrimState.KEYGUARD);
        }
        finishAnimationsImmediately();
        finishAnimationsImmediately();
    }
    }


@@ -357,6 +366,47 @@ public class ScrimControllerTest extends SysuiTestCase {
        ));
        ));
    }
    }


    @Test
    @EnableSceneContainer
    @DisableFlags(DualShade.FLAG_NAME)
    public void transitionToShadeLocked_sceneContainer_dualShadeOff() {
        mScrimController.transitionTo(SHADE_LOCKED);
        mScrimController.setQsPosition(1f, 0);
        finishAnimationsImmediately();

        assertScrimAlpha(Map.of(
                mNotificationsScrim, OPAQUE,
                mScrimInFront, TRANSPARENT,
                mScrimBehind, OPAQUE
        ));

        assertScrimTinted(Map.of(
                mScrimInFront, false,
                mScrimBehind, true
        ));
    }

    @Test
    @EnableSceneContainer
    @EnableFlags(DualShade.FLAG_NAME)
    public void transitionToShadeLocked_sceneContainer_dualShadeOn() {
        mScrimController.transitionTo(SHADE_LOCKED);
        mScrimController.setQsPosition(1f, 0);
        finishAnimationsImmediately();

        assertScrimAlpha(Map.of(
                mNotificationsScrim, TRANSPARENT,
                mScrimInFront, TRANSPARENT,
                mScrimBehind, TRANSPARENT
        ));

        assertScrimTinted(Map.of(
                mScrimInFront, false,
                mNotificationsScrim, false,
                mScrimBehind, false
        ));
    }

    @Test
    @Test
    public void transitionToShadeLocked_clippingQs() {
    public void transitionToShadeLocked_clippingQs() {
        mScrimController.setClipsQsScrim(true);
        mScrimController.setClipsQsScrim(true);
@@ -996,6 +1046,64 @@ public class ScrimControllerTest extends SysuiTestCase {
                mScrimBehind, OPAQUE));
                mScrimBehind, OPAQUE));
    }
    }


    @Test
    @EnableSceneContainer
    @DisableFlags(DualShade.FLAG_NAME)
    public void transitionToUnlocked_sceneContainer_dualShadeOff() {
        mScrimController.setRawPanelExpansionFraction(0f);
        mScrimController.transitionTo(ScrimState.UNLOCKED);
        finishAnimationsImmediately();

        assertScrimAlpha(Map.of(
                mScrimInFront, TRANSPARENT,
                mNotificationsScrim, TRANSPARENT,
                mScrimBehind, TRANSPARENT
        ));

        mScrimController.setRawPanelExpansionFraction(0.5f);
        assertScrimAlpha(Map.of(
                mScrimInFront, TRANSPARENT,
                mNotificationsScrim, SEMI_TRANSPARENT,
                mScrimBehind, SEMI_TRANSPARENT
        ));

        mScrimController.setRawPanelExpansionFraction(1f);
        assertScrimAlpha(Map.of(
                mScrimInFront, TRANSPARENT,
                mNotificationsScrim, OPAQUE,
                mScrimBehind, OPAQUE
        ));
    }

    @Test
    @EnableSceneContainer
    @EnableFlags(DualShade.FLAG_NAME)
    public void transitionToUnlocked_sceneContainer_dualShadeOn() {
        mScrimController.setRawPanelExpansionFraction(0f);
        mScrimController.transitionTo(ScrimState.UNLOCKED);
        finishAnimationsImmediately();

        assertScrimAlpha(Map.of(
                mScrimInFront, TRANSPARENT,
                mNotificationsScrim, TRANSPARENT,
                mScrimBehind, TRANSPARENT
        ));

        mScrimController.setRawPanelExpansionFraction(0.5f);
        assertScrimAlpha(Map.of(
                mScrimInFront, TRANSPARENT,
                mNotificationsScrim, TRANSPARENT,
                mScrimBehind, TRANSPARENT
        ));

        mScrimController.setRawPanelExpansionFraction(1f);
        assertScrimAlpha(Map.of(
                mScrimInFront, TRANSPARENT,
                mNotificationsScrim, TRANSPARENT,
                mScrimBehind, TRANSPARENT
        ));
    }

    @Test
    @Test
    public void transitionToUnlocked_nonClippedQs_followsLargeScreensInterpolator() {
    public void transitionToUnlocked_nonClippedQs_followsLargeScreensInterpolator() {
        mScrimController.setClipsQsScrim(false);
        mScrimController.setClipsQsScrim(false);
@@ -2086,7 +2194,7 @@ public class ScrimControllerTest extends SysuiTestCase {
    }
    }


    private void assertScrimTinted(Map<ScrimView, Boolean> scrimToTint) {
    private void assertScrimTinted(Map<ScrimView, Boolean> scrimToTint) {
        scrimToTint.forEach((scrim, hasTint) -> assertScrimTint(scrim, hasTint));
        scrimToTint.forEach(this::assertScrimTint);
    }
    }


    private void assertScrimTint(ScrimView scrim, boolean hasTint) {
    private void assertScrimTint(ScrimView scrim, boolean hasTint) {
@@ -2123,7 +2231,7 @@ public class ScrimControllerTest extends SysuiTestCase {
        if (!scrimToAlpha.containsKey(mNotificationsScrim)) {
        if (!scrimToAlpha.containsKey(mNotificationsScrim)) {
            assertScrimAlpha(mNotificationsScrim, TRANSPARENT);
            assertScrimAlpha(mNotificationsScrim, TRANSPARENT);
        }
        }
        scrimToAlpha.forEach((scrimView, alpha) -> assertScrimAlpha(scrimView, alpha));
        scrimToAlpha.forEach(this::assertScrimAlpha);


        // When clipping, QS scrim should not affect combined visibility.
        // When clipping, QS scrim should not affect combined visibility.
        if (mScrimController.getClipQsScrim() && scrimToAlpha.get(mScrimBehind) == OPAQUE) {
        if (mScrimController.getClipQsScrim() && scrimToAlpha.get(mScrimBehind) == OPAQUE) {