Loading packages/SystemUI/aconfig/systemui.aconfig +11 −1 Original line number Diff line number Diff line Loading @@ -1117,6 +1117,16 @@ flag { bug: "358645640" } flag { name: "media_controls_umo_inflation_in_background" namespace: "systemui" description: "Inflate UMO in background thread" bug: "368514198" metadata { purpose: PURPOSE_BUGFIX } } flag { namespace: "systemui" name: "enable_view_capture_tracing" Loading packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt +132 −69 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.media.controls.ui.controller import android.annotation.WorkerThread import android.app.PendingIntent import android.content.Context import android.content.Intent Loading @@ -41,6 +42,7 @@ import com.android.internal.logging.InstanceId import com.android.keyguard.KeyguardUpdateMonitor import com.android.keyguard.KeyguardUpdateMonitorCallback import com.android.systemui.Dumpable import com.android.systemui.Flags.mediaControlsUmoInflationInBackground import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Background Loading Loading @@ -137,7 +139,7 @@ constructor( private val activityStarter: ActivityStarter, private val systemClock: SystemClock, @Main private val mainDispatcher: CoroutineDispatcher, @Main executor: DelayableExecutor, @Main private val uiExecutor: DelayableExecutor, @Background private val bgExecutor: Executor, @Background private val backgroundDispatcher: CoroutineDispatcher, private val mediaManager: MediaDataManager, Loading Loading @@ -227,7 +229,7 @@ constructor( private var carouselLocale: Locale? = null private val animationScaleObserver: ContentObserver = object : ContentObserver(executor, 0) { object : ContentObserver(uiExecutor, 0) { override fun onChange(selfChange: Boolean) { if (!SceneContainerFlag.isEnabled) { MediaPlayerData.players().forEach { it.updateAnimatorDurationScale() } Loading Loading @@ -350,7 +352,7 @@ constructor( MediaCarouselScrollHandler( mediaCarousel, pageIndicator, executor, uiExecutor, this::onSwipeToDismiss, this::updatePageIndicatorLocation, this::updateSeekbarListening, Loading Loading @@ -458,7 +460,17 @@ constructor( isSsReactivated: Boolean, ) { debugLogger.logMediaLoaded(key, data.active) if (addOrUpdatePlayer(key, oldKey, data, isSsReactivated)) { val onUiExecutionEnd = if (mediaControlsUmoInflationInBackground()) { Runnable { if (immediately) { updateHostVisibility() } } } else { null } if (addOrUpdatePlayer(key, oldKey, data, isSsReactivated, onUiExecutionEnd)) { // Log card received if a new resumable media card is added MediaPlayerData.getMediaPlayer(key)?.let { logSmartspaceCardReported( Loading Loading @@ -980,6 +992,7 @@ constructor( oldKey: String?, data: MediaData, isSsReactivated: Boolean, onUiExecutionEnd: Runnable? = null, ): Boolean = traceSection("MediaCarouselController#addOrUpdatePlayer") { MediaPlayerData.moveIfExists(oldKey, key) Loading @@ -987,46 +1000,55 @@ constructor( val curVisibleMediaKey = MediaPlayerData.visiblePlayerKeys() .elementAtOrNull(mediaCarouselScrollHandler.visibleMediaIndex) if (mediaControlsUmoInflationInBackground()) { if (existingPlayer == null) { val newPlayer = mediaControlPanelFactory.get() if (SceneContainerFlag.isEnabled) { newPlayer.mediaViewController.widthInSceneContainerPx = widthInSceneContainerPx newPlayer.mediaViewController.heightInSceneContainerPx = heightInSceneContainerPx } newPlayer.attachPlayer( MediaViewHolder.create(LayoutInflater.from(context), mediaContent) ) newPlayer.mediaViewController.sizeChangedListener = this::updateCarouselDimensions val lp = LinearLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, ) newPlayer.mediaViewHolder?.player?.setLayoutParams(lp) newPlayer.bindPlayer(data, key) newPlayer.setListening( mediaCarouselScrollHandler.visibleToUser && currentlyExpanded ) MediaPlayerData.addMediaPlayer( bgExecutor.execute { val mediaViewHolder = createMediaViewHolderInBg() // Add the new player in the main thread. uiExecutor.execute { setupNewPlayer( key, data, newPlayer, systemClock, isSsReactivated, debugLogger, curVisibleMediaKey, mediaViewHolder, ) updateViewControllerToState(newPlayer.mediaViewController, noAnimation = true) // Media data added from a recommendation card should starts playing. if ( (shouldScrollToKey && data.isPlaying == true) || (!shouldScrollToKey && data.active) ) { reorderAllPlayers(curVisibleMediaKey, key) updatePageIndicator() mediaCarouselScrollHandler.onPlayersChanged() mediaFrame.requiresRemeasuring = true onUiExecutionEnd?.run() } } } else { needsReordering = true updatePlayer(key, data, isSsReactivated, curVisibleMediaKey, existingPlayer) updatePageIndicator() mediaCarouselScrollHandler.onPlayersChanged() mediaFrame.requiresRemeasuring = true onUiExecutionEnd?.run() } } else { if (existingPlayer == null) { val mediaViewHolder = MediaViewHolder.create(LayoutInflater.from(context), mediaContent) setupNewPlayer(key, data, isSsReactivated, curVisibleMediaKey, mediaViewHolder) } else { updatePlayer(key, data, isSsReactivated, curVisibleMediaKey, existingPlayer) } updatePageIndicator() mediaCarouselScrollHandler.onPlayersChanged() mediaFrame.requiresRemeasuring = true onUiExecutionEnd?.run() } return existingPlayer == null } private fun updatePlayer( key: String, data: MediaData, isSsReactivated: Boolean, curVisibleMediaKey: MediaPlayerData.MediaSortKey?, existingPlayer: MediaControlPanel, ) { existingPlayer.bindPlayer(data, key) MediaPlayerData.addMediaPlayer( key, Loading @@ -1042,19 +1064,53 @@ constructor( // To make sure we scroll to the right app's media player. if ( isReorderingAllowed || shouldScrollToKey && data.isPlaying == true && packageName == data.packageName shouldScrollToKey && data.isPlaying == true && packageName == data.packageName ) { reorderAllPlayers(curVisibleMediaKey, key) } else { needsReordering = true } } updatePageIndicator() mediaCarouselScrollHandler.onPlayersChanged() mediaFrame.requiresRemeasuring = true return existingPlayer == null private fun setupNewPlayer( key: String, data: MediaData, isSsReactivated: Boolean, curVisibleMediaKey: MediaPlayerData.MediaSortKey?, mediaViewHolder: MediaViewHolder, ) { val newPlayer = mediaControlPanelFactory.get() newPlayer.attachPlayer(mediaViewHolder) newPlayer.mediaViewController.sizeChangedListener = this@MediaCarouselController::updateCarouselDimensions val lp = LinearLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, ) newPlayer.mediaViewHolder?.player?.setLayoutParams(lp) newPlayer.bindPlayer(data, key) newPlayer.setListening(mediaCarouselScrollHandler.visibleToUser && currentlyExpanded) MediaPlayerData.addMediaPlayer( key, data, newPlayer, systemClock, isSsReactivated, debugLogger, ) updateViewControllerToState(newPlayer.mediaViewController, noAnimation = true) // Media data added from a recommendation card should starts playing. if ((shouldScrollToKey && data.isPlaying == true) || (!shouldScrollToKey && data.active)) { reorderAllPlayers(curVisibleMediaKey, key) } else { needsReordering = true } } @WorkerThread private fun createMediaViewHolderInBg(): MediaViewHolder { return MediaViewHolder.create(LayoutInflater.from(context), mediaContent) } private fun addSmartspaceMediaRecommendations( Loading Loading @@ -1173,8 +1229,16 @@ constructor( val previousVisibleKey = MediaPlayerData.visiblePlayerKeys() .elementAtOrNull(mediaCarouselScrollHandler.visibleMediaIndex) val onUiExecutionEnd = Runnable { if (recreateMedia) { reorderAllPlayers(previousVisibleKey) } } MediaPlayerData.mediaData().forEach { (key, data, isSsMediaRec) -> val mediaDataList = MediaPlayerData.mediaData() // Do not loop through the original list of media data because the re-addition of media data // is being executed in background thread. mediaDataList.forEach { (key, data, isSsMediaRec) -> if (isSsMediaRec) { val smartspaceMediaData = MediaPlayerData.smartspaceMediaData removePlayer(key, dismissMediaData = false, dismissRecommendation = false) Loading @@ -1185,6 +1249,7 @@ constructor( MediaPlayerData.shouldPrioritizeSs, ) } onUiExecutionEnd.run() } else { val isSsReactivated = MediaPlayerData.isSsReactivated(key) if (recreateMedia) { Loading @@ -1195,11 +1260,9 @@ constructor( oldKey = null, data = data, isSsReactivated = isSsReactivated, onUiExecutionEnd = onUiExecutionEnd, ) } if (recreateMedia) { reorderAllPlayers(previousVisibleKey) } } } Loading packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHostStatesManager.kt +15 −3 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.systemui.media.controls.ui.controller import com.android.app.tracing.traceSection import com.android.systemui.Flags.mediaControlsUmoInflationInBackground import com.android.systemui.dagger.SysUISingleton import com.android.systemui.media.controls.ui.view.MediaHostState import com.android.systemui.util.animation.MeasurementOutput Loading Loading @@ -71,23 +72,34 @@ class MediaHostStatesManager @Inject constructor() { */ fun updateCarouselDimensions( @MediaLocation location: Int, hostState: MediaHostState hostState: MediaHostState, ): MeasurementOutput = traceSection("MediaHostStatesManager#updateCarouselDimensions") { val result = MeasurementOutput(0, 0) var changed = false for (controller in controllers) { val measurement = controller.getMeasurementsForState(hostState) measurement?.let { if (it.measuredHeight > result.measuredHeight) { result.measuredHeight = it.measuredHeight changed = true } if (it.measuredWidth > result.measuredWidth) { result.measuredWidth = it.measuredWidth changed = true } } } if (mediaControlsUmoInflationInBackground()) { // Set carousel size if result measurements changed. This avoids setting carousel // size when this method gets called before the addition of media view controllers if (!carouselSizes.contains(location) || changed) { carouselSizes[location] = result return result } } else { carouselSizes[location] = result } return carouselSizes[location] ?: result } /** Add a callback to be called when a MediaState has updated */ Loading packages/SystemUI/src/com/android/systemui/media/controls/ui/view/MediaHost.kt +6 −3 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.graphics.Rect import android.util.ArraySet import android.view.View import android.view.View.OnAttachStateChangeListener import com.android.systemui.Flags.mediaControlsUmoInflationInBackground import com.android.systemui.media.controls.domain.pipeline.MediaDataManager import com.android.systemui.media.controls.shared.model.MediaData import com.android.systemui.media.controls.shared.model.SmartspaceMediaData Loading Loading @@ -91,8 +92,10 @@ class MediaHost( data: MediaData, immediately: Boolean, receivedSmartspaceCardLatency: Int, isSsReactivated: Boolean isSsReactivated: Boolean, ) { if (mediaControlsUmoInflationInBackground()) return if (immediately) { updateViewVisibility() } Loading @@ -101,7 +104,7 @@ class MediaHost( override fun onSmartspaceMediaDataLoaded( key: String, data: SmartspaceMediaData, shouldPrioritize: Boolean shouldPrioritize: Boolean, ) { updateViewVisibility() } Loading Loading @@ -171,7 +174,7 @@ class MediaHost( input.widthMeasureSpec = View.MeasureSpec.makeMeasureSpec( View.MeasureSpec.getSize(input.widthMeasureSpec), View.MeasureSpec.EXACTLY View.MeasureSpec.EXACTLY, ) } // This will trigger a state change that ensures that we now have a state Loading packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/controller/MediaCarouselControllerTest.kt +111 −75 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
packages/SystemUI/aconfig/systemui.aconfig +11 −1 Original line number Diff line number Diff line Loading @@ -1117,6 +1117,16 @@ flag { bug: "358645640" } flag { name: "media_controls_umo_inflation_in_background" namespace: "systemui" description: "Inflate UMO in background thread" bug: "368514198" metadata { purpose: PURPOSE_BUGFIX } } flag { namespace: "systemui" name: "enable_view_capture_tracing" Loading
packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt +132 −69 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.media.controls.ui.controller import android.annotation.WorkerThread import android.app.PendingIntent import android.content.Context import android.content.Intent Loading @@ -41,6 +42,7 @@ import com.android.internal.logging.InstanceId import com.android.keyguard.KeyguardUpdateMonitor import com.android.keyguard.KeyguardUpdateMonitorCallback import com.android.systemui.Dumpable import com.android.systemui.Flags.mediaControlsUmoInflationInBackground import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Background Loading Loading @@ -137,7 +139,7 @@ constructor( private val activityStarter: ActivityStarter, private val systemClock: SystemClock, @Main private val mainDispatcher: CoroutineDispatcher, @Main executor: DelayableExecutor, @Main private val uiExecutor: DelayableExecutor, @Background private val bgExecutor: Executor, @Background private val backgroundDispatcher: CoroutineDispatcher, private val mediaManager: MediaDataManager, Loading Loading @@ -227,7 +229,7 @@ constructor( private var carouselLocale: Locale? = null private val animationScaleObserver: ContentObserver = object : ContentObserver(executor, 0) { object : ContentObserver(uiExecutor, 0) { override fun onChange(selfChange: Boolean) { if (!SceneContainerFlag.isEnabled) { MediaPlayerData.players().forEach { it.updateAnimatorDurationScale() } Loading Loading @@ -350,7 +352,7 @@ constructor( MediaCarouselScrollHandler( mediaCarousel, pageIndicator, executor, uiExecutor, this::onSwipeToDismiss, this::updatePageIndicatorLocation, this::updateSeekbarListening, Loading Loading @@ -458,7 +460,17 @@ constructor( isSsReactivated: Boolean, ) { debugLogger.logMediaLoaded(key, data.active) if (addOrUpdatePlayer(key, oldKey, data, isSsReactivated)) { val onUiExecutionEnd = if (mediaControlsUmoInflationInBackground()) { Runnable { if (immediately) { updateHostVisibility() } } } else { null } if (addOrUpdatePlayer(key, oldKey, data, isSsReactivated, onUiExecutionEnd)) { // Log card received if a new resumable media card is added MediaPlayerData.getMediaPlayer(key)?.let { logSmartspaceCardReported( Loading Loading @@ -980,6 +992,7 @@ constructor( oldKey: String?, data: MediaData, isSsReactivated: Boolean, onUiExecutionEnd: Runnable? = null, ): Boolean = traceSection("MediaCarouselController#addOrUpdatePlayer") { MediaPlayerData.moveIfExists(oldKey, key) Loading @@ -987,46 +1000,55 @@ constructor( val curVisibleMediaKey = MediaPlayerData.visiblePlayerKeys() .elementAtOrNull(mediaCarouselScrollHandler.visibleMediaIndex) if (mediaControlsUmoInflationInBackground()) { if (existingPlayer == null) { val newPlayer = mediaControlPanelFactory.get() if (SceneContainerFlag.isEnabled) { newPlayer.mediaViewController.widthInSceneContainerPx = widthInSceneContainerPx newPlayer.mediaViewController.heightInSceneContainerPx = heightInSceneContainerPx } newPlayer.attachPlayer( MediaViewHolder.create(LayoutInflater.from(context), mediaContent) ) newPlayer.mediaViewController.sizeChangedListener = this::updateCarouselDimensions val lp = LinearLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, ) newPlayer.mediaViewHolder?.player?.setLayoutParams(lp) newPlayer.bindPlayer(data, key) newPlayer.setListening( mediaCarouselScrollHandler.visibleToUser && currentlyExpanded ) MediaPlayerData.addMediaPlayer( bgExecutor.execute { val mediaViewHolder = createMediaViewHolderInBg() // Add the new player in the main thread. uiExecutor.execute { setupNewPlayer( key, data, newPlayer, systemClock, isSsReactivated, debugLogger, curVisibleMediaKey, mediaViewHolder, ) updateViewControllerToState(newPlayer.mediaViewController, noAnimation = true) // Media data added from a recommendation card should starts playing. if ( (shouldScrollToKey && data.isPlaying == true) || (!shouldScrollToKey && data.active) ) { reorderAllPlayers(curVisibleMediaKey, key) updatePageIndicator() mediaCarouselScrollHandler.onPlayersChanged() mediaFrame.requiresRemeasuring = true onUiExecutionEnd?.run() } } } else { needsReordering = true updatePlayer(key, data, isSsReactivated, curVisibleMediaKey, existingPlayer) updatePageIndicator() mediaCarouselScrollHandler.onPlayersChanged() mediaFrame.requiresRemeasuring = true onUiExecutionEnd?.run() } } else { if (existingPlayer == null) { val mediaViewHolder = MediaViewHolder.create(LayoutInflater.from(context), mediaContent) setupNewPlayer(key, data, isSsReactivated, curVisibleMediaKey, mediaViewHolder) } else { updatePlayer(key, data, isSsReactivated, curVisibleMediaKey, existingPlayer) } updatePageIndicator() mediaCarouselScrollHandler.onPlayersChanged() mediaFrame.requiresRemeasuring = true onUiExecutionEnd?.run() } return existingPlayer == null } private fun updatePlayer( key: String, data: MediaData, isSsReactivated: Boolean, curVisibleMediaKey: MediaPlayerData.MediaSortKey?, existingPlayer: MediaControlPanel, ) { existingPlayer.bindPlayer(data, key) MediaPlayerData.addMediaPlayer( key, Loading @@ -1042,19 +1064,53 @@ constructor( // To make sure we scroll to the right app's media player. if ( isReorderingAllowed || shouldScrollToKey && data.isPlaying == true && packageName == data.packageName shouldScrollToKey && data.isPlaying == true && packageName == data.packageName ) { reorderAllPlayers(curVisibleMediaKey, key) } else { needsReordering = true } } updatePageIndicator() mediaCarouselScrollHandler.onPlayersChanged() mediaFrame.requiresRemeasuring = true return existingPlayer == null private fun setupNewPlayer( key: String, data: MediaData, isSsReactivated: Boolean, curVisibleMediaKey: MediaPlayerData.MediaSortKey?, mediaViewHolder: MediaViewHolder, ) { val newPlayer = mediaControlPanelFactory.get() newPlayer.attachPlayer(mediaViewHolder) newPlayer.mediaViewController.sizeChangedListener = this@MediaCarouselController::updateCarouselDimensions val lp = LinearLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, ) newPlayer.mediaViewHolder?.player?.setLayoutParams(lp) newPlayer.bindPlayer(data, key) newPlayer.setListening(mediaCarouselScrollHandler.visibleToUser && currentlyExpanded) MediaPlayerData.addMediaPlayer( key, data, newPlayer, systemClock, isSsReactivated, debugLogger, ) updateViewControllerToState(newPlayer.mediaViewController, noAnimation = true) // Media data added from a recommendation card should starts playing. if ((shouldScrollToKey && data.isPlaying == true) || (!shouldScrollToKey && data.active)) { reorderAllPlayers(curVisibleMediaKey, key) } else { needsReordering = true } } @WorkerThread private fun createMediaViewHolderInBg(): MediaViewHolder { return MediaViewHolder.create(LayoutInflater.from(context), mediaContent) } private fun addSmartspaceMediaRecommendations( Loading Loading @@ -1173,8 +1229,16 @@ constructor( val previousVisibleKey = MediaPlayerData.visiblePlayerKeys() .elementAtOrNull(mediaCarouselScrollHandler.visibleMediaIndex) val onUiExecutionEnd = Runnable { if (recreateMedia) { reorderAllPlayers(previousVisibleKey) } } MediaPlayerData.mediaData().forEach { (key, data, isSsMediaRec) -> val mediaDataList = MediaPlayerData.mediaData() // Do not loop through the original list of media data because the re-addition of media data // is being executed in background thread. mediaDataList.forEach { (key, data, isSsMediaRec) -> if (isSsMediaRec) { val smartspaceMediaData = MediaPlayerData.smartspaceMediaData removePlayer(key, dismissMediaData = false, dismissRecommendation = false) Loading @@ -1185,6 +1249,7 @@ constructor( MediaPlayerData.shouldPrioritizeSs, ) } onUiExecutionEnd.run() } else { val isSsReactivated = MediaPlayerData.isSsReactivated(key) if (recreateMedia) { Loading @@ -1195,11 +1260,9 @@ constructor( oldKey = null, data = data, isSsReactivated = isSsReactivated, onUiExecutionEnd = onUiExecutionEnd, ) } if (recreateMedia) { reorderAllPlayers(previousVisibleKey) } } } Loading
packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHostStatesManager.kt +15 −3 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.systemui.media.controls.ui.controller import com.android.app.tracing.traceSection import com.android.systemui.Flags.mediaControlsUmoInflationInBackground import com.android.systemui.dagger.SysUISingleton import com.android.systemui.media.controls.ui.view.MediaHostState import com.android.systemui.util.animation.MeasurementOutput Loading Loading @@ -71,23 +72,34 @@ class MediaHostStatesManager @Inject constructor() { */ fun updateCarouselDimensions( @MediaLocation location: Int, hostState: MediaHostState hostState: MediaHostState, ): MeasurementOutput = traceSection("MediaHostStatesManager#updateCarouselDimensions") { val result = MeasurementOutput(0, 0) var changed = false for (controller in controllers) { val measurement = controller.getMeasurementsForState(hostState) measurement?.let { if (it.measuredHeight > result.measuredHeight) { result.measuredHeight = it.measuredHeight changed = true } if (it.measuredWidth > result.measuredWidth) { result.measuredWidth = it.measuredWidth changed = true } } } if (mediaControlsUmoInflationInBackground()) { // Set carousel size if result measurements changed. This avoids setting carousel // size when this method gets called before the addition of media view controllers if (!carouselSizes.contains(location) || changed) { carouselSizes[location] = result return result } } else { carouselSizes[location] = result } return carouselSizes[location] ?: result } /** Add a callback to be called when a MediaState has updated */ Loading
packages/SystemUI/src/com/android/systemui/media/controls/ui/view/MediaHost.kt +6 −3 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.graphics.Rect import android.util.ArraySet import android.view.View import android.view.View.OnAttachStateChangeListener import com.android.systemui.Flags.mediaControlsUmoInflationInBackground import com.android.systemui.media.controls.domain.pipeline.MediaDataManager import com.android.systemui.media.controls.shared.model.MediaData import com.android.systemui.media.controls.shared.model.SmartspaceMediaData Loading Loading @@ -91,8 +92,10 @@ class MediaHost( data: MediaData, immediately: Boolean, receivedSmartspaceCardLatency: Int, isSsReactivated: Boolean isSsReactivated: Boolean, ) { if (mediaControlsUmoInflationInBackground()) return if (immediately) { updateViewVisibility() } Loading @@ -101,7 +104,7 @@ class MediaHost( override fun onSmartspaceMediaDataLoaded( key: String, data: SmartspaceMediaData, shouldPrioritize: Boolean shouldPrioritize: Boolean, ) { updateViewVisibility() } Loading Loading @@ -171,7 +174,7 @@ class MediaHost( input.widthMeasureSpec = View.MeasureSpec.makeMeasureSpec( View.MeasureSpec.getSize(input.widthMeasureSpec), View.MeasureSpec.EXACTLY View.MeasureSpec.EXACTLY, ) } // This will trigger a state change that ensures that we now have a state Loading
packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/controller/MediaCarouselControllerTest.kt +111 −75 File changed.Preview size limit exceeded, changes collapsed. Show changes