Merge "Reset blur radius to 0 whenever blur is not supported" into main
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModelTest.kt
index 390518f..a023b3c 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModelTest.kt
@@ -25,6 +25,8 @@
 import com.android.systemui.kosmos.testScope
 import com.android.systemui.lifecycle.activateIn
 import com.android.systemui.testKosmos
+import com.android.systemui.window.data.repository.fakeWindowRootViewBlurRepository
+import com.android.systemui.window.data.repository.windowRootViewBlurRepository
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.test.runCurrent
 import kotlinx.coroutines.test.runTest
@@ -34,7 +36,7 @@
 
 @SmallTest
 @RunWith(AndroidJUnit4::class)
-@EnableFlags(Flags.FLAG_BOUNCER_UI_REVAMP)
+@EnableFlags(Flags.FLAG_BOUNCER_UI_REVAMP, Flags.FLAG_GLANCEABLE_HUB_BLURRED_BACKGROUND)
 class WindowRootViewModelTest : SysuiTestCase() {
     val kosmos = testKosmos()
     val testScope = kosmos.testScope
@@ -49,6 +51,7 @@
     @Test
     fun bouncerTransitionChangesWindowBlurRadius() =
         testScope.runTest {
+            kosmos.fakeWindowRootViewBlurRepository.isBlurSupported.value = true
             val blurRadius by collectLastValue(underTest.blurRadius)
             val isBlurOpaque by collectLastValue(underTest.isBlurOpaque)
             runCurrent()
@@ -59,4 +62,27 @@
             assertThat(blurRadius).isEqualTo(30)
             assertThat(isBlurOpaque).isEqualTo(false)
         }
+
+    @Test
+    fun blurRadiusDoesNotChangeWhenBlurIsNotSupported() =
+        testScope.runTest {
+            kosmos.fakeWindowRootViewBlurRepository.isBlurSupported.value = false
+            val blurRadius by collectLastValue(underTest.blurRadius)
+            runCurrent()
+
+            kosmos.fakeBouncerTransitions.first().windowBlurRadius.value = 30.0f
+            runCurrent()
+
+            assertThat(blurRadius).isEqualTo(0f)
+
+            kosmos.fakeGlanceableHubTransitions.first().windowBlurRadius.value = 50.0f
+            runCurrent()
+
+            assertThat(blurRadius).isEqualTo(0f)
+
+            kosmos.windowRootViewBlurRepository.blurRadius.value = 60
+            runCurrent()
+
+            assertThat(blurRadius).isEqualTo(0f)
+        }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModel.kt b/packages/SystemUI/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModel.kt
index b18c39dc..1b42352 100644
--- a/packages/SystemUI/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/window/ui/viewmodel/WindowRootViewModel.kt
@@ -26,11 +26,14 @@
 import com.android.systemui.window.domain.interactor.WindowRootViewBlurInteractor
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
+import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.awaitCancellation
 import kotlinx.coroutines.channels.Channel
 import kotlinx.coroutines.coroutineScope
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.flatMapLatest
+import kotlinx.coroutines.flow.flowOf
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.merge
 import kotlinx.coroutines.flow.onEach
@@ -38,6 +41,7 @@
 typealias BlurAppliedUiEvent = Int
 
 /** View model for window root view. */
+@OptIn(ExperimentalCoroutinesApi::class)
 class WindowRootViewModel
 @AssistedInject
 constructor(
@@ -58,7 +62,7 @@
             glanceableHubTransitions.map { it.windowBlurRadius.logIfPossible(it.javaClass.name) }
         else emptyList()
 
-    val blurRadius: Flow<Float> =
+    private val _blurRadius =
         listOf(
                 *bouncerBlurRadiusFlows.toTypedArray(),
                 *glanceableHubBlurRadiusFlows.toTypedArray(),
@@ -66,8 +70,23 @@
             )
             .merge()
 
+    val blurRadius: Flow<Float> =
+        blurInteractor.isBlurCurrentlySupported.flatMapLatest { blurSupported ->
+            if (blurSupported) {
+                _blurRadius
+            } else {
+                flowOf(0f)
+            }
+        }
+
     val isBlurOpaque =
-        blurInteractor.isBlurOpaque.distinctUntilChanged().logIfPossible("isBlurOpaque")
+        blurInteractor.isBlurCurrentlySupported.flatMapLatest { blurSupported ->
+            if (blurSupported) {
+                blurInteractor.isBlurOpaque.distinctUntilChanged().logIfPossible("isBlurOpaque")
+            } else {
+                flowOf(false)
+            }
+        }
 
     override suspend fun onActivated(): Nothing {
         coroutineScope {