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

Commit d9d46332 authored by Chandru S's avatar Chandru S Committed by Android (Google) Code Review
Browse files

Merge changes from topics "blur-module-change", "disable-bouncer-blur" into main

* changes:
  Disable transparent bouncer and scrims when blur is not supported or disabled
  Add a flow that can be used to determine whether cross window blur is enabled/supported right now.
parents 83bbf977 fc8a6a7e
Loading
Loading
Loading
Loading
+4 −3
Original line number Original line 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.mockito.whenever
import com.android.systemui.util.settings.GlobalSettings
import com.android.systemui.util.settings.GlobalSettings
import com.android.systemui.util.time.FakeSystemClock
import com.android.systemui.util.time.FakeSystemClock
import com.android.systemui.window.domain.interactor.windowRootViewBlurInteractor
import com.google.common.truth.Truth
import com.google.common.truth.Truth
import junit.framework.Assert
import junit.framework.Assert
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.MutableStateFlow
@@ -280,9 +281,9 @@ class KeyguardSecurityContainerControllerTest : SysuiTestCase() {
                kosmos.keyguardDismissTransitionInteractor,
                kosmos.keyguardDismissTransitionInteractor,
                { primaryBouncerInteractor },
                { primaryBouncerInteractor },
                executor,
                executor,
            ) {
                { deviceEntryInteractor },
                deviceEntryInteractor
                { kosmos.windowRootViewBlurInteractor },
            }
            )
    }
    }


    @Test
    @Test
+19 −4
Original line number Original line Diff line number Diff line
@@ -98,7 +98,6 @@ import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
import com.android.keyguard.KeyguardSecurityModel.SecurityMode;
import com.android.settingslib.Utils;
import com.android.settingslib.Utils;
import com.android.settingslib.drawable.CircleFramedDrawable;
import com.android.settingslib.drawable.CircleFramedDrawable;
import com.android.systemui.Flags;
import com.android.systemui.FontStyles;
import com.android.systemui.FontStyles;
import com.android.systemui.Gefingerpoken;
import com.android.systemui.Gefingerpoken;
import com.android.systemui.classifier.FalsingA11yDelegate;
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_PRIMARY = 1;
    static final int USER_TYPE_WORK_PROFILE = 2;
    static final int USER_TYPE_WORK_PROFILE = 2;
    static final int USER_TYPE_SECONDARY_USER = 3;
    static final int USER_TYPE_SECONDARY_USER = 3;
    private boolean mTransparentModeEnabled = false;


    @IntDef({MODE_UNINITIALIZED, MODE_DEFAULT, MODE_ONE_HANDED, MODE_USER_SWITCHER})
    @IntDef({MODE_UNINITIALIZED, MODE_DEFAULT, MODE_ONE_HANDED, MODE_USER_SWITCHER})
    public @interface Mode {}
    public @interface Mode {}
