diff --git a/core/java/android/view/CrossWindowBlurListeners.java b/core/java/android/view/CrossWindowBlurListeners.java index e307b969ef911..761a2b88dec20 100644 --- a/core/java/android/view/CrossWindowBlurListeners.java +++ b/core/java/android/view/CrossWindowBlurListeners.java @@ -73,14 +73,14 @@ public final class CrossWindowBlurListeners { return instance; } - boolean isCrossWindowBlurEnabled() { + public boolean isCrossWindowBlurEnabled() { synchronized (sLock) { attachInternalListenerIfNeededLocked(); return mCrossWindowBlurEnabled; } } - void addListener(@NonNull @CallbackExecutor Executor executor, + public void addListener(@NonNull @CallbackExecutor Executor executor, @NonNull Consumer listener) { Preconditions.checkNotNull(listener, "listener cannot be null"); Preconditions.checkNotNull(executor, "executor cannot be null"); @@ -94,7 +94,7 @@ public final class CrossWindowBlurListeners { } - void removeListener(Consumer listener) { + public void removeListener(Consumer listener) { Preconditions.checkNotNull(listener, "listener cannot be null"); synchronized (sLock) { diff --git a/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java b/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java index 053d75d967201..954ba797e1642 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java @@ -63,6 +63,7 @@ import android.service.dreams.IDreamManager; import android.telecom.TelecomManager; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; +import android.view.CrossWindowBlurListeners; import android.view.IWindowManager; import android.view.ViewConfiguration; import android.view.WindowManager; @@ -138,6 +139,12 @@ public class FrameworkServicesModule { return context.getSystemService(DevicePolicyManager.class); } + @Provides + @Singleton + static CrossWindowBlurListeners provideCrossWindowBlurListeners() { + return CrossWindowBlurListeners.getInstance(); + } + @Provides @DisplayId static int provideDisplayId(Context context) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BlurUtils.kt b/packages/SystemUI/src/com/android/systemui/statusbar/BlurUtils.kt index ce796d9789cf1..89dda9c52651e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BlurUtils.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BlurUtils.kt @@ -22,6 +22,7 @@ import android.app.ActivityManager import android.content.res.Resources import android.util.IndentingPrintWriter import android.util.MathUtils +import android.view.CrossWindowBlurListeners import android.view.SurfaceControl import android.view.ViewRootImpl import androidx.annotation.VisibleForTesting @@ -37,6 +38,7 @@ import javax.inject.Inject @SysUISingleton open class BlurUtils @Inject constructor( @Main private val resources: Resources, + private val crossWindowBlurListeners: CrossWindowBlurListeners, dumpManager: DumpManager ) : Dumpable { val minBlurRadius = resources.getDimensionPixelSize(R.dimen.min_window_blur_radius) @@ -97,7 +99,8 @@ open class BlurUtils @Inject constructor( * @return {@code true} when supported. */ open fun supportsBlursOnWindows(): Boolean { - return CROSS_WINDOW_BLUR_SUPPORTED && ActivityManager.isHighEndGfx() + return CROSS_WINDOW_BLUR_SUPPORTED && ActivityManager.isHighEndGfx() && + crossWindowBlurListeners.isCrossWindowBlurEnabled() } override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt index 89005513d3d01..452d69369d719 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt @@ -186,7 +186,7 @@ class NotificationShadeDepthController @Inject constructor( var blur = max(shadeRadius.toInt(), globalActionsRadius) // Make blur be 0 if it is necessary to stop blur effect. - if (scrimsVisible) { + if (scrimsVisible || !blurUtils.supportsBlursOnWindows()) { blur = 0 } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/BlurUtilsTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/BlurUtilsTest.kt index 7c7d2dc16c03e..2b44d8bbd364d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/BlurUtilsTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/BlurUtilsTest.kt @@ -17,6 +17,7 @@ package com.android.systemui.statusbar import android.content.res.Resources +import android.view.CrossWindowBlurListeners import android.view.SurfaceControl import android.view.ViewRootImpl import androidx.test.filters.SmallTest @@ -37,11 +38,13 @@ class BlurUtilsTest : SysuiTestCase() { @Mock lateinit var resources: Resources @Mock lateinit var dumpManager: DumpManager @Mock lateinit var transaction: SurfaceControl.Transaction + @Mock lateinit var corssWindowBlurListeners: CrossWindowBlurListeners lateinit var blurUtils: BlurUtils @Before fun setup() { MockitoAnnotations.initMocks(this) + `when`(corssWindowBlurListeners.isCrossWindowBlurEnabled).thenReturn(true) blurUtils = TestableBlurUtils() } @@ -71,7 +74,7 @@ class BlurUtilsTest : SysuiTestCase() { verify(transaction).apply() } - inner class TestableBlurUtils() : BlurUtils(resources, dumpManager) { + inner class TestableBlurUtils() : BlurUtils(resources, corssWindowBlurListeners, dumpManager) { override fun supportsBlursOnWindows(): Boolean { return true } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt index 61c3835a88d2b..0fb259575c870 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt @@ -47,6 +47,7 @@ import org.mockito.Mockito.anyString import org.mockito.Mockito.clearInvocations import org.mockito.Mockito.doThrow import org.mockito.Mockito.never +import org.mockito.Mockito.reset import org.mockito.Mockito.times import org.mockito.Mockito.verify import org.mockito.junit.MockitoJUnit @@ -90,7 +91,8 @@ class NotificationShadeDepthControllerTest : SysuiTestCase() { `when`(blurUtils.blurRadiusOfRatio(anyFloat())).then { answer -> (answer.arguments[0] as Float * maxBlur).toInt() } - `when`(blurUtils.minBlurRadius).thenReturn(0) + `when`(blurUtils.supportsBlursOnWindows()).thenReturn(true) + `when`(blurUtils.maxBlurRadius).thenReturn(maxBlur) `when`(blurUtils.maxBlurRadius).thenReturn(maxBlur) notificationShadeDepthController = NotificationShadeDepthController( @@ -190,6 +192,14 @@ class NotificationShadeDepthControllerTest : SysuiTestCase() { verify(blurUtils).applyBlur(any(), eq(maxBlur), eq(false)) } + @Test + fun setFullShadeTransition_appliesBlur_onlyIfSupported() { + reset(blurUtils) + notificationShadeDepthController.transitionToFullShadeProgress = 1f + notificationShadeDepthController.updateBlurCallback.doFrame(0) + verify(blurUtils).applyBlur(any(), eq(0), eq(false)) + } + @Test fun updateGlobalDialogVisibility_animatesBlur() { notificationShadeDepthController.updateGlobalDialogVisibility(0.5f, root)