Expose iPhone playback controls

This commit is contained in:
diyaa
2026-06-16 02:11:24 +02:00
parent 295c6c1d9b
commit e147ce38be
7 changed files with 993 additions and 131 deletions
@@ -105,10 +105,22 @@ public struct PlaybackQueue: Hashable, Sendable {
queuedTrackIDs preferredQueuedTrackIDs: [String]? = nil
) {
isShuffleEnabled = isEnabled
let nextQueuedTrackIDs: [String]?
if isEnabled {
nextQueuedTrackIDs = preferredQueuedTrackIDs
?? Self.makeShuffledTrackIDs(
from: catalogTrackIDs,
currentTrackID: currentTrackID
)
} else {
nextQueuedTrackIDs = preferredQueuedTrackIDs
}
replaceTrackIDs(
catalogTrackIDs,
currentTrackID: currentTrackID,
queuedTrackIDs: preferredQueuedTrackIDs
queuedTrackIDs: nextQueuedTrackIDs
)
}
@@ -8,10 +8,10 @@ public enum PlaybackRepeatMode: String, Codable, CaseIterable, Hashable, Sendabl
public var nextMode: PlaybackRepeatMode {
switch self {
case .off:
.all
case .all:
.one
case .one:
.all
case .all:
.off
}
}
@@ -41,6 +41,19 @@ final class PlaybackQueueTests: XCTestCase {
XCTAssertEqual(queue.currentTrackID, "c")
}
func testEnablingShuffleKeepsCurrentTrackSelectedAndAtQueueFront() {
var queue = PlaybackQueue(trackIDs: ["a", "b", "c", "d"])
queue.selectTrack("c")
queue.setShuffleEnabled(true)
XCTAssertTrue(queue.isShuffleEnabled)
XCTAssertEqual(queue.currentTrackID, "c")
XCTAssertEqual(queue.queuedTrackIDs.first, "c")
XCTAssertEqual(Set(queue.queuedTrackIDs), Set(["a", "b", "c", "d"]))
XCTAssertEqual(Set(queue.queuedTrackIDs).count, 4)
}
func testRepeatAllWrapsAroundQueueBoundaries() {
var queue = PlaybackQueue(trackIDs: ["a", "b", "c"])
queue.selectTrack("c")
@@ -63,6 +76,21 @@ final class PlaybackQueueTests: XCTestCase {
XCTAssertEqual(queue.moveToPreviousTrack(), "b")
}
func testCycleRepeatModeUsesOffOneAllOrder() {
var queue = PlaybackQueue(trackIDs: ["a", "b"])
XCTAssertEqual(queue.repeatMode, .off)
queue.cycleRepeatMode()
XCTAssertEqual(queue.repeatMode, .one)
queue.cycleRepeatMode()
XCTAssertEqual(queue.repeatMode, .all)
queue.cycleRepeatMode()
XCTAssertEqual(queue.repeatMode, .off)
}
func testReplacingTrackIDsDropsRemovedTracksFromQueue() {
var queue = PlaybackQueue(
trackIDs: ["a", "b", "c"],