Hide UMO from the shade when QS is disabled
With the flexiglass off UMO is not visible in the Shade. This CL
replicates this behaviour when flexiglass on
Flag: com.android.systemui.scene_container
Bug: 371545613
Test: manually. Start playing music and observe UMO absence in the Shade. The commands used are:
$ adb shell cmd statusbar send-disable-flag quick-settings
$ adb shell cmd statusbar send-disable-flag none
Change-Id: Id677504f982abad7d1d1cec9e0a2d5a19882546e
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt
index bba3d69..7d47f88 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt
@@ -270,6 +270,7 @@
)
val isEmptySpaceClickable by viewModel.isEmptySpaceClickable.collectAsStateWithLifecycle()
val isMediaVisible by viewModel.isMediaVisible.collectAsStateWithLifecycle()
+ val isQsEnabled by viewModel.isQsEnabled.collectAsStateWithLifecycle()
val shouldPunchHoleBehindScrim =
layoutState.isTransitioningBetween(Scenes.Gone, Scenes.Shade) ||
@@ -361,6 +362,7 @@
carouselController = mediaCarouselController,
modifier = Modifier.layoutId(SingleShadeMeasurePolicy.LayoutId.Media),
usingCollapsedLandscapeMedia = usingCollapsedLandscapeMedia,
+ isQsEnabled = isQsEnabled,
isInSplitShade = false,
)
@@ -416,6 +418,7 @@
val screenCornerRadius = LocalScreenCornerRadius.current
val isCustomizing by viewModel.qsSceneAdapter.isCustomizing.collectAsStateWithLifecycle()
+ val isQsEnabled by viewModel.isQsEnabled.collectAsStateWithLifecycle()
val isCustomizerShowing by
viewModel.qsSceneAdapter.isCustomizerShowing.collectAsStateWithLifecycle()
val customizingAnimationDuration by
@@ -567,6 +570,7 @@
Modifier.zIndex(1f)
},
carouselController = mediaCarouselController,
+ isQsEnabled = isQsEnabled,
isInSplitShade = true,
)
}
@@ -620,10 +624,14 @@
mediaHost: MediaHost,
carouselController: MediaCarouselController,
mediaOffsetProvider: ShadeMediaOffsetProvider,
+ isInSplitShade: Boolean,
+ isQsEnabled: Boolean,
modifier: Modifier = Modifier,
usingCollapsedLandscapeMedia: Boolean = false,
- isInSplitShade: Boolean,
) {
+ if (!isQsEnabled) {
+ return
+ }
MediaCarousel(
modifier = modifier.fillMaxWidth(),
isVisible = isVisible,
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneContentViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneContentViewModelTest.kt
index 558606f..a9d5790 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneContentViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneContentViewModelTest.kt
@@ -16,6 +16,7 @@
package com.android.systemui.shade.ui.viewmodel
+import android.app.StatusBarManager.DISABLE2_QUICK_SETTINGS
import android.platform.test.annotations.DisableFlags
import android.testing.TestableLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -42,6 +43,7 @@
import com.android.systemui.shade.data.repository.shadeRepository
import com.android.systemui.shade.shared.flag.DualShade
import com.android.systemui.shade.shared.model.ShadeMode
+import com.android.systemui.statusbar.disableflags.data.repository.fakeDisableFlagsRepository
import com.android.systemui.testKosmos
import com.android.systemui.unfold.fakeUnfoldTransitionProgressProvider
import com.google.common.truth.Truth.assertThat
@@ -49,6 +51,7 @@
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.update
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
@@ -158,10 +161,7 @@
underTest.unfoldTranslationX(isOnStartSide = true),
underTest.unfoldTranslationX(isOnStartSide = false),
) { start, end ->
- Translations(
- start = start,
- end = end,
- )
+ Translations(start = start, end = end)
}
)
@@ -186,6 +186,20 @@
assertThat(translations?.end).isEqualTo(-0f)
}
+ @Test
+ fun disable2QuickSettings_isQsEnabledIsFalse() =
+ testScope.runTest {
+ val isQsEnabled by collectLastValue(underTest.isQsEnabled)
+ assertThat(isQsEnabled).isTrue()
+
+ kosmos.fakeDisableFlagsRepository.disableFlags.update {
+ it.copy(disable2 = DISABLE2_QUICK_SETTINGS)
+ }
+ runCurrent()
+
+ assertThat(isQsEnabled).isFalse()
+ }
+
private fun prepareConfiguration(): Int {
val configuration = context.resources.configuration
configuration.setLayoutDirection(Locale.US)
@@ -193,7 +207,7 @@
val maxTranslation = 10
kosmos.fakeConfigurationRepository.setDimensionPixelSize(
R.dimen.notification_side_paddings,
- maxTranslation
+ maxTranslation,
)
return maxTranslation
}
@@ -224,8 +238,5 @@
runCurrent()
}
- private data class Translations(
- val start: Float,
- val end: Float,
- )
+ private data class Translations(val start: Float, val end: Float)
}
diff --git a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneContentViewModel.kt b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneContentViewModel.kt
index ce4c081..02531221 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneContentViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneContentViewModel.kt
@@ -30,15 +30,21 @@
import com.android.systemui.settings.brightness.ui.viewModel.BrightnessMirrorViewModel
import com.android.systemui.shade.domain.interactor.ShadeInteractor
import com.android.systemui.shade.shared.model.ShadeMode
+import com.android.systemui.statusbar.disableflags.domain.interactor.DisableFlagsInteractor
import com.android.systemui.unfold.domain.interactor.UnfoldTransitionInteractor
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import java.util.concurrent.atomic.AtomicBoolean
import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.awaitCancellation
+import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
+import kotlinx.coroutines.flow.launchIn
+import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.onEach
/**
* Models UI state used to render the content of the shade scene.
@@ -54,6 +60,7 @@
val brightnessMirrorViewModelFactory: BrightnessMirrorViewModel.Factory,
val mediaCarouselInteractor: MediaCarouselInteractor,
shadeInteractor: ShadeInteractor,
+ private val disableFlagsInteractor: DisableFlagsInteractor,
private val footerActionsViewModelFactory: FooterActionsViewModel.Factory,
private val footerActionsController: FooterActionsController,
private val unfoldTransitionInteractor: UnfoldTransitionInteractor,
@@ -70,12 +77,21 @@
val isMediaVisible: StateFlow<Boolean> = mediaCarouselInteractor.hasActiveMediaOrRecommendation
+ private val _isQsEnabled =
+ MutableStateFlow(!disableFlagsInteractor.disableFlags.value.isQuickSettingsEnabled())
+ val isQsEnabled: StateFlow<Boolean> = _isQsEnabled.asStateFlow()
+
private val footerActionsControllerInitialized = AtomicBoolean(false)
- override suspend fun onActivated(): Nothing {
- deviceEntryInteractor.isDeviceEntered.collect { isDeviceEntered ->
- _isEmptySpaceClickable.value = !isDeviceEntered
- }
+ override suspend fun onActivated(): Nothing = coroutineScope {
+ deviceEntryInteractor.isDeviceEntered
+ .onEach { isDeviceEntered -> _isEmptySpaceClickable.value = !isDeviceEntered }
+ .launchIn(this)
+ disableFlagsInteractor.disableFlags
+ .map { it.isQuickSettingsEnabled() }
+ .onEach { _isQsEnabled.value = it }
+ .launchIn(this)
+ awaitCancellation()
}
/**
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneContentViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneContentViewModelKosmos.kt
index 7097d31..694bb6e 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneContentViewModelKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneContentViewModelKosmos.kt
@@ -26,6 +26,7 @@
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.settings.brightness.ui.viewmodel.brightnessMirrorViewModelFactory
import com.android.systemui.shade.domain.interactor.shadeInteractor
+import com.android.systemui.statusbar.disableflags.domain.interactor.disableFlagsInteractor
import com.android.systemui.unfold.domain.interactor.unfoldTransitionInteractor
val Kosmos.shadeSceneContentViewModel: ShadeSceneContentViewModel by Fixture {
@@ -35,6 +36,7 @@
brightnessMirrorViewModelFactory = brightnessMirrorViewModelFactory,
mediaCarouselInteractor = mediaCarouselInteractor,
shadeInteractor = shadeInteractor,
+ disableFlagsInteractor = disableFlagsInteractor,
footerActionsViewModelFactory = footerActionsViewModelFactory,
footerActionsController = footerActionsController,
unfoldTransitionInteractor = unfoldTransitionInteractor,