Loading packages/SystemUI/compose/features/src/com/android/systemui/media/controls/ui/composable/MediaCarousel.kt 0 → 100644 +50 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.systemui.media.controls.ui.composable import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.viewinterop.AndroidView import com.android.compose.animation.scene.ElementKey import com.android.compose.animation.scene.SceneScope import com.android.systemui.media.controls.ui.MediaCarouselController import com.android.systemui.media.controls.ui.MediaHost import com.android.systemui.util.animation.MeasurementInput private object MediaCarousel { object Elements { internal val Content = ElementKey("MediaCarouselContent") } } @Composable fun SceneScope.MediaCarousel( mediaHost: MediaHost, modifier: Modifier = Modifier, layoutWidth: Int, layoutHeight: Int, carouselController: MediaCarouselController, ) { // Notify controller to size the carousel for the current space mediaHost.measurementInput = MeasurementInput(layoutWidth, layoutHeight) carouselController.setSceneContainerSize(layoutWidth, layoutHeight) AndroidView( modifier = modifier.element(MediaCarousel.Elements.Content), factory = { _ -> carouselController.mediaFrame }, ) } packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt +50 −0 Original line number Diff line number Diff line Loading @@ -23,23 +23,34 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.layout.layout import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.unit.dp import com.android.compose.animation.scene.ElementKey import com.android.compose.animation.scene.SceneScope import com.android.systemui.battery.BatteryMeterViewController import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.media.controls.ui.MediaCarouselController import com.android.systemui.media.controls.ui.MediaHost import com.android.systemui.media.controls.ui.composable.MediaCarousel import com.android.systemui.media.dagger.MediaModule.QUICK_QS_PANEL import com.android.systemui.notifications.ui.composable.NotificationStack import com.android.systemui.qs.ui.adapter.QSSceneAdapter import com.android.systemui.qs.ui.composable.QuickSettings import com.android.systemui.res.R import com.android.systemui.scene.shared.model.Direction import com.android.systemui.scene.shared.model.SceneKey import com.android.systemui.scene.shared.model.SceneModel Loading @@ -49,7 +60,9 @@ import com.android.systemui.shade.ui.viewmodel.ShadeSceneViewModel import com.android.systemui.statusbar.phone.StatusBarIconController import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager import com.android.systemui.statusbar.phone.StatusBarLocation import com.android.systemui.util.animation.MeasurementInput import javax.inject.Inject import javax.inject.Named import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow Loading @@ -59,6 +72,7 @@ import kotlinx.coroutines.flow.stateIn object Shade { object Elements { val QuickSettings = ElementKey("ShadeQuickSettings") val MediaCarousel = ElementKey("ShadeMediaCarousel") val Scrim = ElementKey("ShadeScrim") val ScrimBackground = ElementKey("ShadeScrimBackground") } Loading Loading @@ -87,6 +101,8 @@ constructor( private val tintedIconManagerFactory: TintedIconManager.Factory, private val batteryMeterViewControllerFactory: BatteryMeterViewController.Factory, private val statusBarIconController: StatusBarIconController, private val mediaCarouselController: MediaCarouselController, @Named(QUICK_QS_PANEL) private val mediaHost: MediaHost, ) : ComposableScene { override val key = SceneKey.Shade Loading @@ -108,6 +124,8 @@ constructor( createTintedIconManager = tintedIconManagerFactory::create, createBatteryMeterViewController = batteryMeterViewControllerFactory::create, statusBarIconController = statusBarIconController, mediaCarouselController = mediaCarouselController, mediaHost = mediaHost, modifier = modifier, ) Loading @@ -127,8 +145,12 @@ private fun SceneScope.ShadeScene( createTintedIconManager: (ViewGroup, StatusBarLocation) -> TintedIconManager, createBatteryMeterViewController: (ViewGroup, StatusBarLocation) -> BatteryMeterViewController, statusBarIconController: StatusBarIconController, mediaCarouselController: MediaCarouselController, mediaHost: MediaHost, modifier: Modifier = Modifier, ) { val layoutWidth = remember { mutableStateOf(0) } Box(modifier.element(Shade.Elements.Scrim)) { Spacer( modifier = Loading Loading @@ -159,6 +181,34 @@ private fun SceneScope.ShadeScene( viewModel.qsSceneAdapter, QSSceneAdapter.State.QQS ) if (viewModel.isMediaVisible()) { val mediaHeight = dimensionResource(R.dimen.qs_media_session_height_expanded) MediaCarousel( modifier = Modifier.height(mediaHeight).fillMaxWidth().layout { measurable, constraints -> val placeable = measurable.measure(constraints) // Notify controller to size the carousel for the current space mediaHost.measurementInput = MeasurementInput(placeable.width, placeable.height) mediaCarouselController.setSceneContainerSize( placeable.width, placeable.height ) layout(placeable.width, placeable.height) { placeable.placeRelative(0, 0) } }, mediaHost = mediaHost, layoutWidth = layoutWidth.value, layoutHeight = with(LocalDensity.current) { mediaHeight.toPx() }.toInt(), carouselController = mediaCarouselController, ) } Spacer(modifier = Modifier.height(16.dp)) NotificationStack( viewModel = viewModel.notifications, Loading packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt +7 −0 Original line number Diff line number Diff line Loading @@ -37,6 +37,8 @@ import com.android.systemui.flags.Flags import com.android.systemui.keyguard.ui.viewmodel.KeyguardLongPressViewModel import com.android.systemui.keyguard.ui.viewmodel.LockscreenSceneViewModel import com.android.systemui.log.table.TableLogBuffer import com.android.systemui.media.controls.pipeline.MediaDataManager import com.android.systemui.media.controls.ui.MediaHost import com.android.systemui.model.SysUiState import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAsleepForTest import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest Loading Loading @@ -188,6 +190,9 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { private val qsFlexiglassAdapter = FakeQSSceneAdapter(inflateDelegate = { _, _ -> mock<View>() }) @Mock private lateinit var mediaDataManager: MediaDataManager @Mock private lateinit var mediaHost: MediaHost @Before fun setUp() { MockitoAnnotations.initMocks(this) Loading Loading @@ -240,6 +245,8 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { shadeHeaderViewModel = shadeHeaderViewModel, qsSceneAdapter = qsFlexiglassAdapter, notifications = utils.notificationsPlaceholderViewModel(), mediaDataManager = mediaDataManager, mediaHost = mediaHost, ) utils.deviceEntryRepository.setUnlocked(false) Loading packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt +27 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,8 @@ import com.android.systemui.authentication.shared.model.AuthenticationMethodMode import com.android.systemui.coroutines.collectLastValue import com.android.systemui.flags.FakeFeatureFlagsClassic import com.android.systemui.flags.Flags import com.android.systemui.media.controls.pipeline.MediaDataManager import com.android.systemui.media.controls.ui.MediaHost import com.android.systemui.qs.ui.adapter.FakeQSSceneAdapter import com.android.systemui.scene.SceneTestUtils import com.android.systemui.scene.shared.model.SceneKey Loading @@ -35,6 +37,7 @@ import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsVi import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository import com.android.systemui.util.mockito.mock import com.android.systemui.util.mockito.whenever import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runCurrent Loading @@ -42,6 +45,8 @@ import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.MockitoAnnotations @OptIn(ExperimentalCoroutinesApi::class) @SmallTest Loading Loading @@ -83,8 +88,12 @@ class ShadeSceneViewModelTest : SysuiTestCase() { private lateinit var underTest: ShadeSceneViewModel @Mock private lateinit var mediaDataManager: MediaDataManager @Mock private lateinit var mediaHost: MediaHost @Before fun setUp() { MockitoAnnotations.initMocks(this) shadeHeaderViewModel = ShadeHeaderViewModel( applicationScope = testScope.backgroundScope, Loading @@ -102,6 +111,8 @@ class ShadeSceneViewModelTest : SysuiTestCase() { shadeHeaderViewModel = shadeHeaderViewModel, qsSceneAdapter = qsFlexiglassAdapter, notifications = utils.notificationsPlaceholderViewModel(), mediaDataManager = mediaDataManager, mediaHost = mediaHost, ) } Loading Loading @@ -174,4 +185,20 @@ class ShadeSceneViewModelTest : SysuiTestCase() { assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) } @Test fun hasActiveMedia_mediaVisible() = testScope.runTest { whenever(mediaDataManager.hasActiveMediaOrRecommendation()).thenReturn(true) assertThat(underTest.isMediaVisible()).isTrue() } @Test fun doesNotHaveActiveMedia_mediaNotVisible() = testScope.runTest { whenever(mediaDataManager.hasActiveMediaOrRecommendation()).thenReturn(false) assertThat(underTest.isMediaVisible()).isFalse() } } packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselController.kt +18 −0 Original line number Diff line number Diff line Loading @@ -271,6 +271,10 @@ constructor( private val isReorderingAllowed: Boolean get() = visualStabilityProvider.isReorderingAllowed /** Size provided by the scene framework container */ private var widthInSceneContainerPx = 0 private var heightInSceneContainerPx = 0 init { dumpManager.registerDumpable(TAG, this) mediaFrame = inflateMediaCarousel() Loading Loading @@ -581,6 +585,15 @@ constructor( } } fun setSceneContainerSize(width: Int, height: Int) { if (width == widthInSceneContainerPx && height == heightInSceneContainerPx) { return } widthInSceneContainerPx = width heightInSceneContainerPx = height updatePlayers(recreateMedia = true) } private fun reorderAllPlayers( previousVisiblePlayerKey: MediaPlayerData.MediaSortKey?, key: String? = null Loading Loading @@ -638,6 +651,11 @@ constructor( .elementAtOrNull(mediaCarouselScrollHandler.visibleMediaIndex) if (existingPlayer == null) { val newPlayer = mediaControlPanelFactory.get() if (mediaFlags.isSceneContainerEnabled()) { newPlayer.mediaViewController.widthInSceneContainerPx = widthInSceneContainerPx newPlayer.mediaViewController.heightInSceneContainerPx = heightInSceneContainerPx } newPlayer.attachPlayer( MediaViewHolder.create(LayoutInflater.from(context), mediaContent) ) Loading Loading
packages/SystemUI/compose/features/src/com/android/systemui/media/controls/ui/composable/MediaCarousel.kt 0 → 100644 +50 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.systemui.media.controls.ui.composable import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.viewinterop.AndroidView import com.android.compose.animation.scene.ElementKey import com.android.compose.animation.scene.SceneScope import com.android.systemui.media.controls.ui.MediaCarouselController import com.android.systemui.media.controls.ui.MediaHost import com.android.systemui.util.animation.MeasurementInput private object MediaCarousel { object Elements { internal val Content = ElementKey("MediaCarouselContent") } } @Composable fun SceneScope.MediaCarousel( mediaHost: MediaHost, modifier: Modifier = Modifier, layoutWidth: Int, layoutHeight: Int, carouselController: MediaCarouselController, ) { // Notify controller to size the carousel for the current space mediaHost.measurementInput = MeasurementInput(layoutWidth, layoutHeight) carouselController.setSceneContainerSize(layoutWidth, layoutHeight) AndroidView( modifier = modifier.element(MediaCarousel.Elements.Content), factory = { _ -> carouselController.mediaFrame }, ) }
packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt +50 −0 Original line number Diff line number Diff line Loading @@ -23,23 +23,34 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.layout.layout import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.unit.dp import com.android.compose.animation.scene.ElementKey import com.android.compose.animation.scene.SceneScope import com.android.systemui.battery.BatteryMeterViewController import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.media.controls.ui.MediaCarouselController import com.android.systemui.media.controls.ui.MediaHost import com.android.systemui.media.controls.ui.composable.MediaCarousel import com.android.systemui.media.dagger.MediaModule.QUICK_QS_PANEL import com.android.systemui.notifications.ui.composable.NotificationStack import com.android.systemui.qs.ui.adapter.QSSceneAdapter import com.android.systemui.qs.ui.composable.QuickSettings import com.android.systemui.res.R import com.android.systemui.scene.shared.model.Direction import com.android.systemui.scene.shared.model.SceneKey import com.android.systemui.scene.shared.model.SceneModel Loading @@ -49,7 +60,9 @@ import com.android.systemui.shade.ui.viewmodel.ShadeSceneViewModel import com.android.systemui.statusbar.phone.StatusBarIconController import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager import com.android.systemui.statusbar.phone.StatusBarLocation import com.android.systemui.util.animation.MeasurementInput import javax.inject.Inject import javax.inject.Named import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow Loading @@ -59,6 +72,7 @@ import kotlinx.coroutines.flow.stateIn object Shade { object Elements { val QuickSettings = ElementKey("ShadeQuickSettings") val MediaCarousel = ElementKey("ShadeMediaCarousel") val Scrim = ElementKey("ShadeScrim") val ScrimBackground = ElementKey("ShadeScrimBackground") } Loading Loading @@ -87,6 +101,8 @@ constructor( private val tintedIconManagerFactory: TintedIconManager.Factory, private val batteryMeterViewControllerFactory: BatteryMeterViewController.Factory, private val statusBarIconController: StatusBarIconController, private val mediaCarouselController: MediaCarouselController, @Named(QUICK_QS_PANEL) private val mediaHost: MediaHost, ) : ComposableScene { override val key = SceneKey.Shade Loading @@ -108,6 +124,8 @@ constructor( createTintedIconManager = tintedIconManagerFactory::create, createBatteryMeterViewController = batteryMeterViewControllerFactory::create, statusBarIconController = statusBarIconController, mediaCarouselController = mediaCarouselController, mediaHost = mediaHost, modifier = modifier, ) Loading @@ -127,8 +145,12 @@ private fun SceneScope.ShadeScene( createTintedIconManager: (ViewGroup, StatusBarLocation) -> TintedIconManager, createBatteryMeterViewController: (ViewGroup, StatusBarLocation) -> BatteryMeterViewController, statusBarIconController: StatusBarIconController, mediaCarouselController: MediaCarouselController, mediaHost: MediaHost, modifier: Modifier = Modifier, ) { val layoutWidth = remember { mutableStateOf(0) } Box(modifier.element(Shade.Elements.Scrim)) { Spacer( modifier = Loading Loading @@ -159,6 +181,34 @@ private fun SceneScope.ShadeScene( viewModel.qsSceneAdapter, QSSceneAdapter.State.QQS ) if (viewModel.isMediaVisible()) { val mediaHeight = dimensionResource(R.dimen.qs_media_session_height_expanded) MediaCarousel( modifier = Modifier.height(mediaHeight).fillMaxWidth().layout { measurable, constraints -> val placeable = measurable.measure(constraints) // Notify controller to size the carousel for the current space mediaHost.measurementInput = MeasurementInput(placeable.width, placeable.height) mediaCarouselController.setSceneContainerSize( placeable.width, placeable.height ) layout(placeable.width, placeable.height) { placeable.placeRelative(0, 0) } }, mediaHost = mediaHost, layoutWidth = layoutWidth.value, layoutHeight = with(LocalDensity.current) { mediaHeight.toPx() }.toInt(), carouselController = mediaCarouselController, ) } Spacer(modifier = Modifier.height(16.dp)) NotificationStack( viewModel = viewModel.notifications, Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/scene/SceneFrameworkIntegrationTest.kt +7 −0 Original line number Diff line number Diff line Loading @@ -37,6 +37,8 @@ import com.android.systemui.flags.Flags import com.android.systemui.keyguard.ui.viewmodel.KeyguardLongPressViewModel import com.android.systemui.keyguard.ui.viewmodel.LockscreenSceneViewModel import com.android.systemui.log.table.TableLogBuffer import com.android.systemui.media.controls.pipeline.MediaDataManager import com.android.systemui.media.controls.ui.MediaHost import com.android.systemui.model.SysUiState import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAsleepForTest import com.android.systemui.power.domain.interactor.PowerInteractor.Companion.setAwakeForTest Loading Loading @@ -188,6 +190,9 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { private val qsFlexiglassAdapter = FakeQSSceneAdapter(inflateDelegate = { _, _ -> mock<View>() }) @Mock private lateinit var mediaDataManager: MediaDataManager @Mock private lateinit var mediaHost: MediaHost @Before fun setUp() { MockitoAnnotations.initMocks(this) Loading Loading @@ -240,6 +245,8 @@ class SceneFrameworkIntegrationTest : SysuiTestCase() { shadeHeaderViewModel = shadeHeaderViewModel, qsSceneAdapter = qsFlexiglassAdapter, notifications = utils.notificationsPlaceholderViewModel(), mediaDataManager = mediaDataManager, mediaHost = mediaHost, ) utils.deviceEntryRepository.setUnlocked(false) Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt +27 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,8 @@ import com.android.systemui.authentication.shared.model.AuthenticationMethodMode import com.android.systemui.coroutines.collectLastValue import com.android.systemui.flags.FakeFeatureFlagsClassic import com.android.systemui.flags.Flags import com.android.systemui.media.controls.pipeline.MediaDataManager import com.android.systemui.media.controls.ui.MediaHost import com.android.systemui.qs.ui.adapter.FakeQSSceneAdapter import com.android.systemui.scene.SceneTestUtils import com.android.systemui.scene.shared.model.SceneKey Loading @@ -35,6 +37,7 @@ import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsVi import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository import com.android.systemui.util.mockito.mock import com.android.systemui.util.mockito.whenever import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runCurrent Loading @@ -42,6 +45,8 @@ import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.MockitoAnnotations @OptIn(ExperimentalCoroutinesApi::class) @SmallTest Loading Loading @@ -83,8 +88,12 @@ class ShadeSceneViewModelTest : SysuiTestCase() { private lateinit var underTest: ShadeSceneViewModel @Mock private lateinit var mediaDataManager: MediaDataManager @Mock private lateinit var mediaHost: MediaHost @Before fun setUp() { MockitoAnnotations.initMocks(this) shadeHeaderViewModel = ShadeHeaderViewModel( applicationScope = testScope.backgroundScope, Loading @@ -102,6 +111,8 @@ class ShadeSceneViewModelTest : SysuiTestCase() { shadeHeaderViewModel = shadeHeaderViewModel, qsSceneAdapter = qsFlexiglassAdapter, notifications = utils.notificationsPlaceholderViewModel(), mediaDataManager = mediaDataManager, mediaHost = mediaHost, ) } Loading Loading @@ -174,4 +185,20 @@ class ShadeSceneViewModelTest : SysuiTestCase() { assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Bouncer)) } @Test fun hasActiveMedia_mediaVisible() = testScope.runTest { whenever(mediaDataManager.hasActiveMediaOrRecommendation()).thenReturn(true) assertThat(underTest.isMediaVisible()).isTrue() } @Test fun doesNotHaveActiveMedia_mediaNotVisible() = testScope.runTest { whenever(mediaDataManager.hasActiveMediaOrRecommendation()).thenReturn(false) assertThat(underTest.isMediaVisible()).isFalse() } }
packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselController.kt +18 −0 Original line number Diff line number Diff line Loading @@ -271,6 +271,10 @@ constructor( private val isReorderingAllowed: Boolean get() = visualStabilityProvider.isReorderingAllowed /** Size provided by the scene framework container */ private var widthInSceneContainerPx = 0 private var heightInSceneContainerPx = 0 init { dumpManager.registerDumpable(TAG, this) mediaFrame = inflateMediaCarousel() Loading Loading @@ -581,6 +585,15 @@ constructor( } } fun setSceneContainerSize(width: Int, height: Int) { if (width == widthInSceneContainerPx && height == heightInSceneContainerPx) { return } widthInSceneContainerPx = width heightInSceneContainerPx = height updatePlayers(recreateMedia = true) } private fun reorderAllPlayers( previousVisiblePlayerKey: MediaPlayerData.MediaSortKey?, key: String? = null Loading Loading @@ -638,6 +651,11 @@ constructor( .elementAtOrNull(mediaCarouselScrollHandler.visibleMediaIndex) if (existingPlayer == null) { val newPlayer = mediaControlPanelFactory.get() if (mediaFlags.isSceneContainerEnabled()) { newPlayer.mediaViewController.widthInSceneContainerPx = widthInSceneContainerPx newPlayer.mediaViewController.heightInSceneContainerPx = heightInSceneContainerPx } newPlayer.attachPlayer( MediaViewHolder.create(LayoutInflater.from(context), mediaContent) ) Loading