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

Commit fb3eedd1 authored by Michael Mikhail's avatar Michael Mikhail
Browse files

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
parent d3d710e8
Loading
Loading
Loading
Loading
+15 −5
Original line number Diff line number Diff line
@@ -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
+7 −0
Original line number Diff line number Diff line
@@ -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
+5 −0
Original line number Diff line number Diff line
@@ -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) {
+57 −0
Original line number Diff line number Diff line
@@ -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
    }
}