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

Commit 4fe70687 authored by Danny Burakov's avatar Danny Burakov Committed by Android (Google) Code Review
Browse files

Merge "[Dual Shade] Add UMO (media controls) to the quick settings shade." into main

parents f36bafc1 7b1da105
Loading
Loading
Loading
Loading
+16 −2
Original line number Diff line number Diff line
@@ -50,6 +50,8 @@ import com.android.systemui.brightness.ui.compose.BrightnessSliderContainer
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.notifications.ui.composable.SnoozeableHeadsUpNotificationSpace
import com.android.systemui.qs.composefragment.ui.GridAnchor
import com.android.systemui.qs.flags.QsDetailedView
@@ -104,7 +106,10 @@ constructor(
            }
        val quickSettingsContainerViewModel =
            rememberViewModel("QuickSettingsShadeOverlayContainer") {
                quickSettingsContainerViewModelFactory.create(supportsBrightnessMirroring = true)
                quickSettingsContainerViewModelFactory.create(
                    supportsBrightnessMirroring = true,
                    expansion = COLLAPSED,
                )
            }
        val hunPlaceholderViewModel =
            rememberViewModel("QuickSettingsShadeOverlayPlaceholder") {
@@ -232,12 +237,20 @@ fun ContentScope.QuickSettingsLayout(
        Toolbar(
            modifier =
                Modifier.fillMaxWidth().requiredHeight(QuickSettingsShade.Dimensions.ToolbarHeight),
            toolbarViewModelFactory = viewModel.toolbarViewModelFactory,
            viewModel = viewModel.toolbarViewModel,
        )
        Column(
            verticalArrangement = Arrangement.spacedBy(QuickSettingsShade.Dimensions.Padding),
            modifier = Modifier.fillMaxWidth().verticalScroll(rememberScrollState()),
        ) {
            MediaCarousel(
                isVisible = viewModel.showMedia,
                mediaHost = viewModel.mediaHost,
                carouselController = viewModel.mediaCarouselController,
                usingCollapsedLandscapeMedia = true,
                modifier = Modifier.padding(horizontal = QuickSettingsShade.Dimensions.Padding),
            )

            BrightnessSliderContainer(
                viewModel = viewModel.brightnessSliderViewModel,
                containerColor = OverlayShade.Colors.PanelBackground,
@@ -245,6 +258,7 @@ fun ContentScope.QuickSettingsLayout(
                    Modifier.fillMaxWidth()
                        .height(QuickSettingsShade.Dimensions.BrightnessSliderHeight),
            )

            Box {
                GridAnchor()
                TileGrid(
+23 −0
Original line number Diff line number Diff line
@@ -24,17 +24,22 @@ import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.flags.EnableSceneContainer
import com.android.systemui.kosmos.testScope
import com.android.systemui.lifecycle.activateIn
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.domain.interactor.enableDualShade
import com.android.systemui.shade.domain.interactor.shadeModeInteractor
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith

@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@RunWith(AndroidJUnit4::class)
@TestableLooper.RunWithLooper
@@ -79,4 +84,22 @@ class QuickSettingsContainerViewModelTest : SysuiTestCase() {

            assertThat(underTest.showHeader).isFalse()
        }

    @Test
    fun showMedia_activeMedia_true() =
        testScope.runTest {
            kosmos.mediaFilterRepository.addSelectedUserMediaEntry(MediaData(active = true))
            runCurrent()

            assertThat(underTest.showMedia).isTrue()
        }

    @Test
    fun showMedia_noActiveMedia_false() =
        testScope.runTest {
            kosmos.mediaFilterRepository.addSelectedUserMediaEntry(MediaData(active = false))
            runCurrent()

            assertThat(underTest.showMedia).isFalse()
        }
}
+6 −8
Original line number Diff line number Diff line
@@ -35,7 +35,6 @@ import com.android.systemui.animation.ShadeInterpolation
import com.android.systemui.classifier.Classifier
import com.android.systemui.classifier.domain.interactor.FalsingInteractor
import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
import com.android.systemui.keyguard.shared.model.Edge
@@ -43,7 +42,6 @@ import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.lifecycle.ExclusiveActivatable
import com.android.systemui.lifecycle.Hydrator
import com.android.systemui.log.table.TableLogBuffer
import com.android.systemui.media.controls.ui.controller.MediaHierarchyManager
import com.android.systemui.media.controls.ui.controller.MediaHierarchyManager.Companion.LOCATION_QQS
import com.android.systemui.media.controls.ui.controller.MediaHierarchyManager.Companion.LOCATION_QS
import com.android.systemui.media.controls.ui.view.MediaHost
@@ -101,7 +99,7 @@ constructor(
    private val footerActionsController: FooterActionsController,
    private val sysuiStatusBarStateController: SysuiStatusBarStateController,
    deviceEntryInteractor: DeviceEntryInteractor,
    DisableFlagsInteractor: DisableFlagsInteractor,
    disableFlagsInteractor: DisableFlagsInteractor,
    keyguardTransitionInteractor: KeyguardTransitionInteractor,
    private val largeScreenShadeInterpolator: LargeScreenShadeInterpolator,
    shadeInteractor: ShadeInteractor,
@@ -119,7 +117,7 @@ constructor(
    @Assisted private val lifecycleScope: LifecycleCoroutineScope,
) : Dumpable, ExclusiveActivatable() {

    val containerViewModel = containerViewModelFactory.create(true)
    val containerViewModel = containerViewModelFactory.create(supportsBrightnessMirroring = true)
    val quickQuickSettingsViewModel = quickQuickSettingsViewModelFactory.create()

    private val qqsMediaInRowViewModel = mediaInRowInLandscapeViewModelFactory.create(LOCATION_QQS)
@@ -199,8 +197,8 @@ constructor(
    val isQsEnabled by
        hydrator.hydratedStateOf(
            traceName = "isQsEnabled",
            initialValue = DisableFlagsInteractor.disableFlags.value.isQuickSettingsEnabled(),
            source = DisableFlagsInteractor.disableFlags.map { it.isQuickSettingsEnabled() },
            initialValue = disableFlagsInteractor.disableFlags.value.isQuickSettingsEnabled(),
            source = disableFlagsInteractor.disableFlags.map { it.isQuickSettingsEnabled() },
        )

    var isInSplitShade by mutableStateOf(false)
@@ -490,12 +488,12 @@ constructor(
        qqsMediaHost.apply {
            expansion = qqsMediaExpansion
            showsOnlyActiveMedia = true
            init(MediaHierarchyManager.LOCATION_QQS)
            init(LOCATION_QQS)
        }
        qsMediaHost.apply {
            expansion = MediaHostState.EXPANDED
            showsOnlyActiveMedia = false
            init(MediaHierarchyManager.LOCATION_QS)
            init(LOCATION_QS)
        }
    }

+7 −2
Original line number Diff line number Diff line
@@ -144,12 +144,17 @@ private fun FooterBar(
    pagerState: PagerState,
    editButtonViewModelFactory: EditModeButtonViewModel.Factory,
) {
    val editButtonViewModel =
        rememberViewModel(traceName = "PaginatedGridLayout-editButtonViewModel") {
            editButtonViewModelFactory.create()
        }

    // Use requiredHeight so it won't be squished if the view doesn't quite fit. As this is
    // expected to be inside a scrollable container, this should not be an issue.
    // Also, we construct the layout this way to do the following:
    // * PagerDots is centered in the row, taking as much space as it needs.
    // * On the start side, we place the BuildNumber, taking as much space as it needs, but
    //   constrained by the available space left over after PagerDots
    //   constrained by the available space left over after PagerDots.
    // * On the end side, we place the edit mode button, with the same constraints as for
    //   BuildNumber (but it will usually fit, as it's just a square button).
    Row(
@@ -178,7 +183,7 @@ private fun FooterBar(
        )
        Row(Modifier.weight(1f)) {
            Spacer(modifier = Modifier.weight(1f))
            EditModeButton(viewModelFactory = editButtonViewModelFactory)
            EditModeButton(viewModel = editButtonViewModel)
        }
    }
}
+1 −6
Original line number Diff line number Diff line
@@ -29,17 +29,12 @@ import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import com.android.systemui.lifecycle.rememberViewModel
import com.android.systemui.qs.panels.ui.viewmodel.toolbar.EditModeButtonViewModel
import com.android.systemui.qs.ui.compose.borderOnFocus
import com.android.systemui.res.R

@Composable
fun EditModeButton(
    viewModelFactory: EditModeButtonViewModel.Factory,
    modifier: Modifier = Modifier,
) {
    val viewModel = rememberViewModel(traceName = "EditModeButton") { viewModelFactory.create() }
fun EditModeButton(viewModel: EditModeButtonViewModel, modifier: Modifier = Modifier) {
    CompositionLocalProvider(
        value = LocalContentColor provides MaterialTheme.colorScheme.onSurface
    ) {
Loading