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

Unverified Commit 50532460 authored by Luca Stefani's avatar Luca Stefani Committed by Sebastiano Barezzi
Browse files

Twelve: Take into account the timeline for the queue

Change-Id: Iac8f4a3eaec66e0ed99b4d6eda2d418c52890291
parent ccdd16b5
Loading
Loading
Loading
Loading
+26 −7
Original line number Diff line number Diff line
@@ -157,15 +157,30 @@ fun Player.tracksFlow() = conflatedCallbackFlow {
    }
}

fun Player.mediaItemsShuffled() = currentTimeline.getFirstWindowIndex(shuffleModeEnabled).takeIf {
    it != C.INDEX_UNSET
}?.let { startIndex ->
    var index = startIndex
    buildList {
        repeat(currentTimeline.windowCount) {
            add(getMediaItemAt(index))
            index = currentTimeline.getNextWindowIndex(
                index, Player.REPEAT_MODE_OFF, shuffleModeEnabled
            )
        }
    }.let { items ->
        items.indexOfFirst { getMediaItemAt(currentMediaItemIndex) == it } to items
    }
} ?: (currentMediaItemIndex to mediaItems)

fun Player.queueFlow() = conflatedCallbackFlow {
    val emitQueue = {
        val currentMediaItemIndex = currentMediaItemIndex

        trySend(
            mediaItems.mapIndexed { index, mediaItem ->
                QueueItem(mediaItem, index == currentMediaItemIndex)
            }
        val (currentIndex, mediaItems) = mediaItemsShuffled()
        trySend(mediaItems.mapIndexed { index, mediaItem ->
            QueueItem(
                mediaItem = mediaItem, isCurrent = index == currentIndex
            )
        })
    }

    val listener = object : Player.Listener {
@@ -176,6 +191,10 @@ fun Player.queueFlow() = conflatedCallbackFlow {
        override fun onMediaItemTransition(mediaItem: MediaItem?, reason: Int) {
            emitQueue()
        }

        override fun onShuffleModeEnabledChanged(shuffleModeEnabled: Boolean) {
            emitQueue()
        }
    }

    addListener(listener)