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

Commit 7c8c3ea7 authored by Michael Mikhail's avatar Michael Mikhail Committed by Automerger Merge Worker
Browse files

Merge "Run inflations of UMO in a background thread" into tm-qpr-dev am:...

Merge "Run inflations of UMO in a background thread" into tm-qpr-dev am: 69ce1098 am: 253a5cb5 am: eb5e48ed

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/21448725



Change-Id: I653c5d0ca6e1b2b57ce9a92903e64a1cbb1ac38e
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 0b65a192 eb5e48ed
Loading
Loading
Loading
Loading
+58 −47
Original line number Original line Diff line number Diff line
@@ -39,6 +39,7 @@ import com.android.systemui.Dumpable
import com.android.systemui.R
import com.android.systemui.R
import com.android.systemui.classifier.FalsingCollector
import com.android.systemui.classifier.FalsingCollector
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.dump.DumpManager
import com.android.systemui.dump.DumpManager
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
@@ -68,6 +69,7 @@ import com.android.systemui.util.time.SystemClock
import com.android.systemui.util.traceSection
import com.android.systemui.util.traceSection
import java.io.PrintWriter
import java.io.PrintWriter
import java.util.TreeMap
import java.util.TreeMap
import java.util.concurrent.Executor
import javax.inject.Inject
import javax.inject.Inject
import javax.inject.Provider
import javax.inject.Provider
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.CoroutineScope
@@ -93,7 +95,8 @@ constructor(
    private val mediaHostStatesManager: MediaHostStatesManager,
    private val mediaHostStatesManager: MediaHostStatesManager,
    private val activityStarter: ActivityStarter,
    private val activityStarter: ActivityStarter,
    private val systemClock: SystemClock,
    private val systemClock: SystemClock,
    @Main executor: DelayableExecutor,
    @Main private val mainExecutor: DelayableExecutor,
    @Background private val backgroundExecutor: Executor,
    private val mediaManager: MediaDataManager,
    private val mediaManager: MediaDataManager,
    configurationController: ConfigurationController,
    configurationController: ConfigurationController,
    falsingCollector: FalsingCollector,
    falsingCollector: FalsingCollector,
@@ -256,7 +259,7 @@ constructor(
            MediaCarouselScrollHandler(
            MediaCarouselScrollHandler(
                mediaCarousel,
                mediaCarousel,
                pageIndicator,
                pageIndicator,
                executor,
                mainExecutor,
                this::onSwipeToDismiss,
                this::onSwipeToDismiss,
                this::updatePageIndicatorLocation,
                this::updatePageIndicatorLocation,
                this::updateSeekbarListening,
                this::updateSeekbarListening,
@@ -618,10 +621,50 @@ constructor(
                MediaPlayerData.visiblePlayerKeys()
                MediaPlayerData.visiblePlayerKeys()
                    .elementAtOrNull(mediaCarouselScrollHandler.visibleMediaIndex)
                    .elementAtOrNull(mediaCarouselScrollHandler.visibleMediaIndex)
            if (existingPlayer == null) {
            if (existingPlayer == null) {
                val newPlayer = mediaControlPanelFactory.get()
                setupNewPlayer(key, data, isSsReactivated, curVisibleMediaKey)
                newPlayer.attachPlayer(
            } else {
                    MediaViewHolder.create(LayoutInflater.from(context), mediaContent)
                existingPlayer.bindPlayer(data, key)
                MediaPlayerData.addMediaPlayer(
                    key,
                    data,
                    existingPlayer,
                    systemClock,
                    isSsReactivated,
                    debugLogger
                )
                )
                val packageName = MediaPlayerData.smartspaceMediaData?.packageName ?: String()
                // In case of recommendations hits.
                // Check the playing status of media player and the package name.
                // To make sure we scroll to the right app's media player.
                if (
                    isReorderingAllowed ||
                        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?,
    ) {
        backgroundExecutor.execute {
            val mediaViewHolder = createMediaViewHolderInBg()
            // Add the new player in the main thread.
            mainExecutor.execute {
                val newPlayer = mediaControlPanelFactory.get()
                newPlayer.attachPlayer(mediaViewHolder)
                newPlayer.mediaViewController.sizeChangedListener = this::updateCarouselDimensions
                newPlayer.mediaViewController.sizeChangedListener = this::updateCarouselDimensions
                val lp =
                val lp =
                    LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams(
@@ -651,35 +694,15 @@ constructor(
                } else {
                } else {
                    needsReordering = true
                    needsReordering = true
                }
                }
            } else {
                existingPlayer.bindPlayer(data, key)
                MediaPlayerData.addMediaPlayer(
                    key,
                    data,
                    existingPlayer,
                    systemClock,
                    isSsReactivated,
                    debugLogger
                )
                val packageName = MediaPlayerData.smartspaceMediaData?.packageName ?: String()
                // In case of recommendations hits.
                // Check the playing status of media player and the package name.
                // To make sure we scroll to the right app's media player.
                if (
                    isReorderingAllowed ||
                        shouldScrollToKey &&
                            data.isPlaying == true &&
                            packageName == data.packageName
                ) {
                    reorderAllPlayers(curVisibleMediaKey, key)
                } else {
                    needsReordering = true
                }
            }
                updatePageIndicator()
                updatePageIndicator()
                mediaCarouselScrollHandler.onPlayersChanged()
                mediaCarouselScrollHandler.onPlayersChanged()
                mediaFrame.requiresRemeasuring = true
                mediaFrame.requiresRemeasuring = true
            return existingPlayer == null
            }
        }
    }

    private fun createMediaViewHolderInBg(): MediaViewHolder {
        return MediaViewHolder.create(LayoutInflater.from(context), mediaContent)
    }
    }


    private fun addSmartspaceMediaRecommendations(
    private fun addSmartspaceMediaRecommendations(
@@ -714,15 +737,14 @@ constructor(
                    debugLogger.logPotentialMemoryLeak(existingSmartspaceMediaKey)
                    debugLogger.logPotentialMemoryLeak(existingSmartspaceMediaKey)
                }
                }
            }
            }

            val newRecs = mediaControlPanelFactory.get()
            val newRecs = mediaControlPanelFactory.get()
            newRecs.attachRecommendation(
            val recommendationViewHolder =
                RecommendationViewHolder.create(
                RecommendationViewHolder.create(
                    LayoutInflater.from(context),
                    LayoutInflater.from(context),
                    mediaContent,
                    mediaContent,
                    mediaFlags.isRecommendationCardUpdateEnabled()
                    mediaFlags.isRecommendationCardUpdateEnabled()
                )
                )
            )
            newRecs.attachRecommendation(recommendationViewHolder)
            newRecs.mediaViewController.sizeChangedListener = this::updateCarouselDimensions
            newRecs.mediaViewController.sizeChangedListener = this::updateCarouselDimensions
            val lp =
            val lp =
                LinearLayout.LayoutParams(
                LinearLayout.LayoutParams(
@@ -746,17 +768,6 @@ constructor(
            reorderAllPlayers(curVisibleMediaKey)
            reorderAllPlayers(curVisibleMediaKey)
            updatePageIndicator()
            updatePageIndicator()
            mediaFrame.requiresRemeasuring = true
            mediaFrame.requiresRemeasuring = true
            // Check postcondition: mediaContent should have the same number of children as there
            // are
            // elements in mediaPlayers.
            if (MediaPlayerData.players().size != mediaContent.childCount) {
                Log.e(
                    TAG,
                    "Size of players list and number of views in carousel are out of sync. " +
                        "Players size is ${MediaPlayerData.players().size}. " +
                        "View count is ${mediaContent.childCount}."
                )
            }
        }
        }


    fun removePlayer(
    fun removePlayer(
+114 −4
Original line number Original line Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.systemui.media.controls.ui
package com.android.systemui.media.controls.ui


import android.app.PendingIntent
import android.app.PendingIntent
import android.content.res.ColorStateList
import android.content.res.Configuration
import android.content.res.Configuration
import android.testing.AndroidTestingRunner
import android.testing.AndroidTestingRunner
import android.testing.TestableLooper
import android.testing.TestableLooper
@@ -26,9 +27,9 @@ import androidx.test.filters.SmallTest
import com.android.internal.logging.InstanceId
import com.android.internal.logging.InstanceId
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.keyguard.KeyguardUpdateMonitorCallback
import com.android.keyguard.KeyguardUpdateMonitorCallback
import com.android.systemui.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.SysuiTestCase
import com.android.systemui.classifier.FalsingCollector
import com.android.systemui.classifier.FalsingCollector
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.dump.DumpManager
import com.android.systemui.dump.DumpManager
import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
import com.android.systemui.keyguard.data.repository.FakeKeyguardTransitionRepository
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
@@ -49,7 +50,7 @@ import com.android.systemui.qs.PageIndicator
import com.android.systemui.statusbar.notification.collection.provider.OnReorderingAllowedListener
import com.android.systemui.statusbar.notification.collection.provider.OnReorderingAllowedListener
import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider
import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.util.concurrency.DelayableExecutor
import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.mockito.capture
import com.android.systemui.util.mockito.capture
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.time.FakeSystemClock
import com.android.systemui.util.time.FakeSystemClock
@@ -89,7 +90,6 @@ class MediaCarouselControllerTest : SysuiTestCase() {
    @Mock lateinit var mediaHostStatesManager: MediaHostStatesManager
    @Mock lateinit var mediaHostStatesManager: MediaHostStatesManager
    @Mock lateinit var mediaHostState: MediaHostState
    @Mock lateinit var mediaHostState: MediaHostState
    @Mock lateinit var activityStarter: ActivityStarter
    @Mock lateinit var activityStarter: ActivityStarter
    @Mock @Main private lateinit var executor: DelayableExecutor
    @Mock lateinit var mediaDataManager: MediaDataManager
    @Mock lateinit var mediaDataManager: MediaDataManager
    @Mock lateinit var configurationController: ConfigurationController
    @Mock lateinit var configurationController: ConfigurationController
    @Mock lateinit var falsingCollector: FalsingCollector
    @Mock lateinit var falsingCollector: FalsingCollector
@@ -113,11 +113,15 @@ class MediaCarouselControllerTest : SysuiTestCase() {


    private val clock = FakeSystemClock()
    private val clock = FakeSystemClock()
    private lateinit var mediaCarouselController: MediaCarouselController
    private lateinit var mediaCarouselController: MediaCarouselController
    private lateinit var mainExecutor: FakeExecutor
    private lateinit var backgroundExecutor: FakeExecutor


    @Before
    @Before
    fun setup() {
    fun setup() {
        MockitoAnnotations.initMocks(this)
        MockitoAnnotations.initMocks(this)
        transitionRepository = FakeKeyguardTransitionRepository()
        transitionRepository = FakeKeyguardTransitionRepository()
        mainExecutor = FakeExecutor(clock)
        backgroundExecutor = FakeExecutor(clock)
        mediaCarouselController =
        mediaCarouselController =
            MediaCarouselController(
            MediaCarouselController(
                context,
                context,
@@ -126,7 +130,8 @@ class MediaCarouselControllerTest : SysuiTestCase() {
                mediaHostStatesManager,
                mediaHostStatesManager,
                activityStarter,
                activityStarter,
                clock,
                clock,
                executor,
                mainExecutor,
                backgroundExecutor,
                mediaDataManager,
                mediaDataManager,
                configurationController,
                configurationController,
                falsingCollector,
                falsingCollector,
@@ -401,6 +406,7 @@ class MediaCarouselControllerTest : SysuiTestCase() {
                resumption = true
                resumption = true
            )
            )
        )
        )
        runAllReady()


        assertEquals(
        assertEquals(
            MediaPlayerData.getMediaPlayerIndex("paused local"),
            MediaPlayerData.getMediaPlayerIndex("paused local"),
@@ -510,6 +516,8 @@ class MediaCarouselControllerTest : SysuiTestCase() {
            false
            false
        )
        )
        mediaCarouselController.shouldScrollToKey = true
        mediaCarouselController.shouldScrollToKey = true
        runAllReady()

        // switching between media players.
        // switching between media players.
        listener.value.onMediaDataLoaded(
        listener.value.onMediaDataLoaded(
            "playing local",
            "playing local",
@@ -531,6 +539,7 @@ class MediaCarouselControllerTest : SysuiTestCase() {
                resumption = false
                resumption = false
            )
            )
        )
        )
        runAllReady()


        assertEquals(
        assertEquals(
            MediaPlayerData.getMediaPlayerIndex("paused local"),
            MediaPlayerData.getMediaPlayerIndex("paused local"),
@@ -555,6 +564,7 @@ class MediaCarouselControllerTest : SysuiTestCase() {
                resumption = false
                resumption = false
            )
            )
        )
        )
        runAllReady()


        var playerIndex = MediaPlayerData.getMediaPlayerIndex("playing local")
        var playerIndex = MediaPlayerData.getMediaPlayerIndex("playing local")
        assertEquals(
        assertEquals(
@@ -577,6 +587,8 @@ class MediaCarouselControllerTest : SysuiTestCase() {
                packageName = "PACKAGE_NAME"
                packageName = "PACKAGE_NAME"
            )
            )
        )
        )
        runAllReady()

        playerIndex = MediaPlayerData.getMediaPlayerIndex("playing local")
        playerIndex = MediaPlayerData.getMediaPlayerIndex("playing local")
        assertEquals(playerIndex, 0)
        assertEquals(playerIndex, 0)
    }
    }
@@ -674,6 +686,8 @@ class MediaCarouselControllerTest : SysuiTestCase() {


    @Test
    @Test
    fun testOnConfigChanged_playersAreAddedBack() {
    fun testOnConfigChanged_playersAreAddedBack() {
        mediaCarouselController.pageIndicator = pageIndicator

        listener.value.onMediaDataLoaded(
        listener.value.onMediaDataLoaded(
            "playing local",
            "playing local",
            null,
            null,
@@ -694,11 +708,15 @@ class MediaCarouselControllerTest : SysuiTestCase() {
                resumption = false
                resumption = false
            )
            )
        )
        )
        runAllReady()


        val playersSize = MediaPlayerData.players().size
        val playersSize = MediaPlayerData.players().size


        configListener.value.onConfigChanged(Configuration())
        configListener.value.onConfigChanged(Configuration())
        runAllReady()


        verify(pageIndicator).tintList =
            ColorStateList.valueOf(context.getColor(R.color.media_paging_indicator))
        assertEquals(playersSize, MediaPlayerData.players().size)
        assertEquals(playersSize, MediaPlayerData.players().size)
        assertEquals(
        assertEquals(
            MediaPlayerData.getMediaPlayerIndex("playing local"),
            MediaPlayerData.getMediaPlayerIndex("playing local"),
@@ -706,6 +724,93 @@ class MediaCarouselControllerTest : SysuiTestCase() {
        )
        )
    }
    }


    @Test
    fun testOnUiModeChanged_playersAreAddedBack() {
        mediaCarouselController.pageIndicator = pageIndicator

        listener.value.onMediaDataLoaded(
            "paused local",
            null,
            DATA.copy(
                active = true,
                isPlaying = false,
                playbackLocation = MediaData.PLAYBACK_LOCAL,
                resumption = false
            )
        )
        runAllReady()

        val playersSize = MediaPlayerData.players().size
        configListener.value.onUiModeChanged()
        runAllReady()

        verify(pageIndicator).tintList =
            ColorStateList.valueOf(context.getColor(R.color.media_paging_indicator))
        assertEquals(playersSize, MediaPlayerData.players().size)
        assertEquals(
            MediaPlayerData.getMediaPlayerIndex("paused local"),
            mediaCarouselController.mediaCarouselScrollHandler.visibleMediaIndex
        )
    }

    @Test
    fun testOnDensityOrFontScaleChanged_playersAreAddedBack() {
        mediaCarouselController.pageIndicator = pageIndicator

        listener.value.onMediaDataLoaded(
            "paused local",
            null,
            DATA.copy(
                active = true,
                isPlaying = false,
                playbackLocation = MediaData.PLAYBACK_LOCAL,
                resumption = false
            )
        )
        runAllReady()

        val playersSize = MediaPlayerData.players().size
        configListener.value.onDensityOrFontScaleChanged()
        runAllReady()

        verify(pageIndicator).tintList =
            ColorStateList.valueOf(context.getColor(R.color.media_paging_indicator))
        assertEquals(playersSize, MediaPlayerData.players().size)
        assertEquals(
            MediaPlayerData.getMediaPlayerIndex("paused local"),
            mediaCarouselController.mediaCarouselScrollHandler.visibleMediaIndex
        )
    }

    @Test
    fun testOnThemeChanged_playersAreAddedBack() {
        mediaCarouselController.pageIndicator = pageIndicator

        listener.value.onMediaDataLoaded(
            "paused local",
            null,
            DATA.copy(
                active = true,
                isPlaying = false,
                playbackLocation = MediaData.PLAYBACK_LOCAL,
                resumption = false
            )
        )
        runAllReady()

        val playersSize = MediaPlayerData.players().size
        configListener.value.onThemeChanged()
        runAllReady()

        verify(pageIndicator).tintList =
            ColorStateList.valueOf(context.getColor(R.color.media_paging_indicator))
        assertEquals(playersSize, MediaPlayerData.players().size)
        assertEquals(
            MediaPlayerData.getMediaPlayerIndex("paused local"),
            mediaCarouselController.mediaCarouselScrollHandler.visibleMediaIndex
        )
    }

    @Test
    @Test
    fun testRecommendation_persistentEnabled_newSmartspaceLoaded_updatesSort() {
    fun testRecommendation_persistentEnabled_newSmartspaceLoaded_updatesSort() {
        testRecommendation_persistentEnabled_inactiveSmartspaceDataLoaded_isAdded()
        testRecommendation_persistentEnabled_inactiveSmartspaceDataLoaded_isAdded()
@@ -832,4 +937,9 @@ class MediaCarouselControllerTest : SysuiTestCase() {
        // Verify that seekbar listening attribute in media control panel is set to false.
        // Verify that seekbar listening attribute in media control panel is set to false.
        verify(panel, times(MediaPlayerData.players().size)).listening = false
        verify(panel, times(MediaPlayerData.players().size)).listening = false
    }
    }

    private fun runAllReady() {
        backgroundExecutor.runAllReady()
        mainExecutor.runAllReady()
    }
}
}