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

Commit 531181c8 authored by Fabián Kozynski's avatar Fabián Kozynski
Browse files

[Flexiglass] Add new QS to split shade

Test: manual, split shade, brightness, edit mode
Test: atest ShadeUserActionsViewModelTest
Bug: 420960164
Flag: com.android.systemui.scene_container

Change-Id: Ibe044e2bc237e7cb074914f2b1e94469f4b43894
parent 18c4b17d
Loading
Loading
Loading
Loading
+131 −0
Original line number Diff line number Diff line
@@ -20,12 +20,82 @@ import androidx.compose.foundation.layout.Arrangement.spacedBy
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.dimensionResource
import androidx.lifecycle.compose.LifecycleStartEffect
import com.android.compose.animation.scene.ContentScope
import com.android.systemui.brightness.ui.compose.BrightnessSliderContainer
import com.android.systemui.brightness.ui.compose.ContainerColors
import com.android.systemui.compose.modifiers.sysuiResTag
import com.android.systemui.media.remedia.ui.compose.Media
import com.android.systemui.media.remedia.ui.compose.MediaPresentationStyle
import com.android.systemui.qs.composefragment.ui.GridAnchor
import com.android.systemui.qs.panels.ui.compose.TileGrid
import com.android.systemui.qs.shared.ui.ElementKeys
import com.android.systemui.qs.ui.viewmodel.QuickSettingsContainerViewModel
import com.android.systemui.res.R

@Composable
fun QuickSettingsPanelLayout(
fun ContentScope.QuickSettingsContent(
    viewModel: QuickSettingsContainerViewModel,
    mediaInRow: Boolean,
) {
    QuickSettingsPanelLayout(
        brightness =
            @Composable {
                BrightnessSliderContainer(
                    viewModel.brightnessSliderViewModel,
                    containerColors =
                        ContainerColors(Color.Transparent, ContainerColors.defaultContainerColor),
                    modifier =
                        Modifier.padding(
                            vertical = dimensionResource(id = R.dimen.qs_brightness_margin_top)
                        ),
                )
            },
        tiles =
            @Composable {
                var listening by remember { mutableStateOf(false) }
                LifecycleStartEffect(Unit) {
                    listening = true

                    onStopOrDispose { listening = false }
                }

                Box {
                    GridAnchor()
                    TileGrid(viewModel.tileGridViewModel, listening = { listening })
                }
            },
        media =
            @Composable {
                Element(key = Media.Elements.mediaCarousel, modifier = Modifier) {
                    Media(
                        viewModelFactory = viewModel.mediaViewModelFactory,
                        presentationStyle = MediaPresentationStyle.Default,
                        behavior = QuickSettingsContainerViewModel.mediaUiBehavior,
                        onDismissed = viewModel::onMediaSwipeToDismiss,
                    )
                }
            },
        mediaInRow = mediaInRow,
        modifier =
            Modifier.element(ElementKeys.QuickSettingsContent)
                .padding(horizontal = dimensionResource(id = R.dimen.qs_horizontal_margin))
                .sysuiResTag("quick_settings_panel"),
    )
}

@Composable
private fun QuickSettingsPanelLayout(
    brightness: @Composable () -> Unit,
    tiles: @Composable () -> Unit,
    media: @Composable () -> Unit,
+1 −70
Original line number Diff line number Diff line
@@ -40,14 +40,11 @@ import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.runtime.snapshotFlow
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.CompositingStrategy
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.platform.LocalConfiguration
@@ -56,7 +53,6 @@ import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.LifecycleStartEffect
import androidx.lifecycle.compose.LocalLifecycleOwner
import com.android.compose.animation.scene.ContentScope
import com.android.compose.animation.scene.SceneKey
@@ -71,26 +67,19 @@ import com.android.compose.lifecycle.LaunchedEffectWithLifecycle
import com.android.compose.modifiers.thenIf
import com.android.compose.windowsizeclass.LocalWindowSizeClass
import com.android.internal.jank.InteractionJankMonitor
import com.android.systemui.brightness.ui.compose.BrightnessSliderContainer
import com.android.systemui.brightness.ui.compose.ContainerColors
import com.android.systemui.common.ui.compose.windowinsets.CutoutLocation
import com.android.systemui.common.ui.compose.windowinsets.LocalDisplayCutout
import com.android.systemui.compose.modifiers.sysuiResTag
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.lifecycle.ExclusiveActivatable
import com.android.systemui.lifecycle.rememberViewModel
import com.android.systemui.media.remedia.ui.compose.Media
import com.android.systemui.media.remedia.ui.compose.MediaPresentationStyle
import com.android.systemui.notifications.ui.composable.HeadsUpNotificationSpace
import com.android.systemui.notifications.ui.composable.NotificationScrollingStack
import com.android.systemui.qs.composefragment.ui.GridAnchor
import com.android.systemui.qs.footer.ui.compose.FooterActionsWithAnimatedVisibility
import com.android.systemui.qs.panels.ui.compose.EditMode
import com.android.systemui.qs.panels.ui.compose.TileGrid
import com.android.systemui.qs.shared.ui.ElementKeys
import com.android.systemui.qs.ui.composable.QuickSettingsScene.Companion.InternalScenes.Edit
import com.android.systemui.qs.ui.composable.QuickSettingsScene.Companion.InternalScenes.QS
import com.android.systemui.qs.ui.viewmodel.QuickSettingsContainerViewModel
import com.android.systemui.qs.ui.viewmodel.QuickSettingsSceneContentViewModel
import com.android.systemui.qs.ui.viewmodel.QuickSettingsUserActionsViewModel
import com.android.systemui.res.R
@@ -356,65 +345,7 @@ private fun ContentScope.QuickSettingsContent(
                            CollapsedShadeHeader(viewModel = headerViewModel, isSplitShade = false)
                    }
                    Spacer(modifier = Modifier.height(16.dp))

                    var listening by remember { mutableStateOf(false) }
                    LifecycleStartEffect(Unit) {
                        listening = true

                        onStopOrDispose { listening = false }
                    }

                    QuickSettingsPanelLayout(
                        brightness =
                            @Composable {
                                BrightnessSliderContainer(
                                    viewModel.qsContainerViewModel.brightnessSliderViewModel,
                                    containerColors =
                                        ContainerColors(
                                            Color.Transparent,
                                            ContainerColors.defaultContainerColor,
                                        ),
                                    modifier =
                                        Modifier.padding(
                                            vertical =
                                                dimensionResource(
                                                    id = R.dimen.qs_brightness_margin_top
                                                )
                                        ),
                                )
                            },
                        tiles =
                            @Composable {
                                Box {
                                    GridAnchor()
                                    TileGrid(
                                        viewModel.qsContainerViewModel.tileGridViewModel,
                                        listening = { listening },
                                    )
                                }
                            },
                        media =
                            @Composable {
                                Element(key = Media.Elements.mediaCarousel, modifier = Modifier) {
                                    Media(
                                        viewModelFactory =
                                            viewModel.qsContainerViewModel.mediaViewModelFactory,
                                        presentationStyle = MediaPresentationStyle.Default,
                                        behavior = QuickSettingsContainerViewModel.mediaUiBehavior,
                                        onDismissed =
                                            viewModel.qsContainerViewModel::onMediaSwipeToDismiss,
                                    )
                                }
                            },
                        mediaInRow = mediaInRow,
                        modifier =
                            Modifier.element(ElementKeys.QuickSettingsContent)
                                .padding(
                                    horizontal =
                                        dimensionResource(id = R.dimen.qs_horizontal_margin)
                                )
                                .sysuiResTag("quick_settings_panel"),
                    )
                    QuickSettingsContent(viewModel.qsContainerViewModel, mediaInRow)
                }
            }

