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

Commit fc8a6a7e authored by Chandru S's avatar Chandru S
Browse files

Disable transparent bouncer and scrims when blur is not supported or disabled

Bug: 391409723
Flag: com.android.systemui.bouncer_ui_revamp
Test: verified manually bouncer background is not transparent when blur is disabled.
Change-Id: I453d88a79f5d33a139fc42e84f7c172f161ec427
parent 66eb980c
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -84,6 +84,7 @@ import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.settings.GlobalSettings
import com.android.systemui.util.time.FakeSystemClock
import com.android.systemui.window.domain.interactor.windowRootViewBlurInteractor
import com.google.common.truth.Truth
import junit.framework.Assert
import kotlinx.coroutines.flow.MutableStateFlow
@@ -280,9 +281,9 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
                kosmos.keyguardDismissTransitionInteractor,
                { primaryBouncerInteractor },
                executor,
            ) {
                deviceEntryInteractor
            }
                { deviceEntryInteractor },
                { kosmos.windowRootViewBlurInteractor },
            )
    }

    @Test
+19 −4
Original line number Diff line number Diff line
@@ -98,7 +98,6 @@ import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
import com.android.settingslib.Utils;
import com.android.settingslib.drawable.CircleFramedDrawable;
import com.android.systemui.Flags;
import com.android.systemui.FontStyles;
import com.android.systemui.Gefingerpoken;
import com.android.systemui.classifier.FalsingA11yDelegate;
@@ -121,6 +120,7 @@ public class KeyguardSecurityContainer extends ConstraintLayout {
    static final int USER_TYPE_PRIMARY = 1;
    static final int USER_TYPE_WORK_PROFILE = 2;
    static final int USER_TYPE_SECONDARY_USER = 3;
    private boolean mTransparentModeEnabled = false;

    @IntDef({MODE_UNINITIALIZED, MODE_DEFAULT, MODE_ONE_HANDED, MODE_USER_SWITCHER})
    public @interface Mode {}
@@ -814,15 +814,30 @@ public class KeyguardSecurityContainer extends ConstraintLayout {
        mDisappearAnimRunning = false;
    }

    /**
     * Make the bouncer background transparent
     */
    public void enableTransparentMode() {
        mTransparentModeEnabled = true;
        reloadBackgroundColor();
    }

    /**
     * Make the bouncer background opaque
     */
    public void disableTransparentMode() {
        mTransparentModeEnabled = false;
        reloadBackgroundColor();
    }

    private void reloadBackgroundColor() {
        if (Flags.bouncerUiRevamp()) {
            // Keep the background transparent, otherwise the background color looks like a box
            // while scaling the bouncer for back animation or while transitioning to the bouncer.
        if (mTransparentModeEnabled) {
            setBackgroundColor(Color.TRANSPARENT);
        } else {
            setBackgroundColor(
                    getContext().getColor(com.android.internal.R.color.materialColorSurfaceDim));
        }
        invalidate();
    }

    void reloadColors() {
+41 −1
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@ import com.android.keyguard.KeyguardSecurityContainer.SwipeListener;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
import com.android.keyguard.dagger.KeyguardBouncerScope;
import com.android.settingslib.utils.ThreadUtils;
import com.android.systemui.Flags;
import com.android.systemui.Gefingerpoken;
import com.android.systemui.biometrics.FaceAuthAccessibilityDelegate;
import com.android.systemui.bouncer.domain.interactor.BouncerMessageInteractor;
@@ -96,6 +97,8 @@ import com.android.systemui.user.domain.interactor.SelectedUserInteractor;
import com.android.systemui.util.ViewController;
import com.android.systemui.util.kotlin.JavaAdapter;
import com.android.systemui.util.settings.GlobalSettings;
import com.android.systemui.window.data.repository.WindowRootViewBlurRepository;
import com.android.systemui.window.domain.interactor.WindowRootViewBlurInteractor;

import dagger.Lazy;

@@ -134,6 +137,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
    private final FalsingA11yDelegate mFalsingA11yDelegate;
    private final DeviceEntryFaceAuthInteractor mDeviceEntryFaceAuthInteractor;
    private final BouncerMessageInteractor mBouncerMessageInteractor;
    private final Lazy<WindowRootViewBlurInteractor> mRootViewBlurInteractor;
    private int mTranslationY;
    private final KeyguardDismissTransitionInteractor mKeyguardDismissTransitionInteractor;
    private final DevicePolicyManager mDevicePolicyManager;
@@ -431,6 +435,7 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
    private final Executor mBgExecutor;
    @Nullable
    private Job mSceneTransitionCollectionJob;
    private Job mBlurEnabledCollectionJob;

    @Inject
    public KeyguardSecurityContainerController(KeyguardSecurityContainer view,
@@ -463,9 +468,11 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
            KeyguardDismissTransitionInteractor keyguardDismissTransitionInteractor,
            Lazy<PrimaryBouncerInteractor> primaryBouncerInteractor,
            @Background Executor bgExecutor,
            Provider<DeviceEntryInteractor> deviceEntryInteractor
            Provider<DeviceEntryInteractor> deviceEntryInteractor,
            Lazy<WindowRootViewBlurInteractor> rootViewBlurInteractorProvider
    ) {
        super(view);
        mRootViewBlurInteractor = rootViewBlurInteractorProvider;
        view.setAccessibilityDelegate(faceAuthAccessibilityDelegate);
        mLockPatternUtils = lockPatternUtils;
        mUpdateMonitor = keyguardUpdateMonitor;
@@ -539,6 +546,32 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
                }
            );
        }

        if (Flags.bouncerUiRevamp()) {
            mBlurEnabledCollectionJob = mJavaAdapter.get().alwaysCollectFlow(
                    mRootViewBlurInteractor.get().isBlurCurrentlySupported(),
                    this::handleBlurSupportedChanged);
        }
    }

    private void handleBlurSupportedChanged(boolean isWindowBlurSupported) {
        if (isWindowBlurSupported) {
            mView.enableTransparentMode();
        } else {
            mView.disableTransparentMode();
        }
    }

    private void refreshBouncerBackground() {
        // This is present solely for screenshot tests that disable blur by invoking setprop to
        // disable blurs, however the mRootViewBlurInteractor#isBlurCurrentlySupported doesn't emit
        // an updated value because sysui doesn't have a way to register for changes to setprop.
        // KeyguardSecurityContainer view is inflated only once and doesn't re-inflate so it has to
        // check the sysprop every time bouncer is about to be shown.
        if (Flags.bouncerUiRevamp() && (ActivityManager.isRunningInUserTestHarness()
                || ActivityManager.isRunningInTestHarness())) {
            handleBlurSupportedChanged(!WindowRootViewBlurRepository.isDisableBlurSysPropSet());
        }
    }

    @Override
