Proyectos de Subversion Iphone Microlearning - Nuevo Interface

Rev

Rev 11 | Rev 21 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
//
2
//  VideoPlayerView.swift
3
//  twogetskills
4
//
5
//  Created by Efrain Yanez Recanatini on 4/24/22.
6
//
7
import Foundation
8
import SwiftUI
9
import AVKit
17 efrain 10
import Network
11
import Alamofire
12
import SwiftyJSON
1 efrain 13
 
14
struct VideoPlayerView: View {
17 efrain 15
    @EnvironmentObject private var appNavigation : AppNavigation
1 efrain 16
    @State private var timerActive : Bool = false
17
    @State private var isCompleted : Bool = false
17 efrain 18
 
1 efrain 19
    private let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
17 efrain 20
 
21
    private var slideModel : SlideModel
22
    private var slideTitle : String
23
 
24
 
25
    private var url : URL?
1 efrain 26
    private var playerItem : AVPlayerItem
27
    private var player : AVPlayer
17 efrain 28
    private var appData = AppData.sharedInstance
1 efrain 29
 
17 efrain 30
    init()
1 efrain 31
    {
17 efrain 32
        print("urlExternalDownloaded : \(appData.urlExternalDownloaded)")
33
        self.url = URL(string: appData.urlExternalDownloaded)
34
 
1 efrain 35
        let slideDao = SlideDao.sharedInstance
17 efrain 36
        self.slideModel = slideDao.selectByUuid(uuid: appData.slideUuidActive)
1 efrain 37
 
17 efrain 38
        print("videoplayer appData slideUuid : \(appData.slideUuidActive)")
39
        print("videoplayer slideModel slideUuid : \(self.slideModel.uuid)")
40
 
1 efrain 41
        if self.slideModel.name.count > Constants.APP_BAR_TITLE_MAX_LENGTH {
42
            slideTitle = String(Array(self.slideModel.name)[0...Constants.APP_BAR_TITLE_MAX_LENGTH]) + "..."
43
        } else {
44
            slideTitle = self.slideModel.name
45
        }
46
 
17 efrain 47
 
1 efrain 48
        let headerSecurity = HeaderSecurity()
49
 
50
        let headers: [String: String] = [
51
            Constants.HTTP_HEADER_ACCEPT: Constants.HTTP_HEADER_ACCEPT_VALUE,
52
            Constants.HTTP_HEADER_SECURITY_RAND: String(headerSecurity.rand),
53
            Constants.HTTP_HEADER_SECURITY_TOKEN: appData.deviceUuid,
54
            Constants.HTTP_HEADER_SECURITY_CREATED: String(headerSecurity.created) ,
55
            Constants.HTTP_HEADER_SECURITY_SECRET: headerSecurity.secret,
56
        ]
57
 
17 efrain 58
        let assets = AVURLAsset(url: self.url!, options: ["AVURLAssetHTTPHeaderFieldsKey": headers])
11 efrain 59
 
1 efrain 60
        playerItem = AVPlayerItem(asset: assets)
61
        let newTime : CMTime = CMTimeMakeWithSeconds(0, preferredTimescale:1)
62
 
63
        player = AVPlayer(playerItem: playerItem)
64
        player.seek(to: newTime)
65
 
66
 
67
        self.timerActive = true
17 efrain 68
 
1 efrain 69
 
70
 
71
 
72
    }
73
 
74
    var body: some View {
75
        VStack(spacing: 0) {
8 efrain 76
 
17 efrain 77
 
1 efrain 78
            HStack {
79
                Button(action: {
17 efrain 80
                    if self.url != nil {
81
                        do {
82
                            try FileManager.default.removeItem(at: self.url!)
83
                                   print("Video temporal borrado")
84
                         } catch {
85
                            print(error)
86
                        }
87
                    }
88
 
1 efrain 89
                    let dataService = DataService()
90
                    if self.isCompleted {
91
                        dataService.completeSlide(slide: slideModel)
92
                    } else {
93
                        dataService.incompleteSlide(slide: slideModel)
94
                    }
95
 
96
                    if self.timerActive {
97
                        self.timer.upstream.connect().cancel()
98
                    }
99
 
100
                    AppDelegate.orientationLock = UIInterfaceOrientationMask.portrait
101
                    UIDevice.current.setValue(UIInterfaceOrientation.portrait.rawValue, forKey: "orientation")
102
                    UIViewController.attemptRotationToDeviceOrientation()
103
 
104
 
17 efrain 105
                    appNavigation.pageActive = .home
8 efrain 106
 
107
 
1 efrain 108
 
109
                }, label: {
110
 
111
 
112
                    Image(systemName: "chevron.backward")
113
                    .frame(width: 32, height: 32, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/)
114
                    .aspectRatio(contentMode: .fit)
115
                    .foregroundColor(Color("color_app_bar_foreground"))
116
                })
117
                .padding(.leading, 16)
118
 
119
                Text(self.slideTitle)
120
                .font(Font.custom(Config.FONT_NAME_REGULAR, size: Config.FONT_SIZE_APP_BAR_HEAD1 ))
121
                .foregroundColor(Color("color_app_bar_foreground"))
122
                    .padding(.leading, 4)
123
 
124
                Spacer()
125
            }
126
            .background(Color("color_app_bar_background"))
127
            .edgesIgnoringSafeArea(.top)
128
            .frame(height: 50)
129
            Divider()
17 efrain 130
 
1 efrain 131
 
17 efrain 132
            GeometryReader { geometry in
133
 
134
                VideoPlayer(player: player)
135
                .onAppear() {
136
                    player.play()
137
                }
138
                .onDisappear() {
139
                    player.pause()
140
                }
141
 
142
                .onReceive(timer, perform: { _ in
143
                    let duration =  CMTimeGetSeconds(playerItem.asset.duration)
144
                    if duration > 0 {
145
 
146
                        let currentTime =  CMTimeGetSeconds(playerItem.currentTime())
147
                            let diference = duration - currentTime
148
 
149
                            if diference < 10 {
150
                                self.isCompleted = true;
151
                                self.timer.upstream.connect().cancel()
152
                                timerActive = false
153
                            }
154
                        }
155
                    })
11 efrain 156
            }
1 efrain 157
        }
158
    }
159
 
160
 
161
 
162
 
163
}
164
 
165
 
166
struct VideoPlayerView_Previews: PreviewProvider {
167
    static var previews: some View {
17 efrain 168
        VideoPlayerView()
1 efrain 169
    }
170
}
171