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
This commit is contained in:
Michael Mikhail
2023-02-13 14:15:25 +00:00
parent d3d710e837
commit fb3eedd1d2
4 changed files with 84 additions and 5 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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) {

View File

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