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

Commit 5b78f790 authored by Michael Mikhail's avatar Michael Mikhail
Browse files

[Flexiglass] Use media composable for media popup chip.

Flag: com.android.systemui.scene_container
Flag: com.android.systemui.media_controls_in_compose
Bug: 438550975
Test: Build
Change-Id: I089cb7282810e2c18f95f2f025a944c5c2d449ea
parent 2d418fbf
Loading
Loading
Loading
Loading
+57 −21
Original line number Diff line number Diff line
@@ -27,11 +27,44 @@ import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView
import com.android.systemui.media.controls.ui.view.MediaHost
import com.android.systemui.media.remedia.shared.flag.MediaControlsInComposeFlag
import com.android.systemui.media.remedia.ui.compose.Media
import com.android.systemui.media.remedia.ui.compose.MediaPresentationStyle
import com.android.systemui.media.remedia.ui.compose.MediaUiBehavior
import com.android.systemui.media.remedia.ui.viewmodel.MediaCarouselVisibility
import com.android.systemui.media.remedia.ui.viewmodel.MediaViewModel
import com.android.systemui.res.R

/** Displays a popup containing media controls. Embeds the MediaCarousel within a Compose popup. */
@Composable
fun MediaControlPopup(mediaHost: MediaHost, modifier: Modifier = Modifier) {
fun MediaControlPopup(
    viewModelFactory: MediaViewModel.Factory,
    mediaHost: MediaHost,
    modifier: Modifier = Modifier,
) {
    if (MediaControlsInComposeFlag.isEnabled) {
        Media(
            viewModelFactory = viewModelFactory,
            presentationStyle = MediaPresentationStyle.Default,
            behavior =
                MediaUiBehavior(
                    carouselVisibility = MediaCarouselVisibility.WhenAnyCardIsActive,
                    isCarouselDismissible = false,
                    isCarouselScrollingEnabled = false,
                ),
            onDismissed = {},
            modifier =
                modifier
                    .width(400.dp)
                    .height(200.dp)
                    .clip(
                        shape =
                            RoundedCornerShape(
                                dimensionResource(R.dimen.notification_corner_radius)
                            )
                    ),
        )
    } else {
        AndroidView(
            modifier =
                modifier
@@ -39,7 +72,9 @@ fun MediaControlPopup(mediaHost: MediaHost, modifier: Modifier = Modifier) {
                    .height(200.dp)
                    .clip(
                        shape =
                        RoundedCornerShape(dimensionResource(R.dimen.notification_corner_radius))
                            RoundedCornerShape(
                                dimensionResource(R.dimen.notification_corner_radius)
                            )
                    ),
            factory = { _ ->
                mediaHost.hostView.apply {
@@ -54,3 +89,4 @@ fun MediaControlPopup(mediaHost: MediaHost, modifier: Modifier = Modifier) {
            onReset = {},
        )
    }
}
+31 −2
Original line number Diff line number Diff line
@@ -16,19 +16,27 @@

package com.android.systemui.statusbar.featurepods.popups.ui.compose

import androidx.activity.OnBackPressedDispatcher
import androidx.activity.OnBackPressedDispatcherOwner
import androidx.activity.compose.LocalOnBackPressedDispatcherOwner
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Popup
import androidx.compose.ui.window.PopupProperties
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.compose.LocalLifecycleOwner
import com.android.systemui.media.controls.ui.view.MediaHost
import com.android.systemui.media.remedia.ui.viewmodel.MediaViewModel
import com.android.systemui.res.R
import com.android.systemui.statusbar.featurepods.av.ui.compose.AvControlsChipPopup
import com.android.systemui.statusbar.featurepods.media.ui.compose.MediaControlPopup
@@ -40,7 +48,11 @@ import com.android.systemui.statusbar.featurepods.popups.ui.model.PopupChipModel
 * status bar.
 */
@Composable
fun StatusBarPopup(viewModel: PopupChipModel.Shown, mediaHost: MediaHost) {
fun StatusBarPopup(
    viewModel: PopupChipModel.Shown,
    mediaViewModelFactory: MediaViewModel.Factory,
    mediaHost: MediaHost,
) {
    val density = Density(LocalContext.current)
    Popup(
        properties =
@@ -59,8 +71,25 @@ fun StatusBarPopup(viewModel: PopupChipModel.Shown, mediaHost: MediaHost) {
        Box(modifier = Modifier.padding(8.dp).wrapContentSize()) {
            when (viewModel.chipId) {
                is PopupChipId.MediaControl -> {
                    MediaControlPopup(mediaHost = mediaHost)
                    val viewRootImpl = LocalView.current.viewRootImpl
                    val lifecycle = LocalLifecycleOwner.current.lifecycle
                    val owner =
                        object : OnBackPressedDispatcherOwner {
                            override val onBackPressedDispatcher =
                                OnBackPressedDispatcher().apply {
                                    setOnBackInvokedDispatcher(viewRootImpl.onBackInvokedDispatcher)
                                }

                            override val lifecycle: Lifecycle = lifecycle
                        }
                    CompositionLocalProvider(LocalOnBackPressedDispatcherOwner provides owner) {
                        MediaControlPopup(
                            viewModelFactory = mediaViewModelFactory,
                            mediaHost = mediaHost,
                        )
                    }
                }

                is PopupChipId.AvControlsIndicator -> {
                    AvControlsChipPopup()
                }
+7 −1
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.android.systemui.media.controls.ui.view.MediaHost
import com.android.systemui.media.remedia.ui.viewmodel.MediaViewModel
import com.android.systemui.scene.shared.flag.SceneContainerFlag
import com.android.systemui.statusbar.featurepods.popups.ui.model.PopupChipId
import com.android.systemui.statusbar.featurepods.popups.ui.model.PopupChipModel
@@ -34,6 +35,7 @@ import com.android.systemui.statusbar.featurepods.popups.ui.model.PopupChipModel
@Composable
fun StatusBarPopupChipsContainer(
    chips: List<PopupChipModel.Shown>,
    mediaViewModelFactory: MediaViewModel.Factory,
    mediaHost: MediaHost,
    onMediaControlPopupVisibilityChanged: (Boolean) -> Unit,
    modifier: Modifier = Modifier,
@@ -58,7 +60,11 @@ fun StatusBarPopupChipsContainer(
            chips.forEach { chip ->
                StatusBarPopupChip(chip)
                if (chip.isPopupShown) {
                    StatusBarPopup(viewModel = chip, mediaHost = mediaHost)
                    StatusBarPopup(
                        viewModel = chip,
                        mediaViewModelFactory = mediaViewModelFactory,
                        mediaHost = mediaHost,
                    )
                }
            }
        }
+3 −0
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ import com.android.systemui.compose.modifiers.sysUiResTagContainer
import com.android.systemui.lifecycle.rememberViewModel
import com.android.systemui.media.controls.ui.controller.MediaHierarchyManager
import com.android.systemui.media.controls.ui.view.MediaHost
import com.android.systemui.media.remedia.ui.viewmodel.MediaViewModel
import com.android.systemui.res.R
import com.android.systemui.shade.ui.composable.ChipHighlightModel
import com.android.systemui.shade.ui.composable.ShadeHighlightChip
@@ -84,6 +85,7 @@ fun DesktopStatusBar(
    statusBarIconController: StatusBarIconController,
    iconManagerFactory: TintedIconManager.Factory,
    mediaHierarchyManager: MediaHierarchyManager,
    mediaViewModelFactory: MediaViewModel.Factory,
    mediaHost: MediaHost,
    iconViewStore: NotificationIconContainerViewBinder.IconViewStore?,
    modifier: Modifier = Modifier,
@@ -133,6 +135,7 @@ fun DesktopStatusBar(
            if (StatusBarPopupChips.isEnabled) {
                StatusBarPopupChipsContainer(
                    chips = viewModel.popupChips,
                    mediaViewModelFactory = mediaViewModelFactory,
                    mediaHost = mediaHost,
                    onMediaControlPopupVisibilityChanged = { popupShowing ->
                        mediaHierarchyManager.isMediaControlPopupShowing = popupShowing
+6 −0
Original line number Diff line number Diff line
@@ -69,6 +69,7 @@ import com.android.systemui.media.controls.ui.controller.MediaHierarchyManager
import com.android.systemui.media.controls.ui.view.MediaHost
import com.android.systemui.media.controls.ui.view.MediaHostState
import com.android.systemui.media.dagger.MediaModule.POPUP
import com.android.systemui.media.remedia.ui.viewmodel.MediaViewModel
import com.android.systemui.plugins.DarkIconDispatcher
import com.android.systemui.res.R
import com.android.systemui.scene.shared.flag.SceneContainerFlag
@@ -131,6 +132,7 @@ constructor(
    private val eventAnimationInteractor: SystemStatusEventAnimationInteractor,
    private val mediaHierarchyManager: MediaHierarchyManager,
    @Named(POPUP) private val mediaHost: MediaHost,
    private val mediaViewModelFactory: MediaViewModel.Factory,
    @DisplayAware private val darkIconDispatcher: DarkIconDispatcher,
    @DisplayAware private val homeStatusBarViewBinder: HomeStatusBarViewBinder,
    @DisplayAware private val homeStatusBarViewModelFactory: HomeStatusBarViewModelFactory,
@@ -156,6 +158,7 @@ constructor(
                        eventAnimationInteractor = eventAnimationInteractor,
                        mediaHierarchyManager = mediaHierarchyManager,
                        mediaHost = mediaHost,
                        mediaViewModelFactory = mediaViewModelFactory,
                        statusBarRegionSamplingViewModelFactory =
                            statusBarRegionSamplingViewModelFactory,
                        onViewCreated = andThen,
@@ -195,6 +198,7 @@ fun StatusBarRoot(
    eventAnimationInteractor: SystemStatusEventAnimationInteractor,
    mediaHierarchyManager: MediaHierarchyManager,
    mediaHost: MediaHost,
    mediaViewModelFactory: MediaViewModel.Factory,
    statusBarRegionSamplingViewModelFactory: StatusBarRegionSamplingViewModel.Factory,
    onViewCreated: (ViewGroup) -> Unit,
    modifier: Modifier = Modifier,
@@ -235,6 +239,7 @@ fun StatusBarRoot(
            statusBarIconController = iconController,
            iconManagerFactory = tintedIconManagerFactory,
            mediaHierarchyManager = mediaHierarchyManager,
            mediaViewModelFactory = mediaViewModelFactory,
            mediaHost = mediaHost,
            iconViewStore = iconViewStore,
        )
@@ -314,6 +319,7 @@ fun StatusBarRoot(
                            setContent {
                                StatusBarPopupChipsContainer(
                                    chips = statusBarViewModel.popupChips,
                                    mediaViewModelFactory = mediaViewModelFactory,
                                    mediaHost = mediaHost,
                                    onMediaControlPopupVisibilityChanged = { popupShowing ->
                                        mediaHierarchyManager.isMediaControlPopupShowing =
Loading