+119 −193

File changed.

Preview size limit exceeded, changes collapsed.

+3 −3
Original line number Diff line number Diff line
@@ -42,7 +42,7 @@ 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.qs.ui.adapter.fakeQSSceneAdapter
import com.android.systemui.qs.panels.ui.viewmodel.editModeViewModel
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.scene.domain.resolver.homeSceneFamilyResolver
import com.android.systemui.scene.domain.startable.sceneContainerStartable
@@ -197,11 +197,11 @@ class ShadeUserActionsViewModelTest : SysuiTestCase() {
        }

    @Test
    fun upOrBackTransitionSceneKey_customizing_noTransition() =
    fun upOrBackTransitionSceneKey_editing_noTransition() =
        kosmos.runTest {
            val actions by collectLastValue(underTest.actions)

            fakeQSSceneAdapter.setCustomizing(true)
            editModeViewModel.startEditing()
            assertThat(
                    actions!!.keys.filterIsInstance<Swipe>().filter {
                        it.direction == SwipeDirection.Up
+2 −4
Original line number Diff line number Diff line
@@ -35,12 +35,11 @@ import com.android.systemui.qs.footer.ui.viewmodel.FooterActionsViewModel
import com.android.systemui.qs.panels.domain.interactor.TileSquishinessInteractor
import com.android.systemui.qs.panels.ui.viewmodel.MediaInRowInLandscapeViewModel
import com.android.systemui.qs.panels.ui.viewmodel.QuickQuickSettingsViewModel
import com.android.systemui.qs.ui.adapter.QSSceneAdapter
import com.android.systemui.qs.ui.viewmodel.QuickSettingsContainerViewModel
import com.android.systemui.scene.domain.interactor.SceneInteractor
import com.android.systemui.scene.shared.model.Overlays
import com.android.systemui.scene.shared.model.SceneFamilies
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.settings.brightness.ui.viewModel.BrightnessMirrorViewModel
import com.android.systemui.shade.domain.interactor.ShadeModeInteractor
import com.android.systemui.shade.shared.model.ShadeMode
import com.android.systemui.statusbar.disableflags.domain.interactor.DisableFlagsInteractor
@@ -67,10 +66,9 @@ class ShadeSceneContentViewModel
@AssistedInject
constructor(
    @Main private val mainDispatcher: CoroutineDispatcher,
    val qsSceneAdapter: QSSceneAdapter,
    val qsContainerViewModelFactory: QuickSettingsContainerViewModel.Factory,
    val quickQuickSettingsViewModel: QuickQuickSettingsViewModel.Factory,
    val shadeHeaderViewModelFactory: ShadeHeaderViewModel.Factory,
    val brightnessMirrorViewModelFactory: BrightnessMirrorViewModel.Factory,
    val mediaCarouselInteractor: MediaCarouselInteractor,
    private val shadeModeInteractor: ShadeModeInteractor,
    val mediaViewModelFactory: MediaViewModel.Factory,
Loading