Fix tvOS streams selection

This commit is contained in:
Arkadiusz Fal
2021-10-18 23:53:02 +02:00
parent ec395ff2e0
commit 00d706766c
8 changed files with 46 additions and 43 deletions

View File

@@ -22,8 +22,8 @@ final class PlayerModel: ObservableObject {
@Published var stream: Stream?
@Published var currentRate: Float?
@Published var availableStreams = [Stream]()
@Published var streamSelection: Stream?
@Published var availableStreams = [Stream]() { didSet { rebuildStreamsMenu() } }
@Published var streamSelection: Stream? { didSet { rebuildStreamsMenu() } }
@Published var queue = [PlayerQueueItem]()
@Published var currentItem: PlayerQueueItem!

View File

@@ -1,5 +1,6 @@
import Foundation
import Siesta
import SwiftUI
extension PlayerModel {
var isLoadingAvailableStreams: Bool {
@@ -85,12 +86,47 @@ extension PlayerModel {
completionHandler: @escaping ([Stream]) -> Void
) {
instancesWithLoadedStreams.append(instance)
rebuildStreamsMenu()
if instances.all.count == instancesWithLoadedStreams.count {
completionHandler(streams.sorted { $0.kind < $1.kind })
}
}
#if os(tvOS)
var streamsMenu: UIMenu {
UIMenu(
title: "Streams",
image: UIImage(systemName: "antenna.radiowaves.left.and.right"),
children: streamsMenuActions
)
}
var streamsMenuActions: [UIAction] {
guard !availableStreams.isEmpty else {
return [ // swiftlint:disable:this implicit_return
UIAction(title: "Empty", attributes: .disabled) { _ in }
]
}
return availableStreamsSorted.map { stream in
let state = stream == streamSelection ? UIAction.State.on : .off
return UIAction(title: stream.description, state: state) { _ in
self.streamSelection = stream
self.upgradeToStream(stream)
}
}
}
#endif
func rebuildStreamsMenu() {
#if os(tvOS)
avPlayerViewController?.transportBarCustomMenuItems = [streamsMenu]
#endif
}
func streamsWithInstance(instance: Instance, streams: [Stream]) -> [Stream] {
streams.map { stream in
stream.instance = instance