This commit is contained in:
Trey t
2023-07-05 09:20:25 -05:00
parent eaa6997c18
commit 0e687036b6
6 changed files with 116 additions and 82 deletions

View File

@@ -72,7 +72,10 @@ struct AddExerciseView: View {
filteredExercises = exercises
}
.sheet(item: $videoExercise) { exercise in
VideoPlayerView(avPlayer: $avPlayer)
PlayerView(player: $avPlayer)
.onAppear{
avPlayer.play()
}
}
.sheet(item: $createWorkoutItemPickerViewModel) { item in
CreateWorkoutItemPickerView(viewModel: item, completed: { selectedids in

View File

@@ -19,8 +19,11 @@ struct ExternalWorkoutDetailView: View {
GeometryReader { metrics in
VStack {
HStack {
VideoPlayerView(avPlayer: $avPlayer, showDoneButton: false)
PlayerView(player: $avPlayer)
.frame(width: metrics.size.width * 0.6, height: metrics.size.height * 0.8)
.onAppear{
avPlayer.play()
}
ExtExerciseList(workout: workout,
currentExerciseIdx: bridgeModule.currentExerciseIdx)
@@ -39,17 +42,22 @@ struct ExternalWorkoutDetailView: View {
}
}
.onChange(of: bridgeModule.currentExercise, perform: { newValue in
var _url: URL?
if showNSFWVideos {
if let viddd = newValue?.exercise.nsfwVideoURL,
let url = URL(string: BaseURLs.currentBaseURL + viddd) {
avPlayer = AVPlayer(url: url)
_url = url
}
} else {
if let viddd = newValue?.exercise.videoURL,
let url = URL(string: BaseURLs.currentBaseURL + viddd) {
avPlayer = AVPlayer(url: url)
_url = url
}
}
if let __url = _url {
avPlayer = AVPlayer(url: __url)
avPlayer.play()
}
})
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(.background)

View File

@@ -0,0 +1,82 @@
//
// PlayerUIView.swift
// Werkout_ios
//
// Created by Trey Tartt on 7/5/23.
//
import SwiftUI
import AVKit
class PlayerUIView: UIView {
// MARK: Class Property
let playerLayer = AVPlayerLayer()
// MARK: Init
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
init(player: AVPlayer) {
super.init(frame: .zero)
self.playerSetup(player: player)
}
deinit {
NotificationCenter.default.removeObserver(self)
}
// MARK: Life-Cycle
override func layoutSubviews() {
super.layoutSubviews()
playerLayer.frame = bounds
}
// MARK: Class Methods
private func playerSetup(player: AVPlayer) {
playerLayer.player = player
player.actionAtItemEnd = .none
layer.addSublayer(playerLayer)
self.setObserver()
}
func setObserver() {
NotificationCenter.default.removeObserver(self)
NotificationCenter.default.addObserver(self, selector: #selector(playerItemDidReachEnd(notification:)),
name: .AVPlayerItemDidPlayToEndTime,
object: playerLayer.player?.currentItem)
}
@objc func playerItemDidReachEnd(notification: Notification) {
if let playerItem = notification.object as? AVPlayerItem {
playerItem.seek(to: .zero, completionHandler: nil)
self.playerLayer.player?.play()
}
}
}
struct PlayerView: UIViewRepresentable {
@Binding var player: AVPlayer
func makeUIView(context: Context) -> PlayerUIView {
return PlayerUIView(player: player)
}
func updateUIView(_ uiView: PlayerUIView, context: UIViewRepresentableContext<PlayerView>) {
uiView.playerLayer.player = player
//Add player observer.
uiView.setObserver()
}
}

View File

@@ -1,61 +0,0 @@
//
// VideoPlayerView.swift
// Werkout_ios
//
// Created by Trey Tartt on 6/27/23.
//
import SwiftUI
import AVKit
import Combine
struct VideoPlayerView: View {
@Environment(\.dismiss) var dismiss
@Binding var avPlayer: AVPlayer
var showDoneButton = true
var pub = NotificationCenter.default.publisher(for: .AVPlayerItemDidPlayToEndTime)
var body: some View {
VStack {
if self.showDoneButton {
Button(action: {
dismiss()
}, label: {
Text("Done")
})
.padding()
.frame(maxWidth: .infinity)
.background(Color(uiColor: UIColor(red: 0.11, green: 0.11, blue: 0.12, alpha: 1)))
}
VideoPlayer(player: avPlayer)
.onAppear{
_ = try? AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback, mode: .default, options: .mixWithOthers)
avPlayer.play()
}
}
.background(.black)
.onReceive(pub) { (output) in
avPlayer.pause()
avPlayer.seek(to: .zero)
_ = try? AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback, mode: .default, options: .mixWithOthers)
avPlayer.play()
}
.onChange(of: avPlayer, perform: { newValue in
avPlayer.play()
})
}
}
//struct VideoPlayerView_Previews: PreviewProvider {
// static let exercise = PreviewData.parseExercises().first!
//
// static var previews: some View {
// VideoPlayerView(url: Bundle.main.url(forResource: "Straight_Leg_Sit_Up", withExtension: "mp4")!)
// }
//}

View File

@@ -40,8 +40,11 @@ struct WorkoutDetailView: View {
.padding()
GeometryReader { metrics in
WorkoutDetailVideoPlayerView(avPlayer: $avPlayer)
PlayerView(player: $avPlayer)
.frame(width: metrics.size.width * 1, height: metrics.size.height * 1)
.onAppear{
avPlayer.play()
}
}
}
InfoView(workout: workout)
@@ -75,17 +78,22 @@ struct WorkoutDetailView: View {
}
}
.onChange(of: bridgeModule.currentExercise, perform: { newValue in
var _url: URL?
if showNSFWVideos {
if let viddd = newValue?.exercise.nsfwVideoURL,
let url = URL(string: BaseURLs.currentBaseURL + viddd) {
avPlayer = AVPlayer(url: url)
_url = url
}
} else {
if let viddd = newValue?.exercise.videoURL,
let url = URL(string: BaseURLs.currentBaseURL + viddd) {
avPlayer = AVPlayer(url: url)
_url = url
}
}
if let __url = _url {
avPlayer = AVPlayer(url: __url)
avPlayer.play()
}
})
.onAppear{
bridgeModule.completedWorkout = {
@@ -118,15 +126,6 @@ struct WorkoutDetailView: View {
}
}
struct WorkoutDetailVideoPlayerView: View {
@ObservedObject var bridgeModule = BridgeModule.shared
@Binding var avPlayer: AVPlayer
var body: some View {
VideoPlayerView(avPlayer: $avPlayer, showDoneButton: false)
}
}
struct InfoView: View {
@ObservedObject var bridgeModule = BridgeModule.shared
var workout: Workout
@@ -306,7 +305,10 @@ struct ExerciseListView: View {
}
}
.sheet(item: $videoExercise) { exercise in
VideoPlayerView(avPlayer: $avPlayer)
PlayerView(player: $avPlayer)
.onAppear{
avPlayer.play()
}
}
}
}