@@ -552,6 +585,11 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
            mSceneTransitionCollectionJob.cancel(null);
            mSceneTransitionCollectionJob = null;
        }

        if (mBlurEnabledCollectionJob != null) {
            mBlurEnabledCollectionJob.cancel(null);
            mBlurEnabledCollectionJob = null;
        }
    }

    /**  */
@@ -718,6 +756,8 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
        if (bouncerUserSwitcher != null) {
            bouncerUserSwitcher.setAlpha(0f);
        }

        refreshBouncerBackground();
    }

    @Override
+34 −7
Original line number Diff line number Diff line
@@ -81,6 +81,9 @@ import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.util.kotlin.JavaAdapter;
import com.android.systemui.util.wakelock.DelayedWakeLock;
import com.android.systemui.util.wakelock.WakeLock;
import com.android.systemui.window.domain.interactor.WindowRootViewBlurInteractor;

import dagger.Lazy;

import kotlinx.coroutines.CoroutineDispatcher;

@@ -226,7 +229,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
    private float mScrimBehindAlphaKeyguard = KEYGUARD_SCRIM_ALPHA;

    static final float TRANSPARENT_BOUNCER_SCRIM_ALPHA = 0.54f;
    private final float mDefaultScrimAlpha;
    private float mDefaultScrimAlpha;

    private float mRawPanelExpansionFraction;
    private float mPanelScrimMinFraction;
@@ -257,6 +260,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
    private final TriConsumer<ScrimState, Float, GradientColors> mScrimStateListener;
    private final LargeScreenShadeInterpolator mLargeScreenShadeInterpolator;
    private final BlurConfig mBlurConfig;
    private final Lazy<WindowRootViewBlurInteractor> mWindowRootViewBlurInteractor;
    private Consumer<Integer> mScrimVisibleListener;
    private boolean mBlankScreen;
    private boolean mScreenBlankingCallbackCalled;
