Proyectos de Subversion Iphone Microlearning

Rev

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)
    }
}