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

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

Change-Id: I141819553a9b5b94bb169d1901e3e1343660e035
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Michael Mikhail
2023-02-23 00:59:08 +00:00
committed by Automerger Merge Worker
2 changed files with 172 additions and 51 deletions

View File

@@ -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,36 +694,16 @@ constructor(
} else { } else {
needsReordering = true needsReordering = true
} }
} else { updatePageIndicator()
existingPlayer.bindPlayer(data, key) mediaCarouselScrollHandler.onPlayersChanged()
MediaPlayerData.addMediaPlayer( mediaFrame.requiresRemeasuring = true
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 createMediaViewHolderInBg(): MediaViewHolder {
return MediaViewHolder.create(LayoutInflater.from(context), mediaContent)
}
private fun addSmartspaceMediaRecommendations( private fun addSmartspaceMediaRecommendations(
key: String, key: String,
@@ -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(

View File

@@ -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()
}
} }