@@ -371,6 +371,13 @@ class QueueBoard(
371371 TAG ,
372372 " Setting current queue; $mq ; ids: ${plr.currentMediaItem?.mediaId} , ${mediaItems[startIndex].mediaId} "
373373 )
374+
375+ val seed = try {
376+ CircularShuffleOrder .Persistent .deserialize(mq.shuffleOrder)
377+ } catch (e: Exception ) {
378+ plr.nextShuffleOrder = null
379+ throw e
380+ }
374381 /* *
375382 * current playing == jump target, do seamlessly
376383 */
@@ -380,6 +387,7 @@ class QueueBoard(
380387 Log .d(TAG , " Trying seamless queue switch. Is first song?: ${startIndex == 0 } " )
381388 val playerIndex = plr.currentMediaItemIndex
382389
390+ plr.replaceMediaItem(playerIndex, mediaItems[playerIndex]) // update current's metadata
383391 if (startIndex == 0 ) {
384392 // remove all songs before the currently playing one and then replace all the items after
385393 if (playerIndex > 0 ) {
@@ -397,28 +405,29 @@ class QueueBoard(
397405 mediaItems.subList(startIndex + 1 , mediaItems.size)
398406 )
399407 }
408+
409+ plr.exoPlayer.setShuffleOrder(seed.toFactory()(mq.startIndex, mq.getSize(), plr))
400410 } else {
401411 Log .d(TAG , " Seamless is not supported. Loading songs in directly" )
412+
413+ if (plr.shuffleModeEnabled && mq.shuffleOrder == null )
414+ Log .w(TAG , " Shuffle mode is enabled but no shuffle order is provided" )
415+
416+ if (plr.nextShuffleOrder != null )
417+ throw IllegalStateException (" shuffleFactory was found orphaned" )
418+
419+ plr.nextShuffleOrder = seed.toFactory()
420+
402421 plr.setMediaItems(
403422 mediaItems, startIndex,
404423 if (shouldResume) mq.startPositionMs else C .TIME_UNSET
405424 )
425+ if (plr.nextShuffleOrder != null )
426+ throw IllegalStateException (" shuffleFactory was not consumed during restore" )
406427 }
407428
408- if (plr.shuffleModeEnabled != mq.shuffleModeEnabled) {
409- if (plr.shuffleModeEnabled && mq.shuffleOrder == null ) {
410- Log .w(TAG , " Shuffle mode is enabled but no shuffle order is provided" )
411- }
412- plr.shuffleModeEnabled = mq.shuffleModeEnabled
413- mq.shuffleOrder?.let {
414- if (it != plr.exoPlayer.shuffleOrder) {
415- plr.exoPlayer.setShuffleOrder(it)
416- }
417- }
418- }
419- if (plr.repeatMode != mq.repeatMode) {
420- plr.repeatMode = mq.repeatMode
421- }
429+ plr.shuffleModeEnabled = mq.shuffleModeEnabled
430+ plr.repeatMode = mq.repeatMode
422431
423432 return startIndex
424433 }
@@ -441,13 +450,21 @@ class QueueBoard(
441450 return items
442451 }
443452
453+ /* *
454+ * Update the queue in QueueBoard with player attributes
455+ */
444456 private fun syncQueueFromPlayer (mq : MultiQueueObject ) {
445457 val plr = player.endedWorkaroundPlayer!!
446458 mq.startIndex = plr.currentMediaItemIndex
447459 mq.startPositionMs = plr.currentPosition
448460 mq.repeatMode = plr.repeatMode
449461 mq.shuffleModeEnabled = plr.shuffleModeEnabled
450- mq.shuffleOrder = plr.exoPlayer.shuffleOrder as CircularShuffleOrder
462+ val persistent = if (mq.shuffleModeEnabled) {
463+ CircularShuffleOrder .Persistent (plr.exoPlayer.shuffleOrder as CircularShuffleOrder )
464+ } else {
465+ null
466+ }
467+ mq.shuffleOrder = persistent?.toString()
451468 mq.queue.clear()
452469 mq.queue.addAll(dumpPlaylist())
453470 }
@@ -487,7 +504,7 @@ data class MultiQueueObject(
487504 var repeatMode : Int = 0 ,
488505 var shuffleModeEnabled : Boolean = false ,
489506
490- var shuffleOrder : CircularShuffleOrder ? = null ,
507+ var shuffleOrder : String ? = null ,
491508 var ended : Boolean = false ,
492509) {
493510 override fun toString () =
@@ -513,11 +530,6 @@ data class MultiQueueObject(
513530 return queue.fastFirstOrNull { it.mediaId == mediaId }
514531 }
515532
516- fun setCurrentQueuePos (index : Int ) {
517- // TODO: uhhh figure out shffle
518- startIndex = index
519- }
520-
521533 /* *
522534 * Retrieve the total duration of all songs
523535 *
@@ -552,8 +564,7 @@ data class MultiQueueObject(
552564 putInt(" repeatMode" , repeatMode)
553565 putBoolean(" shuffleModeEnabled" , shuffleModeEnabled)
554566 putBoolean(" ended" , ended)
555-
556- // TODO: shuffleOrder
567+ putString(" shuffleOrder" , shuffleOrder)
557568 }
558569
559570 companion object {
@@ -576,8 +587,7 @@ data class MultiQueueObject(
576587 repeatMode = bundle.getInt(" repeatMode" , REPEAT_MODE_OFF ),
577588 shuffleModeEnabled = bundle.getBoolean(" shuffleModeEnabled" ),
578589 ended = bundle.getBoolean(" ended" ),
579-
580- // TODO: shuffleOrder =
590+ shuffleOrder = bundle.getString(" shuffleOrder" ),
581591 )
582592 }
583593 }
0 commit comments