@@ -814,15 +814,30 @@ public class KeyguardSecurityContainer extends ConstraintLayout {
        mDisappearAnimRunning = false;
        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() {
    private void reloadBackgroundColor() {
        if (Flags.bouncerUiRevamp()) {
        if (mTransparentModeEnabled) {
            // 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.
            setBackgroundColor(Color.TRANSPARENT);
            setBackgroundColor(Color.TRANSPARENT);
        } else {
        } else {
            setBackgroundColor(
            setBackgroundColor(
                    getContext().getColor(com.android.internal.R.color.materialColorSurfaceDim));
                    getContext().getColor(com.android.internal.R.color.materialColorSurfaceDim));
        }
        }
        invalidate();
    }
    }


    void reloadColors() {
    void reloadColors() {
+41 −1
Original line number Original line 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.KeyguardSecurityModel.SecurityMode;
import com.android.keyguard.dagger.KeyguardBouncerScope;
import com.android.keyguard.dagger.KeyguardBouncerScope;
import com.android.settingslib.utils.ThreadUtils;
import com.android.settingslib.utils.ThreadUtils;
import com.android.systemui.Flags;
import com.android.systemui.Gefingerpoken;
import com.android.systemui.Gefingerpoken;
import com.android.systemui.biometrics.FaceAuthAccessibilityDelegate;
import com.android.systemui.biometrics.FaceAuthAccessibilityDelegate;
import com.android.systemui.bouncer.domain.interactor.BouncerMessageInteractor;
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.ViewController;
import com.android.systemui.util.kotlin.JavaAdapter;
import com.android.systemui.util.kotlin.JavaAdapter;
import com.android.systemui.util.settings.GlobalSettings;
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;
import dagger.Lazy;


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


    @Inject
    @Inject
    public KeyguardSecurityContainerController(KeyguardSecurityContainer view,
    public KeyguardSecurityContainerController(KeyguardSecurityContainer view,
@@ -463,9 +468,11 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
            KeyguardDismissTransitionInteractor keyguardDismissTransitionInteractor,
            KeyguardDismissTransitionInteractor keyguardDismissTransitionInteractor,
            Lazy<PrimaryBouncerInteractor> primaryBouncerInteractor,
            Lazy<PrimaryBouncerInteractor> primaryBouncerInteractor,
            @Background Executor bgExecutor,
            @Background Executor bgExecutor,
            Provider<DeviceEntryInteractor> deviceEntryInteractor
            Provider<DeviceEntryInteractor> deviceEntryInteractor,
            Lazy<WindowRootViewBlurInteractor> rootViewBlurInteractorProvider
    ) {
    ) {
        super(view);
        super(view);
        mRootViewBlurInteractor = rootViewBlurInteractorProvider;
        view.setAccessibilityDelegate(faceAuthAccessibilityDelegate);
        view.setAccessibilityDelegate(faceAuthAccessibilityDelegate);
        mLockPatternUtils = lockPatternUtils;
        mLockPatternUtils = lockPatternUtils;
        mUpdateMonitor = keyguardUpdateMonitor;
        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
    @Override
@@ -552,6 +585,11 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
            mSceneTransitionCollectionJob.cancel(null);
            mSceneTransitionCollectionJob.cancel(null);
            mSceneTransitionCollectionJob = null;
            mSceneTransitionCollectionJob = null;
        }
        }

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


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

        refreshBouncerBackground();
    }
    }


    @Override
    @Override
+5 −1
Original line number Original line Diff line number Diff line
@@ -45,13 +45,17 @@ import com.android.systemui.shade.domain.interactor.ShadeLockscreenInteractor
import com.android.systemui.shade.domain.interactor.ShadeLockscreenInteractorImpl
import com.android.systemui.shade.domain.interactor.ShadeLockscreenInteractorImpl
import com.android.systemui.shade.domain.interactor.ShadeModeInteractor
import com.android.systemui.shade.domain.interactor.ShadeModeInteractor
import com.android.systemui.shade.domain.interactor.ShadeModeInteractorImpl
import com.android.systemui.shade.domain.interactor.ShadeModeInteractorImpl
import com.android.systemui.window.dagger.WindowRootViewBlurModule
import dagger.Binds
import dagger.Binds
import dagger.Module
import dagger.Module
import dagger.Provides
import dagger.Provides
import javax.inject.Provider
import javax.inject.Provider


/** Module for classes related to the notification shade. */
/** Module for classes related to the notification shade. */
@Module(includes = [StartShadeModule::class, ShadeViewProviderModule::class])
@Module(
    includes =
        [StartShadeModule::class, ShadeViewProviderModule::class, WindowRootViewBlurModule::class]
)
abstract class ShadeModule {
abstract class ShadeModule {
    companion object {
    companion object {
        @Provides
        @Provides
+34 −7
Original line number Original line 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.kotlin.JavaAdapter;
import com.android.systemui.util.wakelock.DelayedWakeLock;
import com.android.systemui.util.wakelock.DelayedWakeLock;
import com.android.systemui.util.wakelock.WakeLock;
import com.android.systemui.util.wakelock.WakeLock;
import com.android.systemui.window.domain.interactor.WindowRootViewBlurInteractor;

import dagger.Lazy;


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


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


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


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


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


        final ScrimState[] states = ScrimState.values();
        final ScrimState[] states = ScrimState.values();
        for (int i = 0; i < states.length; i++) {
        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].setScrimBehindAlphaKeyguard(mScrimBehindAlphaKeyguard);
            states[i].setDefaultScrimAlpha(mDefaultScrimAlpha);
            states[i].setDefaultScrimAlpha(mDefaultScrimAlpha);
        }
        }
@@ -485,6 +488,30 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
                        Edge.Companion.create(Scenes.Communal, LOCKSCREEN),
                        Edge.Companion.create(Scenes.Communal, LOCKSCREEN),
                        Edge.Companion.create(GLANCEABLE_HUB, LOCKSCREEN)),
                        Edge.Companion.create(GLANCEABLE_HUB, LOCKSCREEN)),
                mGlanceableHubConsumer, mMainDispatcher);
                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.
    // TODO(b/270984686) recompute scrim height accurately, based on shade contents.
Loading