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

Commit b1221c6d authored by Michael Mikhail's avatar Michael Mikhail Committed by Android (Google) Code Review
Browse files

Merge "Send media view holder inflation to background" into main

parents cd19a409 d70ef66c
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -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"
+132 −69
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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,
@@ -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() }
@@ -350,7 +352,7 @@ constructor(
            MediaCarouselScrollHandler(
                mediaCarousel,
                pageIndicator,
                executor,
                uiExecutor,
                this::onSwipeToDismiss,
                this::updatePageIndicatorLocation,
                this::updateSeekbarListening,
@@ -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(
@@ -980,6 +992,7 @@ constructor(
        oldKey: String?,
        data: MediaData,
        isSsReactivated: Boolean,
        onUiExecutionEnd: Runnable? = null,
    ): Boolean =
        traceSection("MediaCarouselController#addOrUpdatePlayer") {
            MediaPlayerData.moveIfExists(oldKey, key)
@@ -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,
@@ -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(
@@ -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)
@@ -1185,6 +1249,7 @@ constructor(
                        MediaPlayerData.shouldPrioritizeSs,
                    )
                }
                onUiExecutionEnd.run()
            } else {
                val isSsReactivated = MediaPlayerData.isSsReactivated(key)
                if (recreateMedia) {
@@ -1195,11 +1260,9 @@ constructor(
                    oldKey = null,
                    data = data,
                    isSsReactivated = isSsReactivated,
                    onUiExecutionEnd = onUiExecutionEnd,
                )
            }
            if (recreateMedia) {
                reorderAllPlayers(previousVisibleKey)
            }
        }
    }

+15 −3
Original line number Diff line number Diff line
@@ -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
@@ -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 */
+6 −3
Original line number Diff line number Diff line
@@ -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
@@ -91,8 +92,10 @@ class MediaHost(
                data: MediaData,
                immediately: Boolean,
                receivedSmartspaceCardLatency: Int,
                isSsReactivated: Boolean
                isSsReactivated: Boolean,
            ) {
                if (mediaControlsUmoInflationInBackground()) return

                if (immediately) {
                    updateViewVisibility()
                }
@@ -101,7 +104,7 @@ class MediaHost(
            override fun onSmartspaceMediaDataLoaded(
                key: String,
                data: SmartspaceMediaData,
                shouldPrioritize: Boolean
                shouldPrioritize: Boolean,
            ) {
                updateViewVisibility()
            }
@@ -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
+111 −75

File changed.

Preview size limit exceeded, changes collapsed.