@@ -339,14 +343,13 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
            KeyguardInteractor keyguardInteractor,
            @Main CoroutineDispatcher mainDispatcher,
            LargeScreenShadeInterpolator largeScreenShadeInterpolator,
            BlurConfig blurConfig) {
            BlurConfig blurConfig,
            Lazy<WindowRootViewBlurInteractor> windowRootViewBlurInteractor) {
        mScrimStateListener = lightBarController::setScrimState;
        mLargeScreenShadeInterpolator = largeScreenShadeInterpolator;
        mBlurConfig = blurConfig;
        // All scrims default alpha need to match bouncer background alpha to make sure the
        // transitions involving the bouncer are smooth and don't overshoot the bouncer alpha.
        mDefaultScrimAlpha =
                Flags.bouncerUiRevamp() ? TRANSPARENT_BOUNCER_SCRIM_ALPHA : BUSY_SCRIM_ALPHA;
        mWindowRootViewBlurInteractor = windowRootViewBlurInteractor;
        mDefaultScrimAlpha = BUSY_SCRIM_ALPHA;

        mKeyguardStateController = keyguardStateController;
        mDarkenWhileDragging = !mKeyguardStateController.canDismissLockScreen();
@@ -407,7 +410,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump

        final ScrimState[] states = ScrimState.values();
        for (int i = 0; i < states.length; i++) {
            states[i].init(mScrimInFront, mScrimBehind, mDozeParameters, mDockManager, mBlurConfig);
            states[i].init(mScrimInFront, mScrimBehind, mDozeParameters, mDockManager);
            states[i].setScrimBehindAlphaKeyguard(mScrimBehindAlphaKeyguard);
            states[i].setDefaultScrimAlpha(mDefaultScrimAlpha);
        }
@@ -485,6 +488,30 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
                        Edge.Companion.create(Scenes.Communal, LOCKSCREEN),
                        Edge.Companion.create(GLANCEABLE_HUB, LOCKSCREEN)),
                mGlanceableHubConsumer, mMainDispatcher);

        if (Flags.bouncerUiRevamp()) {
            collectFlow(behindScrim,
                    mWindowRootViewBlurInteractor.get().isBlurCurrentlySupported(),
                    this::handleBlurSupportedChanged);
        }
    }

    private void updateDefaultScrimAlpha(float alpha) {
        mDefaultScrimAlpha = alpha;
        for (ScrimState state : ScrimState.values()) {
            state.setDefaultScrimAlpha(mDefaultScrimAlpha);
        }
        applyAndDispatchState();
    }

    private void handleBlurSupportedChanged(boolean isBlurSupported) {
        if (isBlurSupported) {
            updateDefaultScrimAlpha(TRANSPARENT_BOUNCER_SCRIM_ALPHA);
            ScrimState.BOUNCER_SCRIMMED.setNotifBlurRadius(mBlurConfig.getMaxBlurRadiusPx());
        } else {
            ScrimState.BOUNCER_SCRIMMED.setNotifBlurRadius(0f);
            updateDefaultScrimAlpha(BUSY_SCRIM_ALPHA);
        }
    }

    // TODO(b/270984686) recompute scrim height accurately, based on shade contents.
+8 −9
Original line number Diff line number Diff line
@@ -17,14 +17,12 @@
package com.android.systemui.statusbar.phone;

import static com.android.systemui.statusbar.phone.ScrimController.BUSY_SCRIM_ALPHA;
import static com.android.systemui.statusbar.phone.ScrimController.TRANSPARENT_BOUNCER_SCRIM_ALPHA;

import android.graphics.Color;

import com.android.app.tracing.coroutines.TrackTracer;
import com.android.systemui.Flags;
import com.android.systemui.dock.DockManager;
import com.android.systemui.keyguard.ui.transitions.BlurConfig;
import com.android.systemui.res.R;
import com.android.systemui.scrim.ScrimView;
import com.android.systemui.shade.ui.ShadeColors;
@@ -116,8 +114,8 @@ public enum ScrimState {
        @Override
        public void prepare(ScrimState previousState) {
            if (Flags.bouncerUiRevamp()) {
                mBehindAlpha = mClipQsScrim ? 0.0f : TRANSPARENT_BOUNCER_SCRIM_ALPHA;
                mNotifAlpha = mClipQsScrim ? TRANSPARENT_BOUNCER_SCRIM_ALPHA : 0;
                mBehindAlpha = mDefaultScrimAlpha;
                mNotifAlpha = 0f;
                mBehindTint = mNotifTint = mSurfaceColor;
                mFrontAlpha = 0f;
                return;
@@ -153,12 +151,11 @@ public enum ScrimState {
                if (previousState == SHADE_LOCKED) {
                    mBehindAlpha = previousState.getBehindAlpha();
                    mNotifAlpha = previousState.getNotifAlpha();
                    mNotifBlurRadius = mBlurConfig.getMaxBlurRadiusPx();
                } else {
                    mNotifAlpha = 0f;
                    mBehindAlpha = 0f;
                }
                mFrontAlpha = TRANSPARENT_BOUNCER_SCRIM_ALPHA;
                mFrontAlpha = mDefaultScrimAlpha;
                mFrontTint = mSurfaceColor;
                return;
            }
@@ -403,7 +400,6 @@ public enum ScrimState {
    DozeParameters mDozeParameters;
    DockManager mDockManager;
    boolean mDisplayRequiresBlanking;
    protected BlurConfig mBlurConfig;
    boolean mLaunchingAffordanceWithPreview;
    boolean mOccludeAnimationPlaying;
    boolean mWakeLockScreenSensorActive;
@@ -417,7 +413,7 @@ public enum ScrimState {
    protected float mNotifBlurRadius = 0.0f;

    public void init(ScrimView scrimInFront, ScrimView scrimBehind, DozeParameters dozeParameters,
            DockManager dockManager, BlurConfig blurConfig) {
            DockManager dockManager) {
        mBackgroundColor = scrimBehind.getContext().getColor(R.color.shade_scrim_background_dark);
        mScrimInFront = scrimInFront;
        mScrimBehind = scrimBehind;
@@ -425,7 +421,6 @@ public enum ScrimState {
        mDozeParameters = dozeParameters;
        mDockManager = dockManager;
        mDisplayRequiresBlanking = dozeParameters.getDisplayNeedsBlanking();
        mBlurConfig = blurConfig;
    }

    /** Prepare state for transition. */
@@ -536,4 +531,8 @@ public enum ScrimState {
    public float getNotifBlurRadius() {
        return mNotifBlurRadius;
    }

    public void setNotifBlurRadius(float value) {
        mNotifBlurRadius = value;
    }
}
Loading