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
}