Skip to content

Commit 02e20d1

Browse files
committed
nick is going to kill me
1 parent 1e99cc8 commit 02e20d1

4 files changed

Lines changed: 51 additions & 27 deletions

File tree

app/src/main/java/org/akanework/gramophone/logic/GramophoneExtensions.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ import org.akanework.gramophone.logic.utils.AudioFormatDetector
9292
import org.akanework.gramophone.logic.utils.AudioTrackInfo
9393
import org.akanework.gramophone.logic.utils.BtCodecInfo
9494
import org.akanework.gramophone.logic.utils.CalculationUtils
95+
import org.akanework.gramophone.logic.utils.CircularShuffleOrder
9596
import org.akanework.gramophone.logic.utils.ReplayGainUtil
9697
import org.akanework.gramophone.logic.utils.SemanticLyrics
9798
import org.akanework.gramophone.ui.MainActivity
@@ -415,7 +416,7 @@ fun MediaController.getQueueForUi(index: Int = C.INDEX_UNSET): Pair<MutableList<
415416
val indexes: MutableList<Int> = if (mq.shuffleOrder == null) {
416417
(0 until mq.getSize()).toMutableList()
417418
} else {
418-
shuffledIndices(mq.shuffleOrder!!)
419+
getIntArray("shuffleIndexes")!!.toMutableList()
419420
}
420421

421422
Pair(indexes, items)

app/src/main/java/org/akanework/gramophone/logic/GramophonePlaybackService.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -901,6 +901,17 @@ class GramophonePlaybackService : MediaLibraryService(), MediaSessionService.Lis
901901
val queueList: List<MultiQueueObject> = qb.getQueue(index)
902902
val binder = BundleListRetriever(queueList.map { it.toBundle() })
903903
res.extras.putBinder("allQueues", binder)
904+
905+
// assume ui does not expect shuffleIndexes if shuffle is off
906+
if (!queueList.isEmpty()) {
907+
val mq = queueList.first()
908+
val factory =
909+
CircularShuffleOrder.Persistent.deserialize(mq.shuffleOrder)
910+
.toFactory()
911+
val shuffleOrder = factory(0, mq.getSize(), endedWorkaroundPlayer!!)
912+
val shuffleIndexesList: List<Int> = shuffledIndices(shuffleOrder)
913+
res.extras.putIntArray("shuffleIndexes", shuffleIndexesList.toIntArray())
914+
}
904915
}
905916
}
906917

app/src/main/java/org/akanework/gramophone/logic/QueueBoard.kt

Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

app/src/main/java/org/akanework/gramophone/ui/components/ComposeComponentsTemp.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ import androidx.compose.foundation.shape.RoundedCornerShape
2323
import androidx.compose.material.icons.Icons
2424
import androidx.compose.material.icons.automirrored.rounded.List
2525
import androidx.compose.material.icons.rounded.DragHandle
26+
import androidx.compose.material.icons.rounded.ExpandLess
27+
import androidx.compose.material.icons.rounded.ExpandMore
2628
import androidx.compose.material.icons.rounded.MusicNote
2729
import androidx.compose.material3.Icon
2830
import androidx.compose.material3.IconButton
@@ -198,7 +200,7 @@ fun MqContent(
198200
modifier = Modifier.padding(vertical = 6.dp)
199201
) {
200202
Icon(
201-
painter = painterResource(if (mqExpand) R.drawable.baseline_arrow_upward_24 else R.drawable.ic_expand_more),
203+
imageVector = if (mqExpand) Icons.Rounded.ExpandLess else Icons.Rounded.ExpandMore,
202204
contentDescription = null,
203205
)
204206
}

0 commit comments

Comments
 (0)