Pārlūkot izejas kodu

Improve & lint NCViewerQuickLook

- refactoring
- fix file saving.. make sure `didSaveEditedCopyOf` is called first, then, if changes exist, ask for update on parentVC, remove cancel because it does the same as discarding

Signed-off-by: Henrik Storch <henrik.storch@nextcloud.com>
Henrik Storch 3 gadi atpakaļ
vecāks
revīzija
79b9393755

+ 0 - 1
.swiftlint.yml

@@ -135,7 +135,6 @@ excluded:
   - iOSClient/Viewer/NCViewerPDF/NCViewerPDF.swift
   - iOSClient/Viewer/NCViewerPDF/NCViewerPDFSearch.swift
   - iOSClient/Viewer/NCViewerProviderContextMenu.swift
-  - iOSClient/Viewer/NCViewerQuickLook/NCViewerQuickLook.swift
   - iOSClient/Viewer/NCViewerRichdocument/NCViewerRichdocument.swift
 
 

+ 1 - 1
iOSClient/Main/NCFunctionCenter.swift

@@ -77,7 +77,7 @@ import SVGKit
                 editingMode = true
             }
 
-            let viewerQuickLook = NCViewerQuickLook(with: URL(fileURLWithPath: fileNamePath), editingMode: editingMode, metadata: metadata)
+            let viewerQuickLook = NCViewerQuickLook(with: URL(fileURLWithPath: fileNamePath), isEditingEnabled: editingMode, metadata: metadata)
             self.appDelegate.window?.rootViewController?.present(viewerQuickLook, animated: true)
 
         case NCGlobal.shared.selectorLoadFileView:

+ 1 - 2
iOSClient/Settings/CCAdvanced.m

@@ -173,8 +173,7 @@
         row.action.formBlock = ^(XLFormRowDescriptor * sender) {
                     
             [self deselectFormRow:sender];
-            
-            NCViewerQuickLook *viewerQuickLook = [[NCViewerQuickLook alloc] initWith:[NSURL fileURLWithPath:NCCommunicationCommon.shared.filenamePathLog] editingMode:false metadata:nil];
+            NCViewerQuickLook *viewerQuickLook = [[NCViewerQuickLook alloc] initWith:[NSURL fileURLWithPath:NCCommunicationCommon.shared.filenamePathLog] isEditingEnabled:false metadata:nil];
             UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewerQuickLook];
             navigationController.modalPresentationStyle = UIModalPresentationFullScreen;
             

+ 1 - 1
iOSClient/Viewer/NCViewer.swift

@@ -208,7 +208,7 @@ class NCViewer: NSObject {
 
         CCUtility.copyFile(atPath: CCUtility.getDirectoryProviderStorageOcId(metadata.ocId, fileNameView: metadata.fileNameView), toPath: fileNamePath)
 
-        let viewerQuickLook = NCViewerQuickLook(with: URL(fileURLWithPath: fileNamePath), editingMode: false, metadata: metadata)
+        let viewerQuickLook = NCViewerQuickLook(with: URL(fileURLWithPath: fileNamePath), isEditingEnabled: false, metadata: metadata)
         viewController.present(viewerQuickLook, animated: true)
     }
 }

+ 73 - 64
iOSClient/Viewer/NCViewerQuickLook/NCViewerQuickLook.swift

