diff --git a/JellyfinPlayer tvOS/Views/ItemView/EpisodesRowView.swift b/JellyfinPlayer tvOS/Views/ItemView/EpisodesRowView.swift index e0731189..1f1faf17 100644 --- a/JellyfinPlayer tvOS/Views/ItemView/EpisodesRowView.swift +++ b/JellyfinPlayer tvOS/Views/ItemView/EpisodesRowView.swift @@ -63,6 +63,7 @@ struct EpisodesRowView: View { .padding(.horizontal, 50) .padding(.vertical) .onAppear { + // TODO: Get this working reader.scrollTo(viewModel.item.name) } } diff --git a/JellyfinPlayer tvOS/Views/ItemView/ItemView.swift b/JellyfinPlayer tvOS/Views/ItemView/ItemView.swift index be61887f..cc523200 100644 --- a/JellyfinPlayer tvOS/Views/ItemView/ItemView.swift +++ b/JellyfinPlayer tvOS/Views/ItemView/ItemView.swift @@ -5,9 +5,10 @@ * Copyright 2021 Aiden Vigue & Jellyfin Contributors */ -import SwiftUI +import Defaults import Introspect import JellyfinAPI +import SwiftUI // Useless view necessary in tvOS because of iOS's implementation struct ItemNavigationView: View { @@ -23,6 +24,10 @@ struct ItemNavigationView: View { } struct ItemView: View { + + @Default(.tvOSEpisodeItemCinematicView) var tvOSEpisodeItemCinematicView + @Default(.tvOSMovieItemCinematicView) var tvOSMovieItemCinematicView + private var item: BaseItemDto init(item: BaseItemDto) { @@ -32,13 +37,21 @@ struct ItemView: View { var body: some View { Group { if item.type == "Movie" { - CinematicMovieItemView(viewModel: MovieItemViewModel(item: item)) + if tvOSMovieItemCinematicView { + CinematicMovieItemView(viewModel: MovieItemViewModel(item: item)) + } else { + MovieItemView(viewModel: MovieItemViewModel(item: item)) + } } else if item.type == "Series" { SeriesItemView(viewModel: .init(item: item)) } else if item.type == "Season" { SeasonItemView(viewModel: .init(item: item)) } else if item.type == "Episode" { - CinematicEpisodeItemView(viewModel: EpisodeItemViewModel(item: item)) + if tvOSEpisodeItemCinematicView { + CinematicEpisodeItemView(viewModel: EpisodeItemViewModel(item: item)) + } else { + EpisodeItemView(viewModel: EpisodeItemViewModel(item: item)) + } } else { Text(L10n.notImplementedYetWithType(item.type ?? "")) } diff --git a/JellyfinPlayer tvOS/Views/SettingsView/SettingsView.swift b/JellyfinPlayer tvOS/Views/SettingsView/SettingsView.swift index a211cd19..d76d20e3 100644 --- a/JellyfinPlayer tvOS/Views/SettingsView/SettingsView.swift +++ b/JellyfinPlayer tvOS/Views/SettingsView/SettingsView.swift @@ -20,6 +20,8 @@ struct SettingsView: View { @Default(.videoPlayerJumpBackward) var jumpBackwardLength @Default(.downActionShowsMenu) var downActionShowsMenu @Default(.confirmClose) var confirmClose + @Default(.tvOSEpisodeItemCinematicView) var tvOSEpisodeItemCinematicView + @Default(.tvOSMovieItemCinematicView) var tvOSMovieItemCinematicView var body: some View { GeometryReader { reader in @@ -37,6 +39,7 @@ struct SettingsView: View { Text(viewModel.user.username) .foregroundColor(.jellyfinPurple) } + .focusable() Button { settingsRouter.route(to: \.serverDetail) @@ -101,6 +104,13 @@ struct SettingsView: View { } } } + + Section { + Toggle("Episode Item Cinematic View", isOn: $tvOSEpisodeItemCinematicView) + Toggle("Movie Item Cinematic View", isOn: $tvOSMovieItemCinematicView) + } header: { + Text("Views") + } } } } diff --git a/JellyfinPlayer tvOS/Views/VideoPlayer/VLCPlayerViewController.swift b/JellyfinPlayer tvOS/Views/VideoPlayer/VLCPlayerViewController.swift index 451b664e..6c5964da 100644 --- a/JellyfinPlayer tvOS/Views/VideoPlayer/VLCPlayerViewController.swift +++ b/JellyfinPlayer tvOS/Views/VideoPlayer/VLCPlayerViewController.swift @@ -196,7 +196,7 @@ class VLCPlayerViewController: UIViewController { guard let buttonPress = presses.first?.type else { return } switch(buttonPress) { - case .menu: () // Captured by other gesture + case .menu: () // Captured by other recognizer case .playPause: hideConfirmCloseOverlay() @@ -207,13 +207,6 @@ class VLCPlayerViewController: UIViewController { didGenerallyTap() case .upArrow: hideConfirmCloseOverlay() - - if displayingContentOverlay { - hideOverlayContent() - - showOverlay() - restartOverlayDismissTimer() - } case .downArrow: hideConfirmCloseOverlay() @@ -776,6 +769,8 @@ extension VLCPlayerViewController: PlayerOverlayDelegate { case .playing: viewModel.sendPauseReport(paused: true) vlcMediaPlayer.pause() + + showOverlay() restartOverlayDismissTimer(interval: 5) case .paused: viewModel.sendPauseReport(paused: false) diff --git a/JellyfinPlayer tvOS/Views/VideoPlayer/tvOSSLider/SliderView.swift b/JellyfinPlayer tvOS/Views/VideoPlayer/tvOSSLider/SliderView.swift index aebb9831..cb7f3535 100644 --- a/JellyfinPlayer tvOS/Views/VideoPlayer/tvOSSLider/SliderView.swift +++ b/JellyfinPlayer tvOS/Views/VideoPlayer/tvOSSLider/SliderView.swift @@ -32,6 +32,7 @@ struct SliderView: UIViewRepresentable { slider.minimumTrackTintColor = .white slider.focusScaleFactor = 1.4 slider.panDampingValue = 50 + slider.fineTunningVelocityThreshold = 1000 return slider } diff --git a/JellyfinPlayer tvOS/Views/VideoPlayer/tvOSSLider/tvOSSlider.swift b/JellyfinPlayer tvOS/Views/VideoPlayer/tvOSSLider/tvOSSlider.swift index 77d08528..79db94e5 100644 --- a/JellyfinPlayer tvOS/Views/VideoPlayer/tvOSSLider/tvOSSlider.swift +++ b/JellyfinPlayer tvOS/Views/VideoPlayer/tvOSSLider/tvOSSlider.swift @@ -33,7 +33,6 @@ private let defaultFocusScaleFactor: CGFloat = 1.05 private let defaultStepValue: Float = 0.1 private let decelerationRate: Float = 0.92 private let decelerationMaxVelocity: Float = 1000 -private let fineTunningVelocityThreshold: Float = 600 /// A control used to select a single value from a continuous range of values. public final class TvOSSlider: UIControl { @@ -117,6 +116,8 @@ public final class TvOSSlider: UIControl { // Size for thumb view public var thumbSize: CGFloat = 30 + public var fineTunningVelocityThreshold: Float = 600 + /** Sets the slider’s current value, allowing you to animate the change visually. diff --git a/Shared/SwiftfinStore/SwiftfinStoreDefaults.swift b/Shared/SwiftfinStore/SwiftfinStoreDefaults.swift index 79393781..9a9400be 100644 --- a/Shared/SwiftfinStore/SwiftfinStoreDefaults.swift +++ b/Shared/SwiftfinStore/SwiftfinStoreDefaults.swift @@ -60,4 +60,6 @@ extension Defaults.Keys { // tvos specific static let downActionShowsMenu = Key("downActionShowsMenu", default: true, suite: SwiftfinStore.Defaults.generalSuite) static let confirmClose = Key("confirmClose", default: false, suite: SwiftfinStore.Defaults.generalSuite) + static let tvOSEpisodeItemCinematicView = Key("tvOSEpisodeItemCinematicView", default: false, suite: SwiftfinStore.Defaults.generalSuite) + static let tvOSMovieItemCinematicView = Key("tvOSMovieItemCinematicView", default: false, suite: SwiftfinStore.Defaults.generalSuite) } diff --git a/Shared/ViewModels/ConnectToServerViewModel.swift b/Shared/ViewModels/ConnectToServerViewModel.swift index b28581a8..378c297b 100644 --- a/Shared/ViewModels/ConnectToServerViewModel.swift +++ b/Shared/ViewModels/ConnectToServerViewModel.swift @@ -48,6 +48,8 @@ final class ConnectToServerViewModel: ViewModel { uri = "http://localhost:8096" } #endif + + let uri = uri.trimmingCharacters(in: .whitespaces) LogManager.shared.log.debug("Attempting to connect to server at \"\(uri)\"", tag: "connectToServer") SessionManager.main.connectToServer(with: uri)