Loading packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsContainerViewModelTest.kt +26 −0 Original line number Diff line number Diff line Loading @@ -19,9 +19,11 @@ package com.android.systemui.qs.ui.viewmodel import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags import android.testing.TestableLooper import android.view.Display import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.Flags.FLAG_NOTIFICATION_SHADE_BLUR import com.android.systemui.Flags.FLAG_SHADE_WINDOW_GOES_AROUND import com.android.systemui.SysuiTestCase import com.android.systemui.flags.EnableSceneContainer import com.android.systemui.kosmos.testScope Loading @@ -31,6 +33,7 @@ import com.android.systemui.media.controls.data.repository.mediaFilterRepository import com.android.systemui.media.controls.shared.model.MediaData import com.android.systemui.qs.composefragment.dagger.usingMediaInComposeFragment import com.android.systemui.scene.domain.startable.sceneContainerStartable import com.android.systemui.shade.data.repository.fakeShadeDisplaysRepository import com.android.systemui.shade.domain.interactor.enableDualShade import com.android.systemui.testKosmos import com.android.systemui.window.data.repository.fakeWindowRootViewBlurRepository Loading Loading @@ -114,4 +117,27 @@ class QuickSettingsContainerViewModelTest : SysuiTestCase() { assertThat(underTest.isTransparencyEnabled).isFalse() } @Test fun isBrightnessSliderVisible_defaultDisplay_isVisible() = with(kosmos) { testScope.runTest { fakeShadeDisplaysRepository.setPendingDisplayId(Display.DEFAULT_DISPLAY) assertThat(underTest.isBrightnessSliderVisible).isTrue() } } @Test @EnableFlags(FLAG_SHADE_WINDOW_GOES_AROUND) fun isBrightnessSliderVisible_externalDisplay_isInvisible() = with(kosmos) { testScope.runTest { fakeShadeDisplaysRepository.setPendingDisplayId( Display.DEFAULT_DISPLAY + 1 ) // Not default. assertThat(underTest.isBrightnessSliderVisible).isFalse() } } } packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt +7 −1 Original line number Diff line number Diff line Loading @@ -884,7 +884,12 @@ constructor( ) ) { QuickSettingsLayout( brightness = BrightnessSlider, brightness = if (viewModel.isBrightnessSliderVisible) { { BrightnessSlider() } } else { {} }, tiles = TileGrid, media = Media, mediaInRow = viewModel.qsMediaInRow, Loading Loading @@ -1390,6 +1395,7 @@ fun QuickQuickSettingsLayout( } } /** [brightness] is nullable as it might not be there (e.g. on connected displays). */ @Composable @VisibleForTesting fun QuickSettingsLayout( Loading packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt +4 −0 Original line number Diff line number Diff line Loading @@ -260,6 +260,9 @@ constructor( val showingMirror: Boolean get() = containerViewModel.brightnessSliderViewModel.showMirror val isBrightnessSliderVisible: Boolean get() = containerViewModel.isBrightnessSliderVisible // The initial values in these two are not meaningful. The flow will emit on start the correct // values. This is because we need to lazily fetch them after initMediaHosts. val qqsMediaVisible by Loading Loading @@ -537,6 +540,7 @@ constructor( println("isQSEnabled", isQsEnabled) println("isCustomizing", containerViewModel.editModeViewModel.isEditing.value) println("inFirstPage", inFirstPage) println("isBrightnessSliderVisible", containerViewModel.isBrightnessSliderVisible) } printSection("Expansion state") { println("qsExpansion", qsExpansion) Loading packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsContainerViewModel.kt +30 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.systemui.qs.ui.viewmodel import android.content.Context import android.media.AudioManager import android.view.Display import androidx.compose.runtime.getValue import com.android.settingslib.volume.shared.model.AudioStream import com.android.systemui.Flags Loading @@ -35,10 +36,13 @@ import com.android.systemui.qs.panels.ui.viewmodel.TileGridViewModel import com.android.systemui.qs.panels.ui.viewmodel.toolbar.ToolbarViewModel import com.android.systemui.res.R import com.android.systemui.shade.ShadeDisplayAware import com.android.systemui.shade.domain.interactor.ShadeDisplaysInteractor import com.android.systemui.shade.shared.flag.ShadeWindowGoesAround import com.android.systemui.shade.ui.viewmodel.ShadeHeaderViewModel import com.android.systemui.volume.panel.component.volume.domain.model.SliderType import com.android.systemui.volume.panel.component.volume.slider.ui.viewmodel.AudioStreamSliderViewModel import com.android.systemui.window.domain.interactor.WindowRootViewBlurInteractor import dagger.Lazy import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject Loading @@ -46,6 +50,7 @@ import javax.inject.Named import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch class QuickSettingsContainerViewModel Loading @@ -65,6 +70,7 @@ constructor( mediaCarouselInteractor: MediaCarouselInteractor, val mediaCarouselController: MediaCarouselController, @Named(MediaModule.QS_PANEL) val mediaHost: MediaHost, shadeDisplaysInteractor: Lazy<ShadeDisplaysInteractor>, ) : ExclusiveActivatable() { private val hydrator = Hydrator("QuickSettingsContainerViewModel.hydrator") Loading @@ -87,6 +93,20 @@ constructor( }, ) val isBrightnessSliderVisible by hydrator.hydratedStateOf( traceName = "isBrightnessSliderVisible", initialValue = shouldBrightnessSliderBeVisible(Display.DEFAULT_DISPLAY), source = if (ShadeWindowGoesAround.isEnabled) { shadeDisplaysInteractor.get().pendingDisplayId.map { shouldBrightnessSliderBeVisible(it) } } else { flowOf(true) }, ) val brightnessSliderViewModel = brightnessSliderViewModelFactory.create(supportsBrightnessMirroring) Loading Loading @@ -133,6 +153,16 @@ constructor( } } private companion object { fun shouldBrightnessSliderBeVisible(displayId: Int): Boolean { return if (ShadeWindowGoesAround.isEnabled) { displayId == Display.DEFAULT_DISPLAY } else { true } } } @AssistedFactory interface Factory { fun create( Loading packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegate.kt +2 −2 Original line number Diff line number Diff line Loading @@ -21,7 +21,6 @@ import android.os.Bundle import android.os.UserHandle import android.view.View import androidx.annotation.StyleRes import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.mediaprojection.MediaProjectionMetricsLogger import com.android.systemui.mediaprojection.permission.BaseMediaProjectionPermissionContentManager import com.android.systemui.mediaprojection.permission.BaseMediaProjectionPermissionDialogDelegate Loading @@ -30,6 +29,7 @@ import com.android.systemui.mediaprojection.permission.ScreenShareMode import com.android.systemui.plugins.ActivityStarter import com.android.systemui.res.R import com.android.systemui.settings.UserContextProvider import com.android.systemui.shade.ShadeDisplayAware import com.android.systemui.statusbar.phone.SystemUIDialog import dagger.assisted.Assisted import dagger.assisted.AssistedFactory Loading Loading @@ -70,7 +70,7 @@ class ScreenRecordPermissionDialogDelegate( @Assisted onStartRecordingClicked: Runnable?, mediaProjectionMetricsLogger: MediaProjectionMetricsLogger, systemUIDialogFactory: SystemUIDialog.Factory, @Application context: Context, @ShadeDisplayAware context: Context, displayManager: DisplayManager, ) : this( hostUserHandle, Loading Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsContainerViewModelTest.kt +26 −0 Original line number Diff line number Diff line Loading @@ -19,9 +19,11 @@ package com.android.systemui.qs.ui.viewmodel import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags import android.testing.TestableLooper import android.view.Display import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.Flags.FLAG_NOTIFICATION_SHADE_BLUR import com.android.systemui.Flags.FLAG_SHADE_WINDOW_GOES_AROUND import com.android.systemui.SysuiTestCase import com.android.systemui.flags.EnableSceneContainer import com.android.systemui.kosmos.testScope Loading @@ -31,6 +33,7 @@ import com.android.systemui.media.controls.data.repository.mediaFilterRepository import com.android.systemui.media.controls.shared.model.MediaData import com.android.systemui.qs.composefragment.dagger.usingMediaInComposeFragment import com.android.systemui.scene.domain.startable.sceneContainerStartable import com.android.systemui.shade.data.repository.fakeShadeDisplaysRepository import com.android.systemui.shade.domain.interactor.enableDualShade import com.android.systemui.testKosmos import com.android.systemui.window.data.repository.fakeWindowRootViewBlurRepository Loading Loading @@ -114,4 +117,27 @@ class QuickSettingsContainerViewModelTest : SysuiTestCase() { assertThat(underTest.isTransparencyEnabled).isFalse() } @Test fun isBrightnessSliderVisible_defaultDisplay_isVisible() = with(kosmos) { testScope.runTest { fakeShadeDisplaysRepository.setPendingDisplayId(Display.DEFAULT_DISPLAY) assertThat(underTest.isBrightnessSliderVisible).isTrue() } } @Test @EnableFlags(FLAG_SHADE_WINDOW_GOES_AROUND) fun isBrightnessSliderVisible_externalDisplay_isInvisible() = with(kosmos) { testScope.runTest { fakeShadeDisplaysRepository.setPendingDisplayId( Display.DEFAULT_DISPLAY + 1 ) // Not default. assertThat(underTest.isBrightnessSliderVisible).isFalse() } } }
packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt +7 −1 Original line number Diff line number Diff line Loading @@ -884,7 +884,12 @@ constructor( ) ) { QuickSettingsLayout( brightness = BrightnessSlider, brightness = if (viewModel.isBrightnessSliderVisible) { { BrightnessSlider() } } else { {} }, tiles = TileGrid, media = Media, mediaInRow = viewModel.qsMediaInRow, Loading Loading @@ -1390,6 +1395,7 @@ fun QuickQuickSettingsLayout( } } /** [brightness] is nullable as it might not be there (e.g. on connected displays). */ @Composable @VisibleForTesting fun QuickSettingsLayout( Loading
packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt +4 −0 Original line number Diff line number Diff line Loading @@ -260,6 +260,9 @@ constructor( val showingMirror: Boolean get() = containerViewModel.brightnessSliderViewModel.showMirror val isBrightnessSliderVisible: Boolean get() = containerViewModel.isBrightnessSliderVisible // The initial values in these two are not meaningful. The flow will emit on start the correct // values. This is because we need to lazily fetch them after initMediaHosts. val qqsMediaVisible by Loading Loading @@ -537,6 +540,7 @@ constructor( println("isQSEnabled", isQsEnabled) println("isCustomizing", containerViewModel.editModeViewModel.isEditing.value) println("inFirstPage", inFirstPage) println("isBrightnessSliderVisible", containerViewModel.isBrightnessSliderVisible) } printSection("Expansion state") { println("qsExpansion", qsExpansion) Loading
packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsContainerViewModel.kt +30 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.systemui.qs.ui.viewmodel import android.content.Context import android.media.AudioManager import android.view.Display import androidx.compose.runtime.getValue import com.android.settingslib.volume.shared.model.AudioStream import com.android.systemui.Flags Loading @@ -35,10 +36,13 @@ import com.android.systemui.qs.panels.ui.viewmodel.TileGridViewModel import com.android.systemui.qs.panels.ui.viewmodel.toolbar.ToolbarViewModel import com.android.systemui.res.R import com.android.systemui.shade.ShadeDisplayAware import com.android.systemui.shade.domain.interactor.ShadeDisplaysInteractor import com.android.systemui.shade.shared.flag.ShadeWindowGoesAround import com.android.systemui.shade.ui.viewmodel.ShadeHeaderViewModel import com.android.systemui.volume.panel.component.volume.domain.model.SliderType import com.android.systemui.volume.panel.component.volume.slider.ui.viewmodel.AudioStreamSliderViewModel import com.android.systemui.window.domain.interactor.WindowRootViewBlurInteractor import dagger.Lazy import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject Loading @@ -46,6 +50,7 @@ import javax.inject.Named import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch class QuickSettingsContainerViewModel Loading @@ -65,6 +70,7 @@ constructor( mediaCarouselInteractor: MediaCarouselInteractor, val mediaCarouselController: MediaCarouselController, @Named(MediaModule.QS_PANEL) val mediaHost: MediaHost, shadeDisplaysInteractor: Lazy<ShadeDisplaysInteractor>, ) : ExclusiveActivatable() { private val hydrator = Hydrator("QuickSettingsContainerViewModel.hydrator") Loading @@ -87,6 +93,20 @@ constructor( }, ) val isBrightnessSliderVisible by hydrator.hydratedStateOf( traceName = "isBrightnessSliderVisible", initialValue = shouldBrightnessSliderBeVisible(Display.DEFAULT_DISPLAY), source = if (ShadeWindowGoesAround.isEnabled) { shadeDisplaysInteractor.get().pendingDisplayId.map { shouldBrightnessSliderBeVisible(it) } } else { flowOf(true) }, ) val brightnessSliderViewModel = brightnessSliderViewModelFactory.create(supportsBrightnessMirroring) Loading Loading @@ -133,6 +153,16 @@ constructor( } } private companion object { fun shouldBrightnessSliderBeVisible(displayId: Int): Boolean { return if (ShadeWindowGoesAround.isEnabled) { displayId == Display.DEFAULT_DISPLAY } else { true } } } @AssistedFactory interface Factory { fun create( Loading
packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogDelegate.kt +2 −2 Original line number Diff line number Diff line Loading @@ -21,7 +21,6 @@ import android.os.Bundle import android.os.UserHandle import android.view.View import androidx.annotation.StyleRes import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.mediaprojection.MediaProjectionMetricsLogger import com.android.systemui.mediaprojection.permission.BaseMediaProjectionPermissionContentManager import com.android.systemui.mediaprojection.permission.BaseMediaProjectionPermissionDialogDelegate Loading @@ -30,6 +29,7 @@ import com.android.systemui.mediaprojection.permission.ScreenShareMode import com.android.systemui.plugins.ActivityStarter import com.android.systemui.res.R import com.android.systemui.settings.UserContextProvider import com.android.systemui.shade.ShadeDisplayAware import com.android.systemui.statusbar.phone.SystemUIDialog import dagger.assisted.Assisted import dagger.assisted.AssistedFactory Loading Loading @@ -70,7 +70,7 @@ class ScreenRecordPermissionDialogDelegate( @Assisted onStartRecordingClicked: Runnable?, mediaProjectionMetricsLogger: MediaProjectionMetricsLogger, systemUIDialogFactory: SystemUIDialog.Factory, @Application context: Context, @ShadeDisplayAware context: Context, displayManager: DisplayManager, ) : this( hostUserHandle, Loading