Marino Faggiana 1 vuosi sitten
vanhempi
commit
ca92d09750

+ 19 - 1
iOSClient/Data/NCManageDatabase+Video.swift

@@ -31,6 +31,7 @@ class tableVideo: Object {
     @objc dynamic var length: Int = 0
     @objc dynamic var ocId = ""
     @objc dynamic var position: Float = 0
+    @objc dynamic var autoplay: Bool = false
     @objc dynamic var codecNameVideo: String?
     @objc dynamic var codecNameAudio: String?
     @objc dynamic var codecAudioChannelLayout: String?
@@ -45,7 +46,7 @@ class tableVideo: Object {
 
 extension NCManageDatabase {
 
-    func addVideo(metadata: tableMetadata, position: Float, length: Int?) {
+    func addVideo(metadata: tableMetadata, position: Float, length: Int? = nil, autoplay: Bool) {
 
         if metadata.livePhoto { return }
         let realm = try! Realm()
@@ -54,7 +55,11 @@ extension NCManageDatabase {
             try realm.write {
                 if let result = realm.objects(tableVideo.self).filter("account == %@ AND ocId == %@", metadata.account, metadata.ocId).first {
 
+                    if let length = length {
+                        result.length = length
+                    }
                     result.position = position
+                    result.autoplay = autoplay
                     realm.add(result, update: .all)
 
                 } else {
@@ -67,6 +72,7 @@ extension NCManageDatabase {
                     }
                     addObject.ocId = metadata.ocId
                     addObject.position = position
+                    addObject.autoplay = autoplay
                     realm.add(addObject, update: .all)
                 }
             }
@@ -145,6 +151,18 @@ extension NCManageDatabase {
         return result.position
     }
 
+    func getVideoAutoplay(metadata: tableMetadata) -> Bool {
+
+        if metadata.livePhoto { return false }
+        let realm = try! Realm()
+
+        guard let result = realm.objects(tableVideo.self).filter("account == %@ AND ocId == %@", metadata.account, metadata.ocId).first else {
+            return false
+        }
+
+        return result.autoplay
+    }
+
     func deleteVideo(metadata: tableMetadata) {
 
         let realm = try! Realm()

+ 0 - 3
iOSClient/Utility/CCUtility.h

@@ -184,9 +184,6 @@
 + (BOOL)getRemovePhotoCameraRoll;
 + (void)setRemovePhotoCameraRoll:(BOOL)set;
 
-+ (BOOL)getPlayerPlay;
-+ (void)setPlayerPlay:(BOOL)set;
-
 // ===== Varius =====
 
 + (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL;

+ 0 - 11
iOSClient/Utility/CCUtility.m

@@ -741,17 +741,6 @@
     [UICKeyChainStore setString:sSet forKey:@"removePhotoCameraRoll" service:NCGlobal.shared.serviceShareKeyChain];
 }
 
-+ (BOOL)getPlayerPlay
-{
-    return [[UICKeyChainStore stringForKey:@"playerPlay" service:NCGlobal.shared.serviceShareKeyChain] boolValue];
-}
-
-+ (void)setPlayerPlay:(BOOL)set
-{
-    NSString *sSet = (set) ? @"true" : @"false";
-    [UICKeyChainStore setString:sSet forKey:@"playerPlay" service:NCGlobal.shared.serviceShareKeyChain];
-}
-
 #pragma --------------------------------------------------------------------------------------------
 #pragma mark ===== Various =====
 #pragma --------------------------------------------------------------------------------------------

+ 40 - 22
iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayer.swift

@@ -69,11 +69,11 @@ class NCPlayer: NSObject {
 
     deinit {
 
-        playerStop()
+        playerClose()
         print("deinit NCPlayer with ocId \(metadata.ocId)")
     }
 
-    func openAVPlayer(url: URL, autoplay: Bool) {
+    func openAVPlayer(url: URL) {
 
         self.url = url
         self.singleTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(didSingleTapWith(gestureRecognizer:)))
@@ -116,17 +116,33 @@ class NCPlayer: NSObject {
             view.addGestureRecognizer(singleTapGestureRecognizer)
         }
 
-        playerToolBar?.setBarPlayer(ncplayer: self)
-        playerToolBar?.setMetadata(self.metadata)
-
-        if autoplay {
-            player?.play()
+        if NCManageDatabase.shared.getVideoAutoplay(metadata: metadata) {
+            playerPlay()
             playerToolBar?.show(enableTimerAutoHide: true)
         } else {
             playerToolBar?.show(enableTimerAutoHide: false)
         }
+
+        playerToolBar?.setBarPlayer(ncplayer: self)
+        playerToolBar?.setMetadata(self.metadata)
     }
 
+    func deactivatePlayer() {
+
+        playerPause()
+        
+        NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterApplicationWillResignActive), object: nil)
+        NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterApplicationDidEnterBackground), object: nil)
+        NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterApplicationDidBecomeActive), object: nil)
+
+        NotificationCenter.default.removeObserver(self, name: NSNotification.Name.AVPlayerItemPlaybackStalled, object: nil)
+
+        NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterPauseMedia), object: nil)
+        NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: NCGlobal.shared.notificationCenterPlayMedia), object: nil)
+    }
+
+    // MARK: - UIGestureRecognizerDelegate
+
     @objc func didSingleTapWith(gestureRecognizer: UITapGestureRecognizer) {
         viewerMediaPage?.didSingleTapWith(gestureRecognizer: gestureRecognizer)
     }
