AutorÃa | Ultima modificación | Ver Log |
//
// VideoPlayerView.swift
// twogetskills
//
// Created by Efrain Yanez Recanatini on 4/24/22.
//
import Foundation
import SwiftUI
import AVKit
struct VideoPlayerView: View {
@Environment(\.presentationMode)
var presentationMode: Binding
//@State private var backToGallery : Bool = false
@State private var timerActive : Bool = false
@State private var isCompleted : Bool = false
private let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
private var playerItem : AVPlayerItem
private var player : AVPlayer
private var slideModel : SlideModel
private var position : Int
private let preference = Preference.sharedInstance
private let colorBackgroundTopic = UIColor(hex: Config.COLOR_BACKGROUND_TOPIC)
private let colorAppTextView = UIColor(hex: Config.COLOR_APP_TEXT_VIEW_TITLE)
private let colorAppBackground = UIColor(hex: Config.COLOR_APP_BAR)
//@State private var goToGallery : Bool = false
init(slideModel : SlideModel, position : Int)
{
print("video player init")
self.slideModel = slideModel
self.position = position
/*
let sURL = "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"
let videoUrl = URL(string: sURL)
*/
let videoUrl = URL(string: slideModel.file)
let headerSecurity = HeaderSecurity()
let headers: [String: String] = [
Constants.HTTP_HEADER_ACCEPT: Constants.HTTP_HEADER_ACCEPT_VALUE,
Constants.HTTP_HEADER_SECURITY_RAND: String(headerSecurity.rand),
Constants.HTTP_HEADER_SECURITY_TOKEN: preference.deviceUuid,
Constants.HTTP_HEADER_SECURITY_CREATED: String(headerSecurity.created) ,
Constants.HTTP_HEADER_SECURITY_SECRET: headerSecurity.secret,
]
let assets = AVURLAsset(url: videoUrl!, options: ["AVURLAssetHTTPHeaderFieldsKey": headers])
playerItem = AVPlayerItem(asset: assets)
/*
let assets = AVURLAsset(url: videoUrl!)
playerItem = AVPlayerItem(asset: assets)
*/
let newTime : CMTime = CMTimeMakeWithSeconds(0, preferredTimescale:1)
player = AVPlayer(playerItem: playerItem)
player.seek(to: newTime)
self.timerActive = true
}
var body: some View {
//GeometryReader { geometry in
VStack {
/*NavigationLink("", destination: GridGalleryView(capsuleUuid: self.slideModel.capsuleUuid, position: self.position), isActive: self.$goToGallery).frame( height: 0)*/
VideoPlayer(player: player)
.onAppear() {
player.play()
}
.onDisappear() {
player.pause()
}
.onChange(of: player.currentTime(), perform: { value in
print("onchange")
if let currentItem = player.currentItem {
let duration = currentItem.asset.duration
print("duration : \(duration)")
print("value : \(value)")
}
})
.onReceive(timer, perform: { _ in
print("onReceive")
let duration = CMTimeGetSeconds(playerItem.asset.duration)
let currentTime = CMTimeGetSeconds(playerItem.currentTime())
let diference = duration - currentTime
if diference < 10 {
self.isCompleted = true;
self.timer.upstream.connect().cancel()
timerActive = false
}
})
//.frame(width: geometry.size.width, height: geometry.size.height, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/)
}
.background(Color(colorBackgroundTopic ?? .gray))
.navigationBarBackButtonHidden(true)
.navigationBarTitleDisplayMode(.inline)
.navigationTitle(self.slideModel.name)
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
Button(action: {
let dataService = DataService()
if self.isCompleted {
dataService.completeSlide(slide: slideModel)
} else {
dataService.incompleteSlide(slide: slideModel)
}
if self.timerActive {
self.timer.upstream.connect().cancel()
}
//self.goToGallery = true
self.presentationMode.wrappedValue.dismiss()
}) {
HStack {
Image(systemName: "chevron.backward")
.aspectRatio(contentMode: .fit)
.foregroundColor(Color( colorAppTextView ?? .systemBlue))
.background(Color(colorAppBackground ?? .systemBlue))
}
}
}
}
//}
}
}
struct VideoPlayerView_Previews: PreviewProvider {
static var previews: some View {
let slideModel = SlideModel(
uuid : "S123",
topicUuid : "T123",
capsuleUuid : "C123",
quizUuid : "",
name : "Video de prueba",
description : "",
type: Constants.SLIDE_TYPE_VIDEO,
file : "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4",
background : "",
position : 1,
completed : 0)
VideoPlayerView(slideModel: slideModel, position : 0)
}
}