diff options
| author | 2023-02-13 14:15:25 +0000 | |
|---|---|---|
| committer | 2023-02-14 02:08:29 +0000 | |
| commit | fb3eedd1d267497b94045a02b091ba96c437798f (patch) | |
| tree | 0443bd272039e21d5b5dcc7378b7b76d7e402b0b | |
| parent | d3d710e83784713a458be2fd23419c5a3b9f1e77 (diff) | |
Set seekbar listening when UMO is visible to user
CurrentlyExpanded is always true. So listening attribute in
seekbarViewModel is always true. This makes SystemUI execute a runnable
repeatedly.
A listener is added to MediaScrollViewHolder to update players seekbar
whenever visibleToUser attribute is updated to make sure that listening
attribute is false when UMO is not visible to user.
Bug: 268191023
Test: atest MediaCaroselControllerTest
Change-Id: I3296cd6b560fa886b2fdb1dc11634a4df746fde9
4 files changed, 84 insertions, 5 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselController.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselController.kt index b72923a5d22c..3ac88753ab83 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselController.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselController.kt @@ -164,13 +164,13 @@ constructor( mediaCarouselScrollHandler.scrollToStart() } } - private var currentlyExpanded = true + + @VisibleForTesting + var currentlyExpanded = true set(value) { if (field != value) { field = value - for (player in MediaPlayerData.players()) { - player.setListening(field) - } + updateSeekbarListening(mediaCarouselScrollHandler.visibleToUser) } } @@ -259,6 +259,7 @@ constructor( executor, this::onSwipeToDismiss, this::updatePageIndicatorLocation, + this::updateSeekbarListening, this::closeGuts, falsingCollector, falsingManager, @@ -618,7 +619,9 @@ constructor( ) newPlayer.mediaViewHolder?.player?.setLayoutParams(lp) newPlayer.bindPlayer(data, key) - newPlayer.setListening(currentlyExpanded) + newPlayer.setListening( + mediaCarouselScrollHandler.visibleToUser && currentlyExpanded + ) MediaPlayerData.addMediaPlayer( key, data, @@ -914,6 +917,13 @@ constructor( .toFloat() } + /** Update listening to seekbar. */ + private fun updateSeekbarListening(visibleToUser: Boolean) { + for (player in MediaPlayerData.players()) { + player.setListening(visibleToUser && currentlyExpanded) + } + } + /** Update the dimension of this carousel. */ private fun updateCarouselDimensions() { var width = 0 diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselScrollHandler.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselScrollHandler.kt index 36b2eda65fab..1ace3168780a 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselScrollHandler.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselScrollHandler.kt @@ -57,6 +57,7 @@ class MediaCarouselScrollHandler( private val mainExecutor: DelayableExecutor, val dismissCallback: () -> Unit, private var translationChangedListener: () -> Unit, + private var seekBarUpdateListener: (visibleToUser: Boolean) -> Unit, private val closeGuts: (immediate: Boolean) -> Unit, private val falsingCollector: FalsingCollector, private val falsingManager: FalsingManager, @@ -177,6 +178,12 @@ class MediaCarouselScrollHandler( /** Whether the media card is visible to user if any */ var visibleToUser: Boolean = false + set(value) { + if (field != value) { + field = value + seekBarUpdateListener.invoke(field) + } + } /** Whether the quick setting is expanded or not */ var qsExpanded: Boolean = false diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java index 7f420a8d1055..767706209475 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java @@ -346,6 +346,11 @@ public class MediaControlPanel { mSeekBarViewModel.setListening(listening); } + @VisibleForTesting + public boolean getListening() { + return mSeekBarViewModel.getListening(); + } + /** Sets whether the user is touching the seek bar to change the track position. */ private void setIsScrubbing(boolean isScrubbing) { if (mMediaData == null || mMediaData.getSemanticActions() == null) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaCarouselControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaCarouselControllerTest.kt index 997198e116c0..0f19fc003a5e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaCarouselControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaCarouselControllerTest.kt @@ -69,6 +69,8 @@ import org.mockito.Captor import org.mockito.Mock import org.mockito.Mockito.floatThat import org.mockito.Mockito.mock +import org.mockito.Mockito.reset +import org.mockito.Mockito.times import org.mockito.Mockito.verify import org.mockito.Mockito.`when` as whenever import org.mockito.MockitoAnnotations @@ -796,4 +798,59 @@ class MediaCarouselControllerTest : SysuiTestCase() { job.cancel() } + + @Test + fun testInvisibleToUserAndExpanded_playersNotListening() { + // Add players to carousel. + testPlayerOrdering() + + // Make the carousel visible to user in expanded layout. + mediaCarouselController.currentlyExpanded = true + mediaCarouselController.mediaCarouselScrollHandler.visibleToUser = true + + // panel is the player for each MediaPlayerData. + // Verify that seekbar listening attribute in media control panel is set to true. + verify(panel, times(MediaPlayerData.players().size)).listening = true + + // Make the carousel invisible to user. + mediaCarouselController.mediaCarouselScrollHandler.visibleToUser = false + + // panel is the player for each MediaPlayerData. + // Verify that seekbar listening attribute in media control panel is set to false. + verify(panel, times(MediaPlayerData.players().size)).listening = false + } + + @Test + fun testVisibleToUserAndExpanded_playersListening() { + // Add players to carousel. + testPlayerOrdering() + + // Make the carousel visible to user in expanded layout. + mediaCarouselController.currentlyExpanded = true + mediaCarouselController.mediaCarouselScrollHandler.visibleToUser = true + + // panel is the player for each MediaPlayerData. + // Verify that seekbar listening attribute in media control panel is set to true. + verify(panel, times(MediaPlayerData.players().size)).listening = true + } + + @Test + fun testUMOCollapsed_playersNotListening() { + // Add players to carousel. + testPlayerOrdering() + + // Make the carousel in collapsed layout. + mediaCarouselController.currentlyExpanded = false + + // panel is the player for each MediaPlayerData. + // Verify that seekbar listening attribute in media control panel is set to false. + verify(panel, times(MediaPlayerData.players().size)).listening = false + + // Make the carousel visible to user. + reset(panel) + mediaCarouselController.mediaCarouselScrollHandler.visibleToUser = true + + // Verify that seekbar listening attribute in media control panel is set to false. + verify(panel, times(MediaPlayerData.players().size)).listening = false + } } |