diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index 1b2aefcd6ff0c..9de1c5ea1a3d4 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -272,6 +272,9 @@ + + + diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BlurUtils.kt b/packages/SystemUI/src/com/android/systemui/statusbar/BlurUtils.kt index aafeabc7c1a23..dce19cf86b35d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BlurUtils.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BlurUtils.kt @@ -45,6 +45,8 @@ open class BlurUtils @Inject constructor( val minBlurRadius = resources.getDimensionPixelSize(R.dimen.min_window_blur_radius) val maxBlurRadius = resources.getDimensionPixelSize(R.dimen.max_window_blur_radius) + private var lastAppliedBlur = 0 + init { dumpManager.registerDumpable(javaClass.name, this) } @@ -75,17 +77,25 @@ open class BlurUtils @Inject constructor( * * @param viewRootImpl The window root. * @param radius blur radius in pixels. + * @param opaque if surface is opaque, regardless or having blurs or no. */ - fun applyBlur(viewRootImpl: ViewRootImpl?, radius: Int, opaqueBackground: Boolean) { + fun applyBlur(viewRootImpl: ViewRootImpl?, radius: Int, opaque: Boolean) { if (viewRootImpl == null || !viewRootImpl.surfaceControl.isValid || !supportsBlursOnWindows()) { return } createTransaction().use { it.setBackgroundBlurRadius(viewRootImpl.surfaceControl, radius) - it.setOpaque(viewRootImpl.surfaceControl, opaqueBackground) + it.setOpaque(viewRootImpl.surfaceControl, opaque) + if (lastAppliedBlur == 0 && radius != 0) { + it.setEarlyWakeupStart() + } + if (lastAppliedBlur != 0 && radius == 0) { + it.setEarlyWakeupEnd() + } it.apply() } + lastAppliedBlur = radius } @VisibleForTesting 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 2b44d8bbd364d..8e52588e5390a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/BlurUtilsTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/BlurUtilsTest.kt @@ -27,6 +27,7 @@ import org.junit.Before import org.junit.Test import org.mockito.Mock import org.mockito.Mockito.`when` +import org.mockito.Mockito.clearInvocations import org.mockito.Mockito.eq import org.mockito.Mockito.mock import org.mockito.Mockito.verify @@ -38,13 +39,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 + @Mock lateinit var crossWindowBlurListeners: CrossWindowBlurListeners lateinit var blurUtils: BlurUtils @Before fun setup() { MockitoAnnotations.initMocks(this) - `when`(corssWindowBlurListeners.isCrossWindowBlurEnabled).thenReturn(true) + `when`(crossWindowBlurListeners.isCrossWindowBlurEnabled).thenReturn(true) blurUtils = TestableBlurUtils() } @@ -74,7 +75,21 @@ class BlurUtilsTest : SysuiTestCase() { verify(transaction).apply() } - inner class TestableBlurUtils() : BlurUtils(resources, corssWindowBlurListeners, dumpManager) { + @Test + fun testEarlyWakeUp() { + val radius = 10 + val surfaceControl = mock(SurfaceControl::class.java) + val viewRootImpl = mock(ViewRootImpl::class.java) + `when`(viewRootImpl.surfaceControl).thenReturn(surfaceControl) + `when`(surfaceControl.isValid).thenReturn(true) + blurUtils.applyBlur(viewRootImpl, radius, true /* opaque */) + verify(transaction).setEarlyWakeupStart() + clearInvocations(transaction) + blurUtils.applyBlur(viewRootImpl, 0, true /* opaque */) + verify(transaction).setEarlyWakeupEnd() + } + + inner class TestableBlurUtils() : BlurUtils(resources, crossWindowBlurListeners, dumpManager) { override fun supportsBlursOnWindows(): Boolean { return true }