marinofaggiana 3 년 전
부모
커밋
2b3a1ce0ba

+ 17 - 9
iOSClient/Viewer/NCViewerImage/NCViewerImage.swift

@@ -50,6 +50,8 @@ class NCViewerImage: UIViewController {
     var nextIndex: Int?
        
     var currentViewerImageZoom: NCViewerImageZoom?
+    var viewerVideo: NCViewerVideo?
+    
     var panGestureRecognizer: UIPanGestureRecognizer!
     var singleTapGestureRecognizer: UITapGestureRecognizer!
     var longtapGestureRecognizer: UILongPressGestureRecognizer!
@@ -130,8 +132,8 @@ class NCViewerImage: UIViewController {
     override func viewWillDisappear(_ animated: Bool) {
         super.viewWillDisappear(animated)
         
-        NCViewerVideo.shared.videoRemoved()
-                   
+        currentViewerImageZoom?.viewerVideo?.videoPause()
+
         NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterDeleteFile), object: nil)
         NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterRenameFile), object: nil)
         NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterMoveFile), object: nil)
@@ -251,9 +253,10 @@ class NCViewerImage: UIViewController {
     // Detect for LIVE PHOTO
     //
     @objc func didLongpressGestureEvent(gestureRecognizer: UITapGestureRecognizer) {
-          
+        
         if !currentMetadata.livePhoto { return }
         
+        
         if gestureRecognizer.state == .began {
             
             currentViewerImageZoom?.updateViewConstraints()
@@ -266,8 +269,10 @@ class NCViewerImage: UIViewController {
                 if CCUtility.fileProviderStorageExists(metadata.ocId, fileNameView: metadata.fileNameView) {
                     
                     AudioServicesPlaySystemSound(1519) // peek feedback
-                    NCViewerVideo.shared.initVideoPlayer(imageVideoContainer: self.currentViewerImageZoom?.imageVideoContainer, viewerVideoToolBar: nil, metadata: metadata)
-                    NCViewerVideo.shared.videoPlay()
+                    
+                    self.viewerVideo = NCViewerVideo.init(viewerVideoToolBar: nil, metadata: metadata)
+                    self.viewerVideo?.setupVideoLayer(imageVideoContainer: self.currentViewerImageZoom?.imageVideoContainer)
+                    self.viewerVideo?.videoPlay()
                     
                 } else {
                     
@@ -292,8 +297,10 @@ class NCViewerImage: UIViewController {
                             
                             if gestureRecognizer.state == .changed || gestureRecognizer.state == .began {
                                 AudioServicesPlaySystemSound(1519) // peek feedback
-                                NCViewerVideo.shared.initVideoPlayer(imageVideoContainer: self.currentViewerImageZoom?.imageVideoContainer, viewerVideoToolBar: nil, metadata: metadata)
-                                NCViewerVideo.shared.videoPlay()
+                                
+                                self.viewerVideo = NCViewerVideo.init(viewerVideoToolBar: nil, metadata: metadata)
+                                self.viewerVideo?.setupVideoLayer(imageVideoContainer: self.currentViewerImageZoom?.imageVideoContainer)
+                                self.viewerVideo?.videoPlay()
                             }
                         }
                     }
@@ -304,7 +311,7 @@ class NCViewerImage: UIViewController {
             
             currentViewerImageZoom?.statusViewImage.isHidden = false
             currentViewerImageZoom?.statusLabel.isHidden = false
-            NCViewerVideo.shared.videoRemoved()
+            self.viewerVideo?.videoRemoved()
         }
     }
     
@@ -437,7 +444,8 @@ extension NCViewerImage: UIPageViewControllerDelegate, UIPageViewControllerDataS
         
         guard let nextViewController = pendingViewControllers.first as? NCViewerImageZoom else { return }
         nextIndex = nextViewController.index
-        NCViewerVideo.shared.videoPause()
+        
+        currentViewerImageZoom?.viewerVideo?.videoPause()
     }
     
     func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {

+ 1 - 1
iOSClient/Viewer/NCViewerImage/NCViewerImageDetailView.swift

@@ -155,7 +155,7 @@ class NCViewerImageDetailView: UIView {
                 dimValue.text = "\(Int(image.size.width)) x \(Int(image.size.height))"
             }
         } else if metadata?.classFile == NCCommunicationCommon.typeClassFile.video.rawValue || metadata?.classFile == NCCommunicationCommon.typeClassFile.audio.rawValue  {
-            if let ocId = metadata?.ocId, ocId == NCViewerVideo.shared.metadata?.ocId, let durationSeconds = NCManageDatabase.shared.getVideoDurationSeconds(metadata: metadata) {
+            if let durationSeconds = NCManageDatabase.shared.getVideoDurationSeconds(metadata: metadata) {
                 self.dimLabel.text = NSLocalizedString("_duration_", comment: "")
                 self.dimValue.text = NCUtility.shared.stringFromTimeInterval(interval: durationSeconds)
             }

+ 9 - 4
iOSClient/Viewer/NCViewerImage/NCViewerImageZoom.swift

@@ -44,6 +44,8 @@ class NCViewerImageZoom: UIViewController {
     
     var delegate: NCViewerImageZoomDelegate?
     var viewerImage: NCViewerImage?
+    var viewerVideo: NCViewerVideo?
+    
     var image: UIImage?
     var metadata: tableMetadata = tableMetadata()
     var index: Int = 0
@@ -108,6 +110,11 @@ class NCViewerImageZoom: UIViewController {
         detailViewConstraint.constant = 0
         detailView.update(metadata: metadata, image: image, heightMap: heightMap)
         detailView.hide()
+        
+        if metadata.classFile == NCCommunicationCommon.typeClassFile.video.rawValue || metadata.classFile == NCCommunicationCommon.typeClassFile.audio.rawValue {
+            self.viewerVideo = NCViewerVideo.init(viewerVideoToolBar: self.videoToolBar, metadata: self.metadata)
+            self.viewerImage?.viewerVideo = self.viewerVideo
+        }
     }
     
     override func viewDidAppear(_ animated: Bool) {
@@ -115,10 +122,8 @@ class NCViewerImageZoom: UIViewController {
         
         delegate?.didAppearImageZoom(viewerImageZoom: self, metadata: metadata)
         
-        if metadata.classFile == NCCommunicationCommon.typeClassFile.video.rawValue || metadata.classFile == NCCommunicationCommon.typeClassFile.audio.rawValue {
-            DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
-                NCViewerVideo.shared.initVideoPlayer(imageVideoContainer: self.imageVideoContainer, viewerVideoToolBar: self.videoToolBar, metadata: self.metadata)
-            }
+        DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
+            self.viewerVideo?.setupVideoLayer(imageVideoContainer: self.imageVideoContainer)
         }
     }
     

+ 26 - 18
iOSClient/Viewer/NCViewerVideo/NCViewerVideo.swift

@@ -26,12 +26,7 @@ import NCCommunication
 import UIKit
 
 class NCViewerVideo: NSObject {
-    @objc static let shared: NCViewerVideo = {
-        let instance = NCViewerVideo()
-        NotificationCenter.default.addObserver(self, selector: #selector(applicationDidEnterBackground(_:)), name: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterApplicationDidEnterBackground), object: nil)
-        return instance
-    }()
-    
+   
     private let appDelegate = UIApplication.shared.delegate as! AppDelegate
     private var imageVideoContainer: imageVideoContainerView?
     private var durationSeconds: Double = 0
@@ -50,22 +45,16 @@ class NCViewerVideo: NSObject {
         }
     }
     
-    func initVideoPlayer(imageVideoContainer: imageVideoContainerView?, viewerVideoToolBar: NCViewerVideoToolBar?, metadata: tableMetadata) {
+    init(viewerVideoToolBar: NCViewerVideoToolBar?, metadata: tableMetadata) {
+        super.init()
                 
-        guard let imageVideoContainer = imageVideoContainer else { return }
-        if self.metadata == metadata { return }
+        NotificationCenter.default.addObserver(self, selector: #selector(applicationDidEnterBackground(_:)), name: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterApplicationDidEnterBackground), object: nil)
         
         func initPlayer(url: URL) {
                         
             self.player = AVPlayer(url: url)
             self.player?.isMuted = CCUtility.getAudioMute()
             self.player?.seek(to: .zero)
-            self.videoLayer = AVPlayerLayer(player: self.player)
-            self.videoLayer!.frame = imageVideoContainer.bounds
-            self.videoLayer!.videoGravity = .resizeAspect
-            
-            imageVideoContainer.layer.addSublayer(videoLayer!)
-            imageVideoContainer.playerLayer = self.videoLayer
 
             // At end go back to start & show toolbar
             NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: self.player?.currentItem, queue: .main) { (notification) in
@@ -87,12 +76,11 @@ class NCViewerVideo: NSObject {
                 self.player?.seek(to: time)
             }
             
-            viewerVideoToolBar?.setBarPlayer()
+            viewerVideoToolBar?.setBarPlayer(viewerVideo: self)
         }
         
         if let url = NCKTVHTTPCache.shared.getVideoURL(metadata: metadata) {
             
-            self.imageVideoContainer = imageVideoContainer
             self.viewerVideoToolBar = viewerVideoToolBar
             self.metadata = metadata
 
@@ -100,6 +88,26 @@ class NCViewerVideo: NSObject {
         }        
     }
     
+    deinit {
+        print("deinit")
+    }
+    
+    func setupVideoLayer(imageVideoContainer: imageVideoContainerView?) {
+        
+        if let imageVideoContainer = imageVideoContainer {
+        
+            self.imageVideoContainer = imageVideoContainer
+
+            self.videoLayer = AVPlayerLayer(player: self.player)
+            self.videoLayer!.frame = imageVideoContainer.bounds
+            self.videoLayer!.videoGravity = .resizeAspect
+        
+            imageVideoContainer.layer.addSublayer(videoLayer!)
+            imageVideoContainer.playerLayer = self.videoLayer
+        }
+    }
+    
+    
     func videoPlay() {
                 
         self.player?.play()
@@ -132,7 +140,7 @@ class NCViewerVideo: NSObject {
     
     func getVideoCurrentSeconds() -> Float64 {
         
-        if let currentTime = NCViewerVideo.shared.player?.currentTime() {
+        if let currentTime = player?.currentTime() {
             return CMTimeGetSeconds(currentTime)
         }
         return 0

+ 26 - 23
iOSClient/Viewer/NCViewerVideo/NCViewerVideoToolBar.swift

@@ -40,6 +40,7 @@ class NCViewerVideoToolBar: UIView {
         case moved
     }
         
+    private var viewerVideo: NCViewerVideo!
     private var wasInPlay: Bool = false
     private var playbackSliderEvent: sliderEventType = .ended
     private let seekDuration: Float64 = 15
@@ -82,21 +83,23 @@ class NCViewerVideoToolBar: UIView {
         muteButton.setImage(NCUtility.shared.loadImage(named: "audioOff", color: .lightGray), for: .normal)
     }
     
-    func setBarPlayer() {
+    func setBarPlayer(viewerVideo: NCViewerVideo) {
                         
+        self.viewerVideo = viewerVideo
+        
         playbackSlider.value = 0
         playbackSlider.minimumValue = 0
-        playbackSlider.maximumValue = Float(NCViewerVideo.shared.getVideoDurationSeconds())
+        playbackSlider.maximumValue = Float(viewerVideo.getVideoDurationSeconds())
         playbackSlider.addTarget(self, action: #selector(onSliderValChanged(slider:event:)), for: .valueChanged)
 
         labelCurrentTime.text = NCUtility.shared.stringFromTimeInterval(interval: 0)
-        labelOverallDuration.text = "-" + NCUtility.shared.stringFromTimeInterval(interval: NCViewerVideo.shared.getVideoDurationSeconds())
+        labelOverallDuration.text = "-" + NCUtility.shared.stringFromTimeInterval(interval:viewerVideo.getVideoDurationSeconds())
                 
         updateToolBar()
         
-        NCViewerVideo.shared.player?.addPeriodicTimeObserver(forInterval: CMTimeMakeWithSeconds(1, preferredTimescale: 1), queue: .main, using: { (CMTime) in
+        viewerVideo.player?.addPeriodicTimeObserver(forInterval: CMTimeMakeWithSeconds(1, preferredTimescale: 1), queue: .main, using: { (CMTime) in
             
-            if NCViewerVideo.shared.player?.currentItem?.status == .readyToPlay {
+            if viewerVideo.player?.currentItem?.status == .readyToPlay {
                 if self.isHidden == false {
                     self.updateToolBar()
                 }
@@ -141,9 +144,9 @@ class NCViewerVideoToolBar: UIView {
     public func updateToolBar() {
 
         var namedPlay = "play.fill"
-        if NCViewerVideo.shared.player?.rate == 1 { namedPlay = "pause.fill"}
-        let currentSeconds = NCViewerVideo.shared.getVideoCurrentSeconds()
-        let durationSeconds = NCViewerVideo.shared.getVideoDurationSeconds()
+        if viewerVideo.player?.rate == 1 { namedPlay = "pause.fill"}
+        let currentSeconds = viewerVideo.getVideoCurrentSeconds()
+        let durationSeconds = viewerVideo.getVideoDurationSeconds()
         
         playbackSlider.value = Float(currentSeconds)
         playbackSlider.isEnabled = true
@@ -183,16 +186,16 @@ class NCViewerVideoToolBar: UIView {
             
             switch touchEvent.phase {
             case .began:
-                wasInPlay = NCViewerVideo.shared.player?.rate == 1 ? true : false
-                NCViewerVideo.shared.videoPause()
+                wasInPlay = viewerVideo.player?.rate == 1 ? true : false
+                viewerVideo.videoPause()
                 playbackSliderEvent = .began
             case .moved:
-                NCViewerVideo.shared.videoSeek(time: targetTime)
+                viewerVideo.videoSeek(time: targetTime)
                 playbackSliderEvent = .moved
             case .ended:
-                NCViewerVideo.shared.videoSeek(time: targetTime)
+                viewerVideo.videoSeek(time: targetTime)
                 if wasInPlay {
-                    NCViewerVideo.shared.videoPlay()
+                    viewerVideo.videoPlay()
                 }
                 playbackSliderEvent = .ended
             default:
@@ -213,10 +216,10 @@ class NCViewerVideoToolBar: UIView {
     
     @IBAction func playerPause(_ sender: Any) {
         
-        if NCViewerVideo.shared.player?.timeControlStatus == .playing {
-            NCViewerVideo.shared.videoPause()
-        } else if NCViewerVideo.shared.player?.timeControlStatus == .paused {
-            NCViewerVideo.shared.videoPlay()
+        if viewerVideo.player?.timeControlStatus == .playing {
+            viewerVideo.videoPause()
+        } else if viewerVideo.player?.timeControlStatus == .paused {
+            viewerVideo.videoPlay()
         }
     }
         
@@ -225,24 +228,24 @@ class NCViewerVideoToolBar: UIView {
         let mute = CCUtility.getAudioMute()
         
         CCUtility.setAudioMute(!mute)
-        NCViewerVideo.shared.player?.isMuted = !mute
+        viewerVideo.player?.isMuted = !mute
         updateToolBar()
     }
     
     @IBAction func forwardButtonSec(_ sender: Any) {
-        guard let player = NCViewerVideo.shared.player else { return }
+        guard let player = viewerVideo.player else { return }
         
         let playerCurrentTime = CMTimeGetSeconds(player.currentTime())
         let newTime = playerCurrentTime + seekDuration
         
-        if newTime < NCViewerVideo.shared.getVideoDurationSeconds() {
+        if newTime < viewerVideo.getVideoDurationSeconds() {
             let time: CMTime = CMTimeMake(value: Int64(newTime * 1000 as Float64), timescale: 1000)
-            NCViewerVideo.shared.videoSeek(time: time)
+            viewerVideo.videoSeek(time: time)
         }
     }
     
     @IBAction func backButtonSec(_ sender: Any) {
-        guard let player = NCViewerVideo.shared.player else { return }
+        guard let player = viewerVideo.player else { return }
 
         let playerCurrenTime = CMTimeGetSeconds(player.currentTime())
         var newTime = playerCurrenTime - seekDuration
@@ -250,6 +253,6 @@ class NCViewerVideoToolBar: UIView {
         if newTime < 0 { newTime = 0 }
         let time: CMTime = CMTimeMake(value: Int64(newTime * 1000 as Float64), timescale: 1000)
         
-        NCViewerVideo.shared.videoSeek(time: time)
+        viewerVideo.videoSeek(time: time)
     }
 }