Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2c1ad46d authored by Fabián Kozynski's avatar Fabián Kozynski
Browse files

Move things from ContainerViewModel to OverlayViewModel

QuickSettingsContainerViewModel should only contain things that are
shared among different scenes that use QuickSettings (including
QSFragmentCompose). Elements and values that are exclusive to
QuickSettingsShadeOverlay should go in the respective view model.

Also QuickSettingsContainer makes no assumption about scene container.

Test: atest com.android.systemui.qs.ui.viewmodel
Test: manual, dual shade
Flag: com.android.systemui.scene_container
Bug: 420960164
Change-Id: I92dab12d53fc270fc77ab15f6730146a28e4c651
parent c488e438
Loading
Loading
Loading
Loading
+55 −32
Original line number Diff line number Diff line
@@ -66,7 +66,8 @@ import com.android.systemui.compose.modifiers.sysuiResTag
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.lifecycle.rememberViewModel
import com.android.systemui.media.controls.ui.composable.MediaCarousel
import com.android.systemui.media.controls.ui.view.MediaHostState.Companion.COLLAPSED
import com.android.systemui.media.controls.ui.controller.MediaCarouselController
import com.android.systemui.media.controls.ui.view.MediaHost
import com.android.systemui.notifications.ui.composable.SnoozeableHeadsUpNotificationSpace
import com.android.systemui.qs.composefragment.ui.GridAnchor
import com.android.systemui.qs.flags.QsDetailedView
@@ -74,6 +75,8 @@ import com.android.systemui.qs.panels.ui.compose.EditMode
import com.android.systemui.qs.panels.ui.compose.TileDetails
import com.android.systemui.qs.panels.ui.compose.TileGrid
import com.android.systemui.qs.panels.ui.compose.toolbar.Toolbar
import com.android.systemui.qs.panels.ui.viewmodel.toolbar.ToolbarViewModel
import com.android.systemui.qs.tiles.dialog.AudioDetailsViewModel
import com.android.systemui.qs.ui.composable.QuickSettingsShade.systemGestureExclusionInShade
import com.android.systemui.qs.ui.viewmodel.QuickSettingsContainerViewModel
import com.android.systemui.qs.ui.viewmodel.QuickSettingsShadeOverlayActionsViewModel
@@ -90,6 +93,7 @@ import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrim
import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimShape
import com.android.systemui.statusbar.notification.stack.ui.view.NotificationScrollView
import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationsPlaceholderViewModel
import com.android.systemui.volume.panel.component.volume.slider.ui.viewmodel.AudioStreamSliderViewModel
import com.android.systemui.volume.panel.component.volume.ui.composable.VolumeSlider
import dagger.Lazy
import javax.inject.Inject
@@ -125,16 +129,12 @@ constructor(
    override fun ContentScope.Content(modifier: Modifier) {
        val coroutineScope = rememberCoroutineScope()
        val contentViewModel =
            rememberViewModel("QuickSettingsShadeOverlayContent") {
                contentViewModelFactory.create()
            rememberViewModel("QuickSettingsShadeOverlayContent", key = coroutineScope) {
                contentViewModelFactory.create(coroutineScope)
            }
        val quickSettingsContainerViewModel =
            rememberViewModel("QuickSettingsShadeOverlayContainer") {
                quickSettingsContainerViewModelFactory.create(
                    supportsBrightnessMirroring = true,
                    expansion = COLLAPSED,
                    volumeSliderCoroutineScope = coroutineScope,
                )
                quickSettingsContainerViewModelFactory.create(supportsBrightnessMirroring = true)
            }
        val hunPlaceholderViewModel =
            rememberViewModel("QuickSettingsShadeOverlayPlaceholder") {
@@ -153,7 +153,7 @@ constructor(
            OverlayShade(
                panelElement = QuickSettingsShade.Elements.Panel,
                alignmentOnWideScreens = Alignment.TopEnd,
                enableTransparency = quickSettingsContainerViewModel.isTransparencyEnabled,
                enableTransparency = contentViewModel.isTransparencyEnabled,
                onScrimClicked = contentViewModel::onScrimClicked,
                onBackgroundPlaced = { bounds, topCornerRadius, bottomCornerRadius ->
                    contentViewModel.onPanelShapeInWindowChanged(
@@ -176,7 +176,10 @@ constructor(
                    }
                },
            ) {
                QuickSettingsContainer(viewModel = quickSettingsContainerViewModel)
                QuickSettingsContainer(
                    contentViewModel = contentViewModel,
                    containerViewModel = quickSettingsContainerViewModel,
                )
            }
            SnoozeableHeadsUpNotificationSpace(
                stackScrollView = notificationStackScrollView.get(),
@@ -196,13 +199,15 @@ private sealed interface ShadeBodyState {
}

@Composable
fun ContentScope.QuickSettingsContainer(
    viewModel: QuickSettingsContainerViewModel,
private fun ContentScope.QuickSettingsContainer(
    contentViewModel: QuickSettingsShadeOverlayContentViewModel,
    containerViewModel: QuickSettingsContainerViewModel,
    modifier: Modifier = Modifier,
) {
    val isEditing by viewModel.editModeViewModel.isEditing.collectAsStateWithLifecycle()
    val isEditing by containerViewModel.editModeViewModel.isEditing.collectAsStateWithLifecycle()
    val tileDetails =
        if (QsDetailedView.isEnabled) viewModel.detailsViewModel.activeTileDetails else null
        if (QsDetailedView.isEnabled) containerViewModel.detailsViewModel.activeTileDetails
        else null

    AnimatedContent(
        modifier = Modifier.sysuiResTag("quick_settings_container"),
@@ -217,19 +222,26 @@ fun ContentScope.QuickSettingsContainer(
        when (state) {
            ShadeBodyState.Editing -> {
                EditMode(
                    viewModel = viewModel.editModeViewModel,
                    viewModel = containerViewModel.editModeViewModel,
                    modifier =
                        modifier.fillMaxWidth().padding(QuickSettingsShade.Dimensions.Padding),
                )
            }

            ShadeBodyState.TileDetails -> {
                TileDetails(modifier = modifier, viewModel.detailsViewModel)
                TileDetails(modifier = modifier, containerViewModel.detailsViewModel)
            }

            ShadeBodyState.Default -> {
                QuickSettingsLayout(
                    viewModel = viewModel,
                    qsContainerViewModel = containerViewModel,
                    toolbarViewModelFactory = contentViewModel.toolbarViewModelFactory,
                    showMedia = contentViewModel.showMedia,
                    mediaHost = contentViewModel.mediaHost,
                    mediaCarouselController = contentViewModel.mediaCarouselController,
                    isTransparencyEnabled = contentViewModel.isTransparencyEnabled,
                    volumeSliderViewModel = contentViewModel.volumeSliderViewModel,
                    audioDetailsViewModelFactory = contentViewModel.audioDetailsViewModelFactory,
                    modifier = modifier.sysuiResTag("quick_settings_panel"),
                )
            }
@@ -239,8 +251,15 @@ fun ContentScope.QuickSettingsContainer(

/** Column containing Brightness and QS tiles. */
@Composable
fun ContentScope.QuickSettingsLayout(
    viewModel: QuickSettingsContainerViewModel,
private fun ContentScope.QuickSettingsLayout(
    qsContainerViewModel: QuickSettingsContainerViewModel,
    toolbarViewModelFactory: ToolbarViewModel.Factory,
    showMedia: Boolean,
    mediaHost: MediaHost,
    mediaCarouselController: MediaCarouselController,
    isTransparencyEnabled: Boolean,
    volumeSliderViewModel: AudioStreamSliderViewModel?,
    audioDetailsViewModelFactory: AudioDetailsViewModel.Factory,
    modifier: Modifier = Modifier,
) {
    Column(
@@ -254,17 +273,20 @@ fun ContentScope.QuickSettingsLayout(
        if (isFullWidthShade()) {
            VerticalSeparator()
            QuickSettingsOverlayHeader(
                viewModel = viewModel.shadeHeaderViewModel,
                viewModel = qsContainerViewModel.shadeHeaderViewModel,
                modifier = Modifier.element(QuickSettingsShade.Elements.Header),
            )

            VerticalSeparator()
        }

        val toolbarViewModel =
            rememberViewModel("QuickSettingsLayout") { toolbarViewModelFactory.create() }

        Toolbar(
            modifier =
                Modifier.fillMaxWidth().requiredHeight(QuickSettingsShade.Dimensions.ToolbarHeight),
            viewModel = viewModel.toolbarViewModel,
            viewModel = toolbarViewModel,
        )

        // TODO(b/428805936): Double check this padding.
@@ -272,14 +294,14 @@ fun ContentScope.QuickSettingsLayout(

        Column(modifier = Modifier.fillMaxWidth().verticalScroll(rememberScrollState())) {
            MediaCarousel(
                isVisible = viewModel.showMedia,
                mediaHost = viewModel.mediaHost,
                carouselController = viewModel.mediaCarouselController,
                isVisible = showMedia,
                mediaHost = mediaHost,
                carouselController = mediaCarouselController,
                usingCollapsedLandscapeMedia = true,
                modifier = Modifier.padding(horizontal = QuickSettingsShade.Dimensions.Padding),
            )

            if (viewModel.showMedia) {
            if (showMedia) {
                VerticalSeparator()
            }

@@ -289,12 +311,11 @@ fun ContentScope.QuickSettingsLayout(
                )
            ) {
                BrightnessSliderContainer(
                    viewModel = viewModel.brightnessSliderViewModel,
                    viewModel = qsContainerViewModel.brightnessSliderViewModel,
                    containerColors =
                        ContainerColors(
                            idleColor = Color.Transparent,
                            mirrorColor =
                                OverlayShade.Colors.panelBackground(viewModel.isTransparencyEnabled),
                            mirrorColor = OverlayShade.Colors.panelBackground(isTransparencyEnabled),
                        ),
                    modifier = Modifier.fillMaxWidth(),
                )
@@ -302,7 +323,6 @@ fun ContentScope.QuickSettingsLayout(

            VerticalSeparator()

            val volumeSliderViewModel = viewModel.volumeSliderViewModel
            if (volumeSliderViewModel != null) {
                val volumeSliderState by volumeSliderViewModel.slider.collectAsStateWithLifecycle()

@@ -337,8 +357,8 @@ fun ContentScope.QuickSettingsLayout(
                                    contentColor = MaterialTheme.colorScheme.onPrimary,
                                ),
                            onClick = {
                                viewModel.detailsViewModel.onVolumeSettingsButtonClicked(
                                    viewModel.audioDetailsViewModelFactory.create()
                                qsContainerViewModel.detailsViewModel.onVolumeSettingsButtonClicked(
                                    audioDetailsViewModelFactory.create()
                                )
                            },
                        ) {
@@ -359,7 +379,10 @@ fun ContentScope.QuickSettingsLayout(
            // TODO(b/428805936): Double check this padding.
            VerticalSeparator(QuickSettingsShade.Dimensions.Padding)

            TileGrid(viewModel = viewModel.tileGridViewModel, modifier = Modifier.fillMaxWidth())
            TileGrid(
                viewModel = qsContainerViewModel.tileGridViewModel,
                modifier = Modifier.fillMaxWidth(),
            )

            // TODO(b/428805936): Double check this padding.
            VerticalSeparator(QuickSettingsShade.Dimensions.Padding * 2)
+0 −63
Original line number Diff line number Diff line
@@ -16,27 +16,19 @@

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
import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.lifecycle.activateIn
import com.android.systemui.media.controls.shared.model.MediaData
import com.android.systemui.media.remedia.data.repository.mediaPipelineRepository
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
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.test.runTest
import org.junit.Before
@@ -46,7 +38,6 @@ import org.junit.runner.RunWith
@SmallTest
@RunWith(AndroidJUnit4::class)
@TestableLooper.RunWithLooper
@EnableSceneContainer
class QuickSettingsContainerViewModelTest : SysuiTestCase() {

    private val kosmos =
@@ -61,63 +52,9 @@ class QuickSettingsContainerViewModelTest : SysuiTestCase() {

    @Before
    fun setUp() {
        kosmos.sceneContainerStartable.start()
        kosmos.enableDualShade()
        underTest.activateIn(testScope)
    }

    @Test
    fun showMedia_activeMedia_true() =
        testScope.runTest {
            kosmos.mediaPipelineRepository.addCurrentUserMediaEntry(MediaData(active = true))

            assertThat(underTest.showMedia).isTrue()
        }

    @Test
    fun showMedia_InactiveMedia_true() =
        testScope.runTest {
            kosmos.mediaPipelineRepository.addCurrentUserMediaEntry(MediaData(active = false))

            assertThat(underTest.showMedia).isTrue()
        }

    @Test
    fun showMedia_noMedia_false() =
        testScope.runTest {
            kosmos.mediaPipelineRepository.addCurrentUserMediaEntry(MediaData(active = true))
            kosmos.mediaPipelineRepository.clearCurrentUserMedia()

            assertThat(underTest.showMedia).isFalse()
        }

    @Test
    @DisableFlags(FLAG_NOTIFICATION_SHADE_BLUR)
    fun transparencyEnabled_shadeBlurFlagOff_isDisabled() =
        testScope.runTest {
            kosmos.fakeWindowRootViewBlurRepository.isBlurSupported.value = true

            assertThat(underTest.isTransparencyEnabled).isFalse()
        }

    @Test
    @EnableFlags(FLAG_NOTIFICATION_SHADE_BLUR)
    fun transparencyEnabled_shadeBlurFlagOn_blurSupported_isEnabled() =
        testScope.runTest {
            kosmos.fakeWindowRootViewBlurRepository.isBlurSupported.value = true

            assertThat(underTest.isTransparencyEnabled).isTrue()
        }

    @Test
    @EnableFlags(FLAG_NOTIFICATION_SHADE_BLUR)
    fun transparencyEnabled_shadeBlurFlagOn_blurUnsupported_isDisabled() =
        testScope.runTest {
            kosmos.fakeWindowRootViewBlurRepository.isBlurSupported.value = false

            assertThat(underTest.isTransparencyEnabled).isFalse()
        }

    @Test
    fun isBrightnessSliderVisible_defaultDisplay_isVisible() =
        with(kosmos) {
+58 −3
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
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.SysuiTestCase
import com.android.systemui.authentication.data.repository.FakeAuthenticationRepository
import com.android.systemui.authentication.domain.interactor.AuthenticationResult
@@ -34,6 +35,8 @@ import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.testScope
import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.lifecycle.activateIn
import com.android.systemui.media.controls.shared.model.MediaData
import com.android.systemui.media.remedia.data.repository.mediaPipelineRepository
import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAsleepForTest
import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest
import com.android.systemui.power.domain.interactor.powerInteractor
@@ -53,13 +56,12 @@ import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrim
import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimShape
import com.android.systemui.statusbar.policy.configurationController
import com.android.systemui.testKosmos
import com.android.systemui.window.data.repository.fakeWindowRootViewBlurRepository
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith

@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@RunWith(AndroidJUnit4::class)
@EnableSceneContainer
@@ -70,7 +72,8 @@ class QuickSettingsShadeOverlayContentViewModelTest : SysuiTestCase() {
            usingMediaInComposeFragment = false // This is not for the compose fragment
        }

    private val Kosmos.underTest by Kosmos.Fixture { quickSettingsShadeOverlayContentViewModel }
    private val Kosmos.underTest by
        Kosmos.Fixture { quickSettingsShadeOverlayContentViewModelFactory.create() }

    @Before
    fun setUp() =
@@ -210,6 +213,58 @@ class QuickSettingsShadeOverlayContentViewModelTest : SysuiTestCase() {
        configurationController.onConfigurationChanged(Configuration())
    }

    @Test
    fun showMedia_activeMedia_true() =
        kosmos.runTest {
            mediaPipelineRepository.addCurrentUserMediaEntry(MediaData(active = true))

            assertThat(underTest.showMedia).isTrue()
        }

    @Test
    fun showMedia_InactiveMedia_true() =
        kosmos.runTest {
            mediaPipelineRepository.addCurrentUserMediaEntry(MediaData(active = false))

            assertThat(underTest.showMedia).isTrue()
        }

    @Test
    fun showMedia_noMedia_false() =
        kosmos.runTest {
            mediaPipelineRepository.addCurrentUserMediaEntry(MediaData(active = true))
            mediaPipelineRepository.clearCurrentUserMedia()

            assertThat(underTest.showMedia).isFalse()
        }

    @Test
    @DisableFlags(FLAG_NOTIFICATION_SHADE_BLUR)
    fun transparencyEnabled_shadeBlurFlagOff_isDisabled() =
        kosmos.runTest {
            fakeWindowRootViewBlurRepository.isBlurSupported.value = true

            assertThat(underTest.isTransparencyEnabled).isFalse()
        }

    @Test
    @EnableFlags(FLAG_NOTIFICATION_SHADE_BLUR)
    fun transparencyEnabled_shadeBlurFlagOn_blurSupported_isEnabled() =
        kosmos.runTest {
            fakeWindowRootViewBlurRepository.isBlurSupported.value = true

            assertThat(underTest.isTransparencyEnabled).isTrue()
        }

    @Test
    @EnableFlags(FLAG_NOTIFICATION_SHADE_BLUR)
    fun transparencyEnabled_shadeBlurFlagOn_blurUnsupported_isDisabled() =
        kosmos.runTest {
            fakeWindowRootViewBlurRepository.isBlurSupported.value = false

            assertThat(underTest.isTransparencyEnabled).isFalse()
        }

    private fun Kosmos.lockDevice() {
        val currentScene by collectLastValue(sceneInteractor.currentScene)
        powerInteractor.setAsleepForTest()
+1 −77
Original line number Diff line number Diff line
@@ -16,41 +16,23 @@

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
import com.android.systemui.brightness.ui.viewmodel.BrightnessSliderViewModel
import com.android.systemui.lifecycle.ExclusiveActivatable
import com.android.systemui.lifecycle.Hydrator
import com.android.systemui.media.controls.domain.pipeline.interactor.MediaCarouselInteractor
import com.android.systemui.media.controls.ui.controller.MediaCarouselController
import com.android.systemui.media.controls.ui.view.MediaHost
import com.android.systemui.media.dagger.MediaModule
import com.android.systemui.media.remedia.ui.compose.MediaUiBehavior
import com.android.systemui.media.remedia.ui.viewmodel.MediaCarouselVisibility
import com.android.systemui.qs.flags.QsDetailedView
import com.android.systemui.qs.panels.ui.viewmodel.DetailsViewModel
import com.android.systemui.qs.panels.ui.viewmodel.EditModeViewModel
import com.android.systemui.qs.panels.ui.viewmodel.TileGridViewModel
import com.android.systemui.qs.panels.ui.viewmodel.toolbar.ToolbarViewModel
import com.android.systemui.qs.tiles.dialog.AudioDetailsViewModel
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
import javax.inject.Named
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.awaitCancellation
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.flowOf
@@ -60,45 +42,17 @@ import kotlinx.coroutines.launch
class QuickSettingsContainerViewModel
@AssistedInject
constructor(
    @ShadeDisplayAware shadeContext: Context,
    brightnessSliderViewModelFactory: BrightnessSliderViewModel.Factory,
    audioStreamSliderViewModelFactory: AudioStreamSliderViewModel.Factory,
    val audioDetailsViewModelFactory: AudioDetailsViewModel.Factory,
    shadeHeaderViewModelFactory: ShadeHeaderViewModel.Factory,
    tileGridViewModelFactory: TileGridViewModel.Factory,
    @Assisted private val supportsBrightnessMirroring: Boolean,
    @Assisted private val expansion: Float?,
    @Assisted private val volumeSliderCoroutineScope: CoroutineScope?,
    val editModeViewModel: EditModeViewModel,
    val detailsViewModel: DetailsViewModel,
    toolbarViewModelFactory: ToolbarViewModel.Factory,
    windowRootViewBlurInteractor: WindowRootViewBlurInteractor,
    mediaCarouselInteractor: MediaCarouselInteractor,
    val mediaCarouselController: MediaCarouselController,
    @Named(MediaModule.QS_PANEL) val mediaHost: MediaHost,
    shadeDisplaysInteractor: Lazy<ShadeDisplaysInteractor>,
) : ExclusiveActivatable() {

    private val hydrator = Hydrator("QuickSettingsContainerViewModel.hydrator")

    /**
     * Whether the shade container transparency effect should be enabled (`true`), or whether to
     * render a fully-opaque shade container (`false`).
     */
    val isTransparencyEnabled: Boolean by
        hydrator.hydratedStateOf(
            traceName = "transparencyEnabled",
            initialValue =
                Flags.notificationShadeBlur() &&
                    windowRootViewBlurInteractor.isBlurCurrentlySupported.value,
            source =
                if (Flags.notificationShadeBlur()) {
                    windowRootViewBlurInteractor.isBlurCurrentlySupported
                } else {
                    flowOf(false)
                },
        )

    val isBrightnessSliderVisible by
        hydrator.hydratedStateOf(
            traceName = "isBrightnessSliderVisible",
@@ -116,40 +70,14 @@ constructor(
    val brightnessSliderViewModel =
        brightnessSliderViewModelFactory.create(supportsBrightnessMirroring)

    private val showVolumeSlider =
        QsDetailedView.isEnabled &&
            shadeContext.resources.getBoolean(R.bool.config_enableDesktopAudioTileDetailsView)

    val volumeSliderViewModel =
        if (showVolumeSlider && volumeSliderCoroutineScope != null)
            audioStreamSliderViewModelFactory.create(
                AudioStreamSliderViewModel.FactoryAudioStreamWrapper(
                    SliderType.Stream(AudioStream(AudioManager.STREAM_MUSIC)).stream
                ),
                volumeSliderCoroutineScope,
            )
        else {
            null
        }

    val toolbarViewModel = toolbarViewModelFactory.create()

    val shadeHeaderViewModel = shadeHeaderViewModelFactory.create()

    val tileGridViewModel = tileGridViewModelFactory.create()

    val showMedia: Boolean by
        hydrator.hydratedStateOf(
            traceName = "showMedia",
            source = mediaCarouselInteractor.hasAnyMedia,
        )

    override suspend fun onActivated(): Nothing {
        coroutineScope {
            expansion?.let { mediaHost.expansion = it }
            launch { hydrator.activate() }
            launch { brightnessSliderViewModel.activate() }
            launch { toolbarViewModel.activate() }
            launch { shadeHeaderViewModel.activate() }
            launch { tileGridViewModel.activate() }
            awaitCancellation()
@@ -176,10 +104,6 @@ constructor(

    @AssistedFactory
    interface Factory {
        fun create(
            supportsBrightnessMirroring: Boolean,
            expansion: Float? = null,
            volumeSliderCoroutineScope: CoroutineScope? = null,
        ): QuickSettingsContainerViewModel
        fun create(supportsBrightnessMirroring: Boolean): QuickSettingsContainerViewModel
    }
}
+75 −3

File changed.

Preview size limit exceeded, changes collapsed.

Loading