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

Commit 4a73dd78 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "[Dual Shade] Refactor ShadeHeader and ShadeOverlay UI code." into main

parents ef54ca59 12c575ed
Loading
Loading
Loading
Loading
+7 −19
Original line number Original line Diff line number Diff line
@@ -29,7 +29,6 @@ import com.android.compose.animation.scene.ContentScope
import com.android.compose.animation.scene.ElementKey
import com.android.compose.animation.scene.ElementKey
import com.android.compose.animation.scene.UserAction
import com.android.compose.animation.scene.UserAction
import com.android.compose.animation.scene.UserActionResult
import com.android.compose.animation.scene.UserActionResult
import com.android.systemui.battery.BatteryMeterViewController
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor
import com.android.systemui.keyguard.ui.composable.blueprint.rememberBurnIn
import com.android.systemui.keyguard.ui.composable.blueprint.rememberBurnIn
@@ -44,10 +43,7 @@ import com.android.systemui.scene.ui.composable.Overlay
import com.android.systemui.shade.ui.composable.OverlayShade
import com.android.systemui.shade.ui.composable.OverlayShade
import com.android.systemui.shade.ui.composable.OverlayShadeHeader
import com.android.systemui.shade.ui.composable.OverlayShadeHeader
import com.android.systemui.shade.ui.composable.SingleShadeMeasurePolicy
import com.android.systemui.shade.ui.composable.SingleShadeMeasurePolicy
import com.android.systemui.statusbar.notification.icon.ui.viewbinder.NotificationIconContainerStatusBarViewBinder
import com.android.systemui.statusbar.notification.stack.ui.view.NotificationScrollView
import com.android.systemui.statusbar.notification.stack.ui.view.NotificationScrollView
import com.android.systemui.statusbar.phone.ui.StatusBarIconController
import com.android.systemui.statusbar.phone.ui.TintedIconManager
import dagger.Lazy
import dagger.Lazy
import javax.inject.Inject
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.Flow
@@ -58,11 +54,6 @@ class NotificationsShadeOverlay
constructor(
constructor(
    private val actionsViewModelFactory: NotificationsShadeOverlayActionsViewModel.Factory,
    private val actionsViewModelFactory: NotificationsShadeOverlayActionsViewModel.Factory,
    private val contentViewModelFactory: NotificationsShadeOverlayContentViewModel.Factory,
    private val contentViewModelFactory: NotificationsShadeOverlayContentViewModel.Factory,
    private val tintedIconManagerFactory: TintedIconManager.Factory,
    private val batteryMeterViewControllerFactory: BatteryMeterViewController.Factory,
    private val statusBarIconController: StatusBarIconController,
    private val notificationIconContainerStatusBarViewBinder:
        NotificationIconContainerStatusBarViewBinder,
    private val shadeSession: SaveableSession,
    private val shadeSession: SaveableSession,
    private val stackScrollView: Lazy<NotificationScrollView>,
    private val stackScrollView: Lazy<NotificationScrollView>,
    private val clockSection: DefaultClockSection,
    private val clockSection: DefaultClockSection,
@@ -94,18 +85,16 @@ constructor(
            }
            }


        OverlayShade(
        OverlayShade(
            isShadeLayoutWide = viewModel.isShadeLayoutWide,
            panelAlignment = Alignment.TopStart,
            panelAlignment = Alignment.TopStart,
            modifier = modifier,
            modifier = modifier,
            onScrimClicked = viewModel::onScrimClicked,
            onScrimClicked = viewModel::onScrimClicked,
            header = {
            header = {
                val headerViewModel =
                    rememberViewModel("NotificationsShadeOverlayHeader") {
                        viewModel.shadeHeaderViewModelFactory.create()
                    }
                OverlayShadeHeader(
                OverlayShadeHeader(
                    viewModelFactory = viewModel.shadeHeaderViewModelFactory,
                    viewModel = headerViewModel,
                    createTintedIconManager = tintedIconManagerFactory::create,
                    createBatteryMeterViewController = batteryMeterViewControllerFactory::create,
                    statusBarIconController = statusBarIconController,
                    notificationIconContainerStatusBarViewBinder =
                        notificationIconContainerStatusBarViewBinder,
                    modifier =
                    modifier =
                        Modifier.element(NotificationsShade.Elements.StatusBar)
                        Modifier.element(NotificationsShade.Elements.StatusBar)
                            .layoutId(SingleShadeMeasurePolicy.LayoutId.ShadeHeader),
                            .layoutId(SingleShadeMeasurePolicy.LayoutId.ShadeHeader),
@@ -114,7 +103,7 @@ constructor(
        ) {
        ) {
            Box {
            Box {
                Column {
                Column {
                    if (viewModel.showHeader) {
                    if (viewModel.showClock) {
                        val burnIn = rememberBurnIn(clockInteractor)
                        val burnIn = rememberBurnIn(clockInteractor)


                        with(clockSection) {
                        with(clockSection) {
@@ -140,8 +129,7 @@ constructor(
                        modifier = Modifier.fillMaxWidth(),
                        modifier = Modifier.fillMaxWidth(),
                    )
                    )
                }
                }
                // Communicates the bottom position of the drawable area within the shade to
                // Communicates the bottom position of the drawable area within the shade to NSSL.
                // NSSL.
                NotificationStackCutoffGuideline(
                NotificationStackCutoffGuideline(
                    stackScrollView = stackScrollView.get(),
                    stackScrollView = stackScrollView.get(),
                    viewModel = placeholderViewModel,
                    viewModel = placeholderViewModel,
+26 −40
Original line number Original line Diff line number Diff line
@@ -16,7 +16,6 @@


package com.android.systemui.qs.ui.composable
package com.android.systemui.qs.ui.composable


import android.view.ViewGroup
import androidx.activity.compose.BackHandler
import androidx.activity.compose.BackHandler
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.core.animateDpAsState
import androidx.compose.animation.core.animateDpAsState
@@ -76,7 +75,6 @@ import com.android.compose.animation.scene.animateSceneFloatAsState
import com.android.compose.animation.scene.content.state.TransitionState
import com.android.compose.animation.scene.content.state.TransitionState
import com.android.compose.modifiers.thenIf
import com.android.compose.modifiers.thenIf
import com.android.compose.windowsizeclass.LocalWindowSizeClass
import com.android.compose.windowsizeclass.LocalWindowSizeClass
import com.android.systemui.battery.BatteryMeterViewController
import com.android.systemui.common.ui.compose.windowinsets.CutoutLocation
import com.android.systemui.common.ui.compose.windowinsets.CutoutLocation
import com.android.systemui.common.ui.compose.windowinsets.LocalDisplayCutout
import com.android.systemui.common.ui.compose.windowinsets.LocalDisplayCutout
import com.android.systemui.compose.modifiers.sysuiResTag
import com.android.systemui.compose.modifiers.sysuiResTag
@@ -100,15 +98,14 @@ import com.android.systemui.res.R
import com.android.systemui.scene.session.ui.composable.SaveableSession
import com.android.systemui.scene.session.ui.composable.SaveableSession
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.scene.ui.composable.Scene
import com.android.systemui.scene.ui.composable.Scene
import com.android.systemui.settings.brightness.ui.viewModel.BrightnessMirrorViewModel
import com.android.systemui.shade.ui.composable.CollapsedShadeHeader
import com.android.systemui.shade.ui.composable.CollapsedShadeHeader
import com.android.systemui.shade.ui.composable.ExpandedShadeHeader
import com.android.systemui.shade.ui.composable.ExpandedShadeHeader
import com.android.systemui.shade.ui.composable.Shade
import com.android.systemui.shade.ui.composable.Shade
import com.android.systemui.shade.ui.composable.ShadeHeader
import com.android.systemui.shade.ui.composable.ShadeHeader
import com.android.systemui.shade.ui.viewmodel.ShadeHeaderViewModel
import com.android.systemui.statusbar.notification.stack.ui.view.NotificationScrollView
import com.android.systemui.statusbar.notification.stack.ui.view.NotificationScrollView
import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationsPlaceholderViewModel
import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationsPlaceholderViewModel
import com.android.systemui.statusbar.phone.StatusBarLocation
import com.android.systemui.statusbar.phone.ui.StatusBarIconController
import com.android.systemui.statusbar.phone.ui.TintedIconManager
import dagger.Lazy
import dagger.Lazy
import javax.inject.Inject
import javax.inject.Inject
import javax.inject.Named
import javax.inject.Named
@@ -125,9 +122,6 @@ constructor(
    private val notificationsPlaceholderViewModelFactory: NotificationsPlaceholderViewModel.Factory,
    private val notificationsPlaceholderViewModelFactory: NotificationsPlaceholderViewModel.Factory,
    private val actionsViewModelFactory: QuickSettingsUserActionsViewModel.Factory,
    private val actionsViewModelFactory: QuickSettingsUserActionsViewModel.Factory,
    private val contentViewModelFactory: QuickSettingsSceneContentViewModel.Factory,
    private val contentViewModelFactory: QuickSettingsSceneContentViewModel.Factory,
    private val tintedIconManagerFactory: TintedIconManager.Factory,
    private val batteryMeterViewControllerFactory: BatteryMeterViewController.Factory,
    private val statusBarIconController: StatusBarIconController,
    private val mediaCarouselController: MediaCarouselController,
    private val mediaCarouselController: MediaCarouselController,
    @Named(MediaModule.QS_PANEL) private val mediaHost: MediaHost,
    @Named(MediaModule.QS_PANEL) private val mediaHost: MediaHost,
) : ExclusiveActivatable(), Scene {
) : ExclusiveActivatable(), Scene {
@@ -145,16 +139,26 @@ constructor(


    @Composable
    @Composable
    override fun ContentScope.Content(modifier: Modifier) {
    override fun ContentScope.Content(modifier: Modifier) {
        QuickSettingsScene(
        val viewModel =
            notificationStackScrollView = notificationStackScrollView.get(),
            rememberViewModel("QuickSettingsScene-viewModel") { contentViewModelFactory.create() }
            viewModelFactory = contentViewModelFactory,
        val headerViewModel =
            notificationsPlaceholderViewModel =
            rememberViewModel("QuickSettingsScene-headerViewModel") {
                viewModel.shadeHeaderViewModelFactory.create()
            }
        val brightnessMirrorViewModel =
            rememberViewModel("QuickSettingsScene-brightnessMirrorViewModel") {
                viewModel.brightnessMirrorViewModelFactory.create()
            }
        val notificationsPlaceholderViewModel =
            rememberViewModel("QuickSettingsScene-notifPlaceholderViewModel") {
            rememberViewModel("QuickSettingsScene-notifPlaceholderViewModel") {
                notificationsPlaceholderViewModelFactory.create()
                notificationsPlaceholderViewModelFactory.create()
                },
            }
            createTintedIconManager = tintedIconManagerFactory::create,
        QuickSettingsScene(
            createBatteryMeterViewController = batteryMeterViewControllerFactory::create,
            notificationStackScrollView = notificationStackScrollView.get(),
            statusBarIconController = statusBarIconController,
            viewModel = viewModel,
            headerViewModel = headerViewModel,
            brightnessMirrorViewModel = brightnessMirrorViewModel,
            notificationsPlaceholderViewModel = notificationsPlaceholderViewModel,
            mediaCarouselController = mediaCarouselController,
            mediaCarouselController = mediaCarouselController,
            mediaHost = mediaHost,
            mediaHost = mediaHost,
            modifier = modifier,
            modifier = modifier,
@@ -166,23 +170,16 @@ constructor(
@Composable
@Composable
private fun ContentScope.QuickSettingsScene(
private fun ContentScope.QuickSettingsScene(
    notificationStackScrollView: NotificationScrollView,
    notificationStackScrollView: NotificationScrollView,
    viewModelFactory: QuickSettingsSceneContentViewModel.Factory,
    viewModel: QuickSettingsSceneContentViewModel,
    headerViewModel: ShadeHeaderViewModel,
    brightnessMirrorViewModel: BrightnessMirrorViewModel,
    notificationsPlaceholderViewModel: NotificationsPlaceholderViewModel,
    notificationsPlaceholderViewModel: NotificationsPlaceholderViewModel,
    createTintedIconManager: (ViewGroup, StatusBarLocation) -> TintedIconManager,
    createBatteryMeterViewController: (ViewGroup, StatusBarLocation) -> BatteryMeterViewController,
    statusBarIconController: StatusBarIconController,
    mediaCarouselController: MediaCarouselController,
    mediaCarouselController: MediaCarouselController,
    mediaHost: MediaHost,
    mediaHost: MediaHost,
    modifier: Modifier = Modifier,
    modifier: Modifier = Modifier,
    shadeSession: SaveableSession,
    shadeSession: SaveableSession,
) {
) {
    val cutoutLocation = LocalDisplayCutout.current.location
    val cutoutLocation = LocalDisplayCutout.current.location

    val viewModel = rememberViewModel("QuickSettingsScene-viewModel") { viewModelFactory.create() }
    val brightnessMirrorViewModel =
        rememberViewModel("QuickSettingsScene-brightnessMirrorViewModel") {
            viewModel.brightnessMirrorViewModelFactory.create()
        }
    val brightnessMirrorShowing by brightnessMirrorViewModel.isShowing.collectAsStateWithLifecycle()
    val brightnessMirrorShowing by brightnessMirrorViewModel.isShowing.collectAsStateWithLifecycle()
    val contentAlpha by
    val contentAlpha by
        animateFloatAsState(
        animateFloatAsState(
@@ -222,8 +219,7 @@ private fun ContentScope.QuickSettingsScene(
                .graphicsLayer { alpha = contentAlpha }
                .graphicsLayer { alpha = contentAlpha }
                .thenIf(shouldPunchHoleBehindScrim) {
                .thenIf(shouldPunchHoleBehindScrim) {
                    // Render the scene to an offscreen buffer so that BlendMode.DstOut only clears
                    // Render the scene to an offscreen buffer so that BlendMode.DstOut only clears
                    // this
                    // this scene (and not the one under it) during a scene transition.
                    // scene (and not the one under it) during a scene transition.
                    Modifier.graphicsLayer(compositingStrategy = CompositingStrategy.Offscreen)
                    Modifier.graphicsLayer(compositingStrategy = CompositingStrategy.Offscreen)
                }
                }
                .thenIf(cutoutLocation != CutoutLocation.CENTER) { Modifier.displayCutoutPadding() }
                .thenIf(cutoutLocation != CutoutLocation.CENTER) { Modifier.displayCutoutPadding() }
@@ -348,21 +344,11 @@ private fun ContentScope.QuickSettingsScene(
                                        fadeOut(tween(customizingAnimationDuration)),
                                        fadeOut(tween(customizingAnimationDuration)),
                            ) {
                            ) {
                                ExpandedShadeHeader(
                                ExpandedShadeHeader(
                                    viewModelFactory = viewModel.shadeHeaderViewModelFactory,
                                    viewModel = headerViewModel,
                                    createTintedIconManager = createTintedIconManager,
                                    createBatteryMeterViewController =
                                        createBatteryMeterViewController,
                                    statusBarIconController = statusBarIconController,
                                    modifier = Modifier.padding(horizontal = 16.dp),
                                    modifier = Modifier.padding(horizontal = 16.dp),
                                )
                                )
                            }
                            }
                        else ->
                        else -> CollapsedShadeHeader(viewModel = headerViewModel)
                            CollapsedShadeHeader(
                                viewModelFactory = viewModel.shadeHeaderViewModelFactory,
                                createTintedIconManager = createTintedIconManager,
                                createBatteryMeterViewController = createBatteryMeterViewController,
                                statusBarIconController = statusBarIconController,
                            )
                    }
                    }
                    Spacer(modifier = Modifier.height(16.dp))
                    Spacer(modifier = Modifier.height(16.dp))
                    // This view has its own horizontal padding
                    // This view has its own horizontal padding
+19 −29
Original line number Original line Diff line number Diff line
@@ -45,7 +45,6 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.compose.animation.scene.ContentScope
import com.android.compose.animation.scene.ContentScope
import com.android.compose.animation.scene.UserAction
import com.android.compose.animation.scene.UserAction
import com.android.compose.animation.scene.UserActionResult
import com.android.compose.animation.scene.UserActionResult
import com.android.systemui.battery.BatteryMeterViewController
import com.android.systemui.brightness.ui.compose.BrightnessSliderContainer
import com.android.systemui.brightness.ui.compose.BrightnessSliderContainer
import com.android.systemui.compose.modifiers.sysuiResTag
import com.android.systemui.compose.modifiers.sysuiResTag
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.SysUISingleton
@@ -67,13 +66,10 @@ import com.android.systemui.shade.ui.composable.OverlayShade
import com.android.systemui.shade.ui.composable.OverlayShadeHeader
import com.android.systemui.shade.ui.composable.OverlayShadeHeader
import com.android.systemui.shade.ui.composable.QuickSettingsOverlayHeader
import com.android.systemui.shade.ui.composable.QuickSettingsOverlayHeader
import com.android.systemui.shade.ui.composable.SingleShadeMeasurePolicy
import com.android.systemui.shade.ui.composable.SingleShadeMeasurePolicy
import com.android.systemui.statusbar.notification.icon.ui.viewbinder.NotificationIconContainerStatusBarViewBinder
import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimBounds
import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimBounds
import com.android.systemui.statusbar.notification.stack.shared.model.ShadeScrimShape
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.view.NotificationScrollView
import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationsPlaceholderViewModel
import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationsPlaceholderViewModel
import com.android.systemui.statusbar.phone.ui.StatusBarIconController
import com.android.systemui.statusbar.phone.ui.TintedIconManager
import dagger.Lazy
import dagger.Lazy
import javax.inject.Inject
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.Flow
@@ -84,11 +80,7 @@ class QuickSettingsShadeOverlay
constructor(
constructor(
    private val actionsViewModelFactory: QuickSettingsShadeOverlayActionsViewModel.Factory,
    private val actionsViewModelFactory: QuickSettingsShadeOverlayActionsViewModel.Factory,
    private val contentViewModelFactory: QuickSettingsShadeOverlayContentViewModel.Factory,
    private val contentViewModelFactory: QuickSettingsShadeOverlayContentViewModel.Factory,
    private val tintedIconManagerFactory: TintedIconManager.Factory,
    private val quickSettingsContainerViewModelFactory: QuickSettingsContainerViewModel.Factory,
    private val batteryMeterViewControllerFactory: BatteryMeterViewController.Factory,
    private val statusBarIconController: StatusBarIconController,
    private val notificationIconContainerStatusBarViewBinder:
        NotificationIconContainerStatusBarViewBinder,
    private val notificationStackScrollView: Lazy<NotificationScrollView>,
    private val notificationStackScrollView: Lazy<NotificationScrollView>,
    private val notificationsPlaceholderViewModelFactory: NotificationsPlaceholderViewModel.Factory,
    private val notificationsPlaceholderViewModelFactory: NotificationsPlaceholderViewModel.Factory,
) : Overlay {
) : Overlay {
@@ -107,35 +99,35 @@ constructor(


    @Composable
    @Composable
    override fun ContentScope.Content(modifier: Modifier) {
    override fun ContentScope.Content(modifier: Modifier) {
        val viewModel =
        val contentViewModel =
            rememberViewModel("QuickSettingsShadeOverlay") { contentViewModelFactory.create() }
            rememberViewModel("QuickSettingsShadeOverlayContent") {
                contentViewModelFactory.create()
            }
        val quickSettingsContainerViewModel =
            rememberViewModel("QuickSettingsShadeOverlayContainer") {
                // TODO(b/393054014): Add support for brightness mirroring.
                quickSettingsContainerViewModelFactory.create(supportsBrightnessMirroring = false)
            }
        val panelCornerRadius =
        val panelCornerRadius =
            with(LocalDensity.current) { OverlayShade.Dimensions.PanelCornerRadius.toPx().toInt() }
            with(LocalDensity.current) { OverlayShade.Dimensions.PanelCornerRadius.toPx().toInt() }


        // set the bounds to null when the QuickSettings overlay disappears
        // Set the bounds to null when the QuickSettings overlay disappears.
        DisposableEffect(Unit) { onDispose { viewModel.onPanelShapeChanged(null) } }
        DisposableEffect(Unit) { onDispose { contentViewModel.onPanelShapeChanged(null) } }


        Box(modifier = modifier) {
        Box(modifier = modifier) {
            SnoozeableHeadsUpNotificationSpace(
            SnoozeableHeadsUpNotificationSpace(
                stackScrollView = notificationStackScrollView.get(),
                stackScrollView = notificationStackScrollView.get(),
                viewModel =
                viewModel =
                    rememberViewModel("QuickSettingsShadeOverlay") {
                    rememberViewModel("QuickSettingsShadeOverlayPlaceholder") {
                        notificationsPlaceholderViewModelFactory.create()
                        notificationsPlaceholderViewModelFactory.create()
                    },
                    },
            )
            )
            OverlayShade(
            OverlayShade(
                isShadeLayoutWide = viewModel.isShadeLayoutWide,
                panelAlignment = Alignment.TopEnd,
                panelAlignment = Alignment.TopEnd,
                onScrimClicked = viewModel::onScrimClicked,
                onScrimClicked = contentViewModel::onScrimClicked,
                header = {
                header = {
                    OverlayShadeHeader(
                    OverlayShadeHeader(
                        viewModelFactory = viewModel.shadeHeaderViewModelFactory,
                        viewModel = quickSettingsContainerViewModel.shadeHeaderViewModel,
                        createTintedIconManager = tintedIconManagerFactory::create,
                        createBatteryMeterViewController =
                            batteryMeterViewControllerFactory::create,
                        statusBarIconController = statusBarIconController,
                        notificationIconContainerStatusBarViewBinder =
                            notificationIconContainerStatusBarViewBinder,
                        modifier =
                        modifier =
                            Modifier.element(NotificationsShade.Elements.StatusBar)
                            Modifier.element(NotificationsShade.Elements.StatusBar)
                                .layoutId(SingleShadeMeasurePolicy.LayoutId.ShadeHeader),
                                .layoutId(SingleShadeMeasurePolicy.LayoutId.ShadeHeader),
@@ -143,7 +135,7 @@ constructor(
                },
                },
            ) {
            ) {
                ShadeBody(
                ShadeBody(
                    viewModel = viewModel.quickSettingsContainerViewModel,
                    viewModel = quickSettingsContainerViewModel,
                    modifier =
                    modifier =
                        Modifier.onPlaced { coordinates ->
                        Modifier.onPlaced { coordinates ->
                            val boundsInWindow = coordinates.boundsInWindow()
                            val boundsInWindow = coordinates.boundsInWindow()
@@ -160,14 +152,12 @@ constructor(
                                    topRadius = 0,
                                    topRadius = 0,
                                    bottomRadius = panelCornerRadius,
                                    bottomRadius = panelCornerRadius,
                                )
                                )
                            viewModel.onPanelShapeChanged(shape)
                            contentViewModel.onPanelShapeChanged(shape)
                        },
                        },
                    header = {
                    header = {
                        if (viewModel.isShadeLayoutWide) {
                        if (quickSettingsContainerViewModel.showHeader) {
                            QuickSettingsOverlayHeader(
                            QuickSettingsOverlayHeader(
                                viewModelFactory = viewModel.shadeHeaderViewModelFactory,
                                viewModel = quickSettingsContainerViewModel.shadeHeaderViewModel,
                                createBatteryMeterViewController =
                                    batteryMeterViewControllerFactory::create,
                                modifier =
                                modifier =
                                    Modifier.padding(top = QuickSettingsShade.Dimensions.Padding),
                                    Modifier.padding(top = QuickSettingsShade.Dimensions.Padding),
                            )
                            )
+22 −29
Original line number Original line Diff line number Diff line
@@ -58,29 +58,31 @@ import com.android.systemui.res.R
/** Renders a lightweight shade UI container, as an overlay. */
/** Renders a lightweight shade UI container, as an overlay. */
@Composable
@Composable
fun ContentScope.OverlayShade(
fun ContentScope.OverlayShade(
    isShadeLayoutWide: Boolean,
    panelAlignment: Alignment,
    panelAlignment: Alignment,
    onScrimClicked: () -> Unit,
    onScrimClicked: () -> Unit,
    modifier: Modifier = Modifier,
    modifier: Modifier = Modifier,
    header: @Composable () -> Unit,
    header: @Composable () -> Unit,
    content: @Composable () -> Unit,
    content: @Composable () -> Unit,
) {
) {
    val isFullWidth = isFullWidthShade()
    Box(modifier) {
    Box(modifier) {
        Scrim(onClicked = onScrimClicked)
        Scrim(onClicked = onScrimClicked)


        Box(modifier = Modifier.fillMaxSize().panelPadding(), contentAlignment = panelAlignment) {
        Box(
            modifier = Modifier.fillMaxSize().panelContainerPadding(isFullWidth),
            contentAlignment = panelAlignment,
        ) {
            Panel(
            Panel(
                isShadeLayoutWide = isShadeLayoutWide,
                modifier =
                modifier =
                    Modifier.overscroll(verticalOverscrollEffect)
                    Modifier.overscroll(verticalOverscrollEffect)
                        .element(OverlayShade.Elements.Panel)
                        .element(OverlayShade.Elements.Panel)
                        .panelSize(),
                        .panelWidth(isFullWidth),
                header = header,
                header = header.takeIf { isFullWidth },
                content = content,
                content = content,
            )
            )
        }
        }


        if (isShadeLayoutWide) {
        if (!isFullWidth) {
            header()
            header()
        }
        }
    }
    }
@@ -100,9 +102,8 @@ private fun ContentScope.Scrim(onClicked: () -> Unit, modifier: Modifier = Modif


@Composable
@Composable
private fun ContentScope.Panel(
private fun ContentScope.Panel(
    isShadeLayoutWide: Boolean,
    modifier: Modifier = Modifier,
    modifier: Modifier = Modifier,
    header: @Composable () -> Unit,
    header: (@Composable () -> Unit)?,
    content: @Composable () -> Unit,
    content: @Composable () -> Unit,
) {
) {
    Box(modifier = modifier.clip(OverlayShade.Shapes.RoundedCornerPanel)) {
    Box(modifier = modifier.clip(OverlayShade.Shapes.RoundedCornerPanel)) {
@@ -117,9 +118,7 @@ private fun ContentScope.Panel(
        )
        )


        Column {
        Column {
            if (!isShadeLayoutWide) {
            header?.invoke()
                header()
            }


            // This content is intentionally rendered as a separate element from the background in
            // This content is intentionally rendered as a separate element from the background in
            // order to allow for more flexibility when defining transitions.
            // order to allow for more flexibility when defining transitions.
@@ -129,14 +128,12 @@ private fun ContentScope.Panel(
}
}


@Composable
@Composable
private fun Modifier.panelSize(): Modifier {
private fun Modifier.panelWidth(isFullWidthPanel: Boolean): Modifier {
    return this.then(
    return if (isFullWidthPanel) {
        if (isFullWidthShade()) {
        fillMaxWidth()
            Modifier.fillMaxWidth()
    } else {
    } else {
            Modifier.width(dimensionResource(id = R.dimen.shade_panel_width))
        width(dimensionResource(id = R.dimen.shade_panel_width))
    }
    }
    )
}
}


@Composable
@Composable
@@ -146,27 +143,23 @@ internal fun isFullWidthShade(): Boolean {
}
}


@Composable
@Composable
private fun Modifier.panelPadding(): Modifier {
private fun Modifier.panelContainerPadding(isFullWidthPanel: Boolean): Modifier {
    val widthSizeClass = LocalWindowSizeClass.current.widthSizeClass
    if (isFullWidthPanel) {
        return this
    }
    val systemBars = WindowInsets.systemBarsIgnoringVisibility
    val systemBars = WindowInsets.systemBarsIgnoringVisibility
    val displayCutout = WindowInsets.displayCutout
    val displayCutout = WindowInsets.displayCutout
    val waterfall = WindowInsets.waterfall
    val waterfall = WindowInsets.waterfall
    val horizontalPadding =
    val horizontalPadding =
        PaddingValues(horizontal = dimensionResource(id = R.dimen.shade_panel_margin_horizontal))
        PaddingValues(horizontal = dimensionResource(id = R.dimen.shade_panel_margin_horizontal))

    return padding(
    val combinedPadding =
        combinePaddings(
        combinePaddings(
            systemBars.asPaddingValues(),
            systemBars.asPaddingValues(),
            displayCutout.asPaddingValues(),
            displayCutout.asPaddingValues(),
            waterfall.asPaddingValues(),
            waterfall.asPaddingValues(),
            horizontalPadding,
            horizontalPadding,
        )
        )

    )
    return if (widthSizeClass == WindowWidthSizeClass.Compact) {
        padding(bottom = combinedPadding.calculateBottomPadding())
    } else {
        padding(combinedPadding)
    }
}
}


/** Creates a union of [paddingValues] by using the max padding of each edge. */
/** Creates a union of [paddingValues] by using the max padding of each edge. */
+92 −121

File changed.

Preview size limit exceeded, changes collapsed.

Loading