Loading packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselController.kt +58 −47 Original line number Original line Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading @@ -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, Loading Loading @@ -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, Loading Loading @@ -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( Loading Loading @@ -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( Loading Loading @@ -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( Loading @@ -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( Loading packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaCarouselControllerTest.kt +114 −4 Original line number Original line Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading Loading @@ -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 Loading @@ -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, Loading @@ -126,7 +130,8 @@ class MediaCarouselControllerTest : SysuiTestCase() { mediaHostStatesManager, mediaHostStatesManager, activityStarter, activityStarter, clock, clock, executor, mainExecutor, backgroundExecutor, mediaDataManager, mediaDataManager, configurationController, configurationController, falsingCollector, falsingCollector, Loading Loading @@ -401,6 +406,7 @@ class MediaCarouselControllerTest : SysuiTestCase() { resumption = true resumption = true ) ) ) ) runAllReady() assertEquals( assertEquals( MediaPlayerData.getMediaPlayerIndex("paused local"), MediaPlayerData.getMediaPlayerIndex("paused local"), Loading Loading @@ -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", Loading @@ -531,6 +539,7 @@ class MediaCarouselControllerTest : SysuiTestCase() { resumption = false resumption = false ) ) ) ) runAllReady() assertEquals( assertEquals( MediaPlayerData.getMediaPlayerIndex("paused local"), MediaPlayerData.getMediaPlayerIndex("paused local"), Loading @@ -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( Loading @@ -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) } } Loading Loading @@ -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, Loading @@ -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"), Loading @@ -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() Loading Loading @@ -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() } } } Loading
packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselController.kt +58 −47 Original line number Original line Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading @@ -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, Loading Loading @@ -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, Loading Loading @@ -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( Loading Loading @@ -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( Loading Loading @@ -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( Loading @@ -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( Loading
packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaCarouselControllerTest.kt +114 −4 Original line number Original line Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading Loading @@ -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 Loading @@ -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, Loading @@ -126,7 +130,8 @@ class MediaCarouselControllerTest : SysuiTestCase() { mediaHostStatesManager, mediaHostStatesManager, activityStarter, activityStarter, clock, clock, executor, mainExecutor, backgroundExecutor, mediaDataManager, mediaDataManager, configurationController, configurationController, falsingCollector, falsingCollector, Loading Loading @@ -401,6 +406,7 @@ class MediaCarouselControllerTest : SysuiTestCase() { resumption = true resumption = true ) ) ) ) runAllReady() assertEquals( assertEquals( MediaPlayerData.getMediaPlayerIndex("paused local"), MediaPlayerData.getMediaPlayerIndex("paused local"), Loading Loading @@ -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", Loading @@ -531,6 +539,7 @@ class MediaCarouselControllerTest : SysuiTestCase() { resumption = false resumption = false ) ) ) ) runAllReady() assertEquals( assertEquals( MediaPlayerData.getMediaPlayerIndex("paused local"), MediaPlayerData.getMediaPlayerIndex("paused local"), Loading @@ -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( Loading @@ -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) } } Loading Loading @@ -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, Loading @@ -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"), Loading @@ -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() Loading Loading @@ -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() } } }