@@ -27,26 +27,24 @@ import NCCommunication
 
 @objc class NCViewerQuickLook: QLPreviewController {
 
-    let appDelegate = UIApplication.shared.delegate as! AppDelegate
-    var url: URL?
+    let url: URL
     var previewItems: [PreviewItem] = []
-    var editingMode: Bool
-    enum saveModeType {
-        case overwrite
-        case copy
-        case discard
-    }
-    var saveMode: saveModeType = .discard
+    var isEditingEnabled: Bool
     var metadata: tableMetadata?
 
+    // if the document has any changes (annotations)
+    var hasChanges = false
+
+    // used to display the save alert
+    var parentVC: UIViewController?
+
     required init?(coder: NSCoder) {
         fatalError("init(coder:) has not been implemented")
     }
 
-    @objc init(with url: URL, editingMode: Bool, metadata: tableMetadata?) {
-
+    @objc init(with url: URL, isEditingEnabled: Bool, metadata: tableMetadata?) {
         self.url = url
-        self.editingMode = editingMode
+        self.isEditingEnabled = isEditingEnabled
         if let metadata = metadata {
             self.metadata = tableMetadata.init(value: metadata)
         }
@@ -64,8 +62,9 @@ import NCCommunication
 
     override func viewDidLoad() {
         super.viewDidLoad()
+        guard isEditingEnabled else { return }
 
-        if editingMode && metadata?.classFile == NCCommunicationCommon.typeClassFile.image.rawValue {
+        if metadata?.classFile == NCCommunicationCommon.typeClassFile.image.rawValue {
             Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true, block: { t in
                 if self.navigationItem.rightBarButtonItems?.count ?? 0 > 1 || !(self.navigationController?.isToolbarHidden ?? false) {
                     if #available(iOS 14.0, *) {
@@ -88,34 +87,39 @@ import NCCommunication
             })
         }
 
-        if editingMode && metadata?.livePhoto == true {
-            NCContentPresenter.shared.messageNotification("", description: "_message_disable_overwrite_livephoto_", delay: NCGlobal.shared.dismissAfterSecond, type: NCContentPresenter.messageType.info, errorCode: NCGlobal.shared.errorCharactersForbidden)
+        if metadata?.livePhoto == true {
+            NCContentPresenter.shared.messageNotification(
+                "", description: "_message_disable_overwrite_livephoto_",
+                delay: NCGlobal.shared.dismissAfterSecond,
+                type: NCContentPresenter.messageType.info,
+                errorCode: NCGlobal.shared.errorCharactersForbidden)
         }
     }
 
-    override func viewWillDisappear(_ animated: Bool) {
-        super.viewWillDisappear(animated)
-        if editingMode {
+    override func viewDidAppear(_ animated: Bool) {
+        super.viewDidAppear(animated)
+        self.parentVC = presentingViewController
+    }
 
-            let alertController = UIAlertController(title: NSLocalizedString("_save_", comment: ""), message: "", preferredStyle: .alert)
+    override func viewDidDisappear(_ animated: Bool) {
+        // called after `previewController(:didSaveEditedCopyOf:)`
+        super.viewDidDisappear(animated)
 
-            if metadata?.livePhoto == false {
-                alertController.addAction(UIAlertAction(title: NSLocalizedString("_overwrite_original_", comment: ""), style: .default) { (_: UIAlertAction) in
-                    self.saveMode = .overwrite
-                })
-            }
+        guard isEditingEnabled, hasChanges else { return }
 
-            alertController.addAction(UIAlertAction(title: NSLocalizedString("_save_as_copy_", comment: ""), style: .default) { (_: UIAlertAction) in
-                self.saveMode = .copy
-            })
+        let alertController = UIAlertController(title: NSLocalizedString("_save_", comment: ""), message: "", preferredStyle: .alert)
 
-            alertController.addAction(UIAlertAction(title: NSLocalizedString("_discard_changes_", comment: ""), style: .destructive) { (_: UIAlertAction) in
-                self.saveMode = .discard
+        if metadata?.livePhoto == false {
+            alertController.addAction(UIAlertAction(title: NSLocalizedString("_overwrite_original_", comment: ""), style: .default) { _ in
+                self.saveModifiedFile(override: true)
             })
-
-            alertController.addAction(UIAlertAction(title: NSLocalizedString("_cancel_", comment: ""), style: .cancel) { (_: UIAlertAction) in })
-
         }
+
+        alertController.addAction(UIAlertAction(title: NSLocalizedString("_save_as_copy_", comment: ""), style: .default) { _ in
+            self.saveModifiedFile(override: false)
+        })
+        alertController.addAction(UIAlertAction(title: NSLocalizedString("_discard_changes_", comment: ""), style: .destructive) { _ in })
+        parentVC?.present(alertController, animated: true)
     }
 }
 
@@ -129,46 +133,51 @@ extension NCViewerQuickLook: QLPreviewControllerDataSource, QLPreviewControllerD
         previewItems[index]
     }
 
-    func previewController(_ controller: QLPreviewController, didUpdateContentsOf previewItem: QLPreviewItem) {
-    }
-
     @available(iOS 13.0, *)
     func previewController(_ controller: QLPreviewController, editingModeFor previewItem: QLPreviewItem) -> QLPreviewItemEditingMode {
-        if editingMode {
-            return .createCopy
-        } else {
-            return .disabled
-        }
+        return isEditingEnabled ? .createCopy : .disabled
     }
 
-    func previewController(_ controller: QLPreviewController, didSaveEditedCopyOf previewItem: QLPreviewItem, at modifiedContentsURL: URL) {
-
-        if saveMode != .discard {
-
-            guard let metadata = self.metadata else { return }
-            let ocId = NSUUID().uuidString
-            let size = NCUtilityFileSystem.shared.getFileSize(filePath: modifiedContentsURL.path)
-
-            if saveMode == .copy {
-                let fileName = NCUtilityFileSystem.shared.createFileName(metadata.fileNameView, serverUrl: metadata.serverUrl, account: metadata.account)
-                metadata.fileName = fileName
-                metadata.fileNameView = fileName
-            }
+    fileprivate func saveModifiedFile(override: Bool) {
+        guard let metadata = self.metadata else { return }
 
-            let fileNamePath = CCUtility.getDirectoryProviderStorageOcId(ocId, fileNameView: metadata.fileNameView)!
+        let ocId = NSUUID().uuidString
+        let size = NCUtilityFileSystem.shared.getFileSize(filePath: url.path)
 
-            if NCUtilityFileSystem.shared.copyFile(atPath: modifiedContentsURL.path, toPath: fileNamePath) {
-
-                let metadataForUpload = NCManageDatabase.shared.createMetadata(account: metadata.account, user: metadata.user, userId: metadata.userId, fileName: metadata.fileName, fileNameView: metadata.fileNameView, ocId: ocId, serverUrl: metadata.serverUrl, urlBase: metadata.urlBase, url: modifiedContentsURL.path, contentType: "", livePhoto: false)
+        if !override {
+            let fileName = NCUtilityFileSystem.shared.createFileName(metadata.fileNameView, serverUrl: metadata.serverUrl, account: metadata.account)
+            metadata.fileName = fileName
+            metadata.fileNameView = fileName
+        }
 
-                metadataForUpload.session = NCNetworking.shared.sessionIdentifierBackground
-                metadataForUpload.sessionSelector = NCGlobal.shared.selectorUploadFile
-                metadataForUpload.size = size
-                metadataForUpload.status = NCGlobal.shared.metadataStatusWaitUpload
+        guard let fileNamePath = CCUtility.getDirectoryProviderStorageOcId(ocId, fileNameView: metadata.fileNameView),
+              NCUtilityFileSystem.shared.copyFile(atPath: url.path, toPath: fileNamePath) else { return }
+
+        let metadataForUpload = NCManageDatabase.shared.createMetadata(
+            account: metadata.account,
+            user: metadata.user,
+            userId: metadata.userId,
+            fileName: metadata.fileName,
+            fileNameView: metadata.fileNameView,
+            ocId: ocId,
+            serverUrl: metadata.serverUrl,
+            urlBase: metadata.urlBase,
+            url: url.path,
+            contentType: "",
+            livePhoto: false)
+
+        metadataForUpload.session = NCNetworking.shared.sessionIdentifierBackground
+        metadataForUpload.sessionSelector = NCGlobal.shared.selectorUploadFile
+        metadataForUpload.size = size
+        metadataForUpload.status = NCGlobal.shared.metadataStatusWaitUpload
+        (UIApplication.shared.delegate as? AppDelegate)?.networkingProcessUpload?.createProcessUploads(metadatas: [metadataForUpload])
+    }
 
-                appDelegate.networkingProcessUpload?.createProcessUploads(metadatas: [metadataForUpload])
-            }
-        }
+    func previewController(_ controller: QLPreviewController, didSaveEditedCopyOf previewItem: QLPreviewItem, at modifiedContentsURL: URL) {
+        // easier to handle that way than to use `.updateContents`
+        // needs to be moved otherwise it will only be called once!
+        guard NCUtilityFileSystem.shared.moveFile(atPath: modifiedContentsURL.path, toPath: url.path) else { return }
+        hasChanges = true
     }
 }