@@ -157,37 +173,46 @@ class NCPlayer: NSObject {
     @objc func playerPlay() {
 
         player?.play()
+        if let position = NCManageDatabase.shared.getVideoPosition(metadata: self.metadata) {
+            player?.position = position
+        }
         playerToolBar?.updateToolBar()
     }
 
     @objc func playerPause() {
 
-        player?.pause()
-        playerToolBar?.updateToolBar()
+        if let position = player?.position {
+            player?.pause()
+            playerToolBar?.updateToolBar()
+        }
 
         if let playerToolBar = self.playerToolBar, playerToolBar.isPictureInPictureActive() {
             playerToolBar.pictureInPictureController?.stopPictureInPicture()
         }
     }
 
-    @objc func playerStop() {
+    @objc func playerClose() {
 
         player?.stop()
-        playerToolBar?.updateToolBar()
+
+        if let playerToolBar = self.playerToolBar, playerToolBar.isPictureInPictureActive() {
+            playerToolBar.pictureInPictureController?.stopPictureInPicture()
+        }
     }
 
     func videoSeek(position: Float) {
 
         player?.position = position
-        savePosition(position)
+        playerToolBar?.updateToolBar()
     }
 
     func videoStop() {
         if let url = self.url {
+            NCManageDatabase.shared.addVideo(metadata: metadata, position: 0, autoplay: false)
             if !(self.detailView?.isShow() ?? false) {
                 NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterShowPlayerToolBar, userInfo: ["ocId": self.metadata.ocId, "enableTimerAutoHide": false])
             }
-            self.openAVPlayer(url: url, autoplay: false)
+            self.openAVPlayer(url: url)
         }
     }
 
@@ -196,17 +221,10 @@ class NCPlayer: NSObject {
         if metadata.classFile == NKCommon.TypeClassFile.audio.rawValue { return }
         let length = Int(player?.media?.length.intValue ?? 0)
 
-        NCManageDatabase.shared.addVideo(metadata: metadata, position: position, length: length)
+        NCManageDatabase.shared.addVideo(metadata: metadata, position: position, length: length, autoplay: isPlay())
         generatorImagePreview()
     }
 
-    func saveCurrentTime() {
-
-        if let player = self.player {
-            savePosition(player.position)
-        }
-    }
-
     @objc func generatorImagePreview() {
 
         /*
@@ -286,7 +304,7 @@ class NCPlayer: NSObject {
                         self.convertVideo(withAlert: false)
 #endif
                     } else {
-                        self.openAVPlayer(url: url, autoplay: true)
+                        self.openAVPlayer(url: url)
                     }
                 }
             }

+ 7 - 55
iOSClient/Viewer/NCViewerMedia/NCPlayer/NCPlayerToolBar.swift

@@ -122,9 +122,6 @@ class NCPlayerToolBar: UIView {
 
         forwardButton.setImage(NCUtility.shared.loadImage(named: "goforward.10", color: .lightGray), for: .normal)
         forwardButton.isEnabled = false
-
-        NotificationCenter.default.addObserver(self, selector: #selector(handleInterruption), name: AVAudioSession.interruptionNotification, object: nil)
-        NotificationCenter.default.addObserver(self, selector: #selector(handleRouteChange), name: AVAudioSession.routeChangeNotification, object: nil)
     }
 
     required init?(coder aDecoder: NSCoder) {
@@ -162,6 +159,12 @@ class NCPlayerToolBar: UIView {
 
         guard let ncplayer = self.ncplayer else { return }
 
+        // SAVE POSITION
+        let position = ncplayer.player?.position ?? 0
+        if position > 0 {
+            ncplayer.savePosition(position)
+        }
+
         // MUTE
         if let muteButton = muteButton {
             let audio = CCUtility.getAudioVolume()
@@ -185,7 +188,7 @@ class NCPlayerToolBar: UIView {
         }
 
         // SLIDER TIME (START - END)
-        playbackSlider.value = ncplayer.player?.position ?? 0
+        playbackSlider.value = position
         playbackSlider.isEnabled = true
         labelCurrentTime.text = ncplayer.player?.time.stringValue
         labelLeftTime.text = ncplayer.player?.remainingTime?.stringValue
@@ -209,54 +212,6 @@ class NCPlayerToolBar: UIView {
         forwardButton.isEnabled = true
     }
 
-    // MARK: Handle Notifications
-
-    @objc func handleRouteChange(notification: Notification) {
-
-        guard let userInfo = notification.userInfo, let reasonValue = userInfo[AVAudioSessionRouteChangeReasonKey] as? UInt, let reason = AVAudioSession.RouteChangeReason(rawValue: reasonValue) else { return }
-
-        switch reason {
-        case .newDeviceAvailable:
-            let session = AVAudioSession.sharedInstance()
-            for output in session.currentRoute.outputs where output.portType == AVAudioSession.Port.headphones {
-                print("headphones connected")
-                ncplayer?.playerPlay()
-                startTimerAutoHide()
-                break
-            }
-        case .oldDeviceUnavailable:
-            if let previousRoute = userInfo[AVAudioSessionRouteChangePreviousRouteKey] as? AVAudioSessionRouteDescription {
-                for output in previousRoute.outputs where output.portType == AVAudioSession.Port.headphones {
-                    print("headphones disconnected")
-                    ncplayer?.playerPause()
-                    ncplayer?.saveCurrentTime()
-                    break
-                }
-            }
-        default: ()
-        }
-    }
-
-    @objc func handleInterruption(notification: Notification) {
-
-        guard let userInfo = notification.userInfo, let typeValue = userInfo[AVAudioSessionInterruptionTypeKey] as? UInt, let type = AVAudioSession.InterruptionType(rawValue: typeValue) else { return }
-
-        if type == .began {
-            print("Interruption began")
-        } else if type == .ended {
-            if let optionsValue = userInfo[AVAudioSessionInterruptionOptionKey] as? UInt {
-                let options = AVAudioSession.InterruptionOptions(rawValue: optionsValue)
-                if options.contains(.shouldResume) {
-                    print("Interruption Ended - playback should resume")
-                    ncplayer?.playerPlay()
-                    startTimerAutoHide()
-                } else {
-                    print("Interruption Ended - playback should NOT resume")
-                }
-            }
-        }
-    }
-
     // MARK: -
 
     public func show(enableTimerAutoHide: Bool = false) {
@@ -385,12 +340,9 @@ class NCPlayerToolBar: UIView {
 
         if ncplayer.isPlay() {
             ncplayer.playerPause()
-            CCUtility.setPlayerPlay(false)
-            ncplayer.saveCurrentTime()
             timerAutoHide?.invalidate()
         } else {
             ncplayer.playerPlay()
-            CCUtility.setPlayerPlay(true)
             startTimerAutoHide()
         }
     }

+ 10 - 15
iOSClient/Viewer/NCViewerMedia/NCViewerMedia.swift

@@ -39,7 +39,6 @@ class NCViewerMedia: UIViewController {
     @IBOutlet weak var statusLabel: UILabel!
     @IBOutlet weak var detailView: NCViewerMediaDetailView!
 
-    private var _autoPlay: Bool = false
     private var tipView: EasyTipView?
 
     let appDelegate = UIApplication.shared.delegate as! AppDelegate
@@ -53,16 +52,6 @@ class NCViewerMedia: UIViewController {
     var imageViewConstraint: CGFloat = 0
     var isDetailViewInitializze: Bool = false
 
-    var autoPlay: Bool {
-        get {
-            let temp = _autoPlay
-            _autoPlay = false
-            return temp
-        }
-        set(newVal) {
-            _autoPlay = newVal
-        }
-    }
 
     // MARK: - View Life Cycle
 
@@ -181,10 +170,16 @@ class NCViewerMedia: UIViewController {
 
             if let ncplayer = self.ncplayer {
 
-                NCNetworking.shared.getVideoUrl(metadata: metadata) { url in
-                    if let url = url {
-                        ncplayer.openAVPlayer(url: url, autoplay: self.autoPlay)
-                        self.viewerMediaPage?.updateCommandCenter(ncplayer: ncplayer, metadata: self.metadata)
+                if ncplayer.url == nil {
+                    NCNetworking.shared.getVideoUrl(metadata: metadata) { url in
+                        if let url = url {
+                            ncplayer.openAVPlayer(url: url)
+                            self.viewerMediaPage?.updateCommandCenter(ncplayer: ncplayer, metadata: self.metadata)
+                        }
+                    }
+                } else {
+                    if NCManageDatabase.shared.getVideoAutoplay(metadata: self.metadata) {
+                        ncplayer.playerPlay()
                     }
                 }
             }

+ 2 - 10
iOSClient/Viewer/NCViewerMedia/NCViewerMediaPage.swift

@@ -138,7 +138,6 @@ class NCViewerMediaPage: UIViewController {
 
         if let ncplayer = currentViewController.ncplayer, ncplayer.isPlay() {
             ncplayer.playerPause()
-            ncplayer.saveCurrentTime()
         }
         currentViewController.playerToolBar?.stopTimerAutoHide()
         clearCommandCenter()
@@ -488,7 +487,6 @@ extension NCViewerMediaPage: UIPageViewControllerDelegate, UIPageViewControllerD
     func reloadCurrentPage() {
 
         let viewerMedia = getViewerMedia(index: currentIndex, metadata: metadatas[currentIndex])
-        viewerMedia.autoPlay = false
         pageViewController.setViewControllers([viewerMedia], direction: .forward, animated: false, completion: nil)
     }
     
@@ -497,7 +495,6 @@ extension NCViewerMediaPage: UIPageViewControllerDelegate, UIPageViewControllerD
         currentIndex = index
 
         let viewerMedia = getViewerMedia(index: currentIndex, metadata: metadatas[currentIndex])
-        viewerMedia.autoPlay = autoPlay
         pageViewController.setViewControllers([viewerMedia], direction: direction, animated: true, completion: nil)
     }
 
@@ -520,11 +517,6 @@ extension NCViewerMediaPage: UIPageViewControllerDelegate, UIPageViewControllerD
     // START TRANSITION
     func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) {
 
-        // Save time video
-        if let ncplayer = currentViewController.ncplayer, ncplayer.isPlay() {
-            ncplayer.saveCurrentTime()
-        }
-
         guard let nextViewController = pendingViewControllers.first as? NCViewerMedia else { return }
         nextIndex = nextViewController.index
     }
@@ -535,7 +527,7 @@ extension NCViewerMediaPage: UIPageViewControllerDelegate, UIPageViewControllerD
         if completed && nextIndex != nil {
             previousViewControllers.forEach { viewController in
                 let viewerMedia = viewController as! NCViewerMedia
-                // viewerMedia.ncplayer?.deactivateObserver()
+                viewerMedia.ncplayer?.deactivatePlayer()
             }
             currentIndex = nextIndex!
         }
@@ -621,7 +613,7 @@ extension NCViewerMediaPage: UIGestureRecognizerDelegate {
                 NCNetworking.shared.getVideoUrl(metadata: metadata) { url in
                     if let url = url {
                         self.ncplayerLivePhoto = NCPlayer.init(imageVideoContainer: self.currentViewController.imageVideoContainer, playerToolBar: nil, metadata: metadata, detailView: nil, viewController: self, viewerMediaPage: self)
-                        self.ncplayerLivePhoto?.openAVPlayer(url: url, autoplay: true)
+                        self.ncplayerLivePhoto?.openAVPlayer(url: url)
                     }
                 }
             }