Settings for iOS/macOS

This commit is contained in:
Arkadiusz Fal
2021-09-25 10:18:22 +02:00
parent 433725c5e8
commit a7da3b9468
64 changed files with 1998 additions and 665 deletions

View File

@@ -5,7 +5,7 @@ struct PlaybackBar: View {
let video: Video
@Environment(\.dismiss) private var dismiss
@EnvironmentObject private var playbackState: PlaybackState
@EnvironmentObject private var playback: PlaybackModel
var body: some View {
HStack {
@@ -18,7 +18,7 @@ struct PlaybackBar: View {
.frame(minWidth: 60, maxWidth: .infinity)
VStack {
if playbackState.stream != nil {
if playback.stream != nil {
Text(currentStreamString)
} else {
if video.live {
@@ -38,19 +38,19 @@ struct PlaybackBar: View {
}
var currentStreamString: String {
playbackState.stream != nil ? "\(playbackState.stream!.resolution.height)p" : ""
playback.stream != nil ? "\(playback.stream!.resolution.height)p" : ""
}
var playbackStatus: String {
guard playbackState.time != nil else {
if playbackState.live {
guard playback.time != nil else {
if playback.live {
return "LIVE"
} else {
return "loading..."
}
}
let remainingSeconds = video.length - playbackState.time!.seconds
let remainingSeconds = video.length - playback.time!.seconds
if remainingSeconds < 60 {
return "less than a minute"

View File

@@ -1,7 +1,9 @@
import Defaults
import SwiftUI
struct Player: UIViewControllerRepresentable {
@EnvironmentObject<PlaybackState> private var playbackState
@EnvironmentObject<InvidiousAPI> private var api
@EnvironmentObject<PlaybackModel> private var playback
var video: Video?
@@ -9,7 +11,10 @@ struct Player: UIViewControllerRepresentable {
let controller = PlayerViewController()
controller.video = video
controller.playbackState = playbackState
controller.playback = playback
controller.api = api
controller.resolution = Defaults[.quality]
return controller
}

View File

@@ -5,11 +5,13 @@ import SwiftUI
final class PlayerViewController: UIViewController {
var video: Video!
var api: InvidiousAPI!
var playerLoaded = false
var player = AVPlayer()
var playerState: PlayerState!
var playbackState: PlaybackState!
var playerModel: PlayerModel!
var playback: PlaybackModel!
var playerViewController = AVPlayerViewController()
var resolution: Stream.ResolutionSetting!
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
@@ -22,7 +24,7 @@ final class PlayerViewController: UIViewController {
override func viewDidDisappear(_ animated: Bool) {
#if os(iOS)
if !playerState.playingOutsideViewController {
if !playerModel.playingOutsideViewController {
playerViewController.player?.replaceCurrentItem(with: nil)
playerViewController.player = nil
@@ -34,15 +36,15 @@ final class PlayerViewController: UIViewController {
}
func loadPlayer() {
playerState = PlayerState(playbackState: playbackState)
playerModel = PlayerModel(playback: playback, api: api, resolution: resolution)
guard !playerLoaded else {
return
}
playerState.player = player
playerViewController.player = playerState.player
playerState.loadVideo(video)
playerModel.player = player
playerViewController.player = playerModel.player
playerModel.loadVideo(video)
#if os(tvOS)
present(playerViewController, animated: false)
@@ -95,7 +97,7 @@ extension PlayerViewController: AVPlayerViewControllerDelegate {
}
func playerViewControllerDidEndDismissalTransition(_: AVPlayerViewController) {
playerState.playingOutsideViewController = false
playerModel.playingOutsideViewController = false
dismiss(animated: false)
}
@@ -103,7 +105,7 @@ extension PlayerViewController: AVPlayerViewControllerDelegate {
_: AVPlayerViewController,
willBeginFullScreenPresentationWithAnimationCoordinator _: UIViewControllerTransitionCoordinator
) {
playerState.playingOutsideViewController = true
playerModel.playingOutsideViewController = true
}
func playerViewController(
@@ -112,7 +114,7 @@ extension PlayerViewController: AVPlayerViewControllerDelegate {
) {
coordinator.animate(alongsideTransition: nil) { context in
if !context.isCancelled {
self.playerState.playingOutsideViewController = false
self.playerModel.playingOutsideViewController = false
#if os(iOS)
if self.traitCollection.verticalSizeClass == .compact {
@@ -124,10 +126,10 @@ extension PlayerViewController: AVPlayerViewControllerDelegate {
}
func playerViewControllerWillStartPictureInPicture(_: AVPlayerViewController) {
playerState.playingOutsideViewController = true
playerModel.playingOutsideViewController = true
}
func playerViewControllerWillStopPictureInPicture(_: AVPlayerViewController) {
playerState.playingOutsideViewController = false
playerModel.playingOutsideViewController = false
}
}

View File

@@ -2,7 +2,7 @@ import Foundation
import SwiftUI
struct VideoDetails: View {
@EnvironmentObject<Subscriptions> private var subscriptions
@EnvironmentObject<SubscriptionsModel> private var subscriptions
@State private var subscribed = false
@State private var confirmationShown = false
@@ -186,6 +186,6 @@ struct VideoDetails: View {
struct VideoDetails_Previews: PreviewProvider {
static var previews: some View {
VideoDetails(video: Video.fixture)
.environmentObject(Subscriptions())
.environmentObject(SubscriptionsModel())
}
}

View File

@@ -12,31 +12,31 @@ struct VideoPlayerView: View {
#endif
}
@EnvironmentObject<NavigationState> private var navigationState
@EnvironmentObject<PlaybackState> private var playbackState
@ObservedObject private var store = Store<Video>()
@StateObject private var store = Store<Video>()
#if os(iOS)
@Environment(\.verticalSizeClass) private var verticalSizeClass
#endif
@EnvironmentObject<InvidiousAPI> private var api
@EnvironmentObject<NavigationModel> private var navigation
@EnvironmentObject<PlaybackModel> private var playback
var resource: Resource {
InvidiousAPI.shared.video(video.id)
api.video(video.id)
}
var video: Video
init(_ video: Video) {
self.video = video
resource.addObserver(store)
}
var body: some View {
VStack(spacing: 0) {
#if os(tvOS)
Player(video: video)
.environmentObject(playbackState)
.environmentObject(playback)
#else
GeometryReader { geometry in
VStack(spacing: 0) {
@@ -49,8 +49,8 @@ struct VideoPlayerView: View {
#endif
Player(video: video)
.environmentObject(playbackState)
.modifier(VideoPlayerSizeModifier(geometry: geometry, aspectRatio: playbackState.aspectRatio))
.environmentObject(playback)
.modifier(VideoPlayerSizeModifier(geometry: geometry, aspectRatio: playback.aspectRatio))
}
.background(.black)
@@ -73,13 +73,13 @@ struct VideoPlayerView: View {
}
#endif
}
.modifier(VideoDetailsPaddingModifier(geometry: geometry, aspectRatio: playbackState.aspectRatio))
.modifier(VideoDetailsPaddingModifier(geometry: geometry, aspectRatio: playback.aspectRatio))
}
.animation(.linear(duration: 0.2), value: playbackState.aspectRatio)
.animation(.linear(duration: 0.2), value: playback.aspectRatio)
#endif
}
.onAppear {
resource.addObserver(store)
resource.loadIfNeeded()
}
.onDisappear {
@@ -109,7 +109,7 @@ struct VideoPlayerView_Previews: PreviewProvider {
}
.sheet(isPresented: .constant(true)) {
VideoPlayerView(Video.fixture)
.environmentObject(NavigationState())
.environmentObject(NavigationModel())
}
}
}